@nightkatana/kronosys-app 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +81 -0
  2. package/app/api/action/route.ts +16 -0
  3. package/app/api/backup/route.ts +84 -0
  4. package/app/api/health/route.ts +22 -0
  5. package/app/api/state/route.ts +27 -0
  6. package/app/apple-icon.png +0 -0
  7. package/app/changelog/page.tsx +122 -0
  8. package/app/globals.css +210 -0
  9. package/app/guide/layout.tsx +11 -0
  10. package/app/guide/page.tsx +278 -0
  11. package/app/icon.png +0 -0
  12. package/app/layout.tsx +77 -0
  13. package/app/licenses/layout.tsx +11 -0
  14. package/app/licenses/page.tsx +246 -0
  15. package/app/manifest.ts +32 -0
  16. package/app/page.tsx +1610 -0
  17. package/app/reporting/page.tsx +2943 -0
  18. package/app/settings/layout.tsx +10 -0
  19. package/app/settings/page.tsx +3518 -0
  20. package/bin/kronosys.mjs +46 -0
  21. package/components/KronosysPackageVersionProvider.tsx +19 -0
  22. package/components/KronosysPayloadProvider.tsx +109 -0
  23. package/components/PwaRegister.tsx +25 -0
  24. package/components/SiteLegalFooter.tsx +21 -0
  25. package/components/ThemeProvider.tsx +78 -0
  26. package/components/dashboard/AppShellLiveSessionDrawer.tsx +394 -0
  27. package/components/dashboard/AppShellRouteNav.tsx +131 -0
  28. package/components/dashboard/AppVersionStamp.tsx +16 -0
  29. package/components/dashboard/DashboardCollapsibleSection.tsx +57 -0
  30. package/components/dashboard/DashboardColumnHintsBanner.tsx +159 -0
  31. package/components/dashboard/DashboardCommandCenter.tsx +470 -0
  32. package/components/dashboard/DashboardLangGateModal.tsx +118 -0
  33. package/components/dashboard/DashboardLoadingOverlay.tsx +42 -0
  34. package/components/dashboard/DashboardSimpleModal.tsx +337 -0
  35. package/components/dashboard/DashboardSuspenseFallback.tsx +52 -0
  36. package/components/dashboard/DashboardToastProvider.tsx +64 -0
  37. package/components/dashboard/DashboardTour.tsx +435 -0
  38. package/components/dashboard/DeferredDescriptionPopoverWrap.tsx +39 -0
  39. package/components/dashboard/DeleteSessionModal.tsx +130 -0
  40. package/components/dashboard/DescriptionTooltipPortaled.tsx +31 -0
  41. package/components/dashboard/GitIdentityQuickSetupModal.tsx +211 -0
  42. package/components/dashboard/HeaderIntegrationBadges.tsx +69 -0
  43. package/components/dashboard/InlineMetricHelpTrigger.tsx +102 -0
  44. package/components/dashboard/IssuePickerModal.tsx +168 -0
  45. package/components/dashboard/KronoFocusPanel.tsx +834 -0
  46. package/components/dashboard/KronosysDatetimePopoverField.tsx +357 -0
  47. package/components/dashboard/KronosysTimePopoverField.tsx +233 -0
  48. package/components/dashboard/LanguageMenu.tsx +123 -0
  49. package/components/dashboard/MongoMirrorSyncLine.tsx +57 -0
  50. package/components/dashboard/NewSessionScopeModal.tsx +410 -0
  51. package/components/dashboard/PageRefreshButton.tsx +130 -0
  52. package/components/dashboard/PlainHelpPopover.tsx +97 -0
  53. package/components/dashboard/ReportingPageToc.tsx +68 -0
  54. package/components/dashboard/ReportingTour.tsx +342 -0
  55. package/components/dashboard/SavedProjectPicker.tsx +92 -0
  56. package/components/dashboard/SavedTagPicker.tsx +115 -0
  57. package/components/dashboard/ScrollToTopFab.tsx +41 -0
  58. package/components/dashboard/SelectedSessionSidebarBlock.tsx +630 -0
  59. package/components/dashboard/SessionEndReasonEditor.tsx +114 -0
  60. package/components/dashboard/SessionListPanel.tsx +320 -0
  61. package/components/dashboard/SessionLocMetricsSection.tsx +128 -0
  62. package/components/dashboard/SettingsTagsProjectsSection.tsx +993 -0
  63. package/components/dashboard/SettingsTour.tsx +332 -0
  64. package/components/dashboard/TagPills.tsx +149 -0
  65. package/components/dashboard/TagsHelpTrigger.tsx +84 -0
  66. package/components/dashboard/TaskFocusPanel.tsx +1261 -0
  67. package/components/dashboard/TaskSessionLiveCard.tsx +832 -0
  68. package/components/dashboard/TaskSubtasksBlock.tsx +748 -0
  69. package/components/dashboard/ThemeToggle.test.tsx +26 -0
  70. package/components/dashboard/ThemeToggle.tsx +36 -0
  71. package/components/dashboard/UserGuideBodyText.tsx +62 -0
  72. package/components/dashboard/WorkspaceGitRepoCard.tsx +191 -0
  73. package/components/dashboard/taskFieldStyles.ts +139 -0
  74. package/components/dashboard/useAnchoredFloatingPortalStyle.ts +71 -0
  75. package/components/dashboard/useDescriptionPopoverAfterMs.ts +220 -0
  76. package/components/dashboard/useKronoFocusLiveSeconds.ts +36 -0
  77. package/components/dashboard/useSmoothStopwatchMs.ts +25 -0
  78. package/lib/appShellHeaderClasses.ts +12 -0
  79. package/lib/backupCsvExport.test.ts +149 -0
  80. package/lib/backupCsvExport.ts +392 -0
  81. package/lib/changelogCopy.ts +34 -0
  82. package/lib/concurrentTaskStartPreference.ts +29 -0
  83. package/lib/dashboardClockFormat.ts +13 -0
  84. package/lib/dashboardColumnChrome.ts +3 -0
  85. package/lib/dashboardColumnHintsStorage.ts +57 -0
  86. package/lib/dashboardCopy.ts +1831 -0
  87. package/lib/dashboardDetachedUrlHintStorage.ts +24 -0
  88. package/lib/dashboardGitIdentityBannerStorage.ts +36 -0
  89. package/lib/dashboardLangStorage.ts +72 -0
  90. package/lib/dashboardQuickSearch.ts +476 -0
  91. package/lib/dashboardQuickSearchQuery.test.ts +63 -0
  92. package/lib/dashboardQuickSearchQuery.ts +179 -0
  93. package/lib/dashboardSessionNav.ts +33 -0
  94. package/lib/dashboardShortcuts.ts +268 -0
  95. package/lib/dashboardTimeZone.ts +91 -0
  96. package/lib/dashboardTourStorage.ts +68 -0
  97. package/lib/dataDir.test.ts +87 -0
  98. package/lib/dataDir.ts +83 -0
  99. package/lib/devDataPreferenceFile.ts +55 -0
  100. package/lib/devDataRuntimeInfo.ts +34 -0
  101. package/lib/formatIsoShort.test.ts +46 -0
  102. package/lib/formatIsoShort.ts +29 -0
  103. package/lib/generatedUserChangelog.ts +34 -0
  104. package/lib/gitlabIssueSearch.ts +8 -0
  105. package/lib/kronoFocusDurationHistory.ts +71 -0
  106. package/lib/kronoFocusRhythm.test.ts +130 -0
  107. package/lib/kronoFocusRhythm.ts +46 -0
  108. package/lib/kronoFocusTimerUrgency.test.ts +74 -0
  109. package/lib/kronoFocusTimerUrgency.ts +24 -0
  110. package/lib/kronosysApi.ts +143 -0
  111. package/lib/legacyEditorPayloadKeys.ts +52 -0
  112. package/lib/legacyKronoFocusStorageKeys.test.ts +29 -0
  113. package/lib/legacyKronoFocusStorageKeys.ts +32 -0
  114. package/lib/licensesCopy.ts +128 -0
  115. package/lib/openPlainTextInNewTab.ts +49 -0
  116. package/lib/readKronosysPackageVersion.ts +10 -0
  117. package/lib/reportingAggregate.test.ts +325 -0
  118. package/lib/reportingAggregate.ts +819 -0
  119. package/lib/reportingDatePresets.ts +41 -0
  120. package/lib/reportingMetricHelp.ts +430 -0
  121. package/lib/reportingNonFinalIndicators.test.ts +157 -0
  122. package/lib/reportingNonFinalIndicators.ts +102 -0
  123. package/lib/reportingStrings.ts +491 -0
  124. package/lib/reportingTagWeekBreakdown.test.ts +141 -0
  125. package/lib/reportingTagWeekBreakdown.ts +181 -0
  126. package/lib/reportingWeekLayout.test.ts +239 -0
  127. package/lib/reportingWeekLayout.ts +313 -0
  128. package/lib/sessionAssiduity.test.ts +25 -0
  129. package/lib/sessionAssiduity.ts +33 -0
  130. package/lib/sessionEndReason.ts +55 -0
  131. package/lib/sessionEndWarnings.test.ts +200 -0
  132. package/lib/sessionEndWarnings.ts +125 -0
  133. package/lib/sessionListMerge.test.ts +101 -0
  134. package/lib/sessionListMerge.ts +70 -0
  135. package/lib/sessionTaskSidebarStats.test.ts +24 -0
  136. package/lib/sessionTaskSidebarStats.ts +54 -0
  137. package/lib/settingsCopy.ts +1276 -0
  138. package/lib/taskParsing.test.ts +153 -0
  139. package/lib/taskParsing.ts +737 -0
  140. package/lib/theme.ts +15 -0
  141. package/lib/translucentButtonClasses.ts +34 -0
  142. package/lib/usageProfile.test.ts +84 -0
  143. package/lib/usageProfile.ts +52 -0
  144. package/lib/userGuideCopy.ts +464 -0
  145. package/lib/workspaceLocDefaults.ts +21 -0
  146. package/next-env.d.ts +6 -0
  147. package/next.config.ts +15 -0
  148. package/package.json +87 -0
  149. package/postcss.config.mjs +12 -0
  150. package/public/apple-icon.png +0 -0
  151. package/public/favicon.ico +0 -0
  152. package/public/file.svg +1 -0
  153. package/public/globe.svg +1 -0
  154. package/public/icon-192.png +0 -0
  155. package/public/icon-512.png +0 -0
  156. package/public/icon.png +0 -0
  157. package/public/next.svg +1 -0
  158. package/public/sw.js +13 -0
  159. package/public/traceback.png +0 -0
  160. package/public/vercel.svg +1 -0
  161. package/public/window.svg +1 -0
  162. package/server/actionDispatch.test.ts +723 -0
  163. package/server/actionDispatch.ts +1476 -0
  164. package/server/actionTaskSession.test.ts +713 -0
  165. package/server/actionTaskSession.ts +717 -0
  166. package/server/db.ts +42 -0
  167. package/server/defaultCfg.ts +87 -0
  168. package/server/gitlabTokenStore.ts +34 -0
  169. package/server/kronoFocusHydrate.test.ts +142 -0
  170. package/server/kronoFocusHydrate.ts +69 -0
  171. package/server/kronoFocusMigrate.test.ts +53 -0
  172. package/server/kronoFocusMigrate.ts +78 -0
  173. package/server/mainTimerHydrate.test.ts +65 -0
  174. package/server/mainTimerHydrate.ts +53 -0
  175. package/server/payloadStore.test.ts +78 -0
  176. package/server/payloadStore.ts +83 -0
  177. package/server/sessionWallHydrate.test.ts +46 -0
  178. package/server/sessionWallHydrate.ts +88 -0
  179. package/tsconfig.json +41 -0
