@butinapp/ui 0.1.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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist/components/badge.d.ts +7 -0
  4. package/dist/components/badge.js +34 -0
  5. package/dist/components/button.d.ts +11 -0
  6. package/dist/components/button.js +30 -0
  7. package/dist/components/card.d.ts +8 -0
  8. package/dist/components/card.js +10 -0
  9. package/dist/components/checkbox.d.ts +3 -0
  10. package/dist/components/checkbox.js +7 -0
  11. package/dist/components/combobox.d.ts +14 -0
  12. package/dist/components/combobox.js +53 -0
  13. package/dist/components/data-table-model.d.ts +40 -0
  14. package/dist/components/data-table-model.js +105 -0
  15. package/dist/components/data-table.d.ts +33 -0
  16. package/dist/components/data-table.js +252 -0
  17. package/dist/components/dialog.d.ts +11 -0
  18. package/dist/components/dialog.js +15 -0
  19. package/dist/components/dropdown-menu.d.ts +7 -0
  20. package/dist/components/dropdown-menu.js +15 -0
  21. package/dist/components/echart.d.ts +5 -0
  22. package/dist/components/echart.js +27 -0
  23. package/dist/components/input.d.ts +3 -0
  24. package/dist/components/input.js +5 -0
  25. package/dist/components/label.d.ts +3 -0
  26. package/dist/components/label.js +5 -0
  27. package/dist/components/progress.d.ts +4 -0
  28. package/dist/components/progress.js +8 -0
  29. package/dist/components/select.d.ts +11 -0
  30. package/dist/components/select.js +5 -0
  31. package/dist/components/separator.d.ts +3 -0
  32. package/dist/components/separator.js +5 -0
  33. package/dist/components/service-icon.d.ts +19 -0
  34. package/dist/components/service-icon.js +49 -0
  35. package/dist/components/sheet.d.ts +10 -0
  36. package/dist/components/sheet.js +11 -0
  37. package/dist/components/skeleton.d.ts +2 -0
  38. package/dist/components/skeleton.js +4 -0
  39. package/dist/components/sparkline.d.ts +7 -0
  40. package/dist/components/sparkline.js +22 -0
  41. package/dist/components/switch.d.ts +3 -0
  42. package/dist/components/switch.js +5 -0
  43. package/dist/components/tabs.d.ts +8 -0
  44. package/dist/components/tabs.js +15 -0
  45. package/dist/components/tooltip.d.ts +6 -0
  46. package/dist/components/tooltip.js +8 -0
  47. package/dist/components/truncated-cell.d.ts +3 -0
  48. package/dist/components/truncated-cell.js +22 -0
  49. package/dist/dashboard.d.ts +12 -0
  50. package/dist/dashboard.js +13 -0
  51. package/dist/features/charts.d.ts +7 -0
  52. package/dist/features/charts.js +4 -0
  53. package/dist/features/dashboard/dashboard-renderer.d.ts +32 -0
  54. package/dist/features/dashboard/dashboard-renderer.js +322 -0
  55. package/dist/features/dashboard/format-role.d.ts +2 -0
  56. package/dist/features/dashboard/format-role.js +26 -0
  57. package/dist/features/dashboard/overview-model.d.ts +59 -0
  58. package/dist/features/dashboard/overview-model.js +170 -0
  59. package/dist/features/dashboard/overview.d.ts +8 -0
  60. package/dist/features/dashboard/overview.js +136 -0
  61. package/dist/features/dashboard/plan-views.d.ts +7 -0
  62. package/dist/features/dashboard/plan-views.js +29 -0
  63. package/dist/features/dashboard/rollup.d.ts +31 -0
  64. package/dist/features/dashboard/rollup.js +45 -0
  65. package/dist/features/dashboard/timeseries-chart.d.ts +11 -0
  66. package/dist/features/dashboard/timeseries-chart.js +191 -0
  67. package/dist/features/dashboard/view-models.d.ts +72 -0
  68. package/dist/features/dashboard/view-models.js +291 -0
  69. package/dist/features/documents/doc-models.d.ts +1 -0
  70. package/dist/features/documents/doc-models.js +17 -0
  71. package/dist/features/documents/open-file-button.d.ts +6 -0
  72. package/dist/features/documents/open-file-button.js +16 -0
  73. package/dist/features/shell/app-shell.d.ts +13 -0
  74. package/dist/features/shell/app-shell.js +22 -0
  75. package/dist/features/shell/conn-state.d.ts +10 -0
  76. package/dist/features/shell/conn-state.js +29 -0
  77. package/dist/features/shell/service-tabs.d.ts +13 -0
  78. package/dist/features/shell/service-tabs.js +20 -0
  79. package/dist/features/shell/sidebar.d.ts +31 -0
  80. package/dist/features/shell/sidebar.js +31 -0
  81. package/dist/features/shell/theme-toggle.d.ts +5 -0
  82. package/dist/features/shell/theme-toggle.js +12 -0
  83. package/dist/i18n/context.d.ts +16 -0
  84. package/dist/i18n/context.js +19 -0
  85. package/dist/i18n/format-context.d.ts +7 -0
  86. package/dist/i18n/format-context.js +6 -0
  87. package/dist/i18n/format.d.ts +10 -0
  88. package/dist/i18n/format.js +31 -0
  89. package/dist/i18n/index.d.ts +9 -0
  90. package/dist/i18n/index.js +8 -0
  91. package/dist/i18n/labels.d.ts +400 -0
  92. package/dist/i18n/labels.js +828 -0
  93. package/dist/i18n/plugin-text.d.ts +4 -0
  94. package/dist/i18n/plugin-text.js +150 -0
  95. package/dist/index.d.ts +6 -0
  96. package/dist/index.js +15 -0
  97. package/dist/lib/echarts-theme.d.ts +38 -0
  98. package/dist/lib/echarts-theme.js +59 -0
  99. package/dist/lib/format.d.ts +4 -0
  100. package/dist/lib/format.js +18 -0
  101. package/dist/lib/monthly-buckets.d.ts +9 -0
  102. package/dist/lib/monthly-buckets.js +32 -0
  103. package/dist/lib/utils.d.ts +2 -0
  104. package/dist/lib/utils.js +3 -0
  105. package/dist/primitives.d.ts +28 -0
  106. package/dist/primitives.js +26 -0
  107. package/dist/shell.d.ts +8 -0
  108. package/dist/shell.js +10 -0
  109. package/dist/theme.css +137 -0
  110. package/dist/types.d.ts +11 -0
  111. package/dist/types.js +6 -0
  112. package/package.json +78 -0
