{ "escalationManager": { "unsavedChanges_one": "{{count}} unsaved change", "unsavedChanges_other": "{{count}} unsaved changes" }, "page": { "title": "Admin Settings" }, "tabs": { "general": "General", "experimentalFeatures": "Experimental Features", "clientPortal": "Client Portal", "users": "Users", "teams": "Teams", "language": "Language", "ticketing": "Ticketing", "projects": "Projects", "interactions": "Interactions", "notifications": "Notifications", "timeEntry": "Time Entry", "billing": "Billing", "secrets": "Secrets", "importExport": "Import/Export", "email": "Email", "integrations": "Integrations", "extensions": "Extensions", "ticketingSettings": "Ticketing Settings", "loadingTicketing": "Loading ticketing configuration...", "teamManagement": "Team Management", "loadingTeam": "Loading team configuration...", "loadingExperimental": "Loading experimental feature configuration...", "loadingInteractions": "Loading interaction settings...", "keyboardShortcuts": "Keyboard Shortcuts" }, "unsavedChanges": { "title": "Unsaved Changes", "message": "You have unsaved changes. Are you sure you want to leave? Your changes will be lost." }, "general": { "title": "General Settings", "description": "Manage your organization name and default client. The default client is used for configuration purposes and represents your MSP.", "fields": { "organizationName": { "label": "Organization Name" }, "defaultTimezone": { "label": "Default Time Zone", "help": "Used for emails and notifications when a user has not set their own timezone." } }, "actions": { "saveOrganizationName": "Save Organization Name", "saveDefaultTimezone": "Save Default Time Zone" }, "clients": { "title": "Clients", "table": { "name": "Name", "default": "Default", "actions": "Actions" }, "placeholder": "Select a client to add", "addClient": "Add Client" }, "messages": { "success": { "tenantNameUpdated": "Tenant name updated successfully", "timezoneUpdated": "Default timezone updated successfully", "clientAdded": "Client added successfully", "clientRemoved": "Client removed successfully", "defaultClientUpdated": "Default client updated successfully" }, "error": { "loadTenantData": "Failed to load tenant data", "updateTenantName": "Failed to update tenant name", "updateTimezone": "Failed to update timezone", "selectClient": "Please select a client", "clientNotFound": "Client not found", "addClient": "Failed to add client", "removeClient": "Failed to remove client", "setDefaultClient": "Failed to set default client", "loadClients": "Failed to load clients" } } }, "experimentalFeatures": { "title": "Experimental Features", "description": "Enable or disable experimental features for your tenant.", "alert": { "title": "Experimental", "description": "Experimental features may change or be removed without notice." }, "features": { "aiAssistant": { "name": "AI Assistant", "description": "Enable AI-powered Quick Ask and Chat sidebar.", "restriction": "Only available for whitelisted tenants." } }, "actions": { "save": "Save", "saving": "Saving...", "retry": "Retry" }, "loading": "Loading experimental features...", "messages": { "success": { "saved": "Experimental feature settings saved. Reload the page to apply changes." }, "error": { "loadFailed": "Failed to load experimental feature settings.", "saveFailed": "Failed to save experimental feature settings." } } }, "users": { "title": "User Management", "description": { "msp": "Manage MSP users and permissions", "client": "Manage client portal users and their access" }, "viewSwitcher": { "msp": "MSP", "clientPortal": "Client Portal" }, "license": { "usage": "MSP users: {{used}}{{limit}} licenses used", "noLimit": " (No limit)", "ofLimit": " of {{limit}}", "addLicensePrompt": "To add a new user you must purchase additional licenses", "addLicense": "Add License" }, "search": "Search users", "filter": { "all": "All Users", "active": "Active Users", "inactive": "Inactive Users", "selectStatus": "Select Status" }, "tabs": { "list": "List", "structure": "Structure", "listDescription": "Manage individual users, roles, and permissions.", "structureDescription": "Visualize and manage the organizational reporting hierarchy." }, "actions": { "createNewUser": "Create New User", "createNewClientUser": "Create New Client User", "copyPortalLink": "Copy Portal Login Link", "copying": "Copying...", "createUser": "Create User", "sendInvitation": "Send Portal Invitation", "cancel": "Cancel" }, "form": { "title": { "msp": "Create New MSP User", "client": "Create New Client Portal User" }, "fields": { "firstName": "First Name", "lastName": "Last Name", "email": "Email", "client": "Client", "clientOptional": "(optional)", "primaryRole": "Primary Role", "selectRole": "Select Role", "reportsTo": "Reports To", "reportsToOptional": "(optional)", "selectManager": "Select manager", "existingContact": "Existing Contact", "existingContactOptional": "(optional)", "selectExistingContact": "Select existing contact (optional)", "selectExistingContactRequired": "Select existing contact", "selectContactToInvite": "Select contact to invite", "password": "Password", "passwordOptional": "(Leave blank to send invitation)", "passwordPlaceholder": { "msp": "Enter password", "client": "Leave blank to send invitation" }, "selectClient": "Select Client" }, "passwordAlert": { "withPassword": "Setting a password will create the user immediately. They can log in right away.", "withoutPassword": "No password required — we will send a portal invitation for the user to set it." }, "requirePasswordChange": "Require password change on first login" }, "table": { "firstName": "First Name", "lastName": "Last Name", "email": "Email", "client": "Client", "role": "Role", "lastLogin": "Last Login", "actions": "Actions", "noClient": "No Client", "noRole": "No Role", "never": "Never", "viaMethod": "via {{method}}", "loading": "Loading...", "openMenu": "Open menu", "edit": "Edit", "remove": "Remove" }, "loading": "Loading users...", "messages": { "success": { "portalInvitationSent": "Portal invitation sent successfully!", "clientPortalUserCreated": "Client portal user created successfully!", "copiedVanityLink": "Copied vanity portal login link to clipboard", "copiedCanonicalLink": "Copied canonical portal login link to clipboard" }, "error": { "fetchUsers": "Failed to fetch users", "fetchRoles": "Failed to fetch roles", "fetchClients": "Failed to fetch clients", "createUser": "Failed to create user", "sendInvitation": "Failed to send invitation", "sendInvitationManual": "Failed to send invitation. You can send it manually from the user list.", "createClientPortalUser": "Failed to create client portal user", "clipboardUnavailable": "Clipboard API is not available in this browser.", "copyPortalLink": "Failed to copy portal login link", "fillRequiredFields": "Please fill in all required fields", "fixValidationErrors": "Please fix the validation errors before continuing", "fixValidationBeforeInvitation": "Please fix the validation errors before sending the invitation", "emailAlreadyInUse": "This email address is already in use. Please use a different email address.", "portalUserExists": "A portal user already exists for this contact or email address.", "portalUserExistsForContact": "A portal user already exists for this contact. Use password reset for the existing user.", "selectAppropriateRole": "Please select an appropriate role for this user type", "contactMissingEmail": "Contact \"{{name}}\" is missing an email address. Please update the contact's email before sending an invitation.", "licenseLimit": "Cannot activate user: License limit reached. Please deactivate another user or upgrade your license.", "permissionDeniedInvite": "You do not have permission to invite users.", "permissionDeniedCreate": "You do not have permission to create users.", "emailNotConfigured": "Email service is disabled or not configured.", "contactNotFound": "Contact not found.", "contactMissingEmailGeneric": "Contact does not have an email address. Please add an email address to the contact before sending an invitation.", "contactInvalidEmail": "Contact has an invalid email address. Please update the contact with a valid email address before sending an invitation.", "noDefaultClient": "No default client configured for this tenant. Please set a default client in General Settings.", "noDefaultLocation": "Default client must have a default location configured to send portal invitations.", "noLocationEmail": "Default client's location must have a contact email configured.", "noBaseUrl": "Base URL is not configured for portal invitations.", "passwordTooShort": "Password must be at least 8 characters long.", "roleRequired": "Role is required", "invalidRole": "Selected role is invalid", "licenseLimitReached": "You've reached your MSP user license limit.", "soloPlanLimit": "Solo plan is limited to 1 user. Upgrade to Pro to add more users." } } }, "userDetails": { "title": "User Details", "fields": { "firstName": { "label": "First Name", "placeholder": "Enter first name" }, "lastName": { "label": "Last Name", "placeholder": "Enter last name" }, "email": { "label": "Email", "placeholder": "Enter email" }, "reportsTo": { "label": "Reports To", "placeholder": "Select manager" }, "lastLogin": "Last Login", "roles": "Roles", "status": "Status", "statusHelp": "Set user account status", "newPassword": "New Password" }, "status": { "active": "Active", "inactive": "Inactive", "inactiveTag": "(Inactive)" }, "actions": { "addRole": "Add Role", "selectRoleToAdd": "Select role to add", "removeRole": "Remove", "setPassword": "Set Password", "cancel": "Cancel", "saveChanges": "Save Changes" }, "dialog": { "setPassword": { "title": "Set User Password (Admin)" } }, "messages": { "success": { "passwordChanged": "Password changed successfully", "userUpdated": "User updated successfully", "roleAdded": "Role added successfully", "roleRemoved": "Role removed successfully" }, "error": { "userNotFound": "User not found", "loadFailed": "Failed to load user details. Please try again.", "addRoleFailed": "Failed to add role. Please try again.", "removeRoleFailed": "Failed to remove role. Please try again.", "updateUserNotFound": "Failed to update user. User not found.", "updateFailed": "Failed to update user. Please try again.", "emailAlreadyExists": "A user with this email address already exists", "reportsToSelf": "A user cannot report to themselves", "reportsToCycle": "This would create a circular reporting chain", "passwordTooShort": "Password must be at least 8 characters long", "passwordChangeFailed": "Failed to change password", "passwordChangeError": "An error occurred while changing password", "permissionDenied": "You do not have permission to change user roles." } }, "loading": "Loading user details..." }, "teams": { "title": "Team Management", "description": "Create and manage teams, assign team leads, and organize members across your organization", "loading": "Loading teams...", "emptyState": "Please select a team to manage members", "list": { "title": "Teams", "addNewTeam": "Add New Team", "createTeam": "Create Team", "cancel": "Cancel", "delete": "Delete", "placeholder": "Enter new team name", "selectManager": "Select a manager" }, "details": { "loading": "Loading team details...", "notFound": "No team found", "fields": { "teamLead": "Team Lead", "addMember": "Add Member" }, "placeholders": { "teamName": "Enter team name", "selectTeamLead": "Select a team lead", "selectUserToAdd": "Select a user to add" }, "alert": { "unsavedChanges": "You have unsaved changes" }, "actions": { "discard": "Discard", "saveChanges": "Save Changes", "saveName": "Save name", "cancel": "Cancel", "editName": "Edit name", "remove": "Remove" }, "table": { "teamMembers": "Team Members", "member": "Member", "role": "Role" }, "badge": { "new": "New", "lead": "Lead" }, "leadName": "Lead: {{name}}", "memberCount_one": "{{count}} member", "memberCount_other": "{{count}} members" }, "messages": { "error": { "loadFailed": "Failed to load teams. Please try again.", "fetchUsers": "Failed to fetch users", "createFailed": "Failed to create team: {{error}}", "deleteFailed": "Failed to delete team", "updateName": "Failed to update team name", "saveChanges": "Failed to save changes. Please try again." } } }, "ticketing": { "title": "Ticket Settings", "tabs": { "display": "Display", "ticketNumbering": "Ticket Numbering", "boards": "Boards", "statuses": "Statuses", "priorities": "Priorities", "categories": "Categories", "checklistTemplates": "Checklist Templates" }, "numbering": { "title": "Number Format", "description": "Define the prefix, digit padding, and current sequence", "fields": { "prefix": { "label": "Ticket Number Prefix", "placeholder": "TK-", "help": "Optional prefix for ticket numbers. Leave empty for no prefix or enter a custom prefix (e.g., 'TK-')" }, "minimumDigits": { "label": "Minimum Digits", "help": "Minimum number of digits for the sequential number. For example, 6 makes '1' become '000001'" }, "initialValue": { "label": "Initial Value", "placeholder": "Enter value", "help": "Set the starting number for the sequence. This can only be set once." }, "lastUsedNumber": { "label": "Last Used Number", "help": "The last number that was assigned. The next number will be one higher than this value." }, "nextPreview": { "label": "Next Ticket Number Preview", "help": "This is the number that will be assigned to the next ticket" } }, "actions": { "saveChanges": "Save Changes", "cancel": "Cancel" }, "dialog": { "title": "Update Ticket Number Settings", "message": "Changing these settings will affect how new ticket numbers are generated. This change will not affect existing tickets. Are you sure you want to proceed?", "confirm": "Update Settings" }, "loading": "Loading...", "messages": { "error": { "noSettings": "No ticket numbering settings found. Please contact your administrator.", "loadFailed": "Failed to load ticket numbering settings", "updateFailed": "Failed to update settings", "updatePaddingFailed": "Failed to update padding length", "updateLastNumberFailed": "Failed to update last number", "updateInitialValueFailed": "Failed to update initial value" }, "success": { "updated": "Ticket numbering settings updated successfully" } } }, "statuses": { "title": "Ticket Statuses", "alert": "Default Status: When clients create tickets through the client portal, they will automatically be assigned the status marked as default. Only one status can be set as default at a time.", "table": { "name": "Name", "status": "Status", "default": "Default", "order": "Order", "actions": "Actions" }, "statusLabels": { "closed": "Closed", "open": "Open", "closedHelp": "Tickets with this status will be marked as closed", "openHelp": "Tickets with this status will remain open", "defaultHelp": "Default status for new tickets from client portal" }, "actions": { "addStatus": "Add Status", "importStandard": "Import from Standard Statuses", "edit": "Edit", "delete": "Delete" }, "retiredAlert": "Ticket statuses are now managed inside each board. Use the Boards tab to edit ticket lifecycles for a specific board.", "messages": { "success": { "deleted": "Status deleted successfully", "updated": "Status updated successfully" }, "error": { "lastClosed": "At least one status must remain marked as closed", "deleteLastClosed": "Cannot delete the last closed status for this type.", "removeDefault": "Cannot remove default status from the last default status" } } }, "boards": { "title": "Boards", "alert": "Boards organize tickets into logical groups. Each board can have its own default agent, priority, and SLA policy.", "table": { "name": "Name", "description": "Description", "status": "Status", "default": "Default", "defaultAgent": "Default Agent", "defaultPriority": "Default Priority", "boardManager": "Board Manager", "order": "Order", "itilBoard": "ITIL Board", "actions": "Actions" }, "statusLabels": { "active": "Active", "inactive": "Inactive" }, "actions": { "addBoard": "Add Board", "importStandard": "Import from Standard Boards", "edit": "Edit", "delete": "Delete", "cancel": "Cancel", "close": "Close", "create": "Create", "update": "Update", "importSelected": "Import Selected", "up": "Up", "down": "Down", "remove": "Remove", "addStatus": "Add Status" }, "fields": { "boardName": { "label": "Board Name", "placeholder": "Enter board name" }, "description": { "label": "Description", "placeholder": "Enter board description" }, "displayOrder": { "label": "Display Order", "placeholder": "Enter display order", "help": "Controls the order boards appear in the list" }, "inactive": "Mark as inactive", "itilCompliant": "ITIL Compliant", "boardConfiguration": "Board Configuration", "boardManager": { "label": "Board Manager", "placeholder": "Select a board manager", "help": "The user responsible for managing this board" }, "defaultAssignedAgent": { "label": "Default Assigned Agent", "placeholder": "Select default agent", "help": "New tickets on this board will be assigned to this agent by default" }, "defaultPriority": { "label": "Default Priority", "placeholder": "Select default priority", "help": "New tickets on this board will use this priority by default", "none": "None" }, "slaPolicy": { "label": "SLA Policy", "placeholder": "Select SLA policy", "help": "The SLA policy to apply to tickets on this board", "none": "None" }, "ticketStatusSetup": { "label": "Ticket status setup", "help": "Choose whether this board starts from an existing lifecycle or a new inline status list.", "copyExisting": "Copy from existing board", "createInline": "Create statuses inline" }, "copyTicketStatuses": { "label": "Copy ticket statuses from", "help": "New boards clone their ticket lifecycle from an existing board.", "selectSource": "Select a source board", "noSourceAvailable": "No source boards available", "unnamedBoard": "Unnamed board" }, "ticketStatuses": { "labelEditing": "Board ticket statuses", "labelCopied": "Copied ticket statuses", "labelInline": "Inline ticket statuses", "helpEditing": "Edit the ticket lifecycle for this board only.", "helpCopied": "Review and adjust the copied lifecycle before saving the new board.", "helpInline": "Author the board's initial ticket lifecycle before saving.", "loading": "Loading board ticket statuses…", "statusName": "Status name", "closed": "Closed", "default": "Default" }, "inboundReplyReopen": { "enabledLabel": "Reopen closed tickets on inbound replies", "enabledHelp": "Applies to threaded replies matched to already closed tickets on this board.", "cutoffHoursLabel": "Reopen cutoff (hours)", "cutoffHoursHelp": "Replies received after this window create new tickets instead of reopening old ones.", "statusLabel": "Reopen status (optional)", "statusPlaceholder": "Select reopen status", "statusUseDefault": "Use board default open status", "suppressAiLabel": "Suppress reopen for short ACK replies (AI)", "suppressAiHelp": "Enterprise AI Assistant add-on only. If unavailable, replies reopen normally." }, "liveTimer": { "label": "Enable live ticket timer", "help": "Shows the live timer and tracked intervals on tickets in this board. Manual time entry remains available." } }, "dialog": { "addBoard": "Add Board", "editBoard": "Edit Board", "deleteBoardTitle": "Delete Board", "deleteBoardMessage": "This will permanently delete the board.", "cleanupItilTitle": "Clean Up ITIL Board", "cleanupItilMessage": "This will remove the ITIL categories and priority matrix associated with this board.", "deleteOnly": "Delete Only", "deleteAndCleanup": "Delete & Clean Up", "deleteAll": "Delete All", "importTitle": "Import Standard Boards", "importDescription": "Select standard boards to import into your organization:", "importEmpty": "No standard boards available to import.", "conflictsTitle": "Resolve Import Conflicts", "conflictsDescription": "The following items have conflicts that need to be resolved:", "nameConflict": "Name already exists", "orderConflict": "Order {{order}} is already in use", "skipItem": "Skip this item", "importNewName": "Import with different name:", "importWithOrder": "Import with order {{order}}", "importWithResolutions": "Import with Resolutions" }, "importTable": { "active": "Active" }, "itilInfo": { "title": "ITIL Information", "tooltip": "This board follows ITIL best practices", "categoriesTitle": "ITIL Categories", "priorityMatrixTitle": "Priority Matrix", "impactDescription": "Impact levels define the scope of the issue", "urgencyDescription": "Urgency levels define how quickly the issue needs resolution", "priorityDescription": "Priority is calculated from impact and urgency", "categories": { "serviceRequest": "Service Request" }, "priorityMatrix": { "urgencyHeaderLine1": { "high": "High", "mediumHigh": "Medium-High", "medium": "Medium", "mediumLow": "Medium-Low", "low": "Low" }, "urgencyHeaderLine2": { "high": "Urgency (1)", "mediumHigh": "Urgency (2)", "medium": "Urgency (3)", "mediumLow": "Urgency (4)", "low": "Urgency (5)" }, "impact": { "high": "High Impact (1)", "mediumHigh": "Medium-High Impact (2)", "medium": "Medium Impact (3)", "mediumLow": "Medium-Low Impact (4)", "low": "Low Impact (5)" }, "priority": { "critical": "Critical (1)", "high": "High (2)", "medium": "Medium (3)", "low": "Low (4)", "planning": "Planning (5)" } } }, "messages": { "success": { "created": "Board created successfully", "updated": "Board updated successfully", "deleted": "Board deleted successfully", "imported": "Boards imported successfully" }, "error": { "fetchFailed": "Failed to load boards", "fetchAvailableFailed": "Failed to fetch available boards for import", "nameRequired": "Board name is required", "saveFailed": "Failed to save board", "lastDefault": "Cannot remove the last default board", "statusRequired": "Add at least one ticket status before saving the board.", "duplicateStatusName": "Ticket status names must be unique within a board.", "invalidOpenDefault": "Select exactly one open default ticket status before saving the board.", "nameAlreadyExists": "A board with this name already exists.", "selectBoardToCopy": "Select an existing board to copy ticket statuses from.", "fetchStatusesFailed": "Failed to load board ticket statuses.", "deleteFailed": "Failed to delete board", "importFailed": "Failed to import boards", "updateStatusFailed": "Failed to update board status", "updateDefaultFailed": "Failed to update default board" } }, "closeRules": { "enabledLabel": "Close rules", "enabledHelp": "Require conditions to be met before tickets on this board can be closed.", "requireResolutionCommentLabel": "Require a resolution comment", "requireResolutionCommentHelp": "A resolution comment must exist before the ticket can close.", "requireTimeEntryLabel": "Require a time entry", "requireTimeEntryHelp": "At least one time entry must be logged before the ticket can close.", "requireChecklistCompleteLabel": "Require checklist completion", "requireChecklistCompleteHelp": "All required checklist items must be checked off before the ticket can close.", "requireNoOpenChildrenLabel": "Require bundled tickets closed", "requireNoOpenChildrenHelp": "A bundle master cannot close while bundled child tickets are still open.", "requiredFieldsLabel": "Required fields at close", "requiredFieldsHelp": "These ticket fields must be filled in before the ticket can close.", "autoCloseLabel": "Auto-close rules", "autoCloseHelp": "Automatically close tickets that sit in a status with no activity. An optional warning email goes to the contact before closing.", "addAutoCloseRule": "Add rule", "triggerStatusLabel": "When ticket is in status", "triggerStatusPlaceholder": "Select status", "targetStatusLabel": "Close to status", "targetStatusPlaceholder": "Select closed status", "inactivityDaysLabel": "Days of inactivity", "warningDaysLabel": "Warn days before close", "warningDaysPlaceholder": "No warning", "ruleEnabledLabel": "Enabled", "removeRule": "Remove", "messages": { "fetchFailed": "Failed to load close rules for this board", "autoCloseStatusRequired": "Each auto-close rule needs a trigger status and a closed target status", "autoCloseDaysInvalid": "Auto-close inactivity days must be a positive whole number", "autoCloseWarningInvalid": "The warning lead time must be smaller than the inactivity days" } } }, "priorities": { "title": { "ticket": "Ticket Priorities", "projectTask": "Project Task Priorities" }, "alert": { "header": "Priority Management:", "description": "Create custom priorities for your organization or import from standard templates.", "itilNote": "ITIL standard priorities cannot be edited or deleted.", "nonItilNote": "All priorities can be edited or deleted to fit your workflow." }, "table": { "name": "Name", "type": "Type", "color": "Color", "order": "Order", "actions": "Actions", "standardTag": "(Standard)", "itilProtected": "Protected" }, "itemTypes": { "ticket": "Ticket", "projectTask": "Project Task" }, "actions": { "addPriority": "Add Priority", "importStandard": "Import from Standard Priorities", "openMenu": "Open menu", "edit": "Edit", "delete": "Delete", "cancel": "Cancel" }, "dialog": { "addTitle": "Add New Priority", "editTitle": "Edit Priority", "submitAdd": "Add Priority", "submitUpdate": "Update Priority" }, "fields": { "priorityName": { "label": "Priority Name", "placeholder": "e.g., Urgent" }, "orderNumber": { "label": "Order Number (1-100, higher numbers appear first)", "help": "Controls the order in which priorities appear in dropdown menus throughout the platform. Higher numbers appear first for priorities.", "used": "Used order numbers: {{numbers}}", "noneUsed": "No order numbers used yet" }, "color": { "label": "Color", "chooseButton": "Choose Color" } }, "import": { "title": "Import Standard Priorities", "submit": "Import ({{count}})", "allImportedTicket": "All standard priorities have already been imported for tickets.", "allImportedProjectTask": "All standard priorities have already been imported for project tasks.", "instructions": "Select the standard priorities you want to import. These will be copied to your organization's priorities." }, "messages": { "success": { "deleted": "Priority deleted successfully", "imported": "Successfully imported {{count}} priorities", "skipped": "Skipped {{count}} priorities (already exist)" }, "error": { "orderTaken": "Order number {{order}} is already taken by \"{{name}}\". Please choose a different order number.", "uniqueConstraint": "This order number is already in use. Please choose a different order number.", "saveFailed": "Failed to save priority", "deleteFailed": "Failed to delete priority", "deleteValidationFailed": "Failed to validate deletion. Please try again.", "importFailed": "Failed to import priorities" } }, "entity": { "fallback": "this priority" } }, "checklistTemplates": { "title": "Checklist Templates", "alert": "Checklist templates define reusable checklists for tickets. Template items are copied onto tickets when applied, so editing a template never changes checklists already on tickets.", "table": { "name": "Name", "description": "Description", "items": "Items", "status": "Status", "actions": "Actions" }, "statusLabels": { "active": "Active", "inactive": "Inactive" }, "actions": { "addTemplate": "Add Template", "edit": "Edit", "delete": "Delete", "cancel": "Cancel", "close": "Close", "create": "Create", "update": "Update", "up": "Up", "down": "Down", "remove": "Remove", "addItem": "Add Item", "addRule": "Add Rule" }, "fields": { "name": { "label": "Template Name", "placeholder": "Enter template name" }, "description": { "label": "Description", "placeholder": "Enter description" }, "active": "Active", "items": { "label": "Checklist Items", "help": "Items are added to tickets in this order when the template is applied.", "itemName": "Item Name", "required": "Required", "newItemLabel": "New Item", "newItemPlaceholder": "Enter item name" }, "rules": { "label": "Auto-Apply Rules", "help": "The template is automatically applied to new tickets matching any of these rules. Leave a field as \"Any\" to match all values.", "empty": "No auto-apply rules. This template can still be applied to tickets manually.", "board": "Board", "category": "Category", "subcategory": "Subcategory", "priority": "Priority", "any": "Any" } }, "dialog": { "addTemplate": "Add Checklist Template", "editTemplate": "Edit Checklist Template", "createFirstHelp": "Create the template first, then add checklist items and auto-apply rules.", "deleteTitle": "Delete Checklist Template", "deleteMessage": "Are you sure you want to delete \"{{name}}\"? Checklists already added to tickets will not be affected." }, "messages": { "success": { "created": "Checklist template created successfully", "updated": "Checklist template updated successfully", "deleted": "Checklist template deleted successfully" }, "error": { "fetchFailed": "Failed to fetch checklist templates", "fetchRulesFailed": "Failed to fetch auto-apply rules", "nameRequired": "Template name is required", "saveFailed": "Failed to save checklist template", "deleteFailed": "Failed to delete checklist template", "updateStatusFailed": "Failed to update template status", "itemSaveFailed": "Failed to save checklist item", "ruleSaveFailed": "Failed to save auto-apply rule" } } } }, "interactions": { "title": "Interaction Settings", "tabs": { "types": "Interaction Types", "statuses": "Interaction Statuses" }, "types": { "title": "Interaction Types", "loading": "Loading interaction types...", "table": { "name": "Name", "order": "Order", "actions": "Actions" }, "actions": { "addType": "Add Interaction Type", "importStandard": "Import from Standard Interaction Types", "edit": "Edit", "delete": "Delete", "cancel": "Cancel", "importSelected": "Import Selected" }, "dialog": { "import": { "title": "Import Standard Interaction Types", "description": "Select standard interaction types to import into your organization:", "empty": "No standard interaction types available to import." }, "conflicts": { "title": "Resolve Import Conflicts", "description": "The following items have conflicts that need to be resolved:", "nameConflict": "Name already exists", "orderConflict": "Order {{order}} is already in use", "skipItem": "Skip this item", "importDifferentName": "Import with different name:", "importDifferentOrder": "Import with order {{order}}", "resolve": "Import with Resolutions" } }, "messages": { "success": { "deleted": "Interaction type deleted", "imported_one": "Imported {{count}} interaction type", "imported_other": "Imported {{count}} interaction types" }, "error": { "fetchFailed": "Failed to fetch interaction types", "validateDeleteFailed": "Failed to validate interaction type deletion", "deleteFailed": "Failed to delete interaction type", "checkConflicts": "Failed to check conflicts", "importFailed": "Failed to import interaction types", "fetchAvailable": "Failed to fetch available interaction types for import" } } }, "statuses": { "title": "Interaction Statuses", "alert": "Interaction Statuses: Track the state of customer interactions such as calls, emails, and meetings.", "table": { "name": "Name", "status": "Status", "order": "Order", "actions": "Actions" }, "statusLabels": { "closedHelp": "Interactions with this status will be marked as closed", "openHelp": "Interactions with this status will remain open" }, "actions": { "addStatus": "Add Status", "importStandard": "Import from Standard", "edit": "Edit", "delete": "Delete" }, "messages": { "success": { "updated": "Status updated successfully", "deleted": "Status deleted successfully", "imported": "Successfully imported {{count}} statuses" }, "error": { "lastClosed": "At least one status must remain marked as closed", "deleteLastClosed": "Cannot delete the last closed status for this type.", "skipped": "Skipped {{count}} statuses ({{reason}})", "importFailed": "Failed to import statuses" } } }, "quickAdd": { "dialog": { "createTitle": "Create Interaction Type", "editTitle": "Edit Interaction Type" }, "fields": { "name": { "label": "Interaction Type Name:", "placeholder": "e.g., 'Client Onboarding Call', 'Sales Demo', 'Project Review'" }, "displayOrder": { "label": "Display Order:", "placeholder": "e.g., 1, 2, 3..." }, "icon": { "label": "Choose an Icon:" } }, "preview": { "title": "Preview:", "empty": "Enter type name above" }, "actions": { "cancel": "Cancel", "create": "Create Type", "update": "Update Type", "creating": "Creating...", "updating": "Updating..." }, "messages": { "error": { "nameRequired": "Please enter a name for the interaction type.", "saveFailed": "Failed to {{action}} interaction type. Please try again." } } }, "openMenu": "Open menu" }, "clientPortal": { "branding": { "title": "Branding & Appearance", "description": "Customize the look and feel of your client portal with your company branding.", "fields": { "companyName": "Company Name", "companyLogo": "Company Logo", "colorPalette": "Color Palette", "primaryColor": "Primary Color", "secondaryColor": "Secondary Color", "supportEmail": "Support Email", "supportPhone": "Support Phone" }, "help": { "companyName": "This will be displayed in the client portal header", "companyLogo": "Recommended: PNG or SVG, max 2MB, transparent background", "primaryColor": "Used for buttons, links, and highlights", "secondaryColor": "Used for accents and secondary actions", "supportEmail": "Shown to clients in appointment confirmations and other outbound emails as the address to contact for help.", "supportPhone": "Optional. Shown alongside the support email in client-facing emails." }, "preview": "Preview", "previewDarkMode": "Preview dark mode", "actions": { "saveBranding": "Save Branding Settings", "previewDashboard": "Preview Client Dashboard", "hideDashboard": "Hide Client Dashboard", "previewSignIn": "Preview Sign-in Page", "hideSignIn": "Hide Sign-in Page" }, "customDomainRequired": "Must have custom domain set up" }, "dashboardPreview": { "title": "Your Client Portal", "welcome": "Welcome back!", "subtitle": "Here's an overview of your account activity", "openTickets": "Open Tickets", "activeProjects": "Active Projects", "invoices": "Invoices", "urgent": "{{count}} urgent", "nearDeadline": "{{count}} near deadline", "dueThisMonth": "Due this month", "recentActivity": "Recent Activity", "ticketUpdated": "Ticket #1234 was updated", "hoursAgo": "{{count}} hours ago", "newInvoice": "New invoice generated", "milestoneCompleted": "Project milestone completed", "dayAgo": "1 day ago", "createTicket": "Create Ticket", "viewProjects": "View Projects", "activeDevices": "Active devices", "basicSupport": "Basic Support", "dashboardTitle": "Dashboard", "greeting": "Good morning, Alex 👋", "navAppointments": "Appointments", "navDashboard": "Dashboard", "navDevices": "My devices", "navProjects": "Projects", "navServiceRequests": "Service Requests", "navTickets": "Tickets", "serviceRequests": "Service requests", "upcomingShort": "Upcoming", "upcomingVisits": "Upcoming visits", "welcomeBack": "Welcome back", "workspaceSection": "Workspace" }, "signInPreview": { "portalTitle": "Client Portal", "welcome": "Welcome to Your Client Portal", "subtitle": "Manage your support tickets and stay connected", "features": { "submitTickets": { "title": "Submit Support Tickets", "description": "Create and manage your support requests" }, "trackStatus": { "title": "Track Ticket Status", "description": "Monitor progress in real-time" }, "ticketHistory": { "title": "Ticket History", "description": "Access your complete support history" }, "documentation": { "title": "Documentation Access", "description": "View shared documents and resources" } }, "signIn": { "title": "Sign In", "description": "Please enter your credentials to access your account.", "email": "Email", "emailPlaceholder": "Enter your email", "password": "Password", "passwordPlaceholder": "Enter your password", "forgotPassword": "Forgot your password?", "mspStaffLogin": "MSP Staff? Login here →" } }, "domain": { "title": "Custom Domain", "description": "Configure a branded hostname for your client portal. We will provision TLS certificates automatically once DNS is verified.", "currentStatus": "Current status", "noDomainConfigured": "No custom domain configured", "defaultStatusMessage": "No custom domain registered yet.", "lastChecked": "Last checked: {{value}}", "updatingDomainPrefix": "Updating domain to ", "updatingDomainSuffix": ". Provisioning will restart once you update.", "editInstructions": "To change your domain, edit the value below and submit to kick off a new provisioning run.", "actions": { "refresh": "Refresh", "refreshing": "Refreshing...", "retry": "Retry", "retrying": "Retrying…", "removeDomain": "Remove Domain", "saveDomain": "Save Domain", "updateDomain": "Update Domain", "submitting": "Submitting…", "cancelEdit": "Cancel Edit" }, "form": { "label": "Custom domain", "helpTextPrefix": "Add a CNAME record pointing to ", "helpTextSuffix": " before submitting.", "placeholder": "portal.example.com" }, "checklist": { "title": "Setup checklist", "step1Prefix": "Create a CNAME record for your chosen host pointing to ", "step1Suffix": ".", "step2": "Click \"Save Domain\" to trigger DNS verification and certificate provisioning.", "step3": "Use the Refresh button to poll provisioning progress. We will email your administrators if provisioning fails.", "canonicalHostFallback": "canonical host" }, "badges": { "pending_dns": "Pending DNS", "verifying_dns": "Verifying DNS", "dns_failed": "DNS Failed", "pending_certificate": "Pending Certificate", "certificate_issuing": "Issuing Certificate", "certificate_failed": "Certificate Failed", "deploying": "Deploying", "active": "Active", "disabled": "Disabled", "unknown": "Unknown" }, "messages": { "requestSubmitted": "Custom domain request submitted.", "retryQueued": "Retry queued. Re-check status in a few moments.", "removalRequested": "Custom domain removal requested.", "enterDomainFirst": "Enter a domain before submitting.", "confirmRemove": "Remove the current custom domain? Traffic will revert to the default hosted address.", "loadFailed": "Unable to load portal domain status.", "registerFailed": "Failed to register custom domain.", "refreshFailed": "Failed to refresh domain status.", "retryFailed": "Retry failed.", "disableFailed": "Failed to disable custom domain." } }, "yourCompanyName": "Your Company Name", "brandingPreviewMode": "Branding preview theme mode", "brandingUpdated": "Branding settings updated" }, "mspLanguage": { "title": "Organization Language", "description": "Set the default language for everyone in this workspace — MSP staff, client portal users, and email notifications. Individual users and clients can override this for themselves.", "fields": { "defaultLanguage": "Default Language", "availableLanguages": "Available Languages" }, "help": { "defaultLanguage": "Applied everywhere unless overridden by a user's personal preference or a client's configured default.", "availableLanguages": "Select which languages are available for users to choose from." } }, "notifications": { "title": "Notification Settings", "description": { "email": "Configure how your tenant sends email notifications", "internal": "Configure how your tenant sends internal notifications" }, "viewSwitcher": { "email": "Email Notifications", "internal": "Internal Notifications" }, "emailTabs": { "settings": "Settings", "emailTemplates": "Email Templates", "categories": "Categories", "telemetry": "Telemetry" }, "internalTabs": { "categories": "Categories", "categoriesTypes": "Categories & Types" }, "loading": { "settings": "Loading settings...", "templates": "Loading templates...", "categories": "Loading categories..." }, "unsaved": { "title": "Unsaved Changes", "message": "You have unsaved notification settings. Are you sure you want to leave? Your changes will be lost." }, "tenantDescription": { "email": "Configure tenant-wide email notification settings", "internal": "Configure tenant-wide internal notification settings" }, "sections": { "globalSettings": { "title": "Global Settings", "description": "Configure global notification settings" }, "emailTemplates": { "title": "Email Templates", "description": "Manage email notification templates" }, "categories": { "title": "Notification Categories", "description": "Manage notification categories and types" }, "internalCategories": { "title": "Internal Notification Categories", "description": "Manage internal notification categories and types" }, "telemetry": { "title": "Telemetry & Analytics", "description": "Manage your telemetry and analytics preferences" } } }, "timeEntry": { "title": "Time Entry Settings", "description": "Manage your time entry settings and time periods" }, "billing": { "title": "Billing Settings", "description": "Manage your billing and subscription" }, "secrets": { "title": "Secrets Management", "description": "Manage encrypted secrets for use in workflows. Secrets can be referenced in workflow actions using the $secret syntax.", "list": { "title": "Secrets", "description": "Manage secrets for use in workflows. Secrets are encrypted and can be referenced using { $secret: \"SECRET_NAME\" }", "search": "Search secrets...", "createSecret": "Create Secret", "table": { "name": "Name", "description": "Description", "lastUpdated": "Last Updated", "lastAccessed": "Last Accessed", "actions": "Actions", "never": "Never", "empty": "-" }, "tooltips": { "edit": "Edit secret", "delete": "Delete secret" } }, "dialog": { "createTitle": "Create Secret", "editTitle": "Edit Secret", "deleteTitle": "Delete Secret", "fields": { "name": { "label": "Name *", "placeholder": "MY_API_KEY", "help": "Use uppercase letters, numbers, and underscores only" }, "value": { "label": "Value *", "placeholder": "Enter secret value", "editPlaceholder": "Enter new value to update", "editHelp": "Leave empty to keep the current value" }, "description": { "label": "Description", "placeholder": "What is this secret used for?" } }, "delete": { "confirmation": "Are you sure you want to delete the secret {{name}}?", "usedByWorkflows": "This secret is used by {{count}} workflow(s)", "usedByWarning": "Deleting it will cause those workflows to fail when they try to access this secret.", "cannotUndo": "This action cannot be undone.", "typeToConfirm": "Type {{name}} to confirm:", "placeholder": "Enter secret name" }, "actions": { "cancel": "Cancel", "create": "Create Secret", "update": "Update Secret", "delete": "Delete Secret", "saving": "Saving...", "deleting": "Deleting..." } }, "messages": { "success": { "created": "Secret \"{{name}}\" created", "updated": "Secret \"{{name}}\" updated", "deleted": "Secret \"{{name}}\" deleted" }, "error": { "loadFailed": "Failed to load secrets", "deleteFailed": "Failed to delete secret", "saveFailed": "Failed to save secret", "nameRequired": "Secret name is required", "valueRequired": "Secret value is required", "noChanges": "No changes to save", "fixValidation": "Please fix the validation errors" } } }, "importExport": { "title": "Import & Export Workspace", "description": "Configure imports, exports, and automated data flows from a single control centre.", "history": { "title": "Import & Export History", "description": "Review every import or export job in one place.", "empty": "No import or export jobs found. Generate a preview to create the first job.", "table": { "date": "Date", "source": "Source", "file": "File", "status": "Status", "created": "Created", "duplicates": "Duplicates", "errors": "Errors" } }, "tabs": { "assetImport": "Asset Import", "assetExport": "Asset Export", "templatesAutomation": "Templates & Automation" }, "import": { "fields": { "importSource": "Import source", "uploadFile": "Upload file", "fieldMapping": "Field mapping", "rememberMapping": "Remember this mapping for future imports" }, "placeholders": { "noSources": "No import sources available", "selectSource": "Select an import source", "sourceColumn": "Source column name", "example": "e.g. {{example}}" }, "help": { "fieldMapping": "Enter the column names from your file that correspond to each required asset field. Leave optional fields blank to skip them." }, "alerts": { "selectSource": "Select an import source to continue.", "chooseFile": "Choose a CSV or XLSX file to continue.", "validationIssues": "Validation issues detected." }, "actions": { "generatePreview": "Generate Preview", "preparingPreview": "Preparing Preview…", "proceedWithImport": "Proceed with Import", "startingImport": "Starting Import…", "refresh": "Refresh", "refreshing": "Refreshing…", "cancel": "Cancel", "importSelected": "Import Selected" }, "preview": { "title": "Import Preview", "description": "Showing up to the first 10 rows from {{totalRows}} total records.", "stats": { "total": "Total", "valid": "Valid", "duplicates": "Duplicates", "errors": "Errors" }, "table": { "row": "Row", "values": "Values", "issues": "Issues" }, "empty": "No preview rows available." } }, "export": { "comingSoon": "Asset export tooling is coming soon. Planned capabilities include exporting filtered asset lists, audit data, and mapping templates directly to CSV/XLSX." }, "templates": { "comingSoon": "Mapping templates and scheduled imports will live here. Save column mappings, share them across the team, and configure recurring jobs." }, "jobDetails": { "title": "Import Job Details", "stats": { "totalRows": "Total Rows", "processed": "Processed", "created": "Created", "updated": "Updated", "duplicates": "Duplicates", "errors": "Errors" }, "sections": { "summary": "Summary", "records": "Records ({{count}})", "errors": "Errors ({{count}})", "duplicates": "Duplicates ({{count}})" }, "fields": { "source": "Source", "originalFileName": "Original file name", "storedFileId": "Stored file ID", "documentId": "Document ID", "documentAssociation": "Document association", "clientAssociation": "Client Association", "associatedClient": "Associated client", "defaultClientContext": "Default client context", "tenantClientFallback": "Tenant client fallback", "externalId": "External ID", "status": "Status", "sampleValues": "Sample Values", "error": "Error", "duplicateMatch": "Duplicate Match" }, "empty": { "noRecords": "No processed records yet.", "noErrors": "No validation errors were recorded.", "noDuplicates": "No duplicates were detected for this job.", "noValues": "No values" }, "truncated": "Showing the first {{count}} records. Download the job results for full history." }, "messages": { "error": { "loadImportData": "Failed to load import data", "createPreview": "Failed to create preview", "selectPreviewFirst": "Select a preview to approve before importing.", "startImportJob": "Failed to start import job", "loadJobDetails": "Failed to load job details", "refreshHistory": "Failed to refresh import history" } }, "selectJobHint": "Select an import job to inspect its results." }, "email": { "title": "Email Configuration", "description": "Configure email providers, domains, and settings" }, "extensions": { "title": "Extension Management", "description": "Install, configure, and manage extensions to extend Alga PSA functionality.", "tabs": { "manage": "Manage", "install": "Install" }, "enterpriseOnly": { "title": "Enterprise feature", "description": "Extensions are available in the Enterprise edition of Alga PSA." }, "links": { "needLogs": "Need extension logs?", "debugConsole": "Open Service Proxy Demo Debug Console" }, "loading": { "extensions": "Loading extensions...", "installer": "Loading installer..." } }, "security": { "title": "Security Settings", "tabs": { "roles": "Roles", "sessions": "Sessions", "sso": "Single Sign-On", "permissions": "Permissions", "userRoles": "User Roles", "policies": "Policies", "apiKeys": "API Keys" }, "loading": { "roles": "Loading role configuration...", "permissions": "Loading permissions configuration...", "userRoles": "Loading user role configuration...", "policies": "Loading policy configuration...", "apiKeys": "Loading API key configuration...", "sso": "Loading SSO management tools...", "sessions": "Loading active sessions..." }, "userRoles": { "title": "Assign Roles to Users", "description": { "msp": "Manage user role assignments for MSP users", "client": "Manage user role assignments for Client Portal users" }, "viewSwitcher": { "msp": "MSP", "clientPortal": "Client Portal" }, "showInactive": "Show Inactive Users", "fields": { "selectUser": "Select User", "selectRole": "Select Role" }, "actions": { "assignRole": "Assign Role" }, "table": { "user": "User", "email": "Email", "roles": "Roles", "actions": "Actions" }, "noRolesAssigned": "No roles assigned", "removeRole": "Remove {{role}}", "emptyState": { "noUsers": "No {{type}} users found", "inactiveHidden": "(inactive users hidden)" }, "inactiveTag": "(Inactive)" }, "sessions": { "title": "All User Sessions", "filters": { "search": "Search", "searchPlaceholder": "Search by name, email, device, or IP...", "user": "User", "allUsers": "All Users", "loginMethod": "Login Method", "allMethods": "All Methods", "userType": "User Type", "allTypes": "All Types", "from": "From", "to": "To", "selectDate": "Select date", "reset": "Reset" }, "loginMethods": { "password": "Password", "google": "Google OAuth", "microsoft": "Microsoft OAuth", "keycloak": "Keycloak" }, "userTypes": { "internal": "Internal", "client": "Client" }, "session": { "yourSession": "Your Session", "unknownDevice": "Unknown Device", "lastActive": "Last active {{time}} ago", "logout": "Logout", "revoke": "Revoke", "revoking": "Revoking..." }, "oauthWarning": "Revoking this session will not revoke {{provider}} OAuth access. Revoke access from your {{provider}} account settings.", "confirmLogout": "Are you sure you want to logout from this device?", "messages": { "loggingOut": "Logging out...", "revoked": "Session revoked successfully" }, "emptyState": { "loading": "Loading sessions...", "noMatch": "No sessions match your search", "noSessions": "No active sessions found" }, "subtitle_one": "{{sessionCount}} active session across {{userCount}} user", "subtitle_other": "{{sessionCount}} active sessions across {{userCount}} users" } }, "ssoBulk": { "loading": { "title": "Single Sign-On", "description": "Loading SSO bulk assignment tools..." }, "autoLink": { "title": "Automatically set up SSO for new internal users", "description": "Turn this on to provision every new staff account with your corporate SSO provider right away, so they never need a password-based sign-in.", "body": "When enabled, newly added MSP users can sign in with Google or Microsoft using their work email. They will not have to manually link their account.", "toggleLabel": "Toggle automatic SSO matching", "disabledInfo": "Enable this toggle to let new and existing staff skip the “Connect SSO” flow when their email already matches a configured provider. We’ll still log every automatic link." }, "bulk": { "title": "Bulk Single Sign-On Assignment", "description": "Select internal users from the list below and link them to a configured Google or Microsoft provider. Use preview to double-check the impact before executing.", "noProviders": "No SSO providers are configured yet. Add OAuth credentials to continue with bulk assignments." }, "errors": { "loadProviders": "Unable to load SSO provider configuration.", "updatePreferences": "Unable to update SSO preferences." }, "form": { "title": "Choose provider & select users", "description": "Pick the configured SSO provider for your staff, then search and select the users who should be linked.", "providerLabel": "Provider", "notConfigured": "Not configured", "providerNotConfiguredAlert": "Provide OAuth credentials for this provider before linking accounts.", "actionLabel": "Action", "linkSelected": "Link selected users", "unlinkSelected": "Unlink selected users", "actionPlaceholder": "Select SSO bulk action", "actionDescription": "Linking adds the provider to each selected user. Unlinking removes the provider so the user returns to password/TOTP sign-in until they link again.", "searchLabel": "Find internal users", "searchPlaceholder": "Search by email or name", "noneSelected": "No users selected yet.", "selected_one": "{{count}} user selected.", "selected_other": "{{count}} users selected.", "clearSelection": "Clear selection", "loadingUsers": "Loading users...", "noMatch": "No users match this search.", "noUsers": "No internal users found.", "clientPortalComing": "Client portal bulk assignments are coming soon. For now, this tool applies only to internal MSP users.", "loadUsersFailed": "Unable to load assignable users.", "actions": { "previewLink": "Preview assignment", "previewUnlink": "Preview unlink", "link": "Link accounts", "unlink": "Unlink accounts", "preparingPreview": "Preparing preview…", "linking": "Linking accounts…", "unlinking": "Unlinking accounts…", "bulkLabel": "Bulk SSO actions {{location}}" }, "table": { "email": "Email", "id": "ID", "name": "Name", "status": "Status", "active": "Active", "inactive": "Inactive", "linkedProviders": "Linked providers", "unlinked": "Unlinked", "lastLogin": "Last login" }, "toast": { "providerRequiredTitle": "Provider required", "providerRequiredDescription": "Select a configured provider before continuing.", "noUsersTitle": "No users selected", "noUsersDescription": "Select at least one user from the table.", "failedTitle": "Bulk assignment failed", "failedDescription": "Unable to process SSO bulk assignment.", "linkCompleteTitle": "Link complete", "unlinkCompleteTitle": "Unlink complete", "previewReadyTitle": "Preview ready", "linkedCount": "Linked {{count}} accounts via {{provider}}.", "unlinkedCount": "Unlinked {{count}} accounts via {{provider}}.", "previewUnlink_one": "Preview ready. We'll unlink {{count}} selected user.", "previewUnlink_other": "Preview ready. We'll unlink {{count}} selected users.", "previewLink": "Preview ready. Review the summary before linking accounts." }, "results": { "completeTitle": "Assignment complete", "previewTitle": "Preview results", "noneMatched": "None of the selected users matched the current filters.", "processed_one": "Processed {{count}} user.", "processed_other": "Processed {{count}} users.", "candidatesSelected": "{{count}} selected", "unlinked": "Unlinked", "wouldUnlink": "Would unlink", "linked": "Linked", "wouldLink": "Would link", "alreadyUnlinked": "Already unlinked", "alreadyLinked": "Already linked", "skippedInactive": "Skipped (inactive)" }, "providerNames": { "google": "Google Workspace", "microsoft": "Microsoft 365" } } }, "profile": { "pageTitle": "Your Profile", "tabs": { "profile": "Profile", "security": "Security", "sso": "Single Sign-On", "apiKeys": "API Keys", "notifications": "Notifications", "calendar": "Calendar" }, "basicInfo": { "title": "Basic Information" }, "fields": { "firstName": { "label": "First Name *" }, "lastName": { "label": "Last Name *" }, "email": { "label": "Email *" }, "phoneNumber": { "label": "Phone Number" }, "timeZone": { "label": "Time Zone" } }, "actions": { "saveChanges": "Save Changes" }, "notifications": { "title": "Notification Preferences", "viewSwitcher": { "email": "Email", "internal": "Internal" } }, "loading": "Loading profile...", "messages": { "success": { "profileUpdated": "Profile updated successfully" }, "error": { "userNotFound": "User not found", "fillRequiredFields": "Please fill in all required fields", "saveFailed": "Failed to save profile", "emailAlreadyExists": "A user with this email address already exists", "reportsToSelf": "A user cannot report to themselves", "reportsToCycle": "This would create a circular reporting chain" } }, "validation": { "firstNameRequired": "First name is required", "lastNameRequired": "Last name is required" } }, "password": { "changePassword": "Change Password", "fields": { "currentPassword": "Current Password", "newPassword": "New Password", "confirmNewPassword": "Confirm New Password" }, "messages": { "success": { "changed": "Password changed successfully" }, "error": { "mismatch": "New passwords do not match", "tooShort": "Password must be at least 8 characters long", "changeFailed": "An error occurred while changing password" } } }, "integrations": { "betaNotice": "Some integrations are still in development. Please work in a sandbox environment when evaluating, and share your feedback to help us improve.", "emptyCategory": "No integrations available in this category.", "rmmEnterpriseNote": "RMM integrations are available in the Enterprise edition.", "categoryHeading": "{{label}} Integrations", "loading": { "payments": "Loading payment settings..." }, "categories": { "accounting": { "label": "Accounting", "description": "Select an accounting package to configure synchronization for invoices, payments, and tax data." }, "rmm": { "label": "RMM", "description": "Connect remote monitoring and management tools" }, "itDocumentation": { "label": "IT Documentation", "description": "Connect IT documentation platforms to surface client documentation, assets, and credentials in context." }, "communication": { "label": "Communication", "description": "Connect inbox and collaboration surfaces for ticket processing, operator workflows, and Microsoft Teams access." }, "calendar": { "label": "Calendar", "description": "Enterprise-only calendar sync for Google and Outlook keeps dispatch and client appointments aligned." }, "providers": { "label": "Providers", "description": { "ee": "Configure shared provider credentials used by email, calendar, MSP SSO, and other integrations.", "oss": "Configure shared provider credentials used by email, MSP SSO, and other integrations." } }, "identity": { "label": "Identity", "description": "Connect identity providers for tenant discovery and contact synchronization." }, "payments": { "label": "Payments", "description": "Accept online payments for invoices" } }, "items": { "accountingSetup": { "name": "Accounting Integrations", "description": "Configure accounting synchronization and exports" }, "rmmSetup": { "name": "RMM Integrations", "description": "Select and configure your RMM provider" }, "hudu": { "name": "Hudu", "description": "Connect a Hudu instance to view client documentation and credentials inside AlgaPSA." }, "email": { "name": "Inbound Email", "description": "Process incoming emails into tickets", "cardTitle": "Inbound Email Integration", "cardDescription": "Configure email providers to automatically process incoming emails into tickets" }, "teams": { "name": "Microsoft Teams", "description": "Configure Teams collaboration surfaces for MSP technicians", "upgradeDescription": "Configure Microsoft Teams collaboration surfaces for MSP technicians. Upgrade to Pro to unlock this feature." }, "calendarSync": { "name": "Calendar Sync", "description": "Sync schedule entries with Google or Microsoft calendars" }, "google": { "name": "Google", "description": { "ee": "Tenant-owned Google Cloud credentials for Gmail and Calendar", "oss": "Tenant-owned Google Cloud credentials for Gmail and MSP SSO support flows" }, "cardTitle": "Provider Credentials", "cardDescription": { "ee": "Configure Google and Microsoft first, then connect provider accounts from the Inbound Email and Calendar integration screens. MSP SSO domain discovery uses these provider credentials with tenant login-domain mappings.", "oss": "Configure Google and Microsoft first, then connect provider accounts from the Inbound Email integration screen. MSP SSO domain discovery uses these provider credentials with tenant login-domain mappings." } }, "entra": { "name": "Microsoft Entra", "description": "Discover managed Microsoft tenants and sync users to contacts", "upgradeDescription": "Discover managed Microsoft Entra tenants and sync users to contacts. Upgrade to Premium to unlock this feature." }, "stripe": { "name": "Stripe", "description": "Accept credit card payments for invoices via Stripe" } } }, "orgChart": { "emptyState": "No users available.", "roles": { "client": "Client User", "internal": "Internal User" }, "badge": { "inactive": "Inactive" } }, "permissions": { "messages": { "adminLocked": "Admin role permissions cannot be modified", "permissionsUpdated": "Permissions updated successfully" } }, "sla": { "messages": { "scheduleNotFound": "Schedule not found", "scheduleUpdated": "Schedule updated successfully", "scheduleCreated": "Schedule created successfully", "scheduleDeleted": "Schedule deleted successfully", "defaultHoursCreated": "Default business hours schedule created", "scheduleRequired": "Please select a schedule first", "holidayNameRequired": "Holiday name is required", "holidayDateRequired": "Holiday date is required", "holidayAdded": "Holiday added successfully", "holidayDeleted": "Holiday deleted successfully" } }, "clientPortalLanguage": { "title": "Client Portal Language", "description": "Override the default language for client portal users only. MSP staff keep the organization default.", "fields": { "defaultLanguage": "Default Language" }, "help": { "defaultLanguage": "When set, client portal users see this language unless their individual preference or their client's default overrides it." }, "placeholder": "Select a language", "inheritOption": "Use organization default ({{language}})", "unsetHint": "To remove the client portal override, change the organization default under Settings → Language.", "updated": "Client portal default language updated to {{language}}" }, "language": { "selectLanguage": "Select a language", "languagesUpdated": "Available languages updated" }, "settings": { "assetTypes": { "tab": "Assets", "title": "Asset Types", "description": "Manage the asset types available in your asset module. Custom types carry a field schema that drives their create/edit forms.", "loading": "Loading asset types...", "table": { "name": "Name", "builtin": "Built-in", "slug": "Identifier", "fieldCount": "Fields", "order": "Order", "actions": "Actions", "openMenu": "Open menu" }, "actions": { "addType": "Add Asset Type", "edit": "Edit", "delete": "Delete", "cancel": "Cancel", "save": "Save", "create": "Create", "confirmDelete": "Delete" }, "dialog": { "createTitle": "Add Asset Type", "editTitle": "Edit Asset Type", "nameLabel": "Name", "namePlaceholder": "e.g. Firewall", "displayOrderLabel": "Display Order", "iconLabel": "Icon", "builtinSchemaHint": "Built-in types use fixed forms managed by AlgaPSA, so their field schema cannot be edited. You can still rename the type or change its icon." }, "deleteDialog": { "title": "Delete Asset Type", "message": "This permanently removes \"{{name}}\" from your asset type registry." }, "messages": { "created": "Asset type created", "updated": "Asset type updated", "deleted": "Asset type deleted" }, "errors": { "fetchFailed": "Failed to load asset types.", "saveFailed": "Failed to save asset type.", "deleteFailed": "Failed to delete asset type.", "invalidName": "Enter a name for this asset type.", "invalidSchema": "The field schema is invalid. Fix the highlighted fields and try again.", "reservedSlug": "The identifier \"{{slug}}\" is reserved for a built-in type. Choose another name.", "slugConflict": "An asset type with the identifier \"{{slug}}\" already exists.", "notFound": "This asset type no longer exists.", "builtinImmutable": "Built-in types only allow name and icon changes.", "builtinUndeletable": "Built-in types cannot be deleted.", "inUse": "This type is still used by {{assetCount}} asset(s). Reassign those assets before deleting it.", "unknown": "Something went wrong." }, "editor": { "title": "Fields", "empty": "No fields yet. Add fields to build the create/edit form for this type.", "addField": "Add field", "fieldLabel": "Label", "fieldLabelPlaceholder": "e.g. Serial Number", "fieldKey": "Key", "fieldKeyPlaceholder": "e.g. serial_number", "fieldKind": "Kind", "fieldRequired": "Required", "fieldOptions": "Options (comma-separated)", "fieldOptionsPlaceholder": "e.g. Gold, Silver, Bronze", "moveUp": "Move field up", "moveDown": "Move field down", "removeField": "Remove field", "kinds": { "text": "Text", "number": "Number", "date": "Date", "select": "Select", "url": "URL", "boolean": "Yes / No" }, "errors": { "invalidKey": "Key must start with a lowercase letter and use only lowercase letters, numbers, and underscores.", "duplicateKey": "Each field key must be unique.", "missingLabel": "Label is required.", "invalidKind": "Choose a valid field kind.", "invalidRequired": "Required must be on or off.", "missingOptions": "Select fields need at least one option.", "invalidOptions": "Options must be non-empty values.", "invalidField": "This field is invalid." } } } } }