@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,1276 @@
1
+ import type { Lang } from "./dashboardCopy";
2
+
3
+ export type SettingsCopy = {
4
+ title: string;
5
+ subtitle: string;
6
+ loading: string;
7
+ reload: string;
8
+ save: string;
9
+ saving: string;
10
+ savedOk: string;
11
+ /** Bannière fixe en bas de page quand le formulaire diffère des paramètres enregistrés. */
12
+ settingsUnsavedStickyHint: string;
13
+ /** Rétablit la configuration Kronosys aux valeurs d’usine (sans effacer les secrets stockés à part). */
14
+ resetToDefaults: string;
15
+ resetToDefaultsConfirm: string;
16
+ resettingDefaults: string;
17
+ resetDefaultsDone: string;
18
+ openIdeSettings: string;
19
+ tocHeading: string;
20
+ tocNavAriaLabel: string;
21
+ /** Placeholder du champ de filtrage du sommaire (paramètres). */
22
+ tocSearchPlaceholder: string;
23
+ /** `aria-label` du champ de filtrage du sommaire. */
24
+ tocSearchAriaLabel: string;
25
+ /** Message lorsque le filtre ne correspond à aucune entrée du sommaire. */
26
+ tocSearchNoResults: string;
27
+ sectionUsageProfile: string;
28
+ usageProfile: string;
29
+ usageProfileDesc: string;
30
+ profileDeveloper: string;
31
+ profileManager: string;
32
+ workspaceLocSectionHiddenManager: string;
33
+ sectionGeneral: string;
34
+ sectionPrivacy: string;
35
+ /** Tableau de bord web : affichage du KronoFocus. */
36
+ sectionKronoFocus: string;
37
+ kronoFocusShowInHeader: string;
38
+ kronoFocusShowInHeaderDesc: string;
39
+ kronoFocusShowInTaskOps: string;
40
+ kronoFocusShowInTaskOpsDesc: string;
41
+ /** Comportement des tâches sans étiquette explicite (#). */
42
+ sectionTaskTags: string;
43
+ taskDefaultTagBucketEnabled: string;
44
+ taskDefaultTagBucketEnabledDesc: string;
45
+ dashboardAllowTaskStartTimeEdit: string;
46
+ dashboardAllowTaskStartTimeEditDesc: string;
47
+ dashboardAllowSessionStartTimeEdit: string;
48
+ dashboardAllowSessionStartTimeEditDesc: string;
49
+ dashboardAllowTaskEndTimeEdit: string;
50
+ dashboardAllowTaskEndTimeEditDesc: string;
51
+ dashboardAllowSessionEndTimeEdit: string;
52
+ dashboardAllowSessionEndTimeEditDesc: string;
53
+ sectionCollection: string;
54
+ sectionHistory: string;
55
+ sectionDangerZone: string;
56
+ dangerClearHistoryTitle: string;
57
+ dangerClearHistoryBodyIntro: string;
58
+ /** Éléments affichés sous forme de liste à puces (HTML `li`). */
59
+ dangerClearHistoryBodyBullets: string[];
60
+ dangerClearHistoryBodyAfterList1: string;
61
+ dangerClearHistoryBodyAfterList2: string;
62
+ dangerClearHistoryButton: string;
63
+ dangerClearHistoryConfirm: string;
64
+ /** Mot exact à saisir pour débloquer Confirmer (zone de danger). */
65
+ dangerClearHistoryConfirmPhrase: string;
66
+ /** Instruction : remplacer `{phrase}` par le même mot que `dangerClearHistoryConfirmPhrase`. */
67
+ dangerClearHistoryTypeInstruction: string;
68
+ dangerClearHistoryTypeFieldLabel: string;
69
+ dangerClearHistoryTypeInputAria: string;
70
+ dangerClearHistoryBackupIntro: string;
71
+ dangerClearHistoryBackupJson: string;
72
+ dangerClearHistoryBackupJsonHint: string;
73
+ dangerClearHistoryBackupCsvBlockTitle: string;
74
+ dangerClearHistoryBackupCsvBlockHint: string;
75
+ dangerClearHistoryBackupCsvZip: string;
76
+ dangerClearHistoryBackupCsvZipHint: string;
77
+ dangerClearHistoryBackupCsvSeparateTitle: string;
78
+ dangerClearHistoryBackupCsvSessions: string;
79
+ dangerClearHistoryBackupCsvTasks: string;
80
+ dangerClearHistoryBackupCsvSubtasks: string;
81
+ dangerClearHistoryBackupCsvRegistry: string;
82
+ dangerClearHistoryBackupCsvTagDesc: string;
83
+ dangerClearHistoryBackupCsvProjectDesc: string;
84
+ dangerClearHistoryBackupCsvGitId: string;
85
+ dangerClearHistoryBackupCsvStoreBlobs: string;
86
+ dangerClearHistoryBackupSqlite: string;
87
+ dangerClearHistoryBackupSqliteHint: string;
88
+ sectionArchivedSessions: string;
89
+ archivedSessionsIntro: string;
90
+ archivesPaginationPrev: string;
91
+ archivesPaginationNext: string;
92
+ archivesPaginationNavAria: string;
93
+ /** Remplace `{from}`, `{to}`, `{total}` (numéros d’éléments affichés). */
94
+ archivesPaginationRange: string;
95
+ sectionExport: string;
96
+ sectionGit: string;
97
+ sectionMongo: string;
98
+ sectionWeb: string;
99
+ /** Sous-section « Général » (mode `next dev`). */
100
+ devDataBlockTitle: string;
101
+ devDataIntro: string;
102
+ devDataUseProdLabel: string;
103
+ devDataUseProdDesc: string;
104
+ devDataActivePath: string;
105
+ devDataPreferredPath: string;
106
+ devDataProdPath: string;
107
+ devDataPrefsFile: string;
108
+ devDataTraceOverride: string;
109
+ devDataEnvOverride: string;
110
+ devDataRestartHint: string;
111
+ devDataHiddenNotDev: string;
112
+ sectionWorkspaceLoc: string;
113
+ sectionTagsProjects: string;
114
+ tagsProjectsIntro: string;
115
+ tagsProjectsHelpAria: string;
116
+ /** Aide longue : impact masquage / épingle / projets (sauts de ligne possibles). */
117
+ tagsProjectsHelpBody: string;
118
+ tagsGlobalHeading: string;
119
+ tagsGlobalIntro: string;
120
+ tagsByProjectHeading: string;
121
+ tagsByProjectIntro: string;
122
+ /** Bloc « portées » sans projet enregistré correspondant (sous la liste des projets) — corps du popover (?). */
123
+ tagsByProjectOrphanIntro: string;
124
+ /** `aria-label` du bouton (?) à côté du titre du bloc des portées orphelines. */
125
+ tagsByProjectOrphanHelpAria: string;
126
+ /** Sous-navigation (ancre) sous « Étiquettes et projets ». */
127
+ tocSubTagsGlobal: string;
128
+ tocSubTagsProjects: string;
129
+ tocSubTagsByProject: string;
130
+ tagsHiddenHeading: string;
131
+ tagsPinFieldLabel: string;
132
+ tagsPinPlaceholder: string;
133
+ tagsPinScopedFieldLabel: string;
134
+ tagsPinScopedPlaceholder: string;
135
+ tagsPinAddBtn: string;
136
+ tagsTableTagCol: string;
137
+ tagsTableActionsCol: string;
138
+ tagBadgePinned: string;
139
+ /** aria-label du bouton-icône : ajouter aux raccourcis. */
140
+ tagPinBtn: string;
141
+ /** aria-label : retirer des raccourcis épinglés. */
142
+ tagUnpinBtn: string;
143
+ /** aria-label : masquer des raccourcis (données des tâches inchangées). */
144
+ tagExcludeBtn: string;
145
+ /** aria-label : réafficher une étiquette masquée. */
146
+ tagRestoreBtn: string;
147
+ /** aria-label : effacer toute métadonnée d’étiquette (raccourcis, masquage, description). */
148
+ tagPurgeAriaLabel: string;
149
+ /** Message de confirmation pour l’effacement complet d’une étiquette. */
150
+ tagPurgeConfirm: string;
151
+ /** Confirmation lorsque l’étiquette est déjà dans « Masquées des raccourcis ». */
152
+ tagPurgeHiddenConfirm: string;
153
+ /** aria-label : effacer une étiquette masquée et toute sa métadonnée. */
154
+ tagPurgeHiddenAriaLabel: string;
155
+ tagUnpinConfirm: string;
156
+ tagExcludeConfirm: string;
157
+ projectsHeading: string;
158
+ /** Premier paragraphe du popover (?) « Projets enregistrés ». */
159
+ projectsIntro: string;
160
+ /** `aria-label` du (?) à côté de « Projets enregistrés » (intro + suppression). */
161
+ projectsHelpAria: string;
162
+ projectsHelpBody: string;
163
+ projectsTableProjectCol: string;
164
+ /** aria-label : effacer le projet et les métadonnées associées (étiquettes scoped, etc.). */
165
+ projectsRemoveBtn: string;
166
+ /** Confirmation pour l’effacement complet d’un projet. */
167
+ projectRemoveConfirm: string;
168
+ /** Note affichée au survol des étiquettes / codes dans le tableau de bord. */
169
+ tagDescriptionLabel: string;
170
+ projectDescriptionLabel: string;
171
+ descriptionSaveBtn: string;
172
+ /** Infobulle / aria-label : démarrer le suivi d’une tâche préremplie avec cette étiquette (et projet si lié). */
173
+ tagStartTrackedTaskBtn: string;
174
+ /** Libellé du bouton pour démarrer une tâche avec ce projet (@projet) sans étiquette imposée. */
175
+ tagStartTrackedTaskFromProjectBtn: string;
176
+ /** Toast quand une session est créée automatiquement avant de lancer une tâche depuis les raccourcis. */
177
+ tagStartTaskAutoSessionToast: string;
178
+ tagStartTaskConflictTitle: string;
179
+ tagStartTaskConflictMessage: string;
180
+ tagStartTaskConflictPauseBtn: string;
181
+ tagStartTaskConflictFinishBtn: string;
182
+ tagStartTaskConflictParallelBtn: string;
183
+ /** Case à cocher : mémoriser le choix pour les prochains démarrages. */
184
+ tagStartTaskConflictDontShowAgain: string;
185
+ tagsEmptyGlobal: string;
186
+ tagsByProjectSectionEmpty: string;
187
+ tagsByProjectSubEmpty: string;
188
+ projectsEmpty: string;
189
+ hiddenTagsEmpty: string;
190
+ workspaceLocExcludedDirs: string;
191
+ workspaceLocExcludedDirsDesc: string;
192
+ workspaceLocExcludedPatterns: string;
193
+ workspaceLocExcludedPatternsDesc: string;
194
+ pickStorageFolder: string;
195
+ hintPortRestart: string;
196
+ hintDashboardUrl: string;
197
+ enabled: string;
198
+ enabledDesc: string;
199
+ autoStart: string;
200
+ autoStartDesc: string;
201
+ sectionSchedule: string;
202
+ scheduleEnabled: string;
203
+ scheduleEnabledDesc: string;
204
+ scheduleDays: string;
205
+ scheduleDaysDesc: string;
206
+ scheduleStartTime: string;
207
+ scheduleEndTime: string;
208
+ timePickerPopoverTimeLabel: string;
209
+ timePickerPopoverHourAria: string;
210
+ timePickerPopoverMinuteAria: string;
211
+ scheduleCreateDailySession: string;
212
+ scheduleCreateDailySessionDesc: string;
213
+ scheduleTransferTasks: string;
214
+ scheduleTransferTasksDesc: string;
215
+ schedulePauseTasks: string;
216
+ schedulePauseTasksDesc: string;
217
+ sectionPlannedSessions: string;
218
+ plannedSessionsIntro: string;
219
+ plannedSessionAdd: string;
220
+ plannedSessionName: string;
221
+ plannedSessionTags: string;
222
+ plannedSessionProject: string;
223
+ plannedSessionRemove: string;
224
+ showWelcome: string;
225
+ showWelcomeDesc: string;
226
+ anonymizePaths: string;
227
+ anonymizePathsDesc: string;
228
+ flushInterval: string;
229
+ flushIntervalDesc: string;
230
+ heartbeatInterval: string;
231
+ heartbeatIntervalDesc: string;
232
+ maxBuffered: string;
233
+ maxBufferedDesc: string;
234
+ historyPath: string;
235
+ historyPathDesc: string;
236
+ historyPartition: string;
237
+ historyPartitionDesc: string;
238
+ localPersistenceDriver: string;
239
+ localPersistenceDriverDesc: string;
240
+ persistenceDriverJson: string;
241
+ persistenceDriverSqlite: string;
242
+ localPersistenceReloadHint: string;
243
+ partitionDaily: string;
244
+ partitionWeekly: string;
245
+ partitionMonthly: string;
246
+ sessionStartMode: string;
247
+ sessionStartModeDesc: string;
248
+ modeContinue: string;
249
+ modeNew: string;
250
+ exportFormat: string;
251
+ exportFormatDesc: string;
252
+ fmtJson: string;
253
+ fmtCsv: string;
254
+ fmtJira: string;
255
+ fmtSap: string;
256
+ csvDelimiter: string;
257
+ csvDelimiterDesc: string;
258
+ autoGitSync: string;
259
+ autoGitSyncDesc: string;
260
+ gitRemoteUrl: string;
261
+ gitRemoteUrlDesc: string;
262
+ /** Ancre sous « Git » : identité affichée dans l’en-tête du tableau de bord. */
263
+ tocSubGitIdentity: string;
264
+ gitIdentitySubheading: string;
265
+ gitIdentityIntro: string;
266
+ gitIdentityNameLabel: string;
267
+ gitIdentityNameDesc: string;
268
+ gitIdentityEmailLabel: string;
269
+ gitIdentityEmailDesc: string;
270
+ gitIdentityLoginLabel: string;
271
+ gitIdentityLoginDesc: string;
272
+ gitIdentitySave: string;
273
+ gitIdentitySaving: string;
274
+ gitIdentitySavedFlash: string;
275
+ glabRemoteSuggest: string;
276
+ glabRemoteCreate: string;
277
+ glabRemoteCreating: string;
278
+ gitlabToken: string;
279
+ gitlabTokenDesc: string;
280
+ gitlabTokenSave: string;
281
+ gitlabTokenClear: string;
282
+ /** `title` du bouton Enregistrer le jeton lorsque le champ est vide. */
283
+ gitlabTokenSaveNeedValue: string;
284
+ gitlabTokenStoredYes: string;
285
+ gitlabTokenFromEnvYes: string;
286
+ gitlabTokenNone: string;
287
+ gitlabInstanceUrl: string;
288
+ gitlabInstanceUrlDesc: string;
289
+ gitlabTest401Help: string;
290
+ gitlabTestConnection: string;
291
+ gitlabTestConnectionAria: string;
292
+ gitlabTestRunning: string;
293
+ gitlabTestOk: string;
294
+ gitlabTestFail: string;
295
+ gitlabTestNoToken: string;
296
+ gitlabTestErrorGeneric: string;
297
+ gitlabApiVerifiedYes: string;
298
+ gitlabApiVerifiedNo: string;
299
+ /** Court rappel : le tableau de bord ne relit pas le secret enregistré pour l’API de test. */
300
+ gitlabTestPasteStoredHint: string;
301
+ historyLocalFirstHint: string;
302
+ mongoEnabled: string;
303
+ mongoEnabledDesc: string;
304
+ mongoDatabase: string;
305
+ mongoDatabaseDesc: string;
306
+ mongoCollection: string;
307
+ mongoCollectionDesc: string;
308
+ sectionMongoConnection: string;
309
+ mongoConnectionIntro: string;
310
+ mongoHost: string;
311
+ mongoHostDesc: string;
312
+ mongoPort: string;
313
+ mongoPortDesc: string;
314
+ mongoUser: string;
315
+ mongoUserDesc: string;
316
+ mongoPassword: string;
317
+ mongoPasswordDesc: string;
318
+ mongoPasswordSave: string;
319
+ mongoPasswordClear: string;
320
+ mongoPasswordConfiguredYes: string;
321
+ mongoPasswordConfiguredNo: string;
322
+ mongoAuthSource: string;
323
+ mongoAuthSourceDesc: string;
324
+ mongoManualUri: string;
325
+ mongoManualUriDesc: string;
326
+ mongoUri: string;
327
+ mongoUriDesc: string;
328
+ mongoUriSave: string;
329
+ mongoUriClear: string;
330
+ mongoUriConfiguredYes: string;
331
+ mongoUriConfiguredNo: string;
332
+ mongoRemoteStatus: string;
333
+ mongoStatusConnected: string;
334
+ mongoStatusFailed: string;
335
+ mongoStatusPending: string;
336
+ mongoConnectionResolvableYes: string;
337
+ mongoConnectionResolvableNo: string;
338
+ mongoTestConnection: string;
339
+ mongoTestConnectionAria: string;
340
+ mongoTestRunning: string;
341
+ mongoTestOk: string;
342
+ mongoTestFail: string;
343
+ mongoTestDisabled: string;
344
+ mongoTestErrorGeneric: string;
345
+ mongoTestUsesSavedConfigHint: string;
346
+ mongoSyncSectionTitle: string;
347
+ mongoResyncButton: string;
348
+ mongoResyncAriaLabel: string;
349
+ mongoResyncConfirm: string;
350
+ mongoResyncRunning: string;
351
+ mongoResyncDone: string;
352
+ mongoResyncHint: string;
353
+ mongoResyncDisabled: string;
354
+ mongoResyncUnsupported: string;
355
+ mongoResyncErrorGeneric: string;
356
+ /** Placeholder `{detail}` — message d’erreur serveur ou réseau. */
357
+ mongoResyncErrorDetail: string;
358
+ /** Libellé au-dessus des racines du workspace (section miroir Mongo). */
359
+ workspaceFoldersLabel: string;
360
+ workspaceFoldersEmpty: string;
361
+ localApiPort: string;
362
+ localApiPortDesc: string;
363
+ dashboardWebUrl: string;
364
+ dashboardWebUrlDesc: string;
365
+ /** Fuseau horaire IANA pour dates et rapports. */
366
+ dashboardDisplayTimeZone: string;
367
+ dashboardDisplayTimeZoneDesc: string;
368
+ /** Format d’affichage des heures (tableau de bord, aperçus d’horaires). */
369
+ dashboardClockFormat: string;
370
+ dashboardClockFormatDesc: string;
371
+ dashboardClock24hOption: string;
372
+ dashboardClock12hOption: string;
373
+ /** Erreur de validation du fuseau (IANA inconnu). */
374
+ invalidDashboardTimeZone: string;
375
+ /** Sommaire : sous-entrée sous « Tableau de bord web ». */
376
+ tocSubDashboardTour: string;
377
+ /** Sommaire : visite guidée Rapports (sous Tableau de bord web). */
378
+ tocSubReportingTour: string;
379
+ /** Sommaire : réafficher l’aide des trois colonnes (sous Tableau de bord web). */
380
+ tocSubDashboardColumnHints: string;
381
+ /** Bloc Paramètres : bandeau d’aide des colonnes du tableau de bord. */
382
+ dashboardColumnHintsBlockTitle: string;
383
+ dashboardColumnHintsBlockIntro: string;
384
+ dashboardColumnHintsRestoreBtn: string;
385
+ /** Message court après réinitialisation (navigateur). */
386
+ dashboardColumnHintsRestoreDone: string;
387
+ /** `aria-label` du tablist (colonne étiquettes du tableau de bord). */
388
+ tagsProjectsTabsAriaLabel: string;
389
+ /** Onglet 1 : étiquettes globales + masquées. */
390
+ tagsProjectsTabGlobal: string;
391
+ /** Onglet 2 : projets enregistrés + étiquettes liées par projet. */
392
+ tagsProjectsTabProjects: string;
393
+ tocSubSessionDurationAlert: string;
394
+ dashboardSessionDurationAlertHours: string;
395
+ dashboardSessionDurationAlertHoursDesc: string;
396
+ dashboardTourBlockTitle: string;
397
+ dashboardTourBlockIntro: string;
398
+ dashboardTourReplayLinkLabel: string;
399
+ reportingTourBlockTitle: string;
400
+ reportingTourBlockIntro: string;
401
+ reportingTourReplayLinkLabel: string;
402
+ dialogOkBtn: string;
403
+ dialogCancelBtn: string;
404
+ dialogConfirmBtn: string;
405
+ scrollToTopAria: string;
406
+ /** Lien vers la page licences (sommaire paramètres). */
407
+ licensesPageLink: string;
408
+ };
409
+
410
+ const en: SettingsCopy = {
411
+ title: "Settings",
412
+ subtitle: "Kronosys options stored locally on this machine.",
413
+ loading: "Loading settings…",
414
+ reload: "Reload from server",
415
+ save: "Save",
416
+ saving: "Saving…",
417
+ savedOk: "Settings saved.",
418
+ settingsUnsavedStickyHint: "You have unsaved changes.",
419
+ resetToDefaults: "Reset to defaults",
420
+ resetToDefaultsConfirm:
421
+ "Restore every Kronosys option to its factory default? Stored GitLab tokens and MongoDB connection flags are not removed from secure storage; only the settings shown on this page are reset.",
422
+ resettingDefaults: "Resetting…",
423
+ resetDefaultsDone: "Defaults applied.",
424
+ openIdeSettings: "These fields map to persisted configuration keys in the local store.",
425
+ tocHeading: "On this page",
426
+ tocNavAriaLabel: "Jump to a settings section",
427
+ tocSearchPlaceholder: "Filter table of contents…",
428
+ tocSearchAriaLabel: "Filter settings sections in the table of contents",
429
+ tocSearchNoResults: "No section title matches.",
430
+ sectionUsageProfile: "Usage profile",
431
+ usageProfile: "Profile",
432
+ usageProfileDesc:
433
+ "Developer: lines written, per-language stats, coding-signal counts, workspace LOC snapshot, and Git repo card. Manager: tasks, sessions, KronoFocus, and time only — no code-linked metrics or UI.",
434
+ profileDeveloper: "Developer",
435
+ profileManager: "Manager",
436
+ workspaceLocSectionHiddenManager:
437
+ "These options apply only in Developer profile (workspace code snapshot on Reporting).",
438
+ sectionGeneral: "General",
439
+ sectionPrivacy: "Privacy",
440
+ sectionKronoFocus: "KronoFocus (dashboard)",
441
+ kronoFocusShowInHeader: "Show in the header",
442
+ kronoFocusShowInHeaderDesc: "KronoFocus timer and controls in the top bar of the browser dashboard.",
443
+ kronoFocusShowInTaskOps: "Show in task action buttons",
444
+ kronoFocusShowInTaskOpsDesc:
445
+ "KronoFocus start on active tasks and the optional “start KronoFocus with new task” toggle in the task launcher.",
446
+ sectionTaskTags: "Tasks & tags",
447
+ taskDefaultTagBucketEnabled: "Implicit default tag for tasks without #tags",
448
+ taskDefaultTagBucketEnabledDesc:
449
+ "When enabled, any task with no hashtag labels after cleanup is stored with the reserved default bucket (shown as “default” in English or “défaut” in French). When disabled, such tasks keep an empty label list until you add one.",
450
+ dashboardAllowTaskStartTimeEdit: "Allow task start-time correction in the dashboard",
451
+ dashboardAllowTaskStartTimeEditDesc:
452
+ "Shows controls to edit a task start time from the Tasks column while it is running or after it is completed.",
453
+ dashboardAllowSessionStartTimeEdit: "Allow session start-time correction in the dashboard",
454
+ dashboardAllowSessionStartTimeEditDesc:
455
+ "Shows controls to edit a session start time from the Sessions column for the live session or a historical session.",
456
+ dashboardAllowTaskEndTimeEdit: "Allow task end-time correction in the dashboard",
457
+ dashboardAllowTaskEndTimeEditDesc:
458
+ "Shows controls to edit the end time of a completed task in the Tasks column (start time can be edited separately).",
459
+ dashboardAllowSessionEndTimeEdit: "Allow session end-time correction in the dashboard",
460
+ dashboardAllowSessionEndTimeEditDesc:
461
+ "Shows controls to edit a session end time in the Sessions column when the session is already finished (start time can be edited separately).",
462
+ sectionCollection: "Collection & buffers",
463
+ sectionHistory: "Session history",
464
+ sectionDangerZone: "Danger zone",
465
+ dangerClearHistoryTitle: "Clear all local dashboard data",
466
+ dangerClearHistoryBodyIntro: "Permanently removes, in this dashboard’s local store:",
467
+ dangerClearHistoryBodyBullets: [
468
+ "Every session (live view, history list, and archived list) and the session you were inspecting",
469
+ "All tag & project shortcuts: pinned tags, tags hidden from chips, tag/project descriptions, known tag & project suggestion lists",
470
+ "Git identity saved here (display name, email, forge login) and the Git statistics card data",
471
+ "The cached workspace lines-of-code snapshot used on Reporting (Developer profile)",
472
+ "The “skip archive confirm” preference for this dashboard",
473
+ "The browser’s saved dashboard language and explicit language choice (you will pick English or Français again before the guided tour)",
474
+ ],
475
+ dangerClearHistoryBodyAfterList1:
476
+ "Afterwards, the welcome guided tour will be offered again on the dashboard, and the “show welcome on startup” option is turned back on in settings.",
477
+ dangerClearHistoryBodyAfterList2: "This cannot be undone.",
478
+ dangerClearHistoryButton: "Clear all local data…",
479
+ dangerClearHistoryConfirm:
480
+ "You are about to erase everything listed in the danger-zone description above (sessions, tags/projects metadata, Git identity in this store, etc.). Continue?",
481
+ dangerClearHistoryConfirmPhrase: "DELETE",
482
+ dangerClearHistoryTypeInstruction:
483
+ "To enable “Confirm”, type {phrase} exactly below (all capitals, no spaces).",
484
+ dangerClearHistoryTypeFieldLabel: "Confirmation word",
485
+ dangerClearHistoryTypeInputAria:
486
+ "Type the confirmation word to allow the full erase described above (sessions, metadata, Git identity, etc.)",
487
+ dangerClearHistoryBackupIntro:
488
+ "Before you confirm, you can download a local backup (same data the dashboard uses on this machine):",
489
+ dangerClearHistoryBackupJson: "JSON — full state snapshot",
490
+ dangerClearHistoryBackupJsonHint:
491
+ "Entire persisted Kronosys payload in one file (sessions including live `current`, tasks, tag/project metadata, Git identity, `cfg`, Git stats snapshot, workspace LOC snapshot, etc.).",
492
+ dangerClearHistoryBackupCsvBlockTitle: "CSV — multiple tables (one download per link)",
493
+ dangerClearHistoryBackupCsvBlockHint:
494
+ "Together these tables mirror what the danger-zone erase removes: sessions (with a full JSON column per row), every task and subtask, tag/project lists and descriptions, Git identity, plus configuration and JSON blobs (`cfg`, Git stats, workspace code snapshot, inspecting session id, etc.).",
495
+ dangerClearHistoryBackupCsvZip: "CSV — all tables (ZIP)",
496
+ dangerClearHistoryBackupCsvZipHint: "One download containing the eight UTF-8 CSV files.",
497
+ dangerClearHistoryBackupCsvSeparateTitle: "Individual files (optional)",
498
+ dangerClearHistoryBackupCsvSessions: "Sessions — extended metrics + full session JSON",
499
+ dangerClearHistoryBackupCsvTasks: "Tasks — one row per task + full task JSON",
500
+ dangerClearHistoryBackupCsvSubtasks: "Subtasks — one row per checklist item + JSON",
501
+ dangerClearHistoryBackupCsvRegistry: "Tag & project registry — known / pinned / hidden lists",
502
+ dangerClearHistoryBackupCsvTagDesc: "Tag descriptions",
503
+ dangerClearHistoryBackupCsvProjectDesc: "Project descriptions",
504
+ dangerClearHistoryBackupCsvGitId: "Git identity (saved in this store)",
505
+ dangerClearHistoryBackupCsvStoreBlobs: "Config & snapshots — `cfg`, Git stats, workspace LOC, UI prefs",
506
+ dangerClearHistoryBackupSqlite: "SQLite — database file",
507
+ dangerClearHistoryBackupSqliteHint: "Raw kronosys.sqlite after a WAL checkpoint (restore by replacing the file when the app is stopped).",
508
+ sectionArchivedSessions: "Archived sessions",
509
+ archivedSessionsIntro:
510
+ "Sessions hidden from the main dashboard list, newest first. Restore adds them back to the Sessions column.",
511
+ archivesPaginationPrev: "Previous page",
512
+ archivesPaginationNext: "Next page",
513
+ archivesPaginationNavAria: "Archived sessions pagination",
514
+ archivesPaginationRange: "{from}–{to} of {total}",
515
+ sectionExport: "Export defaults",
516
+ sectionGit: "Git sync",
517
+ sectionMongo: "MongoDB mirror",
518
+ sectionWeb: "Dashboard & API",
519
+ devDataBlockTitle: "Development mode (local data store)",
520
+ devDataIntro:
521
+ "While you run the Next.js dev server (`next dev`), SQLite and local state use a separate folder (`…/v4-dev` by default) from the production build (`next start`, `…/v4`) so you do not overwrite your real data. Save with the main **Save** button at the bottom of this page, like any other setting.",
522
+ devDataUseProdLabel: "Use the same data directory as production (v4)",
523
+ devDataUseProdDesc:
524
+ "When off (default), dev uses an isolated `v4-dev` directory. When on, dev reads and writes the same `v4` path as a packaged or `next start` run. After changing this, restart the dev server so it opens the right database file.",
525
+ devDataActivePath: "Data directory in use (this process)",
526
+ devDataPreferredPath: "Would apply after restart",
527
+ devDataProdPath: "Default production directory (v4)",
528
+ devDataPrefsFile: "Preference file on disk",
529
+ devDataTraceOverride: "The server was started with TRACE_DATA_DIR; that path is used and this toggle is disabled.",
530
+ devDataEnvOverride:
531
+ "The environment variable KRONOSYS_DEV_USE_PROD_DATA is set; the dev server uses the production v4 path and this toggle is disabled.",
532
+ devDataRestartHint: "Your saved preference no longer matches the open database. Restart the Next.js dev server to apply it.",
533
+ devDataHiddenNotDev: "This block is only shown when the dashboard is served in development mode (`next dev`).",
534
+ sectionWorkspaceLoc: "Reporting — workspace code snapshot",
535
+ sectionTagsProjects: "Tags & saved projects",
536
+ tagsProjectsIntro:
537
+ "Manage global tags, saved projects, and project-linked tags separately. The same controls appear in the right column on the main dashboard. Actions here do not bulk-edit tasks or session files.",
538
+ tagsProjectsHelpAria: "Help: impact of tag and project changes",
539
+ tagsProjectsHelpBody:
540
+ "This page is split into three areas: global tags (no project), saved projects, then project-linked tags grouped under each project.\n\nHide (eye-off icon): the tag no longer appears in suggestion chips. Tasks are unchanged.\n\nDelete permanently (trash icon): removes the tag from pinned and hidden lists and clears its description. Tasks are unchanged.\n\nPin icons: manage your pinned shortcut list.\n\nProject-scoped tags: use @Project#code in a task title (stored as Project#code). Suggestion chips only show that code when the task’s project matches Project.\n\nDescriptions: optional local notes; tooltips on dashboard chips.\n\nDelete project (trash): removes the project from the saved list, clears its description, and purges metadata for tags stored as Project#… under that project. Tasks are unchanged.",
541
+ tagsGlobalHeading: "Global tags (no project)",
542
+ tagsGlobalIntro:
543
+ "Shortcuts for tags that are not tied to a specific project. They are suggested on every task, regardless of @project.",
544
+ tagsByProjectHeading: "Project-linked tags",
545
+ tagsByProjectIntro:
546
+ "Each block is a project key; tags stored as Project#code appear under that project. Pin, hide, and descriptions are still per tag.",
547
+ tagsByProjectOrphanIntro:
548
+ "Project#code scopes that do not match any saved project above. Pin or edit them here, or add the project to the list first.",
549
+ tagsByProjectOrphanHelpAria: "Help: project-linked tags without a matching saved project",
550
+ tocSubTagsGlobal: "Global tags",
551
+ tocSubTagsProjects: "Projects",
552
+ tocSubTagsByProject: "Tags by project",
553
+ tagsHiddenHeading: "Hidden from shortcuts",
554
+ tagsPinFieldLabel: "Pin a global tag",
555
+ tagsPinPlaceholder: "e.g. bugfix or deep-work",
556
+ tagsPinScopedFieldLabel: "Pin a project-linked tag",
557
+ tagsPinScopedPlaceholder: "e.g. 204822-1530 or ClientABC#204822-1530",
558
+ tagsPinAddBtn: "Pin",
559
+ tagsTableTagCol: "Tag",
560
+ tagsTableActionsCol: "Actions",
561
+ tagBadgePinned: "Pinned",
562
+ tagPinBtn: "Add tag to pinned shortcuts",
563
+ tagUnpinBtn: "Remove tag from pinned shortcuts",
564
+ tagExcludeBtn: "Hide tag from suggestion shortcuts",
565
+ tagRestoreBtn: "Show tag in shortcuts again",
566
+ tagPurgeAriaLabel: "Delete tag metadata permanently",
567
+ tagPurgeConfirm:
568
+ "Permanently delete this tag’s metadata? Its description will be cleared, it will be unpinned, and it will be hidden from dashboard tag lists (it appears under “Hidden from shortcuts” if tasks still reference it). Tasks are not modified.",
569
+ tagPurgeHiddenConfirm:
570
+ "Remove this tag from the hidden list and clear its description? If tasks still use it, it can show again in shortcuts. Tasks are not modified.",
571
+ tagPurgeHiddenAriaLabel: "Permanently delete this hidden tag’s metadata",
572
+ tagUnpinConfirm: "Remove this tag from your pinned list? It may still appear if used on tasks.",
573
+ tagExcludeConfirm:
574
+ "Hide this tag from dashboard shortcuts? Task and session data are not changed; existing tasks keep the tag and reporting can still count it.",
575
+ projectsHeading: "Saved projects",
576
+ projectsIntro: "Projects you added via @project or the dashboard.",
577
+ projectsHelpAria: "Help: saved projects",
578
+ projectsHelpBody:
579
+ "Deleting a project (trash icon) removes it from the saved list, clears its description, and purges metadata for tags stored as Project#… for that project. Tasks are not modified; any task that still references @project keeps it.",
580
+ projectsTableProjectCol: "Project",
581
+ projectsRemoveBtn: "Delete project and related tag metadata",
582
+ projectRemoveConfirm:
583
+ "Permanently delete this project’s metadata? It will be removed from the saved list, its description cleared, and pinned/hidden/description data for tags in the form Project#… under this project will be removed. Tasks are not modified.",
584
+ tagDescriptionLabel: "Description (tooltip in dashboard)",
585
+ projectDescriptionLabel: "Description (tooltip in dashboard)",
586
+ descriptionSaveBtn: "Save description",
587
+ tagStartTrackedTaskBtn: "Start tracking a task with this tag (and project if linked)",
588
+ tagStartTrackedTaskFromProjectBtn: "Start tracking a task with this project",
589
+ tagStartTaskAutoSessionToast:
590
+ "No active session — starting one now so your task can be tracked in this session.",
591
+ tagStartTaskConflictTitle: "Tracking already active",
592
+ tagStartTaskConflictMessage:
593
+ "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.",
594
+ tagStartTaskConflictPauseBtn: "Pause active tasks",
595
+ tagStartTaskConflictFinishBtn: "Finish active tasks",
596
+ tagStartTaskConflictParallelBtn: "Start in parallel (keep timers running)",
597
+ tagStartTaskConflictDontShowAgain:
598
+ "Remember this choice and don’t show this dialog again (the same action will run automatically next time).",
599
+ tagsEmptyGlobal: "No global tags in shortcuts yet. Pin one above or add #tags on tasks.",
600
+ tagsByProjectSectionEmpty: "No project-linked tags in shortcuts yet. Use @Project#code on a task or pin one below.",
601
+ tagsByProjectSubEmpty: "No linked tag for this project in shortcuts yet.",
602
+ projectsEmpty: "No saved projects yet. Use @project on a task or pick a project on the dashboard.",
603
+ hiddenTagsEmpty: "No tags hidden.",
604
+ workspaceLocExcludedDirs: "Excluded directory name segments",
605
+ workspaceLocExcludedDirsDesc:
606
+ "One name per line (a single path segment, not a full path). If any segment of a file path equals a listed name, that file is skipped — for both Git-tracked lists and folder walks. Examples: node_modules, .git, .husky, .venv, dist.",
607
+ workspaceLocExcludedPatterns: "Excluded path patterns",
608
+ workspaceLocExcludedPatternsDesc:
609
+ "One pattern per line (minimatch syntax: *, ?, **), relative to the workspace root. Examples: **/*.min.js, generated/**, **/*.gen.ts. After saving, refresh the snapshot from the Reporting page.",
610
+ pickStorageFolder: "Choose folder…",
611
+ hintPortRestart: "After changing the port, restart the Kronosys server process so the API listens on the new port.",
612
+ hintDashboardUrl: "Display-only reference URL; does not start the Next.js server.",
613
+ tocSubDashboardTour: "Guided tour",
614
+ tocSubReportingTour: "Reporting tour",
615
+ tocSubDashboardColumnHints: "Three-column guide",
616
+ dashboardColumnHintsBlockTitle: "Three-column guide on the dashboard",
617
+ dashboardColumnHintsBlockIntro:
618
+ "If you removed the strip under the dashboard header (X button), restore it here. This preference is stored in the browser for this site.",
619
+ dashboardColumnHintsRestoreBtn: "Show three-column guide again",
620
+ dashboardColumnHintsRestoreDone: "Preference reset. Open the dashboard to see the strip.",
621
+ tagsProjectsTabsAriaLabel: "Tags column sections",
622
+ tagsProjectsTabGlobal: "Global tags",
623
+ tagsProjectsTabProjects: "Projects & linked tags",
624
+ tocSubSessionDurationAlert: "Session duration alert",
625
+ dashboardSessionDurationAlertHours: "Session duration alert (hours)",
626
+ dashboardSessionDurationAlertHoursDesc:
627
+ "Wall-clock session duration in the dashboard sidebar: when it reaches this many hours or more, the value is shown in red with a slow blink. Default: 24. Range: 1–8760.",
628
+ dashboardTourBlockTitle: "Dashboard guided tour",
629
+ dashboardTourBlockIntro:
630
+ "Five short steps explain sessions, tasks, tags, and shortcuts. You can reopen the tour anytime from here.",
631
+ dashboardTourReplayLinkLabel: "Open dashboard and start tour",
632
+ reportingTourBlockTitle: "Reporting guided tour",
633
+ reportingTourBlockIntro:
634
+ "Filters, KPIs, charts, and tag/project splits on the Reporting page. You can reopen this walkthrough anytime.",
635
+ reportingTourReplayLinkLabel: "Open Reporting and start tour",
636
+ enabled: "Enable activity collection",
637
+ enabledDesc: "Global switch for activity collection.",
638
+ autoStart: "Auto-start",
639
+ autoStartDesc: "Start collection when the Kronosys process starts.",
640
+ sectionSchedule: "Work Schedule",
641
+ scheduleEnabled: "Enable automatic schedule",
642
+ scheduleEnabledDesc: "Automatically start and stop tracking sessions based on your working hours.",
643
+ scheduleDays: "Active days",
644
+ scheduleDaysDesc: "Days of the week when auto-tracking is active.",
645
+ scheduleStartTime: "Start time",
646
+ scheduleEndTime: "End time",
647
+ timePickerPopoverTimeLabel: "Time (24 h)",
648
+ timePickerPopoverHourAria: "Hour (24 h)",
649
+ timePickerPopoverMinuteAria: "Minutes",
650
+ scheduleCreateDailySession: "Create daily session",
651
+ scheduleCreateDailySessionDesc: "Automatically create a new session at the schedule start time for each active day.",
652
+ scheduleTransferTasks: "Transfer active tasks",
653
+ scheduleTransferTasksDesc: "Automatically transfer active tasks from the previous session into the new session.",
654
+ schedulePauseTasks: "Pause tasks on stop",
655
+ schedulePauseTasksDesc: "Automatically pause active tasks when the work schedule ends.",
656
+ sectionPlannedSessions: "Specific Planned Sessions",
657
+ plannedSessionsIntro: "Add specific recurring sessions. These take precedence over the general work schedule during their time block.",
658
+ plannedSessionAdd: "Add planned session",
659
+ plannedSessionName: "Session name",
660
+ plannedSessionTags: "Tags (comma-separated)",
661
+ plannedSessionProject: "Project",
662
+ plannedSessionRemove: "Remove this session",
663
+ showWelcome: "Welcome screen",
664
+ showWelcomeDesc: "Show welcome until dismissed.",
665
+ anonymizePaths: "Anonymize paths",
666
+ anonymizePathsDesc: "Hash file paths before writing events.",
667
+ flushInterval: "Flush interval (seconds)",
668
+ flushIntervalDesc: "How often buffered events are written to storage (5–3600).",
669
+ heartbeatInterval: "Heartbeat interval (seconds)",
670
+ heartbeatIntervalDesc: "Minimum time between heartbeat events (30–86400).",
671
+ maxBuffered: "Max buffered events",
672
+ maxBufferedDesc: "Events kept in memory before trimming (100–100000).",
673
+ historyPath: "History storage path",
674
+ historyPathDesc: "Leave empty for the default application data directory. ~ is your home directory.",
675
+ historyPartition: "History file partition",
676
+ historyPartitionDesc: "How session files are split on disk.",
677
+ localPersistenceDriver: "Local session storage",
678
+ localPersistenceDriverDesc:
679
+ "JSON keeps the legacy partitioned files. SQLite stores sessions in a single database file in the same folder; existing JSON is imported once. MongoDB mirror (if enabled) is unchanged. Restart the process after changing this.",
680
+ persistenceDriverJson: "JSON files",
681
+ persistenceDriverSqlite: "SQLite",
682
+ localPersistenceReloadHint: "After changing the driver, restart the Kronosys process so the new setting is applied.",
683
+ partitionDaily: "Daily",
684
+ partitionWeekly: "Weekly",
685
+ partitionMonthly: "Monthly",
686
+ sessionStartMode: "When tracking starts",
687
+ sessionStartModeDesc: "Continue previous session or always start fresh.",
688
+ modeContinue: "Continue previous session",
689
+ modeNew: "Always new session",
690
+ exportFormat: "Default export format",
691
+ exportFormatDesc: "Used for session history exports.",
692
+ fmtJson: "JSON",
693
+ fmtCsv: "CSV",
694
+ fmtJira: "Jira table",
695
+ fmtSap: "SAP",
696
+ csvDelimiter: "CSV delimiter",
697
+ csvDelimiterDesc: "Single character, e.g. , or ;",
698
+ autoGitSync: "Auto Git sync",
699
+ autoGitSyncDesc:
700
+ "Optional: after each local save, commit and push the history folder to your remote. Session list still loads from local JSON only.",
701
+ gitRemoteUrl: "Git remote URL",
702
+ gitRemoteUrlDesc: "Required if auto sync is enabled.",
703
+ tocSubGitIdentity: "Git author (dashboard)",
704
+ gitIdentitySubheading: "Git author shown in the dashboard",
705
+ gitIdentityIntro:
706
+ "Stored locally with your Kronosys data (SQLite). Shown in the dashboard header next to workspace paths — this does not run git config on your machine.",
707
+ gitIdentityNameLabel: "Display name",
708
+ gitIdentityNameDesc: "Like git config user.name (how you want to be credited).",
709
+ gitIdentityEmailLabel: "Email",
710
+ gitIdentityEmailDesc: "Like git config user.email (for display only here).",
711
+ gitIdentityLoginLabel: "Forge username",
712
+ gitIdentityLoginDesc: "Optional: GitHub, GitLab, or other host login (not the same as the display name).",
713
+ gitIdentitySave: "Save Git author",
714
+ gitIdentitySaving: "Saving…",
715
+ gitIdentitySavedFlash: "Git author saved.",
716
+ glabRemoteSuggest:
717
+ "GitLab CLI (glab) is available and a token is configured: you can create a private remote named kronosys-sessions and enable auto sync in one step.",
718
+ glabRemoteCreate: "Create GitLab repo with glab",
719
+ glabRemoteCreating: "Creating repository…",
720
+ gitlabToken: "GitLab token",
721
+ gitlabTokenDesc:
722
+ "Optional personal access token for glab (private repo creation, issue list). In this dashboard, saving stores the token in local SQLite (not in the JSON state) so issue import can call GitLab; it overrides GITLAB_TOKEN from the server environment when saved. Use Test connection to enable “Import issue from Git”.",
723
+ gitlabTokenSave: "Save token",
724
+ gitlabTokenClear: "Clear stored token",
725
+ gitlabTokenSaveNeedValue: "Paste your token in the field first — saving with an empty field does not keep a secret on this server.",
726
+ gitlabTokenStoredYes:
727
+ "A token is stored in the local secret store; it takes precedence over GITLAB_TOKEN when calling glab.",
728
+ gitlabTokenFromEnvYes: "No stored token; glab uses GITLAB_TOKEN from the server environment.",
729
+ gitlabTokenNone: "No token yet — save one below or set GITLAB_TOKEN for the dashboard server process.",
730
+ gitlabInstanceUrl: "GitLab instance URL",
731
+ gitlabInstanceUrlDesc:
732
+ "Origin only (no /api/v4 path). Leave empty for GitLab.com. For self-managed GitLab, set your instance (e.g. https://gitlab.example.org). You can also set GITLAB_INSTANCE_URL on the server process.",
733
+ gitlabTest401Help:
734
+ "401 usually means the token does not match this host (wrong instance URL), or the token is expired, revoked, or missing the api scope.",
735
+ gitlabTestConnection: "Test GitLab connection",
736
+ gitlabTestConnectionAria: "Test GitLab API token",
737
+ gitlabTestRunning: "Testing GitLab…",
738
+ gitlabTestOk: "GitLab API responded successfully. Issue import is enabled in the task column.",
739
+ gitlabTestFail: "GitLab API test failed. Check the token, the instance URL field above, and your network.",
740
+ gitlabTestNoToken:
741
+ "No token to test: paste a token in the field, save it, or ensure GITLAB_TOKEN is available to this dashboard process when using the environment token.",
742
+ gitlabTestErrorGeneric: "Could not run the GitLab connection test.",
743
+ gitlabApiVerifiedYes: "GitLab API: verified — task issue import is available.",
744
+ gitlabApiVerifiedNo: "GitLab API: not verified — run Test connection to enable task issue import.",
745
+ gitlabTestPasteStoredHint:
746
+ "To test a token already saved locally, paste it temporarily in the field above (this dashboard cannot read the secret back from storage).",
747
+ historyLocalFirstHint:
748
+ "Session history is read from local JSON files or SQLite (see Local session storage). Git auto-sync pushes the folder after saves when enabled. MongoDB is updated only when you push sessions from the dashboard or use Resync in settings.",
749
+ mongoEnabled: "MongoDB integration",
750
+ mongoEnabledDesc:
751
+ "When enabled, you can push individual sessions to MongoDB from the dashboard (and bulk-resync in settings). Nothing is sent automatically on each save. The dashboard still reads local storage only (JSON or SQLite).",
752
+ mongoDatabase: "MongoDB database",
753
+ mongoDatabaseDesc: "Database name (letters, digits, underscore, hyphen).",
754
+ mongoCollection: "MongoDB collection",
755
+ mongoCollectionDesc: "Collection name (one document per session).",
756
+ sectionMongoConnection: "MongoDB connection",
757
+ mongoConnectionIntro:
758
+ "Build mongodb://user:pass@host:port/?authSource=… from the fields below, or set a full URI in Advanced. A stored full URI takes precedence. Main Save also applies host/port/user/auth and stores password or manual URI when those fields are not empty.",
759
+ mongoHost: "Host",
760
+ mongoHostDesc: "Hostname or IP (e.g. 127.0.0.1).",
761
+ mongoPort: "Port",
762
+ mongoPortDesc: "TCP port (default 27017).",
763
+ mongoUser: "Username",
764
+ mongoUserDesc: "Leave empty for no authentication. If set, a password is required (stored in the secret store).",
765
+ mongoPassword: "Password",
766
+ mongoPasswordDesc:
767
+ "Stored in the local secret store only. Use Save password or the main Save button when the field is not empty.",
768
+ mongoPasswordSave: "Save password",
769
+ mongoPasswordClear: "Clear stored password",
770
+ mongoPasswordConfiguredYes: "A password is stored.",
771
+ mongoPasswordConfiguredNo: "No password stored.",
772
+ mongoAuthSource: "authSource",
773
+ mongoAuthSourceDesc: "Database for authentication (often admin).",
774
+ mongoManualUri: "Full URI (advanced)",
775
+ mongoManualUriDesc:
776
+ "If set, this URI is used instead of host/user/password. Stored in the secret store. Clear to use the built connection again.",
777
+ mongoUri: "Connection URI",
778
+ mongoUriDesc: "mongodb:// or mongodb+srv:// — main Save stores this when not empty.",
779
+ mongoUriSave: "Save URI",
780
+ mongoUriClear: "Clear stored URI",
781
+ mongoUriConfiguredYes: "A full connection URI is stored (advanced).",
782
+ mongoUriConfiguredNo: "No full URI stored; built connection is used when possible.",
783
+ mongoRemoteStatus: "MongoDB status",
784
+ mongoStatusConnected: "Connected",
785
+ mongoStatusFailed: "Failed or misconfigured",
786
+ mongoStatusPending: "Checking…",
787
+ mongoConnectionResolvableYes: "Connection parameters are sufficient.",
788
+ mongoConnectionResolvableNo: "Incomplete (e.g. set password if username is filled).",
789
+ mongoTestConnection: "Test connection",
790
+ mongoTestConnectionAria: "Test MongoDB connection",
791
+ mongoTestRunning: "Testing connection…",
792
+ mongoTestOk: "Connection test succeeded (ping on the configured database).",
793
+ mongoTestFail: "Connection test failed. Check host, port, credentials, URI, and network.",
794
+ mongoTestDisabled: "Enable the MongoDB mirror above to run a connection test.",
795
+ mongoTestErrorGeneric: "Could not run the connection test via the local API.",
796
+ mongoTestUsesSavedConfigHint:
797
+ "Host, port, database, collection, and user below are used for the test even if you have not clicked Save. A stored full URI or password (via the dedicated buttons) always comes from the local secret store.",
798
+ mongoSyncSectionTitle: "Local vs MongoDB",
799
+ mongoResyncButton: "Resync all sessions to MongoDB",
800
+ mongoResyncAriaLabel: "Resync all local sessions to the MongoDB mirror",
801
+ mongoResyncConfirm:
802
+ "Upsert every local session snapshot into MongoDB? This can take a moment if you have many sessions.",
803
+ mongoResyncRunning: "Resyncing…",
804
+ mongoResyncDone: "Resync finished: {upserted} sessions written, {failed} failed.",
805
+ mongoResyncHint:
806
+ "Upserts every local session into MongoDB and updates push metadata in JSON. Extra documents already in MongoDB are not deleted.",
807
+ mongoResyncDisabled: "Enable the MongoDB mirror in settings before resyncing.",
808
+ mongoResyncUnsupported: "This storage backend does not support Mongo resync.",
809
+ mongoResyncErrorGeneric: "Could not run the resync action.",
810
+ mongoResyncErrorDetail: "Resync failed: {detail}",
811
+ workspaceFoldersLabel: "Workspace roots",
812
+ workspaceFoldersEmpty: "No workspace root is configured for this dashboard.",
813
+ localApiPort: "Local API port",
814
+ localApiPortDesc: "Loopback HTTP API for this dashboard (127.0.0.1 only).",
815
+ dashboardWebUrl: "Dashboard URL (display)",
816
+ dashboardWebUrlDesc:
817
+ "Suggested URL for opening the dashboard in a browser (e.g. bookmarks). Use a loopback URL (localhost, 127.0.0.1, [::1]) or a hostname in /etc/hosts that resolves to loopback (e.g. kronosys).",
818
+ dashboardDisplayTimeZone: "Display time zone",
819
+ dashboardDisplayTimeZoneDesc:
820
+ "Used for session dates on the dashboard, task timestamps, and reporting day buckets. Pick a suggestion or type any IANA time zone (e.g. Europe/Brussels). Default is Eastern Time (America/Toronto).",
821
+ dashboardClockFormat: "Clock format",
822
+ dashboardClockFormatDesc:
823
+ "How times are shown on the dashboard (task start/end, past-task date preview) and in schedule time previews. Dates are unchanged.",
824
+ dashboardClock24hOption: "24-hour",
825
+ dashboardClock12hOption: "12-hour (AM/PM)",
826
+ invalidDashboardTimeZone: "Unrecognized time zone. Enter a valid IANA name (e.g. America/Toronto).",
827
+ dialogOkBtn: "OK",
828
+ dialogCancelBtn: "Cancel",
829
+ dialogConfirmBtn: "Confirm",
830
+ scrollToTopAria: "Back to top",
831
+ licensesPageLink: "Licenses & third-party notices",
832
+ };
833
+
834
+ const fr: SettingsCopy = {
835
+ title: "Paramètres",
836
+ subtitle: "Options Kronosys enregistrées localement sur cette machine.",
837
+ loading: "Chargement des paramètres…",
838
+ reload: "Recharger depuis le serveur",
839
+ save: "Enregistrer",
840
+ saving: "Enregistrement…",
841
+ savedOk: "Paramètres enregistrés.",
842
+ settingsUnsavedStickyHint: "Modifications non enregistrées.",
843
+ resetToDefaults: "Réinitialiser aux valeurs par défaut",
844
+ resetToDefaultsConfirm:
845
+ "Rétablir toutes les options Kronosys à leurs valeurs d’usine ? Les jetons GitLab et les indicateurs de connexion MongoDB déjà enregistrés dans le stockage sécurisé ne sont pas supprimés ; seuls les champs de configuration affichés sur cette page sont remis à zéro.",
846
+ resettingDefaults: "Réinitialisation…",
847
+ resetDefaultsDone: "Valeurs par défaut appliquées.",
848
+ openIdeSettings: "Ces champs correspondent aux clés de configuration persistées dans le stockage local.",
849
+ tocHeading: "Sur cette page",
850
+ tocNavAriaLabel: "Aller à une section des paramètres",
851
+ tocSearchPlaceholder: "Filtrer le sommaire…",
852
+ tocSearchAriaLabel: "Filtrer les sections affichées dans le sommaire",
853
+ tocSearchNoResults: "Aucun titre de section ne correspond.",
854
+ sectionUsageProfile: "Profil d’utilisation",
855
+ usageProfile: "Profil",
856
+ usageProfileDesc:
857
+ "Développeur : lignes écrites, stats par langage, signaux de codage, instantané LOC et carte Git du dépôt. Gestionnaire : tâches, sessions, KronoFocus et temps seulement — pas de métriques ni d’affichages liés au code source.",
858
+ profileDeveloper: "Développeur",
859
+ profileManager: "Gestionnaire",
860
+ workspaceLocSectionHiddenManager:
861
+ "Ces options ne s’appliquent qu’au profil Développeur (instantané lignes de code dans Rapports).",
862
+ sectionGeneral: "Général",
863
+ sectionPrivacy: "Confidentialité",
864
+ sectionKronoFocus: "KronoFocus (tableau de bord)",
865
+ kronoFocusShowInHeader: "Afficher dans l’en-tête",
866
+ kronoFocusShowInHeaderDesc:
867
+ "Minuteur KronoFocus et contrôles dans la barre du haut du tableau de bord dans le navigateur.",
868
+ kronoFocusShowInTaskOps: "Afficher dans les boutons opérationnels des tâches",
869
+ kronoFocusShowInTaskOpsDesc:
870
+ "Bouton pour lancer le KronoFocus depuis une tâche suivie et option « lancer aussi le KronoFocus » lors de la création d’une tâche.",
871
+ sectionTaskTags: "Tâches et étiquettes",
872
+ taskDefaultTagBucketEnabled: "Étiquette « défaut » pour les tâches sans #",
873
+ taskDefaultTagBucketEnabledDesc:
874
+ "Activé : une tâche sans aucune étiquette explicite reçoit l’étiquette réservée (affichée « défaut »). Désactivé : la liste d’étiquettes reste vide jusqu’à ce que vous en ajoutiez une.",
875
+ dashboardAllowTaskStartTimeEdit:
876
+ "Autoriser la correction de l’heure de début des tâches dans le tableau de bord",
877
+ dashboardAllowTaskStartTimeEditDesc:
878
+ "Affiche des contrôles pour modifier l’heure de début d’une tâche dans la colonne Tâches, pendant son exécution ou après sa fin.",
879
+ dashboardAllowSessionStartTimeEdit:
880
+ "Autoriser la correction de l’heure de début des sessions dans le tableau de bord",
881
+ dashboardAllowSessionStartTimeEditDesc:
882
+ "Affiche des contrôles pour modifier l’heure de début d’une session dans la colonne Sessions, en cours ou dans l’historique.",
883
+ dashboardAllowTaskEndTimeEdit:
884
+ "Autoriser la correction de l’heure de fin des tâches dans le tableau de bord",
885
+ dashboardAllowTaskEndTimeEditDesc:
886
+ "Affiche des contrôles pour modifier l’heure de fin d’une tâche déjà terminée dans la colonne Tâches (l’heure de début se règle à part).",
887
+ dashboardAllowSessionEndTimeEdit:
888
+ "Autoriser la correction de l’heure de fin des sessions dans le tableau de bord",
889
+ dashboardAllowSessionEndTimeEditDesc:
890
+ "Affiche des contrôles pour modifier l’heure de fin d’une session déjà terminée dans la colonne Sessions (l’heure de début se règle à part).",
891
+ sectionCollection: "Collecte et tampons",
892
+ sectionHistory: "Historique des sessions",
893
+ sectionDangerZone: "Zone de danger",
894
+ dangerClearHistoryTitle: "Effacer toutes les données locales du tableau de bord",
895
+ dangerClearHistoryBodyIntro: "Supprime définitivement, dans le stockage local de ce tableau de bord :",
896
+ dangerClearHistoryBodyBullets: [
897
+ "Toutes les sessions (vue en cours, liste principale et archives) ainsi que la session consultée",
898
+ "Toute la métadonnée étiquettes / projets : raccourcis épinglés, étiquettes masquées des pastilles, descriptions, listes de suggestions connues",
899
+ "L’identité Git enregistrée ici (nom affiché, courriel, identifiant forge) et les données de la carte statistiques Git",
900
+ "L’instantané lignes de code du workspace mis en cache pour Rapports (profil Développeur)",
901
+ "La préférence locale « ne plus demander confirmation d’archivage »",
902
+ "La langue du tableau de bord mémorisée dans le navigateur et le marqueur de choix explicite (vous choisirez à nouveau anglais ou français avant la visite guidée)",
903
+ ],
904
+ dangerClearHistoryBodyAfterList1:
905
+ "Ensuite, la visite guidée d’accueil sera reproposée sur le tableau de bord et l’option « écran d’accueil au démarrage » est réactivée dans les paramètres.",
906
+ dangerClearHistoryBodyAfterList2: "Action irréversible.",
907
+ dangerClearHistoryButton: "Tout effacer…",
908
+ dangerClearHistoryConfirm:
909
+ "Vous effacez tout ce qui est décrit ci-dessus dans la zone de danger (sessions, métadonnées étiquettes/projets, identité Git dans ce stockage, etc.). Poursuivre ?",
910
+ dangerClearHistoryConfirmPhrase: "EFFACER",
911
+ dangerClearHistoryTypeInstruction:
912
+ "Pour activer « Confirmer », saisissez exactement {phrase} ci-dessous (toutes majuscules, sans espaces).",
913
+ dangerClearHistoryTypeFieldLabel: "Mot de confirmation",
914
+ dangerClearHistoryTypeInputAria:
915
+ "Saisir le mot de confirmation pour autoriser l’effacement complet décrit ci-dessus (sessions, métadonnées, identité Git, etc.)",
916
+ dangerClearHistoryBackupIntro:
917
+ "Avant de confirmer, vous pouvez télécharger une copie locale (les mêmes données que le tableau de bord sur cette machine) :",
918
+ dangerClearHistoryBackupJson: "JSON — instantané complet d’état",
919
+ dangerClearHistoryBackupJsonHint:
920
+ "Charge utile Kronosys entière dans un seul fichier (sessions y compris la session active `current`, tâches, métadonnées étiquettes/projets, identité Git, `cfg`, instantané statistiques Git, instantané lignes de code du workspace, etc.).",
921
+ dangerClearHistoryBackupCsvBlockTitle: "CSV — plusieurs tableaux (un téléchargement par lien)",
922
+ dangerClearHistoryBackupCsvBlockHint:
923
+ "Réunis, ces fichiers reflètent ce que l’effacement de la zone de danger supprime : sessions (avec une colonne JSON complète par ligne), chaque tâche et sous-tâche, listes et descriptions d’étiquettes/projets, identité Git, ainsi que la configuration et les blocs JSON (`cfg`, stats Git, instantané lignes de code, session inspectée, etc.).",
924
+ dangerClearHistoryBackupCsvZip: "CSV — tous les tableaux (ZIP)",
925
+ dangerClearHistoryBackupCsvZipHint: "Un seul téléchargement contenant les huit fichiers CSV en UTF-8.",
926
+ dangerClearHistoryBackupCsvSeparateTitle: "Fichiers séparés (optionnel)",
927
+ dangerClearHistoryBackupCsvSessions: "Sessions — indicateurs étendus + JSON de session complet",
928
+ dangerClearHistoryBackupCsvTasks: "Tâches — une ligne par tâche + JSON de tâche complet",
929
+ dangerClearHistoryBackupCsvSubtasks: "Sous-tâches — une ligne par élément de liste + JSON",
930
+ dangerClearHistoryBackupCsvRegistry: "Registre étiquettes / projets — listes connues, épinglées, masquées",
931
+ dangerClearHistoryBackupCsvTagDesc: "Descriptions d’étiquettes",
932
+ dangerClearHistoryBackupCsvProjectDesc: "Descriptions de projets",
933
+ dangerClearHistoryBackupCsvGitId: "Identité Git (enregistrée dans ce stockage)",
934
+ dangerClearHistoryBackupCsvStoreBlobs: "Configuration et instantanés — `cfg`, stats Git, LOC workspace, préférences d’affichage",
935
+ dangerClearHistoryBackupSqlite: "SQLite — fichier de base de données",
936
+ dangerClearHistoryBackupSqliteHint:
937
+ "Fichier kronosys.sqlite après pointage WAL (restauration en remplaçant le fichier à l’arrêt de l’application).",
938
+ sectionArchivedSessions: "Sessions archivées",
939
+ archivedSessionsIntro:
940
+ "Sessions retirées de la liste principale du tableau de bord, triées par enregistrement le plus récent. Restaurer les réintègre dans la colonne Sessions.",
941
+ archivesPaginationPrev: "Page précédente",
942
+ archivesPaginationNext: "Page suivante",
943
+ archivesPaginationNavAria: "Pagination des sessions archivées",
944
+ archivesPaginationRange: "{from}–{to} sur {total}",
945
+ sectionExport: "Export par défaut",
946
+ sectionGit: "Synchronisation Git",
947
+ sectionMongo: "Miroir MongoDB",
948
+ sectionWeb: "Tableau de bord et API",
949
+ devDataBlockTitle: "Mode développement (coffre local)",
950
+ devDataIntro:
951
+ "Lorsque le serveur de développement Next.js est utilisé (`next dev`), SQLite et l’état local vont par défaut dans un dossier distinct (`…/v4-dev`) de l’instance de production (`next start`, `…/v4`) afin d’éviter d’écraser vos vraies données. Enregistrez avec le bouton **Enregistrer** en bas de page, comme les autres paramètres.",
952
+ devDataUseProdLabel: "Utiliser le même répertoire de données qu’en production (v4)",
953
+ devDataUseProdDesc:
954
+ "Désactivé (défaut) : le mode dev utilise un répertoire isolé `v4-dev`. Activé : le mode dev lit et écrit le chemin `v4` comme une exécution packagée ou `next start`. Après modification, redémarrez le serveur de dev pour ouvrir le bon fichier SQLite.",
955
+ devDataActivePath: "Répertoire de données utilisé (ce processus)",
956
+ devDataPreferredPath: "S’appliquerait au prochain redémarrage",
957
+ devDataProdPath: "Répertoire production par défaut (v4)",
958
+ devDataPrefsFile: "Fichier de préférence sur le disque",
959
+ devDataTraceOverride:
960
+ "Le serveur a été lancé avec TRACE_DATA_DIR ; ce chemin est utilisé et ce commutateur est désactivé.",
961
+ devDataEnvOverride:
962
+ "La variable d’environnement KRONOSYS_DEV_USE_PROD_DATA est définie ; le mode dev utilise le chemin v4 de production et ce commutateur est désactivé.",
963
+ devDataRestartHint: "La préférence enregistrée ne correspond plus à la base ouverte. Redémarrez le serveur `next dev` pour l’appliquer.",
964
+ devDataHiddenNotDev: "Ce bloc s’affiche seulement lorsque le tableau de bord est servi en mode développement (`next dev`).",
965
+ sectionWorkspaceLoc: "Rapports — instantané lignes de code",
966
+ sectionTagsProjects: "Étiquettes et projets enregistrés",
967
+ tagsProjectsIntro:
968
+ "Gérez à part les étiquettes globales, les projets enregistrés et les étiquettes liées regroupées par projet. Les mêmes contrôles sont disponibles dans la colonne de droite du tableau de bord. Ces actions ne réécrivent pas en masse les tâches ni les fichiers de session.",
969
+ tagsProjectsHelpAria: "Aide : impact des changements d’étiquettes et de projets",
970
+ tagsProjectsHelpBody:
971
+ "Cette page comporte trois zones : étiquettes globales (sans projet), projets enregistrés, puis étiquettes liées regroupées par projet.\n\nMasquer (icône œil barré) : l’étiquette disparaît des pastilles de suggestion ; les tâches ne sont pas modifiées.\n\nSupprimer définitivement (icône corbeille) : retire l’étiquette des listes épinglées et masquées et efface sa description ; les tâches ne sont pas modifiées.\n\nIcônes d’épingle : gèrent la liste de raccourcis épinglés.\n\nÉtiquettes liées : dans une tâche, @Projet#code (stocké Projet#code) ; les suggestions ne montrent le code que si le projet de la tâche correspond.\n\nDescriptions : notes locales ; infobulles sur le tableau de bord.\n\nSupprimer un projet (corbeille) : retire le projet enregistré, efface sa description et purge les métadonnées des étiquettes Projet#… associées ; les tâches ne sont pas modifiées.",
972
+ tagsGlobalHeading: "Étiquettes globales (sans projet)",
973
+ tagsGlobalIntro:
974
+ "Raccourcis pour des étiquettes qui ne sont pas liées à un projet précis : elles sont proposées sur toute tâche, avec ou sans @projet.",
975
+ tagsByProjectHeading: "Étiquettes liées à un projet",
976
+ tagsByProjectIntro:
977
+ "Chaque bloc correspond à une clé de projet ; les étiquettes enregistrées sous la forme Projet#code y sont regroupées. Épinglage, masquage et descriptions restent propres à chaque étiquette.",
978
+ tagsByProjectOrphanIntro:
979
+ "Portées Projet#code sans projet correspondant dans la liste enregistrée ci-dessus. Épinglez ou modifiez-les ici, ou ajoutez d’abord le projet à la liste.",
980
+ tagsByProjectOrphanHelpAria: "Aide : étiquettes liées sans projet enregistré correspondant",
981
+ tocSubTagsGlobal: "Étiquettes globales",
982
+ tocSubTagsProjects: "Projets",
983
+ tocSubTagsByProject: "Étiquettes par projet",
984
+ tagsHiddenHeading: "Masquées des raccourcis",
985
+ tagsPinFieldLabel: "Épingler une étiquette globale",
986
+ tagsPinPlaceholder: "ex. bugfix ou deep-work",
987
+ tagsPinScopedFieldLabel: "Épingler une étiquette liée à un projet",
988
+ tagsPinScopedPlaceholder: "ex. 204822-1530 ou ClientABC#204822-1530",
989
+ tagsPinAddBtn: "Épingler",
990
+ tagsTableTagCol: "Étiquette",
991
+ tagsTableActionsCol: "Actions",
992
+ tagBadgePinned: "Épinglée",
993
+ tagPinBtn: "Ajouter l’étiquette aux raccourcis épinglés",
994
+ tagUnpinBtn: "Retirer l’étiquette des raccourcis épinglés",
995
+ tagExcludeBtn: "Masquer l’étiquette des raccourcis de suggestion",
996
+ tagRestoreBtn: "Réafficher l’étiquette dans les raccourcis",
997
+ tagPurgeAriaLabel: "Supprimer définitivement les métadonnées de l’étiquette",
998
+ tagPurgeConfirm:
999
+ "Supprimer définitivement les métadonnées de cette étiquette ? Sa description sera effacée, elle sera désépinglée et masquée des listes du tableau de bord (elle apparaît sous « Masquées des raccourcis » si des tâches y font encore référence). Les tâches ne sont pas modifiées.",
1000
+ tagPurgeHiddenConfirm:
1001
+ "Retirer cette étiquette de la liste masquée et effacer sa description ? Si des tâches l’utilisent encore, elle peut réapparaître dans les raccourcis. Les tâches ne sont pas modifiées.",
1002
+ tagPurgeHiddenAriaLabel: "Supprimer définitivement les métadonnées de cette étiquette masquée",
1003
+ tagUnpinConfirm: "Retirer cette étiquette de la liste épinglée ? Elle peut réapparaître si des tâches l’utilisent encore.",
1004
+ tagExcludeConfirm:
1005
+ "Masquer cette étiquette des raccourcis du tableau de bord ? Les données des tâches et sessions ne sont pas modifiées ; les tâches existantes gardent l’étiquette et les bilans peuvent encore la compter.",
1006
+ projectsHeading: "Projets enregistrés",
1007
+ projectsIntro: "Projets ajoutés via @projet ou le tableau de bord.",
1008
+ projectsHelpAria: "Aide : projets enregistrés",
1009
+ projectsHelpBody:
1010
+ "La suppression (icône corbeille) retire le projet de la liste enregistrée, efface sa description et purge les métadonnées des étiquettes enregistrées sous la forme Projet#… pour ce projet. Les tâches ne sont pas modifiées.",
1011
+ projectsTableProjectCol: "Projet",
1012
+ projectsRemoveBtn: "Supprimer le projet et les métadonnées d’étiquettes liées",
1013
+ projectRemoveConfirm:
1014
+ "Supprimer définitivement les métadonnées de ce projet ? Il sera retiré de la liste enregistrée, sa description effacée, et les données épinglées / masquées / descriptions des étiquettes Projet#… sous ce projet seront supprimées. Les tâches ne sont pas modifiées.",
1015
+ tagDescriptionLabel: "Description (infobulle dans le tableau de bord)",
1016
+ projectDescriptionLabel: "Description (infobulle dans le tableau de bord)",
1017
+ descriptionSaveBtn: "Enregistrer la description",
1018
+ tagStartTrackedTaskBtn: "Démarrer le suivi d’une tâche avec cette étiquette (et ce projet si lié)",
1019
+ tagStartTrackedTaskFromProjectBtn: "Démarrer le suivi d’une tâche avec ce projet",
1020
+ tagStartTaskAutoSessionToast:
1021
+ "Aucune session en cours — démarrage d’une session pour y rattacher cette tâche.",
1022
+ tagStartTaskConflictTitle: "Suivi déjà actif",
1023
+ tagStartTaskConflictMessage:
1024
+ "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.",
1025
+ tagStartTaskConflictPauseBtn: "Mettre les tâches actives en pause",
1026
+ tagStartTaskConflictFinishBtn: "Terminer les tâches actives",
1027
+ tagStartTaskConflictParallelBtn: "Démarrer en parallèle (garder les minuteurs)",
1028
+ tagStartTaskConflictDontShowAgain:
1029
+ "Mémoriser ce choix et ne plus afficher cette boîte (la même action sera appliquée automatiquement la prochaine fois).",
1030
+ tagsEmptyGlobal:
1031
+ "Aucune étiquette globale dans les raccourcis pour l’instant. Épinglez-en une ci-dessus ou utilisez des #tags sur les tâches.",
1032
+ tagsByProjectSectionEmpty:
1033
+ "Aucune étiquette liée à un projet dans les raccourcis pour l’instant. Utilisez @Projet#code sur une tâche ou épinglez un code ci-dessous.",
1034
+ tagsByProjectSubEmpty: "Aucune étiquette liée à ce projet dans les raccourcis pour l’instant.",
1035
+ projectsEmpty: "Aucun projet enregistré pour l’instant. Utilisez @projet sur une tâche ou choisissez un projet sur le tableau de bord.",
1036
+ hiddenTagsEmpty: "Aucune étiquette masquée.",
1037
+ workspaceLocExcludedDirs: "Segments de dossiers exclus",
1038
+ workspaceLocExcludedDirsDesc:
1039
+ "Un nom par ligne (un seul segment de chemin, pas un chemin complet). Si un segment du chemin d’un fichier correspond à une entrée, le fichier est ignoré — pour la liste Git et le parcours disque. Ex. : node_modules, .git, .husky, .venv, dist.",
1040
+ workspaceLocExcludedPatterns: "Motifs de chemins exclus",
1041
+ workspaceLocExcludedPatternsDesc:
1042
+ "Un motif par ligne (syntaxe minimatch : *, ?, **), relatif à la racine du workspace. Ex. : **/*.min.js, generated/**, **/*.gen.ts. Après enregistrement, actualisez l’instantané depuis la page Rapports.",
1043
+ pickStorageFolder: "Choisir un dossier…",
1044
+ hintPortRestart:
1045
+ "Après un changement de port, redémarrez le processus Kronosys pour que l’API écoute sur le nouveau port.",
1046
+ hintDashboardUrl: "URL de référence affichée seulement ; ne démarre pas le serveur Next.js.",
1047
+ tocSubDashboardTour: "Visite guidée",
1048
+ tocSubReportingTour: "Visite Rapports",
1049
+ tocSubDashboardColumnHints: "Aide trois colonnes",
1050
+ dashboardColumnHintsBlockTitle: "Aide « trois colonnes » sur le tableau de bord",
1051
+ dashboardColumnHintsBlockIntro:
1052
+ "Si vous avez masqué le bandeau sous l’en-tête du tableau de bord (bouton X), vous pouvez le réafficher ici. Cette préférence est stockée dans le navigateur pour ce site.",
1053
+ dashboardColumnHintsRestoreBtn: "Réafficher l’aide des trois colonnes",
1054
+ dashboardColumnHintsRestoreDone: "Préférence réinitialisée. Ouvrez le tableau de bord pour voir le bandeau.",
1055
+ tagsProjectsTabsAriaLabel: "Sections de la colonne étiquettes",
1056
+ tagsProjectsTabGlobal: "Étiquettes globales",
1057
+ tagsProjectsTabProjects: "Projets et étiquettes liées",
1058
+ tocSubSessionDurationAlert: "Alerte durée de session",
1059
+ dashboardSessionDurationAlertHours: "Seuil d’alerte durée de session (heures)",
1060
+ dashboardSessionDurationAlertHoursDesc:
1061
+ "Durée murale de session (panneau latéral du tableau de bord) : dès qu’elle atteint ce nombre d’heures (ou plus), la valeur s’affiche en rouge avec un clignotement lent. Défaut : 24. Plage : 1–8760.",
1062
+ dashboardTourBlockTitle: "Visite guidée du tableau de bord",
1063
+ dashboardTourBlockIntro:
1064
+ "Cinq courtes étapes présentent les sessions, les tâches, les étiquettes et les raccourcis. Vous pouvez relancer la visite à tout moment depuis ici.",
1065
+ dashboardTourReplayLinkLabel: "Ouvrir le tableau de bord et lancer la visite",
1066
+ reportingTourBlockTitle: "Visite guidée Rapports",
1067
+ reportingTourBlockIntro:
1068
+ "Filtres, indicateurs, graphiques et ventilation par étiquette ou par projet sur la page Rapports. Vous pouvez relancer cette visite à tout moment.",
1069
+ reportingTourReplayLinkLabel: "Ouvrir Rapports et lancer la visite",
1070
+ enabled: "Activer la collecte d’activité",
1071
+ enabledDesc: "Interrupteur global de la collecte d’activité.",
1072
+ autoStart: "Démarrage automatique",
1073
+ autoStartDesc: "Lancer la collecte au démarrage du processus Kronosys.",
1074
+ sectionSchedule: "Horaire de travail",
1075
+ scheduleEnabled: "Activer l’horaire automatique",
1076
+ scheduleEnabledDesc: "Démarrer et arrêter automatiquement les sessions selon vos heures de travail.",
1077
+ scheduleDays: "Jours actifs",
1078
+ scheduleDaysDesc: "Jours de la semaine où le suivi est actif.",
1079
+ scheduleStartTime: "Heure de début",
1080
+ scheduleEndTime: "Heure de fin",
1081
+ timePickerPopoverTimeLabel: "Heure (24 h)",
1082
+ timePickerPopoverHourAria: "Heure (24 h)",
1083
+ timePickerPopoverMinuteAria: "Minutes",
1084
+ scheduleCreateDailySession: "Créer une session par jour",
1085
+ scheduleCreateDailySessionDesc: "Créer automatiquement une nouvelle session au démarrage de l'horaire pour chaque jour actif.",
1086
+ scheduleTransferTasks: "Transposer les tâches",
1087
+ scheduleTransferTasksDesc: "Transférer automatiquement les tâches actives de la session précédente vers la nouvelle session.",
1088
+ schedulePauseTasks: "Mettre les tâches en pause à l'arrêt",
1089
+ schedulePauseTasksDesc: "Mettre automatiquement en pause les tâches actives lorsque l'horaire de travail se termine.",
1090
+ sectionPlannedSessions: "Sessions Spécifiques Planifiées",
1091
+ plannedSessionsIntro: "Ajoutez des sessions récurrentes spécifiques. Celles-ci ont priorité sur l'horaire de travail général pendant leur plage horaire.",
1092
+ plannedSessionAdd: "Ajouter une session planifiée",
1093
+ plannedSessionName: "Nom de la session",
1094
+ plannedSessionTags: "Étiquettes (séparées par des virgules)",
1095
+ plannedSessionProject: "Projet",
1096
+ plannedSessionRemove: "Supprimer cette session",
1097
+ showWelcome: "Écran d’accueil",
1098
+ showWelcomeDesc: "Afficher l’accueil tant qu’il n’est pas fermé.",
1099
+ anonymizePaths: "Anonymiser les chemins",
1100
+ anonymizePathsDesc: "Hacher les chemins de fichiers avant d’écrire les événements.",
1101
+ flushInterval: "Intervalle de vidage (secondes)",
1102
+ flushIntervalDesc: "Fréquence d’écriture du tampon vers le stockage (5–3600).",
1103
+ heartbeatInterval: "Intervalle des battements (secondes)",
1104
+ heartbeatIntervalDesc: "Temps minimal entre deux événements « heartbeat » (30–86400).",
1105
+ maxBuffered: "Événements tampon max",
1106
+ maxBufferedDesc: "Événements en mémoire avant réduction (100–100000).",
1107
+ historyPath: "Chemin du stockage d’historique",
1108
+ historyPathDesc: "Vide = répertoire de données applicatif par défaut. ~ désigne le dossier personnel.",
1109
+ historyPartition: "Partition des fichiers d’historique",
1110
+ historyPartitionDesc: "Découpage des fichiers de sessions sur le disque.",
1111
+ localPersistenceDriver: "Stockage local des sessions",
1112
+ localPersistenceDriverDesc:
1113
+ "JSON conserve l’historique en fichiers partitionnés. SQLite enregistre les sessions dans un fichier unique dans le même dossier ; les JSON existants sont importés une fois. Le miroir MongoDB (s’il est activé) reste inchangé. Redémarrez le processus après modification.",
1114
+ persistenceDriverJson: "Fichiers JSON",
1115
+ persistenceDriverSqlite: "SQLite",
1116
+ localPersistenceReloadHint:
1117
+ "Après un changement de moteur, redémarrez le processus Kronosys pour appliquer le réglage.",
1118
+ partitionDaily: "Quotidien",
1119
+ partitionWeekly: "Hebdomadaire",
1120
+ partitionMonthly: "Mensuel",
1121
+ sessionStartMode: "Au démarrage du suivi",
1122
+ sessionStartModeDesc: "Reprendre la session précédente ou toujours repartir à neuf.",
1123
+ modeContinue: "Poursuivre la session précédente",
1124
+ modeNew: "Toujours une nouvelle session",
1125
+ exportFormat: "Format d’export par défaut",
1126
+ exportFormatDesc: "Utilisé pour les exports d’historique de sessions.",
1127
+ fmtJson: "JSON",
1128
+ fmtCsv: "CSV",
1129
+ fmtJira: "Table Jira",
1130
+ fmtSap: "SAP",
1131
+ csvDelimiter: "Séparateur CSV",
1132
+ csvDelimiterDesc: "Un seul caractère, ex. , ou ;",
1133
+ autoGitSync: "Sync Git automatique",
1134
+ autoGitSyncDesc:
1135
+ "Optionnel : après chaque sauvegarde locale, valider et pousser le dossier d’historique vers le dépôt distant. La liste des sessions reste lue depuis les fichiers JSON locaux.",
1136
+ gitRemoteUrl: "URL du dépôt Git distant",
1137
+ gitRemoteUrlDesc: "Requis si la sync automatique est activée.",
1138
+ tocSubGitIdentity: "Auteur Git (tableau de bord)",
1139
+ gitIdentitySubheading: "Auteur Git affiché dans le tableau de bord",
1140
+ gitIdentityIntro:
1141
+ "Enregistré localement avec vos données Kronosys (SQLite). Affiché sous le titre du tableau de bord à côté des chemins du workspace — cela n’exécute pas git config sur votre machine.",
1142
+ gitIdentityNameLabel: "Nom affiché",
1143
+ gitIdentityNameDesc: "Équivalent à git config user.name (crédit souhaité).",
1144
+ gitIdentityEmailLabel: "Courriel",
1145
+ gitIdentityEmailDesc: "Équivalent à git config user.email (affichage seulement ici).",
1146
+ gitIdentityLoginLabel: "Identifiant sur la forge",
1147
+ gitIdentityLoginDesc: "Optionnel : compte GitHub, GitLab ou autre hébergeur (distinct du nom affiché).",
1148
+ gitIdentitySave: "Enregistrer l’auteur Git",
1149
+ gitIdentitySaving: "Enregistrement…",
1150
+ gitIdentitySavedFlash: "Auteur Git enregistré.",
1151
+ glabRemoteSuggest:
1152
+ "L’outil glab est disponible et un jeton est configuré : vous pouvez créer un dépôt privé nommé kronosys-sessions et activer la sync automatique en une étape.",
1153
+ glabRemoteCreate: "Créer le dépôt GitLab avec glab",
1154
+ glabRemoteCreating: "Création du dépôt…",
1155
+ gitlabToken: "Jeton GitLab",
1156
+ gitlabTokenDesc:
1157
+ "Jeton d’accès personnel facultatif pour glab (création de dépôt privé, liste des issues). Dans ce tableau de bord, l’enregistrement conserve le jeton dans SQLite local (hors JSON d’état) pour que l’import d’issues appelle GitLab ; il remplace GITLAB_TOKEN de l’environnement du serveur une fois enregistré. Utilisez « Tester la connexion » pour activer « Importer une issue Git ».",
1158
+ gitlabTokenSave: "Enregistrer le jeton",
1159
+ gitlabTokenClear: "Effacer le jeton stocké",
1160
+ gitlabTokenSaveNeedValue:
1161
+ "Collez d’abord votre jeton dans le champ — enregistrer avec un champ vide ne conserve pas de secret sur ce serveur.",
1162
+ gitlabTokenStoredYes:
1163
+ "Un jeton est enregistré dans le coffre de secrets local ; il est prioritaire sur GITLAB_TOKEN pour les appels à glab.",
1164
+ gitlabTokenFromEnvYes: "Aucun jeton enregistré ; glab utilise GITLAB_TOKEN de l’environnement du serveur.",
1165
+ gitlabTokenNone:
1166
+ "Aucun jeton pour l’instant — enregistrez-en un ci-dessous ou définissez GITLAB_TOKEN pour le processus du tableau de bord.",
1167
+ gitlabInstanceUrl: "URL de l’instance GitLab",
1168
+ gitlabInstanceUrlDesc:
1169
+ "Origine seulement (sans chemin /api/v4). Laissez vide pour GitLab.com. Pour une instance auto-hébergée, indiquez son URL (p. ex. https://gitlab.entreprise.com). Vous pouvez aussi définir GITLAB_INSTANCE_URL sur le processus serveur.",
1170
+ gitlabTest401Help:
1171
+ "401 : souvent le jeton ne correspond pas à cet hôte (mauvaise URL d’instance), ou le jeton est expiré/révoqué ou sans portée api.",
1172
+ gitlabTestConnection: "Tester la connexion GitLab",
1173
+ gitlabTestConnectionAria: "Tester le jeton d’API GitLab",
1174
+ gitlabTestRunning: "Test GitLab en cours…",
1175
+ gitlabTestOk:
1176
+ "L’API GitLab a répondu correctement. L’import d’issues est activé dans la colonne des tâches.",
1177
+ gitlabTestFail:
1178
+ "Échec du test GitLab. Vérifiez le jeton, l’URL d’instance ci-dessus et le réseau.",
1179
+ gitlabTestNoToken:
1180
+ "Aucun jeton à tester : collez un jeton dans le champ, enregistrez-le, ou assurez-vous que GITLAB_TOKEN est disponible pour ce processus lorsque vous utilisez le jeton d’environnement.",
1181
+ gitlabTestErrorGeneric: "Impossible d’exécuter le test de connexion GitLab.",
1182
+ gitlabApiVerifiedYes: "API GitLab : vérifiée — l’import d’issues dans les tâches est disponible.",
1183
+ gitlabApiVerifiedNo:
1184
+ "API GitLab : non vérifiée — lancez « Tester la connexion » pour activer l’import d’issues dans les tâches.",
1185
+ gitlabTestPasteStoredHint:
1186
+ "Pour tester un jeton déjà enregistré localement, collez-le temporairement dans le champ ci-dessus (ce tableau de bord ne peut pas relire le secret depuis le stockage).",
1187
+ historyLocalFirstHint:
1188
+ "L’historique des sessions est lu depuis les fichiers JSON locaux ou SQLite (voir Stockage local des sessions). La sync Git automatique pousse le dossier après les sauvegardes si elle est activée. MongoDB n’est mis à jour que lorsque l’envoi est déclenché depuis le tableau de bord ou via Resynchroniser dans les paramètres.",
1189
+ mongoEnabled: "Intégration MongoDB",
1190
+ mongoEnabledDesc:
1191
+ "Si activé, vous pouvez envoyer chaque session vers MongoDB depuis le tableau de bord (et tout resynchroniser dans les paramètres). Rien n’est envoyé automatiquement à chaque sauvegarde locale. Le tableau de bord lit toujours le stockage local (JSON ou SQLite).",
1192
+ mongoDatabase: "Base MongoDB",
1193
+ mongoDatabaseDesc: "Nom de la base (lettres, chiffres, tiret, souligné).",
1194
+ mongoCollection: "Collection MongoDB",
1195
+ mongoCollectionDesc: "Nom de la collection (un document par session).",
1196
+ sectionMongoConnection: "Connexion MongoDB",
1197
+ mongoConnectionIntro:
1198
+ "Construire mongodb://utilisateur:motdepasse@hôte:port/?authSource=… avec les champs ci-dessous, ou définir une URI complète en mode avancé. Une URI complète enregistrée est prioritaire. Le bouton Enregistrer en haut applique aussi hôte/port/utilisateur/authSource et enregistre le mot de passe ou l’URI manuelle si les champs sont remplis.",
1199
+ mongoHost: "Hôte",
1200
+ mongoHostDesc: "Nom d’hôte ou adresse IP (ex. 127.0.0.1).",
1201
+ mongoPort: "Port",
1202
+ mongoPortDesc: "Port TCP (défaut 27017).",
1203
+ mongoUser: "Utilisateur",
1204
+ mongoUserDesc: "Vide = sans authentification. Si renseigné, un mot de passe est requis (stocké dans le coffre de secrets).",
1205
+ mongoPassword: "Mot de passe",
1206
+ mongoPasswordDesc:
1207
+ "Stocké uniquement dans le coffre de secrets local. Utilisez Enregistrer le mot de passe ou le bouton Enregistrer en haut si le champ n’est pas vide.",
1208
+ mongoPasswordSave: "Enregistrer le mot de passe",
1209
+ mongoPasswordClear: "Effacer le mot de passe stocké",
1210
+ mongoPasswordConfiguredYes: "Un mot de passe est enregistré.",
1211
+ mongoPasswordConfiguredNo: "Aucun mot de passe enregistré.",
1212
+ mongoAuthSource: "authSource",
1213
+ mongoAuthSourceDesc: "Base d’authentification (souvent admin).",
1214
+ mongoManualUri: "URI complète (avancé)",
1215
+ mongoManualUriDesc:
1216
+ "Si définie, cette URI remplace hôte / utilisateur / mot de passe. Stockée dans le coffre de secrets. Effacer pour revenir à la connexion construite.",
1217
+ mongoUri: "URI de connexion",
1218
+ mongoUriDesc: "mongodb:// ou mongodb+srv:// — le bouton Enregistrer en haut enregistre aussi cette URI si le champ n’est pas vide.",
1219
+ mongoUriSave: "Enregistrer l’URI",
1220
+ mongoUriClear: "Effacer l’URI stockée",
1221
+ mongoUriConfiguredYes: "Une URI complète est enregistrée (mode avancé).",
1222
+ mongoUriConfiguredNo: "Aucune URI complète ; la connexion construite est utilisée si possible.",
1223
+ mongoRemoteStatus: "État MongoDB",
1224
+ mongoStatusConnected: "Connecté",
1225
+ mongoStatusFailed: "Échec ou configuration incomplète",
1226
+ mongoStatusPending: "Vérification…",
1227
+ mongoConnectionResolvableYes: "Paramètres de connexion suffisants.",
1228
+ mongoConnectionResolvableNo: "Incomplet (ex. mot de passe si l’utilisateur est renseigné).",
1229
+ mongoTestConnection: "Tester la connexion",
1230
+ mongoTestConnectionAria: "Tester la connexion MongoDB",
1231
+ mongoTestRunning: "Test de connexion en cours…",
1232
+ mongoTestOk: "Test de connexion réussi (ping sur la base configurée).",
1233
+ mongoTestFail: "Échec du test de connexion. Vérifiez l’hôte, le port, les identifiants, l’URI et le réseau.",
1234
+ mongoTestDisabled: "Activez le miroir MongoDB ci-dessus pour lancer un test de connexion.",
1235
+ mongoTestErrorGeneric: "Impossible d’exécuter le test de connexion via l’API locale.",
1236
+ mongoTestUsesSavedConfigHint:
1237
+ "L’hôte, le port, la base, la collection et l’utilisateur ci-dessous sont pris en compte pour le test même sans cliquer sur Enregistrer. Une URI complète ou un mot de passe enregistré (boutons dédiés) provient toujours du coffre de secrets local.",
1238
+ mongoSyncSectionTitle: "Fichiers locaux et MongoDB",
1239
+ mongoResyncButton: "Resynchroniser toutes les sessions vers MongoDB",
1240
+ mongoResyncAriaLabel: "Resynchroniser toutes les sessions locales vers le miroir MongoDB",
1241
+ mongoResyncConfirm:
1242
+ "Enregistrer chaque session locale dans MongoDB (upsert) ? Cela peut prendre du temps s’il y a beaucoup de sessions.",
1243
+ mongoResyncRunning: "Resynchronisation…",
1244
+ mongoResyncDone: "Resynchronisation terminée : {upserted} sessions écrites, {failed} échecs.",
1245
+ mongoResyncHint:
1246
+ "Écrit toutes les sessions locales dans MongoDB et met à jour les métadonnées d’envoi dans les JSON. Les documents supplémentaires déjà présents dans MongoDB ne sont pas supprimés.",
1247
+ mongoResyncDisabled: "Activez le miroir MongoDB dans les paramètres avant de resynchroniser.",
1248
+ mongoResyncUnsupported: "Ce stockage ne prend pas en charge la resynchronisation MongoDB.",
1249
+ mongoResyncErrorGeneric: "Impossible d’exécuter la resynchronisation.",
1250
+ mongoResyncErrorDetail: "Échec de la resynchronisation : {detail}",
1251
+ workspaceFoldersLabel: "Racines du workspace",
1252
+ workspaceFoldersEmpty: "Aucune racine de workspace n’est configurée pour ce tableau de bord.",
1253
+ localApiPort: "Port de l’API locale",
1254
+ localApiPortDesc: "API HTTP loopback pour ce tableau de bord (127.0.0.1 uniquement).",
1255
+ dashboardWebUrl: "URL du tableau de bord (affichage)",
1256
+ dashboardWebUrlDesc:
1257
+ "URL suggérée pour ouvrir le tableau de bord dans un navigateur (signets, etc.). Utilisez une URL loopback (localhost, 127.0.0.1, [::1]) ou un nom d’hôte dans /etc/hosts résolu vers loopback (ex. kronosys).",
1258
+ dashboardDisplayTimeZone: "Fuseau horaire d’affichage",
1259
+ dashboardDisplayTimeZoneDesc:
1260
+ "Sert aux dates des sessions sur le tableau de bord, aux horodatages des tâches et au regroupement par jour dans les rapports. Choisissez une suggestion ou saisissez un fuseau IANA (ex. Europe/Brussels). Par défaut : heure de l’Est (America/Toronto).",
1261
+ dashboardClockFormat: "Format de l’horloge",
1262
+ dashboardClockFormatDesc:
1263
+ "Affichage des heures sur le tableau de bord (début et fin des tâches, aperçu des dates de tâches passées) et dans les aperçus des sélecteurs d’heure du calendrier. Les dates ne changent pas.",
1264
+ dashboardClock24hOption: "24 heures",
1265
+ dashboardClock12hOption: "12 heures (AM/PM)",
1266
+ invalidDashboardTimeZone: "Fuseau horaire non reconnu. Saisissez un nom IANA valide (ex. America/Toronto).",
1267
+ dialogOkBtn: "OK",
1268
+ dialogCancelBtn: "Annuler",
1269
+ dialogConfirmBtn: "Confirmer",
1270
+ scrollToTopAria: "Retour en haut de la page",
1271
+ licensesPageLink: "Licences et logiciels tiers",
1272
+ };
1273
+
1274
+ export function settingsCopy(lang: Lang): SettingsCopy {
1275
+ return lang === "fr" ? fr : en;
1276
+ }