@@ -0,0 +1,828 @@
1
+ export const en = {
2
+ intlLocale: 'en-US',
3
+ headline: 'All your accounts. One place.',
4
+ tagline: 'Your data, brought home.',
5
+ libraryTitle: 'Library',
6
+ librarySubtitle: "Everything you've brought home, gathered in one place.",
7
+ dataHeading: 'Data',
8
+ homeAria: 'Home',
9
+ navManagement: 'Management',
10
+ navOverview: 'Overview',
11
+ navDeveloper: 'Developer',
12
+ logsHeading: 'Logs',
13
+ navSettings: 'Settings',
14
+ devNavBrowser: 'Navigation browser',
15
+ systemHeading: 'System',
16
+ servicesHeading: 'Services',
17
+ searchPlaceholder: 'Search…',
18
+ noServicesMatch: 'No services match',
19
+ sidebarDisabledHint: 'Disabled — re-enable in Management',
20
+ menuLabel: 'Menu',
21
+ tabInstalled: 'Installed',
22
+ tabAvailable: 'Available',
23
+ installAction: 'Install',
24
+ uninstallAction: 'Uninstall',
25
+ uninstallArmed: 'Confirm uninstall',
26
+ uninstallConfirm: 'Uninstall this service? Its stored session, settings, and cached data will be removed. Downloaded files are kept unless you choose to erase them below.',
27
+ uninstallEraseFolder: 'Also delete this service’s data folder (removes downloaded files too)',
28
+ uninstallEraseFolderDocs: (n) => `Also delete this service’s data folder, including ${n.toLocaleString('en-US')} downloaded ${n === 1 ? 'document' : 'documents'}`,
29
+ allInstalled: 'All services installed',
30
+ availableSearchPlaceholder: 'Search services…',
31
+ skipForNow: 'Skip for now',
32
+ finishSetup: 'Finish setup',
33
+ onboardingContinue: 'Continue',
34
+ onboardingSignInTitle: 'Sign in',
35
+ onboardingSignInBlurb: 'Butin opens the service’s login so you can sign in once. Your session stays encrypted on this machine.',
36
+ onboardingSettingsTitle: 'Settings',
37
+ onboardingSettingsBlurb: 'A few details this service needs before its first fetch.',
38
+ onboardingRefreshTitle: 'First fetch',
39
+ onboardingRefreshBlurb: "Pull this service's data into Butin — files are saved separately, via Save everything.",
40
+ actionRetry: 'Try again',
41
+ actionReconnect: 'Reconnect',
42
+ actionEditSettings: 'Edit settings',
43
+ actionOpenDashboard: 'Open dashboard',
44
+ actionOpenDocs: 'Troubleshooting',
45
+ errorDetails: 'Technical details',
46
+ failureMessage: {
47
+ 'session-not-captured': 'The login window closed before Butin captured a session. Sign in again to finish.',
48
+ 'session-expired': 'Your session has expired. Reconnect to refresh it.',
49
+ 'config-missing': 'This service needs a setting filled in before it can fetch.',
50
+ 'config-invalid': 'A setting was rejected. Check the values and try again.',
51
+ 'verification-required': 'The service needs to re-verify your browser. Reconnect to continue.',
52
+ permission: 'The service refused this request. You may not have access to this data.',
53
+ network: 'Butin couldn’t reach the service. Check your connection and try again.',
54
+ 'data-invalid': 'This service returned data Butin couldn’t make sense of. The service may have changed.',
55
+ unknown: 'Something went wrong fetching this data.'
56
+ },
57
+ exportButton: 'Export',
58
+ exportTitle: 'Export data',
59
+ exportDescription: 'Exports your saved dashboard data — the overview and each service’s latest cached tabs — as one JSON file for the Butin viewer. No live connection is made; documents and credentials are not included.',
60
+ exportServices: 'Services',
61
+ exportSelectAll: 'Select all',
62
+ exportNoData: 'no data yet',
63
+ exportEncrypt: 'Encrypt this export',
64
+ exportEncryptHint: 'Only this Butin profile can reopen it.',
65
+ exportPlaintextWarning: 'Plaintext — readable by anyone with the file.',
66
+ exportPlaintextNote: 'Output is plaintext (not encrypted).',
67
+ exportDestination: 'Destination',
68
+ exportDestinationDefault: 'Downloads folder',
69
+ exportChange: 'Change…',
70
+ exportRunning: 'Exporting…',
71
+ exportDone: 'Data exported',
72
+ exportReveal: 'Reveal in folder',
73
+ sessionSaved: 'Session saved',
74
+ sessionSecured: 'Session secured',
75
+ sessionNotCaptured: 'Session not captured',
76
+ sessionCanceled: 'Sign-in canceled — no session captured.',
77
+ sessionCleared: 'Session cleared',
78
+ settingsSaved: 'Settings saved',
79
+ dataSaved: (capability) => `${capability} — data saved`,
80
+ fetchFailed: 'Fetch failed',
81
+ settingsTitle: 'Settings',
82
+ settingsSubtitle: 'Appearance, capture, formatting, and your local data.',
83
+ themeLabel: 'Theme',
84
+ themeHint: 'Match your system, or pin light/dark.',
85
+ themeToggle: 'Toggle light/dark',
86
+ sectionLanguage: 'Language',
87
+ languageHint: 'English or French.',
88
+ sectionDataPrivacy: 'Data & privacy',
89
+ sectionAbout: 'About',
90
+ settingsNavGeneral: 'General',
91
+ settingsNavAdvanced: 'Advanced',
92
+ settingsNavSystem: 'System',
93
+ settingsNavStorage: 'Storage',
94
+ settingsNavBrowserSignin: 'Browser sign-in',
95
+ browserSigninTitle: 'Browser sign-in',
96
+ browserSigninLead: 'Some accounts, personal Google especially, refuse the built-in browser. Sign in once through your own Chrome and Butin keeps the session so your connected services can use it.',
97
+ browserSigninStepsTitle: 'How it works',
98
+ browserSigninStep1: 'Click the button below. Your own Chrome opens on the Google sign-in page.',
99
+ browserSigninStep2: 'Sign in to your account the way you normally would, including any two-step verification.',
100
+ browserSigninStep3: 'Close the Chrome window. Butin brings the session home, and you are set.',
101
+ browserSigninButton: 'Sign in with Chrome',
102
+ browserSigninReopen: 'Open Chrome again',
103
+ browserSigninConnected: 'A browser session is saved.',
104
+ browserSigninNone: 'No browser session saved yet.',
105
+ browserSigninBusy: 'Chrome is open. Sign in there, then close the window to finish.',
106
+ browserSigninSynced: (n) => `Session saved. Brought home ${n} cookie${n === 1 ? '' : 's'}.`,
107
+ browserSigninError: 'Chrome sign-in did not finish. Please try again.',
108
+ browserSigninAdvanced: 'Use a different sign-in URL',
109
+ browserSigninUrlLabel: 'Sign-in URL',
110
+ browserSigninPathLabel: 'Where it is stored',
111
+ browserSigninPathHint: 'A separate Chrome profile Butin created for this. Click the path to open the folder.',
112
+ browserSigninRemoveTitle: 'Remove this saved session',
113
+ browserSigninRemoveHint: 'Deletes the separate Chrome profile, including its saved Google login and cookies, from your machine. Nothing else is touched, and you can sign in again anytime.',
114
+ browserSigninRemove: 'Remove',
115
+ browserSigninRemoveTooltip: 'Delete the saved Chrome profile and its cookies from this machine.',
116
+ settingsLoading: 'Loading…',
117
+ settingsSaveFailed: "Couldn't save your change",
118
+ openFolderFailed: "Couldn't open that folder",
119
+ startPageLabel: 'Start page',
120
+ startPageHint: 'Where Butin opens when you launch it.',
121
+ startPageOverview: 'Overview',
122
+ startPageLast: 'Where I left off',
123
+ sectionSecurity: 'Security',
124
+ idleLockLabel: 'Auto-lock when idle',
125
+ idleLockHint: 'Lock encrypted profiles after this much inactivity.',
126
+ idleLockOff: 'Never',
127
+ lockOnSleepLabel: 'Lock on sleep',
128
+ lockOnSleepHint: 'Lock encrypted profiles when your computer sleeps.',
129
+ cacheWindowLabel: 'Cache window',
130
+ cacheWindowHint: 'How long a fetched response is reused before refetching — spans a refresh-all run.',
131
+ logLevelLabel: 'Log level',
132
+ logLevelHint: 'What gets recorded. Anything below this level is never captured.',
133
+ logRetentionLabel: 'Keep logs',
134
+ logRetentionHint: 'Session only keeps logs in the live view without writing files; a window writes daily files pruned past it.',
135
+ manualCaptureLabel: 'Capture manually',
136
+ manualCaptureHint: 'When sign-in is detected, wait for you to click Capture instead of grabbing the session automatically.',
137
+ paceRequestsLabel: 'Pace requests',
138
+ paceRequestsHint: 'Space requests to each service by a short random delay (100–500ms) so Butin stays a light, steady client instead of bursting. Turn off for the fastest refreshes.',
139
+ devModeSection: 'Developer',
140
+ devModeLabel: 'Developer mode',
141
+ devModeHint: "Show debug tooling — like the raw daily-change ledger — in each service's Settings tab.",
142
+ sectionFormatting: 'Formatting',
143
+ currencyFormatLabel: 'Currency format',
144
+ currencyFormatHint: 'How money is displayed (style only — amounts are unchanged).',
145
+ dateFormatLabel: 'Date format',
146
+ dateFormatHint: 'How dates and times are shown.',
147
+ sectionCurrency: 'Currency',
148
+ baseCurrencyLabel: 'Base currency',
149
+ baseCurrencyHint: 'The currency the Overview totals are shown in. Other currencies are converted into it.',
150
+ exchangeRatesLabel: 'Exchange rates',
151
+ exchangeRatesHint: 'Value of 1 unit of each currency in your base currency. Without a rate, that currency is shown on its own and left out of combined totals.',
152
+ exchangeRatesEmpty: 'Every connected service already reports in your base currency — no rates needed.',
153
+ saveRates: 'Save rates',
154
+ clearDataConfirm: 'Click again to confirm',
155
+ noServices: 'No services yet.',
156
+ sessionLive: 'session active',
157
+ locked: 'locked',
158
+ reportCount: (n) => `${n} ${n === 1 ? 'report' : 'reports'}`,
159
+ allServices: 'All services',
160
+ sessionTitle: 'Session',
161
+ sessionLiveBadge: 'active',
162
+ sessionStoredDesc: 'Session secured (encrypted). Re-capture it to refresh access.',
163
+ sessionEmptyDesc: 'Sign in once in a real browser — Butin saves the session, then syncs your data headless from then on.',
164
+ capturingSession: 'Capturing session…',
165
+ recaptureSession: 'Re-capture session',
166
+ captureSession: 'Capture session',
167
+ clearSession: 'Clear session',
168
+ advancedPaste: 'advanced: paste session',
169
+ hide: 'hide',
170
+ pastePlaceholder: 'paste the full cookie header — your session (must include the auth cookie)',
171
+ save: 'Save',
172
+ fetch: 'Fetch',
173
+ fetching: 'Fetching…',
174
+ completedAt: (when) => `completed ${when}`,
175
+ refresh: 'Refresh',
176
+ refreshThisTab: 'Refresh this tab only',
177
+ refetchAll: 'Refetch all history',
178
+ notLoadedYet: 'not loaded yet',
179
+ refreshedAgo: (relative, absolute) => `refreshed ${relative} · ${absolute}`,
180
+ refreshWarning: 'Refresh failed — showing the last loaded data.',
181
+ connectPrompt: (service) => `Connect ${service} to fetch its first report.`,
182
+ noDataYet: 'No data yet',
183
+ serviceCount: (n) => `${n} ${n === 1 ? 'service' : 'services'}`,
184
+ overviewSpending: 'Spending',
185
+ overviewBalances: 'Balances',
186
+ overviewOthers: 'Others',
187
+ netWorth: 'Net worth',
188
+ itemCount: (n) => `${n} ${n === 1 ? 'item' : 'items'}`,
189
+ lastFetched: (when) => `Fetched ${when}`,
190
+ chartMonthly: 'Monthly',
191
+ chartDaily: 'Daily',
192
+ chartYears: 'Years',
193
+ chartAllYears: 'All years',
194
+ chartEstimated: 'Estimated — no snapshot this day',
195
+ chartMtdEstimate: 'Estimate — month to date',
196
+ noRows: 'No rows.',
197
+ tableSelectAll: (n) => `Select all ${n}`,
198
+ tableColumns: 'Columns',
199
+ tableExport: 'Export',
200
+ tablePerPage: (n) => `${n} / page`,
201
+ tablePageOf: (page, total) => `${page} / ${total}`,
202
+ tableRowCount: (n) => `${n.toLocaleString()} ${n === 1 ? 'item' : 'items'}`,
203
+ tablePrev: 'Prev',
204
+ tableNext: 'Next',
205
+ toggleRowDetails: 'Toggle row details',
206
+ perDayHeading: 'Per day',
207
+ estimatedTag: '(est.)',
208
+ cellCopy: 'Copy',
209
+ cellCopied: 'Copied',
210
+ documentsEmpty: 'No documents found.',
211
+ documentsFolderLabel: 'Saving to',
212
+ documentsChangeFolder: 'Change…',
213
+ downloadSelected: (n) => `Download ${n} selected`,
214
+ downloadAll: 'Download all',
215
+ openFolder: 'Open folder',
216
+ openDocument: 'Open',
217
+ viewDocument: 'View',
218
+ retryFailed: 'Retry failed',
219
+ selectAll: 'select all',
220
+ docDownloaded: 'downloaded',
221
+ docDownloading: 'downloading…',
222
+ docFailed: 'failed',
223
+ downloadDone: (done, skipped) => `${done} downloaded${skipped ? `, ${skipped} already on disk` : ''}`,
224
+ serviceSettingsTitle: 'Settings',
225
+ perServiceConfig: 'Per-service config — stored locally, secrets encrypted.',
226
+ saveSettings: 'Save settings',
227
+ leaveBlank: 'leave blank to keep current',
228
+ noServicesRegistered: 'No services registered.',
229
+ connect: 'Connect',
230
+ reconnect: 'Reconnect',
231
+ extractAll: 'Save everything',
232
+ extractAllRunning: 'Saving…',
233
+ extractAllDone: (tabs, files) => `Saved ${tabs} tabs, ${files} files`,
234
+ test: 'Test',
235
+ enabledLabel: 'Enabled',
236
+ enableToUseHint: 'Off — enable to use',
237
+ refreshData: 'Refresh data',
238
+ extractAllHint: 'Fetches every tab and downloads all available files for this service into a local folder.',
239
+ filterAll: 'All',
240
+ filterEnabled: 'Enabled',
241
+ filterConnected: 'Connected',
242
+ filterUnverified: 'Unverified',
243
+ filterDisconnected: 'Disconnected',
244
+ filterIssues: 'Issues',
245
+ filterDisabled: 'Disabled',
246
+ filterStale: 'Needs refresh',
247
+ testAll: 'Test all',
248
+ testAllCount: (n) => `Test all (${n})`,
249
+ refreshAllCount: (n) => `Refresh all (${n})`,
250
+ lastRefreshed: (rel) => `Refreshed ${rel}`,
251
+ neverRefreshed: 'Never refreshed',
252
+ dismissSummary: 'Dismiss',
253
+ testingProgress: (done, total) => `Testing ${done} of ${total}…`,
254
+ refreshingProgress: (done, total) => `Refreshing ${done} of ${total}…`,
255
+ refreshAll: 'Refresh All',
256
+ category: {
257
+ finance: 'Finance',
258
+ cloud: 'Cloud',
259
+ ai: 'AI',
260
+ devtools: 'Dev tools',
261
+ productivity: 'Productivity',
262
+ rental: 'Rentals',
263
+ other: 'Other'
264
+ },
265
+ serviceDisabledBanner: 'This service is disabled — enable it to fetch data.',
266
+ refreshSummary: (refreshed, needsReconnect) => `${refreshed} refreshed · ${needsReconnect} need reconnect`,
267
+ needsReconnect: 'Reconnect',
268
+ settingsConnection: 'Connection',
269
+ settingsConfiguration: 'Configuration',
270
+ settingsService: 'Service',
271
+ settingsData: 'Data',
272
+ openDashboard: 'Open dashboard',
273
+ openInButin: 'Open in Butin',
274
+ refreshAllTabs: 'Refresh all tabs',
275
+ testPassed: 'connection ok',
276
+ testFailed: 'connection failed',
277
+ enabledHint: 'Disabled services are hidden from the sidebar and Overview.',
278
+ statusConnected: 'connected',
279
+ statusDisconnected: 'disconnected',
280
+ statusUnverified: 'unverified',
281
+ disconnect: 'Disconnect',
282
+ eraseData: 'Erase stored data',
283
+ eraseDataHint: 'Deletes this service’s cached tab data (reports + the documents list) from your machine. Keeps your session and any downloaded files; you can re-fetch anytime.',
284
+ eraseDataDocsKept: (n) => `${n.toLocaleString('en-US')} downloaded ${n === 1 ? 'document is' : 'documents are'} kept — only cached tab data is erased.`,
285
+ dataErased: 'Stored data erased',
286
+ moveToProfile: 'Move to another profile',
287
+ moveToProfileHint: 'Hand this service’s connection and cached data to another profile.',
288
+ moveConfirmTo: (name) => `Confirm move to ${name}`,
289
+ cancel: 'Cancel',
290
+ moveDone: (name) => `Moved to ${name}`,
291
+ outputFolder: 'Output folder',
292
+ never: 'never',
293
+ statRecords: 'Records cached',
294
+ statFiles: 'Files',
295
+ statOnDisk: 'On disk',
296
+ statLastSynced: 'Last synced',
297
+ invCapability: 'Capability',
298
+ invRecords: 'Records',
299
+ invLastFetched: 'Last fetched',
300
+ invHistory: 'History',
301
+ invTrend: 'Trend',
302
+ invView: 'View',
303
+ settingsUnderHood: 'Under the hood',
304
+ underHoodSubtitle: 'how Butin reads this service',
305
+ mechHowConnects: 'How it connects',
306
+ mechAuth: 'Auth method',
307
+ mechTransport: 'Transport',
308
+ mechCookieDomains: 'Cookie domains',
309
+ mechSignIn: 'Sign-in URL',
310
+ mechPlugin: 'Plugin',
311
+ requiresBrowserEngineLabel: 'Browser engine',
312
+ settingsLedgerDebug: 'Ledger (debug)',
313
+ ledgerDebugSubtitle: 'raw daily-change history',
314
+ ledgerLoading: 'Loading…',
315
+ ledgerNoData: 'No ledger recorded yet',
316
+ ledgerDatasetsTitle: 'Datasets',
317
+ ledgerSeriesTitle: 'Series',
318
+ ledgerColRow: 'Row',
319
+ ledgerColFirstSeen: 'First seen',
320
+ ledgerColLastSeen: 'Last seen',
321
+ ledgerColVersions: 'Versions',
322
+ ledgerRows: 'rows',
323
+ ledgerPoints: 'points',
324
+ ledgerDerivedDaily: 'derived daily',
325
+ settingsManage: 'Manage & danger zone',
326
+ profileSwitchTo: (name) => `Switch to ${name}`,
327
+ profileCurrent: 'Current',
328
+ profileActionsAria: (name) => `${name} actions`,
329
+ profileRename: 'Rename',
330
+ profileDuplicate: 'Duplicate',
331
+ profileDuplicateLockedHint: 'Unlock this profile to duplicate it.',
332
+ profileColor: 'Color',
333
+ profileColorAria: (name) => `Color for ${name}`,
334
+ profileManageEncryption: 'Encryption',
335
+ profileDelete: 'Delete',
336
+ profileDeleteConfirm: 'Confirm delete',
337
+ profileNewName: 'New profile name',
338
+ profileAdd: 'Add',
339
+ profileSave: 'Save',
340
+ profileActive: 'Active',
341
+ profileNameAria: 'Profile name',
342
+ profilesDialogTitle: 'Profiles',
343
+ profilesDialogBlurb: 'Each profile is its own isolated workspace — separate logins, settings, and data.',
344
+ encStateOff: 'Not encrypted',
345
+ encStateLocked: 'Locked',
346
+ encStateUnlocked: 'Encrypted',
347
+ encBadgeLockedAria: 'Profile locked',
348
+ encBadgeUnlockedAria: 'Profile encrypted',
349
+ encryptProfile: 'Encrypt this profile',
350
+ encryptProfileHint: 'Protect this profile’s sessions and data with a master password. You’ll need it to unlock the profile on each launch.',
351
+ encMasterPassword: 'Master password',
352
+ encConfirmPassword: 'Confirm password',
353
+ encPasswordMismatch: 'Passwords don’t match.',
354
+ encEnable: 'Encrypt profile',
355
+ encEnabling: 'Encrypting…',
356
+ encRecoveryTitle: 'Save your recovery key',
357
+ encRecoveryBlurb: 'This is the only way back in if you forget your password. It’s shown once — store it somewhere safe. Butin can’t recover it for you.',
358
+ encRecoveryKey: 'Recovery key',
359
+ encCopy: 'Copy',
360
+ encCopied: 'Copied',
361
+ encSavedRecovery: 'I’ve saved my recovery key',
362
+ encDone: 'Done',
363
+ encLock: 'Lock',
364
+ encUnlockToManage: 'Switch to this profile and unlock it to change its encryption.',
365
+ encChangePassword: 'Change password',
366
+ encChangePasswordTitle: 'Change master password',
367
+ encOldPassword: 'Current password',
368
+ encNewPassword: 'New password',
369
+ encChangeSaved: 'Password changed',
370
+ encWrongPassword: 'Current password is incorrect.',
371
+ encResetTitle: 'Reset with recovery key',
372
+ encResetBlurb: 'Enter your recovery key and choose a new master password.',
373
+ encReset: 'Reset password',
374
+ encWrongRecovery: 'Recovery key is incorrect.',
375
+ encDisable: 'Turn off encryption',
376
+ encDisableTitle: 'Turn off encryption',
377
+ encDisableBlurb: 'This rewrites this profile’s sessions and data as plaintext on disk. The master password is removed.',
378
+ encDisableConfirm: 'Turn off encryption',
379
+ encDisabled: 'Encryption turned off',
380
+ encDuplicatePlaintext: 'The copy is unencrypted — enable encryption on it if you need it.',
381
+ lockGateTitle: 'This profile is locked',
382
+ lockGateBlurb: 'Enter the master password for this profile to unlock its sessions and data.',
383
+ lockGatePassword: 'Master password',
384
+ lockGateUnlock: 'Unlock',
385
+ lockGateUnlocking: 'Unlocking…',
386
+ lockGateUseRecovery: 'Use recovery key instead',
387
+ lockGateUsePassword: 'Use password instead',
388
+ lockGateBadSecret: 'Incorrect password or recovery key.',
389
+ lockGateSwitchProfile: 'Or switch to another profile',
390
+ lockGateForgot: 'Forgot your password?',
391
+ notifications: {
392
+ title: 'Notifications',
393
+ empty: 'All clear',
394
+ markAll: 'Mark all read',
395
+ windowDod: 'day over day',
396
+ windowWow: 'week over week',
397
+ windowMom: 'month over month',
398
+ facetSpend: 'spend',
399
+ facetUsage: 'usage',
400
+ allServices: 'All services',
401
+ up: 'up',
402
+ down: 'down',
403
+ newActivity: 'started',
404
+ fxMissingTitle: 'Missing exchange rate',
405
+ fxMissingBody: (currency, base, service) => `No ${currency}→${base} rate — ${service} is excluded from cross-service totals. Set it in Settings.`,
406
+ dismiss: 'Dismiss',
407
+ unread: (count) => `${count} unread`,
408
+ settingsChangeTitle: 'Change alerts',
409
+ settingsHealthTitle: 'Data health',
410
+ settingsFxMissing: 'Warn when a service’s currency has no exchange rate',
411
+ settingsHint: 'Percent change that triggers an alert. Blank = off.'
412
+ }
413
+ };
414
+ export const fr = {
415
+ intlLocale: 'fr-CA',
416
+ headline: 'Tous vos comptes. Un seul endroit.',
417
+ tagline: 'Vos données, chez vous.',
418
+ libraryTitle: 'Bibliothèque',
419
+ librarySubtitle: 'Tout ce que vous avez rapatrié, réuni au même endroit.',
420
+ dataHeading: 'Données',
421
+ homeAria: 'Accueil',
422
+ navManagement: 'Gestion',
423
+ navOverview: 'Aperçu',
424
+ navDeveloper: 'Développeur',
425
+ logsHeading: 'Journaux',
426
+ navSettings: 'Réglages',
427
+ devNavBrowser: 'Navigateur',
428
+ systemHeading: 'Système',
429
+ servicesHeading: 'Services',
430
+ searchPlaceholder: 'Rechercher…',
431
+ noServicesMatch: 'Aucun service',
432
+ sidebarDisabledHint: 'Désactivé — réactivez-le dans Gestion',
433
+ menuLabel: 'Menu',
434
+ tabInstalled: 'Installés',
435
+ tabAvailable: 'Disponibles',
436
+ installAction: 'Installer',
437
+ uninstallAction: 'Désinstaller',
438
+ uninstallArmed: 'Confirmer la désinstallation',
439
+ uninstallConfirm: 'Désinstaller ce service ? Sa session, ses réglages et ses données en cache seront supprimés. Les fichiers téléchargés sont conservés, sauf si vous choisissez de les effacer ci-dessous.',
440
+ uninstallEraseFolder: 'Supprimer aussi le dossier de données du service (efface les fichiers téléchargés)',
441
+ uninstallEraseFolderDocs: (n) => `Supprimer aussi le dossier de données du service, dont ${n.toLocaleString('fr-CA')} ${n === 1 ? 'document téléchargé' : 'documents téléchargés'}`,
442
+ allInstalled: 'Tous les services sont installés',
443
+ availableSearchPlaceholder: 'Rechercher un service…',
444
+ skipForNow: 'Passer pour l’instant',
445
+ finishSetup: 'Terminer la configuration',
446
+ onboardingContinue: 'Continuer',
447
+ onboardingSignInTitle: 'Connexion',
448
+ onboardingSignInBlurb: 'Butin ouvre la page de connexion du service pour vous y connecter une seule fois. Votre session reste chiffrée sur cet appareil.',
449
+ onboardingSettingsTitle: 'Réglages',
450
+ onboardingSettingsBlurb: 'Quelques détails dont ce service a besoin avant sa première récupération.',
451
+ onboardingRefreshTitle: 'Première récupération',
452
+ onboardingRefreshBlurb: 'Récupérez les données de ce service — les fichiers s’enregistrent séparément, via Tout enregistrer.',
453
+ actionRetry: 'Réessayer',
454
+ actionReconnect: 'Reconnecter',
455
+ actionEditSettings: 'Modifier les réglages',
456
+ actionOpenDashboard: 'Ouvrir le tableau de bord',
457
+ actionOpenDocs: 'Dépannage',
458
+ errorDetails: 'Détails techniques',
459
+ failureMessage: {
460
+ 'session-not-captured': 'La fenêtre de connexion s’est fermée avant la capture de la session. Reconnectez-vous pour terminer.',
461
+ 'session-expired': 'Votre session a expiré. Reconnectez-vous pour la rafraîchir.',
462
+ 'config-missing': 'Ce service a besoin d’un réglage avant de pouvoir récupérer les données.',
463
+ 'config-invalid': 'Un réglage a été refusé. Vérifiez les valeurs et réessayez.',
464
+ 'verification-required': 'Le service doit revérifier votre navigateur. Reconnectez-vous pour continuer.',
465
+ permission: 'Le service a refusé cette requête. Vous n’avez peut-être pas accès à ces données.',
466
+ network: 'Butin n’a pas pu joindre le service. Vérifiez votre connexion et réessayez.',
467
+ 'data-invalid': 'Ce service a renvoyé des données que Butin n’a pas pu interpréter. Le service a peut-être changé.',
468
+ unknown: 'Une erreur est survenue lors de la récupération de ces données.'
469
+ },
470
+ exportButton: 'Exporter',
471
+ exportTitle: 'Exporter les données',
472
+ exportDescription: 'Exporte vos données de tableau de bord enregistrées — la vue d’ensemble et les derniers onglets en cache de chaque service — dans un seul fichier JSON pour la visionneuse Butin. Aucune connexion en direct n’est établie ; les documents et identifiants ne sont pas inclus.',
473
+ exportServices: 'Services',
474
+ exportSelectAll: 'Tout sélectionner',
475
+ exportNoData: 'aucune donnée',
476
+ exportEncrypt: 'Chiffrer cet export',
477
+ exportEncryptHint: 'Seul ce profil Butin pourra le rouvrir.',
478
+ exportPlaintextWarning: 'En clair — lisible par quiconque possède le fichier.',
479
+ exportPlaintextNote: 'Sortie en clair (non chiffrée).',
480
+ exportDestination: 'Destination',
481
+ exportDestinationDefault: 'Dossier Téléchargements',
482
+ exportChange: 'Modifier…',
483
+ exportRunning: 'Exportation…',
484
+ exportDone: 'Données exportées',
485
+ exportReveal: 'Afficher dans le dossier',
486
+ sessionSaved: 'Session enregistrée',
487
+ sessionSecured: 'Session sécurisée',
488
+ sessionNotCaptured: 'Session non capturée',
489
+ sessionCanceled: 'Connexion annulée — aucune session capturée.',
490
+ sessionCleared: 'Session effacée',
491
+ settingsSaved: 'Réglages enregistrés',
492
+ dataSaved: (capability) => `${capability} — données sécurisées`,
493
+ fetchFailed: 'Échec du chargement',
494
+ settingsTitle: 'Réglages',
495
+ settingsSubtitle: 'Apparence, capture, formatage et vos données locales.',
496
+ themeLabel: 'Thème',
497
+ themeHint: 'Suivre le système, ou fixer clair/sombre.',
498
+ themeToggle: 'Basculer clair/sombre',
499
+ sectionLanguage: 'Langue',
500
+ languageHint: 'Anglais ou français.',
501
+ sectionDataPrivacy: 'Données et confidentialité',
502
+ sectionAbout: 'À propos',
503
+ settingsNavGeneral: 'Général',
504
+ settingsNavAdvanced: 'Avancé',
505
+ settingsNavSystem: 'Système',
506
+ settingsNavStorage: 'Stockage',
507
+ settingsNavBrowserSignin: 'Connexion navigateur',
508
+ browserSigninTitle: 'Connexion navigateur',
509
+ browserSigninLead: "Certains comptes, Google personnel en particulier, refusent le navigateur intégré. Connectez-vous une fois avec votre propre Chrome et Butin conserve la session pour que vos services connectés l'utilisent.",
510
+ browserSigninStepsTitle: 'Comment ça marche',
511
+ browserSigninStep1: 'Cliquez sur le bouton ci-dessous. Votre propre Chrome ouvre la page de connexion Google.',
512
+ browserSigninStep2: 'Connectez-vous à votre compte comme vous le faites normalement, y compris toute vérification en deux étapes.',
513
+ browserSigninStep3: 'Fermez la fenêtre Chrome. Butin rapatrie la session, et tout est prêt.',
514
+ browserSigninButton: 'Se connecter avec Chrome',
515
+ browserSigninReopen: 'Rouvrir Chrome',
516
+ browserSigninConnected: 'Une session de navigateur est enregistrée.',
517
+ browserSigninNone: 'Aucune session de navigateur enregistrée.',
518
+ browserSigninBusy: 'Chrome est ouvert. Connectez-vous, puis fermez la fenêtre pour terminer.',
519
+ browserSigninSynced: (n) => `Session enregistrée. ${n} témoin${n === 1 ? '' : 's'} rapatrié${n === 1 ? '' : 's'}.`,
520
+ browserSigninError: "La connexion Chrome ne s'est pas terminée. Veuillez réessayer.",
521
+ browserSigninAdvanced: 'Utiliser une autre URL de connexion',
522
+ browserSigninUrlLabel: 'URL de connexion',
523
+ browserSigninPathLabel: 'Emplacement de stockage',
524
+ browserSigninPathHint: 'Un profil Chrome distinct créé par Butin pour cela. Cliquez sur le chemin pour ouvrir le dossier.',
525
+ browserSigninRemoveTitle: 'Supprimer cette session enregistrée',
526
+ browserSigninRemoveHint: "Supprime le profil Chrome distinct, y compris l'identifiant Google et les témoins enregistrés, de votre machine. Rien d'autre n'est touché, et vous pouvez vous reconnecter à tout moment.",
527
+ browserSigninRemove: 'Supprimer',
528
+ browserSigninRemoveTooltip: 'Supprimer le profil Chrome enregistré et ses témoins de cette machine.',
529
+ settingsLoading: 'Chargement…',
530
+ settingsSaveFailed: "Impossible d'enregistrer la modification",
531
+ openFolderFailed: "Impossible d'ouvrir ce dossier",
532
+ startPageLabel: 'Page de démarrage',
533
+ startPageHint: 'Où Butin s’ouvre au lancement.',
534
+ startPageOverview: 'Aperçu',
535
+ startPageLast: 'Où j’étais',
536
+ sectionSecurity: 'Sécurité',
537
+ idleLockLabel: 'Verrouillage auto en inactivité',
538
+ idleLockHint: 'Verrouille les profils chiffrés après cette durée d’inactivité.',
539
+ idleLockOff: 'Jamais',
540
+ lockOnSleepLabel: 'Verrouiller en veille',
541
+ lockOnSleepHint: 'Verrouille les profils chiffrés quand l’ordinateur se met en veille.',
542
+ cacheWindowLabel: 'Fenêtre de cache',
543
+ cacheWindowHint: 'Durée de réutilisation d’une réponse avant rechargement — couvre une actualisation globale.',
544
+ logLevelLabel: 'Niveau de journalisation',
545
+ logLevelHint: 'Ce qui est enregistré. En dessous de ce niveau, rien n’est capturé.',
546
+ logRetentionLabel: 'Conserver les journaux',
547
+ logRetentionHint: 'Session seulement garde les journaux dans la vue sans écrire de fichiers ; une fenêtre écrit des fichiers quotidiens nettoyés au-delà.',
548
+ manualCaptureLabel: 'Capturer manuellement',
549
+ manualCaptureHint: 'À la détection de la connexion, attendre que vous cliquiez sur Capturer au lieu de récupérer la session automatiquement.',
550
+ paceRequestsLabel: 'Espacer les requêtes',
551
+ paceRequestsHint: 'Espacer les requêtes vers chaque service d’un court délai aléatoire (100–500 ms) pour que Butin reste un client léger et régulier au lieu d’envoyer des rafales. Désactiver pour les rafraîchissements les plus rapides.',
552
+ devModeSection: 'Développement',
553
+ devModeLabel: 'Mode développeur',
554
+ devModeHint: 'Afficher les outils de débogage — comme le journal brut des changements quotidiens — dans l’onglet Réglages de chaque service.',
555
+ sectionFormatting: 'Format',
556
+ currencyFormatLabel: 'Format monétaire',
557
+ currencyFormatHint: 'Affichage des montants (style seulement — les montants ne changent pas).',
558
+ dateFormatLabel: 'Format de date',
559
+ dateFormatHint: 'Affichage des dates et heures.',
560
+ sectionCurrency: 'Devise',
561
+ baseCurrencyLabel: 'Devise de référence',
562
+ baseCurrencyHint: 'La devise dans laquelle les totaux de l’aperçu sont affichés. Les autres devises y sont converties.',
563
+ exchangeRatesLabel: 'Taux de change',
564
+ exchangeRatesHint: 'Valeur d’une unité de chaque devise dans votre devise de référence. Sans taux, la devise est affichée seule et exclue des totaux combinés.',
565
+ exchangeRatesEmpty: 'Tous les services connectés utilisent déjà votre devise de référence — aucun taux requis.',
566
+ saveRates: 'Enregistrer les taux',
567
+ clearDataConfirm: 'Cliquez à nouveau pour confirmer',
568
+ noServices: 'Aucun service pour l’instant.',
569
+ sessionLive: 'session active',
570
+ locked: 'verrouillé',
571
+ reportCount: (n) => `${n} ${n === 1 ? 'rapport' : 'rapports'}`,
572
+ allServices: 'Tous les services',
573
+ sessionTitle: 'Session',
574
+ sessionLiveBadge: 'active',
575
+ sessionStoredDesc: 'Session sécurisée (chiffrée). Recapturez-la pour rafraîchir l’accès.',
576
+ sessionEmptyDesc: 'Connectez-vous une fois dans un vrai navigateur — Butin enregistre la session, puis charge vos données en arrière-plan.',
577
+ capturingSession: 'Capture de la session…',
578
+ recaptureSession: 'Recapturer la session',
579
+ captureSession: 'Capturer la session',
580
+ clearSession: 'Effacer la session',
581
+ advancedPaste: 'avancé : coller la session',
582
+ hide: 'masquer',
583
+ pastePlaceholder: 'collez l’en-tête cookie complet — votre session (doit inclure le cookie d’auth)',
584
+ save: 'Enregistrer',
585
+ fetch: 'Charger',
586
+ fetching: 'Chargement…',
587
+ completedAt: (when) => `terminé ${when}`,
588
+ refresh: 'Rafraîchir',
589
+ refreshThisTab: 'Rafraîchir cet onglet seulement',
590
+ refetchAll: 'Tout retélécharger',
591
+ notLoadedYet: 'pas encore chargé',
592
+ refreshedAgo: (relative, absolute) => `actualisé ${relative} · ${absolute}`,
593
+ refreshWarning: 'Échec du rafraîchissement — affichage des dernières données chargées.',
594
+ connectPrompt: (service) => `Connectez ${service} pour récupérer ses premières données.`,
595
+ noDataYet: 'Aucune donnée',
596
+ serviceCount: (n) => `${n} ${n === 1 ? 'service' : 'services'}`,
597
+ overviewSpending: 'Dépenses',
598
+ overviewBalances: 'Soldes',
599
+ overviewOthers: 'Autres',
600
+ netWorth: 'Valeur nette',
601
+ itemCount: (n) => `${n} ${n === 1 ? 'élément' : 'éléments'}`,
602
+ lastFetched: (when) => `Récupéré ${when}`,
603
+ chartMonthly: 'Mensuel',
604
+ chartDaily: 'Quotidien',
605
+ chartYears: 'Années',
606
+ chartAllYears: 'Toutes les années',
607
+ chartEstimated: 'Estimé — aucun relevé ce jour',
608
+ chartMtdEstimate: 'Estimation — cumul du mois',
609
+ noRows: 'Aucune ligne.',
610
+ tableSelectAll: (n) => `Tout sélectionner (${n})`,
611
+ tableColumns: 'Colonnes',
612
+ tableExport: 'Exporter',
613
+ tablePerPage: (n) => `${n} / page`,
614
+ tablePageOf: (page, total) => `${page} / ${total}`,
615
+ tableRowCount: (n) => `${n.toLocaleString('fr')} élément${n === 1 ? '' : 's'}`,
616
+ tablePrev: 'Préc.',
617
+ tableNext: 'Suiv.',
618
+ toggleRowDetails: 'Afficher le détail de la ligne',
619
+ perDayHeading: 'Par jour',
620
+ estimatedTag: '(est.)',
621
+ cellCopy: 'Copier',
622
+ cellCopied: 'Copié',
623
+ documentsEmpty: 'Aucun document trouvé.',
624
+ documentsFolderLabel: 'Enregistrer dans',
625
+ documentsChangeFolder: 'Changer…',
626
+ downloadSelected: (n) => `Télécharger ${n} sélectionné${n > 1 ? 's' : ''}`,
627
+ downloadAll: 'Tout télécharger',
628
+ openFolder: 'Ouvrir le dossier',
629
+ openDocument: 'Ouvrir',
630
+ viewDocument: 'Voir',
631
+ retryFailed: 'Réessayer les échecs',
632
+ selectAll: 'tout sélectionner',
633
+ docDownloaded: 'téléchargé',
634
+ docDownloading: 'téléchargement…',
635
+ docFailed: 'échec',
636
+ downloadDone: (done, skipped) => `${done} téléchargé${done > 1 ? 's' : ''}${skipped ? `, ${skipped} déjà sur le disque` : ''}`,
637
+ serviceSettingsTitle: 'Réglages',
638
+ perServiceConfig: 'Config par service — stockée en local, secrets chiffrés.',
639
+ saveSettings: 'Enregistrer',
640
+ leaveBlank: 'laisser vide pour conserver',
641
+ noServicesRegistered: 'Aucun service enregistré.',
642
+ connect: 'Connecter',
643
+ reconnect: 'Reconnecter',
644
+ extractAll: 'Tout enregistrer',
645
+ extractAllRunning: 'Enregistrement…',
646
+ extractAllDone: (tabs, files) => `${tabs} onglets, ${files} fichiers enregistrés`,
647
+ test: 'Tester',
648
+ enabledLabel: 'Activé',
649
+ enableToUseHint: 'Désactivé — activez pour utiliser',
650
+ refreshData: 'Rafraîchir',
651
+ extractAllHint: 'Charge tous les onglets et télécharge tous les fichiers disponibles de ce service dans un dossier local.',
652
+ filterAll: 'Tous',
653
+ filterEnabled: 'Activés',
654
+ filterConnected: 'Connectés',
655
+ filterUnverified: 'Non vérifiés',
656
+ filterDisconnected: 'Déconnectés',
657
+ filterIssues: 'Problèmes',
658
+ filterDisabled: 'Désactivés',
659
+ filterStale: 'À rafraîchir',
660
+ testAll: 'Tout tester',
661
+ testAllCount: (n) => `Tout tester (${n})`,
662
+ refreshAllCount: (n) => `Tout rafraîchir (${n})`,
663
+ lastRefreshed: (rel) => `Rafraîchi ${rel}`,
664
+ neverRefreshed: 'Jamais rafraîchi',
665
+ dismissSummary: 'Ignorer',
666
+ testingProgress: (done, total) => `Test ${done} sur ${total}…`,
667
+ refreshingProgress: (done, total) => `Rafraîchissement ${done} sur ${total}…`,
668
+ refreshAll: 'Tout rafraîchir',
669
+ category: {
670
+ finance: 'Finance',
671
+ cloud: 'Infonuagique',
672
+ ai: 'IA',
673
+ devtools: 'Outils dev',
674
+ productivity: 'Productivité',
675
+ rental: 'Locations',
676
+ other: 'Autres'
677
+ },
678
+ serviceDisabledBanner: 'Ce service est désactivé — activez-le pour récupérer les données.',
679
+ refreshSummary: (refreshed, needsReconnect) => `${refreshed} rafraîchi(s) · ${needsReconnect} à reconnecter`,
680
+ needsReconnect: 'Reconnecter',
681
+ settingsConnection: 'Connexion',
682
+ settingsConfiguration: 'Configuration',
683
+ settingsService: 'Service',
684
+ settingsData: 'Données',
685
+ openDashboard: 'Ouvrir le tableau de bord',
686
+ openInButin: 'Ouvrir dans Butin',
687
+ refreshAllTabs: 'Tout rafraîchir',
688
+ testPassed: 'connexion ok',
689
+ testFailed: 'échec de la connexion',
690
+ enabledHint: 'Les services désactivés sont masqués de la barre latérale et de la vue d’ensemble.',
691
+ statusConnected: 'connecté',
692
+ statusDisconnected: 'déconnecté',
693
+ statusUnverified: 'non vérifié',
694
+ disconnect: 'Déconnecter',
695
+ eraseData: 'Effacer les données',
696
+ eraseDataHint: 'Supprime de votre appareil les données en cache de ce service (rapports + liste des documents). Conserve votre session et les fichiers déjà téléchargés ; vous pouvez tout recharger ensuite.',
697
+ eraseDataDocsKept: (n) => `${n.toLocaleString('fr-CA')} ${n === 1 ? 'document téléchargé est conservé' : 'documents téléchargés sont conservés'} — seules les données en cache sont effacées.`,
698
+ dataErased: 'Données effacées',
699
+ moveToProfile: 'Déplacer vers un autre profil',
700
+ moveToProfileHint: 'Confie la connexion et les données en cache de ce service à un autre profil.',
701
+ moveConfirmTo: (name) => `Confirmer le déplacement vers ${name}`,
702
+ cancel: 'Annuler',
703
+ moveDone: (name) => `Déplacé vers ${name}`,
704
+ outputFolder: 'Dossier de sortie',
705
+ never: 'jamais',
706
+ statRecords: 'Enregistrements en cache',
707
+ statFiles: 'Fichiers',
708
+ statOnDisk: 'Sur le disque',
709
+ statLastSynced: 'Dernière synchro',
710
+ invCapability: 'Capacité',
711
+ invRecords: 'Enregistrements',
712
+ invLastFetched: 'Dernier chargement',
713
+ invHistory: 'Historique',
714
+ invTrend: 'Tendance',
715
+ invView: 'Voir',
716
+ settingsUnderHood: 'Sous le capot',
717
+ underHoodSubtitle: 'comment Butin lit ce service',
718
+ mechHowConnects: 'Mode de connexion',
719
+ mechAuth: 'Méthode d’auth',
720
+ mechTransport: 'Transport',
721
+ mechCookieDomains: 'Domaines de cookies',
722
+ mechSignIn: 'URL de connexion',
723
+ mechPlugin: 'Plugin',
724
+ requiresBrowserEngineLabel: 'Moteur navigateur',
725
+ settingsLedgerDebug: 'Journal (débogage)',
726
+ ledgerDebugSubtitle: 'historique brut des changements quotidiens',
727
+ ledgerLoading: 'Chargement…',
728
+ ledgerNoData: 'Aucun journal enregistré',
729
+ ledgerDatasetsTitle: 'Jeux de données',
730
+ ledgerSeriesTitle: 'Séries',
731
+ ledgerColRow: 'Ligne',
732
+ ledgerColFirstSeen: 'Première vue',
733
+ ledgerColLastSeen: 'Dernière vue',
734
+ ledgerColVersions: 'Versions',
735
+ ledgerRows: 'lignes',
736
+ ledgerPoints: 'points',
737
+ ledgerDerivedDaily: 'quotidien dérivé',
738
+ settingsManage: 'Gérer et zone sensible',
739
+ profileSwitchTo: (name) => `Basculer vers ${name}`,
740
+ profileCurrent: 'Actuel',
741
+ profileActionsAria: (name) => `Actions pour ${name}`,
742
+ profileRename: 'Renommer',
743
+ profileDuplicate: 'Dupliquer',
744
+ profileDuplicateLockedHint: 'Déverrouillez ce profil pour le dupliquer.',
745
+ profileColor: 'Couleur',
746
+ profileColorAria: (name) => `Couleur de ${name}`,
747
+ profileManageEncryption: 'Chiffrement',
748
+ profileDelete: 'Supprimer',
749
+ profileDeleteConfirm: 'Confirmer la suppression',
750
+ profileNewName: 'Nom du nouveau profil',
751
+ profileAdd: 'Ajouter',
752
+ profileSave: 'Enregistrer',
753
+ profileActive: 'Actif',
754
+ profileNameAria: 'Nom du profil',
755
+ profilesDialogTitle: 'Profils',
756
+ profilesDialogBlurb: 'Chaque profil est un espace isolé — connexions, réglages et données distincts.',
757
+ encStateOff: 'Non chiffré',
758
+ encStateLocked: 'Verrouillé',
759
+ encStateUnlocked: 'Chiffré',
760
+ encBadgeLockedAria: 'Profil verrouillé',
761
+ encBadgeUnlockedAria: 'Profil chiffré',
762
+ encryptProfile: 'Chiffrer ce profil',
763
+ encryptProfileHint: 'Protégez les sessions et données de ce profil avec un mot de passe maître. Il sera requis pour déverrouiller le profil à chaque lancement.',
764
+ encMasterPassword: 'Mot de passe maître',
765
+ encConfirmPassword: 'Confirmer le mot de passe',
766
+ encPasswordMismatch: 'Les mots de passe ne correspondent pas.',
767
+ encEnable: 'Chiffrer le profil',
768
+ encEnabling: 'Chiffrement…',
769
+ encRecoveryTitle: 'Enregistrez votre clé de récupération',
770
+ encRecoveryBlurb: 'C’est le seul moyen de revenir si vous oubliez votre mot de passe. Elle s’affiche une seule fois — conservez-la en lieu sûr. Butin ne peut pas la récupérer pour vous.',
771
+ encRecoveryKey: 'Clé de récupération',
772
+ encCopy: 'Copier',
773
+ encCopied: 'Copié',
774
+ encSavedRecovery: 'J’ai enregistré ma clé de récupération',
775
+ encDone: 'Terminé',
776
+ encLock: 'Verrouiller',
777
+ encUnlockToManage: 'Passez à ce profil et déverrouillez-le pour modifier son chiffrement.',
778
+ encChangePassword: 'Changer le mot de passe',
779
+ encChangePasswordTitle: 'Changer le mot de passe maître',
780
+ encOldPassword: 'Mot de passe actuel',
781
+ encNewPassword: 'Nouveau mot de passe',
782
+ encChangeSaved: 'Mot de passe modifié',
783
+ encWrongPassword: 'Le mot de passe actuel est incorrect.',
784
+ encResetTitle: 'Réinitialiser avec la clé de récupération',
785
+ encResetBlurb: 'Saisissez votre clé de récupération et choisissez un nouveau mot de passe maître.',
786
+ encReset: 'Réinitialiser le mot de passe',
787
+ encWrongRecovery: 'La clé de récupération est incorrecte.',
788
+ encDisable: 'Désactiver le chiffrement',
789
+ encDisableTitle: 'Désactiver le chiffrement',
790
+ encDisableBlurb: 'Cela réécrit en clair sur le disque les sessions et données de ce profil. Le mot de passe maître est supprimé.',
791
+ encDisableConfirm: 'Désactiver le chiffrement',
792
+ encDisabled: 'Chiffrement désactivé',
793
+ encDuplicatePlaintext: 'La copie n’est pas chiffrée — activez le chiffrement dessus au besoin.',
794
+ lockGateTitle: 'Ce profil est verrouillé',
795
+ lockGateBlurb: 'Saisissez le mot de passe maître de ce profil pour déverrouiller ses sessions et données.',
796
+ lockGatePassword: 'Mot de passe maître',
797
+ lockGateUnlock: 'Déverrouiller',
798
+ lockGateUnlocking: 'Déverrouillage…',
799
+ lockGateUseRecovery: 'Utiliser plutôt la clé de récupération',
800
+ lockGateUsePassword: 'Utiliser plutôt le mot de passe',
801
+ lockGateBadSecret: 'Mot de passe ou clé de récupération incorrect.',
802
+ lockGateSwitchProfile: 'Ou passez à un autre profil',
803
+ lockGateForgot: 'Mot de passe oublié ?',
804
+ notifications: {
805
+ title: 'Notifications',
806
+ empty: 'Rien à signaler',
807
+ markAll: 'Tout marquer comme lu',
808
+ windowDod: 'jour sur jour',
809
+ windowWow: 'semaine sur semaine',
810
+ windowMom: 'mois sur mois',
811
+ facetSpend: 'dépenses',
812
+ facetUsage: 'utilisation',
813
+ allServices: 'Tous les services',
814
+ up: 'en hausse de',
815
+ down: 'en baisse de',
816
+ newActivity: 'a démarré',
817
+ fxMissingTitle: 'Taux de change manquant',
818
+ fxMissingBody: (currency, base, service) => `Aucun taux ${currency}→${base} — ${service} est exclu des totaux multi-services. Réglez-le dans les Réglages.`,
819
+ dismiss: 'Ignorer',
820
+ unread: (count) => `${count} non lus`,
821
+ settingsChangeTitle: 'Alertes de variation',
822
+ settingsHealthTitle: 'Santé des données',
823
+ settingsFxMissing: 'Avertir lorsqu’un service utilise une devise sans taux de change',
824
+ settingsHint: 'Variation en pourcentage qui déclenche une alerte. Vide = désactivé.'
825
+ }
826
+ };
827
+ // All dictionaries, keyed by locale. Typed so a missing key in any locale fails the build.
828
+ export const butinLabels = { en, fr };