PSA/server/public/locales/en/msp/settings.json
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

1991 lines
77 KiB
JSON
Raw Permalink 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.

{
"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. Well 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."
}
}
}
}
}