Files
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
13 KiB
JSON

{
"string": {
"TrackerApplication": "Tracker",
"Projects": "Deine Projekte",
"More": "Mehr",
"Default": "Standard",
"MakeDefault": "Als Standard festlegen",
"Delete": "Löschen",
"Open": "Öffnen",
"Members": "Mitglieder",
"Inbox": "Posteingang",
"MyIssues": "Meine Aufgaben",
"ViewIssue": "Aufgabe anzeigen",
"IssueCreated": "Aufgabe erstellt",
"Issues": "Aufgaben",
"Views": "Ansichten",
"Active": "Aktiv",
"AllIssues": "Alle Aufgaben",
"ActiveIssues": "Aktive Aufgaben",
"BacklogIssues": "Backlog",
"Backlog": "Backlog",
"Board": "Board",
"Components": "Komponenten",
"AllComponents": "Alle",
"BacklogComponents": "Backlog",
"ActiveComponents": "Aktive",
"ClosedComponents": "Geschlossen",
"NewComponent": "Neue Komponente",
"CreateComponent": "Komponente erstellen",
"ComponentNamePlaceholder": "Komponentenname",
"ComponentDescriptionPlaceholder": "Beschreibung (optional)",
"ComponentLead": "Leitung",
"ComponentMembers": "Mitglieder",
"StartDate": "Startdatum",
"TargetDate": "Zieldatum",
"Planned": "Geplant",
"InProgress": "In Bearbeitung",
"Paused": "Pausiert",
"Completed": "Abgeschlossen",
"Canceled": "Abgebrochen",
"CreateProject": "Projekt erstellen",
"NewProject": "Neues Projekt",
"ProjectTitle": "Projekttitel",
"ProjectTitlePlaceholder": "Neues Projekt",
"UsedInIssueIDs": "Verwendet in Aufgaben-IDs",
"Identifier": "Kennung",
"Import": "Importieren",
"ProjectIdentifier": "Projektkennung",
"IdentifierExists": "Projektkennung existiert bereits",
"ProjectIdentifierPlaceholder": "PRJKT",
"ChooseIcon": "Symbol wählen",
"AddIssue": "Aufgabe hinzufügen",
"NewIssue": "Neue Aufgabe",
"NewIssuePlaceholder": "Neu",
"ResumeDraft": "Entwurf fortsetzen",
"SaveIssue": "Aufgabe erstellen",
"SetPriority": "Priorität setzen...",
"SetStatus": "Status setzen...",
"SelectIssue": "Aufgabe auswählen",
"Priority": "Priorität",
"NoPriority": "Keine Priorität",
"Urgent": "Dringend",
"High": "Hoch",
"Medium": "Mittel",
"Low": "Niedrig",
"Unassigned": "Nicht zugewiesen",
"Back": "Zurück",
"List": "Liste",
"NumberLabels": "{count, plural, =0 {keine Labels} =1 {1 Label} other {# Labels}}",
"CategoryBacklog": "Backlog",
"CategoryUnstarted": "Nicht gestartet",
"CategoryStarted": "Gestartet",
"CategoryCompleted": "Abgeschlossen",
"CategoryCanceled": "Abgebrochen",
"Title": "Titel",
"Name": "Name",
"Description": "Beschreibung",
"Status": "Status",
"Number": "Nummer",
"Assignee": "Zugewiesen an",
"AssignTo": "Zuweisen an...",
"AssignedTo": "Zugewiesen an {value}",
"Parent": "Übergeordnete Aufgabe",
"SetParent": "Übergeordnete Aufgabe setzen...",
"ChangeParent": "Übergeordnete Aufgabe ändern...",
"RemoveParent": "Übergeordnete Aufgabe entfernen",
"OpenParent": "Übergeordnete Aufgabe öffnen",
"SubIssues": "Unteraufgaben",
"SubIssuesList": "Unteraufgaben ({subIssues})",
"OpenSubIssues": "Unteraufgaben öffnen",
"AddSubIssues": "Unteraufgabe hinzufügen",
"BlockedBy": "Blockiert durch",
"RelatedTo": "Verwandt mit",
"Comments": "Kommentare",
"Attachments": "Anhänge",
"Labels": "Labels",
"Component": "Komponente",
"Space": "",
"SetDueDate": "Fälligkeitsdatum setzen...",
"ChangeDueDate": "Fälligkeitsdatum ändern...",
"ModificationDate": "Aktualisiert am {value}",
"Project": "Projekt",
"Issue": "Aufgabe",
"SubIssue": "Unteraufgabe",
"Document": "Dokument",
"DocumentIcon": "Dokumentsymbol",
"DocumentColor": "Dokumentfarbe",
"Rank": "Rang",
"TypeIssuePriority": "Aufgabenpriorität",
"IssueTitlePlaceholder": "Aufgabentitel",
"SubIssueTitlePlaceholder": "Unteraufgabentitel",
"IssueDescriptionPlaceholder": "Beschreibung hinzufügen...",
"SubIssueDescriptionPlaceholder": "Unteraufgabenbeschreibung hinzufügen",
"AddIssueTooltip": "Aufgabe hinzufügen...",
"NewIssueDialogClose": "Möchten Sie diesen Dialog schließen?",
"NewIssueDialogCloseNote": "Alle Änderungen gehen verloren",
"RemoveComponentDialogClose": "Komponente löschen?",
"RemoveComponentDialogCloseNote": "Sind Sie sicher, dass Sie diese Komponente löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden",
"Grouping": "Gruppierung",
"Ordering": "Sortierung",
"CompletedIssues": "Abgeschlossene Aufgaben",
"NoGrouping": "Keine Gruppierung",
"NoAssignee": "Nicht zugewiesen",
"LastUpdated": "Zuletzt aktualisiert",
"DueDate": "Fälligkeitsdatum",
"IssueStartDate": "Startdatum",
"GanttDependency": "Abhängigkeit",
"GanttLag": "Verzögerung",
"Manual": "Manuell",
"All": "Alle",
"PastWeek": "Letzte Woche",
"PastMonth": "Letzter Monat",
"CopyIssueUrl": "Aufgaben-URL in Zwischenablage kopieren",
"CopyIssueId": "Aufgaben-ID in Zwischenablage kopieren",
"CopyIssueBranch": "Git-Branch-Namen in Zwischenablage kopieren",
"CopyIssueTitle": "Aufgabentitel in Zwischenablage kopieren",
"AssetLabel": "Asset",
"AddToComponent": "Zu Komponente hinzufügen...",
"MoveToComponent": "Zu Komponente verschieben...",
"NoComponent": "Keine Komponente",
"ComponentLeadTitle": "Komponentenleitung",
"ComponentMembersTitle": "Komponentenmitglieder",
"ComponentLeadSearchPlaceholder": "Komponentenleitung festlegen...",
"ComponentMembersSearchPlaceholder": "Komponentenmitglieder ändern...",
"MoveToProject": "Zu Projekt verschieben",
"Duplicate": "Duplizieren",
"GotoIssues": "Zu Aufgaben",
"GotoActive": "Zu aktiven Aufgaben",
"GotoBacklog": "Zum Backlog",
"GotoComponents": "Zu Komponenten",
"GotoMyIssues": "Zu meinen Aufgaben",
"GotoTrackerApplication": "Zum Tracker wechseln",
"CreatedOne": "Erstellt",
"MoveIssues": "Aufgaben verschieben",
"MoveIssuesDescription": "Wählen Sie das Zielprojekt aus",
"ManageAttributes": "Attribute verwalten",
"KeepOriginalAttributes": "Ursprüngliche Attribute beibehalten",
"KeepOriginalAttributesTooltip": "Ursprüngliche Aufgabenstatus und Komponenten werden im neuen Projekt beibehalten",
"SelectReplacement": "Die folgenden Elemente sind im neuen Projekt nicht verfügbar. Wählen Sie einen Ersatz.",
"MissingItem": "FEHLENDES ELEMENT",
"Replacement": "ERSATZ",
"Original": "ORIGINAL",
"OriginalDescription": "Elemente aus diesem Bereich werden im neuen Projekt erstellt",
"Relations": "Beziehungen",
"RemoveRelation": "Beziehung entfernen...",
"AddBlockedBy": "Als blockiert markieren durch...",
"AddIsBlocking": "Als blockierend markieren...",
"AddRelatedIssue": "Andere Aufgabe referenzieren...",
"RelatedIssue": "Verwandte Aufgabe {id} - {title}",
"BlockedIssue": "Blockierte Aufgabe {id} - {title}",
"BlockingIssue": "Blockierende Aufgabe {id} - {title}",
"BlockedBySearchPlaceholder": "Nach blockierender Aufgabe suchen...",
"IsBlockingSearchPlaceholder": "Nach zu blockierender Aufgabe suchen...",
"RelatedIssueSearchPlaceholder": "Nach zu referenzierender Aufgabe suchen...",
"Blocks": "Blockiert",
"Related": "Verwandt",
"RelatedIssues": "Verwandte Aufgaben",
"EditIssue": "{title} bearbeiten",
"EditWorkflowStatuses": "Aufgabenstatus bearbeiten",
"EditProject": "Projekt bearbeiten",
"DeleteProject": "Projekt löschen",
"ArchiveProjectName": "Projekt {name} archivieren?",
"ArchiveProjectConfirm": "Möchten Sie dieses Projekt archivieren?",
"DeleteProjectConfirm": "Möchten Sie dieses Projekt und alle Aufgaben löschen?",
"ProjectHasIssues": "Es gibt bestehende Aufgaben in diesem Projekt. Sind Sie sicher, dass Sie archivieren möchten?",
"ManageWorkflowStatuses": "Projekttypen verwalten",
"AddWorkflowStatus": "Aufgabenstatus hinzufügen",
"EditWorkflowStatus": "Aufgabenstatus bearbeiten",
"DeleteWorkflowStatus": "Aufgabenstatus löschen",
"DeleteWorkflowStatusConfirm": "Möchten Sie den Status \"{status}\" löschen?",
"DeleteWorkflowStatusErrorDescription": "Dem Status \"{status}\" sind {count, plural, =1 {1 Aufgabe} other {# Aufgaben}} zugewiesen. Bitte wählen Sie einen neuen Status",
"Save": "Speichern",
"IncludeItemsThatMatch": "Elemente einschließen, die übereinstimmen mit",
"AnyFilter": "einem Filter",
"AllFilters": "allen Filtern",
"NoDescription": "Keine Beschreibung",
"SearchIssue": "Nach Aufgabe suchen...",
"StatusHistory": "Statusverlauf",
"NewSubIssue": "Unteraufgabe hinzufügen...",
"AddLabel": "Label hinzufügen",
"DeleteIssue": "{issueCount, plural, =1 {Aufgabe} other {# Aufgaben}} löschen",
"DeleteIssueConfirm": "Möchten Sie {issueCount, plural, =1 {die Aufgabe} other {die Aufgaben}}{subIssueCount, plural, =0 {} =1 { und Unteraufgabe} other { und Unteraufgaben}} löschen?",
"Milestone": "Meilenstein",
"NoMilestone": "Kein Meilenstein",
"MoveToMilestone": "Meilenstein auswählen",
"Milestones": "Meilensteine",
"AllMilestones": "Alle",
"PlannedMilestones": "Geplant",
"ActiveMilestones": "Aktiv",
"ClosedMilestones": "Abgeschlossen",
"AddToMilestone": "Zu Meilenstein hinzufügen",
"MilestoneNamePlaceholder": "Meilensteinname",
"NewMilestone": "Neuer Meilenstein",
"CreateMilestone": "Erstellen",
"MoveAndDeleteMilestone": "Aufgaben zu {newMilestone} verschieben und {deleteMilestone} löschen",
"MoveAndDeleteMilestoneConfirm": "Möchten Sie den Meilenstein löschen und die Aufgaben zu einem anderen Meilenstein verschieben?",
"Estimation": "Schätzung",
"ReportedTime": "Aufgewendete Zeit",
"RemainingTime": "Verbleibende Zeit",
"TimeSpendReports": "Zeiterfassungsberichte",
"TimeSpendReport": "Zeit",
"TimeSpendReportAdd": "Zeiterfassung hinzufügen",
"TimeSpendReportDate": "Datum",
"TimeSpendReportValue": "Aufgewendete Zeit",
"TimeSpendReportValueTooltip": "Aufgewendete Zeit in Stunden",
"TimeSpendReportDescription": "Beschreibung",
"TimeSpendDays": "{value}T",
"TimeSpendHours": "{value}Std",
"TimeSpendMinutes": "{value}Min",
"ChildEstimation": "Schätzung Unteraufgaben",
"ChildReportedTime": "Zeit Unteraufgaben",
"CapacityValue": "von {value}T",
"NewRelatedIssue": "Neue verwandte Aufgabe",
"RelatedIssuesNotFound": "Keine verwandten Aufgaben gefunden",
"AddedReference": "Referenz hinzugefügt",
"AddedAsBlocked": "Als blockiert markiert",
"AddedAsBlocking": "Als blockierend markiert",
"IssueTemplate": "Vorlage",
"IssueTemplates": "Vorlagen",
"NewProcess": "Neue Vorlage",
"SaveProcess": "Vorlage speichern",
"NoIssueTemplate": "Keine Vorlage",
"TemplateReplace": "Möchten Sie die neue Vorlage anwenden?",
"TemplateReplaceConfirm": "Alle Felder werden mit den Werten der neuen Vorlage überschrieben",
"Apply": "Anwenden",
"CurrentWorkDay": "Aktueller Arbeitstag",
"PreviousWorkDay": "Vorheriger Arbeitstag",
"TimeReportDayTypeLabel": "Art des Zeiterfassungstags auswählen",
"DefaultAssignee": "Standardzuweisung für Aufgaben",
"SevenHoursLength": "Sieben Stunden",
"EightHoursLength": "Acht Stunden",
"HourLabel": "Std",
"MinuteLabel": "Min",
"Saved": "Gespeichert...",
"CreatedIssue": "Aufgabe erstellt",
"CreatedSubIssue": "Unteraufgabe erstellt",
"ChangeStatus": "Status ändern",
"ConfigLabel": "Tracker",
"ConfigDescription": "Erweiterung zur Verwaltung von Arbeitsaufgaben und deren Erledigung.",
"NoStatusFound": "Kein passender Status gefunden",
"CreateMissingStatus": "Fehlenden Status erstellen",
"UnsetParent": "Übergeordnete Aufgabe wird entfernt",
"AllProjects": "Alle Projekte",
"IssueNotificationTitle": "{issueTitle}",
"IssueNotificationBody": "Aktualisiert von {senderName}",
"IssueNotificationChanged": "{senderName} hat {property} geändert",
"IssueNotificationChangedProperty": "{senderName} hat {property} zu \"{newValue}\" geändert",
"IssueNotificationMessage": "{senderName}: {message}",
"PreviousAssigned": "Zuvor zugewiesen",
"IssueAssignedToYou": "Ihnen zugewiesen",
"RelatedIssueTargetDescription": "Zielprojekt für verwandte Aufgaben für Klasse oder Space",
"MapRelatedIssues": "Standard-Projekte für verwandte Aufgaben konfigurieren",
"DefaultIssueStatus": "Standard-Aufgabenstatus",
"IssueStatus": "Status",
"Extensions": "Erweiterungen",
"UnsetParentIssue": "Übergeordnete Aufgabe entfernen",
"ForbidCreateProjectPermission": "Projekterstellung verbieten",
"ForbidCreateProjectPermissionDescription": "Verbietet Benutzern das Erstellen neuer Projekte",
"AllowCreatingIssues": "Erstellen von Aufgaben erlauben",
"ModeSelectorDisabledByFilter": "Status wird über aktive Filter gesteuert. Entferne den Status-Filter, um die Schnellauswahl zu nutzen.",
"ShowQuickModeSelector": "Schnellfilter: All / Active / Backlog",
"SearchScopeLabel": "Suche in…",
"SearchScopeTitle": "Nur Titel",
"SearchScopeTitleDescription": "Titel + Beschreibung",
"SearchScopeAll": "Titel + Beschreibung + Kommentare",
"SearchHighlight": "Treffer hervorheben",
"SearchEmptyTitle": "Keine Treffer für \"{query}\"",
"SearchEmptyActiveFilters": "Aktive Filter: {filters}",
"SearchEmptyClearFilters": "Suche ohne Filter",
"SearchEmptyAllProjects": "In allen Projekten suchen"
},
"status": {}
}