@@ -0,0 +1,1831 @@
1
+ export type Lang = "en" | "fr";
2
+
3
+ export type DashboardStrings = {
4
+ kronoFocusTitle: string;
5
+ /** Libellé de la phase travail (badge à côté du compteur). */
6
+ workMode: string;
7
+ breakMode: string;
8
+ longBreakMode: string;
9
+ kronoFocusStart: string;
10
+ kronoFocusPause: string;
11
+ kronoFocusReset: string;
12
+ /** Paragraphe du popover d’aide du panneau KronoFocus ; vide = pas d’aide (le bouton ? est masqué). */
13
+ kronoFocusStandaloneSubtitle: string;
14
+ /** Deuxième paragraphe du même popover ; vide = ignoré. */
15
+ kronoFocusAutoRefreshNote: string;
16
+ /** aria-label du bouton d’aide à côté du titre KronoFocus. */
17
+ kronoFocusPanelHelpAriaLabel: string;
18
+ kronoFocusLiveWhileViewingArchive: string;
19
+ /** Ligne sous KronoFocus quand il a été lancé depuis une tâche (avant le nom cliquable) */
20
+ kronoFocusLinkedTaskIntro: string;
21
+ kronoFocusEditDurationTitle: string;
22
+ kronoFocusDurationPickerLabel: string;
23
+ kronoFocusApplyDuration: string;
24
+ kronoFocusCancelDurationEdit: string;
25
+ /** aria-label du bouton d’aide à côté du champ durée KronoFocus. */
26
+ kronoFocusDurationHelpAriaLabel: string;
27
+ /** Contenu du popover d’aide (durée, format, plage). */
28
+ kronoFocusDurationHelpBody: string;
29
+ /** Placeholder du champ durée (`HH:MM:SS`, temps écoulé). */
30
+ kronoFocusDurationInputPlaceholder: string;
31
+ /** Bouton pour remplir la durée de travail par défaut (25 min) dans le champ d’édition. */
32
+ kronoFocusDefaultWorkDuration: string;
33
+ /** Titre de la liste des durées personnalisées mémorisées (sous le bouton défaut). */
34
+ kronoFocusDurationHistoryLabel: string;
35
+ /** aria-label des pastilles d’historique ; remplacer `{time}` par la valeur `HH:MM:SS`. */
36
+ kronoFocusDurationHistoryPickAria: string;
37
+ /** Libellé court du bouton qui vide l’historique des durées. */
38
+ kronoFocusDurationHistoryClear: string;
39
+ /** Infobulle et aria-label du bouton d’effacement de l’historique. */
40
+ kronoFocusDurationHistoryClearTitle: string;
41
+ /** Titre de la section presets (travail / pauses) dans le popover de configuration. */
42
+ kronoFocusRhythmPresetsHeading: string;
43
+ /** Libellés des presets, dans l’ordre de `KRONO_FOCUS_RHYTHM_PRESETS`. */
44
+ kronoFocusRhythmPresetLabels: readonly [string, string, string, string];
45
+ /** Infobulles des presets (même ordre). */
46
+ kronoFocusRhythmPresetTitles: readonly [string, string, string, string];
47
+ kronoFocusShortBreakMinutesLabel: string;
48
+ kronoFocusLongBreakMinutesLabel: string;
49
+ /** Aide sous les champs pauses (plage en minutes). */
50
+ kronoFocusRhythmBreaksMinutesHint: string;
51
+ startTaskWithKronoFocus: string;
52
+ /** aria-label du toggle minuteur (KronoFocus avec la tâche) — état inactif. */
53
+ startTaskWithKronoFocusToggleAriaOff: string;
54
+ /** aria-label du toggle minuteur — état actif. */
55
+ startTaskWithKronoFocusToggleAriaOn: string;
56
+ startKronoFocusFromActiveTask: string;
57
+ /** Texte du modal de confirmation si KronoFocus tourne déjà ou est en pause. */
58
+ startKronoFocusFromTaskConfirm: string;
59
+ launcherTitle: string;
60
+ taskTrackerTitle: string;
61
+ taskPlaceholder: string;
62
+ /** Champ titre tâche — mode passé / rétroactif (formulation au passé). */
63
+ taskPlaceholderPast: string;
64
+ /** Texte d’aide (popover) : tâche rétroactive (début / fin, tags, limites). */
65
+ archiveAddTaskIntro: string;
66
+ /** `aria-label` du bouton (?) pour l’entrée passée. */
67
+ archiveAddTaskIntroHelpAria: string;
68
+ /** Bascule formulaire tâche : suivi en direct. */
69
+ taskEntryModeRealtime: string;
70
+ /** Bascule formulaire tâche : entrée dans le passé. */
71
+ taskEntryModePast: string;
72
+ /** aria-label du groupe de bascule temps réel / passé. */
73
+ taskEntryModeGroupAria: string;
74
+ /** Libellé du champ date-heure de début (tâche passée). */
75
+ archiveTaskStartLabel: string;
76
+ /** Libellé du champ date-heure de fin (tâche passée). */
77
+ archiveTaskEndLabel: string;
78
+ /** Libellé court « durée » sur la ligne début / fin d’une tâche terminée. */
79
+ taskTimingDurationLabel: string;
80
+ /** Bouton icône : enregistrer la correction de l'heure de début d'une tâche. */
81
+ taskStartTimeSaveAria: string;
82
+ /** Bouton icône : enregistrer la correction de l'heure de début d'une session. */
83
+ sessionStartTimeSaveAria: string;
84
+ /** Bouton icône : enregistrer la correction de l'heure de fin d'une tâche terminée. */
85
+ taskEndTimeSaveAria: string;
86
+ /** Bouton icône : enregistrer la correction de l'heure de fin d'une session terminée. */
87
+ sessionEndTimeSaveAria: string;
88
+ /** Titre du bloc : corriger l’heure de fin de session (barre latérale). */
89
+ sessionEndTimeEditSectionTitle: string;
90
+ /** Titre du bloc : corriger l’heure de début de session (barre latérale). */
91
+ sessionStartTimeEditSectionTitle: string;
92
+ /** Masque affiché à vide sur le déclencheur date-heure (monospace, même largeur qu’une valeur typique). */
93
+ taskPastDatetimePlaceholder: string;
94
+ /** Libellé de la ligne heure / minutes dans le popover date-heure. */
95
+ taskPastDatetimeTimeLabel: string;
96
+ /** aria-label du sélecteur d’heure (24 h). */
97
+ taskPastDatetimeHourAria: string;
98
+ /** aria-label du sélecteur de minutes. */
99
+ taskPastDatetimeMinuteAria: string;
100
+ /** Bouton rapide pour fixer la date au jour courant. */
101
+ taskPastDatetimeTodayBtn: string;
102
+ /** Bouton rapide pour fixer la date et l’heure à maintenant. */
103
+ taskPastDatetimeNowBtn: string;
104
+ /** Bouton d’ajout d’une tâche à une session archivée / terminée. */
105
+ archiveAddTaskBtn: string;
106
+ /** Erreur si les dates sont invalides ou si la fin n’est pas après le début. */
107
+ archiveTaskDatetimeRangeInvalid: string;
108
+ /** Infobulle / aria-label : ligne du titre de la tâche active (clic pour éditer). */
109
+ activeTaskTitleEditHint: string;
110
+ /** aria-label du champ d’édition du titre de la tâche active. */
111
+ activeTaskTitleInputAria: string;
112
+ startTaskBtn: string;
113
+ finishTaskBtn: string;
114
+ /** Titre du modal : terminer alors qu’il reste des points de détail ouverts. */
115
+ finishTaskOpenSubtasksWarnTitle: string;
116
+ /** Corps du modal : les sous-tâches ouvertes seront toutes marquées terminées. */
117
+ finishTaskOpenSubtasksWarnBody: string;
118
+ taskDeleteBtn: string;
119
+ /** Texte complet du modal avant suppression d’une tâche. */
120
+ taskDeleteConfirm: string;
121
+ /** Titre du modal : autre tâche avec suivi actif au démarrage. */
122
+ taskConcurrentTrackingConflictTitle: string;
123
+ taskConcurrentTrackingConflictMessage: string;
124
+ taskConcurrentTrackingConflictPauseBtn: string;
125
+ taskConcurrentTrackingConflictFinishBtn: string;
126
+ /** Lancer la nouvelle tâche sans toucher aux tâches déjà au minuteur (plusieurs en parallèle). */
127
+ taskConcurrentTrackingConflictParallelBtn: string;
128
+ /** Case à cocher : mémoriser le choix pour les prochains démarrages. */
129
+ taskConcurrentTrackingDontShowAgain: string;
130
+ /** Libellé court à côté de la case (avec icône Git). */
131
+ commitOnFinishShort: string;
132
+ /** Description complète (infobulle / aria-label de la case). */
133
+ commitOnFinishHint: string;
134
+ /** aria-label du bouton bascule Git — état inactif. */
135
+ commitOnFinishToggleAriaOff: string;
136
+ /** aria-label du bouton bascule Git — état actif. */
137
+ commitOnFinishToggleAriaOn: string;
138
+ /** Sous-titre : tâches en pause dans la session. */
139
+ tasksPausedHeading: string;
140
+ /** Sous-titre : tâches terminées. */
141
+ tasksCompletedHeading: string;
142
+ /** Sous-titre : tâches au minuteur (sous le formulaire d’ajout). */
143
+ tasksRunningHeading: string;
144
+ hideTaskList: string;
145
+ showAllTasks: string;
146
+ importGitIssue: string;
147
+ pauseTaskBtn: string;
148
+ resumeTaskBtn: string;
149
+ taskTimerPausedManual: string;
150
+ pausedNote: string;
151
+ /** Titre de la bannière quand une archive est affichée sans pause collecte (ex. onglet ?session=). */
152
+ viewingHistoryBannerTitle: string;
153
+ resumeBtn: string;
154
+ inspectingLabel: string;
155
+ /** aria-label de la région « consultation d’historique » au-dessus des tâches. */
156
+ historyInspectBannerAria: string;
157
+ autoTagsDetected: string;
158
+ /** Ligne de prévisualisation quand un `@projet` est détecté dans le champ de démarrage. */
159
+ autoProjectDetected: string;
160
+ /** Bouton d’aide (tags) — libellé court pour aria-label. */
161
+ tagsHelpAriaLabel: string;
162
+ /** Règles de saisie #tag dans le panneau d’aide. */
163
+ tagSyntaxHelp: string;
164
+ /** Pastilles de tags connus dans le panneau d’aide. */
165
+ tagSuggestionsHelp: string;
166
+ /** Résumé : titre vs raccourcis (popover aide étiquettes). */
167
+ tagsHelpWorkflowSummary: string;
168
+ /** Titre d’aide : rangée de pastilles « tout ce qui est sur la tâche ». */
169
+ taskAppliedTagsHelpHeading: string;
170
+ /** Détail : fusion titre / raccourcis / sélecteur. */
171
+ taskAppliedTagsHelpHint: string;
172
+ /** `aria-label` du (?) à côté des pastilles d’étiquettes appliquées. */
173
+ taskTagsExtraHelpAria: string;
174
+ /** Popover : projet du titre absent des enregistrés. */
175
+ taskTagsOrphanProjectHelpBody: string;
176
+ /** Champ rapide sous une tâche : #étiquette, @projet, texte seul ; Entrée pour appliquer. */
177
+ taskTagProjectQuickAddPlaceholder: string;
178
+ taskTagProjectQuickAddAria: string;
179
+ /** Liste native multi : regroupement des étiquettes enregistrées. */
180
+ taskTagProjectMultiGroupTags: string;
181
+ /** Liste native multi : regroupement des projets enregistrés. */
182
+ taskTagProjectMultiGroupProjects: string;
183
+ /** Option explicite pour retirer le projet (valeur `@`). */
184
+ taskTagProjectMultiOptionClearProject: string;
185
+ /** `aria-label` du `<select multiple>`. */
186
+ taskTagProjectMultiSelectAria: string;
187
+ /** Libellé affiché pour l’étiquette réservée lorsqu’aucune autre n’est définie (clé stockée : « default »). */
188
+ taskTagDefaultBucket: string;
189
+ /** Indice d’usage (Ctrl / ⌘ + clic). */
190
+ taskTagProjectMultiHint: string;
191
+ /** Bouton qui applique la sélection du `<select multiple>`. */
192
+ taskTagProjectApplySelectionBtn: string;
193
+ tagsUserGuideIntro: string;
194
+ tagsUserGuideBasicsTitle: string;
195
+ tagsUserGuideBasicsBody: string;
196
+ tagsUserGuideShortcutsTitle: string;
197
+ tagsUserGuideShortcutsBody: string;
198
+ tagsUserGuideScopedTitle: string;
199
+ tagsUserGuideScopedBody: string;
200
+ tagsUserGuideUseCasesTitle: string;
201
+ tagsUserGuideUseCasesBody: string;
202
+ tagsUserGuideFooterNote: string;
203
+ subtasksHeading: string;
204
+ addSubtaskPlaceholder: string;
205
+ addSubtaskBtn: string;
206
+ subtaskMarkDone: string;
207
+ subtaskMarkUndone: string;
208
+ subtaskDelete: string;
209
+ /** Poignée de glisser-déposer pour réordonner les sous-tâches. */
210
+ subtaskDragReorderHandle: string;
211
+ /** Bouton : monter la sous-tâche d’un cran. */
212
+ subtaskMoveUp: string;
213
+ /** Bouton : descendre la sous-tâche d’un cran. */
214
+ subtaskMoveDown: string;
215
+ subtaskTimerStart: string;
216
+ subtaskTimerStop: string;
217
+ /** Durée sous-tâche : aucun suivi minuteur sur ce point (session live). */
218
+ subtaskDurationNotMeasured: string;
219
+ /** Durée sous-tâche : absent de l’instantané (consultation d’historique, point encore ouvert). */
220
+ subtaskDurationNotRecorded: string;
221
+ /** Durée sous-tâche : pas affichée comme durée (point terminé sans temps dans l’archive). */
222
+ subtaskDurationNotShown: string;
223
+ subtaskDurationTooltipNotMeasured: string;
224
+ subtaskDurationTooltipNotRecorded: string;
225
+ subtaskDurationTooltipNotShown: string;
226
+ noData: string;
227
+ selectIssue: string;
228
+ /** Titre de la modale d’import d’issue GitLab. */
229
+ issuePickerSearchPlaceholder: string;
230
+ issuePickerSearchMinHint: string;
231
+ issuePickerLoading: string;
232
+ issuePickerNoResults: string;
233
+ issuePickerCloseAria: string;
234
+ /** Erreur si l’action `fetchRemoteIssues` (navigateur → serveur) dépasse le délai. */
235
+ issuePickerDashboardRequestTimeout: string;
236
+ noIssuesFound: string;
237
+ sessionsColumnTitle: string;
238
+ /** `aria-label` du bouton (?) unique à côté du titre Sessions. */
239
+ sessionsColumnHelpAria: string;
240
+ /** Corps du popover (deux paragraphes, séparés par \\n\\n). */
241
+ sessionsColumnHelpBody: string;
242
+ /** Bandeau d’aide : phrase principale colonne Sessions (au-dessus de la grille). */
243
+ dashboardColSessionTeaser: string;
244
+ /** Bandeau : indice de suite (ex. vers les tâches). */
245
+ dashboardColSessionFlowHint: string;
246
+ /** Bandeau : phrase principale colonne Tâches. */
247
+ dashboardColTasksTeaser: string;
248
+ /** Bandeau : indice de suite (ex. vers les étiquettes). */
249
+ dashboardColTasksFlowHint: string;
250
+ /** Bandeau : phrase principale colonne Étiquettes & projets. */
251
+ dashboardColTagsTeaser: string;
252
+ /** Bandeau : fin du parcours ou rappel court. */
253
+ dashboardColTagsFlowHint: string;
254
+ /** Titre du bandeau repliable « comment lire les colonnes ». */
255
+ dashboardColumnHintsPanelTitle: string;
256
+ /** `aria-label` du bouton lorsque le bandeau est replié (pour l’ouvrir). */
257
+ dashboardColumnHintsExpandAria: string;
258
+ /** `aria-label` du bouton lorsque le bandeau est déplié (pour le replier). */
259
+ dashboardColumnHintsCollapseAria: string;
260
+ /** Infobulle et `aria-label` du bouton qui masque définitivement le bandeau des colonnes. */
261
+ dashboardColumnHintsDismissTitle: string;
262
+ /** `aria-label` de la navigation liste des sessions (pas de titre visible). */
263
+ sessionsListAriaLabel: string;
264
+ sessionLiveBadge: string;
265
+ /** Infobulle sur la durée murale dans chaque ligne de la liste des sessions. */
266
+ sessionListWallDurationTitle: string;
267
+ /** Infobulle durée au seuil d’alerte ; remplacer `{hours}` par le nombre d’heures du seuil. */
268
+ sessionListWallDurationAlertTooltip: string;
269
+ /** Liste sessions : préfixe avant l’horodatage de début (ex. « Début : »). */
270
+ sessionListStartedPrefix: string;
271
+ /** Liste sessions : préfixe avant l’horodatage de fin (session terminée). */
272
+ sessionListEndedPrefix: string;
273
+ /** Terminer la session en cours : enregistrer dans l’historique sans en démarrer une nouvelle. */
274
+ sessionEndLiveTitle: string;
275
+ sessionEndLiveAria: string;
276
+ /** Titre du modal de confirmation si la session a encore du travail en cours. */
277
+ sessionEndLiveConfirmTitle: string;
278
+ /** Premier paragraphe du modal (contexte + mention de l’édition possible en archive). */
279
+ sessionEndLiveConfirmIntro: string;
280
+ /** Corps du modal quand aucun avertissement (travail ouvert) : rappel avant fin de session. */
281
+ sessionEndLiveConfirmIntroCalm: string;
282
+ /** Puce : tâche avec minuteur actif. */
283
+ sessionEndLiveWarnActiveTask: string;
284
+ /** Puce : au moins une tâche en pause ou non terminée. */
285
+ sessionEndLiveWarnPausedTasks: string;
286
+ /** Puce : au moins une sous-tâche non terminée. */
287
+ sessionEndLiveWarnIncompleteSubtasks: string;
288
+ /** Bouton confirmer la fin de session (modal avertissement). */
289
+ sessionEndLiveConfirmBtn: string;
290
+ /** Bouton rouge sous la carte « session sélectionnée » (session live uniquement). */
291
+ sessionEndLiveSidebarBtn: string;
292
+ /** Phrase d’introduction sous le corps du modal de fin de session (raison facultative). */
293
+ sessionEndReasonModalHint: string;
294
+ /** Légende du groupe de choix (fin de session). */
295
+ sessionEndReasonFieldsetLegend: string;
296
+ /** Option : ne pas enregistrer de raison structurée. */
297
+ sessionEndReasonSkip: string;
298
+ /** Fin conforme au temps ou au périmètre prévu. */
299
+ sessionEndReasonPlanned: string;
300
+ /** Fin avant l’échéance ou le temps prévu. */
301
+ sessionEndReasonEarly: string;
302
+ /** Prolongation ou dépassement par rapport au prévu. */
303
+ sessionEndReasonOverrun: string;
304
+ /** Autre motif (précision libre). */
305
+ sessionEndReasonOther: string;
306
+ /** Placeholder de la zone de précision. */
307
+ sessionEndReasonNotePlaceholder: string;
308
+ /** `aria-label` de la zone de précision libre. */
309
+ sessionEndReasonNoteAria: string;
310
+ /** Libellé court dans la carte session (raison de clôture). */
311
+ selectedSessionEndReasonTitle: string;
312
+ /** Texte d’aide sous le titre lors de l’édition de la raison de clôture (session passée). */
313
+ sessionEndReasonEditHint: string;
314
+ /** Bouton pour enregistrer la raison de clôture modifiée. */
315
+ sessionEndReasonSaveBtn: string;
316
+ /** `aria-label` du bouton d’enregistrement de la raison de clôture. */
317
+ sessionEndReasonSaveAria: string;
318
+ /** Libellé du bouton pendant l’enregistrement. */
319
+ sessionEndReasonSaving: string;
320
+ /**
321
+ * Fermeture d’onglet : `beforeunload` quand une session live est ouverte. Certains navigateurs n’affichent
322
+ * qu’un message générique ; « annuler » = rester pour terminer la session ici, « quitter » = la session
323
+ * peut continuer en arrière-plan sur le serveur.
324
+ */
325
+ beforeUnloadLiveSessionMessage: string;
326
+ openSessionInNewTab: string;
327
+ /** Bannière quand l’URL porte ?session= (consultation d’archive isolée à cet onglet). */
328
+ detachedSessionUrlHint: string;
329
+ /** Bouton pour masquer la bannière ci-dessus (mémorisé dans le navigateur). */
330
+ detachedSessionUrlHintDismiss: string;
331
+ /** ?session= inconnu dans l’historique. */
332
+ detachedSessionInvalidUrl: string;
333
+ /** Nom après le chiffre pour 0 ou 1 tâche (ex. « 1 tâche », « 0 task »). */
334
+ tasksInSessionSingular: string;
335
+ /** Nom après le chiffre pour 2+ tâches (ex. « 3 tasks »). */
336
+ tasksInSessionPlural: string;
337
+ rightColumnTitle: string;
338
+ /** Colonne droite du tableau de bord : raccourcis étiquettes / projets. */
339
+ tagsProjectsColumnTitle: string;
340
+ /** Premier paragraphe du popover (?) de la colonne étiquettes et projets. */
341
+ tagsProjectsColumnIntro: string;
342
+ tagsProjectsColumnHelpAria: string;
343
+ tagsProjectsColumnHelpBody: string;
344
+ /** Texte d’aide (popover) : tâches affichées pour la session sélectionnée. */
345
+ tasksColumnSubtitle: string;
346
+ /** `aria-label` du bouton (?) à côté du titre Tâches. */
347
+ tasksColumnSubtitleHelpAria: string;
348
+ /** Colonne tâches : titre lorsqu’aucune session live n’est ouverte (pas d’archive en consultation). */
349
+ taskFocusNoSessionTitle: string;
350
+ /** Colonne tâches : texte d’orientation (démarrer une session à gauche). */
351
+ taskFocusNoSessionBody: string;
352
+ /** Toast : création automatique de session au premier envoi d’une tâche depuis la colonne Tâches. */
353
+ taskStartAutoSessionToast: string;
354
+ /** Colonne gauche : bloc nom + stats de la session sélectionnée. */
355
+ selectedSessionSidebarTitle: string;
356
+ /** Bloc session : message quand aucune session n’est active (pas d’archive inspectée). */
357
+ selectedSessionIdleHint: string;
358
+ /** Aide — durée de session (popover à côté du libellé). */
359
+ statsMetricSessionDurationHelpAria: string;
360
+ statsMetricSessionDurationHelpBody: string;
361
+ /** Aide — temps de codage. */
362
+ statsMetricCodingTimeHelpAria: string;
363
+ statsMetricCodingTimeHelpBody: string;
364
+ /** Aide — temps actif. */
365
+ statsMetricActiveTimeHelpAria: string;
366
+ statsMetricActiveTimeHelpBody: string;
367
+ /** Aide — décompte des tâches par statut (carte session). */
368
+ statsMetricTasksHelpAria: string;
369
+ statsMetricTasksHelpBody: string;
370
+ /** Ligne courte : minuteur actif. */
371
+ statsTasksRowRunning: string;
372
+ /** Ligne courte : liste « non terminées » (section En pause). */
373
+ statsTasksRowPausedList: string;
374
+ /** Ligne courte : tâches terminées. */
375
+ statsTasksRowCompleted: string;
376
+ /** Carte dépôt Git du workspace (branches, commits, graphe, fichiers suivis). */
377
+ gitRepoCardTitle: string;
378
+ gitRepoNotARepo: string;
379
+ gitRepoCardHelpAria: string;
380
+ gitRepoCardHelpBody: string;
381
+ gitRepoCurrentBranchLabel: string;
382
+ gitRepoBranchesLocalLabel: string;
383
+ gitRepoBranchesLocalHelpAria: string;
384
+ gitRepoBranchesLocalHelpBody: string;
385
+ gitRepoBranchesRemoteLabel: string;
386
+ gitRepoBranchesRemoteHelpAria: string;
387
+ gitRepoBranchesRemoteHelpBody: string;
388
+ gitRepoCommitsHeadLabel: string;
389
+ gitRepoCommitsHeadHelpAria: string;
390
+ gitRepoCommitsHeadHelpBody: string;
391
+ gitRepoCommitsAllLabel: string;
392
+ gitRepoCommitsAllHelpAria: string;
393
+ gitRepoCommitsAllHelpBody: string;
394
+ gitRepoStashesLabel: string;
395
+ gitRepoStashesHelpAria: string;
396
+ gitRepoStashesHelpBody: string;
397
+ gitRepoGraphTitle: string;
398
+ gitRepoGraphHelpAria: string;
399
+ gitRepoGraphHelpBody: string;
400
+ gitRepoGraphEmpty: string;
401
+ /** Note sous le titre : l’aperçu dans la carte est tronqué (graphe). */
402
+ gitRepoGraphPreviewNote: string;
403
+ /** Bouton / zone cliquable : ouvrir le graphe complet dans un nouvel onglet. */
404
+ gitRepoGraphOpenFullAria: string;
405
+ /** Infobulle sur la zone du graphe ouvrant un nouvel onglet. */
406
+ gitRepoGraphOpenFullTitle: string;
407
+ /** Titre du document HTML (onglet du navigateur) pour la vue graphe pleine page. */
408
+ gitRepoGraphDetailDocTitle: string;
409
+ gitRepoTreeTitle: string;
410
+ gitRepoTreeHelpAria: string;
411
+ gitRepoTreeHelpBody: string;
412
+ gitRepoTreeEmpty: string;
413
+ /** Note sous le titre : l’aperçu dans la carte est un échantillon (chemins suivis). */
414
+ gitRepoTreePreviewNote: string;
415
+ /** Bouton / zone cliquable : ouvrir la liste des chemins dans un nouvel onglet. */
416
+ gitRepoTreeOpenFullAria: string;
417
+ gitRepoTreeOpenFullTitle: string;
418
+ /** Titre du document HTML (onglet) pour la liste des fichiers suivis. */
419
+ gitRepoTreeDetailDocTitle: string;
420
+ /** Titre de la carte lignes / langages sous les stats principales. */
421
+ statsLocSectionTitle: string;
422
+ statsLinesWrittenTotal: string;
423
+ statsLinesWrittenHuman: string;
424
+ statsLinesWrittenAi: string;
425
+ statsLocByLanguageHeading: string;
426
+ statsCodingSignalsHeading: string;
427
+ statsMetricLinesWrittenHelpAria: string;
428
+ statsMetricLinesWrittenHelpBody: string;
429
+ statsMetricLocByLanguageHelpAria: string;
430
+ statsMetricLocByLanguageHelpBody: string;
431
+ statsMetricCodingSignalsHelpAria: string;
432
+ statsMetricCodingSignalsHelpBody: string;
433
+ sessionNameReadOnly: string;
434
+ sessionArchiveBtn: string;
435
+ sessionArchiveTitle: string;
436
+ sessionRestoreBtn: string;
437
+ sessionDeleteBtn: string;
438
+ sessionDeleteTitle: string;
439
+ sessionDeleteIntro: string;
440
+ sessionDeleteDiscardTasks: string;
441
+ sessionDeleteMoveTasks: string;
442
+ sessionDeleteTargetLabel: string;
443
+ sessionDeleteTargetPlaceholder: string;
444
+ sessionDeleteConfirmBtn: string;
445
+ sessionDeleteCancelBtn: string;
446
+ archivesModalTitle: string;
447
+ archivesEmpty: string;
448
+ archivesCloseBtn: string;
449
+ archivedBadge: string;
450
+ sessionArchiveConfirm: string;
451
+ /** Case à cocher sous la modale d’archivage. */
452
+ sessionArchiveDontShowAgain: string;
453
+ /** Pastille en-tête — stockage local (SQLite / JSON) ou miroir MongoDB connecté. */
454
+ storageBadgeLabelSqlite: string;
455
+ storageBadgeTooltipSqlite: string;
456
+ storageBadgeLabelJson: string;
457
+ storageBadgeTooltipJson: string;
458
+ storageBadgeLabelMongo: string;
459
+ storageBadgeTooltipMongo: string;
460
+ /** Sous la pastille de stockage dans l’en-tête (chemins du workspace). */
461
+ workspaceFoldersLabel: string;
462
+ workspaceFoldersEmpty: string;
463
+ /**
464
+ * Infobulle / aria-label de la ligne fuseau + format d’heure (en-tête, près de l’identité).
465
+ * Placeholders : `{timeZone}`, `{clock}` (libellés courts 24 h / 12 h).
466
+ */
467
+ headerDisplayRegionTitle: string;
468
+ /** Libellé court format 24 h (ligne d’en-tête). */
469
+ headerClockFormat24Short: string;
470
+ /** Libellé court format 12 h (ligne d’en-tête). */
471
+ headerClockFormat12Short: string;
472
+ /** Bannière : aucun auteur Git enregistré (tableau de bord web local). */
473
+ gitIdentityBannerAria: string;
474
+ gitIdentityBannerBody: string;
475
+ gitIdentityBannerConfigure: string;
476
+ gitIdentityBannerDismiss: string;
477
+ /** Modale rapide : titre, introduction, validation, erreur, rappel paramètres. */
478
+ gitIdentityModalTitle: string;
479
+ gitIdentityModalIntro: string;
480
+ gitIdentityModalNeedOneField: string;
481
+ gitIdentityModalSaveError: string;
482
+ gitIdentityModalFooter: string;
483
+ /** Libellé court « sessions dans les fichiers JSON » (ligne sync Mongo). */
484
+ mongoSyncLocalLabel: string;
485
+ mongoSyncMongoLabel: string;
486
+ mongoSyncStatusAligned: string;
487
+ mongoSyncStatusUnknown: string;
488
+ mongoSyncStatusLocalAhead: string;
489
+ mongoSyncStatusMongoAhead: string;
490
+ mongoSyncHelpAriaLabel: string;
491
+ mongoSyncHelpBody: string;
492
+ /** Bouton envoi session → Mongo (liste sessions). */
493
+ sessionMongoPushAriaLabel: string;
494
+ sessionMongoPushSyncedTitle: string;
495
+ sessionMongoPushDirtyTitle: string;
496
+ sessionMongoPushNeverTitle: string;
497
+ sessionMongoPushBusy: string;
498
+ sessionMongoPushFailedDisabled: string;
499
+ sessionMongoPushFailedNotFound: string;
500
+ sessionMongoPushFailedMongo: string;
501
+ sessionMongoPushFailedUri: string;
502
+ /** Bouton OK des modales de message (remplace les alertes natives). */
503
+ /** Overlay de chargement initial (API tableau de bord). */
504
+ dashboardLoadingAriaLabel: string;
505
+ /** Texte visible sous le spinner (complète l’aria-label). */
506
+ dashboardLoadingMessage: string;
507
+ /** Champ / bouton ouvrant la recherche rapide (données). */
508
+ dataSearchTrigger: string;
509
+ dataSearchPlaceholder: string;
510
+ dataSearchPaletteAriaLabel: string;
511
+ /** Quand la palette est ouverte sans requête : inviter à saisir (sessions, tâches, projets, étiquettes). */
512
+ dataSearchTypePrompt: string;
513
+ dataSearchEmpty: string;
514
+ dataSearchFooter: string;
515
+ /** Sous-titre d’une ligne session dans la palette. */
516
+ dataSearchKindSession: string;
517
+ /** Sous-titre d’une ligne tâche dans la palette. */
518
+ dataSearchKindTask: string;
519
+ /**
520
+ * Deux tâches au même titre : afficher l’id pour les distinguer. Placeholder : `{id}`.
521
+ * Ex. « ID: {id} » — l’id est en tête de la ligne de détail pour rester visible à l’écran.
522
+ */
523
+ dataSearchTaskDistinguishId: string;
524
+ /** Libellé court avant la valeur chrono (palette de recherche). */
525
+ dataSearchTaskStopwatchLabel: string;
526
+ /** Libellé du temps enregistré (palette de recherche, tâche). */
527
+ dataSearchTaskRecordedTimeLabel: string;
528
+ /** Libellé durée murale (palette de recherche, session). */
529
+ dataSearchSessionWallLabel: string;
530
+ commandNewSession: string;
531
+ commandRefresh: string;
532
+ commandOpenReporting: string;
533
+ commandOpenSettings: string;
534
+ commandOpenUserGuide: string;
535
+ commandFocusSessions: string;
536
+ commandFocusTasks: string;
537
+ commandFocusTags: string;
538
+ commandToggleTheme: string;
539
+ commandToggleLang: string;
540
+ commandEndLiveSession: string;
541
+ shortcutsModalTitle: string;
542
+ /** aria-label du bouton fermer (icône X) de la modale raccourcis. */
543
+ shortcutsModalCloseAriaLabel: string;
544
+ shortcutsModalIntro: string;
545
+ shortcutsTableAction: string;
546
+ shortcutsTableShortcut: string;
547
+ /** En-tête de colonne pour le bouton d’enregistrement d’une nouvelle combinaison. */
548
+ shortcutsTableAssign: string;
549
+ shortcutsChangeBtn: string;
550
+ shortcutsRecordPrompt: string;
551
+ shortcutsResetAll: string;
552
+ /** Ligne fixe : raccourci réservé à la recherche rapide (non modifiable dans la grille). */
553
+ shortcutsPaletteRow: string;
554
+ /** Visite guidée — remplacer `{n}` et `{total}` par les numéros d’étape. */
555
+ tourProgressLabel: string;
556
+ tourStep1Title: string;
557
+ tourStep1Body: string;
558
+ tourStep2Title: string;
559
+ tourStep2Body: string;
560
+ tourStep3Title: string;
561
+ tourStep3Body: string;
562
+ tourStep4Title: string;
563
+ tourStep4Body: string;
564
+ tourStep5Title: string;
565
+ tourStep5Body: string;
566
+ tourStep6Title: string;
567
+ tourStep6Body: string;
568
+ tourStep7Title: string;
569
+ tourStep7Body: string;
570
+ tourStep8Title: string;
571
+ tourStep8Body: string;
572
+ /** Lien externe (étape KronoFocus) — URL complète https. */
573
+ tourStep8LearnMoreUrl: string;
574
+ tourStep8LearnMoreLabel: string;
575
+ tourStep8LearnMoreAriaLabel: string;
576
+ tourStep9Title: string;
577
+ tourStep9Body: string;
578
+ tourSkipBtn: string;
579
+ tourBackBtn: string;
580
+ tourNextBtn: string;
581
+ tourDoneBtn: string;
582
+ /** Visite guidée paramètres — remplacer `{n}` et `{total}` par les numéros d’étape. */
583
+ settingsTourProgressLabel: string;
584
+ settingsTourStep1Title: string;
585
+ settingsTourStep1Body: string;
586
+ settingsTourStep2Title: string;
587
+ settingsTourStep2Body: string;
588
+ settingsTourStep3Title: string;
589
+ settingsTourStep3Body: string;
590
+ settingsTourStep4Title: string;
591
+ settingsTourStep4Body: string;
592
+ settingsTourStep5Title: string;
593
+ settingsTourStep5Body: string;
594
+ settingsTourStep6Title: string;
595
+ settingsTourStep6Body: string;
596
+ settingsTourSkipBtn: string;
597
+ settingsTourBackBtn: string;
598
+ settingsTourNextBtn: string;
599
+ settingsTourDoneBtn: string;
600
+ /** Bouton de réinitialisation/rappel de la visite guidée. */
601
+ tourUndismissBtn: string;
602
+ /** Visite guidée Rapports — remplacer `{n}` et `{total}` par les numéros d’étape. */
603
+ reportingTourProgressLabel: string;
604
+ reportingTourStep1Title: string;
605
+ reportingTourStep1Body: string;
606
+ reportingTourStep2Title: string;
607
+ reportingTourStep2Body: string;
608
+ reportingTourStep3Title: string;
609
+ reportingTourStep3Body: string;
610
+ reportingTourStep4Title: string;
611
+ reportingTourStep4Body: string;
612
+ reportingTourStep5Title: string;
613
+ reportingTourStep5Body: string;
614
+ reportingTourStep6Title: string;
615
+ reportingTourStep6Body: string;
616
+ /** Modale « nouvelle session » — titre. */
617
+ newSessionModalTitle: string;
618
+ /** aria-label du bouton d’aide (portée de session). */
619
+ newSessionModalHelpAria: string;
620
+ /** Popover : durée max, période calendaire, jours / horaires (comportement des rappels). */
621
+ newSessionModalHelpBody: string;
622
+ newSessionModeNone: string;
623
+ newSessionModeMax: string;
624
+ newSessionModeCalendar: string;
625
+ newSessionModeWeekly: string;
626
+ newSessionMaxHoursLabel: string;
627
+ newSessionDateFromLabel: string;
628
+ newSessionDateToLabel: string;
629
+ newSessionTodayBtn: string;
630
+ newSessionWeekdaysLegend: string;
631
+ newSessionTimeFromLabel: string;
632
+ newSessionTimeToLabel: string;
633
+ newSessionNowBtn: string;
634
+ newSessionUseTimeWindow: string;
635
+ newSessionErrorMax: string;
636
+ newSessionErrorCalendar: string;
637
+ newSessionErrorWeekly: string;
638
+ newSessionStartBtn: string;
639
+ newSessionCancelBtn: string;
640
+ /** Bannière d’alerte portée de session (rôle status). */
641
+ sessionScopeNoticeAria: string;
642
+ /** `aria-label` du `<nav>` des raccourcis tableau de bord / rapports / paramètres (icônes). */
643
+ appShellRouteNavAria: string;
644
+ /** `aria-label` du panneau d’activité live (hors tableau de bord). */
645
+ appShellLiveDrawerAria: string;
646
+ /** Titre du panneau d’activité live. */
647
+ appShellLiveDrawerTitle: string;
648
+ /** Lien vers le tableau de bord depuis le panneau. */
649
+ appShellLiveDrawerOpenDashboard: string;
650
+ /** Mention que la session est en pause collecte. */
651
+ appShellLiveDrawerSessionPaused: string;
652
+ /** Libellé court pour la durée murale affichée dans le panneau. */
653
+ appShellLiveDrawerWallClock: string;
654
+ /** Sous-titre liste des tâches au minuteur. */
655
+ appShellLiveDrawerTasksHeading: string;
656
+ /** Ligne KronoFocus : minuteur en cours. */
657
+ appShellLiveDrawerKronoFocusRunning: string;
658
+ /** Ligne KronoFocus : minuteur en pause. */
659
+ appShellLiveDrawerKronoFocusPaused: string;
660
+ /** Phase travail dans le tiroir live (court ; le titre du bloc est déjà « KronoFocus »). */
661
+ appShellLiveDrawerKronoFocusPhaseWork: string;
662
+ /** Sous-tâche suivie (préfixe avant le titre). */
663
+ appShellLiveDrawerSubtaskTracking: string;
664
+ /** Bouton pour déployer le panneau (état replié). */
665
+ appShellLiveDrawerExpand: string;
666
+ /** Bouton pour replier le panneau (état déployé). */
667
+ appShellLiveDrawerCollapse: string;
668
+ /** Aucune tâche au minuteur (texte du panneau). */
669
+ appShellLiveDrawerNoRunningTasks: string;
670
+ /** Slogan court sous le nom Kronosys (en-têtes) — piste relativité / temps productif. */
671
+ brandTagline: string;
672
+ /** `aria-label` du pastille de version ; remplacer `{version}` par la valeur semver. */
673
+ appVersionAriaLabel: string;
674
+ dialogOkBtn: string;
675
+ dialogCancelBtn: string;
676
+ dialogConfirmBtn: string;
677
+ pageRefreshTitle: string;
678
+ pageRefreshAriaLabel: string;
679
+ /** Court message sous le bouton de rafraîchissement pendant la requête. */
680
+ pageRefreshProgressLabel: string;
681
+ /** Message de fin réussi (bandeau sous le bouton ou toast selon l’écran). */
682
+ pageRefreshDoneToast: string;
683
+ /** Message d’échec (bandeau sous le bouton ou toast selon l’écran). */
684
+ pageRefreshFailedToast: string;
685
+ };
686
+
687
+ const en: DashboardStrings = {
688
+ kronoFocusTitle: "KronoFocus",
689
+ workMode: "KronoFocus",
690
+ breakMode: "Short break",
691
+ longBreakMode: "Long break",
692
+ kronoFocusStart: "Start",
693
+ kronoFocusPause: "Pause",
694
+ kronoFocusReset: "Reset",
695
+ kronoFocusStandaloneSubtitle:
696
+ "KronoFocus is Kronosys’s attention rhythm: one work segment at a time (duration you set), short pauses between segments, and a longer pause after several cycles. The counters and phases belong to Kronosys—they are not a Pomodoro timer clone.",
697
+ kronoFocusAutoRefreshNote: "",
698
+ kronoFocusPanelHelpAriaLabel: "KronoFocus panel help",
699
+ kronoFocusLiveWhileViewingArchive:
700
+ "While you browse an archived session, this still shows KronoFocus for the active live session (if any).",
701
+ kronoFocusLinkedTaskIntro: "Started from:",
702
+ kronoFocusEditDurationTitle: "Configure KronoFocus rhythm (timer not started)",
703
+ kronoFocusDurationPickerLabel: "Duration (hours : minutes : seconds)",
704
+ kronoFocusApplyDuration: "Apply",
705
+ kronoFocusCancelDurationEdit: "Cancel",
706
+ kronoFocusDurationHelpAriaLabel: "Duration help",
707
+ kronoFocusDurationHelpBody:
708
+ "Enter the work segment length as hours, minutes, and seconds (elapsed time, e.g. 00:25:00 or 01:30:00 — not a time of day). You may omit seconds (e.g. 0:25). Range: 1 minute to 8 hours. Short and long breaks are set in whole minutes in the same dialog. Set everything before starting KronoFocus.",
709
+ kronoFocusDurationInputPlaceholder: "00:25:00",
710
+ kronoFocusDefaultWorkDuration: "Default — 00:25:00",
711
+ kronoFocusDurationHistoryLabel: "Recent custom durations",
712
+ kronoFocusDurationHistoryPickAria: "Select duration {time}",
713
+ kronoFocusDurationHistoryClear: "Clear",
714
+ kronoFocusDurationHistoryClearTitle: "Clear all saved custom durations",
715
+ kronoFocusRhythmPresetsHeading: "Quick presets (work / short / long break)",
716
+ kronoFocusRhythmPresetLabels: ["25 / 5", "50 / 10", "45 / 15", "52 / 17"],
717
+ kronoFocusRhythmPresetTitles: [
718
+ "25 min work, 5 min short break, 15 min long break after every 4 work segments",
719
+ "50 min work, 10 min short break, 20 min long break after every 4 work segments",
720
+ "45 min work, 15 min short break, 15 min long break after every 4 work segments",
721
+ "52 min work, 17 min short break, 30 min long break after every 4 work segments",
722
+ ],
723
+ kronoFocusShortBreakMinutesLabel: "Short break (minutes)",
724
+ kronoFocusLongBreakMinutesLabel: "Long break (minutes)",
725
+ kronoFocusRhythmBreaksMinutesHint: "Whole minutes, 1–480 each. Long break runs after every 4 completed work segments.",
726
+ startTaskWithKronoFocus: "Also start the KronoFocus timer",
727
+ startTaskWithKronoFocusToggleAriaOff:
728
+ "Also start KronoFocus when tracking begins — off. Press to turn on.",
729
+ startTaskWithKronoFocusToggleAriaOn:
730
+ "Also start KronoFocus when tracking begins — on. Press to turn off.",
731
+ startKronoFocusFromActiveTask: "Start KronoFocus",
732
+ startKronoFocusFromTaskConfirm:
733
+ "KronoFocus is already running or paused. Reset the timer and start a new work segment?",
734
+ launcherTitle: "Tasks",
735
+ taskTrackerTitle: "In focus",
736
+ taskPlaceholder: "What are you working on?",
737
+ taskPlaceholderPast: "What did you work on?",
738
+ archiveAddTaskIntro:
739
+ "Past entry: set start and end. Tags and @project work as usual; timers and detail items do not apply — live or archived session.",
740
+ archiveAddTaskIntroHelpAria: "Help: past entry",
741
+ taskEntryModeRealtime: "Real-time",
742
+ taskEntryModePast: "Past",
743
+ taskEntryModeGroupAria: "Entry mode",
744
+ archiveTaskStartLabel: "Start",
745
+ archiveTaskEndLabel: "End",
746
+ taskTimingDurationLabel: "Duration",
747
+ taskStartTimeSaveAria: "Save corrected task start time",
748
+ sessionStartTimeSaveAria: "Save corrected session start time",
749
+ taskEndTimeSaveAria: "Save corrected task end time",
750
+ sessionEndTimeSaveAria: "Save corrected session end time",
751
+ sessionEndTimeEditSectionTitle: "Session end",
752
+ sessionStartTimeEditSectionTitle: "Session start",
753
+ taskPastDatetimePlaceholder: "yy-mm-dd --:--:--",
754
+ taskPastDatetimeTimeLabel: "Time",
755
+ taskPastDatetimeHourAria: "Hour (24-hour clock)",
756
+ taskPastDatetimeMinuteAria: "Minutes",
757
+ taskPastDatetimeTodayBtn: "Today",
758
+ taskPastDatetimeNowBtn: "Now",
759
+ archiveAddTaskBtn: "Add to session",
760
+ archiveTaskDatetimeRangeInvalid:
761
+ "Enter a valid start and end; the end must be after the start (local date and time).",
762
+ activeTaskTitleEditHint: "Click to edit title; type #tags in the field or use the row below",
763
+ activeTaskTitleInputAria: "Edit title; optional #tags or @project in the field, pills below for existing tags",
764
+ startTaskBtn: "Start tracking",
765
+ finishTaskBtn: "Finish",
766
+ finishTaskOpenSubtasksWarnTitle: "Finish task?",
767
+ finishTaskOpenSubtasksWarnBody:
768
+ "This task still has open detail items. They will all be marked done when you finish the task.",
769
+ taskDeleteBtn: "Delete",
770
+ taskDeleteConfirm:
771
+ "Delete this entry? Recorded time will be lost. This cannot be undone.",
772
+ taskConcurrentTrackingConflictTitle: "Tracking already active",
773
+ taskConcurrentTrackingConflictMessage:
774
+ "One or more tasks already have a running timer. Choose what to do with them before starting this task: finish them (moved to completed), pause them (resume later from the paused list), or keep them running and start this task in parallel.",
775
+ taskConcurrentTrackingConflictPauseBtn: "Pause active tasks",
776
+ taskConcurrentTrackingConflictFinishBtn: "Finish active tasks",
777
+ taskConcurrentTrackingConflictParallelBtn: "Start in parallel (keep timers running)",
778
+ taskConcurrentTrackingDontShowAgain:
779
+ "Remember this choice and don’t show this dialog again (the same action will run automatically next time).",
780
+ commitOnFinishShort: "Git commit",
781
+ commitOnFinishHint: "Build Git commit message when finishing",
782
+ commitOnFinishToggleAriaOff:
783
+ "Offer a Git commit message when finishing — off. Press to turn on.",
784
+ commitOnFinishToggleAriaOn:
785
+ "Offer a Git commit message when finishing — on. Press to turn off.",
786
+ tasksPausedHeading: "Paused",
787
+ tasksCompletedHeading: "Completed",
788
+ tasksRunningHeading: "Running now",
789
+ hideTaskList: "Hide list",
790
+ showAllTasks: "Show full list",
791
+ importGitIssue: "Import issue from Git",
792
+ pauseTaskBtn: "Pause — moves to the paused list",
793
+ resumeTaskBtn: "Resume tracking",
794
+ taskTimerPausedManual: "Timer paused (manual).",
795
+ pausedNote: "Session is paused because you are inspecting history.",
796
+ viewingHistoryBannerTitle: "You are viewing a past session.",
797
+ resumeBtn: "Resume active session",
798
+ inspectingLabel: "Viewing session:",
799
+ historyInspectBannerAria: "Past session view",
800
+ autoTagsDetected: "Tags detected",
801
+ autoProjectDetected: "Project",
802
+ tagsHelpAriaLabel: "Tag help",
803
+ tagSyntaxHelp:
804
+ "#tag after a space or at the start, or glued (word#tag). @project uses the same placement; the first @ wins. Tokens: letters, numbers, -, _ (no spaces).",
805
+ tagSuggestionsHelp:
806
+ "Next to this (?), the small field applies a line like #tag, @project, or a plain tag name when you press Enter. Typing #tag in the title is separate.",
807
+ tagsHelpWorkflowSummary:
808
+ "Read-only labels above list every tag on the task; the project line shows its project. Edit the title or use the quick field (Enter). @Project#code is optional.",
809
+ taskAppliedTagsHelpHeading: "Tags on this task",
810
+ taskAppliedTagsHelpHint:
811
+ "Everything merged from the title, the new-task field, and the quick line under each task. Type #tag, @project, or a tag name and press Enter; @ alone clears the project.",
812
+ taskTagsExtraHelpAria: "Help: tags and project applied to this task",
813
+ taskTagsOrphanProjectHelpBody:
814
+ "From the title, not in your saved list. Pin under Tags & projects or change the title.",
815
+ taskTagProjectQuickAddPlaceholder: "#tag, @project or label… Enter (@ alone clears project)",
816
+ taskTagProjectQuickAddAria: "Quick add: type #tag, @project, or a tag name, then Enter",
817
+ taskTagProjectMultiGroupTags: "Saved tags",
818
+ taskTagProjectMultiGroupProjects: "Saved projects",
819
+ taskTagProjectMultiOptionClearProject: "Clear project (same as @ alone)",
820
+ taskTagProjectMultiSelectAria: "Multi-select saved tags and projects, then use Add selection",
821
+ taskTagDefaultBucket: "default",
822
+ taskTagProjectMultiHint: "Ctrl or ⌘-click to select several rows, then add.",
823
+ taskTagProjectApplySelectionBtn: "Add selection",
824
+ tagsUserGuideIntro:
825
+ "This guide explains how task titles, saved shortcuts, and optional @project#code labels work together. You can ignore advanced features and keep only #tags plus one @project if you prefer.",
826
+ tagsUserGuideBasicsTitle: "Basics: title tokens",
827
+ tagsUserGuideBasicsBody:
828
+ "In the task title you can mix plain text with:\n• #name — a global tag (letters, numbers, hyphen, underscore).\n• @Project — assigns the task to a project (first @ in the title wins).\nTokens can appear after a space or glued to a word (word#tag). The dashboard shows merged tags under the task.",
829
+ tagsUserGuideShortcutsTitle: "Quick field on each task",
830
+ tagsUserGuideShortcutsBody:
831
+ "In Settings → Tags & saved projects (or the Tags column on the right), you pin tags and projects you reuse. On a task, the narrow field next to the tag help (?) suggests those values; press Enter to apply a line (#tag, @project, plain name, or @ alone to clear the project). This does not rewrite the title unless you edit it yourself.",
832
+ tagsUserGuideScopedTitle: "Optional: @project#code (project-scoped labels)",
833
+ tagsUserGuideScopedBody:
834
+ "Syntax @Client#invoice in the title stores a label tied to that project (shown as Client#invoice). Useful when the same local label means different things per client, or for stricter reporting. If you never need that, use #tag + @project only — the product supports both styles.",
835
+ tagsUserGuideUseCasesTitle: "Use cases",
836
+ tagsUserGuideUseCasesBody:
837
+ "• Solo dev, one project: type My feature @acme and #frontend — no saved list required.\n• Many tickets: pin #triage, #bugfix, @sprint-42 in Tags & projects; use the quick field per task instead of retyping.\n• Client work: use @ClientA#retainer vs @ClientB#retainer in titles to keep namespaces separate; filter by project in reporting.\n• Retro entry: same # and @ rules in the past-task form; the quick field still accepts the same syntax.",
838
+ tagsUserGuideFooterNote:
839
+ "Descriptions on tags/projects (hover for a few seconds on a chip that has one) are optional notes for your team — they do not change how Kronosys filters data.",
840
+ subtasksHeading: "Detail items",
841
+ addSubtaskPlaceholder: "New item…",
842
+ addSubtaskBtn: "Add",
843
+ subtaskMarkDone: "Mark this item done",
844
+ subtaskMarkUndone: "Mark this item not done",
845
+ subtaskDelete: "Remove this item",
846
+ subtaskDragReorderHandle: "Drag to reorder",
847
+ subtaskMoveUp: "Move this item up",
848
+ subtaskMoveDown: "Move this item down",
849
+ subtaskTimerStart: "Track time on this item",
850
+ subtaskTimerStop: "Stop tracking time on this item",
851
+ subtaskDurationNotMeasured: "Not measured",
852
+ subtaskDurationNotRecorded: "Not recorded",
853
+ subtaskDurationNotShown: "Not shown",
854
+ subtaskDurationTooltipNotMeasured:
855
+ "No time has been accumulated on this item yet. Use the play control to start tracking.",
856
+ subtaskDurationTooltipNotRecorded:
857
+ "This snapshot does not include a duration for this item (not tracked here or missing from the saved snapshot).",
858
+ subtaskDurationTooltipNotShown:
859
+ "No duration is shown for completed items without recorded time in this archived view.",
860
+ noData: "No data yet.",
861
+ selectIssue: "Search a GitLab issue",
862
+ issuePickerSearchPlaceholder: "Title, description, or internal issue number (e.g. 12 or #12)…",
863
+ issuePickerSearchMinHint:
864
+ "Use at least 2 letters for a text search on GitLab. For an internal issue number only, one digit is enough (e.g. 7 or #7).",
865
+ issuePickerLoading: "Searching…",
866
+ issuePickerNoResults:
867
+ "No issues match. Try a few letters from the title or description, or search by internal number only (e.g. 42).",
868
+ issuePickerCloseAria: "Close",
869
+ issuePickerDashboardRequestTimeout:
870
+ "Timed out waiting for the dashboard server (GitLab search). Check that the server is running, your instance URL, then try again.",
871
+ noIssuesFound: "No open issues or CLI not configured.",
872
+ sessionsColumnTitle: "Sessions",
873
+ sessionsColumnHelpAria: "Help: Sessions column",
874
+ sessionsColumnHelpBody:
875
+ "Your saved sessions and the live session appear here while tracking is on.\n\nOpen the active session to edit tracking in real time.",
876
+ dashboardColSessionTeaser: "Pick the session you’re in (or start one). The rest of the dashboard follows that choice.",
877
+ dashboardColSessionFlowHint: "Next → Tasks in the middle",
878
+ dashboardColTasksTeaser: "Log tasks, timers, and KronoFocus — all tied to the session on the left.",
879
+ dashboardColTasksFlowHint: "Then → Tags & projects on the right",
880
+ dashboardColTagsTeaser: "Add #tags, @projects, and shortcuts so history and reports stay clear.",
881
+ dashboardColTagsFlowHint: "Optional, but your future self will notice.",
882
+ dashboardColumnHintsPanelTitle: "How the three columns work",
883
+ dashboardColumnHintsExpandAria: "Show how the three dashboard columns work",
884
+ dashboardColumnHintsCollapseAria: "Hide the column guide",
885
+ dashboardColumnHintsDismissTitle: "Hide this guide permanently",
886
+ sessionsListAriaLabel: "Sessions",
887
+ sessionLiveBadge: "Live",
888
+ sessionListWallDurationTitle:
889
+ "Wall-clock session duration: saved minutes when available, otherwise the span from session start to end.",
890
+ sessionListWallDurationAlertTooltip:
891
+ "At or past the alert threshold ({hours} h) — adjust under Settings → Web dashboard.",
892
+ sessionListStartedPrefix: "Start:",
893
+ sessionListEndedPrefix: "End:",
894
+ sessionEndLiveTitle: "End session — save to history without starting a new one (tracking can stay on)",
895
+ sessionEndLiveAria: "End current session",
896
+ sessionEndLiveConfirmTitle: "End this session?",
897
+ sessionEndLiveConfirmIntro:
898
+ "There is still open work in this session. Ending saves a snapshot to history: timers and item tracking will no longer run for this session, but you can still edit names, tags, and projects when you open the archived session.",
899
+ sessionEndLiveConfirmIntroCalm:
900
+ "Ending saves a snapshot to history with the current end time. Timers and item tracking will no longer run for this session, but you can still edit names, tags, and projects when you open the archived session.",
901
+ sessionEndLiveWarnActiveTask: "Something is currently being tracked (in progress).",
902
+ sessionEndLiveWarnPausedTasks: "One or more entries are paused or not finished.",
903
+ sessionEndLiveWarnIncompleteSubtasks: "One or more items are not marked done.",
904
+ sessionEndLiveConfirmBtn: "End session",
905
+ sessionEndLiveSidebarBtn: "End this session",
906
+ sessionEndReasonModalHint:
907
+ "Optional: record why you are closing the session (reports, timesheets, retrospectives).",
908
+ sessionEndReasonFieldsetLegend: "Closure reason",
909
+ sessionEndReasonSkip: "Do not save a category",
910
+ sessionEndReasonPlanned: "Ended as planned (time or scope)",
911
+ sessionEndReasonEarly: "Ended early (before planned time or deadline)",
912
+ sessionEndReasonOverrun: "Overrun relative to plan",
913
+ sessionEndReasonOther: "Other",
914
+ sessionEndReasonNotePlaceholder: "Optional detail…",
915
+ sessionEndReasonNoteAria: "Optional free-text detail for how this session ended",
916
+ selectedSessionEndReasonTitle: "Closure",
917
+ sessionEndReasonEditHint: "Update the saved closure category or detail for this session.",
918
+ sessionEndReasonSaveBtn: "Save closure",
919
+ sessionEndReasonSaveAria: "Save closure reason",
920
+ sessionEndReasonSaving: "Saving…",
921
+ beforeUnloadLiveSessionMessage:
922
+ "A Kronosys session is open in this dashboard. Closing this tab does not end the session. Use “End this session” in the left column to close it here, or leave this tab — the session keeps running in the background.",
923
+ openSessionInNewTab: "Open this session in a new tab",
924
+ detachedSessionUrlHint:
925
+ "This tab is driven by the URL. Inspecting an archive here only updates this tab — it does not change your live session or which session is selected in other open tabs.",
926
+ detachedSessionUrlHintDismiss: "Hide this note",
927
+ detachedSessionInvalidUrl: "No session matches this URL parameter.",
928
+ tasksInSessionSingular: "item",
929
+ tasksInSessionPlural: "items",
930
+ rightColumnTitle: "Tasks",
931
+ tagsProjectsColumnTitle: "Tags & projects",
932
+ tagsProjectsColumnIntro:
933
+ "Pin shortcuts, descriptions, and hide chips — same as in Settings, here while you work. Use the two tabs to switch between global tags and projects.",
934
+ tagsProjectsColumnHelpAria: "Help: tags & projects column",
935
+ tagsProjectsColumnHelpBody:
936
+ "Global tags apply to any task. Project-linked tags use Project#code and only appear when that task’s @project matches.\n\nIn this column, the Global tags tab lists shortcuts, hidden tags, and descriptions; the Projects & linked tags tab lists saved projects and per-project codes.\n\nThis column mirrors the Tags & saved projects section in Settings; changes sync immediately.\n\nUse the (?) next to task tags on a card for the full help and use cases.",
937
+ tasksColumnSubtitle: "In progress, paused, and completed for the selected session.",
938
+ tasksColumnSubtitleHelpAria: "Help: what this column shows",
939
+ taskFocusNoSessionTitle: "No active session",
940
+ taskFocusNoSessionBody:
941
+ "Start a session from the Sessions column on the left to track tasks here.",
942
+ taskStartAutoSessionToast:
943
+ "No active session — starting one now so your task can be tracked in this session.",
944
+ selectedSessionSidebarTitle: "Selected session",
945
+ selectedSessionIdleHint:
946
+ "No session is active. Start one to record time, tracking, and metrics.",
947
+ statsMetricSessionDurationHelpAria: "Help: session duration",
948
+ statsMetricSessionDurationHelpBody:
949
+ "Wall-clock time from the first activity event recorded in this session until now (live session) or until the snapshot was saved (archived). Separate from active time, coding time, and tracking or item timers.",
950
+ statsMetricCodingTimeHelpAria: "Help: coding time",
951
+ statsMetricCodingTimeHelpBody:
952
+ "Time accumulated while a productive (non-excluded) file is in the coding context: opened, saved, active editor change, or edits. Stops growing after about one minute without such signals. Independent of the tracking timer.",
953
+ statsMetricActiveTimeHelpAria: "Help: active time",
954
+ statsMetricActiveTimeHelpBody:
955
+ "Time accumulated from workstation activity: edits, file open, selection changes, active editor changes, and window focus. Gaps longer than about three minutes are not counted. Often between coding time and session wall-clock.",
956
+ statsMetricTasksHelpAria: "Help: task counts by status",
957
+ statsMetricTasksHelpBody:
958
+ "For the selected session: tasks with the tracking timer running (“Running now”), tasks not marked done in the task list (“Paused”), and completed tasks. Matches the three sections in the Tasks column.",
959
+ statsTasksRowRunning: "Running (timer)",
960
+ statsTasksRowPausedList: "Not done (list)",
961
+ statsTasksRowCompleted: "Completed",
962
+ gitRepoCardTitle: "Workspace Git repository",
963
+ gitRepoNotARepo: "The first workspace folder is not a Git checkout (or Git is unavailable).",
964
+ gitRepoCardHelpAria: "Help: workspace Git overview",
965
+ gitRepoCardHelpBody:
966
+ "Summary of the Git repository at the first workspace root: branch counts, commit counts, a short `git log --graph --all` view, and a sorted sample of tracked paths from `git ls-files`. Updated when the dashboard refreshes from the server.",
967
+ gitRepoCurrentBranchLabel: "Current branch",
968
+ gitRepoBranchesLocalLabel: "Local branches",
969
+ gitRepoBranchesLocalHelpAria: "Help: local branches",
970
+ gitRepoBranchesLocalHelpBody: "Number of local branch refs (`git branch --list`).",
971
+ gitRepoBranchesRemoteLabel: "Remote branches",
972
+ gitRepoBranchesRemoteHelpAria: "Help: remote branches",
973
+ gitRepoBranchesRemoteHelpBody:
974
+ "Number of remote-tracking branches (`git branch -r`), excluding the symbolic `*/HEAD` alias.",
975
+ gitRepoCommitsHeadLabel: "Commits (HEAD)",
976
+ gitRepoCommitsHeadHelpAria: "Help: commits on current branch",
977
+ gitRepoCommitsHeadHelpBody: "Count of commits reachable from HEAD (`git rev-list --count HEAD`), i.e. the current branch history.",
978
+ gitRepoCommitsAllLabel: "Commits (all refs)",
979
+ gitRepoCommitsAllHelpAria: "Help: commits all refs",
980
+ gitRepoCommitsAllHelpBody:
981
+ "Count across all refs (`git rev-list --all --count`). Can be slower on huge repositories; shown as — if the command fails.",
982
+ gitRepoStashesLabel: "Stashes",
983
+ gitRepoStashesHelpAria: "Help: stash list",
984
+ gitRepoStashesHelpBody: "Number of entries in `git stash list`.",
985
+ gitRepoGraphTitle: "Recent graph",
986
+ gitRepoGraphHelpAria: "Help: commit graph",
987
+ gitRepoGraphHelpBody:
988
+ "ASCII graph from `git log --graph --decorate --all` (last 40 commits). Useful to see how branches relate.",
989
+ gitRepoGraphEmpty: "No graph lines returned.",
990
+ gitRepoGraphPreviewNote: "Partial preview — last 40 commits only in this box.",
991
+ gitRepoGraphOpenFullAria: "Open full commit graph in a new tab",
992
+ gitRepoGraphOpenFullTitle: "Open full commit graph in a new browser tab",
993
+ gitRepoGraphDetailDocTitle: "Git commit graph — Kronosys",
994
+ gitRepoTreeTitle: "Tracked files (sample)",
995
+ gitRepoTreeHelpAria: "Help: tracked paths sample",
996
+ gitRepoTreeHelpBody:
997
+ "Alphabetically sorted sample of paths from `git ls-files` (up to 300). Not the full tree; large repos may omit paths beyond the buffer limit.",
998
+ gitRepoTreeEmpty: "No tracked paths in the sample.",
999
+ gitRepoTreePreviewNote: "Partial preview — sample of up to 300 tracked paths.",
1000
+ gitRepoTreeOpenFullAria: "Open full tracked paths list in a new tab",
1001
+ gitRepoTreeOpenFullTitle: "Open full tracked paths list in a new browser tab",
1002
+ gitRepoTreeDetailDocTitle: "Tracked files — Kronosys",
1003
+ statsLocSectionTitle: "Lines & languages",
1004
+ statsLinesWrittenTotal: "Lines written",
1005
+ statsLinesWrittenHuman: "Human (est.)",
1006
+ statsLinesWrittenAi: "AI (est.)",
1007
+ statsLocByLanguageHeading: "Lines by language",
1008
+ statsCodingSignalsHeading: "Coding signals by language",
1009
+ statsMetricLinesWrittenHelpAria: "Help: lines written",
1010
+ statsMetricLinesWrittenHelpBody:
1011
+ "Net lines added from tracked edits (estimated from newlines in diffs). Single large inserts are partially capped. “Human” vs “AI” is a heuristic per edit: multi-range changes, more than ~6 net lines, or a single chunk with many characters and a newline often count as AI-style (agent or paste)—not exact attribution.",
1012
+ statsMetricLocByLanguageHelpAria: "Help: lines by language",
1013
+ statsMetricLocByLanguageHelpBody:
1014
+ "How many net lines were attributed to each language id in this session (same basis as “Lines written”).",
1015
+ statsMetricCodingSignalsHelpAria: "Help: coding signals",
1016
+ statsMetricCodingSignalsHelpBody:
1017
+ "Count of coding-context signals per language (file open, save, edit, active editor change, and heartbeats while recently editing).",
1018
+ sessionNameReadOnly: "Session name (read-only for this archive)",
1019
+ sessionArchiveBtn: "Archive",
1020
+ sessionArchiveTitle: "Hide this session from the list (restorable from Archives)",
1021
+ sessionRestoreBtn: "Restore",
1022
+ sessionDeleteBtn: "Delete",
1023
+ sessionDeleteTitle: "Delete session",
1024
+ sessionDeleteIntro:
1025
+ "This removes the session from your history. Choose what to do with its items.",
1026
+ sessionDeleteDiscardTasks: "Delete items with the session (discard them)",
1027
+ sessionDeleteMoveTasks: "Move items to another session first",
1028
+ sessionDeleteTargetLabel: "Target session",
1029
+ sessionDeleteTargetPlaceholder: "Select a session…",
1030
+ sessionDeleteConfirmBtn: "Delete session",
1031
+ sessionDeleteCancelBtn: "Cancel",
1032
+ archivesModalTitle: "Archived sessions",
1033
+ archivesEmpty: "No archived sessions.",
1034
+ archivesCloseBtn: "Close",
1035
+ archivedBadge: "Archived",
1036
+ sessionArchiveConfirm:
1037
+ "Archive this session?\n\n• Hidden from the list until you restore it from Archives.\n• Reporting omits unfinished entries and any entry with an unchecked item (totals, charts, time by project, linked KronoFocus).",
1038
+ sessionArchiveDontShowAgain: "Don’t show this warning again",
1039
+ storageBadgeLabelSqlite: "SQLite",
1040
+ storageBadgeTooltipSqlite:
1041
+ "Session history is stored in SQLite in your Kronosys data directory (local persistence driver in Settings).",
1042
+ storageBadgeLabelJson: "JSON",
1043
+ storageBadgeTooltipJson:
1044
+ "Session history uses JSON partition files (legacy local driver). You can switch to SQLite in Kronosys settings.",
1045
+ storageBadgeLabelMongo: "MongoDB",
1046
+ storageBadgeTooltipMongo:
1047
+ "MongoDB mirror is enabled and connected. You can push sessions from the list; local sessions still follow your persistence driver.",
1048
+ workspaceFoldersLabel: "Workspace roots",
1049
+ workspaceFoldersEmpty: "No workspace root is configured for this dashboard.",
1050
+ headerDisplayRegionTitle: "Display time zone {timeZone}; clock {clock}.",
1051
+ headerClockFormat24Short: "24 h",
1052
+ headerClockFormat12Short: "12 h (AM/PM)",
1053
+ gitIdentityBannerAria: "Git author not configured",
1054
+ gitIdentityBannerBody:
1055
+ "Set the Git author (name, email, optional forge username) for the line under the dashboard title. Use Set up here to enter them in a quick dialog — values stay local; you can change them anytime under Settings → Git identity.",
1056
+ gitIdentityBannerConfigure: "Set up here",
1057
+ gitIdentityBannerDismiss: "Hide this reminder",
1058
+ gitIdentityModalTitle: "Git author (quick setup)",
1059
+ gitIdentityModalIntro:
1060
+ "Enter at least one of the fields below. Nothing is sent to the cloud from this dialog — data stays in your local Kronosys store, like in Settings.\n\nYou can change or complete these values anytime under Settings → Git identity.",
1061
+ gitIdentityModalNeedOneField: "Fill at least one field (name, email, or forge username) before saving.",
1062
+ gitIdentityModalSaveError: "Could not save. Check the connection and try again.",
1063
+ gitIdentityModalFooter:
1064
+ "GitLab tokens, auto sync, and other advanced options remain under Settings in the Git identity section when you need them.",
1065
+ mongoSyncLocalLabel: "Local JSON",
1066
+ mongoSyncMongoLabel: "MongoDB",
1067
+ mongoSyncStatusAligned: "In sync",
1068
+ mongoSyncStatusUnknown: "Mongo count unavailable",
1069
+ mongoSyncStatusLocalAhead: "Drift — fewer documents in Mongo",
1070
+ mongoSyncStatusMongoAhead: "Drift — more documents in Mongo",
1071
+ mongoSyncHelpAriaLabel: "Help: MongoDB mirror vs local sessions",
1072
+ mongoSyncHelpBody:
1073
+ "Local JSON is the source of truth. Counts are unique sessions in your history files (including archived). MongoDB is updated only when you push a session or use Resync in settings — not on every save. Count mismatches usually mean some sessions were never pushed or extra documents exist in Mongo. The live session is counted locally after it is written to disk.",
1074
+ sessionMongoPushAriaLabel: "Push this session to MongoDB",
1075
+ sessionMongoPushSyncedTitle: "Up to date on MongoDB for this snapshot",
1076
+ sessionMongoPushDirtyTitle: "Session changed since last Mongo push — click to update",
1077
+ sessionMongoPushNeverTitle: "Not yet pushed to MongoDB — click to send",
1078
+ sessionMongoPushBusy: "Pushing…",
1079
+ sessionMongoPushFailedDisabled: "MongoDB is not enabled in settings.",
1080
+ sessionMongoPushFailedNotFound: "Session not found.",
1081
+ sessionMongoPushFailedMongo: "MongoDB rejected the write. Check the connection and logs.",
1082
+ sessionMongoPushFailedUri: "MongoDB connection is incomplete (URI or password).",
1083
+ dashboardLoadingAriaLabel: "Loading dashboard, please wait",
1084
+ dashboardLoadingMessage: "Fetching session data from the Kronosys server…",
1085
+ dataSearchTrigger: "Search data…",
1086
+ dataSearchPlaceholder:
1087
+ "Filter sessions, tasks, projects, tags, dates, or duration (e.g. 12:55 <, 0:10 >)…",
1088
+ dataSearchPaletteAriaLabel: "Quick search",
1089
+ dataSearchTypePrompt:
1090
+ "Type to filter sessions, tasks, projects, and tags in this workspace. You can also use a calendar day or a full timestamp (e.g. 2026-01-15 14:30:00) or a recorded duration condition: minutes:seconds (or h:m:s) with < or >, e.g. 45:00 > or 1:0:0 <.",
1091
+ dataSearchEmpty: "No matching sessions or tasks.",
1092
+ dataSearchFooter: "↑↓ to move · Enter to open · Esc to close",
1093
+ dataSearchKindSession: "Session",
1094
+ dataSearchKindTask: "Task",
1095
+ dataSearchTaskDistinguishId: "ID: {id}",
1096
+ dataSearchTaskStopwatchLabel: "Timer",
1097
+ dataSearchTaskRecordedTimeLabel: "Logged",
1098
+ dataSearchSessionWallLabel: "Wall time",
1099
+ commandNewSession: "New session",
1100
+ commandRefresh: "Refresh dashboard",
1101
+ commandOpenReporting: "Open reporting",
1102
+ commandOpenSettings: "Open settings",
1103
+ commandOpenUserGuide: "Open user guide",
1104
+ commandFocusSessions: "Focus sessions column",
1105
+ commandFocusTasks: "Focus tasks column",
1106
+ commandFocusTags: "Focus tags & projects column",
1107
+ commandToggleTheme: "Toggle light / dark theme",
1108
+ commandToggleLang: "Switch interface language (EN / FR)",
1109
+ commandEndLiveSession: "End live session",
1110
+ shortcutsModalTitle: "Keyboard shortcuts",
1111
+ shortcutsModalCloseAriaLabel: "Close keyboard shortcuts",
1112
+ shortcutsModalIntro:
1113
+ "Click « Change », then press the new shortcut (must include Ctrl, Alt, Shift, or Meta). Escape cancels recording. Ctrl+K / ⌘K is reserved for quick data search (not editable here).",
1114
+ shortcutsTableAction: "Action",
1115
+ shortcutsTableShortcut: "Shortcut",
1116
+ shortcutsTableAssign: "Assign",
1117
+ shortcutsChangeBtn: "Change…",
1118
+ shortcutsRecordPrompt: "Press keys…",
1119
+ shortcutsResetAll: "Reset all to defaults",
1120
+ shortcutsPaletteRow: "Quick data search — Ctrl+K or ⌘K (fixed)",
1121
+ tourProgressLabel: "Step {n} of {total}",
1122
+ tourStep1Title: "Welcome to the Kronosys dashboard",
1123
+ tourStep1Body:
1124
+ "This dashboard loads live session data from this web app (Next.js API routes and local SQLite) — not a static snapshot.",
1125
+ tourStep2Title: "Three-column guide (above the board)",
1126
+ tourStep2Body:
1127
+ "This strip sits just under the header and explains how **Sessions**, **Tasks**, and **Tags & projects** fit together — left to right on a wide screen, stacked on a narrow one, with arrows between the ideas.\n\nOpen or fold it with the chevron; each cell is a short teaser before you dive into the real columns below. **Use the X** to dismiss the whole strip for this browser; turn it back on under **Settings → Dashboard & API → Three-column guide**. Folded and dismissed states are remembered separately.",
1128
+ tourStep3Title: "Sessions (left column)",
1129
+ tourStep3Body:
1130
+ "Browse your session history, start a new session, and inspect the selected session’s duration, coding time, and stats.\n\nWhen a live session is open, you can end it from here; archived sessions open in read-only mode.\n\nFor advanced timing, open Settings (gear): under Dashboard & API, set the **session duration alert** (when a long wall-clock session is highlighted in this column). The **Work schedule** section starts and stops tracking on your weekday hours, and **Specific planned sessions** define recurring blocks that override the general schedule during their time window.",
1131
+ tourStep4Title: "Tasks & focus (center)",
1132
+ tourStep4Body:
1133
+ "Track what you are working on, finish tasks, and use subtasks or Git-linked options when you need them.\n\nThis column follows the session you select in the Sessions column — the rest of the header aligns with that choice.\n\nYou only track one work stream at a time on other parents: starting subtask time on a task also runs that parent’s main stopwatch, and it stops time on other tasks (their segments are saved). If you pause the main stopwatch, any subtask segment in progress on the same task stops and records time. Resuming a parent’s main stopwatch anywhere ends subtask timers on the other tasks and pauses their main stopwatches.\n\nDetail items are optional. The task’s total time is always at least the sum of time on those items; the rest is work recorded on the task without a per-item breakdown.",
1134
+ tourStep5Title: "Tags & projects (right)",
1135
+ tourStep5Body:
1136
+ "Pin tags, manage saved projects, and add descriptions — the same controls as in Settings, available while you work. Two tabs separate global tags from projects and project-linked tags.\n\nIn task titles you can use @project and #tags (including @project#code) to organise work across projects.\n\nReporting (charts) depends heavily on these objects: consistent tags and projects make breakdowns, filters, and trends in Reporting far more meaningful.",
1137
+ tourStep6Title: "Top toolbar: every icon",
1138
+ tourStep6Body:
1139
+ "From left to right in this cluster: quick data search / command palette (same as Ctrl+K or ⌘K), the keyboard icon for shortcut help and custom bindings, navigation icons to Reporting (charts) and Settings (gear), the light/dark theme toggle, refresh data from the API without reloading the whole browser tab, and the language menu (FR / EN).\n\nEach icon has a tooltip on hover; Reporting and Settings open other pages while keeping the same Kronosys shell.",
1140
+ tourStep7Title: "Your Git identity & storage badge",
1141
+ tourStep7Body:
1142
+ "This area shows your Git author line and forge account when they are configured in Settings → Git identity, the workspace roots detected for metrics, and a small badge for how session data is stored here: SQLite (default), JSON driver, or MongoDB mirror when enabled.\n\nSQLite keeps the dashboard payload on this machine under your Kronosys data directory; this page reads and writes it through the local API.",
1143
+ tourStep8Title: "What is KronoFocus?",
1144
+ tourStep8Body:
1145
+ "**KronoFocus** paces your session with a configurable work segment, short breaks, then a long break after several cycles. It is built into Kronosys (counts, phases, how it ties to the session) and is not limited to a fixed Pomodoro-style recipe.\n\nShowing it here or next to task actions is configured under Settings → Dashboard & API (KronoFocus).",
1146
+ tourStep8LearnMoreUrl: "https://en.wikipedia.org/wiki/Time_management",
1147
+ tourStep8LearnMoreLabel: "Further reading — time management (new tab)",
1148
+ tourStep8LearnMoreAriaLabel: "Opens the English Wikipedia article on time management in a new tab",
1149
+ tourStep9Title: "Git identity: your first follow-up after the tour",
1150
+ tourStep9Body:
1151
+ "This panel appears when your Git name, email, or forge account is still empty. Use Set up here to fill a short form without leaving the dashboard — that is the recommended first action once you finish the tour. You can use Hide this reminder if you prefer to postpone.",
1152
+ tourSkipBtn: "Skip tour",
1153
+ tourBackBtn: "Back",
1154
+ tourNextBtn: "Next",
1155
+ tourDoneBtn: "Done",
1156
+ settingsTourProgressLabel: "Step {n} of {total}",
1157
+ settingsTourStep1Title: "Settings & Options",
1158
+ settingsTourStep1Body:
1159
+ "Some advanced options are only available here in the settings, not on the dashboard. This tour highlights key configurations for your workspace.",
1160
+ settingsTourStep2Title: "Usage Profile",
1161
+ settingsTourStep2Body:
1162
+ "Switch between 'Manager' and 'Developer' modes to adjust the level of detail in the dashboard and the frequency of notifications.",
1163
+ settingsTourStep3Title: "Persistence & Drivers",
1164
+ settingsTourStep3Body:
1165
+ "Choose between SQLite (recommended) and legacy JSON for your local history storage. You can also configure a MongoDB mirror for cloud backup.",
1166
+ settingsTourStep4Title: "Git & GitLab Integration",
1167
+ settingsTourStep4Body:
1168
+ "Configure your Git identity and GitLab API token to enable issue importing and commit message generation.",
1169
+ settingsTourStep5Title: "Reporting & Exclusions",
1170
+ settingsTourStep5Body:
1171
+ "Define which directories and file patterns should be excluded from line counting and time tracking to keep your reports clean.",
1172
+ settingsTourStep6Title: "Schedules & Automation",
1173
+ settingsTourStep6Body:
1174
+ "Set up recurring work hours and planned sessions to automatically start tracking or transfer tasks at specific times.",
1175
+ settingsTourSkipBtn: "Skip tour",
1176
+ settingsTourBackBtn: "Back",
1177
+ settingsTourNextBtn: "Next",
1178
+ settingsTourDoneBtn: "Done",
1179
+ tourUndismissBtn: "Relaunch tour",
1180
+ reportingTourProgressLabel: "Reporting tour — step {n} of {total}",
1181
+ reportingTourStep1Title: "Welcome to Kronosys Reporting",
1182
+ reportingTourStep1Body:
1183
+ "This page aggregates your Kronosys history from the local API. Use it to review sessions, recorded task time, KronoFocus usage, and — when filters allow — per-tag and per-project splits.",
1184
+ reportingTourStep2Title: "Filters",
1185
+ reportingTourStep2Body:
1186
+ "Pick a date range (or use Day / Week / Month / Year presets), optionally narrow by #tags, then reset when you want the full picture again. Green badges warn when live data or unfinished tasks still affect the totals.",
1187
+ reportingTourStep3Title: "Summary KPIs",
1188
+ reportingTourStep3Body:
1189
+ "These cards condense the same window as the charts: session counts, task rows, KronoFocus stats, and recorded minutes. The (?) icons open short metric definitions without cluttering the layout.",
1190
+ reportingTourStep4Title: "Daily charts",
1191
+ reportingTourStep4Body:
1192
+ "Bar views show sessions, tasks by status, recorded task time, and session wall-clock by calendar day. When several weeks exist, use the week strip to align charts and tag calendars.",
1193
+ reportingTourStep5Title: "Time by tag and by project",
1194
+ reportingTourStep5Body:
1195
+ "Review recorded task minutes grouped by #tags (including the untagged bucket when it applies) and by @project, with weekly grids when data spans multiple days.",
1196
+ reportingTourStep6Title: "Outline and two-column layout",
1197
+ reportingTourStep6Body:
1198
+ "This block is the main Reporting layout: your content on the left and, on wide screens, a sticky jump list on the right. On phones, the same anchors appear as chips above the filters.",
1199
+ newSessionModalTitle: "New session — scope",
1200
+ newSessionModalHelpAria: "Help: session scope (duration, dates, weekdays)",
1201
+ newSessionModalHelpBody:
1202
+ "These options set expectations for this session only. They do not stop Kronosys automatically: you get reminders from the collector (heartbeat) and a banner here when you are close to or outside the limits.\n\n• Maximum wall-clock duration — counted from the first tracked event in the session.\n\n• Calendar period — local dates inclusive (start and/or end).\n\n• Weekdays — restrict to selected days; you can add a daily time window (local 24 h). Overnight windows are supported (e.g. 22:00–06:00).",
1203
+ newSessionModeNone: "No limit",
1204
+ newSessionModeMax: "Maximum wall-clock duration",
1205
+ newSessionModeCalendar: "Calendar period (dates)",
1206
+ newSessionModeWeekly: "Weekdays (optional daily hours)",
1207
+ newSessionMaxHoursLabel: "Max duration (hours)",
1208
+ newSessionDateFromLabel: "From (date)",
1209
+ newSessionDateToLabel: "To (date)",
1210
+ newSessionTodayBtn: "Today",
1211
+ newSessionWeekdaysLegend: "Active weekdays",
1212
+ newSessionTimeFromLabel: "Daily from",
1213
+ newSessionTimeToLabel: "Daily to",
1214
+ newSessionNowBtn: "Now",
1215
+ newSessionUseTimeWindow: "Restrict to a daily time window on those days",
1216
+ newSessionErrorMax: "Enter a maximum duration between 0.1 and 8760 hours.",
1217
+ newSessionErrorCalendar: "Choose at least one date (from and/or to).",
1218
+ newSessionErrorWeekly: "Select at least one weekday.",
1219
+ newSessionStartBtn: "Start session",
1220
+ newSessionCancelBtn: "Cancel",
1221
+ sessionScopeNoticeAria: "Session scope reminder",
1222
+ appShellRouteNavAria: "Main sections",
1223
+ appShellLiveDrawerAria: "Live session activity",
1224
+ appShellLiveDrawerTitle: "In progress",
1225
+ appShellLiveDrawerOpenDashboard: "Open dashboard",
1226
+ appShellLiveDrawerSessionPaused: "Session paused",
1227
+ appShellLiveDrawerWallClock: "Wall time",
1228
+ appShellLiveDrawerTasksHeading: "Timers",
1229
+ appShellLiveDrawerKronoFocusRunning: "Running",
1230
+ appShellLiveDrawerKronoFocusPaused: "Paused",
1231
+ appShellLiveDrawerKronoFocusPhaseWork: "Work",
1232
+ appShellLiveDrawerSubtaskTracking: "Subtask",
1233
+ appShellLiveDrawerExpand: "Expand panel",
1234
+ appShellLiveDrawerCollapse: "Collapse panel",
1235
+ appShellLiveDrawerNoRunningTasks: "No task timers running.",
1236
+ brandTagline: "The relativity of productive time",
1237
+ appVersionAriaLabel: "Kronosys dashboard package version {version}.",
1238
+ dialogOkBtn: "OK",
1239
+ dialogCancelBtn: "Cancel",
1240
+ dialogConfirmBtn: "Confirm",
1241
+ pageRefreshTitle: "Refresh data",
1242
+ pageRefreshAriaLabel: "Reload data for this page without a full browser refresh",
1243
+ pageRefreshProgressLabel: "Syncing with the Kronosys server…",
1244
+ pageRefreshDoneToast: "Data reloaded from the Kronosys server.",
1245
+ pageRefreshFailedToast: "Could not reload data. Check that the Kronosys server is running and try again.",
1246
+ };
1247
+
1248
+ const fr: DashboardStrings = {
1249
+ kronoFocusTitle: "KronoFocus",
1250
+ workMode: "KronoFocus",
1251
+ breakMode: "Pause courte",
1252
+ longBreakMode: "Pause longue",
1253
+ kronoFocusStart: "Démarrer",
1254
+ kronoFocusPause: "Pause",
1255
+ kronoFocusReset: "Réinitialiser",
1256
+ kronoFocusStandaloneSubtitle:
1257
+ "KronoFocus est le rythme d’attention intégré à Kronosys : un segment de travail à la fois (durée au choix), des pauses courtes entre segments, puis une pause longue après plusieurs cycles. Les compteurs et phases sont propres à Kronosys — ce n’est pas un clone de minuteur Pomodoro.",
1258
+ kronoFocusAutoRefreshNote: "",
1259
+ kronoFocusPanelHelpAriaLabel: "Aide sur le panneau KronoFocus",
1260
+ kronoFocusLiveWhileViewingArchive:
1261
+ "Pendant la consultation d’une session archivée, ce panneau affiche encore KronoFocus pour la session en cours (s’il y en a une).",
1262
+ kronoFocusLinkedTaskIntro: "Lancé depuis :",
1263
+ kronoFocusEditDurationTitle: "Configurer le rythme KronoFocus (minuteur non démarré)",
1264
+ kronoFocusDurationPickerLabel: "Durée (heures : minutes : secondes)",
1265
+ kronoFocusApplyDuration: "Appliquer",
1266
+ kronoFocusCancelDurationEdit: "Annuler",
1267
+ kronoFocusDurationHelpAriaLabel: "Aide sur la durée",
1268
+ kronoFocusDurationHelpBody:
1269
+ "Indiquez la durée du segment de travail en heures, minutes et secondes (temps écoulé, ex. 00:25:00 ou 01:30:00 — pas une heure du jour). Vous pouvez omettre les secondes (ex. 0:25). Plage : 1 min à 8 h. Les pauses courte et longue se règlent en minutes entières dans la même boîte. Réglez tout avant de démarrer KronoFocus.",
1270
+ kronoFocusDurationInputPlaceholder: "00:25:00",
1271
+ kronoFocusDefaultWorkDuration: "Défaut — 00:25:00",
1272
+ kronoFocusDurationHistoryLabel: "Durées récentes",
1273
+ kronoFocusDurationHistoryPickAria: "Choisir la durée {time}",
1274
+ kronoFocusDurationHistoryClear: "Effacer",
1275
+ kronoFocusDurationHistoryClearTitle: "Effacer toutes les durées personnalisées enregistrées",
1276
+ kronoFocusRhythmPresetsHeading: "Préréglages (travail / pause courte / pause longue)",
1277
+ kronoFocusRhythmPresetLabels: ["25 / 5", "50 / 10", "45 / 15", "52 / 17"],
1278
+ kronoFocusRhythmPresetTitles: [
1279
+ "25 min de travail, 5 min de pause courte, 15 min de pause longue après chaque 4e segment de travail",
1280
+ "50 min de travail, 10 min de pause courte, 20 min de pause longue après chaque 4e segment de travail",
1281
+ "45 min de travail, 15 min de pause courte, 15 min de pause longue après chaque 4e segment de travail",
1282
+ "52 min de travail, 17 min de pause courte, 30 min de pause longue après chaque 4e segment de travail",
1283
+ ],
1284
+ kronoFocusShortBreakMinutesLabel: "Pause courte (minutes)",
1285
+ kronoFocusLongBreakMinutesLabel: "Pause longue (minutes)",
1286
+ kronoFocusRhythmBreaksMinutesHint:
1287
+ "Minutes entières, 1 à 480 chacune. La pause longue suit chaque 4e segment de travail terminé.",
1288
+ startTaskWithKronoFocus: "Lancer aussi KronoFocus",
1289
+ startTaskWithKronoFocusToggleAriaOff:
1290
+ "Lancer aussi KronoFocus au démarrage — désactivé. Appuyer pour activer.",
1291
+ startTaskWithKronoFocusToggleAriaOn:
1292
+ "Lancer aussi KronoFocus au démarrage — activé. Appuyer pour désactiver.",
1293
+ startKronoFocusFromActiveTask: "Démarrer KronoFocus",
1294
+ startKronoFocusFromTaskConfirm:
1295
+ "KronoFocus est déjà en cours ou en pause. Réinitialiser le minuteur et démarrer un nouveau segment de travail ?",
1296
+ launcherTitle: "Tâches",
1297
+ taskTrackerTitle: "En cours",
1298
+ taskPlaceholder: "Sur quoi travaillez-vous ?",
1299
+ taskPlaceholderPast: "Sur quoi avez-vous travaillé ?",
1300
+ archiveAddTaskIntro:
1301
+ "Entrée passée : indiquez le début et la fin. Les étiquettes et le @projet suivent les mêmes règles ; minuteurs et points de détail ne s’appliquent pas — session en cours ou archivée.",
1302
+ archiveAddTaskIntroHelpAria: "Aide : saisie d’une entrée passée",
1303
+ taskEntryModeRealtime: "Temps réel",
1304
+ taskEntryModePast: "Passé",
1305
+ taskEntryModeGroupAria: "Mode de saisie",
1306
+ archiveTaskStartLabel: "Début",
1307
+ archiveTaskEndLabel: "Fin",
1308
+ taskTimingDurationLabel: "Durée",
1309
+ taskStartTimeSaveAria: "Enregistrer l'heure de début corrigée de la tâche",
1310
+ sessionStartTimeSaveAria: "Enregistrer l'heure de début corrigée de la session",
1311
+ taskEndTimeSaveAria: "Enregistrer l'heure de fin corrigée de la tâche",
1312
+ sessionEndTimeSaveAria: "Enregistrer l'heure de fin corrigée de la session",
1313
+ sessionEndTimeEditSectionTitle: "Fin de session",
1314
+ sessionStartTimeEditSectionTitle: "Début de session",
1315
+ taskPastDatetimePlaceholder: "yy-mm-dd --:--:--",
1316
+ taskPastDatetimeTimeLabel: "Heure",
1317
+ taskPastDatetimeHourAria: "Heure (format 24 h)",
1318
+ taskPastDatetimeMinuteAria: "Minutes",
1319
+ taskPastDatetimeTodayBtn: "Aujourd’hui",
1320
+ taskPastDatetimeNowBtn: "Maintenant",
1321
+ archiveAddTaskBtn: "Ajouter à la session",
1322
+ archiveTaskDatetimeRangeInvalid:
1323
+ "Indiquez un début et une fin valides ; la fin doit être postérieure au début (date et heure locales).",
1324
+ activeTaskTitleEditHint: "Cliquer pour modifier le titre ; saisir #étiquettes dans le champ ou utiliser la ligne du bas",
1325
+ activeTaskTitleInputAria: "Modifier le titre ; #étiquettes ou @projet optionnels dans le champ, pastilles en dessous pour l’existant",
1326
+ startTaskBtn: "Démarrer le suivi",
1327
+ finishTaskBtn: "Terminer",
1328
+ finishTaskOpenSubtasksWarnTitle: "Terminer la tâche ?",
1329
+ finishTaskOpenSubtasksWarnBody:
1330
+ "Il reste des points de détail non cochés. Ils seront tous marqués comme terminés lorsque vous terminez la tâche.",
1331
+ taskDeleteBtn: "Supprimer",
1332
+ taskDeleteConfirm:
1333
+ "Supprimer cette entrée ? Le temps enregistré sera perdu. Cette action est irréversible.",
1334
+ taskConcurrentTrackingConflictTitle: "Suivi déjà actif",
1335
+ taskConcurrentTrackingConflictMessage:
1336
+ "Au moins une tâche a déjà un minuteur actif. Indiquez ce que vous en faites avant de lancer celle-ci : les terminer (elles passent dans « terminées »), les mettre en pause (reprise plus tard dans « en pause »), ou les laisser tourner et démarrer la nouvelle tâche en parallèle.",
1337
+ taskConcurrentTrackingConflictPauseBtn: "Mettre les tâches actives en pause",
1338
+ taskConcurrentTrackingConflictFinishBtn: "Terminer les tâches actives",
1339
+ taskConcurrentTrackingConflictParallelBtn: "Démarrer en parallèle (garder les minuteurs)",
1340
+ taskConcurrentTrackingDontShowAgain:
1341
+ "Mémoriser ce choix et ne plus afficher cette boîte (la même action sera appliquée automatiquement la prochaine fois).",
1342
+ commitOnFinishShort: "Message Git",
1343
+ commitOnFinishHint: "Construire le message Git à la fin",
1344
+ commitOnFinishToggleAriaOff:
1345
+ "Proposer un message Git à la fin — désactivé. Appuyer pour activer.",
1346
+ commitOnFinishToggleAriaOn:
1347
+ "Proposer un message Git à la fin — activé. Appuyer pour désactiver.",
1348
+ tasksPausedHeading: "En pause",
1349
+ tasksCompletedHeading: "Terminées",
1350
+ tasksRunningHeading: "En cours (minuteur)",
1351
+ hideTaskList: "Masquer la liste",
1352
+ showAllTasks: "Afficher toute la liste",
1353
+ importGitIssue: "Importer une issue Git",
1354
+ pauseTaskBtn: "Pause — affichage dans la liste des pauses",
1355
+ resumeTaskBtn: "Reprendre le suivi",
1356
+ taskTimerPausedManual: "Minuteur en pause (manuel).",
1357
+ pausedNote: "La session est en pause pendant la consultation de l’historique.",
1358
+ viewingHistoryBannerTitle: "Vous consultez une session passée.",
1359
+ resumeBtn: "Reprendre la session active",
1360
+ inspectingLabel: "Consultation :",
1361
+ historyInspectBannerAria: "Consultation d’une session passée",
1362
+ autoTagsDetected: "Étiquettes détectées",
1363
+ autoProjectDetected: "Projet",
1364
+ tagsHelpAriaLabel: "Aide sur les étiquettes",
1365
+ tagSyntaxHelp:
1366
+ "#mot après un espace ou en début, ou collé (mot#nom). @projet : mêmes règles ; le premier @ compte. Jetons : lettres, chiffres, tiret, souligné (sans espaces).",
1367
+ tagSuggestionsHelp:
1368
+ "À côté du (?), le petit champ applique une ligne du type #mot, @projet ou un nom d’étiquette lorsque vous appuyez sur Entrée. Taper #mot dans le titre est à part.",
1369
+ tagsHelpWorkflowSummary:
1370
+ "Au-dessus, les étiquettes en lecture seule listent tout ce qui est sur la tâche ; la ligne projet affiche son projet. Modifiez le titre ou utilisez le champ rapide (Entrée). @Projet#code reste optionnel.",
1371
+ taskAppliedTagsHelpHeading: "Étiquettes sur cette tâche",
1372
+ taskAppliedTagsHelpHint:
1373
+ "Tout est fusionné : titre, champ de nouvelle tâche et ligne rapide sous chaque tâche. Saisissez #étiquette, @projet ou un nom puis Entrée ; @ seul retire le projet.",
1374
+ taskTagsExtraHelpAria: "Aide : étiquettes et projet appliqués à cette tâche",
1375
+ taskTagsOrphanProjectHelpBody:
1376
+ "Issu du titre, absent de la liste enregistrée. Épinglez sous Étiquettes et projets ou modifiez le titre.",
1377
+ taskTagProjectQuickAddPlaceholder:
1378
+ "#étiquette, @projet ou nom… Entrée (@ seul retire le projet)",
1379
+ taskTagProjectQuickAddAria:
1380
+ "Ajout rapide : saisir #étiquette, @projet ou un nom d’étiquette, puis Entrée",
1381
+ taskTagProjectMultiGroupTags: "Étiquettes enregistrées",
1382
+ taskTagProjectMultiGroupProjects: "Projets enregistrés",
1383
+ taskTagProjectMultiOptionClearProject: "Retirer le projet (équivaut à @ seul)",
1384
+ taskTagProjectMultiSelectAria:
1385
+ "Sélection multiple d’étiquettes et de projets enregistrés, puis bouton Ajouter la sélection",
1386
+ taskTagDefaultBucket: "défaut",
1387
+ taskTagProjectMultiHint: "Ctrl ou ⌘ + clic pour sélectionner plusieurs lignes, puis ajoutez.",
1388
+ taskTagProjectApplySelectionBtn: "Ajouter la sélection",
1389
+ tagsUserGuideIntro:
1390
+ "Ce guide explique comment le titre de tâche, les raccourcis enregistrés et l’option @projet#code s’articulent. Vous pouvez ignorer les fonctions avancées et n’utiliser que des #étiquettes et un seul @projet.",
1391
+ tagsUserGuideBasicsTitle: "Bases : jetons dans le titre",
1392
+ tagsUserGuideBasicsBody:
1393
+ "Dans le titre d’une tâche, vous pouvez mêler du texte libre à :\n• #nom — étiquette globale (lettres, chiffres, tiret, souligné).\n• @Projet — affecte la tâche à un projet (le premier @ du titre l’emporte).\nLes jetons peuvent suivre un espace ou être collés au mot précédent (mot#tag). Le tableau de bord fusionne tout sous la tâche.",
1394
+ tagsUserGuideShortcutsTitle: "Champ rapide sur chaque tâche",
1395
+ tagsUserGuideShortcutsBody:
1396
+ "Dans Paramètres → Étiquettes et projets enregistrés (ou la colonne Étiquettes à droite), vous épinglez étiquettes et projets que vous réutilisez. Sur une tâche, l’étroit champ à côté de l’aide (?) propose ces valeurs ; appuyez sur Entrée pour appliquer une ligne (#étiquette, @projet, nom seul, ou @ seul pour retirer le projet). Cela ne réécrit pas le titre tant que vous ne le modifiez pas vous-même.",
1397
+ tagsUserGuideScopedTitle: "Optionnel : @projet#code (étiquettes liées au projet)",
1398
+ tagsUserGuideScopedBody:
1399
+ "La syntaxe @Client#facture dans le titre enregistre une étiquette rattachée à ce projet (affichée Client#facture). Utile quand le même libellé local change selon le client, ou pour un filtrage plus strict. Si vous n’en avez pas besoin, restez sur #étiquette + @projet — les deux styles coexistent.",
1400
+ tagsUserGuideUseCasesTitle: "Cas d’usage",
1401
+ tagsUserGuideUseCasesBody:
1402
+ "• Développeur solo, un projet : tapez Ma fonctionnalité @acme #frontend — sans liste enregistrée.\n• Beaucoup de tickets : épinglez #triage, #bugfix, @sprint-42 ; utilisez le champ rapide par tâche au lieu de retaper.\n• Travail client : @ClientA#abonnement vs @ClientB#abonnement dans les titres pour séparer les espaces de noms ; filtrez par projet dans les rapports.\n• Saisie rétroactive : mêmes règles # et @ dans le formulaire passé ; le champ rapide accepte la même syntaxe.",
1403
+ tagsUserGuideFooterNote:
1404
+ "Les descriptions sur les étiquettes ou projets (survol long sur une pastille qui en a une) sont des notes pour l’équipe — elles ne changent pas le filtrage des données dans Kronosys.",
1405
+ subtasksHeading: "Points de détail",
1406
+ addSubtaskPlaceholder: "Nouveau point…",
1407
+ addSubtaskBtn: "Ajouter",
1408
+ subtaskMarkDone: "Marquer ce point comme fait",
1409
+ subtaskMarkUndone: "Marquer ce point comme non fait",
1410
+ subtaskDelete: "Supprimer ce point",
1411
+ subtaskDragReorderHandle: "Glisser pour réordonner",
1412
+ subtaskMoveUp: "Monter ce point dans la liste",
1413
+ subtaskMoveDown: "Descendre ce point dans la liste",
1414
+ subtaskTimerStart: "Suivre le temps sur ce point",
1415
+ subtaskTimerStop: "Arrêter le suivi sur ce point",
1416
+ subtaskDurationNotMeasured: "Pas mesurée",
1417
+ subtaskDurationNotRecorded: "Pas enregistrée",
1418
+ subtaskDurationNotShown: "Pas affichée",
1419
+ subtaskDurationTooltipNotMeasured:
1420
+ "Aucune durée accumulée sur ce point pour l’instant. Utilisez la lecture pour démarrer le suivi.",
1421
+ subtaskDurationTooltipNotRecorded:
1422
+ "Cet instantané ne contient pas de durée pour ce point (non suivie ici ou absente de l’instantané enregistré).",
1423
+ subtaskDurationTooltipNotShown:
1424
+ "Aucune durée n’est affichée pour ce point terminé sans temps enregistré dans cette vue archivée.",
1425
+ noData: "Pas encore de données.",
1426
+ selectIssue: "Rechercher une issue GitLab",
1427
+ issuePickerSearchPlaceholder: "Titre, description ou numéro d’issue interne (ex. 12 ou #12)…",
1428
+ issuePickerSearchMinHint:
1429
+ "Pour une recherche par mots sur GitLab, au moins 2 caractères. Pour un numéro d’issue seul, un chiffre suffit (ex. 7 ou #7).",
1430
+ issuePickerLoading: "Recherche en cours…",
1431
+ issuePickerNoResults:
1432
+ "Aucun résultat. Essayez quelques lettres du titre ou de la description, ou uniquement le numéro interne (ex. 42).",
1433
+ issuePickerCloseAria: "Fermer",
1434
+ issuePickerDashboardRequestTimeout:
1435
+ "Délai dépassé en attendant le serveur du tableau de bord (recherche GitLab). Vérifiez que le serveur tourne, l’URL d’instance, puis réessayez.",
1436
+ noIssuesFound: "Aucune issue ou CLI non configurée.",
1437
+ sessionsColumnTitle: "Sessions",
1438
+ sessionsColumnHelpAria: "Aide : colonne Sessions",
1439
+ sessionsColumnHelpBody:
1440
+ "Vos sessions enregistrées et la session en cours s’affichent ici lorsque le suivi est actif.\n\nOuvrez la session active pour modifier le suivi en direct.",
1441
+ dashboardColSessionTeaser:
1442
+ "Choisis la session en cours (ou démarre-en une). Tout le tableau de bord s’aligne sur ce choix.",
1443
+ dashboardColSessionFlowHint: "Ensuite → Tâches au centre",
1444
+ dashboardColTasksTeaser:
1445
+ "Inscris le travail réel : tâches, minuteurs, KronoFocus — lié à la session à gauche.",
1446
+ dashboardColTasksFlowHint: "Puis → Étiquettes & projets à droite",
1447
+ dashboardColTagsTeaser:
1448
+ "Ajoute #étiquettes, @projets et raccourcis pour garder l’historique et les rapports lisibles.",
1449
+ dashboardColTagsFlowHint: "Facultatif, mais le futur-toi remercie.",
1450
+ dashboardColumnHintsPanelTitle: "Comment lire les trois colonnes",
1451
+ dashboardColumnHintsExpandAria: "Afficher l’aide sur les trois colonnes du tableau de bord",
1452
+ dashboardColumnHintsCollapseAria: "Masquer l’aide sur les colonnes",
1453
+ dashboardColumnHintsDismissTitle: "Masquer définitivement ce rappel",
1454
+ sessionsListAriaLabel: "Sessions",
1455
+ sessionLiveBadge: "En cours",
1456
+ sessionListWallDurationTitle:
1457
+ "Durée murale de la session : minutes enregistrées si disponibles, sinon écart entre le début et la fin.",
1458
+ sessionListWallDurationAlertTooltip:
1459
+ "Au seuil d’alerte ou au-delà ({hours} h) — modifiable dans Paramètres → Tableau de bord web.",
1460
+ sessionListStartedPrefix: "Début\u202F:",
1461
+ sessionListEndedPrefix: "Fin\u202F:",
1462
+ sessionEndLiveTitle:
1463
+ "Terminer la session — enregistrer dans l’historique sans en démarrer une nouvelle (le suivi peut rester actif)",
1464
+ sessionEndLiveAria: "Terminer la session en cours",
1465
+ sessionEndLiveConfirmTitle: "Terminer cette session ?",
1466
+ sessionEndLiveConfirmIntro:
1467
+ "Il reste du travail ouvert dans cette session. En la terminant, un instantané est enregistré dans l’historique : les minuteurs et le suivi par points ne s’appliquent plus à cette session, mais vous pourrez encore modifier les noms, les étiquettes et les projets en ouvrant la session archivée.",
1468
+ sessionEndLiveConfirmIntroCalm:
1469
+ "En terminant la session, un instantané est enregistré dans l’historique avec l’heure de fin actuelle. Les minuteurs et le suivi par points ne s’appliquent plus à cette session, mais vous pourrez encore modifier les noms, les étiquettes et les projets en ouvrant la session archivée.",
1470
+ sessionEndLiveWarnActiveTask: "Un suivi est actuellement actif (en cours).",
1471
+ sessionEndLiveWarnPausedTasks: "Au moins une entrée est en pause ou non terminée.",
1472
+ sessionEndLiveWarnIncompleteSubtasks: "Au moins un point n’est pas marqué comme terminé.",
1473
+ sessionEndLiveConfirmBtn: "Terminer la session",
1474
+ sessionEndLiveSidebarBtn: "Terminer cette session",
1475
+ sessionEndReasonModalHint:
1476
+ "Facultatif : indiquez pourquoi vous clôturez la session (bilans, feuilles de temps, rétrospectives).",
1477
+ sessionEndReasonFieldsetLegend: "Raison de clôture",
1478
+ sessionEndReasonSkip: "Ne pas enregistrer de catégorie",
1479
+ sessionEndReasonPlanned: "Fin conforme au temps ou au périmètre prévu",
1480
+ sessionEndReasonEarly: "Fin anticipée (avant le temps ou l’échéance prévus)",
1481
+ sessionEndReasonOverrun: "Prolongation ou dépassement par rapport au prévu",
1482
+ sessionEndReasonOther: "Autre",
1483
+ sessionEndReasonNotePlaceholder: "Précision (facultatif)…",
1484
+ sessionEndReasonNoteAria: "Précision libre sur la façon dont cette session se termine",
1485
+ selectedSessionEndReasonTitle: "Clôture",
1486
+ sessionEndReasonEditHint:
1487
+ "Modifiez la catégorie ou la précision enregistrée pour la clôture de cette session.",
1488
+ sessionEndReasonSaveBtn: "Enregistrer la clôture",
1489
+ sessionEndReasonSaveAria: "Enregistrer la raison de clôture",
1490
+ sessionEndReasonSaving: "Enregistrement…",
1491
+ beforeUnloadLiveSessionMessage:
1492
+ "Une session Kronosys est ouverte dans ce tableau de bord. Fermer cet onglet ne met pas fin à la session. Utilisez « Terminer cette session » dans la colonne de gauche pour la clôturer ici, ou quittez cet onglet — la session reste active en arrière-plan.",
1493
+ openSessionInNewTab: "Ouvrir cette session dans un nouvel onglet",
1494
+ detachedSessionUrlHint:
1495
+ "Cet onglet suit l’URL. Consulter une archive ici ne modifie que cet onglet — pas la session en cours ni la session sélectionnée dans les autres onglets ouverts.",
1496
+ detachedSessionUrlHintDismiss: "Masquer ce message",
1497
+ detachedSessionInvalidUrl: "Aucune session ne correspond à ce paramètre d’URL.",
1498
+ tasksInSessionSingular: "élément",
1499
+ tasksInSessionPlural: "éléments",
1500
+ rightColumnTitle: "Tâches",
1501
+ tagsProjectsColumnTitle: "Étiquettes et projets",
1502
+ tagsProjectsColumnIntro:
1503
+ "Épinglage, descriptions et masquage des pastilles — comme dans les paramètres, ici à côté du flux de travail. Deux onglets permettent de basculer entre les étiquettes globales et les projets.",
1504
+ tagsProjectsColumnHelpAria: "Aide : colonne étiquettes et projets",
1505
+ tagsProjectsColumnHelpBody:
1506
+ "Les étiquettes globales s’appliquent à toute tâche. Les étiquettes liées utilisent Projet#code et ne s’affichent en suggestion que si le @projet de la tâche correspond.\n\nDans cette colonne, l’onglet Étiquettes globales regroupe raccourcis, masquées et descriptions ; l’onglet Projets et étiquettes liées regroupe les projets enregistrés et les codes par projet.\n\nCette colonne reprend la section « Étiquettes et projets enregistrés » des paramètres ; les changements sont immédiats.\n\nL’aide complète et les cas d’usage sont dans le « ? » à côté des étiquettes sur une carte tâche.",
1507
+ tasksColumnSubtitle: "En cours, en pause et terminées pour la session sélectionnée.",
1508
+ tasksColumnSubtitleHelpAria: "Aide : contenu de cette colonne",
1509
+ taskFocusNoSessionTitle: "Aucune session active",
1510
+ taskFocusNoSessionBody:
1511
+ "Démarrez une session depuis la colonne Sessions à gauche pour enregistrer des tâches ici.",
1512
+ taskStartAutoSessionToast:
1513
+ "Aucune session en cours — démarrage d’une session pour y rattacher cette tâche.",
1514
+ selectedSessionSidebarTitle: "Session sélectionnée",
1515
+ selectedSessionIdleHint:
1516
+ "Aucune session en cours. Démarrez-en une pour enregistrer le temps, le suivi et les métriques.",
1517
+ statsMetricSessionDurationHelpAria: "Aide : durée de session",
1518
+ statsMetricSessionDurationHelpBody:
1519
+ "Temps écoulé (horloge murale) depuis le premier événement d’activité enregistré dans cette session jusqu’à maintenant (session en cours) ou jusqu’à l’enregistrement de l’instantané (archive). Distinct du temps actif, du temps de codage et des minuteurs de suivi ou de point.",
1520
+ statsMetricCodingTimeHelpAria: "Aide : temps de codage",
1521
+ statsMetricCodingTimeHelpBody:
1522
+ "Temps cumulé lorsqu’un fichier productif (hors langages exclus) est au centre du contexte de codage : ouverture, enregistrement, changement d’éditeur actif ou modifications. Cesse d’augmenter après environ une minute sans signal de ce type. Indépendant du minuteur de suivi.",
1523
+ statsMetricActiveTimeHelpAria: "Aide : temps actif",
1524
+ statsMetricActiveTimeHelpBody:
1525
+ "Temps cumulé à partir de signaux d’activité sur le poste : modifications, ouverture de fichier, changements de sélection, éditeur actif et focus de fenêtre. Les intervalles de plus d’environ trois minutes ne comptent pas. Souvent entre le temps de codage et la durée de session.",
1526
+ statsMetricTasksHelpAria: "Aide : tâches par statut",
1527
+ statsMetricTasksHelpBody:
1528
+ "Pour la session affichée : tâches avec le minuteur de suivi actif (« En cours (minuteur) »), tâches non terminées dans la liste (section « En pause »), et tâches marquées terminées. Reprend les trois blocs de la colonne Tâches.",
1529
+ statsTasksRowRunning: "En cours (minuteur)",
1530
+ statsTasksRowPausedList: "En liste (non terminées)",
1531
+ statsTasksRowCompleted: "Terminées",
1532
+ gitRepoCardTitle: "Dépôt Git du workspace",
1533
+ gitRepoNotARepo:
1534
+ "Le premier dossier du workspace n’est pas un dépôt Git (ou Git n’est pas disponible).",
1535
+ gitRepoCardHelpAria: "Aide : aperçu Git du workspace",
1536
+ gitRepoCardHelpBody:
1537
+ "Résumé du dépôt Git à la racine du premier dossier du workspace : nombre de branches, de commits, extrait de `git log --graph --all`, et échantillon trié des chemins suivis via `git ls-files`. Mis à jour lors du rafraîchissement du tableau de bord depuis le serveur.",
1538
+ gitRepoCurrentBranchLabel: "Branche courante",
1539
+ gitRepoBranchesLocalLabel: "Branches locales",
1540
+ gitRepoBranchesLocalHelpAria: "Aide : branches locales",
1541
+ gitRepoBranchesLocalHelpBody: "Nombre de branches locales (`git branch --list`).",
1542
+ gitRepoBranchesRemoteLabel: "Branches distantes",
1543
+ gitRepoBranchesRemoteHelpAria: "Aide : branches distantes",
1544
+ gitRepoBranchesRemoteHelpBody:
1545
+ "Nombre de branches de suivi distant (`git branch -r`), hors l’alias symbolique `*/HEAD`.",
1546
+ gitRepoCommitsHeadLabel: "Commits (HEAD)",
1547
+ gitRepoCommitsHeadHelpAria: "Aide : commits sur la branche courante",
1548
+ gitRepoCommitsHeadHelpBody:
1549
+ "Nombre de commits atteignables depuis HEAD (`git rev-list --count HEAD`), soit l’historique de la branche actuelle.",
1550
+ gitRepoCommitsAllLabel: "Commits (toutes refs)",
1551
+ gitRepoCommitsAllHelpAria: "Aide : commits toutes références",
1552
+ gitRepoCommitsAllHelpBody:
1553
+ "Nombre sur toutes les références (`git rev-list --all --count`). Peut être coûteux sur les très gros dépôts ; affiché en — si la commande échoue.",
1554
+ gitRepoStashesLabel: "Stashes",
1555
+ gitRepoStashesHelpAria: "Aide : liste des stashes",
1556
+ gitRepoStashesHelpBody: "Nombre d’entrées dans `git stash list`.",
1557
+ gitRepoGraphTitle: "Graphe récent",
1558
+ gitRepoGraphHelpAria: "Aide : graphe de commits",
1559
+ gitRepoGraphHelpBody:
1560
+ "Graphe ASCII produit par `git log --graph --decorate --all` (40 derniers commits). Utile pour voir la relation entre branches.",
1561
+ gitRepoGraphEmpty: "Aucune ligne de graphe.",
1562
+ gitRepoGraphPreviewNote: "Aperçu partiel — seulement les 40 derniers commits dans cette zone.",
1563
+ gitRepoGraphOpenFullAria: "Ouvrir le graphe de commits complet dans un nouvel onglet",
1564
+ gitRepoGraphOpenFullTitle: "Ouvrir le graphe de commits complet dans un nouvel onglet du navigateur",
1565
+ gitRepoGraphDetailDocTitle: "Graphe Git — Kronosys",
1566
+ gitRepoTreeTitle: "Fichiers suivis (extrait)",
1567
+ gitRepoTreeHelpAria: "Aide : extrait des chemins suivis",
1568
+ gitRepoTreeHelpBody:
1569
+ "Échantillon trié alphabétiquement des chemins de `git ls-files` (jusqu’à 300). Ce n’est pas l’arborescence complète ; sur les gros dépôts, des chemins peuvent manquer selon les limites de mémoire.",
1570
+ gitRepoTreeEmpty: "Aucun chemin dans l’extrait.",
1571
+ gitRepoTreePreviewNote: "Aperçu partiel — échantillon d’au plus 300 chemins suivis.",
1572
+ gitRepoTreeOpenFullAria: "Ouvrir la liste complète des chemins suivis dans un nouvel onglet",
1573
+ gitRepoTreeOpenFullTitle: "Ouvrir la liste complète des chemins suivis dans un nouvel onglet du navigateur",
1574
+ gitRepoTreeDetailDocTitle: "Fichiers suivis — Kronosys",
1575
+ statsLocSectionTitle: "Lignes et langages",
1576
+ statsLinesWrittenTotal: "Lignes écrites",
1577
+ statsLinesWrittenHuman: "Humain (estim.)",
1578
+ statsLinesWrittenAi: "IA (estim.)",
1579
+ statsLocByLanguageHeading: "Lignes par langage",
1580
+ statsCodingSignalsHeading: "Signaux de codage par langage",
1581
+ statsMetricLinesWrittenHelpAria: "Aide : lignes écrites",
1582
+ statsMetricLinesWrittenHelpBody:
1583
+ "Lignes nettes ajoutées à partir des modifications suivies (estimation via les retours à la ligne dans les diffs). Les insertions très massives sont partiellement plafonnées. « Humain » / « IA » est une heuristique par transaction : plusieurs plages de modification, plus d’environ 6 lignes nettes, ou un bloc unique long avec saut de ligne ressemblent souvent à une insertion agent ou collage — ce n’est pas une attribution exacte.",
1584
+ statsMetricLocByLanguageHelpAria: "Aide : lignes par langage",
1585
+ statsMetricLocByLanguageHelpBody:
1586
+ "Répartition des lignes nettes par identifiant de langage pour cette session (même base que « Lignes écrites »).",
1587
+ statsMetricCodingSignalsHelpAria: "Aide : signaux de codage",
1588
+ statsMetricCodingSignalsHelpBody:
1589
+ "Nombre de signaux de contexte de codage par langage (ouverture, enregistrement, édition, changement d’éditeur actif, et signaux périodiques lorsqu’une édition récente a eu lieu).",
1590
+ sessionNameReadOnly: "Nom de la session (lecture seule pour cette archive)",
1591
+ sessionArchiveBtn: "Archiver",
1592
+ sessionArchiveTitle: "Masquer cette session de la liste (récupérable dans Archives)",
1593
+ sessionRestoreBtn: "Restaurer",
1594
+ sessionDeleteBtn: "Supprimer",
1595
+ sessionDeleteTitle: "Supprimer la session",
1596
+ sessionDeleteIntro:
1597
+ "La session sera retirée de votre historique. Choisissez le sort des éléments associés.",
1598
+ sessionDeleteDiscardTasks: "Supprimer les éléments avec la session (les abandonner)",
1599
+ sessionDeleteMoveTasks: "Déplacer les éléments vers une autre session",
1600
+ sessionDeleteTargetLabel: "Session cible",
1601
+ sessionDeleteTargetPlaceholder: "Choisir une session…",
1602
+ sessionDeleteConfirmBtn: "Supprimer la session",
1603
+ sessionDeleteCancelBtn: "Annuler",
1604
+ archivesModalTitle: "Sessions archivées",
1605
+ archivesEmpty: "Aucune session archivée.",
1606
+ archivesCloseBtn: "Fermer",
1607
+ archivedBadge: "Archivée",
1608
+ sessionArchiveConfirm:
1609
+ "Archiver cette session ?\n\n• Masquée de la liste jusqu’à restauration (Archives).\n• Rapports : exclues les entrées non terminées et celles dont un point reste ouvert (totaux, graphiques, temps par projet, KronoFocus lié).",
1610
+ sessionArchiveDontShowAgain: "Ne plus afficher cet avertissement",
1611
+ storageBadgeLabelSqlite: "SQLite",
1612
+ storageBadgeTooltipSqlite:
1613
+ "L’historique des sessions est stocké en SQLite dans le répertoire de données Kronosys (pilote de persistance locale dans les paramètres).",
1614
+ storageBadgeLabelJson: "JSON",
1615
+ storageBadgeTooltipJson:
1616
+ "L’historique des sessions utilise des fichiers JSON partitionnés (pilote local hérité). Vous pouvez passer à SQLite dans les paramètres Kronosys",
1617
+ storageBadgeLabelMongo: "MongoDB",
1618
+ storageBadgeTooltipMongo:
1619
+ "Le miroir MongoDB est activé et connecté. Vous pouvez envoyer les sessions depuis la liste ; les sessions locales suivent toujours votre pilote de persistance.",
1620
+ workspaceFoldersLabel: "Racines du workspace",
1621
+ workspaceFoldersEmpty: "Aucune racine de workspace n’est configurée pour ce tableau de bord.",
1622
+ headerDisplayRegionTitle: "Fuseau d’affichage {timeZone} ; format d’horloge {clock}.",
1623
+ headerClockFormat24Short: "24 h",
1624
+ headerClockFormat12Short: "12 h (AM/PM)",
1625
+ gitIdentityBannerAria: "Auteur Git non configuré",
1626
+ gitIdentityBannerBody:
1627
+ "Indiquez l’auteur Git (nom, courriel, identifiant de forge optionnel) pour la ligne sous le titre du tableau de bord. Utilisez Configurer ici pour un formulaire rapide — tout reste local et modifiable plus tard dans Paramètres → Identité Git.",
1628
+ gitIdentityBannerConfigure: "Configurer ici",
1629
+ gitIdentityBannerDismiss: "Masquer ce rappel",
1630
+ gitIdentityModalTitle: "Auteur Git (saisie rapide)",
1631
+ gitIdentityModalIntro:
1632
+ "Renseignez au moins un des champs ci-dessous. Les valeurs sont enregistrées localement avec vos données Kronosys — rien n’est envoyé au nuage depuis cette boîte de dialogue.\n\nVous pourrez les modifier ou les compléter à tout moment dans Paramètres → Identité Git.",
1633
+ gitIdentityModalNeedOneField:
1634
+ "Renseignez au moins un champ (nom, courriel ou identifiant sur la forge) avant d’enregistrer.",
1635
+ gitIdentityModalSaveError: "Enregistrement impossible. Vérifiez la connexion et réessayez.",
1636
+ gitIdentityModalFooter:
1637
+ "Jeton GitLab, synchronisation Git automatique et autres options avancées restent accessibles dans Paramètres, section Identité Git, lorsque vous en avez besoin.",
1638
+ mongoSyncLocalLabel: "JSON local",
1639
+ mongoSyncMongoLabel: "MongoDB",
1640
+ mongoSyncStatusAligned: "Aligné",
1641
+ mongoSyncStatusUnknown: "Nombre Mongo indisponible",
1642
+ mongoSyncStatusLocalAhead: "Décalage — moins de documents dans Mongo",
1643
+ mongoSyncStatusMongoAhead: "Décalage — plus de documents dans Mongo",
1644
+ mongoSyncHelpAriaLabel: "Aide : miroir MongoDB et sessions locales",
1645
+ mongoSyncHelpBody:
1646
+ "Les fichiers JSON locaux font foi. Les totaux comptent les sessions uniques dans l’historique (y compris archivées). MongoDB n’est mis à jour que lorsque vous envoyez une session ou via Resynchroniser dans les paramètres — pas à chaque sauvegarde locale. Un écart de totaux indique souvent des sessions jamais envoyées ou des documents supplémentaires dans Mongo. La session en cours n’apparaît dans le décompte local qu’après écriture sur disque.",
1647
+ sessionMongoPushAriaLabel: "Envoyer cette session vers MongoDB",
1648
+ sessionMongoPushSyncedTitle: "À jour sur MongoDB pour cet instantané",
1649
+ sessionMongoPushDirtyTitle: "Session modifiée depuis le dernier envoi — cliquer pour mettre à jour",
1650
+ sessionMongoPushNeverTitle: "Pas encore envoyée vers MongoDB — cliquer pour envoyer",
1651
+ sessionMongoPushBusy: "Envoi…",
1652
+ sessionMongoPushFailedDisabled: "MongoDB n’est pas activé dans les paramètres.",
1653
+ sessionMongoPushFailedNotFound: "Session introuvable.",
1654
+ sessionMongoPushFailedMongo: "MongoDB a refusé l’écriture. Vérifiez la connexion et les journaux.",
1655
+ sessionMongoPushFailedUri: "Connexion MongoDB incomplète (URI ou mot de passe).",
1656
+ dashboardLoadingAriaLabel: "Chargement du tableau de bord, veuillez patienter",
1657
+ dashboardLoadingMessage: "Récupération des données de session depuis le serveur Kronosys…",
1658
+ dataSearchTrigger: "Rechercher dans les données…",
1659
+ dataSearchPlaceholder:
1660
+ "Filtrer sessions, tâches, projets, étiquettes, dates, ou durée (ex. 12:55 <, 0:10 >)…",
1661
+ dataSearchPaletteAriaLabel: "Recherche rapide",
1662
+ dataSearchTypePrompt:
1663
+ "Saisissez du texte pour filtrer les sessions, les tâches, les projets et les étiquettes. Vous pouvez aussi saisir une date, une heure, ou une condition sur la durée enregistrée : m:s (ou h:m:s) suivi (ou précédé) de < ou >, p. ex. 45:00 > ou 1:0:0 <.",
1664
+ dataSearchEmpty: "Aucune session ni tâche ne correspond.",
1665
+ dataSearchFooter: "↑↓ pour se déplacer · Entrée pour ouvrir · Échap pour fermer",
1666
+ dataSearchKindSession: "Session",
1667
+ dataSearchKindTask: "Tâche",
1668
+ dataSearchTaskDistinguishId: "ID : {id}",
1669
+ dataSearchTaskStopwatchLabel: "Minuterie",
1670
+ dataSearchTaskRecordedTimeLabel: "Temps enregistré",
1671
+ dataSearchSessionWallLabel: "Durée (session)",
1672
+ commandNewSession: "Nouvelle session",
1673
+ commandRefresh: "Actualiser le tableau de bord",
1674
+ commandOpenReporting: "Ouvrir les rapports",
1675
+ commandOpenSettings: "Ouvrir les paramètres",
1676
+ commandOpenUserGuide: "Ouvrir le guide d’utilisation",
1677
+ commandFocusSessions: "Aller à la colonne Sessions",
1678
+ commandFocusTasks: "Aller à la colonne Tâches",
1679
+ commandFocusTags: "Aller à la colonne Étiquettes et projets",
1680
+ commandToggleTheme: "Basculer thème clair / sombre",
1681
+ commandToggleLang: "Changer la langue de l’interface (FR / EN)",
1682
+ commandEndLiveSession: "Terminer la session en cours",
1683
+ shortcutsModalTitle: "Raccourcis clavier",
1684
+ shortcutsModalCloseAriaLabel: "Fermer la fenêtre des raccourcis clavier",
1685
+ shortcutsModalIntro:
1686
+ "Cliquez sur « Modifier », puis enregistrez la nouvelle combinaison (au moins une touche Ctrl, Alt, Maj ou Meta). Échap annule l’enregistrement. Ctrl+K / ⌘K est réservé à la recherche rapide dans les données (non modifiable ici).",
1687
+ shortcutsTableAction: "Action",
1688
+ shortcutsTableShortcut: "Raccourci",
1689
+ shortcutsTableAssign: "Personnaliser",
1690
+ shortcutsChangeBtn: "Modifier…",
1691
+ shortcutsRecordPrompt: "Enregistrement…",
1692
+ shortcutsResetAll: "Tout rétablir aux valeurs par défaut",
1693
+ shortcutsPaletteRow: "Recherche rapide (données) — Ctrl+K ou ⌘K (fixe)",
1694
+ tourProgressLabel: "Étape {n} sur {total}",
1695
+ tourStep1Title: "Bienvenue dans le tableau de bord Kronosys",
1696
+ tourStep1Body:
1697
+ "Ce tableau de bord charge les données de session en direct depuis cette application web (routes API Next.js et SQLite local) — ce n’est pas un instantané figé.",
1698
+ tourStep2Title: "Guide des trois colonnes (au-dessus du tableau)",
1699
+ tourStep2Body:
1700
+ "Cette bande se place juste sous l’en-tête et résume comment s’articulent **Sessions**, **Tâches** et **Étiquettes et projets** — de gauche à droite sur grand écran, empilées sur petit écran, avec des flèches entre les blocs.\n\nDéployez-la ou repliez-la avec le chevron ; chaque encadré est un court rappel avant les vraies colonnes plus bas. **Le bouton X** à droite masque tout le bandeau pour ce navigateur ; réactivez-le sous **Paramètres → Tableau de bord et API → Aide trois colonnes**. Le repli au chevron et le masquage complet sont mémorisés séparément.",
1701
+ tourStep3Title: "Sessions (colonne de gauche)",
1702
+ tourStep3Body:
1703
+ "Parcourez l’historique des sessions, démarrez une nouvelle session et consultez la durée, le temps de codage et les statistiques de la session sélectionnée.\n\nLorsqu’une session en cours est ouverte, vous pouvez la terminer d’ici ; les sessions archivées s’affichent en lecture seule.\n\nPour des options d’horaire plus poussées, ouvrez Paramètres (engrenage) : sous **Tableau de bord et API**, l’**alerte de durée de session** met en évidence une session trop longue dans cette colonne ; les sections **Horaire de travail** et **Sessions spécifiques planifiées** règlent le suivi automatique sur la semaine et des créneaux récurrents précis qui priment sur l’horaire général pendant leur plage horaire.",
1704
+ tourStep4Title: "Tâches et suivi (centre)",
1705
+ tourStep4Body:
1706
+ "Suivez ce sur quoi vous travaillez, terminez des tâches et utilisez les sous-tâches ou les options liées à Git au besoin.\n\nCette colonne suit la session choisie dans la colonne Sessions — le reste de l’en-tête s’aligne sur ce choix.\n\nSur les autres tâches parentes, un seul flux de suivi : lancer le suivi d’une sous-tâche lance aussi le minuteur de la tâche parente et interrompt le suivi sur les autres tâches (le segment est enregistré). Mettre la tâche parente en pause met en pause le suivi d’une sous-tâche active sur la même tâche. Reprendre le minuteur d’une tâche ailleurs met fin aux suivi de sous-tâches sur les autres tâches et met en pause leur minuteur principal.\n\nLes points de détail sont facultatifs. Le total sur la tâche est toujours au moins la somme du temps enregistré sur ces points ; l’écart correspond au suivi sur la tâche sans détail par point.",
1707
+ tourStep5Title: "Étiquettes et projets (droite)",
1708
+ tourStep5Body:
1709
+ "Épinglez des étiquettes, gérez les projets enregistrés et rédigez des descriptions — les mêmes réglages que dans les paramètres, accessibles pendant le travail. Deux onglets séparent les étiquettes globales des projets et des étiquettes liées.\n\nDans les titres de tâches, utilisez @projet et #étiquettes (y compris @projet#code) pour structurer le travail par projet.\n\nLes rapports (graphiques) s’appuient fortement sur ces objets : des étiquettes et des projets cohérents rendent les ventilations, filtres et tendances dans Rapports beaucoup plus utiles.",
1710
+ tourStep6Title: "Barre du haut : toutes les icônes",
1711
+ tourStep6Body:
1712
+ "Dans ce groupe, de gauche à droite : la recherche rapide / palette de commandes (équivalent à Ctrl+K ou ⌘K), l’icône clavier pour l’aide aux raccourcis et leur personnalisation, les liens vers Rapports (graphiques) et Paramètres (engrenage), le basculement thème clair / sombre, le bouton qui actualise les données sans recharger tout l’onglet du navigateur, et le menu de langue (FR / EN).\n\nChaque contrôle a une infobulle au survol ; Rapports et Paramètres ouvrent d’autres pages dans le même habillage Kronosys.",
1713
+ tourStep7Title: "Identité Git et pastille de stockage",
1714
+ tourStep7Body:
1715
+ "Ici s’affichent la ligne d’auteur Git et le compte forge lorsqu’ils sont renseignés dans Paramètres → Identité Git, les racines de workspace détectées pour les métriques, et une pastille indiquant comment les sessions sont enregistrées ici : SQLite (par défaut), pilote JSON ou miroir MongoDB si activé.\n\nSQLite conserve la charge utile du tableau de bord sur cette machine dans le répertoire de données Kronosys ; cette page lit et écrit via l’API locale.",
1716
+ tourStep8Title: "Qu’est-ce que KronoFocus ?",
1717
+ tourStep8Body:
1718
+ "**KronoFocus** cadence votre session : un segment de travail dont vous choisissez la durée, des pauses courtes, puis une pause longue après plusieurs cycles. Ce dispositif est intégré à Kronosys (compteurs, phases, lien à la session) ; il ne se résume pas à une méthode Pomodoro figée.\n\nL’affichage dans l’en-tête ou à côté des actions de tâche se règle dans Paramètres → Tableau de bord et API (section KronoFocus).",
1719
+ tourStep8LearnMoreUrl: "https://fr.wikipedia.org/wiki/Gestion_du_temps",
1720
+ tourStep8LearnMoreLabel: "Pour aller plus loin — gestion du temps (nouvel onglet)",
1721
+ tourStep8LearnMoreAriaLabel: "Ouvre l’article Wikipédia sur la gestion du temps dans un nouvel onglet",
1722
+ tourStep9Title: "Identité Git : la première chose après la visite",
1723
+ tourStep9Body:
1724
+ "Ce panneau s’affiche tant que le nom, le courriel ou le compte forge ne sont pas renseignés. Utilisez Configurer ici pour remplir un court formulaire sans quitter le tableau de bord — c’est l’action recommandée juste après la visite. Vous pouvez choisir Masquer ce rappel si vous préférez le faire plus tard.",
1725
+ tourSkipBtn: "Passer la visite",
1726
+ tourBackBtn: "Précédent",
1727
+ tourNextBtn: "Suivant",
1728
+ tourDoneBtn: "Terminer",
1729
+ settingsTourProgressLabel: "Étape {n} sur {total}",
1730
+ settingsTourStep1Title: "Paramètres et options",
1731
+ settingsTourStep1Body:
1732
+ "Certaines options avancées ne sont présentes que dans les paramètres et non sur le tableau de bord. Cette visite souligne les configurations clés de votre espace de travail.",
1733
+ settingsTourStep2Title: "Profil d’usage",
1734
+ settingsTourStep2Body:
1735
+ "Basculez entre les modes 'Manager' et 'Développeur' pour ajuster le niveau de détail du tableau de bord et la fréquence des rappels.",
1736
+ settingsTourStep3Title: "Persistance et pilotes",
1737
+ settingsTourStep3Body:
1738
+ "Choisissez entre SQLite (recommandé) et l’ancien format JSON pour votre historique local. Vous pouvez aussi configurer un miroir MongoDB.",
1739
+ settingsTourStep4Title: "Intégration Git et GitLab",
1740
+ settingsTourStep4Body:
1741
+ "Configurez votre identité Git et votre jeton d’API GitLab pour activer l’import d’issues et la génération de messages de commit.",
1742
+ settingsTourStep5Title: "Rapports et exclusions",
1743
+ settingsTourStep5Body:
1744
+ "Définissez les répertoires et motifs de fichiers à exclure du décompte de lignes et du suivi de temps pour garder vos rapports propres.",
1745
+ settingsTourStep6Title: "Horaires et automatisation",
1746
+ settingsTourStep6Body:
1747
+ "Configurez vos heures de travail récurrentes et vos sessions planifiées pour automatiser le démarrage du suivi ou le transfert de tâches.",
1748
+ settingsTourSkipBtn: "Passer la visite",
1749
+ settingsTourBackBtn: "Précédent",
1750
+ settingsTourNextBtn: "Suivant",
1751
+ settingsTourDoneBtn: "Terminer",
1752
+ tourUndismissBtn: "Relancer la visite",
1753
+ reportingTourProgressLabel: "Visite Rapports — étape {n} sur {total}",
1754
+ reportingTourStep1Title: "Bienvenue dans Rapports Kronosys",
1755
+ reportingTourStep1Body:
1756
+ "Cette page agrège l’historique Kronosys via l’API locale. Elle sert à revoir les sessions, le temps enregistré sur les tâches, l’usage KronoFocus et, selon les filtres, les répartitions par #étiquette et par @projet.",
1757
+ reportingTourStep2Title: "Filtres",
1758
+ reportingTourStep2Body:
1759
+ "Choisissez une plage de dates (ou les raccourcis Jour / Semaine / Mois / Année), affinez éventuellement par #étiquettes, puis réinitialisez pour tout réafficher. Les pastilles vertes signalent des données encore mouvantes (session ou tâches non terminées).",
1760
+ reportingTourStep3Title: "Indicateurs récapitulatifs",
1761
+ reportingTourStep3Body:
1762
+ "Ces cartes condensent la même fenêtre que les graphiques : sessions, lignes de tâches, KronoFocus et minutes enregistrées. Les icônes (?) ouvrent une courte définition sans encombrer la page.",
1763
+ reportingTourStep4Title: "Graphiques par jour",
1764
+ reportingTourStep4Body:
1765
+ "Les barres montrent les sessions, les tâches par état, le temps enregistré sur les tâches et la durée murale des sessions par jour calendaire. Quand plusieurs semaines existent, la bande de navigation aligne graphiques et calendriers par étiquette.",
1766
+ reportingTourStep5Title: "Temps par étiquette et par projet",
1767
+ reportingTourStep5Body:
1768
+ "Consultez les minutes enregistrées sur les tâches regroupées par #étiquettes (y compris le compartiment sans étiquette explicite le cas échéant) et par @projet, avec des grilles hebdomadaires lorsque les données couvrent plusieurs jours.",
1769
+ reportingTourStep6Title: "Sommaire et mise en page à deux colonnes",
1770
+ reportingTourStep6Body:
1771
+ "Ce bloc correspond à la disposition principale de Rapports : le contenu à gauche et, sur grand écran, le sommaire fixe à droite. Sur téléphone, les mêmes ancres sont proposées en pastilles au-dessus des filtres.",
1772
+ newSessionModalTitle: "Nouvelle session — portée",
1773
+ newSessionModalHelpAria: "Aide : portée de session (durée, dates, jours)",
1774
+ newSessionModalHelpBody:
1775
+ "Ces options fixent le cadre attendu pour cette session seulement. Elles n’arrêtent pas Kronosys automatiquement : des rappels viennent de la collecte (battement de cœur) et une bannière ici lorsque vous approchez ou sortez des limites.\n\n• Durée murale maximale — comptée depuis le premier événement tracé dans la session.\n\n• Période calendaire — dates locales inclusives (début et/ou fin).\n\n• Jours de la semaine — limite aux jours choisis ; vous pouvez ajouter une plage horaire quotidienne (24 h locale). Les plages qui passent minuit sont prises en charge (ex. 22:00–06:00).",
1776
+ newSessionModeNone: "Aucune limite",
1777
+ newSessionModeMax: "Durée murale maximale",
1778
+ newSessionModeCalendar: "Période calendaire (dates)",
1779
+ newSessionModeWeekly: "Jours de la semaine (horaire optionnel)",
1780
+ newSessionMaxHoursLabel: "Durée max (heures)",
1781
+ newSessionDateFromLabel: "Du (date)",
1782
+ newSessionDateToLabel: "Au (date)",
1783
+ newSessionTodayBtn: "Aujourd’hui",
1784
+ newSessionWeekdaysLegend: "Jours actifs",
1785
+ newSessionTimeFromLabel: "Quotidiennement de",
1786
+ newSessionTimeToLabel: "à",
1787
+ newSessionNowBtn: "Maintenant",
1788
+ newSessionUseTimeWindow: "Limiter à une plage horaire chaque jour sélectionné",
1789
+ newSessionErrorMax: "Indiquez une durée maximale entre 0,1 et 8760 heures.",
1790
+ newSessionErrorCalendar: "Choisissez au moins une date (du et/ou au).",
1791
+ newSessionErrorWeekly: "Sélectionnez au moins un jour de la semaine.",
1792
+ newSessionStartBtn: "Démarrer la session",
1793
+ newSessionCancelBtn: "Annuler",
1794
+ sessionScopeNoticeAria: "Rappel de portée de session",
1795
+ appShellRouteNavAria: "Sections principales",
1796
+ appShellLiveDrawerAria: "Activité de la session en cours",
1797
+ appShellLiveDrawerTitle: "En cours",
1798
+ appShellLiveDrawerOpenDashboard: "Ouvrir le tableau de bord",
1799
+ appShellLiveDrawerSessionPaused: "Session en pause",
1800
+ appShellLiveDrawerWallClock: "Temps mural",
1801
+ appShellLiveDrawerTasksHeading: "Minuteurs",
1802
+ appShellLiveDrawerKronoFocusRunning: "En marche",
1803
+ appShellLiveDrawerKronoFocusPaused: "En pause",
1804
+ appShellLiveDrawerKronoFocusPhaseWork: "Travail",
1805
+ appShellLiveDrawerSubtaskTracking: "Sous-tâche",
1806
+ appShellLiveDrawerExpand: "Déployer le panneau",
1807
+ appShellLiveDrawerCollapse: "Replier le panneau",
1808
+ appShellLiveDrawerNoRunningTasks: "Aucune tâche au minuteur.",
1809
+ brandTagline: "La relativité du temps productif",
1810
+ appVersionAriaLabel: "Version du paquet du tableau de bord Kronosys : {version}.",
1811
+ dialogOkBtn: "OK",
1812
+ dialogCancelBtn: "Annuler",
1813
+ dialogConfirmBtn: "Confirmer",
1814
+ pageRefreshTitle: "Rafraîchir les données",
1815
+ pageRefreshAriaLabel: "Actualiser les données de cette page sans recharger tout le navigateur",
1816
+ pageRefreshProgressLabel: "Synchronisation avec le serveur Kronosys…",
1817
+ pageRefreshDoneToast: "Données rechargées depuis le serveur Kronosys",
1818
+ pageRefreshFailedToast: "Impossible de recharger les données. Vérifiez que le serveur Kronosys tourne et réessayez.",
1819
+ };
1820
+
1821
+ export function dashboardStrings(lang: Lang): DashboardStrings {
1822
+ return lang === "fr" ? fr : en;
1823
+ }
1824
+
1825
+ /** Libellé du nom de dénombrement après le chiffre (FR : 0 et 1 au singulier ; EN : 1 au singulier). */
1826
+ export function sessionTaskCountNoun(n: number, t: DashboardStrings, lang: Lang): string {
1827
+ if (lang === "fr") {
1828
+ return n > 1 ? t.tasksInSessionPlural : t.tasksInSessionSingular;
1829
+ }
1830
+ return n === 1 ? t.tasksInSessionSingular : t.tasksInSessionPlural;
1831
+ }