mirror of
https://github.com/hcengineering/platform.git
synced 2026-09-26 19:44:57 +02:00
* feat(tracker): Gantt chart for the issue tracker Builds on the merged search/filter rework (#10998). Introduces @hcengineering/gantt, a dependency-free scheduling/zoom/drag/viewport engine package (with a neutral GanttDependency contract), and wires the tracker-specific adapter, Svelte UI, model schema, dependency-shift notifications and sanity coverage in tracker-resources. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com> * fix(tracker): source Gantt holidays from HR and scope confirm-gate per view Follow-up to review feedback on #10992: - Confirm-gate: the module-global flag is replaced by a createConfirmGate() factory - one instance per mounted GanttView, so two Gantt views mounted at once in the same JS context no longer block each other's pointer input. A two-instance independence test guards the regression. - Sidebar sorting: the stale deadline cast is dropped and issue.deadline is read directly (the field was added to the Issue model in this PR). - HR holidays: the per-project WorkingDaysConfig.holidays field duplicated the workspace-wide hr.class.PublicHoliday concept and could drift from the real HR calendar. It is removed. WorkingDaysConfig now carries only the weekday mask and an optional holidayDepartment. The tracker adapter resolves holidays for the selected department plus all ancestors up to hr.ids.Head, matching HR's existing inheritance semantics (hr-resources ScheduleView). A missing or invalid reference falls back to company-wide (root) holidays; unrelated departments are never included. The ancestor walk is cycle/missing-parent safe. A small WorkingDaysEditor in the existing project create/edit dialog lets users with the existing project permission enable the mode, choose weekdays, and select an HR department (default: Company-wide). It persists through the existing project create/update transaction paths (createDoc on create, client.update on edit) and uses $unset when the mode is disabled. At least one working day must stay active. Calendar loading is explicit via a CalendarStateMachine: project-scoped drag, resize, cascade, keyboard-shift and auto-schedule mutations stay disabled until both the project config and the holiday data have loaded. A monotonic generation ticket (bumped synchronously on project switch) is re-checked immediately before every calendar-dependent date commit, so work started in one project can never persist after a switch to another. The all-projects view has no single project calendar, so calendar-dependent edits are read-only there; display, selection, the context menu and the manual date-picker (which does no calendar arithmetic and takes no mutation ticket) stay available. This depends on the lightweight @hcengineering/hr model package, but not on hr-resources; the tracker adapter uses hr.class.* and hr.ids.Head at runtime, and actual HR model presence is checked through the hierarchy - without the HR model, holidays resolve to an empty set. The @hcengineering/gantt engine package stays domain-neutral (no @hcengineering imports, no runtime deps). Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com> * fix(gantt): measure FS gap-preservation floor in working days The finish-to-start gap-preservation floor in the cascade scheduler mixed two time measures: the FS snap anchor is working-calendar aware, but the floor added a raw calendar-millisecond start-side delta. With an active working calendar the two diverge, so dragging a predecessor over a weekend over-shifted the successor across non-working days (a Fri->Mon body drag is 3 calendar days but only 1 working day, and could even land a successor on a Saturday). Measure the floor on the DUE side in working days instead: translate the predecessor's shift via the new workingDayDelta helper and advance the floor base with addWorkingDays over the calendar. A day-granular resize gate (utcMidnight comparison, not a raw === 0 test) arms the floor only on a start-DAY move, so a pure due-resize stays a pure snap even when the stored issue carries a time-of-day on the cascade-commit path. The floor base is normalized via utcMidnight(targetAnchor). The legacy path (cfg === undefined) stays byte-identical to today's raw-ms floor. A left-resize in working-days mode now correctly no-ops the floor (the due, and thus the FS gap, did not move) instead of shifting on the raw start delta. Engine: add workingDayDelta (signed, half-open from-exclusive/to-inclusive working-day step count) and export the previously-private utcMidnight from packages/gantt/src/working-days.ts. The engine stays domain-neutral (no @hcengineering imports, empty dependencies). Adds engine and adapter test coverage: workingDayDelta cases and the full FS floor matrix (right-resize no-push, weekend-spanner body drag, floor wins over snap, holiday in the floor path, floor-dominant multi-hop chain, negative delta, legacy no-cfg, SS pure-snap, raw time-of-day right-resize, direct left-resize). Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com> --------- Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com> Co-authored-by: Michael Uray <michaeluray@users.noreply.github.com>
568 lines
25 KiB
JSON
568 lines
25 KiB
JSON
{
|
||
"string": {
|
||
"TrackerApplication": "Tracker",
|
||
"Projects": "Your projects",
|
||
"More": "More",
|
||
"Default": "Default",
|
||
"MakeDefault": "Make default",
|
||
"Delete": "Delete",
|
||
"Open": "Open",
|
||
"Members": "Members",
|
||
"Inbox": "Inbox",
|
||
"MyIssues": "My issues",
|
||
"ViewIssue": "View issue",
|
||
"IssueCreated": "Issue Created",
|
||
"Issues": "Issues",
|
||
"Views": "Views",
|
||
"Active": "Active",
|
||
"AllIssues": "All issues",
|
||
"ActiveIssues": "Active issues",
|
||
"BacklogIssues": "Backlog",
|
||
"Backlog": "Backlog",
|
||
"Board": "Board",
|
||
"Components": "Components",
|
||
"AllComponents": "All",
|
||
"BacklogComponents": "Backlog",
|
||
"ActiveComponents": "Active",
|
||
"ClosedComponents": "Closed",
|
||
"NewComponent": "New component",
|
||
"CreateComponent": "Create component",
|
||
"ComponentNamePlaceholder": "Component name",
|
||
"ComponentDescriptionPlaceholder": "Description (optional)",
|
||
"ComponentLead": "Lead",
|
||
"ComponentMembers": "Members",
|
||
"StartDate": "Start date",
|
||
"TargetDate": "Target date",
|
||
"Planned": "Planned",
|
||
"InProgress": "In progress",
|
||
"Paused": "Paused",
|
||
"Completed": "Completed",
|
||
"Canceled": "Canceled",
|
||
"CreateProject": "Create project",
|
||
"NewProject": "New project",
|
||
"ProjectTitle": "Project title",
|
||
"ProjectTitlePlaceholder": "New project",
|
||
"UsedInIssueIDs": "Used in issue IDs",
|
||
"Identifier": "Identifier",
|
||
"Import": "Import",
|
||
"ProjectIdentifier": "Project identifier",
|
||
"IdentifierExists": "Project identifier already exists",
|
||
"ProjectIdentifierPlaceholder": "PRJCT",
|
||
"ChooseIcon": "Choose icon",
|
||
"AddIssue": "Add issue",
|
||
"NewIssue": "New issue",
|
||
"NewIssuePlaceholder": "New",
|
||
"ResumeDraft": "Resume draft",
|
||
"SaveIssue": "Create issue",
|
||
"SetPriority": "Set priority\u2026",
|
||
"SetStatus": "Set status\u2026",
|
||
"SelectIssue": "Select issue",
|
||
"Priority": "Priority",
|
||
"NoPriority": "No priority",
|
||
"Urgent": "Urgent",
|
||
"High": "High",
|
||
"Medium": "Medium",
|
||
"Low": "Low",
|
||
"Unassigned": "Unassigned",
|
||
"Back": "Back",
|
||
"List": "List",
|
||
"NumberLabels": "{count, plural, =0 {no labels} =1 {1 label} other {# labels}}",
|
||
|
||
"CategoryBacklog": "Backlog",
|
||
"CategoryUnstarted": "Unstarted",
|
||
"CategoryStarted": "Started",
|
||
"CategoryCompleted": "Completed",
|
||
"CategoryCanceled": "Canceled",
|
||
|
||
"Title": "Title",
|
||
"Name": "Name",
|
||
"Description": "Description",
|
||
"Status": "Status",
|
||
"Number": "Number",
|
||
"Assignee": "Assignee",
|
||
"AssignTo": "Assign to...",
|
||
"AssignedTo": "Assigned to {value}",
|
||
"Parent": "Parent issue",
|
||
"SetParent": "Set parent issue\u2026",
|
||
"ChangeParent": "Change parent issue\u2026",
|
||
"RemoveParent": "Remove parent issue",
|
||
"OpenParent": "Open parent issue",
|
||
"SubIssues": "Sub-issues",
|
||
"SubIssuesList": "Sub-issues ({subIssues})",
|
||
"OpenSubIssues": "Open sub-issues",
|
||
"AddSubIssues": "Add sub-issue",
|
||
"BlockedBy": "Blocked by",
|
||
"RelatedTo": "Related to",
|
||
"Comments": "Comments",
|
||
"Attachments": "Attachments",
|
||
"Labels": "Labels",
|
||
"Component": "Component",
|
||
"Space": "",
|
||
"SetDueDate": "Set due date\u2026",
|
||
"ChangeDueDate": "Change due date\u2026",
|
||
"ModificationDate": "Updated {value}",
|
||
"Project": "Project",
|
||
"Issue": "Issue",
|
||
"SubIssue": "Sub-issue",
|
||
"Document": "",
|
||
"DocumentIcon": "",
|
||
"DocumentColor": "",
|
||
"Rank": "Rank",
|
||
"TypeIssuePriority": "Issue priority",
|
||
"IssueTitlePlaceholder": "Issue title",
|
||
"SubIssueTitlePlaceholder": "Sub-issue title",
|
||
"IssueDescriptionPlaceholder": "Add description\u2026",
|
||
"SubIssueDescriptionPlaceholder": "Add sub-issue description",
|
||
"AddIssueTooltip": "Add issue...",
|
||
"NewIssueDialogClose": "Do you want to close this dialog?",
|
||
"NewIssueDialogCloseNote": "All changes will be lost",
|
||
"RemoveComponentDialogClose": "Delete the component?",
|
||
"RemoveComponentDialogCloseNote": "Are you sure you want to delete this component? This operation cannot be undone",
|
||
"Grouping": "Grouping",
|
||
"Ordering": "Ordering",
|
||
"CompletedIssues": "Completed issues",
|
||
"NoGrouping": "No grouping",
|
||
"NoAssignee": "No assignee",
|
||
"LastUpdated": "Last updated",
|
||
"DueDate": "Due date",
|
||
"IssueStartDate": "Start date",
|
||
"GanttDependency": "Dependency",
|
||
"GanttLag": "Lag",
|
||
"WorkingDaysConfig": "Working days",
|
||
"WorkingDaysTitle": "Working days",
|
||
"WorkingDaysDescription": "Configure which weekdays count as working days. When set, lag and slack are computed in working days; weekends and holidays are dimmed in the Gantt.",
|
||
"WorkingDaysWeekday": "Active weekdays",
|
||
"WorkingDaysHolidays": "Holidays",
|
||
"WorkingDaysNotConfigured": "Not configured — using calendar days",
|
||
"WorkingDaysEnable": "Working-days mode",
|
||
"WorkingDaysDepartment": "Holiday calendar",
|
||
"WorkingDaysCompanyWide": "Company-wide",
|
||
"WorkingDaysAtLeastOneDay": "At least one working day must stay active",
|
||
"WorkingDayMon": "Mon",
|
||
"WorkingDayTue": "Tue",
|
||
"WorkingDayWed": "Wed",
|
||
"WorkingDayThu": "Thu",
|
||
"WorkingDayFri": "Fri",
|
||
"WorkingDaySat": "Sat",
|
||
"WorkingDaySun": "Sun",
|
||
"Manual": "Manual",
|
||
"All": "All",
|
||
"PastWeek": "Past week",
|
||
"PastMonth": "Past month",
|
||
"CopyIssueUrl": "Copy issue URL to clipboard",
|
||
"CopyIssueId": "Copy issue ID to clipboard",
|
||
"CopyIssueBranch": "Copy Git branch name to clipboard",
|
||
"CopyIssueTitle": "Copy issue title to clipboard",
|
||
"AssetLabel": "Asset",
|
||
"AddToComponent": "Add to component\u2026",
|
||
"MoveToComponent": "Move to component\u2026",
|
||
"NoComponent": "No component",
|
||
"ComponentLeadTitle": "Component lead",
|
||
"ComponentMembersTitle": "Component members",
|
||
"ComponentLeadSearchPlaceholder": "Set component lead\u2026",
|
||
"ComponentMembersSearchPlaceholder": "Change component members\u2026",
|
||
"MoveToProject": "Move to project",
|
||
"Duplicate": "Duplicate",
|
||
|
||
"GotoIssues": "Go to issues",
|
||
"GotoActive": "Go to active issues",
|
||
"GotoBacklog": "Go to backlog",
|
||
"GotoComponents": "Go to components",
|
||
"GotoMyIssues": "Go to my issues",
|
||
"GotoTrackerApplication": "Switch to Tracker Application",
|
||
|
||
"CreatedOne": "Created",
|
||
"MoveIssues": "Move issues",
|
||
"MoveIssuesDescription": "Select the project you want to move issues to",
|
||
"ManageAttributes": "Manage attributes",
|
||
"KeepOriginalAttributes": "Keep original attributes",
|
||
"KeepOriginalAttributesTooltip": "Original issue statuses and components will be kept in the new project",
|
||
"SelectReplacement": "The following items are not available in the new project. Select a replacement.",
|
||
"MissingItem": "MISSING ITEM",
|
||
"Replacement": "REPLACEMENT",
|
||
"Original": "ORIGINAL",
|
||
"OriginalDescription": "Items from this section will be created in the new project",
|
||
|
||
"Relations": "Relations",
|
||
"RemoveRelation": "Remove relation...",
|
||
"AddBlockedBy": "Mark as blocked by...",
|
||
"AddIsBlocking": "Mark as blocking...",
|
||
"AddRelatedIssue": "Reference another issue...",
|
||
"RelatedIssue": "Related issue {id} - {title}",
|
||
"BlockedIssue": "Blocked issue {id} - {title}",
|
||
"BlockingIssue": "Blocking issue {id} - {title}",
|
||
"BlockedBySearchPlaceholder": "Search for issue to mark blocked by...",
|
||
"IsBlockingSearchPlaceholder": "Search for issue to mark as blocking...",
|
||
"RelatedIssueSearchPlaceholder": "Search for issue to reference...",
|
||
"Blocks": "Blocks",
|
||
"Related": "Related",
|
||
"RelatedIssues": "Related issues",
|
||
|
||
"EditIssue": "Edit {title}",
|
||
"EditWorkflowStatuses": "Edit issue statuses",
|
||
"EditProject": "Edit project",
|
||
"DeleteProject": "Delete project",
|
||
"ArchiveProjectName": "Archive project {name}?",
|
||
"ArchiveProjectConfirm": "Do you want to archive this project?",
|
||
"DeleteProjectConfirm": "Do you want to delete this project and all issues?",
|
||
"ProjectHasIssues": "There are existing issues in this project, are you sure that you want to archive?",
|
||
"ManageWorkflowStatuses": "Manage project types",
|
||
"AddWorkflowStatus": "Add issue status",
|
||
"EditWorkflowStatus": "Edit issue status",
|
||
"DeleteWorkflowStatus": "Delete issue status",
|
||
"DeleteWorkflowStatusConfirm": "Do you want to delete the \"{status}\" status?",
|
||
"DeleteWorkflowStatusErrorDescription": "The \"{status}\" status has {count, plural, =1 {1 issue} other {# issues}} assigned. Please select a status to move",
|
||
|
||
"Save": "Save",
|
||
"IncludeItemsThatMatch": "Include items that match",
|
||
"AnyFilter": "any filter",
|
||
"AllFilters": "all filters",
|
||
"NoDescription": "No description",
|
||
"SearchIssue": "Search for task...",
|
||
|
||
"StatusHistory": "State History",
|
||
"NewSubIssue": "Add sub-issue...",
|
||
"AddLabel": "Add label",
|
||
|
||
"DeleteIssue": "Delete {issueCount, plural, =1 {issue} other {# issues}}",
|
||
"DeleteIssueConfirm": "Do you want to delete {issueCount, plural, =1 {issue} other {issues}}{subIssueCount, plural, =0 {?} =1 { and sub-issue?} other { and sub-issues?}}",
|
||
|
||
"Milestone": "Milestone",
|
||
"NoMilestone": "No Milestone",
|
||
"MoveToMilestone": "Select Milestone",
|
||
"Milestones": "Milestones",
|
||
"AllMilestones": "All",
|
||
"PlannedMilestones": "Planned",
|
||
"ActiveMilestones": "Active",
|
||
"ClosedMilestones": "Done",
|
||
"AddToMilestone": "Add to Milestone",
|
||
"MilestoneNamePlaceholder": "Milestone name",
|
||
|
||
"NewMilestone": "New Milestone",
|
||
"CreateMilestone": "Create",
|
||
|
||
"MoveAndDeleteMilestone": "Move issues to {newMilestone} and delete {deleteMilestone}",
|
||
"MoveAndDeleteMilestoneConfirm": "Do you want to delete milestone and move issues to another milestone?",
|
||
|
||
"Estimation": "Estimation",
|
||
"ReportedTime": "Spent time",
|
||
"RemainingTime": "Remaining time",
|
||
"TimeSpendReports": "Time spent reports",
|
||
"TimeSpendReport": "Time",
|
||
"TimeSpendReportAdd": "Add time report",
|
||
"TimeSpendReportDate": "Date",
|
||
"TimeSpendReportValue": "Spent time",
|
||
"TimeSpendReportValueTooltip": "Spent time in hours",
|
||
"TimeSpendReportDescription": "Description",
|
||
"TimeSpendDays": "{value}d",
|
||
"TimeSpendHours": "{value}h",
|
||
"TimeSpendMinutes": "{value}m",
|
||
"ChildEstimation": "Sub-issues estimation",
|
||
"ChildReportedTime": "Sub-issues time",
|
||
"CapacityValue": "of {value}d",
|
||
"NewRelatedIssue": "New related issue",
|
||
"RelatedIssuesNotFound": "Related issues not found",
|
||
|
||
"AddedReference": "Added reference",
|
||
"AddedAsBlocked": "Marked as blocked",
|
||
"AddedAsBlocking": "Marked as blocking",
|
||
|
||
"IssueTemplate": "Template",
|
||
"IssueTemplates": "Templates",
|
||
"NewProcess": "New template",
|
||
"SaveProcess": "Save template",
|
||
"NoIssueTemplate": "No template",
|
||
"TemplateReplace": "Do you want to apply the new template?",
|
||
"TemplateReplaceConfirm": "All fields will be overwritten by the new template values",
|
||
"Apply": "Apply",
|
||
|
||
"CurrentWorkDay": "Current Working Day",
|
||
"PreviousWorkDay": "Previous Working Day",
|
||
"TimeReportDayTypeLabel": "Select time report day type",
|
||
"DefaultAssignee": "Default assignee for issues",
|
||
|
||
"SevenHoursLength": "Seven Hours",
|
||
"EightHoursLength": "Eight Hours",
|
||
"HourLabel": "h",
|
||
"MinuteLabel": "m",
|
||
"Saved": "Saved...",
|
||
"CreatedIssue": "Created issue",
|
||
"CreatedSubIssue": "Created sub-issue",
|
||
"ChangeStatus": "Change status",
|
||
"ConfigLabel": "Tracker",
|
||
"ConfigDescription": "Extension to manage work items and do all jobs done.",
|
||
"NoStatusFound": "No matching status found",
|
||
"CreateMissingStatus": "Create missing status",
|
||
"UnsetParent": "Parent issue will be unset",
|
||
"AllProjects": "All projects",
|
||
"IssueNotificationTitle": "{issueTitle}",
|
||
"IssueNotificationBody": "Updated by {senderName}",
|
||
"IssueNotificationChanged": "{senderName} changed {property}",
|
||
"IssueNotificationChangedProperty": "{senderName} changed {property} to \"{newValue}\"",
|
||
"IssueNotificationMessage": "{senderName}: {message}",
|
||
"PreviousAssigned": "Previously assigned",
|
||
"IssueAssignedToYou": "Assigned to you",
|
||
"RelatedIssueTargetDescription": "Related issue project target for Class or Space",
|
||
"MapRelatedIssues": "Configure related issue default projects",
|
||
"DefaultIssueStatus": "Default issue status",
|
||
"IssueStatus": "Status",
|
||
"Extensions": "Extensions",
|
||
"UnsetParentIssue": "Unset parent issue",
|
||
"ForbidCreateProjectPermission": "Forbid create project",
|
||
"ForbidCreateProjectPermissionDescription": "Forbid users creating new projects",
|
||
"Deadline": "Deadline",
|
||
"BarLabelNone": "None",
|
||
"BarLabelTitle": "Title",
|
||
"BarLabelIdentifier": "Identifier",
|
||
"BarLabelAssignee": "Assignee",
|
||
"BarLabelPriority": "Priority",
|
||
"BarLabelStatus": "Status",
|
||
"BarLabelEstimation": "Estimation",
|
||
"BarLabelProgress": "Progress",
|
||
"GanttBarLabelLeft": "Bar label (left)",
|
||
"GanttBarLabelInside": "Bar label (inside)",
|
||
"GanttBarLabelRight": "Bar label (right)",
|
||
"GanttQuickInfoOnClick": "Single-click shows quick info popover",
|
||
"QuickInfoOpenFullEditor": "Open full editor",
|
||
"DependencyShifted": "Dependency shifted",
|
||
"DependencyShiftedHeader": "{sender} shifted {trigger}",
|
||
"DependencyShiftedMessage": "{count, plural, =1 {1 dependent issue moved} other {# dependent issues moved}}",
|
||
"DependencyShiftedSubject": "Dependency shift",
|
||
"Color": "Color",
|
||
"AllowCreatingIssues": "Allow creating issues",
|
||
"Day": "Day",
|
||
"Week": "Week",
|
||
"Month": "Month",
|
||
"Quarter": "Quarter",
|
||
"Gantt": "Gantt",
|
||
"GanttShowIssueCode": "Show issue code",
|
||
"GanttShowTitle": "Show title",
|
||
"GanttShowStatus": "Show status",
|
||
"GanttToday": "Today",
|
||
"GanttJumpToStart": "Jump to start",
|
||
"GanttJumpToEnd": "Jump to end",
|
||
"GanttJumpToDate": "Jump to date",
|
||
"GanttZoomDay": "Day",
|
||
"GanttZoomWeek": "Week",
|
||
"GanttZoomMonth": "Month",
|
||
"GanttZoomQuarter": "Quarter",
|
||
"GanttZoomCustom": "Custom",
|
||
"GanttZoomLabel": "Zoom",
|
||
"GanttZoomVisibleDays": "{days, plural, one {1 day} other {# days}}",
|
||
"GanttZoomDaysSuffix": "days",
|
||
"GanttZoomDaysAria": "Visible days in viewport",
|
||
"GanttPreviousPeriod": "Previous period",
|
||
"GanttNextPeriod": "Next period",
|
||
"GanttScrollLeftToBar": "Scroll left to bar",
|
||
"GanttScrollRightToBar": "Scroll right to bar",
|
||
"GanttExpand": "Expand",
|
||
"GanttCollapse": "Collapse",
|
||
"GanttExpandAll": "Expand all",
|
||
"GanttCollapseAll": "Collapse all",
|
||
"GanttCornerNoOpInSwimlane": "No effect in group-by mode",
|
||
"ModeSelectorDisabledByFilter": "Status is controlled by an active filter. Remove the status filter to use this shortcut.",
|
||
"ShowQuickModeSelector": "Quick filter: All / Active / Backlog",
|
||
"SearchScopeLabel": "Search in…",
|
||
"SearchScopeTitle": "Title only",
|
||
"SearchScopeTitleDescription": "Title + Description",
|
||
"SearchScopeAll": "Title + Description + Comments",
|
||
"SearchHighlight": "Highlight search matches",
|
||
"GanttTreeBreadcrumb": "Parent of a matching issue",
|
||
"GanttArrowIndicatorSourceAbove": "Source row is above the viewport — click to scroll",
|
||
"GanttArrowIndicatorSourceBelow": "Source row is below the viewport — click to scroll",
|
||
"GanttArrowIndicatorTargetAbove": "Target row is above the viewport — click to scroll",
|
||
"GanttArrowIndicatorTargetBelow": "Target row is below the viewport — click to scroll",
|
||
"GanttDragConflict": "Issue was changed by someone else, please retry",
|
||
"GanttDragFailed": "Failed to apply Gantt edit",
|
||
"GanttDragNoPermission": "You don't have permission to edit this issue",
|
||
"GanttDragValidation": "Date is not valid: {reason}",
|
||
"GanttResizingTooltip": "{from} days → {to} days ({delta} d)",
|
||
"SetStartDate": "Set start date…",
|
||
"Hierarchy": "Hierarchy",
|
||
"LinkExistingSubIssue": "Link existing as sub-issue…",
|
||
"LinkExistingParentIssue": "Link existing as parent issue…",
|
||
"CreateNewSubIssue": "Create new sub-issue",
|
||
"CreateNewParentIssue": "Create new parent issue",
|
||
"AddParentIssue": "Add parent issue",
|
||
"AddSubIssue": "Add sub-issue",
|
||
"AddDependency": "Add dependency",
|
||
"AddPredecessor": "Add predecessor",
|
||
"AddSuccessor": "Add successor",
|
||
"AddPredecessorHint": "This issue depends on the picked one",
|
||
"AddSuccessorHint": "The picked issue depends on this one",
|
||
"SetParentIssueLabel": "Set parent issue…",
|
||
"GanttDragToSchedule": "Drag to schedule",
|
||
"GanttDurationTooltip": "Duration: {days} d",
|
||
"GanttConfirmMove": "Confirm before moving an issue",
|
||
"GanttConfirmResize": "Confirm before resizing an issue",
|
||
"GanttConfirmMoveTitle": "Move issue?",
|
||
"GanttConfirmResizeTitle": "Change issue dates?",
|
||
"GanttConfirmMoveBody": "Move {title} to {start} – {due}?",
|
||
"GanttConfirmResizeBody": "Change {title} to {start} – {due}?",
|
||
"GanttConfirmApply": "Apply",
|
||
"GanttAriaResizeStart": "Resize start date",
|
||
"GanttAriaResizeEnd": "Resize due date",
|
||
"DependencyKindFS": "Finish → Start",
|
||
"DependencyKindSS": "Start → Start",
|
||
"DependencyKindFF": "Finish → Finish",
|
||
"DependencyKindSF": "Start → Finish",
|
||
"DependencyLag": "Lag (days)",
|
||
"DependencyKind": "Type",
|
||
"DependencyDelete": "Delete dependency",
|
||
"DependencyDeleteConfirm": "Delete this dependency?",
|
||
"DependencyCycle": "This would create a circular dependency",
|
||
"DependencyEditTitle": "Edit dependency",
|
||
"DependencyKindHintFS": "Finish-to-Start: successor starts when predecessor finishes",
|
||
"DependencyKindHintSS": "Start-to-Start: successor starts when predecessor starts",
|
||
"DependencyKindHintFF": "Finish-to-Finish: successor finishes when predecessor finishes",
|
||
"DependencyKindHintSF": "Start-to-Finish: successor finishes when predecessor starts",
|
||
"DependencyPickKind": "Pick dependency type",
|
||
"DependencyChangeKind": "Change type",
|
||
"GanttShowPredecessors": "Show predecessors column",
|
||
"Predecessors": "Predecessors",
|
||
"NoPredecessors": "—",
|
||
"CascadeConfirmTitle": "{count, plural, one {1 issue will be shifted} other {# issues will be shifted}}",
|
||
"CascadeConfirmConfirm": "Confirm",
|
||
"CascadeConfirmCancel": "Cancel",
|
||
"CascadeBannerCycle": "Dependency cycle detected — cannot cascade. Resolve the cycle first.",
|
||
"CascadeBannerOverflow": "Cascade did not converge after {max} iterations — change rejected.",
|
||
"CascadeBannerBypass": "{count} successors may now violate constraints — Alt-drag bypassed cascade.",
|
||
"CascadeLockedSuccessors": "{count, plural, one {1 successor is locked} other {# successors are locked}} — you cannot edit them. Cancel and contact the owner.",
|
||
"CascadeSkippedUnscheduled": "{count, plural, one {1 other successor has no dates and was not shifted} other {# other successors have no dates and were not shifted}}",
|
||
"CascadeLegendPrimary": "Primary (you moved this)",
|
||
"CascadeLegendPush": "Push successor",
|
||
"CascadeLegendPull": "Pull predecessor",
|
||
"CascadeLegendOldNew": "Light = original / Solid = new",
|
||
"Dependencies": "Dependencies",
|
||
"GanttSuccessors": "Successors",
|
||
"CriticalPath": "Critical path",
|
||
"CriticalPathOn": "Show critical path",
|
||
"SlackColumn": "Slack column",
|
||
"Slack": "Slack",
|
||
"CriticalPathCycle": "Dependency cycle detected — critical path unavailable until resolved.",
|
||
"CriticalPathBadge": "CP",
|
||
"GanttHelpTitle": "Keyboard shortcuts",
|
||
"GanttHelpEsc": "Press Esc or ? to close",
|
||
"GanttExport": "Export to PNG",
|
||
"GanttExportFailed": "Export failed",
|
||
"GanttSidebarColumnsExtended": "Extended sidebar columns",
|
||
"GanttSidebarShowStatus": "Sidebar: show status",
|
||
"GanttSidebarShowPriority": "Sidebar: show priority",
|
||
"GanttSidebarShowAssignee": "Sidebar: show assignee",
|
||
"GanttSidebarShowEstimation": "Sidebar: show estimation",
|
||
"GanttSidebarShowStartDate": "Sidebar: show start date",
|
||
"GanttSidebarShowDueDate": "Sidebar: show due date",
|
||
"GanttSidebarShowDeadline": "Sidebar: show deadline",
|
||
"GanttSidebarShowProgress": "Sidebar: show progress",
|
||
"GanttSortBreaksHierarchy": "Sorting breaks the hierarchy view — sub-issues are detached from their parent.",
|
||
"GanttSidebarColIdentifier": "ID",
|
||
"GanttSidebarColTitle": "Title",
|
||
"GanttSidebarColStatus": "Status",
|
||
"GanttSidebarColPriority": "Priority",
|
||
"GanttSidebarColAssignee": "Assignee",
|
||
"GanttSidebarColEstimation": "Estimation",
|
||
"GanttSidebarColComponent": "Component",
|
||
"GanttSidebarColMilestone": "Milestone",
|
||
"GanttSidebarColPredecessors": "Predecessors",
|
||
"GanttSidebarColSlack": "Slack",
|
||
"GanttSidebarColStartDate": "Start",
|
||
"GanttSidebarColDueDate": "Due",
|
||
"GanttSidebarColDeadline": "Deadline",
|
||
"GanttSidebarColProgress": "Progress",
|
||
"GanttSidebarColModifiedOn": "Modified",
|
||
"GanttSidebarColCreatedOn": "Created",
|
||
"GanttGroupBy": "Group by",
|
||
"GanttGroupByNone": "None",
|
||
"GanttGroupByStatus": "Status",
|
||
"GanttGroupByPriority": "Priority",
|
||
"GanttGroupByAssignee": "Assignee",
|
||
"GanttGroupByComponent": "Component",
|
||
"GanttGroupByMilestone": "Milestone",
|
||
"GanttGroupByLabel": "Label",
|
||
"GanttColorBy": "Color by",
|
||
"GanttColorByStatus": "Status",
|
||
"GanttColorByPriority": "Priority",
|
||
"GanttColorByAssignee": "Assignee",
|
||
"GanttColorByComponent": "Component",
|
||
"GanttColorByMilestone": "Milestone",
|
||
"GanttColorByNone": "Uniform",
|
||
"GanttGroupOverridesHierarchy": "Group-By overrides hierarchy indentation. Set Group by to None to see the parent/child tree.",
|
||
"GanttUnassigned": "Unassigned",
|
||
"GanttNoComponent": "No component",
|
||
"GanttNoMilestone": "No milestone",
|
||
"GanttNoLabel": "No label",
|
||
"GanttUnknownGroup": "(unknown)",
|
||
"GanttAllIssues": "All issues",
|
||
"GanttFilter": "Filter",
|
||
"GanttFilterClear": "Clear filter",
|
||
"GanttFilterByStatus": "Status",
|
||
"GanttFilterByPriority": "Priority",
|
||
"GanttFilterByAssignee": "Assignee",
|
||
"GanttFilterEmpty": "No issues match the active filter",
|
||
"GanttUndo": "Undo",
|
||
"GanttRedo": "Redo",
|
||
"GanttUndoTooltip": "Undo: {description}",
|
||
"GanttRedoTooltip": "Redo: {description}",
|
||
"GanttUndoEmpty": "Nothing to undo",
|
||
"GanttRedoEmpty": "Nothing to redo",
|
||
"GanttUndoConflict": "Cannot undo: data was changed externally since this action",
|
||
"GanttUndoConflictHint": "The conflicting change has been kept; this undo step was dropped to avoid an infinite loop.",
|
||
"GanttUndoFailed": "Undo failed",
|
||
"GanttUndoDescMove": "Move {title} by {days} days",
|
||
"GanttUndoDescResize": "Resize {title}",
|
||
"GanttUndoDescCascade": "Cascade: {count} issues shifted",
|
||
"GanttUndoDescCreateDep": "Create dependency {source} → {target}",
|
||
"GanttUndoDescDeleteDep": "Delete dependency {source} → {target}",
|
||
"GanttUndoDescEditDep": "Edit dependency {source} → {target}",
|
||
"SchedulingMode": "Scheduling",
|
||
"SchedulingModeAuto": "Auto",
|
||
"SchedulingModeManual": "Manual",
|
||
"SchedulingModeHint": "Manual scheduling pins the dates of this issue. The cascade scheduler will never move it when a predecessor or successor is dragged. Toggle back to Auto to rejoin the cascade.",
|
||
"SchedulingModeTooltipAuto": "Auto schedule — cascade may shift this issue",
|
||
"SchedulingModeTooltipManual": "Manual schedule — protected from cascade",
|
||
"GanttBarManualPinTooltip": "Manual schedule — protected from cascade",
|
||
"GanttBulkSelectedCount": "{count} issues selected",
|
||
"GanttBulkBoundaryHit": "Drag stopped: a selected issue hit a predecessor boundary",
|
||
"GanttBulkClearSelection": "Press Esc to clear selection",
|
||
"AddedRelation": "added dependency",
|
||
"RemovedRelation": "removed dependency",
|
||
"UpdatedRelation": "updated dependency",
|
||
"GanttFullscreen": "Toggle fullscreen",
|
||
"GanttExportPng": "Export as PNG",
|
||
"GanttExportPdf": "Export as PDF",
|
||
"GanttMoreActions": "More actions",
|
||
"GanttToolbarMore": "More toolbar controls",
|
||
"GanttSavedViewLoad": "Load view…",
|
||
"GanttSavedViewLoadGroup": "Load saved view",
|
||
"GanttSavedViewLoadDefault": "Default (no saved view)",
|
||
"GanttSavedViewMine": "My views",
|
||
"GanttSavedViewShared": "Shared",
|
||
"GanttSavedViews": "Saved views",
|
||
"GanttSavedView": "Saved view",
|
||
"GanttSavedViewNew": "Save current view…",
|
||
"GanttSavedViewNamePlaceholder": "View name",
|
||
"GanttSavedViewFixTimeWindow": "Fix time window",
|
||
"GanttSavedViewFixTimeWindowHint": "Save the currently visible date range so this view always re-opens at the same anchor",
|
||
"GanttSavedViewPublic": "Share with workspace",
|
||
"GanttSavedViewSave": "Save view",
|
||
"GanttSavedViewUpdate": "Update view",
|
||
"GanttSavedViewModified": "Modified",
|
||
"GanttSavedViewDelete": "Delete view",
|
||
"GanttSavedViewEmpty": "No saved views yet",
|
||
"GanttSavedViewSelect": "View",
|
||
"GanttSavedViewDefault": "Default (none)",
|
||
"GanttMobileMenu": "Menu",
|
||
"GanttMobileOpenSidebar": "Open issue list",
|
||
"GanttMobileCloseSidebar": "Close issue list",
|
||
"GanttMobileReadOnly": "Mobile view is read-only — open on a larger screen to edit",
|
||
"GanttShowPastDueOverlay": "Show overdue overlay",
|
||
"GanttShowBlockedOverlay": "Show blocked overlay",
|
||
"GanttShowSubIssueProgress": "Show sub-issue progress",
|
||
"SearchEmptyTitle": "No issues found for \"{query}\"",
|
||
"SearchEmptyActiveFilters": "Active filters: {filters}",
|
||
"SearchEmptyClearFilters": "Search without filters",
|
||
"SearchEmptyAllProjects": "Search in all projects"
|
||
},
|
||
"status": {}
|
||
}
|