Przeglądaj źródła

Closes #13279: Wrap choice labels with gettext()

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Arthur Hanson 2 lat temu
rodzic
commit
e625a5667c

+ 8 - 6
netbox/circuits/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ChoiceSet
 
 
@@ -16,12 +18,12 @@ class CircuitStatusChoices(ChoiceSet):
     STATUS_DECOMMISSIONED = 'decommissioned'
 
     CHOICES = [
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_PROVISIONING, 'Provisioning', 'blue'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_OFFLINE, 'Offline', 'red'),
-        (STATUS_DEPROVISIONING, 'Deprovisioning', 'yellow'),
-        (STATUS_DECOMMISSIONED, 'Decommissioned', 'gray'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_PROVISIONING, _('Provisioning'), 'blue'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_OFFLINE, _('Offline'), 'red'),
+        (STATUS_DEPROVISIONING, _('Deprovisioning'), 'yellow'),
+        (STATUS_DECOMMISSIONED, _('Decommissioned'), 'gray'),
     ]
 
 

+ 7 - 7
netbox/core/choices.py

@@ -1,4 +1,4 @@
-from django.utils.translation import gettext as _
+from django.utils.translation import gettext_lazy as _
 
 from utilities.choices import ChoiceSet
 
@@ -63,12 +63,12 @@ class JobStatusChoices(ChoiceSet):
     STATUS_FAILED = 'failed'
 
     CHOICES = (
-        (STATUS_PENDING, 'Pending', 'cyan'),
-        (STATUS_SCHEDULED, 'Scheduled', 'gray'),
-        (STATUS_RUNNING, 'Running', 'blue'),
-        (STATUS_COMPLETED, 'Completed', 'green'),
-        (STATUS_ERRORED, 'Errored', 'red'),
-        (STATUS_FAILED, 'Failed', 'red'),
+        (STATUS_PENDING, _('Pending'), 'cyan'),
+        (STATUS_SCHEDULED, _('Scheduled'), 'gray'),
+        (STATUS_RUNNING, _('Running'), 'blue'),
+        (STATUS_COMPLETED, _('Completed'), 'green'),
+        (STATUS_ERRORED, _('Errored'), 'red'),
+        (STATUS_FAILED, _('Failed'), 'red'),
     )
 
     TERMINAL_STATE_CHOICES = (

+ 121 - 119
netbox/dcim/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ChoiceSet
 
 
@@ -15,11 +17,11 @@ class SiteStatusChoices(ChoiceSet):
     STATUS_RETIRED = 'retired'
 
     CHOICES = [
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_STAGING, 'Staging', 'blue'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
-        (STATUS_RETIRED, 'Retired', 'red'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_STAGING, _('Staging'), 'blue'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
+        (STATUS_RETIRED, _('Retired'), 'red'),
     ]
 
 
@@ -60,13 +62,13 @@ class RackTypeChoices(ChoiceSet):
     TYPE_WALLCABINET_VERTICAL = 'wall-cabinet-vertical'
 
     CHOICES = (
-        (TYPE_2POST, '2-post frame'),
-        (TYPE_4POST, '4-post frame'),
-        (TYPE_CABINET, '4-post cabinet'),
-        (TYPE_WALLFRAME, 'Wall-mounted frame'),
-        (TYPE_WALLFRAME_VERTICAL, 'Wall-mounted frame (vertical)'),
-        (TYPE_WALLCABINET, 'Wall-mounted cabinet'),
-        (TYPE_WALLCABINET_VERTICAL, 'Wall-mounted cabinet (vertical)'),
+        (TYPE_2POST, _('2-post frame')),
+        (TYPE_4POST, _('4-post frame')),
+        (TYPE_CABINET, _('4-post cabinet')),
+        (TYPE_WALLFRAME, _('Wall-mounted frame')),
+        (TYPE_WALLFRAME_VERTICAL, _('Wall-mounted frame (vertical)')),
+        (TYPE_WALLCABINET, _('Wall-mounted cabinet')),
+        (TYPE_WALLCABINET_VERTICAL, _('Wall-mounted cabinet (vertical)')),
     )
 
 
@@ -78,10 +80,10 @@ class RackWidthChoices(ChoiceSet):
     WIDTH_23IN = 23
 
     CHOICES = (
-        (WIDTH_10IN, '10 inches'),
-        (WIDTH_19IN, '19 inches'),
-        (WIDTH_21IN, '21 inches'),
-        (WIDTH_23IN, '23 inches'),
+        (WIDTH_10IN, _('10 inches')),
+        (WIDTH_19IN, _('19 inches')),
+        (WIDTH_21IN, _('21 inches')),
+        (WIDTH_23IN, _('23 inches')),
     )
 
 
@@ -95,11 +97,11 @@ class RackStatusChoices(ChoiceSet):
     STATUS_DEPRECATED = 'deprecated'
 
     CHOICES = [
-        (STATUS_RESERVED, 'Reserved', 'yellow'),
-        (STATUS_AVAILABLE, 'Available', 'green'),
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_ACTIVE, 'Active', 'blue'),
-        (STATUS_DEPRECATED, 'Deprecated', 'red'),
+        (STATUS_RESERVED, _('Reserved'), 'yellow'),
+        (STATUS_AVAILABLE, _('Available'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_ACTIVE, _('Active'), 'blue'),
+        (STATUS_DEPRECATED, _('Deprecated'), 'red'),
     ]
 
 
@@ -109,8 +111,8 @@ class RackDimensionUnitChoices(ChoiceSet):
     UNIT_INCH = 'in'
 
     CHOICES = (
-        (UNIT_MILLIMETER, 'Millimeters'),
-        (UNIT_INCH, 'Inches'),
+        (UNIT_MILLIMETER, _('Millimeters')),
+        (UNIT_INCH, _('Inches')),
     )
 
 
@@ -135,8 +137,8 @@ class SubdeviceRoleChoices(ChoiceSet):
     ROLE_CHILD = 'child'
 
     CHOICES = (
-        (ROLE_PARENT, 'Parent'),
-        (ROLE_CHILD, 'Child'),
+        (ROLE_PARENT, _('Parent')),
+        (ROLE_CHILD, _('Child')),
     )
 
 
@@ -150,8 +152,8 @@ class DeviceFaceChoices(ChoiceSet):
     FACE_REAR = 'rear'
 
     CHOICES = (
-        (FACE_FRONT, 'Front'),
-        (FACE_REAR, 'Rear'),
+        (FACE_FRONT, _('Front')),
+        (FACE_REAR, _('Rear')),
     )
 
 
@@ -167,13 +169,13 @@ class DeviceStatusChoices(ChoiceSet):
     STATUS_DECOMMISSIONING = 'decommissioning'
 
     CHOICES = [
-        (STATUS_OFFLINE, 'Offline', 'gray'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_STAGED, 'Staged', 'blue'),
-        (STATUS_FAILED, 'Failed', 'red'),
-        (STATUS_INVENTORY, 'Inventory', 'purple'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
+        (STATUS_OFFLINE, _('Offline'), 'gray'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_STAGED, _('Staged'), 'blue'),
+        (STATUS_FAILED, _('Failed'), 'red'),
+        (STATUS_INVENTORY, _('Inventory'), 'purple'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
     ]
 
 
@@ -188,13 +190,13 @@ class DeviceAirflowChoices(ChoiceSet):
     AIRFLOW_MIXED = 'mixed'
 
     CHOICES = (
-        (AIRFLOW_FRONT_TO_REAR, 'Front to rear'),
-        (AIRFLOW_REAR_TO_FRONT, 'Rear to front'),
-        (AIRFLOW_LEFT_TO_RIGHT, 'Left to right'),
-        (AIRFLOW_RIGHT_TO_LEFT, 'Right to left'),
-        (AIRFLOW_SIDE_TO_REAR, 'Side to rear'),
-        (AIRFLOW_PASSIVE, 'Passive'),
-        (AIRFLOW_MIXED, 'Mixed'),
+        (AIRFLOW_FRONT_TO_REAR, _('Front to rear')),
+        (AIRFLOW_REAR_TO_FRONT, _('Rear to front')),
+        (AIRFLOW_LEFT_TO_RIGHT, _('Left to right')),
+        (AIRFLOW_RIGHT_TO_LEFT, _('Right to left')),
+        (AIRFLOW_SIDE_TO_REAR, _('Side to rear')),
+        (AIRFLOW_PASSIVE, _('Passive')),
+        (AIRFLOW_MIXED, _('Mixed')),
     )
 
 
@@ -213,12 +215,12 @@ class ModuleStatusChoices(ChoiceSet):
     STATUS_DECOMMISSIONING = 'decommissioning'
 
     CHOICES = [
-        (STATUS_OFFLINE, 'Offline', 'gray'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_STAGED, 'Staged', 'blue'),
-        (STATUS_FAILED, 'Failed', 'red'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
+        (STATUS_OFFLINE, _('Offline'), 'gray'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_STAGED, _('Staged'), 'blue'),
+        (STATUS_FAILED, _('Failed'), 'red'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
     ]
 
 
@@ -438,7 +440,7 @@ class PowerPortTypeChoices(ChoiceSet):
             (TYPE_NBR_14136_10A, '2P+T 10A (NBR 14136)'),
             (TYPE_NBR_14136_20A, '2P+T 20A (NBR 14136)'),
         )),
-        ('NEMA (Non-locking)', (
+        (_('NEMA (Non-locking)'), (
             (TYPE_NEMA_115P, 'NEMA 1-15P'),
             (TYPE_NEMA_515P, 'NEMA 5-15P'),
             (TYPE_NEMA_520P, 'NEMA 5-20P'),
@@ -460,7 +462,7 @@ class PowerPortTypeChoices(ChoiceSet):
             (TYPE_NEMA_1550P, 'NEMA 15-50P'),
             (TYPE_NEMA_1560P, 'NEMA 15-60P'),
         )),
-        ('NEMA (Locking)', (
+        (_('NEMA (Locking)'), (
             (TYPE_NEMA_L115P, 'NEMA L1-15P'),
             (TYPE_NEMA_L515P, 'NEMA L5-15P'),
             (TYPE_NEMA_L520P, 'NEMA L5-20P'),
@@ -483,7 +485,7 @@ class PowerPortTypeChoices(ChoiceSet):
             (TYPE_NEMA_L2130P, 'NEMA L21-30P'),
             (TYPE_NEMA_L2230P, 'NEMA L22-30P'),
         )),
-        ('California Style', (
+        (_('California Style'), (
             (TYPE_CS6361C, 'CS6361C'),
             (TYPE_CS6365C, 'CS6365C'),
             (TYPE_CS8165C, 'CS8165C'),
@@ -491,7 +493,7 @@ class PowerPortTypeChoices(ChoiceSet):
             (TYPE_CS8365C, 'CS8365C'),
             (TYPE_CS8465C, 'CS8465C'),
         )),
-        ('International/ITA', (
+        (_('International/ITA'), (
             (TYPE_ITA_C, 'ITA Type C (CEE 7/16)'),
             (TYPE_ITA_E, 'ITA Type E (CEE 7/6)'),
             (TYPE_ITA_F, 'ITA Type F (CEE 7/4)'),
@@ -521,7 +523,7 @@ class PowerPortTypeChoices(ChoiceSet):
         ('DC', (
             (TYPE_DC, 'DC Terminal'),
         )),
-        ('Proprietary', (
+        (_('Proprietary'), (
             (TYPE_SAF_D_GRID, 'Saf-D-Grid'),
             (TYPE_NEUTRIK_POWERCON_20A, 'Neutrik powerCON (20A)'),
             (TYPE_NEUTRIK_POWERCON_32A, 'Neutrik powerCON (32A)'),
@@ -529,7 +531,7 @@ class PowerPortTypeChoices(ChoiceSet):
             (TYPE_NEUTRIK_POWERCON_TRUE1_TOP, 'Neutrik powerCON TRUE1 TOP'),
             (TYPE_UBIQUITI_SMARTPOWER, 'Ubiquiti SmartPower'),
         )),
-        ('Other', (
+        (_('Other'), (
             (TYPE_HARDWIRED, 'Hardwired'),
             (TYPE_OTHER, 'Other'),
         )),
@@ -675,7 +677,7 @@ class PowerOutletTypeChoices(ChoiceSet):
             (TYPE_NBR_14136_10A, '2P+T 10A (NBR 14136)'),
             (TYPE_NBR_14136_20A, '2P+T 20A (NBR 14136)'),
         )),
-        ('NEMA (Non-locking)', (
+        (_('NEMA (Non-locking)'), (
             (TYPE_NEMA_115R, 'NEMA 1-15R'),
             (TYPE_NEMA_515R, 'NEMA 5-15R'),
             (TYPE_NEMA_520R, 'NEMA 5-20R'),
@@ -697,7 +699,7 @@ class PowerOutletTypeChoices(ChoiceSet):
             (TYPE_NEMA_1550R, 'NEMA 15-50R'),
             (TYPE_NEMA_1560R, 'NEMA 15-60R'),
         )),
-        ('NEMA (Locking)', (
+        (_('NEMA (Locking)'), (
             (TYPE_NEMA_L115R, 'NEMA L1-15R'),
             (TYPE_NEMA_L515R, 'NEMA L5-15R'),
             (TYPE_NEMA_L520R, 'NEMA L5-20R'),
@@ -720,7 +722,7 @@ class PowerOutletTypeChoices(ChoiceSet):
             (TYPE_NEMA_L2130R, 'NEMA L21-30R'),
             (TYPE_NEMA_L2230R, 'NEMA L22-30R'),
         )),
-        ('California Style', (
+        (_('California Style'), (
             (TYPE_CS6360C, 'CS6360C'),
             (TYPE_CS6364C, 'CS6364C'),
             (TYPE_CS8164C, 'CS8164C'),
@@ -728,7 +730,7 @@ class PowerOutletTypeChoices(ChoiceSet):
             (TYPE_CS8364C, 'CS8364C'),
             (TYPE_CS8464C, 'CS8464C'),
         )),
-        ('ITA/International', (
+        (_('ITA/International'), (
             (TYPE_ITA_E, 'ITA Type E (CEE 7/5)'),
             (TYPE_ITA_F, 'ITA Type F (CEE 7/3)'),
             (TYPE_ITA_G, 'ITA Type G (BS 1363)'),
@@ -750,7 +752,7 @@ class PowerOutletTypeChoices(ChoiceSet):
         ('DC', (
             (TYPE_DC, 'DC Terminal'),
         )),
-        ('Proprietary', (
+        (_('Proprietary'), (
             (TYPE_HDOT_CX, 'HDOT Cx'),
             (TYPE_SAF_D_GRID, 'Saf-D-Grid'),
             (TYPE_NEUTRIK_POWERCON_20A, 'Neutrik powerCON (20A)'),
@@ -759,7 +761,7 @@ class PowerOutletTypeChoices(ChoiceSet):
             (TYPE_NEUTRIK_POWERCON_TRUE1_TOP, 'Neutrik powerCON TRUE1 TOP'),
             (TYPE_UBIQUITI_SMARTPOWER, 'Ubiquiti SmartPower'),
         )),
-        ('Other', (
+        (_('Other'), (
             (TYPE_HARDWIRED, 'Hardwired'),
             (TYPE_OTHER, 'Other'),
         )),
@@ -789,9 +791,9 @@ class InterfaceKindChoices(ChoiceSet):
     KIND_WIRELESS = 'wireless'
 
     CHOICES = (
-        (KIND_PHYSICAL, 'Physical'),
-        (KIND_VIRTUAL, 'Virtual'),
-        (KIND_WIRELESS, 'Wireless'),
+        (KIND_PHYSICAL, _('Physical')),
+        (KIND_VIRTUAL, _('Virtual')),
+        (KIND_WIRELESS, _('Wireless')),
     )
 
 
@@ -939,15 +941,15 @@ class InterfaceTypeChoices(ChoiceSet):
 
     CHOICES = (
         (
-            'Virtual interfaces',
+            _('Virtual interfaces'),
             (
-                (TYPE_VIRTUAL, 'Virtual'),
-                (TYPE_BRIDGE, 'Bridge'),
-                (TYPE_LAG, 'Link Aggregation Group (LAG)'),
+                (TYPE_VIRTUAL, _('Virtual')),
+                (TYPE_BRIDGE, _('Bridge')),
+                (TYPE_LAG, _('Link Aggregation Group (LAG)')),
             ),
         ),
         (
-            'Ethernet (fixed)',
+            _('Ethernet (fixed)'),
             (
                 (TYPE_100ME_FX, '100BASE-FX (10/100ME FIBER)'),
                 (TYPE_100ME_LFX, '100BASE-LFX (10/100ME FIBER)'),
@@ -961,7 +963,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Ethernet (modular)',
+            _('Ethernet (modular)'),
             (
                 (TYPE_1GE_GBIC, 'GBIC (1GE)'),
                 (TYPE_1GE_SFP, 'SFP (1GE)'),
@@ -994,7 +996,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Ethernet (backplane)',
+            _('Ethernet (backplane)'),
             (
                 (TYPE_1GE_KX, '1000BASE-KX (1GE)'),
                 (TYPE_10GE_KR, '10GBASE-KR (10GE)'),
@@ -1008,7 +1010,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Wireless',
+            _('Wireless'),
             (
                 (TYPE_80211A, 'IEEE 802.11a'),
                 (TYPE_80211G, 'IEEE 802.11b/g'),
@@ -1022,7 +1024,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Cellular',
+            _('Cellular'),
             (
                 (TYPE_GSM, 'GSM'),
                 (TYPE_CDMA, 'CDMA'),
@@ -1069,7 +1071,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Serial',
+            _('Serial'),
             (
                 (TYPE_T1, 'T1 (1.544 Mbps)'),
                 (TYPE_E1, 'E1 (2.048 Mbps)'),
@@ -1084,7 +1086,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Coaxial',
+            _('Coaxial'),
             (
                 (TYPE_DOCSIS, 'DOCSIS'),
             )
@@ -1101,7 +1103,7 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Stacking',
+            _('Stacking'),
             (
                 (TYPE_STACKWISE, 'Cisco StackWise'),
                 (TYPE_STACKWISE_PLUS, 'Cisco StackWise Plus'),
@@ -1120,9 +1122,9 @@ class InterfaceTypeChoices(ChoiceSet):
             )
         ),
         (
-            'Other',
+            _('Other'),
             (
-                (TYPE_OTHER, 'Other'),
+                (TYPE_OTHER, _('Other')),
             )
         ),
     )
@@ -1149,9 +1151,9 @@ class InterfaceDuplexChoices(ChoiceSet):
     DUPLEX_AUTO = 'auto'
 
     CHOICES = (
-        (DUPLEX_HALF, 'Half'),
-        (DUPLEX_FULL, 'Full'),
-        (DUPLEX_AUTO, 'Auto'),
+        (DUPLEX_HALF, _('Half')),
+        (DUPLEX_FULL, _('Full')),
+        (DUPLEX_AUTO, _('Auto')),
     )
 
 
@@ -1162,9 +1164,9 @@ class InterfaceModeChoices(ChoiceSet):
     MODE_TAGGED_ALL = 'tagged-all'
 
     CHOICES = (
-        (MODE_ACCESS, 'Access'),
-        (MODE_TAGGED, 'Tagged'),
-        (MODE_TAGGED_ALL, 'Tagged (All)'),
+        (MODE_ACCESS, _('Access')),
+        (MODE_TAGGED, _('Tagged')),
+        (MODE_TAGGED_ALL, _('Tagged (All)')),
     )
 
 
@@ -1193,7 +1195,7 @@ class InterfacePoETypeChoices(ChoiceSet):
 
     CHOICES = (
         (
-            'IEEE Standard',
+            _('IEEE Standard'),
             (
                 (TYPE_1_8023AF, '802.3af (Type 1)'),
                 (TYPE_2_8023AT, '802.3at (Type 2)'),
@@ -1202,12 +1204,12 @@ class InterfacePoETypeChoices(ChoiceSet):
             )
         ),
         (
-            'Passive',
+            _('Passive'),
             (
-                (PASSIVE_24V_2PAIR, 'Passive 24V (2-pair)'),
-                (PASSIVE_24V_4PAIR, 'Passive 24V (4-pair)'),
-                (PASSIVE_48V_2PAIR, 'Passive 48V (2-pair)'),
-                (PASSIVE_48V_4PAIR, 'Passive 48V (4-pair)'),
+                (PASSIVE_24V_2PAIR, _('Passive 24V (2-pair)')),
+                (PASSIVE_24V_4PAIR, _('Passive 24V (4-pair)')),
+                (PASSIVE_48V_2PAIR, _('Passive 48V (2-pair)')),
+                (PASSIVE_48V_4PAIR, _('Passive 48V (4-pair)')),
             )
         ),
     )
@@ -1269,7 +1271,7 @@ class PortTypeChoices(ChoiceSet):
 
     CHOICES = (
         (
-            'Copper',
+            _('Copper'),
             (
                 (TYPE_8P8C, '8P8C'),
                 (TYPE_8P6C, '8P6C'),
@@ -1292,7 +1294,7 @@ class PortTypeChoices(ChoiceSet):
             ),
         ),
         (
-            'Fiber Optic',
+            _('Fiber Optic'),
             (
                 (TYPE_FC, 'FC'),
                 (TYPE_LC, 'LC'),
@@ -1325,9 +1327,9 @@ class PortTypeChoices(ChoiceSet):
             ),
         ),
         (
-            'Other',
+            _('Other'),
             (
-                (TYPE_OTHER, 'Other'),
+                (TYPE_OTHER, _('Other')),
             )
         )
     )
@@ -1365,7 +1367,7 @@ class CableTypeChoices(ChoiceSet):
 
     CHOICES = (
         (
-            'Copper', (
+            _('Copper'), (
                 (TYPE_CAT3, 'CAT3'),
                 (TYPE_CAT5, 'CAT5'),
                 (TYPE_CAT5E, 'CAT5e'),
@@ -1381,7 +1383,7 @@ class CableTypeChoices(ChoiceSet):
             ),
         ),
         (
-            'Fiber', (
+            _('Fiber'), (
                 (TYPE_MMF, 'Multimode Fiber'),
                 (TYPE_MMF_OM1, 'Multimode Fiber (OM1)'),
                 (TYPE_MMF_OM2, 'Multimode Fiber (OM2)'),
@@ -1394,7 +1396,7 @@ class CableTypeChoices(ChoiceSet):
                 (TYPE_AOC, 'Active Optical Cabling (AOC)'),
             ),
         ),
-        (TYPE_POWER, 'Power'),
+        (TYPE_POWER, _('Power')),
     )
 
 
@@ -1405,9 +1407,9 @@ class LinkStatusChoices(ChoiceSet):
     STATUS_DECOMMISSIONING = 'decommissioning'
 
     CHOICES = (
-        (STATUS_CONNECTED, 'Connected', 'green'),
-        (STATUS_PLANNED, 'Planned', 'blue'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
+        (STATUS_CONNECTED, _('Connected'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'blue'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
     )
 
 
@@ -1424,12 +1426,12 @@ class CableLengthUnitChoices(ChoiceSet):
     UNIT_INCH = 'in'
 
     CHOICES = (
-        (UNIT_KILOMETER, 'Kilometers'),
-        (UNIT_METER, 'Meters'),
-        (UNIT_CENTIMETER, 'Centimeters'),
-        (UNIT_MILE, 'Miles'),
-        (UNIT_FOOT, 'Feet'),
-        (UNIT_INCH, 'Inches'),
+        (UNIT_KILOMETER, _('Kilometers')),
+        (UNIT_METER, _('Meters')),
+        (UNIT_CENTIMETER, _('Centimeters')),
+        (UNIT_MILE, _('Miles')),
+        (UNIT_FOOT, _('Feet')),
+        (UNIT_INCH, _('Inches')),
     )
 
 
@@ -1444,10 +1446,10 @@ class WeightUnitChoices(ChoiceSet):
     UNIT_OUNCE = 'oz'
 
     CHOICES = (
-        (UNIT_KILOGRAM, 'Kilograms'),
-        (UNIT_GRAM, 'Grams'),
-        (UNIT_POUND, 'Pounds'),
-        (UNIT_OUNCE, 'Ounces'),
+        (UNIT_KILOGRAM, _('Kilograms')),
+        (UNIT_GRAM, _('Grams')),
+        (UNIT_POUND, _('Pounds')),
+        (UNIT_OUNCE, _('Ounces')),
     )
 
 
@@ -1480,10 +1482,10 @@ class PowerFeedStatusChoices(ChoiceSet):
     STATUS_FAILED = 'failed'
 
     CHOICES = [
-        (STATUS_OFFLINE, 'Offline', 'gray'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_PLANNED, 'Planned', 'blue'),
-        (STATUS_FAILED, 'Failed', 'red'),
+        (STATUS_OFFLINE, _('Offline'), 'gray'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'blue'),
+        (STATUS_FAILED, _('Failed'), 'red'),
     ]
 
 
@@ -1493,8 +1495,8 @@ class PowerFeedTypeChoices(ChoiceSet):
     TYPE_REDUNDANT = 'redundant'
 
     CHOICES = (
-        (TYPE_PRIMARY, 'Primary', 'green'),
-        (TYPE_REDUNDANT, 'Redundant', 'cyan'),
+        (TYPE_PRIMARY, _('Primary'), 'green'),
+        (TYPE_REDUNDANT, _('Redundant'), 'cyan'),
     )
 
 
@@ -1515,8 +1517,8 @@ class PowerFeedPhaseChoices(ChoiceSet):
     PHASE_3PHASE = 'three-phase'
 
     CHOICES = (
-        (PHASE_SINGLE, 'Single phase'),
-        (PHASE_3PHASE, 'Three-phase'),
+        (PHASE_SINGLE, _('Single phase')),
+        (PHASE_3PHASE, _('Three-phase')),
     )
 
 
@@ -1531,7 +1533,7 @@ class VirtualDeviceContextStatusChoices(ChoiceSet):
     STATUS_OFFLINE = 'offline'
 
     CHOICES = [
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_OFFLINE, 'Offline', 'red'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_OFFLINE, _('Offline'), 'red'),
     ]

+ 51 - 49
netbox/extras/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ButtonColorChoices, ChoiceSet
 
 
@@ -22,19 +24,19 @@ class CustomFieldTypeChoices(ChoiceSet):
     TYPE_MULTIOBJECT = 'multiobject'
 
     CHOICES = (
-        (TYPE_TEXT, 'Text'),
-        (TYPE_LONGTEXT, 'Text (long)'),
-        (TYPE_INTEGER, 'Integer'),
-        (TYPE_DECIMAL, 'Decimal'),
-        (TYPE_BOOLEAN, 'Boolean (true/false)'),
-        (TYPE_DATE, 'Date'),
-        (TYPE_DATETIME, 'Date & time'),
-        (TYPE_URL, 'URL'),
-        (TYPE_JSON, 'JSON'),
-        (TYPE_SELECT, 'Selection'),
-        (TYPE_MULTISELECT, 'Multiple selection'),
-        (TYPE_OBJECT, 'Object'),
-        (TYPE_MULTIOBJECT, 'Multiple objects'),
+        (TYPE_TEXT, _('Text')),
+        (TYPE_LONGTEXT, _('Text (long)')),
+        (TYPE_INTEGER, _('Integer')),
+        (TYPE_DECIMAL, _('Decimal')),
+        (TYPE_BOOLEAN, _('Boolean (true/false)')),
+        (TYPE_DATE, _('Date')),
+        (TYPE_DATETIME, _('Date & time')),
+        (TYPE_URL, _('URL')),
+        (TYPE_JSON, _('JSON')),
+        (TYPE_SELECT, _('Selection')),
+        (TYPE_MULTISELECT, _('Multiple selection')),
+        (TYPE_OBJECT, _('Object')),
+        (TYPE_MULTIOBJECT, _('Multiple objects')),
     )
 
 
@@ -45,9 +47,9 @@ class CustomFieldFilterLogicChoices(ChoiceSet):
     FILTER_EXACT = 'exact'
 
     CHOICES = (
-        (FILTER_DISABLED, 'Disabled'),
-        (FILTER_LOOSE, 'Loose'),
-        (FILTER_EXACT, 'Exact'),
+        (FILTER_DISABLED, _('Disabled')),
+        (FILTER_LOOSE, _('Loose')),
+        (FILTER_EXACT, _('Exact')),
     )
 
 
@@ -59,10 +61,10 @@ class CustomFieldVisibilityChoices(ChoiceSet):
     VISIBILITY_HIDDEN_IFUNSET = 'hidden-ifunset'
 
     CHOICES = (
-        (VISIBILITY_READ_WRITE, 'Read/Write'),
-        (VISIBILITY_READ_ONLY, 'Read-only'),
-        (VISIBILITY_HIDDEN, 'Hidden'),
-        (VISIBILITY_HIDDEN_IFUNSET, 'Hidden (if unset)'),
+        (VISIBILITY_READ_WRITE, _('Read/write')),
+        (VISIBILITY_READ_ONLY, _('Read-only')),
+        (VISIBILITY_HIDDEN, _('Hidden')),
+        (VISIBILITY_HIDDEN_IFUNSET, _('Hidden (if unset)')),
     )
 
 
@@ -89,7 +91,7 @@ class CustomLinkButtonClassChoices(ButtonColorChoices):
 
     CHOICES = (
         *ButtonColorChoices.CHOICES,
-        (LINK, 'Link'),
+        (LINK, _('Link')),
     )
 
 
@@ -103,8 +105,8 @@ class BookmarkOrderingChoices(ChoiceSet):
     ORDERING_OLDEST = 'created'
 
     CHOICES = (
-        (ORDERING_NEWEST, 'Newest'),
-        (ORDERING_OLDEST, 'Oldest'),
+        (ORDERING_NEWEST, _('Newest')),
+        (ORDERING_OLDEST, _('Oldest')),
     )
 
 #
@@ -119,9 +121,9 @@ class ObjectChangeActionChoices(ChoiceSet):
     ACTION_DELETE = 'delete'
 
     CHOICES = (
-        (ACTION_CREATE, 'Created', 'green'),
-        (ACTION_UPDATE, 'Updated', 'blue'),
-        (ACTION_DELETE, 'Deleted', 'red'),
+        (ACTION_CREATE, _('Created'), 'green'),
+        (ACTION_UPDATE, _('Updated'), 'blue'),
+        (ACTION_DELETE, _('Deleted'), 'red'),
     )
 
 
@@ -138,10 +140,10 @@ class JournalEntryKindChoices(ChoiceSet):
     KIND_DANGER = 'danger'
 
     CHOICES = [
-        (KIND_INFO, 'Info', 'cyan'),
-        (KIND_SUCCESS, 'Success', 'green'),
-        (KIND_WARNING, 'Warning', 'yellow'),
-        (KIND_DANGER, 'Danger', 'red'),
+        (KIND_INFO, _('Info'), 'cyan'),
+        (KIND_SUCCESS, _('Success'), 'green'),
+        (KIND_WARNING, _('Warning'), 'yellow'),
+        (KIND_DANGER, _('Danger'), 'red'),
     ]
 
 
@@ -158,22 +160,22 @@ class LogLevelChoices(ChoiceSet):
     LOG_FAILURE = 'failure'
 
     CHOICES = (
-        (LOG_DEFAULT, 'Default', 'gray'),
-        (LOG_SUCCESS, 'Success', 'green'),
-        (LOG_INFO, 'Info', 'cyan'),
-        (LOG_WARNING, 'Warning', 'yellow'),
-        (LOG_FAILURE, 'Failure', 'red'),
+        (LOG_DEFAULT, _('Default'), 'gray'),
+        (LOG_SUCCESS, _('Success'), 'green'),
+        (LOG_INFO, _('Info'), 'cyan'),
+        (LOG_WARNING, _('Warning'), 'yellow'),
+        (LOG_FAILURE, _('Failure'), 'red'),
     )
 
 
 class DurationChoices(ChoiceSet):
 
     CHOICES = (
-        (60, 'Hourly'),
-        (720, '12 hours'),
-        (1440, 'Daily'),
-        (10080, 'Weekly'),
-        (43200, '30 days'),
+        (60, _('Hourly')),
+        (720, _('12 hours')),
+        (1440, _('Daily')),
+        (10080, _('Weekly')),
+        (43200, _('30 days')),
     )
 
 
@@ -191,12 +193,12 @@ class JobResultStatusChoices(ChoiceSet):
     STATUS_FAILED = 'failed'
 
     CHOICES = (
-        (STATUS_PENDING, 'Pending', 'cyan'),
-        (STATUS_SCHEDULED, 'Scheduled', 'gray'),
-        (STATUS_RUNNING, 'Running', 'blue'),
-        (STATUS_COMPLETED, 'Completed', 'green'),
-        (STATUS_ERRORED, 'Errored', 'red'),
-        (STATUS_FAILED, 'Failed', 'red'),
+        (STATUS_PENDING, _('Pending'), 'cyan'),
+        (STATUS_SCHEDULED, _('Scheduled'), 'gray'),
+        (STATUS_RUNNING, _('Running'), 'blue'),
+        (STATUS_COMPLETED, _('Completed'), 'green'),
+        (STATUS_ERRORED, _('Errored'), 'red'),
+        (STATUS_FAILED, _('Failed'), 'red'),
     )
 
     TERMINAL_STATE_CHOICES = (
@@ -238,7 +240,7 @@ class ChangeActionChoices(ChoiceSet):
     ACTION_DELETE = 'delete'
 
     CHOICES = (
-        (ACTION_CREATE, 'Create', 'green'),
-        (ACTION_UPDATE, 'Update', 'blue'),
-        (ACTION_DELETE, 'Delete', 'red'),
+        (ACTION_CREATE, _('Create'), 'green'),
+        (ACTION_UPDATE, _('Update'), 'blue'),
+        (ACTION_DELETE, _('Delete'), 'red'),
     )

+ 24 - 22
netbox/ipam/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ChoiceSet
 
 
@@ -25,10 +27,10 @@ class PrefixStatusChoices(ChoiceSet):
     STATUS_DEPRECATED = 'deprecated'
 
     CHOICES = [
-        (STATUS_CONTAINER, 'Container', 'gray'),
-        (STATUS_ACTIVE, 'Active', 'blue'),
-        (STATUS_RESERVED, 'Reserved', 'cyan'),
-        (STATUS_DEPRECATED, 'Deprecated', 'red'),
+        (STATUS_CONTAINER, _('Container'), 'gray'),
+        (STATUS_ACTIVE, _('Active'), 'blue'),
+        (STATUS_RESERVED, _('Reserved'), 'cyan'),
+        (STATUS_DEPRECATED, _('Deprecated'), 'red'),
     ]
 
 
@@ -44,9 +46,9 @@ class IPRangeStatusChoices(ChoiceSet):
     STATUS_DEPRECATED = 'deprecated'
 
     CHOICES = [
-        (STATUS_ACTIVE, 'Active', 'blue'),
-        (STATUS_RESERVED, 'Reserved', 'cyan'),
-        (STATUS_DEPRECATED, 'Deprecated', 'red'),
+        (STATUS_ACTIVE, _('Active'), 'blue'),
+        (STATUS_RESERVED, _('Reserved'), 'cyan'),
+        (STATUS_DEPRECATED, _('Deprecated'), 'red'),
     ]
 
 
@@ -64,11 +66,11 @@ class IPAddressStatusChoices(ChoiceSet):
     STATUS_SLAAC = 'slaac'
 
     CHOICES = [
-        (STATUS_ACTIVE, 'Active', 'blue'),
-        (STATUS_RESERVED, 'Reserved', 'cyan'),
-        (STATUS_DEPRECATED, 'Deprecated', 'red'),
-        (STATUS_DHCP, 'DHCP', 'green'),
-        (STATUS_SLAAC, 'SLAAC', 'purple'),
+        (STATUS_ACTIVE, _('Active'), 'blue'),
+        (STATUS_RESERVED, _('Reserved'), 'cyan'),
+        (STATUS_DEPRECATED, _('Deprecated'), 'red'),
+        (STATUS_DHCP, _('DHCP'), 'green'),
+        (STATUS_SLAAC, _('SLAAC'), 'purple'),
     ]
 
 
@@ -84,9 +86,9 @@ class IPAddressRoleChoices(ChoiceSet):
     ROLE_CARP = 'carp'
 
     CHOICES = (
-        (ROLE_LOOPBACK, 'Loopback', 'gray'),
-        (ROLE_SECONDARY, 'Secondary', 'blue'),
-        (ROLE_ANYCAST, 'Anycast', 'yellow'),
+        (ROLE_LOOPBACK, _('Loopback'), 'gray'),
+        (ROLE_SECONDARY, _('Secondary'), 'blue'),
+        (ROLE_ANYCAST, _('Anycast'), 'yellow'),
         (ROLE_VIP, 'VIP', 'purple'),
         (ROLE_VRRP, 'VRRP', 'green'),
         (ROLE_HSRP, 'HSRP', 'green'),
@@ -110,15 +112,15 @@ class FHRPGroupProtocolChoices(ChoiceSet):
     PROTOCOL_OTHER = 'other'
 
     CHOICES = (
-        ('Standard', (
+        (_('Standard'), (
             (PROTOCOL_VRRP2, 'VRRPv2'),
             (PROTOCOL_VRRP3, 'VRRPv3'),
             (PROTOCOL_CARP, 'CARP'),
         )),
-        ('CheckPoint', (
+        (_('CheckPoint'), (
             (PROTOCOL_CLUSTERXL, 'ClusterXL'),
         )),
-        ('Cisco', (
+        (_('Cisco'), (
             (PROTOCOL_HSRP, 'HSRP'),
             (PROTOCOL_GLBP, 'GLBP'),
         )),
@@ -132,7 +134,7 @@ class FHRPGroupAuthTypeChoices(ChoiceSet):
     AUTHENTICATION_MD5 = 'md5'
 
     CHOICES = (
-        (AUTHENTICATION_PLAINTEXT, 'Plaintext'),
+        (AUTHENTICATION_PLAINTEXT, _('Plaintext')),
         (AUTHENTICATION_MD5, 'MD5'),
     )
 
@@ -149,9 +151,9 @@ class VLANStatusChoices(ChoiceSet):
     STATUS_DEPRECATED = 'deprecated'
 
     CHOICES = [
-        (STATUS_ACTIVE, 'Active', 'blue'),
-        (STATUS_RESERVED, 'Reserved', 'cyan'),
-        (STATUS_DEPRECATED, 'Deprecated', 'red'),
+        (STATUS_ACTIVE, _('Active'), 'blue'),
+        (STATUS_RESERVED, _('Reserved'), 'cyan'),
+        (STATUS_DEPRECATED, _('Deprecated'), 'red'),
     ]
 
 

+ 6 - 4
netbox/tenancy/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ChoiceSet
 
 
@@ -12,8 +14,8 @@ class ContactPriorityChoices(ChoiceSet):
     PRIORITY_INACTIVE = 'inactive'
 
     CHOICES = (
-        (PRIORITY_PRIMARY, 'Primary'),
-        (PRIORITY_SECONDARY, 'Secondary'),
-        (PRIORITY_TERTIARY, 'Tertiary'),
-        (PRIORITY_INACTIVE, 'Inactive'),
+        (PRIORITY_PRIMARY, _('Primary')),
+        (PRIORITY_SECONDARY, _('Secondary')),
+        (PRIORITY_TERTIARY, _('Tertiary')),
+        (PRIORITY_INACTIVE, _('Inactive')),
     )

+ 49 - 46
netbox/utilities/choices.py

@@ -1,4 +1,5 @@
 from django.conf import settings
+from django.utils.translation import gettext_lazy as _
 
 
 class ChoiceSetMeta(type):
@@ -9,7 +10,9 @@ class ChoiceSetMeta(type):
 
         # Extend static choices with any configured choices
         if key := attrs.get('key'):
-            assert type(attrs['CHOICES']) is list, f"{name} has a key defined but CHOICES is not a list"
+            assert type(attrs['CHOICES']) is list, _(
+                "{name} has a key defined but CHOICES is not a list"
+            ).format(name=name)
             app = attrs['__module__'].split('.', 1)[0]
             replace_key = f'{app}.{key}'
             extend_key = f'{replace_key}+' if replace_key else None
@@ -127,33 +130,33 @@ class ColorChoices(ChoiceSet):
     COLOR_WHITE = 'ffffff'
 
     CHOICES = (
-        (COLOR_DARK_RED, 'Dark Red'),
-        (COLOR_RED, 'Red'),
-        (COLOR_PINK, 'Pink'),
-        (COLOR_ROSE, 'Rose'),
-        (COLOR_FUCHSIA, 'Fuchsia'),
-        (COLOR_PURPLE, 'Purple'),
-        (COLOR_DARK_PURPLE, 'Dark Purple'),
-        (COLOR_INDIGO, 'Indigo'),
-        (COLOR_BLUE, 'Blue'),
-        (COLOR_LIGHT_BLUE, 'Light Blue'),
-        (COLOR_CYAN, 'Cyan'),
-        (COLOR_TEAL, 'Teal'),
-        (COLOR_AQUA, 'Aqua'),
-        (COLOR_DARK_GREEN, 'Dark Green'),
-        (COLOR_GREEN, 'Green'),
-        (COLOR_LIGHT_GREEN, 'Light Green'),
-        (COLOR_LIME, 'Lime'),
-        (COLOR_YELLOW, 'Yellow'),
-        (COLOR_AMBER, 'Amber'),
-        (COLOR_ORANGE, 'Orange'),
-        (COLOR_DARK_ORANGE, 'Dark Orange'),
-        (COLOR_BROWN, 'Brown'),
-        (COLOR_LIGHT_GREY, 'Light Grey'),
-        (COLOR_GREY, 'Grey'),
-        (COLOR_DARK_GREY, 'Dark Grey'),
-        (COLOR_BLACK, 'Black'),
-        (COLOR_WHITE, 'White'),
+        (COLOR_DARK_RED, _('Dark Red')),
+        (COLOR_RED, _('Red')),
+        (COLOR_PINK, _('Pink')),
+        (COLOR_ROSE, _('Rose')),
+        (COLOR_FUCHSIA, _('Fuchsia')),
+        (COLOR_PURPLE, _('Purple')),
+        (COLOR_DARK_PURPLE, _('Dark Purple')),
+        (COLOR_INDIGO, _('Indigo')),
+        (COLOR_BLUE, _('Blue')),
+        (COLOR_LIGHT_BLUE, _('Light Blue')),
+        (COLOR_CYAN, _('Cyan')),
+        (COLOR_TEAL, _('Teal')),
+        (COLOR_AQUA, _('Aqua')),
+        (COLOR_DARK_GREEN, _('Dark Green')),
+        (COLOR_GREEN, _('Green')),
+        (COLOR_LIGHT_GREEN, _('Light Green')),
+        (COLOR_LIME, _('Lime')),
+        (COLOR_YELLOW, _('Yellow')),
+        (COLOR_AMBER, _('Amber')),
+        (COLOR_ORANGE, _('Orange')),
+        (COLOR_DARK_ORANGE, _('Dark Orange')),
+        (COLOR_BROWN, _('Brown')),
+        (COLOR_LIGHT_GREY, _('Light Grey')),
+        (COLOR_GREY, _('Grey')),
+        (COLOR_DARK_GREY, _('Dark Grey')),
+        (COLOR_BLACK, _('Black')),
+        (COLOR_WHITE, _('White')),
     )
 
 
@@ -182,20 +185,20 @@ class ButtonColorChoices(ChoiceSet):
     WHITE = 'white'
 
     CHOICES = (
-        (DEFAULT, 'Default'),
-        (BLUE, 'Blue'),
-        (INDIGO, 'Indigo'),
-        (PURPLE, 'Purple'),
-        (PINK, 'Pink'),
-        (RED, 'Red'),
-        (ORANGE, 'Orange'),
-        (YELLOW, 'Yellow'),
-        (GREEN, 'Green'),
-        (TEAL, 'Teal'),
-        (CYAN, 'Cyan'),
-        (GRAY, 'Gray'),
-        (BLACK, 'Black'),
-        (WHITE, 'White'),
+        (DEFAULT, _('Default')),
+        (BLUE, _('Blue')),
+        (INDIGO, _('Indigo')),
+        (PURPLE, _('Purple')),
+        (PINK, _('Pink')),
+        (RED, _('Red')),
+        (ORANGE, _('Orange')),
+        (YELLOW, _('Yellow')),
+        (GREEN, _('Green')),
+        (TEAL, _('Teal')),
+        (CYAN, _('Cyan')),
+        (GRAY, _('Gray')),
+        (BLACK, _('Black')),
+        (WHITE, _('White')),
     )
 
 
@@ -209,9 +212,9 @@ class ImportMethodChoices(ChoiceSet):
     DATA_FILE = 'datafile'
 
     CHOICES = [
-        (DIRECT, 'Direct'),
-        (UPLOAD, 'Upload'),
-        (DATA_FILE, 'Data file'),
+        (DIRECT, _('Direct')),
+        (UPLOAD, _('Upload')),
+        (DATA_FILE, _('Data file')),
     ]
 
 
@@ -222,7 +225,7 @@ class ImportFormatChoices(ChoiceSet):
     YAML = 'yaml'
 
     CHOICES = [
-        (AUTO, 'Auto-detect'),
+        (AUTO, _('Auto-detect')),
         (CSV, 'CSV'),
         (JSON, 'JSON'),
         (YAML, 'YAML'),

+ 13 - 11
netbox/virtualization/choices.py

@@ -1,3 +1,5 @@
+from django.utils.translation import gettext_lazy as _
+
 from utilities.choices import ChoiceSet
 
 
@@ -15,11 +17,11 @@ class ClusterStatusChoices(ChoiceSet):
     STATUS_OFFLINE = 'offline'
 
     CHOICES = [
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_STAGING, 'Staging', 'blue'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
-        (STATUS_OFFLINE, 'Offline', 'red'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_STAGING, _('Staging'), 'blue'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
+        (STATUS_OFFLINE, _('Offline'), 'red'),
     ]
 
 
@@ -38,10 +40,10 @@ class VirtualMachineStatusChoices(ChoiceSet):
     STATUS_DECOMMISSIONING = 'decommissioning'
 
     CHOICES = [
-        (STATUS_OFFLINE, 'Offline', 'gray'),
-        (STATUS_ACTIVE, 'Active', 'green'),
-        (STATUS_PLANNED, 'Planned', 'cyan'),
-        (STATUS_STAGED, 'Staged', 'blue'),
-        (STATUS_FAILED, 'Failed', 'red'),
-        (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'),
+        (STATUS_OFFLINE, _('Offline'), 'gray'),
+        (STATUS_ACTIVE, _('Active'), 'green'),
+        (STATUS_PLANNED, _('Planned'), 'cyan'),
+        (STATUS_STAGED, _('Staged'), 'blue'),
+        (STATUS_FAILED, _('Failed'), 'red'),
+        (STATUS_DECOMMISSIONING, _('Decommissioning'), 'yellow'),
     ]

+ 7 - 7
netbox/wireless/choices.py

@@ -1,4 +1,4 @@
-from django.utils.translation import gettext as _
+from django.utils.translation import gettext_lazy as _
 
 from utilities.choices import ChoiceSet
 
@@ -8,8 +8,8 @@ class WirelessRoleChoices(ChoiceSet):
     ROLE_STATION = 'station'
 
     CHOICES = (
-        (ROLE_AP, 'Access point'),
-        (ROLE_STATION, 'Station'),
+        (ROLE_AP, _('Access point')),
+        (ROLE_STATION, _('Station')),
     )
 
 
@@ -464,10 +464,10 @@ class WirelessAuthTypeChoices(ChoiceSet):
     TYPE_WPA_ENTERPRISE = 'wpa-enterprise'
 
     CHOICES = (
-        (TYPE_OPEN, 'Open'),
+        (TYPE_OPEN, _('Open')),
         (TYPE_WEP, 'WEP'),
-        (TYPE_WPA_PERSONAL, 'WPA Personal (PSK)'),
-        (TYPE_WPA_ENTERPRISE, 'WPA Enterprise'),
+        (TYPE_WPA_PERSONAL, _('WPA Personal (PSK)')),
+        (TYPE_WPA_ENTERPRISE, _('WPA Enterprise')),
     )
 
 
@@ -477,7 +477,7 @@ class WirelessAuthCipherChoices(ChoiceSet):
     CIPHER_AES = 'aes'
 
     CHOICES = (
-        (CIPHER_AUTO, 'Auto'),
+        (CIPHER_AUTO, _('Auto')),
         (CIPHER_TKIP, 'TKIP'),
         (CIPHER_AES, 'AES'),
     )