metis-desk/modules/assets/src/common/locales/en.json
David 7777192d20 feat: enhance workstation asset management interface
- Updated the asset selection process to allow direct selection of the main computer via `AssetSummaryCard` without opening a dialog.
- Improved the user interface for asset addition, ensuring a more intuitive experience with real-time feedback and error handling.
- Refactored the asset summary display to utilize `AssetSummaryCard`, providing a consistent look and feel across the application.
- Added support for loading states and error handling in asset picker components.
- Enhanced localization strings for clarity and consistency in both English and Spanish.
- Introduced new tests to cover the updated functionalities and ensure robustness.
2026-10-16 11:41:38 +02:00

455 lines
23 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"brands": {
"title": "Brands",
"introduction": "Manage the brands available for assets across all companies.",
"entityLabel": "brands",
"new": "Add brand",
"edit": "Edit brand",
"delete": "Delete brand",
"deleting": "Deleting…",
"deleteConfirm": "Delete the brand “{{name}}”? This action cannot be undone.",
"deleteGuidance": "Only custom brands with no references in assets or their history can be deleted. If the brand is in use, you can deactivate it through Edit.",
"deleteError": "The brand could not be deleted.",
"active": "Active",
"inactive": "Inactive",
"name": "Brand",
"logo": {
"label": "Logo",
"none": "No logo",
"help": "Optional: transparent vector SVG, up to 32 KiB. Export as plain SVG with a viewBox, without scripts, animations, embedded images or external references.",
"remove": "Remove logo",
"invalid": "The file is not a supported static SVG or exceeds 32 KiB.",
"readError": "The file could not be read. Select it again."
},
"all": "All",
"search": "Search by brand...",
"loading": "Loading brands…",
"loadError": "Brands could not be loaded.",
"empty": "No brands match the search.",
"noBrand": "Unspecified",
"legacy": "Previous value",
"quickNotice": "The brand remains in the global catalog if you later cancel the asset.",
"help": "A brand identifies an asset manufacturer. It is shared across all companies and does not define commercial models.",
"examples": "Examples: LG, HP, Microsoft, Kyocera, Zebra or Clónico for computers assembled from different manufacturers.",
"guidance": "Add brands and change their availability. Built-in names are protected; custom brands can be renamed. Deactivation preserves assets and their history.",
"errors": {
"INVALID_REQUEST": "Enter a valid brand name.",
"NAME_EXISTS": "A brand already has this name, even if inactive.",
"BUILTIN_PROTECTED": "Built-in brands cannot be deleted or renamed.",
"BRAND_IN_USE": "This brand is referenced by assets or their history and cannot be deleted. You can deactivate it through Edit.",
"BRAND_NOT_FOUND": "This brand is no longer available.",
"INTERNAL_ERROR": "The brand operation could not be completed.",
"FORBIDDEN": "Your session does not allow this operation. Sign in again.",
"UNAUTHENTICATED": "Sign in again."
}
},
"support": {
"title": "Remote technical assistance",
"new": "Add method",
"edit": "Edit method",
"tool": "Tool",
"choose": "Choose a tool",
"chooseState": "Choose a status",
"newTool": "New tool",
"destination": "Identifier or destination",
"requiresVpn": "Requires VPN",
"preferred": "Preferred method",
"state": "Status",
"pending": "Pending configuration",
"available": "Available",
"retired": "Retired",
"notes": "Notes",
"empty": "No assistance methods recorded for this asset.",
"showRetired": "Include retired methods",
"history": "History",
"loading": "Loading remote assistance…",
"loadError": "Remote assistance could not be loaded.",
"help": "What is this method for?",
"description": "Records how a technician can provide remote support for this asset.",
"guidance": "You can record several methods. Only one available method can be preferred. Recording a method does not establish a connection or authorize remote work.",
"examples": "AnyDesk: 123 456 789; Supremo Control: its identifier; Remote Desktop: PORT-ANA-01, with VPN if required.",
"examplesLabel": "Examples and guidance",
"scope": "Do not enter passwords or access keys in the identifier or notes.",
"review": "Review: the asset is retired or the tool is inactive.",
"errors": {
"INVALID_REQUEST": "Check the fields. Only an available method can be preferred.",
"ASSET_NOT_FOUND": "The asset does not belong to this company or is unavailable.",
"ASSET_RETIRED": "Only retired methods can be saved for a retired asset.",
"TOOL_UNAVAILABLE": "Select an active assistance resource from this company.",
"CONNECTION_NOT_FOUND": "This method is unavailable.",
"PREFERRED_EXISTS": "A preferred method already exists. Uncheck it before choosing another.",
"CONNECTION_EXISTS": "This method already exists with the same identifier or destination.",
"INTERNAL_ERROR": "The operation could not be completed."
}
},
"assetPanel": "Selected asset details",
"closeAssetPanel": "Close details panel",
"showAssetPanel": "Show details panel",
"inventory": "Assets",
"allAssets": "All",
"filterByTemplate": "Filter assets by template",
"chooseValue": "Choose an option",
"relatedNotice": "This item is saved separately and remains available if you later cancel the main form.",
"newAsset": "New asset",
"editAsset": "Edit asset",
"deleteAsset": "Delete asset",
"deleteAssetDescription": "The asset “{{name}}” and its history will be deleted. It cannot be deleted while it is linked to other records.",
"deletingAsset": "Deleting asset…",
"deleteAssetError": "The asset could not be deleted. Please try again.",
"viewAsset": "Details and history",
"template": "Template",
"site": "Site",
"person": "Assigned person",
"status": "Status",
"notes": "Notes",
"available": "Available",
"in_use": "In use",
"maintenance": "Maintenance",
"retired": "Retired",
"noAssets": "This company has no assets yet.",
"noAssignment": "Unassigned",
"noValue": "Not specified",
"characteristics": "Characteristics",
"history": "History",
"recordedBy": "Recorded by {{name}}",
"snapshotNotice": "The template is fixed when the asset is created. Its characteristics remain unchanged when the catalog changes.",
"newSite": "New site",
"newPerson": "New person",
"assetDescription": "An asset is a specific IT item belonging to this company. Its template defines the characteristics you can record.",
"assetExamples": "Ana's laptop, the reception monitor or the main site's switch.",
"assetGuidance": "Only the name, template and characteristics required by your template are mandatory. Complete other data later. Retiring an asset retains its history and historical workstation membership.",
"assetScope": "The asset belongs to this company. Site is optional and must belong to it; its relationship with a person is recorded through a workstation or user profile.",
"saveAssetError": "The asset could not be saved.",
"inventoryErrors": {
"BRAND_UNAVAILABLE": "This brand is unavailable for new assignments.",
"SELF_RELATIONSHIP": "An asset cannot link to itself.",
"RELATIONSHIP_EXISTS": "This relationship already exists between these assets.",
"RELATIONSHIP_NOT_FOUND": "Relationship not found in this company.",
"RELATION_TYPE_UNAVAILABLE": "The relationship type must be active for this company.",
"INVALID_MEMBERS": "Select distinct valid assets.",
"WORKSTATION_NOT_FOUND": "Workstation not found in this company.",
"ASSET_IN_WORKSTATION": "An asset belongs to another active workstation. Remove it there before assigning it.",
"ASSET_IN_USE": "The asset cannot be deleted because it is linked to other records.",
"INVALID_REQUEST": "Check the form data.",
"INVALID_CHARACTERISTICS": "A characteristic does not match its field or type.",
"REQUIRED_CHARACTERISTICS": "Complete the template's required characteristics.",
"TEMPLATE_FIXED": "An existing asset's template cannot change.",
"TEMPLATE_UNAVAILABLE": "The template must be active and available to this company.",
"SITE_NOT_FOUND": "The site does not belong to this company.",
"PERSON_UNAVAILABLE": "The person must be active and belong to this company.",
"COMPANY_NOT_FOUND": "Company not found.",
"ASSET_NOT_FOUND": "Asset not found in this company.",
"INTERNAL_ERROR": "The operation could not be completed.",
"FORBIDDEN": "Sign in again.",
"UNAUTHENTICATED": "Sign in again.",
"ASSET_ASSIGNED": "Unlink the asset from active workstations before retiring it.",
"ASSET_NOT_OPERATIONAL": "Only operational assets can be added to an active workstation."
},
"workstations": "Workstations",
"newWorkstation": "New workstation",
"editWorkstation": "Edit workstation",
"workstationPerson": "Workstation custodian",
"workstationSuggestedName": "{{person}}'s workstation at {{site}}",
"workstationHistory": "Workstation history",
"workstationAssets": "Workstation assets",
"noWorkstations": "This company has no workstations yet.",
"noWorkstationAssets": "This workstation has no assets yet.",
"addWorkstationAsset": "Add assets",
"workstationOccupied": "{{name}} · used in another workstation",
"removeWorkstationAsset": "Remove {{name}} from workstation",
"workstationCount": "{{count}} assets",
"workstationCount_one": "{{count}} asset",
"workstationCount_other": "{{count}} assets",
"workstationDescription": "A workstation groups a computer and its peripherals. Its optional custodian is independent of the people with profiles on it.",
"workstationExamples": "Ana's workstation: laptop, two monitors and a printer. One person can have several workstations.",
"workstationGuidance": "Select the site, add at least one asset and designate the main computer. Each asset can belong to only one active workstation. Deactivation keeps its composition and releases its assets; reactivation checks availability.",
"workstationScope": "All elements must belong to this company. Person, site and composition changes retain history.",
"workstationInAsset": "Workstation",
"noWorkstation": "No active workstation",
"relations": "Relationships",
"newRelation": "New relationship type",
"editRelation": "Edit relationship type",
"inverseName": "Name shown from the other asset",
"symmetric": "Same name in both directions",
"directional": "Directional relationship",
"relationDescription": "A relationship type describes how two assets in the same company are linked.",
"relationExamples": "Laptop → Connected to → Monitor. Virtual machine → Hosted on → Server; from the server it reads «Hosts».",
"relationGuidance": "Disable types without losing existing links. Direction is fixed after creation. Relationships retain the names they had when created.",
"linkAsset": "Link asset",
"relationshipType": "Relationship type",
"targetAsset": "Other asset",
"chooseRelation": "Select a relationship",
"chooseAsset": "Select an asset",
"noRelationships": "This asset has no current relationships.",
"endedRelationships": "Ended relationships",
"endRelationship": "End relationship",
"endRelationshipConfirm": "The relationship history will be retained.",
"relationshipHelp": "Link devices that work together or depend on others. Only assets in this company are shown.",
"relationshipExample": "For example: this laptop is connected to an external monitor.",
"relationshipGuidance": "Select the type and then the other asset. Ending a relationship does not delete assets.",
"quickRelationNotice": "The type is saved for this company even if you later cancel the relationship.",
"relationCreated": "Created by {{name}} · {{date}}",
"relationEnded": "Ended by {{name}} · {{date}}",
"yes": "Yes",
"no": "No",
"title": "Asset catalog",
"companyTitle": "Asset catalog",
"introduction": "Define the characteristics and templates used when registering assets.",
"companyIntroduction": "Use global definitions and add those needed by this company.",
"fields": "Fields",
"templates": "Templates",
"newField": "New field",
"editField": "Edit field",
"newTemplate": "New template",
"editTemplate": "Edit template",
"registeredOn": "Registration date",
"registeredOnHelp": "Date the asset joined the company. Optional and independent of the purchase date.",
"name": "Name",
"description": "Description",
"type": "Data type",
"unit": "Unit",
"choices": "List values",
"choicesHelp": "Enter one value per line. Existing values are retained; you can add others.",
"text": "Text",
"number": "Number",
"date": "Date",
"boolean": "Yes / No",
"choice": "List of values",
"active": "Active",
"inactive": "Inactive",
"activate": "Activate",
"deactivate": "Deactivate",
"inherited": "Global configuration",
"overridden": "Customized for this company",
"reset": "Use global configuration",
"builtin": "Built in",
"global": "Global",
"own": "Company",
"custom": "Custom",
"origin": "Origin",
"actions": "Actions",
"edit": "Edit",
"copy": "Create copy",
"copyName": "{{name}} (copy)",
"fieldCount": "{{count}} fields",
"search": "Search",
"empty": "No results.",
"loading": "Loading catalog…",
"retry": "Retry",
"save": "Save",
"saving": "Saving…",
"delete": "Delete",
"deleting": "Deleting…",
"deleteDefinitionConfirm": "Delete “{{name}}”? This action cannot be undone.",
"deleteDefinitionGuidance": "Only unused custom global definitions can be deleted. Built-in definitions and those retained by assets, history, relationships or templates cannot be deleted.",
"deleteError": "The definition could not be deleted.",
"cancel": "Cancel",
"selectField": "Add fields to the template",
"choose": "Select a field",
"addField": "New field",
"clear": "Clear selection",
"required": "Required",
"chooseType": "Select a type",
"view": "View",
"close": "Close",
"viewDefinition": "{{name}}",
"remove": "Remove field: {{name}}",
"noFields": "Add at least one field. All fields are initially optional.",
"fieldHelpText": "Help text",
"fieldHelpHint": "Shown next to the field when creating or editing an asset.",
"protected": "Built-in templates and fields can be edited in the global catalog. A field's data type remains fixed. You can change availability or create a template copy for a company.",
"helpTitle": "What is it for?",
"examplesLabel": "Show examples and guidance",
"fieldDescription": "A field describes an asset characteristic. You can reuse it in several templates.",
"fieldExamples": "Examples: Processor (text), Screen size (number), Warranty expiry (date), PoE (yes/no) or Battery status (list).",
"fieldGuidance": "Choose a useful unit, such as GB. Never store passwords or secrets. The data type is fixed after creation.",
"templateDescription": "A template groups the fields displayed for an asset type. It is not a specific device or a commercial brand or model.",
"templateExamples": "Monitor: screen size, resolution and connections. Laptop: processor, RAM and storage.",
"templateGuidance": "Characteristics are optional by default. Require only information that is always known. Removing a template field does not delete its catalog definition.",
"globalHelp": "Global scope: available to all companies.",
"companyHelp": "Company scope: additions and availability changes affect this company only.",
"disabledField": "Inactive field: retained in this template.",
"disabledFieldsNotice": "This template contains inactive fields. You can activate them in the catalog before using it.",
"quickNotice": "The field remains saved if you later cancel the template.",
"errors": {
"RELATION_DIRECTION_FIXED": "Relationship direction cannot be changed.",
"INVALID_REQUEST": "Check the form data.",
"INVALID_CHOICES": "A list needs unique non-empty values. Other data types do not accept list values.",
"INVALID_FIELDS": "The template needs distinct valid fields.",
"NAME_EXISTS": "A definition of this type already has this name.",
"FIELD_UNAVAILABLE": "Only active global or company fields can be added.",
"FIELD_TYPE_FIXED": "The data type cannot change and existing list values cannot be removed.",
"BUILTIN_PROTECTED": "Built-in relationship types cannot be edited.",
"DEFINITION_NOT_FOUND": "This definition is unavailable in this scope.",
"DEFINITION_PROTECTED": "Only custom global definitions can be deleted.",
"DEFINITION_IN_USE": "This definition is used by assets, history, relationships or templates and cannot be deleted.",
"COMPANY_NOT_FOUND": "Company not found.",
"INTERNAL_ERROR": "The operation could not be completed.",
"FORBIDDEN": "Your session does not allow this operation. Sign in again.",
"UNAUTHENTICATED": "Sign in again.",
"INVALID_SECTIONS": "Sections must have unique names and each field must belong to a section of this template."
},
"fieldPicker": {
"destination": "Destination section: {{name}}",
"limit": "You have reached the template field limit. Deselect fields from this selection or remove fields from the template to add others.",
"open": "Select fields",
"title": "Add fields to the template",
"help": "Select one or more fields and confirm to add them as optional to the destination section. Only active fields that are not already in the template are shown.",
"select": "Select",
"selectField": "Select {{name}}",
"selected": "Selected fields: {{count}}",
"confirm": "Add fields",
"empty": "There are no more fields available to add.",
"invalid": "The selection exceeds the template field limit."
},
"sections": {
"addField": "Add field",
"expand": "Expand section",
"collapse": "Collapse section",
"reorder": "Reorder",
"reorderHelp": "Drag the handle and drop on the upper or lower half of the target. You can also focus the handle and use the up and down arrow keys. Fields are reordered within their section.",
"fields": "Fields",
"title": "Template sections",
"add": "Add section",
"name": "Section name",
"description": "Description",
"ungrouped": "Unsectioned",
"moveUp": "Move up",
"moveDown": "Move down",
"remove": "Remove section",
"removeField": "Remove field",
"clear": "Clear selection",
"required": "Required",
"assign": "Section",
"help": "Organize fields without changing their values or requirements. Removing a section moves its fields to Unsectioned.",
"empty": "This section has no fields yet."
},
"formLayout": {
"identity": "Identification and assignment",
"template": "Template details",
"workstationAssociations": "Location and owner",
"workstationIdentity": "Workstation identification",
"workstationSummary": "Selected details"
},
"detailSections": {
"identification": "Identification",
"assignment": "Location and assignment",
"notes": "Notes"
},
"deleteRecord": {
"title": "Delete record",
"description": "This record and its history will be deleted. Related assets, resources, accounts and people will be preserved. This action cannot be undone.",
"pending": "Deleting…",
"error": "The record could not be deleted. Please try again."
},
"templateIcon": {
"label": "Icon",
"none": "No icon",
"help": "Visually identifies the template and its assets. You can change or remove it on custom templates.",
"options": {
"laptop": "Laptop",
"desktop": "Desktop computer",
"monitor": "Monitor",
"printer": "Printer",
"router": "Router",
"shield": "Security / firewall",
"network": "Switch / network",
"wifi": "Wi-Fi",
"hard-drive": "NAS / storage",
"server": "Server",
"smartphone": "Smartphone",
"battery": "UPS / battery",
"tablet": "Tablet",
"keyboard": "Keyboard",
"mouse": "Mouse",
"headphones": "Headphones",
"camera": "Camera",
"box": "Other asset"
}
},
"multiline": "Long text",
"workstationDetail": {
"back": "Back to workstations",
"subtitle": "Assets, user profiles and people connected to this workstation.",
"loadError": "Unable to load the workstation.",
"notFound": "This workstation does not exist in this company.",
"assets": "Workstation assets",
"profiles": "User profiles",
"profilesHint": "Profiles associated with the assets of this workstation.",
"profilesError": "Unable to load user profiles.",
"noProfiles": "No profiles are linked to this workstation’s assets.",
"people": "Related people",
"noPeople": "No people are related to this workstation.",
"assignedPerson": "Workstation custodian",
"profilePerson": "Has a profile on a workstation asset",
"needsReview": "References awaiting review",
"missingAsset": "Asset unavailable."
},
"workstationComputer": "Main computer",
"workstationComputerHelp": "Select the main computer by clicking its card among the workstation assets. Profiles will be created on it; the other assets are peripherals.",
"workstationLifecycle": {
"decommission": {
"title": "Deactivate",
"description": "Deactivate “{{name}}” and unlink its responsible person, computer, assets. History is retained. Assets, profiles and computer software retain their records.",
"pending": "Deactivating…",
"error": "Could not deactivate the workstation. Please try again."
},
"delete": {
"title": "Delete permanently",
"description": "Delete “{{name}}”, its history and its associations. Assets, people, profiles and software are retained. This cannot be undone. If other records refer to it, use Deactivate.",
"pending": "Deleting…",
"error": "Could not delete the workstation. Please try again."
},
"inUse": "Other records, such as user profiles, reference this workstation. Deactivate it to retain those references."
},
"operational": "Operational",
"broken": "Broken",
"technicalStatus": "Technical state",
"technicalStatusHelp": "Available and In use are calculated from active workstations. Breakdowns and maintenance retain existing assignments.",
"workstationPersonOptional": "Workstation owner",
"workstationNameBySite": "Workstation at {{site}}",
"workstationSteps": {
"label": "New workstation steps",
"progress": "Step {{step}} of {{total}}",
"completed": "Completed",
"location": "Site and owner",
"assets": "Assets",
"computer": "Main computer",
"summary": "Summary",
"locationDescription": "Select a site. You can leave the owner unassigned.",
"assetsDescription": "Add at least one asset to the workstation.",
"chooseComputer": "Choose {{name}} as the main computer",
"computerDescription": "Click the card of the asset that will host user profiles.",
"summaryDescription": "Review the details and workstation name before saving.",
"singleComputer": "The only asset is automatically selected as the main computer.",
"previous": "Previous",
"next": "Next"
},
"assetPicker": {
"single": "Select asset",
"multiple": "Select assets",
"select": "Selection",
"selectAsset": "Select {{name}}",
"selected": "{{count}} assets selected",
"selected_one": "{{count}} asset selected",
"selected_other": "{{count}} assets selected",
"confirm": "Select",
"clear": "Clear selection",
"required": "Required"
},
"creationSteps": {
"label": "New asset steps",
"progress": "Step {{step}} of {{total}}",
"template": "Choose template",
"fields": "Complete fields",
"name": "Identification and notes",
"next": "Next",
"previous": "Back",
"nameHelp": "Name suggested from the asset fields. You can edit it.",
"completed": " (completed)",
"templateDescription": "Select the template that defines the asset characteristics.",
"fieldsDescription": "Complete the template details. Fields marked with * are required.",
"nameDescription": "Review the suggested name, technical status, site and registration date. Add notes if you need to provide more context."
}
}