Files
huly-platform/plugins/tracker-assets/lang/ru.json
T
1be6047c8a feat(tracker): field-prefixed search, inline filter chips and zero-hit empty state (#10998)
* feat(tracker): field-prefixed search, inline filter chips and zero-hit empty state

Adds SearchInputAdvanced (field:value prefixes routed to Elasticsearch query_string), match highlighting, inline filter chips with overflow popover, a reusable zero-hit empty state in view-resources, and search-scope/highlight view options for List and Kanban.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* refactor(tracker-search): address review follow-ups on search/filter rework

Shared, non-storage-specific field list, test-folder conventions, locale
coverage, single regex source and an owner-token gate for the result count.

- core: add shared `fullTextSearchFields` constant next to
  FullTextSearchContext as the single source of truth for the full-text
  fields exposed to `field:value` targeting. The client encoder derives
  ES_NATIVE_FIELDS from it and the elastic adapter derives KNOWN_FIELD_RE
  from it, replacing the two "KEEP IN SYNC" copies. Per-field boost weights
  stay a local adapter detail.
- tests: move the five co-located tests into each package's existing test
  folder convention (ui `__test__`, view-resources `__tests__`) and fix the
  relative imports.
- i18n: translate the new tracker search/filter strings in the remaining
  locales (zh, ja, ko, cs, es, fr, it, pt, pt-br, tr), reusing each file's
  existing terminology; ICU placeholders left unchanged.
- encoder: hoist the reserved-character class into one constant and build two
  RegExp instances from it (non-global for `.test()`, global for `.replace()`)
  to avoid the shared-lastIndex trap.
- view-resources: guard `resultIssueCountStore` writes with an owner-token
  gate so a superseded viewlet can no longer clobber the active viewlet's
  count; List/KanbanView claim and release, IssuesView resets through the
  current owner. Assumes a single active IssuesView surface.
- view-resources: make result-count reporting opt-in via a new
  `reportResultCount` prop on List (default true). Embedded, non-primary List
  instances (sub-issues / related issues in the issue edit panel, routed
  through SubIssueList) pass false and never claim the owner token, so opening
  and closing an issue can no longer strand the primary Issues viewlet with a
  dead token — the zero-hit SearchEmptyState card renders again afterwards. Add
  a regression test covering the opted-out embedded consumer.
- elastic: escape every regex metacharacter (not just `.`) when building
  KNOWN_FIELD_RE from `fullTextSearchFields`, so a future field name carrying
  another metacharacter cannot silently corrupt the alternation. Behaviour for
  the current fields is unchanged.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* refactor(tracker-search): centralize regex escaping and lock down result-count store

- Share escapeRegExp from @hcengineering/core so the client encoder and the server elastic adapter escape the fulltext field list identically, not just dots on the client.

- Export resultIssueCountStore as a read-only Readable; the owner-token gate functions (setResultCount / resetResultCount / releaseResultCountOwner) are now the only write path.

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>
Co-authored-by: Artyom Savchenko <armisav@gmail.com>
2026-08-11 19:09:33 +07:00

311 lines
18 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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",
"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": "Запрещает пользователям создавать новые проекты",
"AllowCreatingIssues": "Разрешить создание задач",
"ModeSelectorDisabledByFilter": "Статус задаётся активным фильтром. Уберите фильтр по статусу, чтобы воспользоваться этим переключателем.",
"ShowQuickModeSelector": "Быстрый фильтр: Все / Активные / Пул задач",
"SearchScopeLabel": "Искать в…",
"SearchScopeTitle": "Только заголовок",
"SearchScopeTitleDescription": "Заголовок + описание",
"SearchScopeAll": "Заголовок + описание + комментарии",
"SearchHighlight": "Подсвечивать совпадения",
"SearchEmptyTitle": "Не найдено задач по запросу «{query}»",
"SearchEmptyActiveFilters": "Активные фильтры: {filters}",
"SearchEmptyClearFilters": "Искать без фильтров",
"SearchEmptyAllProjects": "Искать во всех проектах"
},
"status": {}
}