mirror of
https://github.com/hcengineering/platform.git
synced 2026-09-27 03:54: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
38 KiB
JSON
568 lines
38 KiB
JSON
{
|
||
"string": {
|
||
"TrackerApplication": "Трекер",
|
||
"Projects": "Проекты",
|
||
"More": "Больше",
|
||
"Default": "По умолчанию",
|
||
"MakeDefault": "Установить по умолчанию",
|
||
"Delete": "Удалить",
|
||
"Open": "Открыть",
|
||
"Members": "Участники",
|
||
"Inbox": "Входящие",
|
||
"ViewIssue": "Открыть задачу",
|
||
"IssueCreated": "Задача создана",
|
||
"MyIssues": "Мои задачи",
|
||
"Issues": "Задачи",
|
||
"Views": "Отображения",
|
||
"Active": "Активные",
|
||
"AllIssues": "Все задачи",
|
||
"ActiveIssues": "Активные задачи",
|
||
"BacklogIssues": "Пул задач",
|
||
"Backlog": "Пул задач",
|
||
"Board": "Канбан",
|
||
"Components": "Компоненты",
|
||
"AllComponents": "Все",
|
||
"BacklogComponents": "Пул задач",
|
||
"ActiveComponents": "Активные",
|
||
"ClosedComponents": "Закрытые",
|
||
"NewComponent": "Новый компонент",
|
||
"CreateComponent": "Создать компонент",
|
||
"ComponentNamePlaceholder": "Название компонента",
|
||
"ComponentDescriptionPlaceholder": "Описание (необязательно)",
|
||
"ComponentLead": "Руководитель",
|
||
"ComponentMembers": "Участники",
|
||
"StartDate": "Дата начала",
|
||
"TargetDate": "Дата завершения",
|
||
"Planned": "Запланирован",
|
||
"InProgress": "В работе",
|
||
"Paused": "Приостановлен",
|
||
"Completed": "Завершен",
|
||
"Canceled": "Отменено",
|
||
"CreateProject": "Новый проект",
|
||
"NewProject": "Новый проект",
|
||
"ProjectTitle": "Название проекта",
|
||
"ProjectTitlePlaceholder": "Новый проект",
|
||
"UsedInIssueIDs": "Используется в идентификаторах задач",
|
||
"Identifier": "Идентификатор",
|
||
"Import": "Импорт",
|
||
"ProjectIdentifier": "Идентификатор проекта",
|
||
"IdentifierExists": "Идентификатор уже существует проекта",
|
||
"ProjectIdentifierPlaceholder": "ПКТ",
|
||
"ChooseIcon": "Выбрать иконку",
|
||
"AddIssue": "Добавить задачу",
|
||
"NewIssue": "Новая задача",
|
||
"NewIssuePlaceholder": "Новая",
|
||
"ResumeDraft": "Восстановить черновик",
|
||
"SaveIssue": "Создать задачу",
|
||
"SetPriority": "Установить приоритет\u2026",
|
||
"SetStatus": "Установить статус\u2026",
|
||
"SelectIssue": "Выбрать задачу",
|
||
"Priority": "Приоритет",
|
||
"NoPriority": "Нет приоритета",
|
||
"Urgent": "Наивысший",
|
||
"High": "Высокий",
|
||
"Medium": "Средний",
|
||
"Low": "Низкий",
|
||
"Unassigned": "Не назначен",
|
||
"Back": "Назад",
|
||
"List": "Список",
|
||
"NumberLabels": "{count, plural, =0 {нет меток} one {# метка} few {# метки} other {# меток}}",
|
||
|
||
"CategoryBacklog": "Пул",
|
||
"CategoryUnstarted": "Не запущенные",
|
||
"CategoryStarted": "Запущенный",
|
||
"CategoryCompleted": "Завершенные",
|
||
"CategoryCanceled": "Отменённые",
|
||
|
||
"Title": "Заголовок",
|
||
"Name": "Имя",
|
||
"Description": "Описание",
|
||
"Status": "Статус",
|
||
"Number": "Номер",
|
||
"Assignee": "Исполнитель",
|
||
"AssignTo": "Назначить...",
|
||
"AssignedTo": "Назначен на {value}",
|
||
"Parent": "Родительская задача",
|
||
"SetParent": "Задать родительскую задачу\u2026",
|
||
"ChangeParent": "Изменить родительскую задачу\u2026",
|
||
"RemoveParent": "Удалить родительскую задачу",
|
||
"OpenParent": "Открыть родительскую задачу",
|
||
"SubIssues": "Подзадачи",
|
||
"SubIssuesList": "Подзадачи ({subIssues})",
|
||
"OpenSubIssues": "Открыть подзадачи",
|
||
"AddSubIssues": "Добавить подзадачу",
|
||
"BlockedBy": "Блокируется",
|
||
"RelatedTo": "Связано",
|
||
"Comments": "Комментарии",
|
||
"Attachments": "Вложения",
|
||
"Labels": "Метки",
|
||
"Component": "Компонент",
|
||
"Space": "",
|
||
"SetDueDate": "Указать срок выполнения\u2026",
|
||
"ChangeDueDate": "Изменить срок выполнения\u2026",
|
||
"ModificationDate": "Изменено {value}",
|
||
"Project": "Проект",
|
||
"Issue": "Задача",
|
||
"SubIssue": "Подзадача",
|
||
"Document": "",
|
||
"DocumentIcon": "",
|
||
"DocumentColor": "",
|
||
"Rank": "Ранг",
|
||
"TypeIssuePriority": "Приоритет задачи",
|
||
"IssueTitlePlaceholder": "Имя задачи",
|
||
"SubIssueTitlePlaceholder": "Имя подзадачи",
|
||
"IssueDescriptionPlaceholder": "Добавить описание\u2026",
|
||
"SubIssueDescriptionPlaceholder": "Описание подзадачи",
|
||
"AddIssueTooltip": "Добавить задачу\u2026",
|
||
"NewIssueDialogClose": "Вы действительно хотите закрыть окно?",
|
||
"NewIssueDialogCloseNote": "Все внесенные изменения будут потеряны",
|
||
"RemoveComponentDialogClose": "Удалить компонент?",
|
||
"RemoveComponentDialogCloseNote": "Уверены, что хотите удалить этот компонент? Эта операция не может быть отменена.",
|
||
"Grouping": "Группировка",
|
||
"Ordering": "Сортировка",
|
||
"CompletedIssues": "Завершённые задачи",
|
||
"NoGrouping": "Нет группировки",
|
||
"NoAssignee": "Нет исполнителя",
|
||
"LastUpdated": "Последнее обновление",
|
||
"DueDate": "Срок",
|
||
"IssueStartDate": "Дата начала",
|
||
"GanttDependency": "Dependency",
|
||
"GanttLag": "Lag",
|
||
"WorkingDaysConfig": "Рабочие дни",
|
||
"WorkingDaysTitle": "Рабочие дни",
|
||
"WorkingDaysDescription": "Укажите, какие дни недели считаются рабочими. Если настроено, задержка и резерв рассчитываются в рабочих днях, а выходные и праздники затеняются на диаграмме Ганта.",
|
||
"WorkingDaysWeekday": "Рабочие дни недели",
|
||
"WorkingDaysHolidays": "Праздники",
|
||
"WorkingDaysNotConfigured": "Не настроено — используются календарные дни",
|
||
"WorkingDaysEnable": "Режим рабочих дней",
|
||
"WorkingDaysDepartment": "Календарь праздников",
|
||
"WorkingDaysCompanyWide": "Для всей компании",
|
||
"WorkingDaysAtLeastOneDay": "Хотя бы один рабочий день должен оставаться активным",
|
||
"WorkingDayMon": "Пн",
|
||
"WorkingDayTue": "Вт",
|
||
"WorkingDayWed": "Ср",
|
||
"WorkingDayThu": "Чт",
|
||
"WorkingDayFri": "Пт",
|
||
"WorkingDaySat": "Сб",
|
||
"WorkingDaySun": "Вс",
|
||
"Manual": "Пользовательский",
|
||
"All": "Все",
|
||
"PastWeek": "Предыдущая неделя",
|
||
"PastMonth": "Предыдущий месяц",
|
||
"CopyIssueUrl": "Копировать URL-адрес задачи в буфер обмена",
|
||
"CopyIssueId": "Копировать ID задачи в буфер обмена",
|
||
"CopyIssueBranch": "Копировать имя ветки Git в буфер обмена",
|
||
"CopyIssueTitle": "Копировать имя задачи в буфер обмена",
|
||
"AssetLabel": "Asset",
|
||
"AddToComponent": "Добавить в компонент\u2026",
|
||
"MoveToComponent": "Переместить в компонент\u2026",
|
||
"NoComponent": "Без компонента",
|
||
"ComponentLeadTitle": "Руководитель компонента",
|
||
"ComponentMembersTitle": "Участники компонента",
|
||
"ComponentLeadSearchPlaceholder": "Назначьте руководителя компонента\u2026",
|
||
"ComponentMembersSearchPlaceholder": "Изменить участников компонента\u2026",
|
||
"MoveToProject": "Изменить проект",
|
||
"Duplicate": "Дублировать",
|
||
|
||
"GotoIssues": "Перейти к задачам",
|
||
"GotoActive": "Перейти к активным задачам",
|
||
"GotoBacklog": "Перейти к пулу задач",
|
||
"GotoComponents": "Перейти к компоненту",
|
||
"GotoMyIssues": "Перейти к моим задачам",
|
||
"GotoTrackerApplication": "Перейти к приложению Трекер",
|
||
|
||
"CreatedOne": "Создана",
|
||
"MoveIssues": "Переместить задачи",
|
||
"MoveIssuesDescription": "Выберите проект, в который вы хотите переместить задачи",
|
||
"ManageAttributes": "Управление атрибутами",
|
||
"KeepOriginalAttributes": "Оставить оригинальные аттрибуты",
|
||
"KeepOriginalAttributesTooltip": "Оригинальные статусы и компоненты будут сохранены в новом проекте",
|
||
"SelectReplacement": "Следующие элементы не доступны в новом проекте. Выберите замену.",
|
||
"MissingItem": "ОТСУТСТВУЮЩИЙ ЭЛЕМЕНТ",
|
||
"Replacement": "ЗАМЕНА",
|
||
"Original": "ОРИГИНАЛ",
|
||
"OriginalDescription": "Элементы из этой секции будут созданы в новом проекте",
|
||
|
||
"Relations": "Зависимости",
|
||
"RemoveRelation": "Удалить зависимость...",
|
||
"AddBlockedBy": "Отметить как блокируемую...",
|
||
"AddIsBlocking": "Отметить как блокирующую...",
|
||
"AddRelatedIssue": "Связать с задачей...",
|
||
"RelatedIssue": "Связанная задача {id} - {title}",
|
||
"BlockedIssue": "Блокируемая задача {id} - {title}",
|
||
"BlockingIssue": "Блокирующая {id} - {title}",
|
||
"BlockedBySearchPlaceholder": "Поиск блокирующей задачи...",
|
||
"IsBlockingSearchPlaceholder": "Поиск блокируемой задачи...",
|
||
"RelatedIssueSearchPlaceholder": "Поиск связанной задачи...",
|
||
"Blocks": "Блокирует",
|
||
"Related": "Связан",
|
||
"RelatedIssues": "Связанные задачи",
|
||
|
||
"EditIssue": "Редактирование {title}",
|
||
"EditWorkflowStatuses": "Редактировать статусы задач",
|
||
"EditProject": "Редактировать проект",
|
||
"DeleteProject": "Удалить проект",
|
||
"ArchiveProjectName": "Архивировать проект {name}?",
|
||
"ArchiveProjectConfirm": "Вы действительно хотите заархивировать этот проект?",
|
||
"DeleteProjectConfirm": "Вы действительно хотите удалить этот проект со всем содержимым?",
|
||
"ProjectHasIssues": "Для данного проекта существуют задачи, уверены, что хотите заархивировать?",
|
||
"ManageWorkflowStatuses": "Управлять типами проекта",
|
||
"AddWorkflowStatus": "Добавить статус задачи",
|
||
"EditWorkflowStatus": "Редактировать статус задачи",
|
||
"DeleteWorkflowStatus": "Удалить статус задачи",
|
||
"DeleteWorkflowStatusConfirm": "Вы действительно хотите удалить \"{status}\" статус?",
|
||
"DeleteWorkflowStatusErrorDescription": "Статус \"{status}\" {count, plural, one {имеет # задача} few {имеет $ задачи} other {имеют # задач}}. Пожалуйста, выберите статус для перемещения.",
|
||
|
||
"Save": "Сохранить",
|
||
"IncludeItemsThatMatch": "Включить элементы, которые соответствуют",
|
||
"AnyFilter": "любому фильтру",
|
||
"AllFilters": "всем фильтрам",
|
||
"NoDescription": "Нет описания",
|
||
"SearchIssue": "Поиск задачи...",
|
||
|
||
"StatusHistory": "История состояний",
|
||
"NewSubIssue": "Добавить подзадачу...",
|
||
"AddLabel": "Добавить метку",
|
||
|
||
"DeleteIssue": "Удалить {issueCount, plural, =1 {задачу} one {# задачу} few {# задачи} other {задач}}",
|
||
"DeleteIssueConfirm": "Вы действительно хотите удалить {issueCount, plural, =1 {задачу} one {# задачу} few {# задачи} other {задач}}{subIssueCount, plural, =0 {?} =1 { и подзадачу?} one { и # подзадачу?} other { и # подзадач?}}",
|
||
|
||
"Milestone": "Этап",
|
||
"NoMilestone": "Без Этапа",
|
||
"MoveToMilestone": "Выбрать Этап",
|
||
"Milestones": "Этапы",
|
||
"AllMilestones": "Все",
|
||
"PlannedMilestones": "Запланировано",
|
||
"ActiveMilestones": "Активно",
|
||
"ClosedMilestones": "Завершено",
|
||
"AddToMilestone": "Добавить в Этап",
|
||
"MilestoneNamePlaceholder": "Название Этапа",
|
||
|
||
"NewMilestone": "Новый Этап",
|
||
"CreateMilestone": "Создать",
|
||
|
||
"MoveAndDeleteMilestone": "Переместить Задачи в {newMilestone} и Удалить {deleteMilestone}",
|
||
"MoveAndDeleteMilestoneConfirm": "Вы действительно хотите удалить этап и перенести задачи в другой?",
|
||
|
||
"Estimation": "Оценка",
|
||
"ReportedTime": "Потраченное времени",
|
||
"RemainingTime": "Осталось времени",
|
||
"TimeSpendReports": "Отчеты по времени",
|
||
"TimeSpendReport": "Время",
|
||
"TimeSpendReportAdd": "Добавить затраченное время",
|
||
"TimeSpendReportDate": "Дата",
|
||
"TimeSpendReportValue": "Затраченное время",
|
||
"TimeSpendReportValueTooltip": "Затраченное время в человеко днях",
|
||
"TimeSpendReportDescription": "Описание",
|
||
"TimeSpendDays": "{value} д",
|
||
"TimeSpendHours": "{value} ч",
|
||
"TimeSpendMinutes": "{value} м",
|
||
"ChildEstimation": "Оценка подзадач",
|
||
"ChildReportedTime": "Время подзадач",
|
||
"CapacityValue": "из {value} д",
|
||
"NewRelatedIssue": "Завести связанную задачу",
|
||
"RelatedIssuesNotFound": "Связанные задачи не найдены",
|
||
|
||
"AddedReference": "Добавлена зависимость",
|
||
"AddedAsBlocked": "Отмечено как заблокировано",
|
||
"AddedAsBlocking": "Отмечено как блокирующее",
|
||
|
||
"IssueTemplate": "Шаблон",
|
||
"IssueTemplates": "Шаблоны",
|
||
"NewProcess": "Новый шаблон",
|
||
"SaveProcess": "Сохранить шаблон",
|
||
"NoIssueTemplate": "Шаблон не задан",
|
||
"TemplateReplace": "Вы хотите применить выбранный шаблон?",
|
||
"TemplateReplaceConfirm": "Все внесенные изменения в будут заменены значениями из нового шаблона",
|
||
"Apply": "Применить",
|
||
|
||
"CurrentWorkDay": "Текущий Рабочий День",
|
||
"PreviousWorkDay": "Предыдущий Рабочий День",
|
||
"TimeReportDayTypeLabel": "Выберите тип дня для временного отчета",
|
||
"DefaultAssignee": "Исполнитель задачи по умолчанию",
|
||
|
||
"SevenHoursLength": "Семь Часов",
|
||
"EightHoursLength": "Восемь Часов",
|
||
"HourLabel": "ч",
|
||
"MinuteLabel": "м",
|
||
"Saved": "Сохранено...",
|
||
"CreatedIssue": "Создал(а) задачу",
|
||
"CreatedSubIssue": "Создал(а) подзадачу",
|
||
"ChangeStatus": "Изменение статуса",
|
||
"ConfigLabel": "Трекер",
|
||
"ConfigDescription": "Расширение по управлению задачами, чтобы все было в срок.",
|
||
"NoStatusFound": "Статус не найдет",
|
||
"CreateMissingStatus": "Создать отсутствующий статус",
|
||
"UnsetParent": "Родительская задача будет убрана",
|
||
"AllProjects": "Все проекты",
|
||
"IssueNotificationTitle": "{issueTitle}",
|
||
"IssueNotificationBody": "Обновлено {senderName}",
|
||
"IssueNotificationChanged": "{senderName} изменил {property}",
|
||
"IssueNotificationChangedProperty": "{senderName} изменил {property} на \"{newValue}\"",
|
||
"IssueNotificationMessage": "{senderName}: {message}",
|
||
"PreviousAssigned": "Ранее назначенные",
|
||
"IssueAssignedToYou": "Назначено вам",
|
||
"RelatedIssueTargetDescription": "Настройка проекта по умолчанию для Класса или пространства",
|
||
"MapRelatedIssues": "Настроить проекты по умолчанию для связанных задач",
|
||
"DefaultIssueStatus": "Статус по умолчанию",
|
||
"IssueStatus": "Статус",
|
||
"Extensions": "Дополнительно",
|
||
"UnsetParentIssue": "Снять родительскую задачу",
|
||
"ForbidCreateProjectPermission": "Запретить создание проекта",
|
||
"ForbidCreateProjectPermissionDescription": "Запрещает пользователям создавать новые проекты",
|
||
"Deadline": "Крайний срок",
|
||
"BarLabelNone": "Нет",
|
||
"BarLabelTitle": "Заголовок",
|
||
"BarLabelIdentifier": "Идентификатор",
|
||
"BarLabelAssignee": "Исполнитель",
|
||
"BarLabelPriority": "Приоритет",
|
||
"BarLabelStatus": "Статус",
|
||
"BarLabelEstimation": "Оценка",
|
||
"BarLabelProgress": "Прогресс",
|
||
"GanttBarLabelLeft": "Подпись полосы (слева)",
|
||
"GanttBarLabelInside": "Подпись полосы (внутри)",
|
||
"GanttBarLabelRight": "Подпись полосы (справа)",
|
||
"GanttQuickInfoOnClick": "Одиночный клик открывает окно быстрого просмотра",
|
||
"QuickInfoOpenFullEditor": "Открыть полный редактор",
|
||
"DependencyShifted": "Зависимость сдвинута",
|
||
"DependencyShiftedHeader": "{sender} сдвинул(а) {trigger}",
|
||
"DependencyShiftedMessage": "{count, plural, one {перемещена # зависимая задача} few {перемещены # зависимые задачи} other {перемещено # зависимых задач}}",
|
||
"DependencyShiftedSubject": "Сдвиг зависимостей",
|
||
"Color": "Цвет",
|
||
"AllowCreatingIssues": "Разрешить создание задач",
|
||
"Day": "День",
|
||
"Week": "Неделя",
|
||
"Month": "Месяц",
|
||
"Quarter": "Квартал",
|
||
"Gantt": "Диаграмма Ганта",
|
||
"GanttShowIssueCode": "Показать код задачи",
|
||
"GanttShowTitle": "Показать заголовок",
|
||
"GanttShowStatus": "Показать статус",
|
||
"GanttToday": "Сегодня",
|
||
"GanttJumpToStart": "Перейти к началу",
|
||
"GanttJumpToEnd": "Перейти к концу",
|
||
"GanttJumpToDate": "Перейти к дате",
|
||
"GanttZoomDay": "День",
|
||
"GanttZoomWeek": "Неделя",
|
||
"GanttZoomMonth": "Месяц",
|
||
"GanttZoomQuarter": "Квартал",
|
||
"GanttZoomCustom": "Другой",
|
||
"GanttZoomLabel": "Масштаб",
|
||
"GanttZoomVisibleDays": "{days, plural, one {# день} few {# дня} other {# дней}}",
|
||
"GanttZoomDaysSuffix": "дн.",
|
||
"GanttZoomDaysAria": "Видимых дней в области просмотра",
|
||
"GanttPreviousPeriod": "Предыдущий период",
|
||
"GanttNextPeriod": "Следующий период",
|
||
"GanttScrollLeftToBar": "Прокрутить влево к полосе",
|
||
"GanttScrollRightToBar": "Прокрутить вправо к полосе",
|
||
"GanttExpand": "Развернуть",
|
||
"GanttCollapse": "Свернуть",
|
||
"GanttExpandAll": "Развернуть все",
|
||
"GanttCollapseAll": "Свернуть все",
|
||
"GanttCornerNoOpInSwimlane": "Не действует в режиме группировки",
|
||
"ModeSelectorDisabledByFilter": "Статус задаётся активным фильтром. Уберите фильтр по статусу, чтобы воспользоваться этим переключателем.",
|
||
"ShowQuickModeSelector": "Быстрый фильтр: Все / Активные / Пул задач",
|
||
"SearchScopeLabel": "Искать в…",
|
||
"SearchScopeTitle": "Только заголовок",
|
||
"SearchScopeTitleDescription": "Заголовок + описание",
|
||
"SearchScopeAll": "Заголовок + описание + комментарии",
|
||
"SearchHighlight": "Подсвечивать совпадения",
|
||
"GanttTreeBreadcrumb": "Родитель найденной задачи",
|
||
"GanttArrowIndicatorSourceAbove": "Исходная строка выше области просмотра — нажмите для прокрутки",
|
||
"GanttArrowIndicatorSourceBelow": "Исходная строка ниже области просмотра — нажмите для прокрутки",
|
||
"GanttArrowIndicatorTargetAbove": "Целевая строка выше области просмотра — нажмите для прокрутки",
|
||
"GanttArrowIndicatorTargetBelow": "Целевая строка ниже области просмотра — нажмите для прокрутки",
|
||
"GanttDragConflict": "Задача была изменена другим пользователем, повторите попытку",
|
||
"GanttDragFailed": "Не удалось применить изменение на диаграмме Ганта",
|
||
"GanttDragNoPermission": "У вас нет прав на редактирование этой задачи",
|
||
"GanttDragValidation": "Недопустимая дата: {reason}",
|
||
"GanttResizingTooltip": "{from} дн. → {to} дн. ({delta} дн.)",
|
||
"SetStartDate": "Указать дату начала…",
|
||
"Hierarchy": "Иерархия",
|
||
"LinkExistingSubIssue": "Связать существующую как подзадачу…",
|
||
"LinkExistingParentIssue": "Связать существующую как родительскую задачу…",
|
||
"CreateNewSubIssue": "Создать подзадачу",
|
||
"CreateNewParentIssue": "Создать родительскую задачу",
|
||
"AddParentIssue": "Добавить родительскую задачу",
|
||
"AddSubIssue": "Добавить подзадачу",
|
||
"AddDependency": "Добавить зависимость",
|
||
"AddPredecessor": "Добавить предшественника",
|
||
"AddSuccessor": "Добавить последователя",
|
||
"AddPredecessorHint": "Эта задача зависит от выбранной",
|
||
"AddSuccessorHint": "Выбранная задача зависит от этой",
|
||
"SetParentIssueLabel": "Указать родительскую задачу…",
|
||
"GanttDragToSchedule": "Перетащите, чтобы задать сроки",
|
||
"GanttDurationTooltip": "Длительность: {days} дн.",
|
||
"GanttConfirmMove": "Подтверждать перемещение задачи",
|
||
"GanttConfirmResize": "Подтверждать изменение длительности задачи",
|
||
"GanttConfirmMoveTitle": "Переместить задачу?",
|
||
"GanttConfirmResizeTitle": "Изменить сроки задачи?",
|
||
"GanttConfirmMoveBody": "Переместить {title} на {start} – {due}?",
|
||
"GanttConfirmResizeBody": "Изменить {title} на {start} – {due}?",
|
||
"GanttConfirmApply": "Применить",
|
||
"GanttAriaResizeStart": "Изменить дату начала",
|
||
"GanttAriaResizeEnd": "Изменить срок выполнения",
|
||
"DependencyKindFS": "Окончание → Начало",
|
||
"DependencyKindSS": "Начало → Начало",
|
||
"DependencyKindFF": "Окончание → Окончание",
|
||
"DependencyKindSF": "Начало → Окончание",
|
||
"DependencyLag": "Задержка (дни)",
|
||
"DependencyKind": "Тип",
|
||
"DependencyDelete": "Удалить зависимость",
|
||
"DependencyDeleteConfirm": "Удалить эту зависимость?",
|
||
"DependencyCycle": "Это создаст циклическую зависимость",
|
||
"DependencyEditTitle": "Изменить зависимость",
|
||
"DependencyKindHintFS": "Окончание-Начало: последователь начинается после окончания предшественника",
|
||
"DependencyKindHintSS": "Начало-Начало: последователь начинается вместе с предшественником",
|
||
"DependencyKindHintFF": "Окончание-Окончание: последователь завершается вместе с предшественником",
|
||
"DependencyKindHintSF": "Начало-Окончание: последователь завершается после начала предшественника",
|
||
"DependencyPickKind": "Выберите тип зависимости",
|
||
"DependencyChangeKind": "Изменить тип",
|
||
"GanttShowPredecessors": "Показать столбец предшественников",
|
||
"Predecessors": "Предшественники",
|
||
"NoPredecessors": "—",
|
||
"CascadeConfirmTitle": "{count, plural, one {будет сдвинута # задача} few {будут сдвинуты # задачи} other {будет сдвинуто # задач}}",
|
||
"CascadeConfirmConfirm": "Подтвердить",
|
||
"CascadeConfirmCancel": "Отменить",
|
||
"CascadeBannerCycle": "Обнаружен цикл зависимостей — каскадный сдвиг невозможен. Сначала устраните цикл.",
|
||
"CascadeBannerOverflow": "Каскадный сдвиг не сошёлся за {max} итераций — изменение отклонено.",
|
||
"CascadeBannerBypass": "Последователей, которые могут нарушать ограничения: {count} — перетаскивание с Alt обошло каскадный сдвиг.",
|
||
"CascadeLockedSuccessors": "{count, plural, one {# последователь заблокирован} few {# последователя заблокированы} other {# последователей заблокировано}} — вы не можете их изменить. Отмените действие и обратитесь к владельцу.",
|
||
"CascadeSkippedUnscheduled": "{count, plural, one {ещё у # последователя нет дат, он не был сдвинут} few {ещё у # последователей нет дат, они не были сдвинуты} other {ещё у # последователей нет дат, они не были сдвинуты}}",
|
||
"CascadeLegendPrimary": "Основная (перемещена вами)",
|
||
"CascadeLegendPush": "Сдвиг последователя",
|
||
"CascadeLegendPull": "Подтягивание предшественника",
|
||
"CascadeLegendOldNew": "Светлая = исходная / Сплошная = новая",
|
||
"Dependencies": "Зависимости",
|
||
"GanttSuccessors": "Последователи",
|
||
"CriticalPath": "Критический путь",
|
||
"CriticalPathOn": "Показать критический путь",
|
||
"SlackColumn": "Столбец резерва",
|
||
"Slack": "Резерв",
|
||
"CriticalPathCycle": "Обнаружен цикл зависимостей — критический путь недоступен, пока он не устранён.",
|
||
"CriticalPathBadge": "КП",
|
||
"GanttHelpTitle": "Сочетания клавиш",
|
||
"GanttHelpEsc": "Нажмите Esc или ?, чтобы закрыть",
|
||
"GanttExport": "Экспорт в PNG",
|
||
"GanttExportFailed": "Не удалось выполнить экспорт",
|
||
"GanttSidebarColumnsExtended": "Расширенные столбцы боковой панели",
|
||
"GanttSidebarShowStatus": "Боковая панель: показать статус",
|
||
"GanttSidebarShowPriority": "Боковая панель: показать приоритет",
|
||
"GanttSidebarShowAssignee": "Боковая панель: показать исполнителя",
|
||
"GanttSidebarShowEstimation": "Боковая панель: показать оценку",
|
||
"GanttSidebarShowStartDate": "Боковая панель: показать дату начала",
|
||
"GanttSidebarShowDueDate": "Боковая панель: показать срок",
|
||
"GanttSidebarShowDeadline": "Боковая панель: показать крайний срок",
|
||
"GanttSidebarShowProgress": "Боковая панель: показать прогресс",
|
||
"GanttSortBreaksHierarchy": "Сортировка нарушает иерархию — подзадачи отделяются от родительской задачи.",
|
||
"GanttSidebarColIdentifier": "ID",
|
||
"GanttSidebarColTitle": "Заголовок",
|
||
"GanttSidebarColStatus": "Статус",
|
||
"GanttSidebarColPriority": "Приоритет",
|
||
"GanttSidebarColAssignee": "Исполнитель",
|
||
"GanttSidebarColEstimation": "Оценка",
|
||
"GanttSidebarColComponent": "Компонент",
|
||
"GanttSidebarColMilestone": "Этап",
|
||
"GanttSidebarColPredecessors": "Предшественники",
|
||
"GanttSidebarColSlack": "Резерв",
|
||
"GanttSidebarColStartDate": "Начало",
|
||
"GanttSidebarColDueDate": "Срок",
|
||
"GanttSidebarColDeadline": "Крайний срок",
|
||
"GanttSidebarColProgress": "Прогресс",
|
||
"GanttSidebarColModifiedOn": "Изменено",
|
||
"GanttSidebarColCreatedOn": "Создано",
|
||
"GanttGroupBy": "Группировать по",
|
||
"GanttGroupByNone": "Нет",
|
||
"GanttGroupByStatus": "Статус",
|
||
"GanttGroupByPriority": "Приоритет",
|
||
"GanttGroupByAssignee": "Исполнитель",
|
||
"GanttGroupByComponent": "Компонент",
|
||
"GanttGroupByMilestone": "Этап",
|
||
"GanttGroupByLabel": "Метка",
|
||
"GanttColorBy": "Цвет по",
|
||
"GanttColorByStatus": "Статус",
|
||
"GanttColorByPriority": "Приоритет",
|
||
"GanttColorByAssignee": "Исполнитель",
|
||
"GanttColorByComponent": "Компонент",
|
||
"GanttColorByMilestone": "Этап",
|
||
"GanttColorByNone": "Однотонный",
|
||
"GanttGroupOverridesHierarchy": "Группировка заменяет отступы иерархии. Установите «Группировать по» в «Нет», чтобы увидеть дерево родителей и подзадач.",
|
||
"GanttUnassigned": "Не назначен",
|
||
"GanttNoComponent": "Без компонента",
|
||
"GanttNoMilestone": "Без этапа",
|
||
"GanttNoLabel": "Без метки",
|
||
"GanttUnknownGroup": "(неизвестно)",
|
||
"GanttAllIssues": "Все задачи",
|
||
"GanttFilter": "Фильтр",
|
||
"GanttFilterClear": "Очистить фильтр",
|
||
"GanttFilterByStatus": "Статус",
|
||
"GanttFilterByPriority": "Приоритет",
|
||
"GanttFilterByAssignee": "Исполнитель",
|
||
"GanttFilterEmpty": "Нет задач, соответствующих активному фильтру",
|
||
"GanttUndo": "Отменить",
|
||
"GanttRedo": "Повторить",
|
||
"GanttUndoTooltip": "Отменить: {description}",
|
||
"GanttRedoTooltip": "Повторить: {description}",
|
||
"GanttUndoEmpty": "Нечего отменять",
|
||
"GanttRedoEmpty": "Нечего повторять",
|
||
"GanttUndoConflict": "Отмена невозможна: данные были изменены извне после этого действия",
|
||
"GanttUndoConflictHint": "Конфликтующее изменение сохранено; этот шаг отмены пропущен, чтобы избежать бесконечного цикла.",
|
||
"GanttUndoFailed": "Не удалось отменить действие",
|
||
"GanttUndoDescMove": "Перемещение {title} на {days} дн.",
|
||
"GanttUndoDescResize": "Изменение длительности {title}",
|
||
"GanttUndoDescCascade": "Каскадный сдвиг: сдвинуто задач — {count}",
|
||
"GanttUndoDescCreateDep": "Создание зависимости {source} → {target}",
|
||
"GanttUndoDescDeleteDep": "Удаление зависимости {source} → {target}",
|
||
"GanttUndoDescEditDep": "Изменение зависимости {source} → {target}",
|
||
"SchedulingMode": "Планирование",
|
||
"SchedulingModeAuto": "Авто",
|
||
"SchedulingModeManual": "Вручную",
|
||
"SchedulingModeHint": "Ручное планирование закрепляет даты этой задачи. Каскадный планировщик никогда не будет её перемещать при перетаскивании предшественника или последователя. Переключитесь обратно на «Авто», чтобы вернуть задачу в каскад.",
|
||
"SchedulingModeTooltipAuto": "Автоматическое планирование — каскад может сдвинуть эту задачу",
|
||
"SchedulingModeTooltipManual": "Ручное планирование — защищено от каскада",
|
||
"GanttBarManualPinTooltip": "Ручное планирование — защищено от каскада",
|
||
"GanttBulkSelectedCount": "Выбрано задач: {count}",
|
||
"GanttBulkBoundaryHit": "Перетаскивание остановлено: выбранная задача достигла границы предшественника",
|
||
"GanttBulkClearSelection": "Нажмите Esc, чтобы снять выделение",
|
||
"AddedRelation": "добавил(а) зависимость",
|
||
"RemovedRelation": "удалил(а) зависимость",
|
||
"UpdatedRelation": "обновил(а) зависимость",
|
||
"GanttFullscreen": "Полноэкранный режим",
|
||
"GanttExportPng": "Экспортировать в PNG",
|
||
"GanttExportPdf": "Экспортировать в PDF",
|
||
"GanttMoreActions": "Ещё действия",
|
||
"GanttToolbarMore": "Другие элементы панели",
|
||
"GanttSavedViewLoad": "Загрузить отображение…",
|
||
"GanttSavedViewLoadGroup": "Загрузить сохранённое отображение",
|
||
"GanttSavedViewLoadDefault": "По умолчанию (без сохранённого отображения)",
|
||
"GanttSavedViewMine": "Мои отображения",
|
||
"GanttSavedViewShared": "Общие",
|
||
"GanttSavedViews": "Сохранённые отображения",
|
||
"GanttSavedView": "Сохранённое отображение",
|
||
"GanttSavedViewNew": "Сохранить текущее отображение…",
|
||
"GanttSavedViewNamePlaceholder": "Название отображения",
|
||
"GanttSavedViewFixTimeWindow": "Зафиксировать период",
|
||
"GanttSavedViewFixTimeWindowHint": "Сохранить текущий видимый диапазон дат, чтобы отображение всегда открывалось на той же позиции",
|
||
"GanttSavedViewPublic": "Поделиться с рабочим пространством",
|
||
"GanttSavedViewSave": "Сохранить отображение",
|
||
"GanttSavedViewUpdate": "Обновить отображение",
|
||
"GanttSavedViewModified": "Изменено",
|
||
"GanttSavedViewDelete": "Удалить отображение",
|
||
"GanttSavedViewEmpty": "Сохранённых отображений пока нет",
|
||
"GanttSavedViewSelect": "Отображение",
|
||
"GanttSavedViewDefault": "По умолчанию (нет)",
|
||
"GanttMobileMenu": "Меню",
|
||
"GanttMobileOpenSidebar": "Открыть список задач",
|
||
"GanttMobileCloseSidebar": "Закрыть список задач",
|
||
"GanttMobileReadOnly": "Мобильная версия доступна только для чтения — откройте на экране большего размера, чтобы редактировать",
|
||
"GanttShowPastDueOverlay": "Показывать просроченные",
|
||
"GanttShowBlockedOverlay": "Показывать заблокированные",
|
||
"GanttShowSubIssueProgress": "Показывать прогресс подзадач",
|
||
"SearchEmptyTitle": "Не найдено задач по запросу «{query}»",
|
||
"SearchEmptyActiveFilters": "Активные фильтры: {filters}",
|
||
"SearchEmptyClearFilters": "Искать без фильтров",
|
||
"SearchEmptyAllProjects": "Искать во всех проектах"
|
||
},
|
||
"status": {}
|
||
}
|