mirror of
https://github.com/hcengineering/platform.git
synced 2026-08-17 18:05:42 +02:00
* 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>
294 lines
14 KiB
JSON
294 lines
14 KiB
JSON
{
|
|
"string": {
|
|
"TrackerApplication": "Suivi",
|
|
"Projects": "Vos projets",
|
|
"More": "Plus",
|
|
"Default": "Par défaut",
|
|
"MakeDefault": "Définir par défaut",
|
|
"Delete": "Supprimer",
|
|
"Open": "Ouvrir",
|
|
"Members": "Membres",
|
|
"Inbox": "Boîte de réception",
|
|
"MyIssues": "Mes issues",
|
|
"ViewIssue": "Voir l'issue",
|
|
"IssueCreated": "Issue créées",
|
|
"Issues": "Issues",
|
|
"Views": "Vues",
|
|
"Active": "Actif",
|
|
"AllIssues": "Toutes les issues",
|
|
"ActiveIssues": "Issues actives",
|
|
"BacklogIssues": "Backlog",
|
|
"Backlog": "Backlog",
|
|
"Board": "Tableau",
|
|
"Components": "Composants",
|
|
"AllComponents": "Tous",
|
|
"BacklogComponents": "Backlog",
|
|
"ActiveComponents": "Actif",
|
|
"ClosedComponents": "Fermé",
|
|
"NewComponent": "Nouveau composant",
|
|
"CreateComponent": "Créer un composant",
|
|
"ComponentNamePlaceholder": "Nom du composant",
|
|
"ComponentDescriptionPlaceholder": "Description (facultatif)",
|
|
"ComponentLead": "Responsable",
|
|
"ComponentMembers": "Membres",
|
|
"StartDate": "Date de début",
|
|
"TargetDate": "Date cible",
|
|
"Planned": "Planifié",
|
|
"InProgress": "En cours",
|
|
"Paused": "En pause",
|
|
"Completed": "Terminé",
|
|
"Canceled": "Annulé",
|
|
"CreateProject": "Créer un projet",
|
|
"NewProject": "Nouveau projet",
|
|
"ProjectTitle": "Titre du projet",
|
|
"ProjectTitlePlaceholder": "Nouveau projet",
|
|
"UsedInIssueIDs": "Utilisé dans les ID d'une issue",
|
|
"Identifier": "Identifiant",
|
|
"Import": "Importer",
|
|
"ProjectIdentifier": "Identifiant du projet",
|
|
"IdentifierExists": "L'identifiant du projet existe déjà",
|
|
"ProjectIdentifierPlaceholder": "PRJCT",
|
|
"ChooseIcon": "Choisir une icône",
|
|
"AddIssue": "Ajouter une issue",
|
|
"NewIssue": "Nouvelle issue",
|
|
"NewIssuePlaceholder": "Nouveau",
|
|
"ResumeDraft": "Reprendre le brouillon",
|
|
"SaveIssue": "Créer une issue",
|
|
"SetPriority": "Définir la priorité...",
|
|
"SetStatus": "Définir le statut...",
|
|
"SelectIssue": "Sélectionner une issue",
|
|
"Priority": "Priorité",
|
|
"NoPriority": "Aucune priorité",
|
|
"Urgent": "Urgent",
|
|
"High": "Haute",
|
|
"Medium": "Moyenne",
|
|
"Low": "Basse",
|
|
"Unassigned": "Non assigné",
|
|
"Back": "Retour",
|
|
"List": "Liste",
|
|
"NumberLabels": "{count, plural, =0 {aucune étiquette} =1 {1 étiquette} other {# étiquettes}}",
|
|
"CategoryBacklog": "Backlog",
|
|
"CategoryUnstarted": "Non commencé",
|
|
"CategoryStarted": "Commencé",
|
|
"CategoryCompleted": "Terminé",
|
|
"CategoryCanceled": "Annulé",
|
|
"Title": "Titre",
|
|
"Name": "Nom",
|
|
"Description": "Description",
|
|
"Status": "Statut",
|
|
"Number": "Numéro",
|
|
"Assignee": "Assigné à",
|
|
"AssignTo": "Assigner à...",
|
|
"AssignedTo": "Assigné à {value}",
|
|
"Parent": "Problème parent",
|
|
"SetParent": "Définir le problème parent...",
|
|
"ChangeParent": "Changer le problème parent...",
|
|
"RemoveParent": "Supprimer le problème parent",
|
|
"OpenParent": "Ouvrir le problème parent",
|
|
"SubIssues": "Sub-issue",
|
|
"SubIssuesList": "Sub-issue ({subIssues})",
|
|
"OpenSubIssues": "Ouvrir les sub-issue",
|
|
"AddSubIssues": "Ajouter un sub-issue",
|
|
"BlockedBy": "Bloqué par",
|
|
"RelatedTo": "Lié à",
|
|
"Comments": "Commentaires",
|
|
"Attachments": "Pièces jointes",
|
|
"Labels": "Étiquettes",
|
|
"Component": "Composant",
|
|
"Space": "",
|
|
"SetDueDate": "Définir la date d'échéance...",
|
|
"ChangeDueDate": "Changer la date d'échéance...",
|
|
"ModificationDate": "Mis à jour {value}",
|
|
"Project": "Projet",
|
|
"Issue": "Issue",
|
|
"SubIssue": "Sub-issue",
|
|
"Document": "",
|
|
"DocumentIcon": "",
|
|
"DocumentColor": "",
|
|
"Rank": "Rang",
|
|
"TypeIssuePriority": "Priorité de l'issue",
|
|
"IssueTitlePlaceholder": "Titre de l'issue",
|
|
"SubIssueTitlePlaceholder": "Titre de la sub-issue",
|
|
"IssueDescriptionPlaceholder": "Ajouter une description...",
|
|
"SubIssueDescriptionPlaceholder": "Ajouter une description de la sub-issue",
|
|
"AddIssueTooltip": "Ajouter une issue...",
|
|
"NewIssueDialogClose": "Voulez-vous fermer cette fenêtre ?",
|
|
"NewIssueDialogCloseNote": "Tous les changements seront perdus",
|
|
"RemoveComponentDialogClose": "Supprimer le composant ?",
|
|
"RemoveComponentDialogCloseNote": "Êtes-vous sûr de vouloir supprimer ce composant ? Cette opération est irréversible",
|
|
"Grouping": "Regroupement",
|
|
"Ordering": "Classement",
|
|
"CompletedIssues": "Issues terminées",
|
|
"NoGrouping": "Aucun regroupement",
|
|
"NoAssignee": "Non assigné",
|
|
"LastUpdated": "Dernière mise à jour",
|
|
"DueDate": "Date d'échéance",
|
|
"IssueStartDate": "Date de début",
|
|
"GanttDependency": "Dependency",
|
|
"GanttLag": "Lag",
|
|
"Manual": "Manuel",
|
|
"All": "Tous",
|
|
"PastWeek": "La semaine passée",
|
|
"PastMonth": "Le mois passé",
|
|
"CopyIssueUrl": "Copier l'URL de l'issue dans le presse-papiers",
|
|
"CopyIssueId": "Copier l'ID de l'issue dans le presse-papiers",
|
|
"CopyIssueBranch": "Copier le nom de la branche Git dans le presse-papiers",
|
|
"CopyIssueTitle": "Copier le titre de l'issue dans le presse-papiers",
|
|
"AssetLabel": "Actif",
|
|
"AddToComponent": "Ajouter au composant...",
|
|
"MoveToComponent": "Déplacer vers le composant...",
|
|
"NoComponent": "Aucun composant",
|
|
"ComponentLeadTitle": "Responsable du composant",
|
|
"ComponentMembersTitle": "Membres du composant",
|
|
"ComponentLeadSearchPlaceholder": "Définir le responsable du composant...",
|
|
"ComponentMembersSearchPlaceholder": "Modifier les membres du composant...",
|
|
"MoveToProject": "Déplacer vers le projet",
|
|
"Duplicate": "Dupliquer",
|
|
"GotoIssues": "Aller aux issues",
|
|
"GotoActive": "Aller aux problèmes actifs",
|
|
"GotoBacklog": "Aller au backlog",
|
|
"GotoComponents": "Aller aux composants",
|
|
"GotoMyIssues": "Aller à mes issues",
|
|
"GotoTrackerApplication": "Passer à l'application de suivi",
|
|
"CreatedOne": "Créé",
|
|
"MoveIssues": "Déplacer les issues",
|
|
"MoveIssuesDescription": "Sélectionnez le projet vers lequel vous souhaitez déplacer les issues",
|
|
"ManageAttributes": "Gérer les attributs",
|
|
"KeepOriginalAttributes": "Conserver les attributs d'origine",
|
|
"KeepOriginalAttributesTooltip": "Les statuts et composants des problèmes d'origine seront conservés dans le nouveau projet",
|
|
"SelectReplacement": "Les éléments suivants ne sont pas disponibles dans le nouveau projet. Sélectionnez un remplacement.",
|
|
"MissingItem": "ÉLÉMENT MANQUANT",
|
|
"Replacement": "REMPLACEMENT",
|
|
"Original": "ORIGINAL",
|
|
"OriginalDescription": "Les éléments de cette section seront créés dans le nouveau projet",
|
|
"Relations": "Relations",
|
|
"RemoveRelation": "Supprimer la relation...",
|
|
"AddBlockedBy": "Marquer comme bloqué par...",
|
|
"AddIsBlocking": "Marquer comme bloquant...",
|
|
"AddRelatedIssue": "Référencer une autre issue...",
|
|
"RelatedIssue": "Issue liée {id} - {title}",
|
|
"BlockedIssue": "Issue bloquée {id} - {title}",
|
|
"BlockingIssue": "Issue bloquante {id} - {title}",
|
|
"BlockedBySearchPlaceholder": "Rechercher un problème à marquer comme bloqué par...",
|
|
"IsBlockingSearchPlaceholder": "Rechercher un problème à marquer comme bloquant...",
|
|
"RelatedIssueSearchPlaceholder": "Rechercher une issue à référencer...",
|
|
"Blocks": "Bloque",
|
|
"Related": "Lié",
|
|
"RelatedIssues": "Issues liées",
|
|
"EditIssue": "Modifier {title}",
|
|
"EditWorkflowStatuses": "Modifier les statuts des problèmes",
|
|
"EditProject": "Modifier le projet",
|
|
"DeleteProject": "Supprimer le projet",
|
|
"ArchiveProjectName": "Archiver le projet {name} ?",
|
|
"ArchiveProjectConfirm": "Voulez-vous archiver ce projet ?",
|
|
"DeleteProjectConfirm": "Voulez-vous supprimer ce projet et tous les problèmes ?",
|
|
"ProjectHasIssues": "Il y a des issues existantes dans ce projet, êtes-vous sûr de vouloir archiver ?",
|
|
"ManageWorkflowStatuses": "Gérer les types de projet",
|
|
"AddWorkflowStatus": "Ajouter un statut de problème",
|
|
"EditWorkflowStatus": "Modifier le statut du problème",
|
|
"DeleteWorkflowStatus": "Supprimer le statut du problème",
|
|
"DeleteWorkflowStatusConfirm": "Voulez-vous supprimer le statut \"{status}\" ?",
|
|
"DeleteWorkflowStatusErrorDescription": "Le statut \"{status}\" a {count, plural, =1 {1 problème} other {# problèmes}} assigné(s). Veuillez sélectionner un statut pour le déplacer",
|
|
"Save": "Enregistrer",
|
|
"IncludeItemsThatMatch": "Inclure les éléments qui correspondent",
|
|
"AnyFilter": "n'importe quel filtre",
|
|
"AllFilters": "tous les filtres",
|
|
"NoDescription": "Pas de description",
|
|
"SearchIssue": "Rechercher une tâche...",
|
|
"StatusHistory": "Historique des statuts",
|
|
"NewSubIssue": "Ajouter un sub-ssue...",
|
|
"AddLabel": "Ajouter une étiquette",
|
|
"DeleteIssue": "Supprimer {issueCount, plural, =1 {problème} other {# problèmes}}",
|
|
"DeleteIssueConfirm": "Voulez-vous supprimer {issueCount, plural, =1 {le problème} other {les problèmes}}{subIssueCount, plural, =0 {?} =1 { et le sous-problème ?} other { et les sous-problèmes ?}}",
|
|
"Milestone": "Jalon",
|
|
"NoMilestone": "Pas de jalon",
|
|
"MoveToMilestone": "Sélectionner un jalon",
|
|
"Milestones": "Jalons",
|
|
"AllMilestones": "Tous",
|
|
"PlannedMilestones": "Prévu",
|
|
"ActiveMilestones": "Actif",
|
|
"ClosedMilestones": "Terminé",
|
|
"AddToMilestone": "Ajouter au jalon",
|
|
"MilestoneNamePlaceholder": "Nom du jalon",
|
|
"NewMilestone": "Nouveau jalon",
|
|
"CreateMilestone": "Créer",
|
|
"MoveAndDeleteMilestone": "Déplacer les problèmes vers {newMilestone} et supprimer {deleteMilestone}",
|
|
"MoveAndDeleteMilestoneConfirm": "Voulez-vous supprimer le jalon et déplacer les problèmes vers un autre jalon ?",
|
|
"Estimation": "Estimation",
|
|
"ReportedTime": "Temps passé",
|
|
"RemainingTime": "Temps restant",
|
|
"TimeSpendReports": "Rapports de temps passé",
|
|
"TimeSpendReport": "Temps",
|
|
"TimeSpendReportAdd": "Ajouter un rapport de temps",
|
|
"TimeSpendReportDate": "Date",
|
|
"TimeSpendReportValue": "Temps passé",
|
|
"TimeSpendReportValueTooltip": "Temps passé en heures",
|
|
"TimeSpendReportDescription": "Description",
|
|
"TimeSpendDays": "{value}j",
|
|
"TimeSpendHours": "{value}h",
|
|
"TimeSpendMinutes": "{value}m",
|
|
"ChildEstimation": "Estimation des sous-problèmes",
|
|
"ChildReportedTime": "Temps des sous-problèmes",
|
|
"CapacityValue": "de {value}j",
|
|
"NewRelatedIssue": "Nouvelle issue liée",
|
|
"RelatedIssuesNotFound": "Issues liées non trouvés",
|
|
"AddedReference": "Référence ajoutée",
|
|
"AddedAsBlocked": "Marqué comme bloqué",
|
|
"AddedAsBlocking": "Marqué comme bloquant",
|
|
"IssueTemplate": "Modèle",
|
|
"IssueTemplates": "Modèles",
|
|
"NewProcess": "Nouveau modèle",
|
|
"SaveProcess": "Enregistrer le modèle",
|
|
"NoIssueTemplate": "Aucun modèle",
|
|
"TemplateReplace": "Voulez-vous appliquer le nouveau modèle ?",
|
|
"TemplateReplaceConfirm": "Tous les champs seront remplacés par les valeurs du nouveau modèle",
|
|
"Apply": "Appliquer",
|
|
"CurrentWorkDay": "Journée de travail actuelle",
|
|
"PreviousWorkDay": "Journée de travail précédente",
|
|
"TimeReportDayTypeLabel": "Sélectionnez le type de journée de rapport de temps",
|
|
"DefaultAssignee": "Assigné par défaut pour les problèmes",
|
|
"SevenHoursLength": "Sept heures",
|
|
"EightHoursLength": "Huit heures",
|
|
"HourLabel": "h",
|
|
"MinuteLabel": "m",
|
|
"Saved": "Enregistré...",
|
|
"CreatedIssue": "Issue créée",
|
|
"CreatedSubIssue": "Sub-issue créée",
|
|
"ChangeStatus": "Changer le statut",
|
|
"ConfigLabel": "Suivi",
|
|
"ConfigDescription": "Extension pour gérer les éléments de travail et accomplir toutes les tâches.",
|
|
"NoStatusFound": "Aucun statut correspondant trouvé",
|
|
"CreateMissingStatus": "Créer un statut manquant",
|
|
"UnsetParent": "Le problème parent sera désélectionné",
|
|
"AllProjects": "Tous les projets",
|
|
"IssueNotificationTitle": "{issueTitle}",
|
|
"IssueNotificationBody": "Mis à jour par {senderName}",
|
|
"IssueNotificationChanged": "{senderName} a modifié {property}",
|
|
"IssueNotificationChangedProperty": "{senderName} a modifié {property} en \"{newValue}\"",
|
|
"IssueNotificationMessage": "{senderName} : {message}",
|
|
"PreviousAssigned": "Assigné précédemment",
|
|
"IssueAssignedToYou": "Assigné à vous",
|
|
"RelatedIssueTargetDescription": "Projet cible de l'issue liée pour la classe ou l'espace",
|
|
"MapRelatedIssues": "Configurer les projets par défaut des issues liées",
|
|
"DefaultIssueStatus": "Statut par défaut de l'issue",
|
|
"IssueStatus": "Statut",
|
|
"Extensions": "Extensions",
|
|
"UnsetParentIssue": "Désélectionner l'issue parent",
|
|
"ForbidCreateProjectPermission": "Interdire la création de projet",
|
|
"ForbidCreateProjectPermissionDescription": "Interdit aux utilisateurs de créer de nouveaux projets",
|
|
"AllowCreatingIssues": "Autoriser la création d'issues",
|
|
"ModeSelectorDisabledByFilter": "Le statut est contrôlé par un filtre actif. Supprimez le filtre de statut pour utiliser ce raccourci.",
|
|
"ShowQuickModeSelector": "Filtre rapide : Tous / Actif / Backlog",
|
|
"SearchScopeLabel": "Rechercher dans…",
|
|
"SearchScopeTitle": "Titre uniquement",
|
|
"SearchScopeTitleDescription": "Titre + description",
|
|
"SearchScopeAll": "Titre + description + commentaires",
|
|
"SearchHighlight": "Surligner les correspondances de recherche",
|
|
"SearchEmptyTitle": "Aucun problème trouvé pour \"{query}\"",
|
|
"SearchEmptyActiveFilters": "Filtres actifs : {filters}",
|
|
"SearchEmptyClearFilters": "Rechercher sans filtres",
|
|
"SearchEmptyAllProjects": "Rechercher dans tous les projets"
|
|
},
|
|
"status": {}
|
|
}
|