1530 lines
84 KiB
TypeScript
1530 lines
84 KiB
TypeScript
export const en = {
|
||
'nativeApp.title': 'App',
|
||
'nativeApp.description': 'Manage the KanbanGit app on this device.',
|
||
'nativeApp.workspace': 'Workspace',
|
||
'nativeApp.server': 'Server address',
|
||
'nativeApp.serverHelp':
|
||
'Use an HTTPS installation address without login details, a query or a fragment. This choice is saved on this device.',
|
||
'nativeApp.switch': 'Change workspace',
|
||
'nativeApp.confirmSwitch': 'Switch workspace',
|
||
'nativeApp.switchWarning':
|
||
'Switching closes your current workspace and discards unsaved inputs. You will sign in separately on the new server.',
|
||
'nativeApp.cancel': 'Cancel',
|
||
'nativeApp.unavailable':
|
||
'App settings are available in a compatible KanbanGit app.',
|
||
'nativeApp.updates': 'Software updates',
|
||
'nativeApp.version': 'Installed version {version} (build {build})',
|
||
'nativeApp.mobileVersion': 'App version {version}',
|
||
'nativeApp.availableVersion': 'Available version: {version}',
|
||
'nativeApp.automatic': 'Automatically check for updates',
|
||
'nativeApp.interval': 'Check interval',
|
||
'nativeApp.hours': 'Every {hours} hours',
|
||
'nativeApp.updateHelp':
|
||
'Checks run at startup and at the selected interval. Installation and restart require your confirmation.',
|
||
'nativeApp.check': 'Check for updates now',
|
||
'nativeApp.install': 'Install update',
|
||
'nativeApp.installRestart': 'Install and restart',
|
||
'nativeApp.installWarning':
|
||
'Save your work before continuing. KanbanGit will download and verify the update, then install it and restart. Unsaved inputs will be lost. Your workspace settings and stored sessions are kept.',
|
||
'nativeApp.progress': 'Update progress',
|
||
'nativeApp.recovery': 'Open native server settings',
|
||
'nativeApp.bridgeError':
|
||
'The app connection is unavailable or incompatible. Open the native server settings to reconnect, or restart the app.',
|
||
'nativeApp.invalidServer':
|
||
'Enter a valid HTTPS installation address without login details, a query or a fragment.',
|
||
'nativeApp.storageError':
|
||
'The workspace could not be saved. Check local storage permissions and try again.',
|
||
'nativeApp.networkError':
|
||
'The update service or download is unreachable. Check your connection and try again.',
|
||
'nativeApp.metadataError':
|
||
'The update information is invalid or does not match this Mac. Try again later.',
|
||
'nativeApp.signatureError':
|
||
'The update signature could not be verified. Nothing was installed. Try again or contact support.',
|
||
'nativeApp.verificationError':
|
||
'The downloaded app does not match its announced version or publisher. Nothing was installed.',
|
||
'nativeApp.installationError':
|
||
'The update could not be installed. Move KanbanGit to Applications and check disk space and permissions.',
|
||
'nativeApp.preferencesError':
|
||
'Update preferences could not be saved. Check local storage permissions and try again.',
|
||
'nativeApp.updateBusy':
|
||
'An update operation is already running. Please wait.',
|
||
'nativeApp.phase.idle': 'Check for the latest stable version of KanbanGit.',
|
||
'nativeApp.phase.checking': 'Checking for updates…',
|
||
'nativeApp.phase.available': 'A new version of KanbanGit is available.',
|
||
'nativeApp.phase.current': 'KanbanGit is up to date.',
|
||
'nativeApp.phase.downloading': 'Downloading update…',
|
||
'nativeApp.phase.verifying': 'Verifying update…',
|
||
'nativeApp.phase.installing': 'Installing update…',
|
||
'nativeApp.phase.restarting': 'Restarting KanbanGit…',
|
||
'nativeApp.phase.error': 'The update could not be completed.',
|
||
|
||
'projectAccess.pageTitle': '{project} · Project access',
|
||
'projectAccess.title': 'Project access',
|
||
'projectAccess.description':
|
||
'Manage who can access {project} and see where their permissions come from.',
|
||
'projectAccess.back': 'Back to project',
|
||
'projectAccess.saved': 'Project permissions saved.',
|
||
'projectAccess.howItWorks': 'How project access works',
|
||
'projectAccess.additiveHelp':
|
||
'Direct user permissions and permissions from every team are combined. Write includes read; administrator includes write and read.',
|
||
'projectAccess.limitsHelp':
|
||
'Project administrators can change project assignments here. Global permissions and team membership are managed separately.',
|
||
'projectAccess.search': 'Search people or teams',
|
||
'projectAccess.people': 'People and effective access',
|
||
'projectAccess.effective': 'Effective permissions',
|
||
'projectAccess.noAccess': 'No project access',
|
||
'projectAccess.globalSource':
|
||
'Global administrator · all project permissions',
|
||
'projectAccess.direct': 'Direct:',
|
||
'projectAccess.none': 'None',
|
||
'projectAccess.viaTeam': 'Via {name}:',
|
||
'projectAccess.editFor': 'Edit access for {name}',
|
||
'projectAccess.editDirect': 'Edit direct access',
|
||
'projectAccess.editTeam': 'Edit team access',
|
||
'projectAccess.teamPermissions': 'Team permissions',
|
||
'projectAccess.directPermissions': 'Direct permissions',
|
||
'projectAccess.teamHelp':
|
||
'These project permissions apply to every current and future member of the team.',
|
||
'projectAccess.directHelp':
|
||
'Change only this person’s direct project permissions. Team and global permissions continue to apply.',
|
||
'projectAccess.noPeopleResults': 'No matching people',
|
||
'projectAccess.noPeople': 'No people available',
|
||
'projectAccess.noTeamResults': 'No matching teams',
|
||
'projectAccess.noTeams': 'No teams yet',
|
||
'projectAccess.noTeamsHelp':
|
||
'Create a team and add members before assigning shared project access.',
|
||
'projectAccess.noTeamAccess': 'No project permissions assigned',
|
||
'projectAccess.read': 'Read',
|
||
'projectAccess.write': 'Write',
|
||
'projectAccess.admin': 'Administrator',
|
||
'projectAccess.readHelp': 'View the project and its tickets.',
|
||
'projectAccess.writeHelp': 'Create and edit tickets. Includes read access.',
|
||
'projectAccess.adminHelp':
|
||
'Manage project access and project administration. Includes write and read access.',
|
||
'projectAccess.clearHelp':
|
||
'Clear all selections to remove this assignment. Access granted by other teams, direct assignments or global administration is preserved.',
|
||
'projectAccess.globalHelp':
|
||
'This person is a global administrator. Changing these project assignments cannot remove their global access.',
|
||
'projectAccess.selfHelp':
|
||
'If you remove your own administrator access, you will return to Projects.',
|
||
'projectAccess.save': 'Save permissions',
|
||
'projectAccess.forbidden': 'Project access can no longer be changed',
|
||
'projectAccess.forbiddenHelp':
|
||
'Your administrator permission may have changed. Close this dialog and reopen the project to check your current access.',
|
||
|
||
'notifications.title': 'Notifications',
|
||
'notifications.pageTitle': '{project} · Notifications',
|
||
'notifications.description':
|
||
'Send ticket updates to your team with webhook and Discord actions.',
|
||
'notifications.saved': 'Notification settings saved.',
|
||
'notifications.actions': 'Notification actions',
|
||
'notifications.create': 'Add notification',
|
||
'notifications.edit': 'Edit notification',
|
||
'notifications.delete': 'Delete notification?',
|
||
'notifications.editNamed': 'Edit {name}',
|
||
'notifications.deleteNamed': 'Delete {name}',
|
||
'notifications.empty': 'No notifications yet',
|
||
'notifications.emptyHelp':
|
||
'Add an action to send updates when a ticket event matches your rules.',
|
||
'notifications.enabled': 'Enabled',
|
||
'notifications.disabled': 'Disabled',
|
||
'notifications.delivery': 'Delivery',
|
||
'notifications.urlSaved': 'Secret URL saved',
|
||
'notifications.urlMissing': 'No delivery URL saved',
|
||
'notifications.filterCount': {
|
||
one: '{count} filter · all must match',
|
||
other: '{count} filters · all must match',
|
||
},
|
||
'notifications.noFiltersShort': 'All matching events',
|
||
'notifications.noChanges': 'No saved changes yet',
|
||
'notifications.createdAt': 'Created {date}',
|
||
'notifications.updatedAt': 'Updated {date}',
|
||
'notifications.deleteHelp':
|
||
'Delete “{name}”? This action will stop sending notifications. This cannot be undone.',
|
||
'notifications.editorHelp':
|
||
'Choose a ticket event, a delivery channel and optional filters.',
|
||
'notifications.name': 'Name',
|
||
'notifications.event': 'Trigger',
|
||
'notifications.channel': 'Channel',
|
||
'notifications.keepUrl':
|
||
'A secret URL is saved. Leave the field blank to keep it.',
|
||
'notifications.replaceUrl': 'Replace delivery URL (optional)',
|
||
'notifications.url': 'Delivery URL',
|
||
'notifications.secretHelp':
|
||
'URLs are stored encrypted and never shown again after saving. Enter the complete webhook URL.',
|
||
'notifications.message': 'Discord message template',
|
||
'notifications.messageHelp':
|
||
'Use the variables below to include ticket details. Maximum 2,000 characters.',
|
||
'notifications.variables': 'Available template variables',
|
||
'notifications.mentions': 'Allowed mentions',
|
||
'notifications.mentionsHelp':
|
||
'Leave all unchecked to disable mentions. Only the selected mention types may notify people.',
|
||
'notifications.filters': 'Filters',
|
||
'notifications.filtersHelp':
|
||
'All filters must match before this action sends a notification.',
|
||
'notifications.noFilters':
|
||
'No filters. This action runs for every matching event.',
|
||
'notifications.filterNumber': 'Filter {number}',
|
||
'notifications.attribute': 'Attribute',
|
||
'notifications.operator': 'Operator',
|
||
'notifications.value': 'Value',
|
||
'notifications.values': 'Values (comma or newline separated)',
|
||
'notifications.removeFilter': 'Remove filter',
|
||
'notifications.removeFilterNumber': 'Remove filter {number}',
|
||
'notifications.addFilter': 'Add filter',
|
||
'notifications.enabledHelp':
|
||
'Turn off this action to pause delivery while keeping its configuration.',
|
||
'notifications.confirmDelete': 'Delete notification',
|
||
'notifications.channel.discord': 'Discord',
|
||
'notifications.channel.webhook': 'Webhook',
|
||
'notifications.event.ticket_status_changed': 'Ticket status changed',
|
||
'notifications.event.ticket_create': 'Ticket create',
|
||
'notifications.event.ticket_assignee_changed': 'Assignee changed',
|
||
'notifications.attribute.project.id': 'Project ID',
|
||
'notifications.attribute.project.key': 'Project key',
|
||
'notifications.attribute.project.name': 'Project name',
|
||
'notifications.attribute.ticket.id': 'Ticket ID',
|
||
'notifications.attribute.ticket.key': 'Ticket key',
|
||
'notifications.attribute.ticket.title': 'Ticket title',
|
||
'notifications.attribute.ticket.url': 'Ticket URL',
|
||
'notifications.attribute.actor.id': 'Actor ID',
|
||
'notifications.attribute.actor.name': 'Actor name',
|
||
'notifications.attribute.assignee.from.id': 'From assignee ID',
|
||
'notifications.attribute.assignee.from.name': 'From assignee name',
|
||
'notifications.attribute.assignee.to.id': 'To assignee ID',
|
||
'notifications.attribute.assignee.to.name': 'To assignee name',
|
||
'notifications.attribute.status.from.id': 'From status ID',
|
||
'notifications.attribute.status.from.label': 'From status label',
|
||
'notifications.attribute.status.to.id': 'To status ID',
|
||
'notifications.attribute.status.to.label': 'To status label',
|
||
'notifications.operator.equals': 'Equals',
|
||
'notifications.operator.not_equals': 'Not equals',
|
||
'notifications.operator.exists': 'Exists',
|
||
'notifications.operator.not_exists': 'Not exists',
|
||
'notifications.operator.in': 'In list',
|
||
'notifications.mention.everyone': '@everyone and @here',
|
||
'notifications.mention.roles': 'Role mentions (@role)',
|
||
'notifications.mention.users': 'User mentions (@username)',
|
||
'notifications.variable.url':
|
||
'Absolute ticket URL for the notification event.',
|
||
'notifications.variable.ticket_key': 'Project ticket key such as CORE-42.',
|
||
'notifications.variable.ticket_title':
|
||
'Ticket title for the notification event.',
|
||
'notifications.variable.project_name': 'Project name that owns the ticket.',
|
||
'notifications.variable.status_from':
|
||
'Origin status label for status moves; blank for ticket create and assignee changes.',
|
||
'notifications.variable.status_to':
|
||
'Destination or initial status label for the ticket event.',
|
||
'notifications.variable.actor_name':
|
||
'Actor name when the event has a known user.',
|
||
'notifications.variable.assignee_from':
|
||
'Previous assignee name when the event updates assignment; blank otherwise.',
|
||
'notifications.variable.assignee_to':
|
||
'New assignee name when the event updates assignment; blank when unassigned.',
|
||
'templates.description':
|
||
'Reuse a proven project setup. Manage published templates and see which projects inherit their configuration.',
|
||
'templates.updated': 'Project templates updated.',
|
||
'templates.fromProject': 'Start with an existing project',
|
||
'templates.fromProjectHelp':
|
||
'Open a project and choose “Save as new template” to capture its configuration.',
|
||
'templates.browseProjects': 'Browse projects',
|
||
'templates.empty': 'No published templates yet',
|
||
'templates.emptyHelp':
|
||
'Save a project as a template to reuse its settings. Internal project baselines are kept out of this list.',
|
||
'templates.published': 'Published project templates',
|
||
'templates.linkedCount': {
|
||
one: '{count} linked project',
|
||
other: '{count} linked projects',
|
||
},
|
||
'templates.savedFrom': 'Saved from {project} ({key}).',
|
||
'templates.sourceUnavailable': 'Source project unavailable',
|
||
'templates.edit': 'Edit',
|
||
'templates.use': 'Use template',
|
||
'templates.createTitle': 'Save {project} as a template',
|
||
'templates.createDescription':
|
||
'Choose the configuration to reuse in future projects.',
|
||
'templates.editTitle': 'Edit {name}',
|
||
'templates.editDescription':
|
||
'Refresh the template from its source project and review the impact on linked projects.',
|
||
'templates.defaultName': '{project} template',
|
||
'templates.details': 'Template details',
|
||
'templates.name': 'Template name',
|
||
'templates.namePlaceholder': 'Foundation template',
|
||
'templates.slug': 'Template slug',
|
||
'templates.slugPlaceholder': 'foundation-template',
|
||
'templates.slugHelp':
|
||
'Slugs are normalized automatically. After creation, the slug cannot be changed.',
|
||
'templates.slugLocked':
|
||
'The slug is locked so existing template references remain stable.',
|
||
'templates.groups': 'Configuration groups',
|
||
'templates.createGroupsHelp':
|
||
'Only selected groups are saved. Related groups required by the workflow are included automatically.',
|
||
'templates.editGroupsHelp':
|
||
'Saving rebuilds selected groups from the current source project. Required workflow groups are included automatically.',
|
||
'templates.impact': 'Template impact',
|
||
'templates.inheritance': 'Inheritance',
|
||
'templates.cleanStart':
|
||
'Tickets and other operational ticket data are never copied. The source project stays unchanged.',
|
||
'templates.refreshHelp':
|
||
'Inherited groups follow the refreshed template. Local overrides stay unchanged. Removed groups stay local to each project.',
|
||
'templates.linkedWarning': 'Linked projects will be affected',
|
||
'templates.linkedImpact':
|
||
'Saving updates the baseline for {count} linked projects. Inherited groups follow the new configuration; existing local overrides stay unchanged.',
|
||
'templates.acknowledge':
|
||
'I understand that projects inheriting from this template will be affected.',
|
||
'templates.saveNew': 'Save new template',
|
||
'templates.saveChanges': 'Save template changes',
|
||
'templates.missingSource': 'This template cannot be refreshed',
|
||
'templates.missingSourceHelp':
|
||
'The source project is no longer available. You can still use the saved template configuration to create a project.',
|
||
'templates.deleteTitle': 'Delete {name}',
|
||
'templates.delete': 'Delete template',
|
||
'templates.deleting': 'Deleting template…',
|
||
'templates.deleteHelp':
|
||
'This permanently removes the reusable template. It will no longer be available for new projects.',
|
||
'templates.deleteImpact':
|
||
'{count} linked projects will stop inheriting from this template. Their current configuration and tickets are kept.',
|
||
|
||
'teams.eyebrow': 'People & access',
|
||
'teams.description':
|
||
'Bring people together in reusable teams. Manage membership and the permissions to administer each team.',
|
||
'teams.create': 'Create team',
|
||
'teams.createDescription':
|
||
'Group people into a team to share project access.',
|
||
'teams.name': 'Team name',
|
||
'teams.namePlaceholder': 'Platform team',
|
||
'teams.yourTeams': 'Teams you manage',
|
||
'teams.search': 'Search teams',
|
||
'teams.clearSearch': 'Clear search',
|
||
'teams.empty': 'No teams to manage',
|
||
'teams.emptyCreate': 'Create a team to start organizing your people.',
|
||
'teams.emptyDescription':
|
||
'No teams are available for your current permissions.',
|
||
'teams.noResults': 'No matching teams',
|
||
'teams.noResultsDescription': 'Try another team name or clear your search.',
|
||
'teams.manageMembers': 'Manage members',
|
||
'teams.manageMembersFor': 'Manage members of {name}',
|
||
'teams.permissionsFor': 'Manage permissions for {name}',
|
||
'teams.members': 'Members',
|
||
'teams.noMembers': 'No members yet.',
|
||
'teams.membersHelp':
|
||
'Select the people who belong to this team. Changes apply when you save.',
|
||
'teams.selected': '{count} selected',
|
||
'teams.searchPeople': 'Find people',
|
||
'teams.searchPeoplePlaceholder': 'Search by name or email',
|
||
'teams.noPeople': 'No matching people.',
|
||
'teams.saveMembers': 'Save members',
|
||
'teams.permissions': 'Team permissions',
|
||
'teams.permissionsHelp':
|
||
'Direct team permissions are separate from membership. Choose any user to review or change their assignments.',
|
||
'teams.person': 'User',
|
||
'teams.choosePerson': 'Choose a user',
|
||
'teams.directPermissions': 'Direct permissions',
|
||
'teams.permissionInvite': 'Team invite',
|
||
'teams.permissionManage': 'Team manage',
|
||
'teams.permissionAdmin': 'Team admin',
|
||
'teams.permissionsClearHelp':
|
||
'Clear every checkbox to remove direct permissions. Other existing access remains in effect.',
|
||
'teams.savePermissions': 'Save permissions',
|
||
'teams.updated': 'Team changes saved.',
|
||
'teams.forbidden': 'You no longer have permission',
|
||
'teams.forbiddenDescription':
|
||
'Your changes have not been saved. Close this dialog and reload the page to check your current access.',
|
||
'teams.memberCount': { one: '{count} member', other: '{count} members' },
|
||
'workflow.title': 'Board workflow',
|
||
'workflow.pageTitle': '{project} · Board workflow',
|
||
'workflow.description':
|
||
'Organize your board into columns and give each stage the statuses your team needs.',
|
||
'workflow.updated': 'Workflow updated.',
|
||
'workflow.backlog': 'Backlog',
|
||
'workflow.offBoard': 'Off the board',
|
||
'workflow.backlogDescription':
|
||
'Your intake queue. Tickets with these statuses stay outside the board columns.',
|
||
'workflow.columns': 'Board columns',
|
||
'workflow.columnsDescription':
|
||
'Columns appear from left to right in this order. Edit a column to change its name or position.',
|
||
'workflow.emptyColumns': 'No board columns yet',
|
||
'workflow.emptyColumnsDescription':
|
||
'Add your first column to start organizing tickets on the board.',
|
||
'workflow.addColumn': 'Add column',
|
||
'workflow.editColumn': 'Edit column',
|
||
'workflow.deleteColumn': 'Delete column?',
|
||
'workflow.addColumnDescription':
|
||
'The column is added at the end of the board with a first status of the same name.',
|
||
'workflow.editColumnDescription':
|
||
'Rename this column or move it to a different position. Its statuses keep their names.',
|
||
'workflow.deleteColumnDescription':
|
||
'Delete “{name}”? Its statuses move to the backlog and their tickets keep their status. Remaining columns are reordered automatically.',
|
||
'workflow.addStatus': 'Add status',
|
||
'workflow.editStatus': 'Rename status',
|
||
'workflow.deleteStatus': 'Delete status?',
|
||
'workflow.statusContext': 'This status belongs to {context}.',
|
||
'workflow.deleteStatusDescription':
|
||
'Delete “{name}”? Tickets using it are assigned to “{replacement}”, the first remaining status in {context}. Its move rules are removed.',
|
||
'workflow.columnName': 'Column name',
|
||
'workflow.statusName': 'Status name',
|
||
'workflow.position': 'Position',
|
||
'workflow.positionValue': 'Position {position}',
|
||
'workflow.positionHelp':
|
||
'Choose a position from 1 to {count}. Other columns shift automatically.',
|
||
'workflow.statusesIn': 'Statuses in {context}',
|
||
'workflow.renameStatus': 'Rename status {name}',
|
||
'workflow.removeStatus': 'Delete status {name}',
|
||
'workflow.changeColumn': 'Edit column {name}',
|
||
'workflow.removeColumn': 'Delete column {name}',
|
||
'workflow.addStatusTo': 'Add status to {context}',
|
||
'workflow.lastStatus':
|
||
'Keep at least one status in this group. The last status cannot be deleted.',
|
||
'workflow.transitions': 'Status moves',
|
||
'workflow.transitionsDescription':
|
||
'Choose exactly where each status is allowed to move next.',
|
||
'workflow.sourceStatus': 'From status',
|
||
'workflow.directionHelp':
|
||
'Rules apply in one direction. Select another source to configure the return move.',
|
||
'workflow.targetsFrom': 'Allowed destinations from {name}',
|
||
'workflow.targetHelp':
|
||
'Checked destinations are allowed. Unchecked destinations are forbidden. Save to apply these rules to ticket moves and board drop targets.',
|
||
'workflow.allowed': 'Allowed',
|
||
'workflow.notAllowed': 'Not allowed',
|
||
'workflow.noMovesHelp':
|
||
'With no destinations selected, tickets cannot leave this status after you save.',
|
||
'workflow.noStatuses':
|
||
'Add a status to configure its allowed destinations.',
|
||
'workflow.unsavedMoves': 'Unsaved changes',
|
||
'workflow.savedMoves': 'Saved destinations: {count}',
|
||
'workflow.resetMoves': 'Reset changes',
|
||
'workflow.saveMoves': 'Save moves',
|
||
'workflow.noTargets': 'No other statuses exist yet.',
|
||
'workflow.confirmDelete': 'Delete',
|
||
'security.title': 'Security settings',
|
||
'security.passwordTitle': 'Update password',
|
||
'security.passwordDescription':
|
||
'Use a long, unique password to keep your account secure.',
|
||
'security.currentPassword': 'Current password',
|
||
'security.newPassword': 'New password',
|
||
'security.confirmPassword': 'Confirm password',
|
||
'security.savePassword': 'Save password',
|
||
'security.savingPassword': 'Saving password…',
|
||
'security.passwordSaved': 'Password saved.',
|
||
'security.twoFactorTitle': 'Two-factor authentication',
|
||
'security.twoFactorDescription':
|
||
'Add a second layer of protection with a code from your authenticator app.',
|
||
'security.enabledDescription':
|
||
'Your authenticator app provides a six-digit code when you sign in. Keep your recovery codes somewhere safe.',
|
||
'security.enabled': 'Enabled',
|
||
'security.disabled': 'Disabled',
|
||
'security.pending': 'Awaiting confirmation',
|
||
'security.enable': 'Enable 2FA',
|
||
'security.disable': 'Disable 2FA',
|
||
'security.continueSetup': 'Continue setup',
|
||
'security.disableTitle': 'Disable two-factor authentication?',
|
||
'security.disableDescription':
|
||
'You will no longer need an authenticator code to sign in. Your existing recovery codes will be removed.',
|
||
'security.setupTitle': 'Set up your authenticator',
|
||
'security.setupDescription':
|
||
'Scan this QR code with a TOTP authenticator app, or enter the setup key manually.',
|
||
'security.setupEnabled': 'Two-factor authentication enabled',
|
||
'security.setupEnabledDescription':
|
||
'Finish adding this account to your authenticator app and save your recovery codes.',
|
||
'security.verifyTitle': 'Verify authentication code',
|
||
'security.verifyDescription':
|
||
'Enter the six-digit code from your authenticator app to finish enabling two-factor authentication.',
|
||
'security.authenticationCode': 'Authentication code',
|
||
'security.manualKey': 'Manual setup key',
|
||
'security.copyKey': 'Copy key',
|
||
'security.copied': 'Copied',
|
||
'security.copyError':
|
||
'Copying failed. Select the key and copy it manually.',
|
||
'security.confirm': 'Confirm',
|
||
'security.continue': 'Continue',
|
||
'security.loadingSetup': 'Loading authenticator setup…',
|
||
'security.setupPendingDescription':
|
||
'Protection starts after you confirm a code. Closing this dialog keeps setup unfinished; you can continue from this page.',
|
||
'security.confirmAgain':
|
||
'Your session or password confirmation has expired. Reload this page and confirm your password to continue.',
|
||
'security.setupError':
|
||
'Authenticator setup could not be loaded. Please try again.',
|
||
'security.recoveryError':
|
||
'Recovery codes could not be loaded. Please try again.',
|
||
'security.recoveryTitle': '2FA recovery codes',
|
||
'security.recoveryDescription':
|
||
'Recovery codes let you regain access if you lose your authenticator. Store them in a secure password manager.',
|
||
'security.hideRecovery': 'Hide recovery codes',
|
||
'security.viewRecovery': 'View recovery codes',
|
||
'security.loadingRecovery': 'Loading recovery codes…',
|
||
'security.regenerate': 'Regenerate codes',
|
||
'security.recoveryOnce':
|
||
'Each recovery code can be used once. Hiding this section removes the codes from this page.',
|
||
'security.regenerateTitle': 'Regenerate recovery codes?',
|
||
'security.regenerateDescription':
|
||
'All previous recovery codes will stop working. Save the new codes in a secure place.',
|
||
'applications.title': 'Applications',
|
||
'applications.description':
|
||
'Create API keys for tools that use KanbanGit with your account permissions. Delete an application to revoke its access.',
|
||
'applications.saveKey': 'Save this API key now.',
|
||
'applications.keyOnce':
|
||
'This key is shown only after creation. It will not be shown again after you leave this page.',
|
||
'applications.apiKey': 'API key',
|
||
'applications.create': 'Create application',
|
||
'applications.nameDescription':
|
||
'Name the tool that will receive an API key.',
|
||
'applications.name': 'Application name',
|
||
'applications.namePlaceholder': 'For example, Claude Desktop',
|
||
'applications.creating': 'Creating application…',
|
||
'applications.saved': 'Saved applications',
|
||
'applications.hiddenKeys':
|
||
'Existing keys stay hidden. Create a new application when another key is needed.',
|
||
'applications.empty': 'No applications have been created yet.',
|
||
'applications.created': 'Created:',
|
||
'applications.lastUsed': 'Last used:',
|
||
'applications.never': 'Never',
|
||
'applications.delete': 'Delete',
|
||
'applications.deleteNamed': 'Delete {name}',
|
||
'applications.deleteTitle': 'Delete application?',
|
||
'applications.deleteDescription':
|
||
'{name} will lose access immediately. This cannot be undone.',
|
||
'common.back': 'Back',
|
||
'common.done': 'Done',
|
||
|
||
'adminUsers.eyebrow': 'Workspace administration',
|
||
'adminUsers.title': 'User management',
|
||
'adminUsers.description':
|
||
'Manage workspace accounts, password requirements, and the global permissions that apply across KanbanGit.',
|
||
'adminUsers.managedAccount': 'Managed account',
|
||
'adminUsers.createAction': 'Create user',
|
||
'adminUsers.updated': 'User management updated',
|
||
'adminUsers.summary.label': 'User management summary',
|
||
'adminUsers.summary.total': 'Workspace users',
|
||
'adminUsers.summary.admins': 'Global administrators',
|
||
'adminUsers.summary.passwordChanges': 'Password changes pending',
|
||
'adminUsers.listTitle': 'Users ({count})',
|
||
'adminUsers.listDescription':
|
||
'Review account status, edit profile details, or confirm global access changes.',
|
||
'adminUsers.empty.title': 'No users yet',
|
||
'adminUsers.empty.description':
|
||
'Create the first managed account for this workspace.',
|
||
'adminUsers.passwordChangePending': 'Password change required',
|
||
'adminUsers.permissions.none': 'No direct global permissions',
|
||
'adminUsers.permissions.action': 'Manage access',
|
||
'adminUsers.permissions.available': 'Available global permissions',
|
||
'adminUsers.permissions.globalAdmin': 'Global administrator',
|
||
'adminUsers.permissions.globalAdminHelp':
|
||
'Allows access to workspace-wide administration, including this user management area.',
|
||
'adminUsers.permissions.projectCreate': 'Create projects',
|
||
'adminUsers.permissions.projectCreateHelp':
|
||
'Allows the user to create new projects without granting global administration.',
|
||
'adminUsers.permissions.title': 'Global access for {name}',
|
||
'adminUsers.permissions.description':
|
||
'Select the direct permissions this account should receive.',
|
||
'adminUsers.permissions.warning':
|
||
'These changes take effect across the workspace after confirmation.',
|
||
'adminUsers.permissions.confirm': 'Confirm access changes',
|
||
'adminUsers.create.title': 'Create user',
|
||
'adminUsers.create.description':
|
||
'Add a workspace account with an initial password and a clear first-login requirement.',
|
||
'adminUsers.edit.breadcrumb': 'Edit {name}',
|
||
'adminUsers.edit.pageTitle': 'Edit {name}',
|
||
'adminUsers.edit.title': 'Edit {name}',
|
||
'adminUsers.edit.action': 'Edit account details for {name}',
|
||
'adminUsers.edit.shortAction': 'Edit details',
|
||
'adminUsers.form.detailsTitle': 'Account details',
|
||
'adminUsers.form.createDescription':
|
||
'Set the identity and initial security state for the new account.',
|
||
'adminUsers.form.editDescription':
|
||
'Update account details and review security-sensitive changes before saving.',
|
||
'adminUsers.form.name': 'Name',
|
||
'adminUsers.form.namePlaceholder': 'Jane Admin',
|
||
'adminUsers.form.email': 'Email address',
|
||
'adminUsers.form.emailPlaceholder': 'jane@example.com',
|
||
'adminUsers.form.passwordTitle': 'Password and first sign-in',
|
||
'adminUsers.form.passwordCreateHelp':
|
||
'Set a temporary password that the user can replace after signing in.',
|
||
'adminUsers.form.passwordEditHelp':
|
||
'Leave both password fields empty to keep the current password.',
|
||
'adminUsers.form.password': 'Temporary password',
|
||
'adminUsers.form.newPassword': 'New password',
|
||
'adminUsers.form.passwordPlaceholder': 'Enter a temporary password',
|
||
'adminUsers.form.passwordEditPlaceholder':
|
||
'Leave blank to keep the current password',
|
||
'adminUsers.form.confirmPassword': 'Confirm password',
|
||
'adminUsers.form.confirmPasswordPlaceholder': 'Repeat the new password',
|
||
'adminUsers.form.forcePasswordChange':
|
||
'Require a password change on next sign-in',
|
||
'adminUsers.form.forcePasswordChangeHelp':
|
||
'The user stays in security settings until a new password has been saved.',
|
||
'adminUsers.form.createAction': 'Create user',
|
||
'adminUsers.form.reviewChanges': 'Review changes',
|
||
'adminUsers.form.confirmTitle': 'Update {name}?',
|
||
'adminUsers.form.confirmDescription':
|
||
'Confirm the account and security changes before they are applied.',
|
||
'adminUsers.form.confirmWarning':
|
||
'A new password takes effect immediately. Requiring a password change restricts the user to security settings on their next sign-in.',
|
||
'adminUsers.form.confirmAction': 'Confirm and save',
|
||
|
||
'criteria.title': 'Acceptance criteria',
|
||
'criteria.progress': '{completed} of {total} complete',
|
||
'criteria.empty': 'No acceptance criteria yet.',
|
||
'criteria.required': 'Enter a criterion or remove this row.',
|
||
'criteria.edit': 'Edit checklist',
|
||
'criteria.preview': 'Preview checklist',
|
||
'criteria.item': 'Criterion {number}',
|
||
'criteria.complete': 'Complete criterion {number}: {text}',
|
||
'criteria.indent': 'Indent criterion {number}',
|
||
'criteria.outdent': 'Outdent criterion {number}',
|
||
'criteria.remove': 'Remove criterion {number}',
|
||
'criteria.add': 'Add criterion',
|
||
'criteria.hint':
|
||
'Use the indent buttons or Alt + Left/Right in a text field to nest criteria. Checking a parent also checks its children. Removing a parent keeps its children.',
|
||
'criteria.unsaved': 'Checklist changes will be saved with the ticket.',
|
||
'criteria.saving': 'Saving checklist…',
|
||
'criteria.saveError':
|
||
'Checklist status could not be saved. Please try again.',
|
||
|
||
'board.title': '{name} board',
|
||
'board.description':
|
||
'Work in your configured workflow. Tickets without a board column stay in the backlog.',
|
||
'board.columns': 'Workflow columns',
|
||
'board.selectColumn': 'Choose a column',
|
||
'board.columnOption': '{name} ({count})',
|
||
'board.scrollHint': 'Scroll horizontally to explore all columns.',
|
||
'board.openBacklog': 'Open backlog',
|
||
'board.backToProject': 'Project overview',
|
||
'board.empty.title': 'No workflow columns yet',
|
||
'board.empty.description':
|
||
'Set up columns to start tracking work on this board.',
|
||
'board.emptyColumn': 'No tickets in this column.',
|
||
'board.emptyStatus': 'No tickets in this status.',
|
||
'board.noStatuses': 'No statuses configured for this column.',
|
||
'board.moveTicket': 'Move {key}',
|
||
'board.updateStatus': 'Update status',
|
||
'board.updatingStatus': 'Updating…',
|
||
'board.noMoves': 'No allowed moves',
|
||
'board.drag': 'Drag to move',
|
||
'board.dragTicket': 'Drag {key} to change status',
|
||
'board.dragHint':
|
||
'Drag a handle to a highlighted column, or use the status controls. Press Escape to cancel.',
|
||
'board.dropHint': 'Drop on a column. Hold near an edge to scroll.',
|
||
'board.dragging':
|
||
'Dragging {key}. Drop on an allowed column or press Escape to cancel.',
|
||
'board.chooseStatus': 'Choose a destination status',
|
||
'board.chooseStatusDescription':
|
||
'More than one status is available for {key} in this column.',
|
||
'board.targetStatus': 'Destination status',
|
||
'board.noMovesDescription':
|
||
'This status does not allow moving anywhere else.',
|
||
'backlog.title': '{name} backlog',
|
||
'backlog.description':
|
||
'Shape incoming work without losing sight of parent and child tickets.',
|
||
'backlog.openBoard': 'Open board',
|
||
'backlog.backToProject': 'Project overview',
|
||
'backlog.moveTicket': 'Move {key}',
|
||
'backlog.filters.title': 'Find backlog tickets',
|
||
'backlog.filters.description':
|
||
'Filter this view locally. Matching child tickets keep their parent context visible.',
|
||
'backlog.filters.search': 'Search',
|
||
'backlog.filters.searchPlaceholder': 'Key, title, description, or metadata',
|
||
'backlog.filters.type': 'Type',
|
||
'backlog.filters.allTypes': 'All types',
|
||
'backlog.filters.priority': 'Priority',
|
||
'backlog.filters.allPriorities': 'All priorities',
|
||
'backlog.filters.status': 'Status',
|
||
'backlog.filters.allStatuses': 'All backlog statuses',
|
||
'backlog.filters.assignee': 'Assignee',
|
||
'backlog.filters.allAssignees': 'All assignees',
|
||
'backlog.filters.clear': 'Clear filters',
|
||
'backlog.filters.parentContext': 'Parent context',
|
||
'backlog.filters.empty.title': 'No tickets match these filters',
|
||
'backlog.filters.empty.description':
|
||
'Try a broader search or clear the filters to see the complete backlog.',
|
||
'backlog.results.title': 'Backlog tickets',
|
||
'backlog.results.count': 'Showing {count} of {total} tickets',
|
||
'backlog.empty.title': 'Your backlog is clear',
|
||
'backlog.empty.description':
|
||
'New tickets without a workflow column will appear here.',
|
||
'backlog.empty.action': 'Create the first ticket',
|
||
'backlog.tree.expand': 'Expand children of {key}',
|
||
'backlog.tree.collapse': 'Collapse children of {key}',
|
||
'backlog.tree.expandAll': 'Expand all',
|
||
'backlog.tree.collapseAll': 'Collapse all',
|
||
'projectCreation.title': 'Create a project',
|
||
'projectCreation.description':
|
||
'Give your work a home. Start fresh or reuse a setup that already works for your team.',
|
||
'projectCreation.start': 'How would you like to start?',
|
||
'projectCreation.scratch': 'Start from scratch',
|
||
'projectCreation.scratchDescription':
|
||
'Create an empty project with the default setup.',
|
||
'projectCreation.duplicate': 'Duplicate a project',
|
||
'projectCreation.duplicateDescription':
|
||
'Choose an existing project and copy selected settings.',
|
||
'projectCreation.template': 'Use a template',
|
||
'projectCreation.templateDescription':
|
||
'Start with a saved, reusable project configuration.',
|
||
'projectCreation.noProjects':
|
||
'No accessible projects are available to copy yet.',
|
||
'projectCreation.noTemplates': 'No published templates are available yet.',
|
||
'projectCreation.details': 'Project details',
|
||
'projectCreation.name': 'Project name',
|
||
'projectCreation.namePlaceholder': 'Platform engineering',
|
||
'projectCreation.key': 'Project key',
|
||
'projectCreation.keyPlaceholder': 'CORE',
|
||
'projectCreation.keyHelp':
|
||
'Use up to 5 letters or numbers. Keys are unique and converted to uppercase.',
|
||
'projectCreation.copyTitle': 'Choose what to copy',
|
||
'projectCreation.copyHelp':
|
||
'Copy configuration into an independent project. Select only what you need.',
|
||
'projectCreation.sourceProject': 'Source project',
|
||
'projectCreation.selectProject': 'Select a source project',
|
||
'projectCreation.copyOptions': 'Configuration areas',
|
||
'projectCreation.copyDefaults':
|
||
'Unselected areas keep the default setup. You can also continue without copying any settings.',
|
||
'projectCreation.chooseTemplate': 'Choose a template',
|
||
'projectCreation.templateLabel': 'Template',
|
||
'projectCreation.selectTemplate': 'Select a template',
|
||
'projectCreation.templateHelp':
|
||
'The project stays linked to this template. Inherited areas follow its configuration; you can override them in project settings.',
|
||
'projectCreation.includedAreas': 'Included configuration',
|
||
'projectCreation.templateDefaults':
|
||
'This template uses the default project setup.',
|
||
'projectCreation.summary': 'Your new project',
|
||
'projectCreation.untitled': 'Add a project name',
|
||
'projectCreation.ticketPreview': 'First ticket key',
|
||
'projectCreation.setup': 'Starting point',
|
||
'projectCreation.cleanStart':
|
||
'Every project starts with an empty backlog and its own ticket numbering. Tickets and their history are never copied.',
|
||
'projectCreation.submit': 'Create project',
|
||
'projectCreation.creating': 'Creating project…',
|
||
'projectCreation.areas.projectSettings.label': 'Project settings',
|
||
'projectCreation.areas.projectSettings.description':
|
||
'Story points and author visibility.',
|
||
'projectCreation.areas.boardColumns.label': 'Board columns',
|
||
'projectCreation.areas.boardColumns.description':
|
||
'Columns and their order on the board.',
|
||
'projectCreation.areas.ticketStatuses.label': 'Ticket statuses',
|
||
'projectCreation.areas.ticketStatuses.description':
|
||
'Statuses and their board columns.',
|
||
'projectCreation.areas.statusTransitions.label': 'Status transitions',
|
||
'projectCreation.areas.statusTransitions.description':
|
||
'Allowed moves between statuses.',
|
||
'projectCreation.areas.ticketTypes.label': 'Ticket types',
|
||
'projectCreation.areas.ticketTypes.description':
|
||
'Available types, including parent types.',
|
||
'projectCreation.areas.ticketPriorities.label': 'Ticket priorities',
|
||
'projectCreation.areas.ticketPriorities.description':
|
||
'Available priority levels.',
|
||
'projectCreation.areas.ticketFields.label': 'Custom ticket fields',
|
||
'projectCreation.areas.ticketFields.description':
|
||
'Field definitions without ticket values.',
|
||
'projectCreation.areas.ticketLinkTypes.label': 'Ticket link types',
|
||
'projectCreation.areas.ticketLinkTypes.description':
|
||
'Relationship labels between tickets.',
|
||
'projectCreation.areas.repositories.label': 'Repository connections',
|
||
'projectCreation.areas.repositories.description':
|
||
'Repositories linked to the project.',
|
||
'projectCreation.areas.notifications.label': 'Notification actions',
|
||
'projectCreation.areas.notifications.description':
|
||
'Notification rules and delivery settings.',
|
||
'projectCreation.selectedCount': {
|
||
one: '{count} area selected',
|
||
other: '{count} areas selected',
|
||
},
|
||
|
||
'projects.workspace': 'Workspace',
|
||
'projects.description':
|
||
'Your project spaces, ready to work in. Open a project or jump straight to its board and backlog.',
|
||
'projects.create': 'New project',
|
||
'projects.updated': 'Project update',
|
||
'projects.available': {
|
||
one: '{count} project available',
|
||
other: '{count} projects available',
|
||
},
|
||
'projects.open': 'Open {name} overview',
|
||
'projects.openBoard': 'Open {name} board',
|
||
'projects.openBacklog': 'Open {name} backlog',
|
||
'projects.overview': 'Project overview',
|
||
'projects.empty.title': 'No projects to show',
|
||
'projects.empty.createDescription':
|
||
'Create a project to give your team a place to plan and track work.',
|
||
'projects.empty.accessDescription':
|
||
'Projects appear here when you have access. Ask a workspace or project administrator to add you.',
|
||
'projects.empty.create': 'Create your first project',
|
||
'projects.back': 'All projects',
|
||
'projects.hubDescription':
|
||
'Follow work on the board or explore tickets in the backlog.',
|
||
'projects.workAreas': 'Project work areas',
|
||
'projects.boardDescription':
|
||
'See work across the project’s workflow and open tickets in their current status.',
|
||
'projects.backlogDescription':
|
||
'Explore incoming work, review ticket details, and plan what comes next.',
|
||
'projects.boardAction': 'Open board',
|
||
'projects.backlogAction': 'Open backlog',
|
||
'projects.settingsDescription':
|
||
'Manage this project’s configuration, integrations, and access.',
|
||
'projects.saveTemplate': 'Save as new template',
|
||
'projects.templateTitle': 'Based on {name}',
|
||
'projects.templateDescription':
|
||
'Inherited areas follow the linked template. Overridden areas use this project’s own configuration.',
|
||
'projects.inheritedArea': '{name} · inherited',
|
||
'projects.overriddenArea': '{name} · overridden',
|
||
'welcome.metaTitle': 'Project work with Git context',
|
||
'welcome.homeLabel': 'KanbanGit home',
|
||
'welcome.navigation': 'Account navigation',
|
||
'welcome.eyebrow': 'Self-hosted project management',
|
||
'welcome.title': 'Plan the work. Keep Git context close.',
|
||
'welcome.description':
|
||
'Plan projects on configurable boards, keep ticket decisions visible, and connect delivery work to the repositories your team already uses.',
|
||
'welcome.action.signIn': 'Sign in to KanbanGit',
|
||
'welcome.action.signInShort': 'Sign in',
|
||
'welcome.action.dashboard': 'Open dashboard',
|
||
'welcome.action.dashboardShort': 'Dashboard',
|
||
'welcome.actionHint': 'One workspace for boards, tickets, and Git context.',
|
||
'welcome.downloadAppHint': 'For Macs with Apple Silicon.',
|
||
'welcome.preview.label': 'KanbanGit board preview',
|
||
'welcome.preview.project': 'Product delivery board',
|
||
'welcome.preview.connected': 'Git connected',
|
||
'welcome.preview.backlog': 'Backlog',
|
||
'welcome.preview.inProgress': 'In progress',
|
||
'welcome.preview.review': 'Review',
|
||
'welcome.preview.ticketOnboarding': 'Refine onboarding flow',
|
||
'welcome.preview.ticketRelease': 'Plan release workflow',
|
||
'welcome.preview.ticketRepository': 'Connect project repository',
|
||
'welcome.preview.ticketPullRequest': 'Review pull request context',
|
||
'welcome.features.eyebrow': 'A focused workflow',
|
||
'welcome.features.title': 'The project context your team needs',
|
||
'welcome.features.workflows.title': 'Configurable workflows',
|
||
'welcome.features.workflows.description':
|
||
'Shape project boards, backlog, statuses, and transitions around the way your team works.',
|
||
'welcome.features.tickets.title': 'Structured ticket context',
|
||
'welcome.features.tickets.description':
|
||
'Keep metadata, acceptance criteria, relationships, blockers, and history with the work.',
|
||
'welcome.features.git.title': 'Repository-aware delivery',
|
||
'welcome.features.git.description':
|
||
'Link project repositories and see matching branches and pull requests on the ticket.',
|
||
'welcome.footer': 'Self-hosted project and workflow management.',
|
||
'dashboard.eyebrow': 'Personal workspace',
|
||
'dashboard.greeting': 'Welcome back, {name}',
|
||
'dashboard.description':
|
||
'A current view of tickets assigned to you in projects you can access.',
|
||
'dashboard.summary': 'Work summary',
|
||
'dashboard.summary.assignedTickets': 'Assigned tickets',
|
||
'dashboard.summary.projects': 'Projects with assigned work',
|
||
'dashboard.summary.blockedTickets': 'Blocked tickets',
|
||
'dashboard.assignedWork': 'My assigned tickets',
|
||
'dashboard.assignedWorkDescription':
|
||
'Your work is grouped by project and ordered with the newest tickets first.',
|
||
'dashboard.projectTickets': 'Tickets assigned to you in {name}',
|
||
'dashboard.openProject': 'Open {name}',
|
||
'dashboard.openProjectAction': 'Open project',
|
||
'dashboard.empty.title': 'No tickets assigned to you',
|
||
'dashboard.empty.description':
|
||
'Tickets assigned to you in projects you can access will appear here.',
|
||
'dashboard.empty.action': 'Browse projects',
|
||
'auth.home': 'KanbanGit home',
|
||
'auth.accountAccess': 'Account access',
|
||
'auth.backToLogin': 'Return to sign in',
|
||
'auth.signOut': 'Sign out',
|
||
'auth.signingOut': 'Signing out…',
|
||
'auth.password.show': 'Show password',
|
||
'auth.password.hide': 'Hide password',
|
||
'auth.login.title': 'Welcome back',
|
||
'auth.login.description': 'Sign in to continue to your workspace.',
|
||
'auth.login.email': 'Email address',
|
||
'auth.login.emailPlaceholder': 'you@example.com',
|
||
'auth.login.password': 'Password',
|
||
'auth.login.remember': 'Remember me',
|
||
'auth.login.forgot': 'Forgot password?',
|
||
'auth.login.submit': 'Sign in',
|
||
'auth.login.pending': 'Signing in…',
|
||
'auth.login.help': 'Need an account? Contact your workspace administrator.',
|
||
'auth.login.statusTitle': 'Account update',
|
||
'auth.forgot.title': 'Reset your password',
|
||
'auth.forgot.description':
|
||
'Enter your account email and we will send you a secure reset link.',
|
||
'auth.forgot.email': 'Email address',
|
||
'auth.forgot.emailPlaceholder': 'you@example.com',
|
||
'auth.forgot.emailHint':
|
||
'Use the email address associated with your KanbanGit account.',
|
||
'auth.forgot.submit': 'Send reset link',
|
||
'auth.forgot.pending': 'Sending reset link…',
|
||
'auth.forgot.sentTitle': 'Reset link sent',
|
||
'auth.reset.title': 'Choose a new password',
|
||
'auth.reset.description':
|
||
'Create a new password for the account linked below.',
|
||
'auth.reset.email': 'Account email',
|
||
'auth.reset.password': 'New password',
|
||
'auth.reset.passwordHint':
|
||
'Use a password you do not use for another account.',
|
||
'auth.reset.passwordConfirmation': 'Confirm new password',
|
||
'auth.reset.submit': 'Save new password',
|
||
'auth.reset.pending': 'Updating your password…',
|
||
'auth.reset.invalidTitle': 'This reset link is no longer valid',
|
||
'auth.reset.requestNew': 'Request a new reset link',
|
||
'auth.reset.footer':
|
||
'For your security, reset links expire and can only be used once.',
|
||
'auth.confirm.title': 'Confirm it is you',
|
||
'auth.confirm.description':
|
||
'This action affects sensitive account information. Enter your password to continue.',
|
||
'auth.confirm.password': 'Current password',
|
||
'auth.confirm.passwordHint':
|
||
'Your password is checked securely and is never saved in a draft.',
|
||
'auth.confirm.submit': 'Confirm and continue',
|
||
'auth.confirm.pending': 'Confirming your password…',
|
||
'auth.confirm.footer':
|
||
'Password confirmation expires automatically after a short time.',
|
||
'auth.forceChange.title': 'Secure your account',
|
||
'auth.forceChange.description':
|
||
'You need to replace your temporary password before continuing to KanbanGit.',
|
||
'auth.forceChange.currentPassword': 'Temporary password',
|
||
'auth.forceChange.password': 'New password',
|
||
'auth.forceChange.passwordHint':
|
||
'Choose a password that differs from your temporary password.',
|
||
'auth.forceChange.passwordConfirmation': 'Confirm new password',
|
||
'auth.forceChange.submit': 'Save password and continue',
|
||
'auth.forceChange.pending': 'Securing your account…',
|
||
'auth.forceChange.statusTitle': 'Password update',
|
||
'auth.forceChange.wrongAccount': 'Not the account you expected?',
|
||
'auth.forceChange.footer':
|
||
'Your password entries are kept in memory only and are cleared when you leave.',
|
||
'auth.verify.title': 'Check your inbox',
|
||
'auth.verify.description':
|
||
'Open the verification link in your email to finish confirming your account.',
|
||
'auth.verify.emailLabel': 'Verification email address',
|
||
'auth.verify.resend': 'Resend verification email',
|
||
'auth.verify.pending': 'Sending verification email…',
|
||
'auth.verify.sentTitle': 'Verification link sent',
|
||
'auth.verify.sentDescription':
|
||
'Check your inbox for a new link. If it does not arrive, check your spam folder.',
|
||
'auth.verify.help': 'Already verified in another tab?',
|
||
'auth.verify.continue': 'Continue to workspace',
|
||
'auth.verify.wrongAccount':
|
||
'Wrong account? Sign out and use a different email address.',
|
||
'auth.twoFactor.title': 'Two-step verification',
|
||
'auth.twoFactor.description':
|
||
'Enter the six-digit code from your authenticator app to finish signing in.',
|
||
'auth.twoFactor.code': 'Authentication code',
|
||
'auth.twoFactor.codeHint':
|
||
'Enter all six digits, including any leading zero.',
|
||
'auth.twoFactor.recoveryTitle': 'Use a recovery code',
|
||
'auth.twoFactor.recoveryDescription':
|
||
'Enter one of the recovery codes you saved when you set up two-factor authentication.',
|
||
'auth.twoFactor.recoveryCode': 'Recovery code',
|
||
'auth.twoFactor.recoveryHint': 'Each recovery code can only be used once.',
|
||
'auth.twoFactor.useRecovery': 'Use a recovery code instead',
|
||
'auth.twoFactor.useCode': 'Use an authenticator code instead',
|
||
'auth.twoFactor.submit': 'Verify and sign in',
|
||
'auth.twoFactor.pending': 'Verifying your code…',
|
||
'auth.feedback.pending': 'Please wait…',
|
||
'auth.feedback.completed': 'Request completed',
|
||
'auth.feedback.validationTitle': 'Check your details',
|
||
'auth.feedback.validationDescription':
|
||
'Review the message below and try again. Your entries have been kept.',
|
||
'auth.feedback.expiredTitle': 'Your session has expired',
|
||
'auth.feedback.expiredDescription':
|
||
'Return to sign in to start a new session. You will need to enter your details again.',
|
||
'auth.feedback.limitedTitle': 'Too many attempts',
|
||
'auth.feedback.limitedDescription':
|
||
'Please wait a moment before trying again.',
|
||
'auth.feedback.networkDescription':
|
||
'We could not confirm the result. Your entries are still here. Check your connection before trying again.',
|
||
'auth.feedback.serverDescription':
|
||
'The server returned an unexpected response. Your entries are still here. Please try again in a moment.',
|
||
'auth.feedback.cancelledDescription':
|
||
'The request was interrupted. Your entries are still here if you want to try again.',
|
||
'navigation.main': 'Main navigation',
|
||
'navigation.workspace': 'Workspace',
|
||
'navigation.project': 'Project navigation',
|
||
'navigation.projectSettings': 'Project settings',
|
||
'navigation.account': 'Account',
|
||
'navigation.dashboard': 'Dashboard',
|
||
'navigation.projects': 'Projects',
|
||
'navigation.templates': 'Project templates',
|
||
'navigation.users': 'Users',
|
||
'navigation.teams': 'Teams',
|
||
'navigation.overview': 'Overview',
|
||
'navigation.board': 'Board',
|
||
'navigation.backlog': 'Backlog',
|
||
'navigation.general': 'General',
|
||
'navigation.boardSettings': 'Board settings',
|
||
'navigation.ticketSettings': 'Ticket settings',
|
||
'navigation.repositories': 'Repositories',
|
||
'navigation.notifications': 'Notifications',
|
||
'navigation.access': 'Access',
|
||
'navigation.settings': 'Settings',
|
||
'navigation.profile': 'Profile',
|
||
'navigation.security': 'Security',
|
||
'navigation.gitConnections': 'Git connections',
|
||
'navigation.applications': 'Applications',
|
||
'navigation.appearance': 'Appearance',
|
||
'navigation.settingsDescription':
|
||
'Manage your profile, security, and Git integration settings.',
|
||
'settings.eyebrow': 'Account settings',
|
||
'navigation.createTicket': 'New ticket',
|
||
'navigation.createProject': 'New project',
|
||
'navigation.downloadApp': 'Download App',
|
||
'navigation.downloadAppAppleSilicon':
|
||
'Download App for Macs with Apple Silicon',
|
||
'navigation.open': 'Open navigation',
|
||
'navigation.close': 'Close navigation',
|
||
'navigation.expand': 'Expand sidebar',
|
||
'navigation.collapse': 'Collapse sidebar',
|
||
'navigation.mobileDescription':
|
||
'Navigate your workspace and current project.',
|
||
'navigation.skipToContent': 'Skip to content',
|
||
'navigation.userMenu': 'Account menu for {name}',
|
||
'navigation.logout': 'Log out',
|
||
'navigation.breadcrumbs': 'Breadcrumbs',
|
||
'appearance.label': 'Color theme',
|
||
'appearance.light': 'Light',
|
||
'appearance.lightDescription':
|
||
'Use a bright workspace with dark text and clear borders.',
|
||
'appearance.dark': 'Dark',
|
||
'appearance.darkDescription':
|
||
'Reduce glare with a darker workspace and balanced contrast.',
|
||
'appearance.system': 'System',
|
||
'appearance.systemDescription':
|
||
'Follow the light or dark preference set on this device.',
|
||
'appearance.title': 'Appearance',
|
||
'appearance.description': 'Choose how KanbanGit looks on this device.',
|
||
'appearance.persistenceHint':
|
||
'Your choice is saved on this device and restored when you open KanbanGit again.',
|
||
'profile.title': 'Profile',
|
||
'profile.description':
|
||
'Keep your personal details and profile picture up to date.',
|
||
'profile.information': 'Profile information',
|
||
'profile.picture': 'Profile picture',
|
||
'profile.pictureDescription':
|
||
'Help teammates recognize you throughout the workspace.',
|
||
'profile.picturePreview': 'Profile picture preview',
|
||
'profile.choosePicture': 'Choose picture',
|
||
'profile.changePicture': 'Choose another',
|
||
'profile.discardPicture': 'Discard selection',
|
||
'profile.removePicture': 'Remove picture',
|
||
'profile.removingPicture': 'Removing picture…',
|
||
'profile.selectedPicture': 'Selected: {name}',
|
||
'profile.pictureHelp':
|
||
'Choose a PNG, JPG, or WebP image up to 2 MB. On mobile, you can select from your photo library or camera.',
|
||
'profile.name': 'Name',
|
||
'profile.namePlaceholder': 'Full name',
|
||
'profile.email': 'Email address',
|
||
'profile.emailPlaceholder': 'Email address',
|
||
'profile.emailUnverified': 'Your email address is unverified.',
|
||
'profile.resendVerification': 'Resend the verification email',
|
||
'profile.verificationSent':
|
||
'A new verification link has been sent to your email address.',
|
||
'profile.save': 'Save profile',
|
||
'profile.saving': 'Saving profile…',
|
||
'profile.unsaved': 'You have unsaved profile changes.',
|
||
'profile.delete.title': 'Delete account',
|
||
'profile.delete.description':
|
||
'Permanently delete your account and all of its resources.',
|
||
'profile.delete.warning': 'This action cannot be undone',
|
||
'profile.delete.warningDescription':
|
||
'Your account and associated data will be permanently removed.',
|
||
'profile.delete.action': 'Delete account',
|
||
'profile.delete.confirmTitle':
|
||
'Are you sure you want to delete your account?',
|
||
'profile.delete.confirmDescription':
|
||
'Enter your password to confirm that you want to permanently delete your account and its data.',
|
||
'profile.delete.password': 'Password',
|
||
'profile.delete.confirmAction': 'Permanently delete account',
|
||
'common.cancel': 'Cancel',
|
||
'common.close': 'Close',
|
||
'common.edit': 'Edit',
|
||
'common.remove': 'Remove',
|
||
'common.retry': 'Try again',
|
||
'feedback.empty': 'Nothing here yet',
|
||
'feedback.saved': 'Changes saved',
|
||
'forms.saving': 'Saving changes…',
|
||
'forms.leaveConfirm': 'You have unsaved changes. Leave without saving?',
|
||
'forms.validationTitle': 'Check your entries',
|
||
'forms.validationDescription':
|
||
'The server rejected some fields. Your entries are still here. Correct the highlighted errors and save again.',
|
||
'forms.networkTitle': 'Connection interrupted',
|
||
'forms.networkDescription':
|
||
'Your entries are still here, but we could not confirm whether the server saved them. Check your connection and verify the result before trying again.',
|
||
'forms.serverTitle': 'The request could not be completed',
|
||
'forms.serverDescription':
|
||
'Your entries are still here. The server returned an unexpected response; your session may have expired. Verify the result before trying again.',
|
||
'forms.cancelledTitle': 'Saving was interrupted',
|
||
'forms.cancelledDescription':
|
||
'Your entries are still here. Check whether the changes were saved before trying again.',
|
||
'tickets.noBranches': 'No matching branches',
|
||
'tickets.noBranchesDescription':
|
||
'No matching branches were found across the linked repositories.',
|
||
'tickets.noPullRequests': 'No matching pull requests',
|
||
'tickets.noPullRequestsDescription':
|
||
'No matching pull requests were found across the linked repositories.',
|
||
'tickets.open': 'Open {key}: {title}',
|
||
'tickets.blocked': 'Blocked',
|
||
'tickets.blockerComment': 'Blocker: {comment}',
|
||
'tickets.typeLabel': 'Type: {name}',
|
||
'tickets.priorityLabel': 'Priority: {name}',
|
||
'tickets.statusLabel': 'Status: {name}',
|
||
'tickets.noStatus': 'No status',
|
||
'tickets.assignedTo': 'Assigned to {name}',
|
||
'tickets.unassigned': 'Unassigned',
|
||
'tickets.tree.expand': 'Expand children of {key}',
|
||
'tickets.tree.collapse': 'Collapse children of {key}',
|
||
'common.save': 'Save',
|
||
'common.loading': 'Loading…',
|
||
'common.error': 'Something went wrong.',
|
||
'pagination.page': 'Page {page} of {total}',
|
||
'tickets.count': {
|
||
one: '{count} ticket',
|
||
other: '{count} tickets',
|
||
},
|
||
'ticketDetail.description': 'Description',
|
||
'ticketDetail.noDescription': 'No description has been added yet.',
|
||
'ticketDetail.checklist': 'Acceptance criteria',
|
||
'ticketDetail.noChecklist': 'No acceptance criteria have been added yet.',
|
||
'ticketDetail.saveChecklistFirst':
|
||
'Save checklist text changes before toggling completion directly.',
|
||
'ticketDetail.edit': 'Edit ticket',
|
||
'ticketDetail.editDescription':
|
||
'Tracked ticket changes create worklog entries automatically.',
|
||
'ticketDetail.git': 'Git',
|
||
'ticketDetail.relationships': 'Relationships',
|
||
'ticketDetail.history': 'Worklog',
|
||
'ticketDetail.metadata': 'Ticket information',
|
||
'ticketDetail.sections': 'Ticket sections',
|
||
'ticketDetail.status': 'Status',
|
||
'ticketDetail.type': 'Type',
|
||
'ticketDetail.priority': 'Priority',
|
||
'ticketDetail.assignee': 'Assignee',
|
||
'ticketDetail.author': 'Author',
|
||
'ticketDetail.noAuthor': 'No author',
|
||
'ticketDetail.storyPoints': 'Estimated story points',
|
||
'ticketDetail.notSet': 'Not set',
|
||
'ticketDetail.created': 'Created',
|
||
'ticketDetail.updated': 'Last updated',
|
||
'ticketDetail.backToProject': 'Back to project',
|
||
'ticketDetail.openBacklog': 'Open backlog',
|
||
'ticketDetail.openBoard': 'Open board',
|
||
'ticketDetail.readOnly': 'Read only',
|
||
'ticketDetail.title': 'Title',
|
||
'ticketDetail.parent': 'Parent ticket',
|
||
'ticketDetail.noParent': 'No parent ticket',
|
||
'ticketDetail.checklistEditor': 'Acceptance criteria checklist',
|
||
'ticketDetail.checklistHelp':
|
||
'Use [ ] / [x] for checklist items. Indent with two spaces for nested steps. Text changes are saved with the main ticket update.',
|
||
'ticketDetail.checklistPlaceholder':
|
||
'[ ] User can sign in\n [x] Validation is shown for invalid credentials',
|
||
'ticketDetail.blocked': 'Mark ticket as blocked',
|
||
'ticketDetail.blocker': 'Blocker',
|
||
'ticketDetail.blockerDescription':
|
||
'Record whether progress is blocked and why. Changes are added to the ticket worklog.',
|
||
'ticketDetail.blockerActive': 'Blocked',
|
||
'ticketDetail.blockerInactive': 'Not blocked',
|
||
'ticketDetail.blockerActiveDescription':
|
||
'A blocker reason is required while this ticket is blocked.',
|
||
'ticketDetail.blockerInactiveDescription':
|
||
'This ticket currently has no active blocker.',
|
||
'ticketDetail.blockerComment': 'Blocker comment',
|
||
'ticketDetail.blockerCommentHelp':
|
||
'Explain the concrete dependency or decision preventing progress.',
|
||
'ticketDetail.blockerPlaceholder':
|
||
'Describe what currently blocks progress on this ticket.',
|
||
'ticketDetail.saveBlocker': 'Save blocker',
|
||
'ticketDetail.unblockTicket': 'Unblock ticket',
|
||
'ticketDetail.resetBlocker': 'Discard blocker changes',
|
||
'ticketDetail.savingBlocker': 'Saving blocker…',
|
||
'ticketDetail.customFields': 'Custom fields',
|
||
'ticketDetail.customFieldsDescription':
|
||
'Project-configured fields can be tracked directly on the ticket.',
|
||
'ticketDetail.noCustomFields':
|
||
'No custom fields are configured for this project yet.',
|
||
'ticketDetail.saveChanges': 'Save changes',
|
||
'ticketDetail.branches': 'Branches',
|
||
'ticketDetail.branchesDescription':
|
||
'Matching branches are discovered from linked repositories when the branch name starts with this ticket key.',
|
||
'ticketDetail.createBranch': 'Create branch',
|
||
'ticketDetail.createBranchTitle': 'Create branch from ticket',
|
||
'ticketDetail.createBranchDescription':
|
||
'Pick a linked repository, confirm the suggested branch name, and create it directly in Gitea.',
|
||
'ticketDetail.repository': 'Repository',
|
||
'ticketDetail.branchName': 'Branch name',
|
||
'ticketDetail.branchAccess':
|
||
'You can only create branches in repositories that match one of your personal Git connections.',
|
||
'ticketDetail.gitAccessRequired': 'Personal Git access required',
|
||
'ticketDetail.personalAccessRequired': 'personal Git access required',
|
||
'ticketDetail.openGitConnections': 'Open Git connections',
|
||
'ticketDetail.createNow': 'Create now',
|
||
'ticketDetail.creatingBranch': 'Creating branch…',
|
||
'ticketDetail.noLinkedRepositories': 'No linked repositories',
|
||
'ticketDetail.noLinkedRepositoriesDescription':
|
||
'A project administrator needs to link a repository before Git activity can appear here.',
|
||
'ticketDetail.branchesUnavailable': 'Branches unavailable',
|
||
'ticketDetail.pullRequestsUnavailable': 'Pull requests unavailable',
|
||
'ticketDetail.openRepositoryExternal':
|
||
'Open {repository} on {provider} (opens in a new tab)',
|
||
'ticketDetail.openPullRequestExternal':
|
||
'Open pull request #{number} on {provider} (opens in a new tab)',
|
||
'ticketDetail.inspectBranches':
|
||
'Connect a matching Git account in your user settings to inspect branches for this repository.',
|
||
'ticketDetail.pullRequests': 'Pull requests',
|
||
'ticketDetail.pullRequestsDescription':
|
||
'Matching pull requests are detected from linked repositories by checking whether the source branch starts with this ticket key.',
|
||
'ticketDetail.inspectPullRequests':
|
||
'Connect a matching Git account in your user settings to inspect pull requests for this repository.',
|
||
'ticketDetail.checkingBranch':
|
||
'Checking whether this branch name is valid and still available...',
|
||
'ticketDetail.selectRepository':
|
||
'Select a linked repository to validate the branch name.',
|
||
'ticketDetail.connectGitFirst':
|
||
'Connect a matching Git connection in your user settings first.',
|
||
'ticketDetail.branchRequired': 'Branch name is required.',
|
||
'ticketDetail.branchValidationFailed':
|
||
'{app} could not validate this branch name right now.',
|
||
'ticketDetail.checklistSaveFailed':
|
||
'Checklist status could not be saved right now.',
|
||
'ticketDetail.children': 'Child tickets',
|
||
'ticketDetail.childrenDescription':
|
||
'Parent tickets expose their full child tree here, including nested parent chains.',
|
||
'ticketDetail.noChildren':
|
||
'No child tickets are assigned to this ticket yet.',
|
||
'ticketDetail.parentDescription':
|
||
'This ticket belongs to the parent shown here.',
|
||
'ticketDetail.linkedTickets': 'Linked tickets',
|
||
'ticketDetail.linkedTicketsDescription':
|
||
'Track cross-ticket relationships with project-defined link labels.',
|
||
'ticketDetail.linkType': 'Link type',
|
||
'ticketDetail.linkedTicket': 'Linked ticket',
|
||
'ticketDetail.saveLink': 'Save link',
|
||
'ticketDetail.noLinks':
|
||
'No ticket links are configured for this ticket yet.',
|
||
'ticketDetail.removeLink': 'Remove',
|
||
'ticketRelationships.hierarchy': 'Hierarchy',
|
||
'ticketRelationships.editParent': 'Change parent',
|
||
'ticketRelationships.parentHelp':
|
||
'Change parent to assign this ticket or choose “No parent ticket” to detach it.',
|
||
'ticketRelationships.childrenHelp':
|
||
'Open a child ticket to change its parent. Expand a group to see its descendants.',
|
||
'ticketRelationships.addLink': 'Add or update a link',
|
||
'ticketRelationships.selectTicket': 'Select a ticket',
|
||
'ticketRelationships.direction': 'This ticket',
|
||
'ticketRelationships.directionHelp':
|
||
'Choose how this ticket relates to the linked ticket. The reverse label appears on the other ticket. Saving an existing pair updates its type and direction.',
|
||
'ticketRelationships.outgoing': 'Outgoing',
|
||
'ticketRelationships.incoming': 'Incoming',
|
||
'ticketRelationships.removeLink': 'Remove link to {key}',
|
||
'ticketRelationships.noTypes':
|
||
'No link types are configured for this project.',
|
||
'ticketRelationships.noTargets':
|
||
'No other tickets are available to link in this project.',
|
||
'ticketDetail.historyDescription':
|
||
'Every tracked ticket change is recorded with actor and timestamp.',
|
||
'ticketDetail.noHistory': 'No worklog entries exist for this ticket yet.',
|
||
'ticketDetail.system': 'System',
|
||
'ticketDetail.historyType.created': 'Ticket created',
|
||
'ticketDetail.historyType.updated': 'Ticket updated',
|
||
'ticketDetail.historyType.statusChanged': 'Status changed',
|
||
'ticketDetail.historyType.linkUpdated': 'Link added',
|
||
'ticketDetail.historyType.linkRemoved': 'Link removed',
|
||
'ticketDetail.sourceBranch': 'Source branch: {name}',
|
||
'ticketForm.create': 'Create ticket',
|
||
'ticketForm.pageTitle': 'Create {project} ticket',
|
||
'ticketForm.createDescription': 'Add a ticket to {project}.',
|
||
'ticketForm.backToBoard': 'Back to board',
|
||
'ticketForm.backToBacklog': 'Back to backlog',
|
||
'ticketForm.details': 'Ticket details',
|
||
'ticketForm.keyAssigned': 'The ticket key is assigned after creation.',
|
||
'ticketForm.titlePlaceholder': 'Implement repository sync',
|
||
'ticketForm.descriptionPlaceholder':
|
||
'Describe the expected behavior and relevant context.',
|
||
'ticketForm.checklistHelp':
|
||
'Use [ ] / [x] for checklist items. Indent with two spaces for nested steps.',
|
||
'ticketForm.checklistPreview': 'Checklist preview',
|
||
'ticketForm.metadataRequired':
|
||
'Ticket creation needs at least one type, one priority, and one status.',
|
||
'ticketForm.openSettings': 'Open ticket settings',
|
||
'ticketForm.creating': 'Creating ticket…',
|
||
'ticketForm.saving': 'Saving changes…',
|
||
'ticketForm.reset': 'Discard changes',
|
||
'ticketForm.unsaved': 'Unsaved changes',
|
||
'ticketForm.ready': 'Ready for a new ticket',
|
||
'ticketForm.saved': 'All changes saved',
|
||
'ticketForm.authorRestricted': 'Only project admins can change the author.',
|
||
'ticketForm.blocker': 'Blocker',
|
||
'projectSettings.pageTitle': '{project} general settings',
|
||
'projectSettings.description':
|
||
'Manage settings and template inheritance for {project}.',
|
||
'projectSettings.generalDescription':
|
||
'Review project identity, setting sources, and administrative actions.',
|
||
'projectSettings.identity': 'Project identity',
|
||
'projectSettings.identityDescription':
|
||
'The name and key belong to this project and are never inherited from a template.',
|
||
'projectSettings.name': 'Project name',
|
||
'projectSettings.key': 'Project key',
|
||
'projectSettings.local': 'Local',
|
||
'projectSettings.inherited': 'Inherited',
|
||
'projectSettings.override': 'Local override',
|
||
'projectSettings.display': 'Ticket display',
|
||
'projectSettings.showAuthor': 'Show author',
|
||
'projectSettings.showStoryPoints': 'Show story points',
|
||
'projectSettings.enabled': 'Enabled',
|
||
'projectSettings.disabled': 'Disabled',
|
||
'projectSettings.displayDescription':
|
||
'Manage these display options in Ticket settings.',
|
||
'projectSettings.template': 'Template baseline',
|
||
'projectSettings.templateDescription':
|
||
'Manage the linked template or reset individual areas using the inheritance panel.',
|
||
'projectSettings.currentTemplate': 'Current linked template',
|
||
'projectSettings.noTemplate': 'No linked template',
|
||
'projectSettings.linked': 'Template inheritance active',
|
||
'projectSettings.standalone': 'Standalone',
|
||
'projectSettings.standaloneDescription':
|
||
'This project manages its settings locally. Published template updates are not applied.',
|
||
'projectSettings.noAlternatives': 'No other published templates',
|
||
'projectSettings.noAlternativesDescription':
|
||
'A different published template is required to switch this project.',
|
||
'projectSettings.switch': 'Switch template',
|
||
'projectSettings.switching': 'Switching template…',
|
||
'projectSettings.switchWarning':
|
||
'Switching templates can replace or remove project configuration in copied areas, including workflows, ticket metadata, repositories, and notifications.',
|
||
'projectSettings.publishedTemplate': 'Published template',
|
||
'projectSettings.selectTemplate': 'Select a template',
|
||
'projectSettings.confirmation': 'Confirmation key',
|
||
'projectSettings.confirmPlaceholder': 'Type {key} exactly',
|
||
'projectSettings.confirmHelp':
|
||
'Enter the exact project key {key} to confirm this action. The key is case sensitive.',
|
||
'projectSettings.danger': 'Danger zone',
|
||
'projectSettings.deleteDescription':
|
||
'Permanently delete this project and all of its tickets, board columns, ticket metadata, repository connections, and project permissions.',
|
||
'projectSettings.irreversible': 'This action cannot be undone.',
|
||
'projectSettings.delete': 'Delete project',
|
||
'projectSettings.deleting': 'Deleting project…',
|
||
'projectSettings.updated': 'Project settings updated.',
|
||
'inheritance.title': 'Template inheritance',
|
||
'inheritance.description': 'Settings linked to {template}.',
|
||
'inheritance.help':
|
||
'Each area inherits independently. Settings outside the template are managed locally.',
|
||
'inheritance.areas': 'Setting sources',
|
||
'inheritance.overrideHelp':
|
||
'Local changes stay in place when the template is updated.',
|
||
'inheritance.reset': 'Reset to template',
|
||
'inheritance.resetArea': 'Reset {area} to template',
|
||
'inheritance.resetting': 'Resetting…',
|
||
'inheritance.confirmTitle': 'Reset this setting area?',
|
||
'inheritance.confirmDescription':
|
||
'Replace local changes in {area} with the current baseline from {template}. Other setting areas keep their current values.',
|
||
'inheritance.resetWarning':
|
||
'Local configuration in this area may be replaced or removed.',
|
||
'inheritance.statusHelp':
|
||
'Choose where tickets in local statuses should move before those statuses are removed.',
|
||
'inheritance.statusLabel': '{status} ({count} tickets)',
|
||
'inheritance.selectStatus': 'Select replacement status',
|
||
'inheritance.area.projectSettings': 'Project settings',
|
||
'inheritance.area.boardColumns': 'Board columns',
|
||
'inheritance.area.ticketStatuses': 'Ticket statuses',
|
||
'inheritance.area.statusTransitions': 'Status transitions',
|
||
'inheritance.area.ticketTypes': 'Ticket types',
|
||
'inheritance.area.ticketPriorities': 'Ticket priorities',
|
||
'inheritance.area.ticketFields': 'Custom ticket fields',
|
||
'inheritance.area.ticketLinkTypes': 'Ticket link types',
|
||
'inheritance.area.repositoryConnections': 'Repository connections',
|
||
'inheritance.area.notificationActions': 'Notification actions',
|
||
'repositorySettings.pageTitle': '{project} repository settings',
|
||
'repositorySettings.title': 'Project repositories',
|
||
'repositorySettings.description':
|
||
'Choose the repositories this project uses for ticket branches and pull requests.',
|
||
'repositorySettings.projectScope':
|
||
'Repository links belong to the project. Every team member keeps using the same linked repositories, while access is granted through their own personal Git connections.',
|
||
'repositorySettings.linkedRepositories': 'Linked repositories',
|
||
'repositorySettings.linkAction': 'Link repository',
|
||
'repositorySettings.empty': 'No project repositories yet',
|
||
'repositorySettings.emptyDescription':
|
||
'Link a repository from one of your personal Git connections to make it available to project tickets.',
|
||
'repositorySettings.personalAccessReady': 'Personal access ready',
|
||
'repositorySettings.personalAccessMissing': 'Personal access needed',
|
||
'repositorySettings.ticketUsage':
|
||
'Tickets use this project link to discover matching branches and pull requests.',
|
||
'repositorySettings.openRepository':
|
||
'Open {repository} in the Git provider (opens in a new tab)',
|
||
'repositorySettings.open': 'Open repository',
|
||
'repositorySettings.connectAccess': 'Connect Git access',
|
||
'repositorySettings.editRepository':
|
||
'Change project repository {repository}',
|
||
'repositorySettings.removeRepository':
|
||
'Remove project repository {repository}',
|
||
'repositorySettings.personalSources': 'Personal Git access',
|
||
'repositorySettings.personalSourcesDescription':
|
||
'These account connections are private to you and are only used to discover repositories you can link to this project.',
|
||
'repositorySettings.manageConnections': 'Manage Git connections',
|
||
'repositorySettings.refresh': 'Refresh repositories',
|
||
'repositorySettings.refreshing': 'Loading repositories…',
|
||
'repositorySettings.refreshingDescription':
|
||
'The latest repositories are being requested from your Git providers.',
|
||
'repositorySettings.noConnections': 'No personal Git connection',
|
||
'repositorySettings.noConnectionsDescription':
|
||
'Add a personal Git connection before linking or changing a project repository.',
|
||
'repositorySettings.detectedSources': 'Detected personal sources',
|
||
'repositorySettings.unavailable': 'Provider unavailable',
|
||
'repositorySettings.repositoryCount': '{count} repositories',
|
||
'repositorySettings.linkTitle': 'Link a project repository',
|
||
'repositorySettings.linkDescription':
|
||
'Choose a personal connection, find a repository, and add it to this project.',
|
||
'repositorySettings.editTitle': 'Change project repository',
|
||
'repositorySettings.editDescription':
|
||
'Replace this project link with another repository. Tickets will use the updated link after saving.',
|
||
'repositorySettings.removeTitle': 'Remove repository',
|
||
'repositorySettings.removeDescription':
|
||
'Remove this repository from the project? Tickets will no longer discover its branches or pull requests.',
|
||
'repositorySettings.linked': 'Repository linked to the project.',
|
||
'repositorySettings.updated': 'Project repository updated.',
|
||
'repositorySettings.removed': 'Repository removed from the project.',
|
||
'repositorySettings.matchingConnectionMissing':
|
||
'Matching personal access is missing',
|
||
'repositorySettings.matchingConnectionMissingDescription':
|
||
'The project link remains available to the team, but this account cannot query it until you add a matching provider connection. You can still choose a different accessible repository below.',
|
||
'repositorySettings.personalConnection': 'Personal Git connection',
|
||
'repositorySettings.personalConnectionHelp':
|
||
'Used for discovery only; it is not shared with the project.',
|
||
'repositorySettings.providerError':
|
||
'Repositories could not be loaded from this provider',
|
||
'repositorySettings.searchLabel': 'Find a repository',
|
||
'repositorySettings.searchPlaceholder':
|
||
'Search by repository, owner, or namespace',
|
||
'repositorySettings.noRepositories': 'No repositories available',
|
||
'repositorySettings.noRepositoriesDescription':
|
||
'This connection is working, but the provider returned no repositories you can access.',
|
||
'repositorySettings.noSearchResults': 'No matching repositories',
|
||
'repositorySettings.noSearchResultsDescription':
|
||
'No repository matches “{search}”. Try a different name or clear the search.',
|
||
'repositorySettings.repositoryLabel': 'Available repositories',
|
||
'repositorySettings.forbidden': 'Project access denied',
|
||
'repositorySettings.forbiddenDescription':
|
||
'You no longer have permission to manage repositories for this project. Close this dialog and refresh the page.',
|
||
'repositorySettings.linking': 'Linking repository…',
|
||
'repositorySettings.saving': 'Saving repository…',
|
||
'repositorySettings.save': 'Save repository',
|
||
'repositorySettings.removing': 'Removing repository…',
|
||
'gitConnections.description':
|
||
'Connect your personal Git account to browse repositories, branches, and pull requests you can access.',
|
||
'gitConnections.privacy':
|
||
'Connections belong to your account. Saved tokens stay hidden. Without a matching connection, only repository names are available.',
|
||
'gitConnections.add': 'Add connection',
|
||
'gitConnections.editAction': 'Edit',
|
||
'gitConnections.edit': 'Edit connection',
|
||
'gitConnections.remove': 'Remove',
|
||
'gitConnections.removeTitle': 'Remove connection',
|
||
'gitConnections.saved': 'Saved connections',
|
||
'gitConnections.empty': 'No Git connections yet',
|
||
'gitConnections.emptyDescription':
|
||
'Add a Gitea connection to access your repositories and their Git activity.',
|
||
'gitConnections.unnamedAccount': 'Unnamed remote account',
|
||
'gitConnections.remoteId': 'Remote user ID: {id}',
|
||
'gitConnections.editAccount': 'Edit {account} at {server}',
|
||
'gitConnections.removeAccount': 'Remove {account} at {server}',
|
||
'gitConnections.addDescription':
|
||
'Connect a Gitea account using its server URL and a personal application token.',
|
||
'gitConnections.editDescription':
|
||
'Update the server URL and enter a fresh token to verify this connection.',
|
||
'gitConnections.removeDescription':
|
||
'Remove this personal connection? Repository links remain, but Git activity will require another matching connection.',
|
||
'gitConnections.gitea': 'Gitea',
|
||
'gitConnections.baseUrl': 'Gitea base URL',
|
||
'gitConnections.token': 'Application token',
|
||
'gitConnections.newToken': 'New application token',
|
||
'gitConnections.tokenPlaceholder': 'Paste your Gitea application token',
|
||
'gitConnections.tokenHelp':
|
||
'Your token is verified with Gitea before saving. It is never shown in the saved connection.',
|
||
'gitConnections.verifying': 'Verifying connection…',
|
||
'gitConnections.save': 'Save changes',
|
||
'gitConnections.removing': 'Removing connection…',
|
||
'gitConnections.forbidden': 'Connection access denied',
|
||
'gitConnections.forbiddenDescription':
|
||
'You can only manage connections belonging to your account. Close this dialog and refresh the page.',
|
||
'gitConnections.added': 'Git connection added.',
|
||
'gitConnections.updated': 'Git connection updated.',
|
||
'gitConnections.removed': 'Git connection removed.',
|
||
'metadata.title': 'Ticket settings',
|
||
'metadata.pageTitle': '{project} ticket settings',
|
||
'metadata.description':
|
||
'Manage ticket types, priorities, and the information shown on your tickets.',
|
||
'metadata.updated': 'Ticket settings updated.',
|
||
'metadata.types': 'Ticket types',
|
||
'metadata.priorities': 'Priorities',
|
||
'metadata.addType': 'Add type',
|
||
'metadata.addPriority': 'Add priority',
|
||
'metadata.typesDescription':
|
||
'Define your project’s ticket types and their order. Parent types can contain child tickets.',
|
||
'metadata.prioritiesDescription':
|
||
'Define and order project-specific priorities. The last priority must be kept.',
|
||
'metadata.parentType': 'Parent type',
|
||
'metadata.standardType': 'Standard type',
|
||
'metadata.assignedTickets': 'Assigned tickets: {count}',
|
||
'metadata.editEntry': 'Edit {name}',
|
||
'metadata.deleteEntry': 'Delete {name}',
|
||
'metadata.lastType':
|
||
'The last ticket type cannot be deleted. Add another type first.',
|
||
'metadata.lastPriority':
|
||
'The last priority cannot be deleted. Add another priority first.',
|
||
'metadata.display': 'Display options',
|
||
'metadata.displayDescription':
|
||
'Choose which optional information is available on this project’s tickets.',
|
||
'metadata.author': 'Show ticket author',
|
||
'metadata.authorHelp': 'Display the author on ticket details.',
|
||
'metadata.storyPoints': 'Enable story points',
|
||
'metadata.storyPointsHelp': 'Allow estimates in story points on tickets.',
|
||
'metadata.name': 'Name',
|
||
'metadata.positionHelp':
|
||
'Choose a position from 1 to {count}. Other entries shift automatically.',
|
||
'metadata.allowChildren': 'Allow child tickets',
|
||
'metadata.parentFixed':
|
||
'Whether a type allows child tickets is fixed after creation. Its name and position remain editable.',
|
||
'metadata.editHelp':
|
||
'Choose a project-specific name. Changes apply to tickets using this entry.',
|
||
'metadata.deleteTypeHelp':
|
||
'Delete this type? Assigned tickets must be moved to a replacement type first. This action cannot be undone.',
|
||
'metadata.deletePriorityHelp':
|
||
'Delete this priority? All tickets assigned to this priority will also be permanently deleted. There is no replacement mapping for priorities. This action cannot be undone.',
|
||
'metadata.replacementHelp':
|
||
'Move {count} assigned tickets to another type before deleting this one.',
|
||
'metadata.replacement': 'Replacement ticket type',
|
||
'metadata.chooseType': 'Choose a type',
|
||
'metadata.parentReplacement':
|
||
'If any affected ticket has child tickets, choose a parent type. The server checks this before deleting.',
|
||
'metadata.customFields': 'Custom fields',
|
||
'metadata.customFieldsDescription':
|
||
'Define the project-specific user and number fields shown on tickets.',
|
||
'metadata.addField': 'Add field',
|
||
'metadata.noCustomFields': 'No custom fields',
|
||
'metadata.noCustomFieldsDescription':
|
||
'Add a field when this project needs structured information beyond the standard ticket details.',
|
||
'metadata.storedValues': 'Stored values: {count}',
|
||
'metadata.editField': 'Edit {name}',
|
||
'metadata.deleteField': 'Delete {name}',
|
||
'metadata.fieldEditorHelp':
|
||
'Choose a label and one of the supported field types. Existing ticket values remain attached when this definition is edited.',
|
||
'metadata.deleteFieldHelp':
|
||
'Delete this custom field? This action cannot be undone.',
|
||
'metadata.fieldDeletionImpact':
|
||
'Deleting this field also permanently removes {count} stored ticket values.',
|
||
'metadata.fieldLabel': 'Field label',
|
||
'metadata.fieldType': 'Field type',
|
||
'metadata.fieldTypeHelp':
|
||
'Only the field types already supported by this project are available.',
|
||
'metadata.linkTypes': 'Link types',
|
||
'metadata.linkTypesDescription':
|
||
'Define the labels shown from each side of a ticket relationship.',
|
||
'metadata.addLinkType': 'Add link type',
|
||
'metadata.noLinkTypes': 'No link types',
|
||
'metadata.noLinkTypesDescription':
|
||
'Add a link type before tickets can be connected with a project-specific relationship.',
|
||
'metadata.ticketRelationships': 'Ticket relationships: {count}',
|
||
'metadata.linkDirection': '{source} points to {counterpart}',
|
||
'metadata.editLinkType': 'Edit {name}',
|
||
'metadata.deleteLinkType': 'Delete {name}',
|
||
'metadata.linkTypeEditorHelp':
|
||
'The source label is shown on the originating ticket; the counterpart label is shown on the linked ticket.',
|
||
'metadata.deleteLinkTypeHelp':
|
||
'Delete this link type? This action cannot be undone.',
|
||
'metadata.linkTypeDeletionImpact':
|
||
'Deleting this link type also permanently removes {count} ticket relationships.',
|
||
'metadata.sourceLabel': 'Source label',
|
||
'metadata.sourceLabelHelp':
|
||
'Shown when viewing the ticket where the relationship starts.',
|
||
'metadata.counterpartLabel': 'Counterpart label',
|
||
'metadata.counterpartLabelHelp':
|
||
'Shown when viewing the ticket at the other end of the relationship.',
|
||
} as const;
|