@object-ui/i18n 17.5.0 → 17.7.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 (58) hide show
  1. package/CHANGELOG.md +4954 -0
  2. package/README.md +234 -13
  3. package/dist/builtinAggregateLabels.d.ts +40 -0
  4. package/dist/builtinAggregateLabels.js +23 -0
  5. package/dist/currency.d.ts +27 -3
  6. package/dist/currency.js +28 -4
  7. package/dist/fallbackInterpolation.d.ts +79 -0
  8. package/dist/fallbackInterpolation.js +124 -0
  9. package/dist/i18n.d.ts +28 -2
  10. package/dist/i18n.js +99 -17
  11. package/dist/index.d.ts +17 -23
  12. package/dist/index.js +51 -27
  13. package/dist/locales/ar.d.ts +1113 -370
  14. package/dist/locales/ar.js +1276 -428
  15. package/dist/locales/de.d.ts +785 -370
  16. package/dist/locales/de.js +896 -401
  17. package/dist/locales/en.d.ts +800 -385
  18. package/dist/locales/en.js +1261 -419
  19. package/dist/locales/es.d.ts +867 -370
  20. package/dist/locales/es.js +976 -398
  21. package/dist/locales/fr.d.ts +867 -370
  22. package/dist/locales/fr.js +976 -399
  23. package/dist/locales/index.d.ts +8682 -3761
  24. package/dist/locales/index.js +68 -29
  25. package/dist/locales/ja.d.ts +785 -370
  26. package/dist/locales/ja.js +891 -395
  27. package/dist/locales/ko.d.ts +785 -370
  28. package/dist/locales/ko.js +893 -399
  29. package/dist/locales/pt.d.ts +867 -370
  30. package/dist/locales/pt.js +975 -397
  31. package/dist/locales/registry.d.ts +102 -0
  32. package/dist/locales/registry.js +220 -0
  33. package/dist/locales/rtl.d.ts +24 -0
  34. package/dist/locales/rtl.js +26 -0
  35. package/dist/locales/ru.d.ts +949 -370
  36. package/dist/locales/ru.js +1093 -419
  37. package/dist/locales/zh.d.ts +803 -388
  38. package/dist/locales/zh.js +899 -388
  39. package/dist/pickLocalized.d.ts +67 -0
  40. package/dist/pickLocalized.js +114 -0
  41. package/dist/provider.d.ts +102 -13
  42. package/dist/provider.js +335 -50
  43. package/dist/translateFn.d.ts +29 -0
  44. package/dist/translateFn.js +8 -0
  45. package/dist/useDisplayLocale.d.ts +11 -0
  46. package/dist/useDisplayLocale.js +13 -2
  47. package/dist/useObjectLabel.d.ts +118 -22
  48. package/dist/useObjectLabel.js +148 -23
  49. package/dist/useSafeTranslation.js +41 -43
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/index.d.ts +4 -4
  53. package/dist/utils/index.js +4 -4
  54. package/dist/utils/spec-formatters.d.ts +13 -23
  55. package/dist/utils/spec-formatters.js +41 -2
  56. package/dist/utils/spec-translations.d.ts +16 -3
  57. package/dist/utils/spec-translations.js +52 -13
  58. package/package.json +12 -6
@@ -19,10 +19,12 @@ const fr = {
19
19
  manage_users: "Gérer les utilisateurs",
20
20
  manage_org_users: "Gérer les utilisateurs de l'organisation",
21
21
  manage_metadata: "Gérer les métadonnées",
22
+ manage_org_presentation: "Gérer la présentation de l'organisation",
22
23
  manage_platform_settings: "Gérer les paramètres de la plateforme",
23
24
  setup_access: "Accès à la configuration",
24
25
  setup_write: "Écriture des paramètres",
25
26
  studio_access: "Accès à Studio",
27
+ manage_sharing: "Gérer le partage",
26
28
  },
27
29
  group: {
28
30
  platform: 'Plateforme',
@@ -39,12 +41,20 @@ const fr = {
39
41
  more: "+{{count}} de plus",
40
42
  objects: "{{count}} objets",
41
43
  objects_one: "{{count}} objet",
44
+ objects_many: "{{count}} d'objets",
45
+ objects_other: "{{count}} objets",
42
46
  fields: "{{count}} règles de champ",
43
47
  fields_one: "{{count}} règle de champ",
48
+ fields_many: "{{count}} de règles de champ",
49
+ fields_other: "{{count}} règles de champ",
44
50
  rls: "{{count}} politiques RLS",
45
51
  rls_one: "{{count}} politique RLS",
52
+ rls_many: "{{count}} de politiques RLS",
53
+ rls_other: "{{count}} politiques RLS",
46
54
  tabs: "{{count}} règles d'onglet",
47
55
  tabs_one: "{{count}} règle d'onglet",
56
+ tabs_many: "{{count}} de règles d'onglet",
57
+ tabs_other: "{{count}} règles d'onglet",
48
58
  adminScope: "Administration déléguée configurée",
49
59
  designInStudio: "Concevoir dans Studio →",
50
60
  designInStudioHint: "Concevoir dans Studio",
@@ -63,7 +73,9 @@ const fr = {
63
73
  selectFirst: 'Sélectionnez d’abord {{fields}}',
64
74
  selectRecord: 'Sélectionner un enregistrement',
65
75
  recordCount: '{{count}} enregistrements',
66
- recordCountOne: '1 enregistrement',
76
+ recordCount_one: '{{count}} enregistrement',
77
+ recordCount_many: "{{count}} d'enregistrements",
78
+ recordCount_other: '{{count}} enregistrements',
67
79
  pageOf: 'Page {{current}} sur {{total}}',
68
80
  filters: 'Filtres',
69
81
  clear: 'Effacer',
@@ -82,6 +94,7 @@ const fr = {
82
94
  removeFromFavorites: "Retirer des favoris",
83
95
  loading: "Chargement…",
84
96
  save: "Enregistrer",
97
+ discard: "Abandonner",
85
98
  cancel: "Annuler",
86
99
  delete: "Supprimer",
87
100
  edit: "Modifier",
@@ -115,7 +128,9 @@ const fr = {
115
128
  closePanel: "Fermer le panneau",
116
129
  resizeDrawer: "Redimensionner le panneau",
117
130
  itemCount: "{{count}} éléments",
118
- itemCountOne: "{{count}} élément",
131
+ itemCount_one: "{{count}} élément",
132
+ itemCount_many: "{{count}} d'éléments",
133
+ itemCount_other: "{{count}} éléments",
119
134
  toggleSidebar: "Basculer la barre latérale",
120
135
  package: "Package",
121
136
  done: "Terminé",
@@ -123,6 +138,16 @@ const fr = {
123
138
  record: "Enregistrement",
124
139
  retry: "Réessayer",
125
140
  printDialogHint: "Ouvre la boîte de dialogue d'impression de votre navigateur (ce n'est pas un export PDF)",
141
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
142
+ // there are two conditions: a reported `total` states the fact with BOTH
143
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
144
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
145
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
146
+ // headroom is deliberately NOT restated here — it moves on every
147
+ // re-baseline, and the figure that was here went stale.
148
+ // `pnpm check:eager-closure` prints it.
149
+ rowCeilingNote: "Affichage des {{shown}} premiers enregistrements sur {{total}}. Affinez le filtre.",
150
+ rowCeilingNoteUnknownTotal: "Affichage des {{shown}} premiers enregistrements. Affinez le filtre.",
126
151
  },
127
152
  actions: {
128
153
  decisionOutput: {
@@ -134,6 +159,14 @@ const fr = {
134
159
  acknowledge: 'Je l\'ai enregistrée',
135
160
  copyAll: 'Tout copier',
136
161
  },
162
+ notAvailableHere: '« {{action}} » n\'est pas disponible sur la page actuelle.',
163
+ completedSuccessfully: 'Action effectuée avec succès',
164
+ failed: "Échec de l'action",
165
+ parallelFailed: 'Une ou plusieurs actions parallèles ont échoué',
166
+ undo: 'Annuler',
167
+ undone: 'Modification annulée',
168
+ undoneOperation: 'Annuler : {{description}}',
169
+ redoneOperation: 'Rétablir : {{description}}',
137
170
  },
138
171
  validation: {
139
172
  required: "{{field}} est obligatoire",
@@ -151,19 +184,45 @@ const fr = {
151
184
  },
152
185
  form: {
153
186
  noPermissionToSave: "Vous n'avez pas l'autorisation d'enregistrer cet enregistrement.",
187
+ noPermissionToCreate: "Vous n'avez pas l'autorisation de créer des enregistrements {{object}}. Les champs sont en lecture seule.",
188
+ noPermissionToEdit: "Vous n'avez pas l'autorisation de modifier les enregistrements {{object}}. Les champs sont en lecture seule.",
154
189
  submitFailed: "Échec de l'enregistrement. Veuillez réessayer.",
190
+ uploadInFlight: "Attendez la fin du téléversement avant de sauvegarder.",
191
+ clearedOnHide: "Ce qui ne s'applique plus aux valeurs actuelles a été effacé : {{fields}}",
192
+ visibleWhenFaulted: "Envoi impossible : la règle visibleWhen de {{fields}} n'a pas pu être évaluée. La règle doit être corrigée avant que ce formulaire puisse être envoyé.",
155
193
  discardTitle: "Abandonner les modifications ?",
156
194
  discardMessage: "Vous avez des modifications non enregistrées. Si vous fermez ce formulaire maintenant, vos modifications seront perdues.",
157
195
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
158
196
  // description, used when the form declares no `description` of its own.
159
197
  dialogDescriptionFallback: "Remplissez les champs du formulaire, puis envoyez ou annulez.",
198
+ deniedDescription: "Vous n'avez pas l'autorisation de modifier ce champ.",
199
+ masterDetail: {
200
+ loadingColumns: "Chargement des colonnes…",
201
+ subtotal: "Sous-total",
202
+ tax: "Taxe ({{rate}} %)",
203
+ total: "Total",
204
+ lineItem: "Ligne",
205
+ rowTitle: "{{title}} — ligne {{row}}",
206
+ applyRow: "Appliquer",
207
+ editorDescription: "Saisissez l'enregistrement et ses lignes, puis enregistrez.",
208
+ noChildObject: "Aucun objet enfant n'est configuré pour cette collection : définissez {{property}} sur l'objet dont elle liste les lignes.",
209
+ schemaUnavailable: "Impossible de charger le schéma de {{object}} : cette collection n'a donc aucune colonne à afficher. Vérifiez que l'objet existe et est lisible, puis rechargez.",
210
+ noRelationshipField: "Impossible de déterminer comment {{object}} est lié à {{parent}} : aucun champ lookup ou master_detail de cet objet ne référence le parent. Définissez {{property}} sur cette collection avec le champ qui contient l'enregistrement parent.",
211
+ },
212
+ lineItems: {
213
+ title: "Lignes",
214
+ saveRecordFirst: "Enregistrez d'abord l'enregistrement pour ajouter des lignes.",
215
+ notLoaded: "Les lignes de cet enregistrement n'ont pas été chargées.",
216
+ loadFailed: "Échec du chargement des lignes",
217
+ saveFailed: "Échec de l'enregistrement des lignes",
218
+ noChildObject: "Aucun objet enfant n'est configuré pour ce panneau : définissez {{property}} sur l'objet dont il liste les lignes.",
219
+ },
160
220
  keepEditing: "Continuer l'édition",
161
221
  discard: "Abandonner",
162
222
  conflictTitle: "Conflit d'enregistrement",
163
223
  conflictMessage: "Cet enregistrement a été modifié par quelqu'un d'autre pendant votre édition. L'écrasement remplacera ses modifications par les vôtres.",
164
224
  conflictLatestVersion: "Son enregistrement : {{time}}",
165
225
  conflictOverwrite: "Écraser",
166
- addItem: "Ajouter un élément",
167
226
  removeItem: "Supprimer un élément",
168
227
  fieldRequired: "Ce champ est obligatoire",
169
228
  invalidFormat: "Format invalide",
@@ -181,6 +240,12 @@ const fr = {
181
240
  createSuccess: "{{object}} créé",
182
241
  updateSuccess: "{{object}} mis à jour",
183
242
  deleteSuccess: "{{object}} supprimé",
243
+ created: "Créé",
244
+ saved: "Enregistré",
245
+ savedNamed: "{{title}} enregistré",
246
+ submitted: "Envoyé",
247
+ errorLoading: "Erreur de chargement du formulaire",
248
+ navigateRefused: "La destination `navigateOnSuccess` déclarée pour ce formulaire a été refusée, la navigation n’a donc pas eu lieu.",
184
249
  fullscreen: {
185
250
  title: "Modifier le texte",
186
251
  description: "Modifiez la valeur texte complète, puis enregistrez ou annulez vos modifications.",
@@ -205,6 +270,9 @@ const fr = {
205
270
  },
206
271
  relativeDate: {
207
272
  overdue: "En retard de {{count}} j",
273
+ overdue_one: "En retard de {{count}} j",
274
+ overdue_many: "En retard de {{count}} j",
275
+ overdue_other: "En retard de {{count}} j",
208
276
  },
209
277
  file: {
210
278
  dragDropHere: 'Glissez-déposez des fichiers ici',
@@ -221,6 +289,7 @@ const fr = {
221
289
  remove: 'Supprimer {{name}}',
222
290
  exceedsMaxSize: '« {{name}} » dépasse la taille maximale ({{max}} Mo)',
223
291
  uploadFailed: 'Échec du téléversement de « {{name}} » : {{error}}',
292
+ uploadIncomplete: 'Le téléversement de « {{name}} » n’a pas abouti : aucun identifiant de fichier n’a été renvoyé, rien n’a été enregistré',
224
293
  },
225
294
  richText: {
226
295
  format: "Format : {{format}}",
@@ -248,6 +317,9 @@ const fr = {
248
317
  selectBusinessUnit: "Sélectionner une unité opérationnelle",
249
318
  selectPosition: "Sélectionner un poste",
250
319
  selectUnitAndSubordinates: "Sélectionner une unité opérationnelle",
320
+ selectField: "Sélectionner un champ utilisateur",
321
+ noUserFields: "Cet objet n'a aucun champ utilisateur",
322
+ fieldNotUserTyped: "{{name}} — pas un champ utilisateur",
251
323
  },
252
324
  filterCondition: {
253
325
  selectObjectFirst: "Sélectionnez d'abord un objet.",
@@ -258,13 +330,51 @@ const fr = {
258
330
  editAsJson: "Modifier en JSON",
259
331
  useVisualBuilder: "Utiliser le constructeur visuel",
260
332
  },
333
+ object: {
334
+ invalidJson: "JSON invalide",
335
+ },
336
+ location: {
337
+ refusedFormat: "Non enregistré : saisissez une paire latitude, longitude (exemple : 30.2741, 120.1551).",
338
+ refusedRange: "Non enregistré : {{detail}}",
339
+ latitude: "latitude",
340
+ longitude: "longitude",
341
+ refusedResidueOne: "Non enregistré : {{name}} « {{text}} » n'est pas un nombre. Saisissez des décimales simples (exemple : 30.2741, 120.1551).",
342
+ refusedResidue: "Non enregistré : {{name}} « {{text}} » et {{otherName}} « {{otherText}} » ne sont pas des nombres. Saisissez des décimales simples (exemple : 30.2741, 120.1551).",
343
+ },
344
+ date: {
345
+ impossibleDay: "La valeur enregistrée « {{value}} » n’est pas une date réelle. Choisissez une date pour la remplacer.",
346
+ },
347
+ dateTime: {
348
+ impossibleDay: "La valeur enregistrée « {{value}} » n’est pas une date réelle. Choisissez une date et une heure pour la remplacer.",
349
+ },
350
+ number: {
351
+ badInput: "Non enregistré : le texte de ce champ n'est pas un nombre. Saisissez une décimale simple (exemple : {{example}}).",
352
+ },
261
353
  tags: {
262
354
  placeholder: "Saisissez puis appuyez sur Entrée pour ajouter…",
263
355
  },
356
+ // objectui#4028 — `AddressField`'s five sub-labels.
357
+ address: {
358
+ street: "Adresse (rue)",
359
+ city: "Ville",
360
+ state: "État / Province",
361
+ postalCode: "Code postal",
362
+ country: "Pays",
363
+ },
264
364
  textarea: {
265
365
  characterCount: "Nombre de caractères : {{count}} sur {{max}}",
266
366
  charactersRemaining: "Caractères restants : {{count}}",
267
367
  },
368
+ grid: {
369
+ addLine: "Ajouter une ligne",
370
+ noItems: "Aucun élément",
371
+ noItemsAddHint: "Aucun élément pour l'instant — cliquez sur « {{label}} » pour commencer.",
372
+ optionalColumns: "Colonnes facultatives",
373
+ computed: "Calculé",
374
+ openRow: "Ouvrir la ligne",
375
+ duplicateRow: "Dupliquer la ligne",
376
+ removeRow: "Supprimer la ligne",
377
+ },
268
378
  },
269
379
  table: {
270
380
  rowsPerPage: "Lignes par page",
@@ -293,23 +403,41 @@ const fr = {
293
403
  open: "Ouvrir",
294
404
  search: "Rechercher…",
295
405
  modified: "{{count}} ligne(s) modifiée(s)",
406
+ modified_one: "{{count}} ligne modifiée",
407
+ modified_many: "{{count}} de lignes modifiées",
408
+ modified_other: "{{count}} lignes modifiées",
296
409
  saveFailed: 'Échec de l’enregistrement',
297
410
  selected: "{{count}} sélectionné(s)",
411
+ selected_one: "{{count}} sélectionné",
412
+ selected_many: "{{count}} sélectionnés",
413
+ selected_other: "{{count}} sélectionnés",
298
414
  edit: "Modifier",
299
415
  delete: "Supprimer",
300
416
  },
301
417
  grid: {
302
418
  bulkSelected: "{{count}} sélectionné(s)",
419
+ bulkSelected_one: "{{count}} sélectionné",
420
+ bulkSelected_many: "{{count}} sélectionnés",
421
+ bulkSelected_other: "{{count}} sélectionnés",
303
422
  bulkSelectedAllMatches: "{{count}} sélectionné(s) (tous les résultats)",
304
423
  bulkClear: "Effacer",
305
424
  bulkAllOnPage: "Les {{count}} éléments de cette page sont sélectionnés.",
425
+ bulkAllOnPage_one: "{{count}} enregistrement de cette page est sélectionné.",
426
+ bulkAllOnPage_many: "Les {{count}} éléments de cette page sont sélectionnés.",
427
+ bulkAllOnPage_other: "Les {{count}} éléments de cette page sont sélectionnés.",
306
428
  bulkSelectAllMatching: "Sélectionner les {{count}} correspondances",
307
429
  bulkAllMatchingSelected: "Les {{count}} enregistrements correspondants sont tous sélectionnés.",
308
430
  bulk: {
309
431
  confirmDefault: "Ceci s'appliquera à {{count}} enregistrement(s).",
432
+ confirmDefault_one: "Ceci s'appliquera à {{count}} enregistrement.",
433
+ confirmDefault_many: "Ceci s'appliquera à {{count}} d'enregistrements.",
434
+ confirmDefault_other: "Ceci s'appliquera à {{count}} enregistrements.",
310
435
  overLimit: "La sélection ({{count}}) dépasse la limite de l'action ({{limit}}). Réduisez la sélection pour continuer.",
311
436
  affectedRecords: "Enregistrements concernés ({{count}}) :",
312
437
  skippedIneligible: '{{count}} des enregistrements sélectionnés ne sont pas éligibles à cette action et seront ignorés.',
438
+ skippedIneligible_one: "{{count}} des enregistrements sélectionnés n'est pas éligible à cette action et sera ignoré.",
439
+ skippedIneligible_many: '{{count}} des enregistrements sélectionnés ne sont pas éligibles à cette action et seront ignorés.',
440
+ skippedIneligible_other: '{{count}} des enregistrements sélectionnés ne sont pas éligibles à cette action et seront ignorés.',
313
441
  rowFallback: "Ligne {{index}}",
314
442
  andMore: "… et {{count}} de plus",
315
443
  processed: "{{count}} / {{total}} traités",
@@ -327,7 +455,6 @@ const fr = {
327
455
  undo: "Annuler",
328
456
  undoing: "Annulation…",
329
457
  done: "Terminé",
330
- selectPlaceholder: "Sélectionner…",
331
458
  loading: "Chargement…",
332
459
  },
333
460
  actions: "Actions",
@@ -346,6 +473,14 @@ const fr = {
346
473
  yes: "Oui",
347
474
  no: "Non",
348
475
  systemFields: "Système",
476
+ // objectui#10881 — the grouped grid's two refusals: over a data source
477
+ // that cannot answer the group header query, and over rows a host
478
+ // handed in while declaring them one page of more. `queryGroupHeaders`
479
+ // is the member's name and stays untranslated.
480
+ grouping: {
481
+ needsHeaderQuery: "Cette vue est groupée, mais sa source de données n'implémente pas queryGroupHeaders : les groupes ne peuvent donc pas être comptés. Supprimez le regroupement pour afficher les enregistrements.",
482
+ needsWholeRows: "Le regroupement a besoin de tous les enregistrements, mais cette grille n'en a reçu qu'une page : les groupes ne peuvent donc pas être comptés. Fournissez tous les enregistrements, ou laissez la grille les charger depuis une source de données qui implémente queryGroupHeaders.",
483
+ },
349
484
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
350
485
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
351
486
  // pack controls its own separator and word order.
@@ -372,10 +507,15 @@ const fr = {
372
507
  },
373
508
  import: {
374
509
  downloadTemplate: "Télécharger le modèle",
375
- downloadTemplateHint: "Obtenez un CSV avec les bonnes colonnes (les champs obligatoires sont marqués d'un *).",
510
+ downloadTemplateHint: "Obtenez un fichier Excel des colonnes importables (les champs obligatoires sont marqués d'un *), avec des instructions de saisie.",
376
511
  templateFileName: "{{object}}-import-template",
512
+ templateDownloadFailed: "Impossible de télécharger le modèle. Veuillez réessayer.",
513
+ templateNotPermitted: "Vous n'êtes pas autorisé à créer des enregistrements de cet objet, son modèle d'import n'est donc pas disponible.",
377
514
  autoMatched: "Associé automatiquement",
378
515
  autoMatchedSummary: "{{count}} colonne(s) associée(s) automatiquement — vérifiez et ajustez ci-dessous.",
516
+ autoMatchedSummary_one: "{{count}} colonne associée automatiquement — vérifiez et ajustez ci-dessous.",
517
+ autoMatchedSummary_many: "{{count}} de colonnes associées automatiquement — vérifiez et ajustez ci-dessous.",
518
+ autoMatchedSummary_other: "{{count}} colonnes associées automatiquement — vérifiez et ajustez ci-dessous.",
379
519
  confidence: {
380
520
  high: "Confiance élevée",
381
521
  medium: "Confiance moyenne",
@@ -388,8 +528,17 @@ const fr = {
388
528
  cancelImport: "Annuler l'import",
389
529
  importCancelled: "Import annulé",
390
530
  resultsTruncated: "Affichage des {{count}} premiers résultats de lignes (sur {{total}}).",
531
+ resultsTruncated_one: "Affichage du premier résultat de ligne ({{count}} sur {{total}}).",
532
+ resultsTruncated_many: "Affichage des {{count}} premiers résultats de lignes (sur {{total}}).",
533
+ resultsTruncated_other: "Affichage des {{count}} premiers résultats de lignes (sur {{total}}).",
391
534
  createdCount: "{{count}} créé(s)",
535
+ createdCount_one: "{{count}} créé",
536
+ createdCount_many: "{{count}} créés",
537
+ createdCount_other: "{{count}} créés",
392
538
  updatedCount: "{{count}} mis à jour",
539
+ updatedCount_one: "{{count}} mis à jour",
540
+ updatedCount_many: "{{count}} mis à jour",
541
+ updatedCount_other: "{{count}} mis à jour",
393
542
  downloadFailed: "Télécharger les lignes en échec",
394
543
  options: "Options d'import",
395
544
  writeMode: "Lorsqu'une ligne correspond à un enregistrement existant",
@@ -437,6 +586,9 @@ const fr = {
437
586
  historyColResult: "Résultat",
438
587
  historyColTime: "Quand",
439
588
  errorCount: "{{count}} erreurs",
589
+ errorCount_one: "{{count}} erreur",
590
+ errorCount_many: "{{count}} d'erreurs",
591
+ errorCount_other: "{{count}} erreurs",
440
592
  undoImport: "Annuler l'import",
441
593
  undoing: "Annulation…",
442
594
  undoConfirm: "Annuler cet import ? Les enregistrements créés seront supprimés et les enregistrements mis à jour seront rétablis à leurs valeurs précédentes.",
@@ -497,7 +649,13 @@ const fr = {
497
649
  mapped: "Mappé",
498
650
  skipped: "Ignoré",
499
651
  rowsWithErrors: "{{count}} ligne(s) avec des erreurs",
652
+ rowsWithErrors_one: "{{count}} ligne avec des erreurs",
653
+ rowsWithErrors_many: "{{count}} de lignes avec des erreurs",
654
+ rowsWithErrors_other: "{{count}} lignes avec des erreurs",
500
655
  rowsCorrected: "{{count}} ligne(s) corrigée(s)",
656
+ rowsCorrected_one: "{{count}} ligne corrigée",
657
+ rowsCorrected_many: "{{count}} de lignes corrigées",
658
+ rowsCorrected_other: "{{count}} lignes corrigées",
501
659
  clickToFix: "— cliquez sur une cellule mise en surbrillance pour modifier en ligne.",
502
660
  showingRows: "Affichage de {{shown}} sur {{total}} lignes",
503
661
  importing: "Importation… {{progress}}%",
@@ -505,11 +663,17 @@ const fr = {
505
663
  imported: "{{count}} importé(s)",
506
664
  skippedCount: "{{count}} ignoré(s)",
507
665
  moreErrors: "…et {{count}} erreur(s) de plus",
666
+ moreErrors_one: "…et {{count}} erreur de plus",
667
+ moreErrors_many: "…et {{count}} d'erreurs de plus",
668
+ moreErrors_other: "…et {{count}} erreurs de plus",
508
669
  cancel: "Annuler",
509
670
  back: "Retour",
510
671
  next: "Suivant",
511
672
  close: "Fermer",
512
673
  importNRows: "Importer {{count}} lignes",
674
+ importNRows_one: "Importer {{count}} ligne",
675
+ importNRows_many: "Importer {{count}} de lignes",
676
+ importNRows_other: "Importer {{count}} lignes",
513
677
  importingProgress: "Importation…",
514
678
  requiredMark: "*",
515
679
  required: "Obligatoire",
@@ -521,11 +685,38 @@ const fr = {
521
685
  month: "Mois",
522
686
  week: "Semaine",
523
687
  day: "Jour",
524
- agenda: "Agenda",
525
688
  allDay: "Toute la journée",
526
- noEvents: "Aucun événement",
527
689
  newEvent: "Nouvel événement",
528
690
  moreEvents: "+{{count}} de plus",
691
+ unscheduled: "Non planifié ({{count}})",
692
+ loading: "Chargement du calendrier…",
693
+ loadError: "Erreur : {{message}}",
694
+ configRequired: "Configuration du calendrier requise. Veuillez indiquer startDateField, la seule clé obligatoire du calendrier ; le titre de l'événement se résout sans titleField.",
695
+ configRequiredHint: "Elle appartient au bloc calendar de la vue. Une page d'interface n'a pas d'emplacement de calendrier propre : pointez son sourceView vers une vue qui en déclare un.",
696
+ eventDetails: "Détails de l'événement",
697
+ pullToRefresh: "Tirer pour actualiser",
698
+ refreshing: "Actualisation…",
699
+ onDate: "Le {{date}}",
700
+ eventTitle: "Titre",
701
+ eventTitlePlaceholder: "De quoi s'agit-il ?",
702
+ creating: "Création…",
703
+ titleRequired: "Le titre est obligatoire",
704
+ a11y: {
705
+ region: "Calendrier",
706
+ grid: "Grille du calendrier",
707
+ goToToday: "Aller à aujourd'hui",
708
+ previousPeriod: "Période précédente",
709
+ nextPeriod: "Période suivante",
710
+ currentDate: "Date actuelle : {{date}}",
711
+ dayCell: "{{date}}, {{count}} événements",
712
+ dayCell_one: "{{date}}, {{count}} événement",
713
+ dayCell_many: "{{date}}, {{count}} d'événements",
714
+ dayCell_other: "{{date}}, {{count}} événements",
715
+ resizeEventEnd: "Modifier la fin de l'événement",
716
+ resizeEventEndHint: "Faites glisser pour modifier la date de fin",
717
+ resizeStart: "Modifier le début",
718
+ resizeEnd: "Modifier la fin",
719
+ },
529
720
  },
530
721
  list: {
531
722
  firstRunTitle: "Rien pour l'instant",
@@ -568,7 +759,9 @@ const fr = {
568
759
  refresh: "Actualiser",
569
760
  loading: "Chargement des enregistrements…",
570
761
  recordCount: "{{count}} enregistrements",
571
- recordCountOne: "{{count}} enregistrement",
762
+ recordCount_one: "{{count}} enregistrement",
763
+ recordCount_many: "{{count}} d'enregistrements",
764
+ recordCount_other: "{{count}} enregistrements",
572
765
  addRecord: "Ajouter un enregistrement",
573
766
  tabs: "Onglets",
574
767
  allRecords: "Tous les enregistrements",
@@ -600,7 +793,7 @@ const fr = {
600
793
  hideFieldsTitle: "Masquer les champs",
601
794
  dataLimitReached: "Les {{limit}} premiers enregistrements sont affichés. Il peut y avoir plus de données disponibles.",
602
795
  viewSettings: "Paramètres de vue",
603
- viewSettingsHint: "Regroupement, couleur, densité et champs visibles.",
796
+ viewSettingsHint: "Regroupement, couleur, densité et champs visibles. S’applique à tous les utilisateurs de cette vue.",
604
797
  addGroup: "Ajouter un champ de groupe",
605
798
  collapsedByDefault: "Réduit par défaut",
606
799
  removeGroup: "Supprimer",
@@ -665,6 +858,17 @@ const fr = {
665
858
  },
666
859
  gantt: {
667
860
  rowLabel: "Éléments",
861
+ unusableRange: {
862
+ malformedDate: "Plage de dates du gantt inutilisable — {{path}} vaut {{value}}, ce qui n'est pas une date valide. Toutes les dates du gantt doivent être analysables : startDate et endDate de chaque élément de ligne, ainsi que tout minDate / maxDate fixé sur le schéma.",
863
+ malformedRow: "Lignes du gantt inutilisables — {{path}} vaut {{value}}, ce qui n'est pas la forme d'une ligne. Un gantt lit items comme une liste de lignes, chaque ligne comme un objet avec un label et ses propres items, et les items de chaque ligne comme une liste de barres ; un null, un nombre, une chaîne ou un objet simple à l'un de ces emplacements ne peut pas être dessiné.",
864
+ inverted: "Plage de dates du gantt inutilisable — minDate {{minDate}} est postérieur à maxDate {{maxDate}}. Un minDate / maxDate fixé l'emporte sur la plage calculée à partir des lignes ; cet axe n'a donc aucune colonne et aucune barre ne peut y être placée. Intervertissez les deux valeurs.",
865
+ },
866
+ },
867
+ unsupported: {
868
+ objectBoundGantt: "Variante « gantt » non prise en charge — une timeline liée à un objet affiche les variantes de flux ({{variants}}). Gantt nécessite des lignes littérales, chacune avec ses propres items imbriqués ; l'axe gantt (scale) est donc sans effet ici.",
869
+ },
870
+ unconfigured: {
871
+ noDateAxis: "Axe de dates requis pour la timeline — cette vue ne déclare aucun champ de date, et une timeline liée à un objet n'en invente pas. Déclarez l'un de : {{fields}}. Le premier est l'orthographe de la spec, les autres sont des alias hérités.",
668
872
  },
669
873
  },
670
874
  gantt: {
@@ -682,6 +886,7 @@ const fr = {
682
886
  },
683
887
  aria: {
684
888
  taskList: "Liste des tâches",
889
+ refreshing: "Actualisation…",
685
890
  },
686
891
  tooltip: {
687
892
  days: "j",
@@ -727,13 +932,22 @@ const fr = {
727
932
  conflict: {
728
933
  title: "Conflit de planning",
729
934
  body: "Ce déplacement entre en conflit avec les contraintes de dépendance. Replanifier automatiquement {{count}} tâche(s) concernée(s) ?",
935
+ body_one: "Ce déplacement entre en conflit avec les contraintes de dépendance. Replanifier automatiquement {{count}} tâche concernée ?",
936
+ body_many: "Ce déplacement entre en conflit avec les contraintes de dépendance. Replanifier automatiquement {{count}} de tâches concernées ?",
937
+ body_other: "Ce déplacement entre en conflit avec les contraintes de dépendance. Replanifier automatiquement {{count}} tâches concernées ?",
730
938
  confirm: "Replanifier automatiquement",
731
939
  cancel: "Laisser tel quel",
732
940
  },
733
941
  autoScheduleDlg: {
734
942
  title: "Planification automatique",
735
943
  body: "Décaler {{count}} tâche(s) plus tard pour respecter les liens de dépendance ?",
944
+ body_one: "Décaler {{count}} tâche plus tard pour respecter les liens de dépendance ?",
945
+ body_many: "Décaler {{count}} de tâches plus tard pour respecter les liens de dépendance ?",
946
+ body_other: "Décaler {{count}} tâches plus tard pour respecter les liens de dépendance ?",
736
947
  skipped: "{{count}} tâche(s) verrouillée(s) violent aussi les liens et ont été ignorées.",
948
+ skipped_one: "{{count}} tâche verrouillée viole aussi les liens et a été ignorée.",
949
+ skipped_many: "{{count}} de tâches verrouillées violent aussi les liens et ont été ignorées.",
950
+ skipped_other: "{{count}} tâches verrouillées violent aussi les liens et ont été ignorées.",
737
951
  confirm: "Appliquer",
738
952
  cancel: "Annuler",
739
953
  none: "Toutes les dépendances sont respectées — rien à replanifier.",
@@ -812,6 +1026,7 @@ const fr = {
812
1026
  tabActionsFor: "Actions de vue pour {{name}}",
813
1027
  readonlyAriaLabel: "Vue en lecture seule",
814
1028
  readonlyTooltip: "Vue système — définie dans le code, en lecture seule.",
1029
+ malformedFilter: "Le filtre de cette vue est incorrect, aucun enregistrement n’est donc affiché : la condition {{subject}} ne peut pas être appliquée.",
815
1030
  },
816
1031
  designer: {
817
1032
  undo: "Annuler",
@@ -839,7 +1054,9 @@ const fr = {
839
1054
  pageHeaderActions: "Actions de l'en-tête de page",
840
1055
  emojiPicker: "Sélecteur d'émojis",
841
1056
  reactionCount: "{{emoji}} {{count}} réactions",
842
- reactionCountOne: "{{emoji}} {{count}} réaction",
1057
+ reactionCount_one: "{{emoji}} {{count}} réaction",
1058
+ reactionCount_many: "{{emoji}} {{count}} de réactions",
1059
+ reactionCount_other: "{{emoji}} {{count}} réactions",
843
1060
  recordDetail: "Détail de l'enregistrement",
844
1061
  recordDetailWithLabel: "Détail — {{label}}",
845
1062
  openAsFullPage: "Ouvrir en pleine page",
@@ -866,7 +1083,6 @@ const fr = {
866
1083
  viewAll: "Tout afficher",
867
1084
  new: "Nouveau",
868
1085
  add: "Ajouter",
869
- emptyValue: "—",
870
1086
  comments: "Commentaires",
871
1087
  searchComments: "Rechercher des commentaires…",
872
1088
  addCommentPlaceholder: "Ajouter un commentaire… (Ctrl+Entrée pour envoyer)",
@@ -877,11 +1093,22 @@ const fr = {
877
1093
  unpin: "Désépingler",
878
1094
  justNow: "à l'instant",
879
1095
  minutesAgo: "il y a {{count}} min",
1096
+ minutesAgo_one: "il y a {{count}} min",
1097
+ minutesAgo_many: "il y a {{count}} min",
1098
+ minutesAgo_other: "il y a {{count}} min",
880
1099
  hoursAgo: "il y a {{count}} h",
1100
+ hoursAgo_one: "il y a {{count}} h",
1101
+ hoursAgo_many: "il y a {{count}} h",
1102
+ hoursAgo_other: "il y a {{count}} h",
881
1103
  daysAgo: "il y a {{count}} j",
1104
+ daysAgo_one: "il y a {{count}} j",
1105
+ daysAgo_many: "il y a {{count}} j",
1106
+ daysAgo_other: "il y a {{count}} j",
882
1107
  dropFilesToUpload: "Déposez les fichiers ici ou cliquez pour télécharger",
883
1108
  attachmentCount: "{{count}} pièce jointe",
884
- attachmentCountPlural: "{{count}} pièces jointes",
1109
+ attachmentCount_one: "{{count}} pièce jointe",
1110
+ attachmentCount_many: "{{count}} de pièces jointes",
1111
+ attachmentCount_other: "{{count}} pièces jointes",
885
1112
  removeAttachment: "Supprimer la pièce jointe",
886
1113
  // Record Attachments panel (enable.files, objectstack#4358)
887
1114
  attachments: "Pièces jointes",
@@ -895,11 +1122,10 @@ const fr = {
895
1122
  attachmentDownloadDenied: "Vous n'avez pas accès pour télécharger cette pièce jointe.",
896
1123
  attachmentAuthRequired: "Veuillez vous connecter pour télécharger cette pièce jointe.",
897
1124
  attachmentPermissionDenied: "Vous n'avez pas la permission de faire cela.",
898
- unifiedDiff: "Vue unifiée",
899
- sideBySideDiff: "Vue côte à côte",
900
- noChanges: "Aucune modification",
901
- previousVersion: "Précédent",
902
- currentVersion: "Actuel",
1125
+ attachmentsAccessDenied: "Vous n'avez pas accès à ces pièces jointes.",
1126
+ attachmentsLoadFailed: "Impossible de charger les pièces jointes de cet enregistrement.",
1127
+ attachmentsApiUnavailable: "La liste des pièces jointes n'est pas disponible sur cet objet.",
1128
+ retryLoadAttachments: "Réessayer",
903
1129
  discussion: "Discussion",
904
1130
  showDiscussion: "Afficher la discussion ({{count}})",
905
1131
  hideDiscussion: "Masquer la discussion",
@@ -914,25 +1140,36 @@ const fr = {
914
1140
  writeComment: "Écrire un commentaire…",
915
1141
  subscribedTooltip: "Abonné — cliquez pour vous désabonner",
916
1142
  unsubscribedTooltip: "S'abonner aux notifications",
917
- firstRecord: "Premier enregistrement (Début)",
918
- previousRecordKey: "Enregistrement précédent (←)",
919
- nextRecordKey: "Enregistrement suivant (→)",
920
- lastRecord: "Dernier enregistrement (Fin)",
921
1143
  noRecords: "Aucun enregistrement",
922
- searchWhileNavigating: "Rechercher pendant la navigation",
923
- searchRecords: "Rechercher des enregistrements…",
924
1144
  allActivity: "Toute l'activité",
925
1145
  commentsOnly: "Commentaires uniquement",
926
1146
  fieldChangesFilter: "Modifications de champs",
927
1147
  tasksOnly: "Tâches uniquement",
928
1148
  leaveCommentPlaceholder: "Laisser un commentaire… (Ctrl+Entrée pour envoyer)",
929
1149
  noActivity: "Aucune activité enregistrée",
1150
+ activityAccessDenied: "Vous n'avez pas l'autorisation de consulter l'activité de cet enregistrement.",
1151
+ commentsAccessDenied: "Vous n'avez pas l'autorisation de consulter les commentaires de cet enregistrement.",
1152
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1153
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1154
+ // sentences, which are assembled in code and so need interpolation holes.
1155
+ allFilter: 'Tout',
1156
+ createsFilter: 'Créations',
1157
+ deletesFilter: 'Suppressions',
1158
+ statusChangesFilter: 'Changements de statut',
1159
+ activityEmptyValue: '(vide)',
1160
+ activityFieldChanged: '{{field}} modifié de « {{old}} » à « {{new}} »',
1161
+ activityCreated: 'A créé cet enregistrement',
1162
+ activityDeleted: 'A supprimé cet enregistrement',
1163
+ activityStatusChanged: 'A changé le statut en « {{value}} »',
1164
+ activityUpdated: 'A mis à jour l\'enregistrement',
930
1165
  loadMore: "Charger plus",
931
1166
  edited: "(modifié)",
932
1167
  via: "via {{source}}",
933
1168
  viewSource: "Voir la source",
934
1169
  replyCount: "{{count}} réponse",
935
- replyCountPlural: "{{count}} réponses",
1170
+ replyCount_one: "{{count}} réponse",
1171
+ replyCount_many: "{{count}} de réponses",
1172
+ replyCount_other: "{{count}} réponses",
936
1173
  replyPlaceholder: "Répondre…",
937
1174
  filterActivity: "Filtrer l'activité",
938
1175
  openDiscussion: "Ouvrir le panneau de discussion",
@@ -946,6 +1183,9 @@ const fr = {
946
1183
  writeStrippedTitle: "Enregistré — mais certains champs n'ont pas été appliqués",
947
1184
  writeStrippedReadonly: "En lecture seule, donc non appliqué : {{fields}}",
948
1185
  writeStrippedByState: "Non modifiable dans l'état actuel de cet enregistrement, donc non appliqué : {{fields}}",
1186
+ writeStrippedPrimaryKey: "L'identifiant de l'enregistrement ne peut pas être modifié lors d'un enregistrement, donc non appliqué : {{fields}}",
1187
+ writeStrippedComputed: "Calculé par le serveur à partir d'une formule, donc la valeur envoyée n'a pas été appliquée : {{fields}}",
1188
+ writeStrippedUnknownReason: "Non appliqué par le serveur : {{fields}}",
949
1189
  approvalPendingEditable: "En approbation · modifiable",
950
1190
  approvalPendingTooltip: "Cet enregistrement a une demande d'approbation en attente ; cette étape autorise encore la modification",
951
1191
  approvalProgress: "Approbations — {{got}} sur {{need}}",
@@ -958,7 +1198,16 @@ const fr = {
958
1198
  cancelApprovalTooltipUnlocked: "Annuler la demande d'approbation en attente",
959
1199
  cancelApprovalFailed: "Échec de l'annulation de l'approbation",
960
1200
  cancelApprovalUnavailable: "L'annulation des approbations n'est pas prise en charge par cette source de données",
1201
+ pathLabel: "Parcours de l'enregistrement",
1202
+ pathStageCompleted: '{{stage}}, terminée',
1203
+ pathStageCurrent: '{{stage}}, étape actuelle',
1204
+ pathStageUpcoming: '{{stage}}, à venir',
1205
+ pathStageLostCurrent: '{{stage}}, perdue, étape actuelle',
1206
+ pathStageLostUpcoming: '{{stage}}, perdue, non atteinte',
1207
+ pathStageWonUpcoming: '{{stage}}, étape objectif, non atteinte',
961
1208
  linkCopied: "Lien copié dans le presse-papiers",
1209
+ commentFailed: "Votre commentaire n'a pas été publié. Rien n'a été enregistré — veuillez réessayer.",
1210
+ reactionFailed: "Votre réaction n'a pas été enregistrée. Veuillez réessayer.",
962
1211
  linkCopyFailed: "Impossible de copier le lien",
963
1212
  cancel: "Annuler",
964
1213
  cancelEdit: "Abandonner les modifications",
@@ -988,99 +1237,68 @@ const fr = {
988
1237
  sortBy: "Trier par",
989
1238
  filterPlaceholder: "Filtrer…",
990
1239
  highlightFields: "Champs clés",
1240
+ highlightsLabel: "Champs clés de l'enregistrement",
991
1241
  createdBy: "Créé par",
992
1242
  updatedBy: "Mis à jour par",
993
- // objectui#3863 — base key. fr has a third category, `many`, which CLDR uses from
994
- // a million up; the plural form is correct there, so the base repeats `_other`
995
- // rather than restructuring (unlike ru/ar, whose unenumerated categories cover
996
- // everyday counts).
1243
+ // objectui#3863 — base key, answering only a call made without a count. fr's
1244
+ // third category, `many` (exact millions), has its own slot since objectui#11432;
1245
+ // here it repeats `_other` because the count governs no noun ("de" goes before a
1246
+ // noun complement, and this label has none).
997
1247
  showEmptyRelated: "+ {{count}} vides",
998
1248
  showEmptyRelated_one: "+ {{count}} vide",
1249
+ showEmptyRelated_many: "+ {{count}} vides",
999
1250
  showEmptyRelated_other: "+ {{count}} vides",
1000
1251
  copyEmail: "Copier l'e-mail",
1001
1252
  copyPhone: "Copier le téléphone",
1002
1253
  copyRecordId: "Copier l'ID",
1003
1254
  showEmptyFields: "Afficher {{count}} champs vides",
1255
+ showEmptyFields_one: "Afficher {{count}} champ vide",
1256
+ showEmptyFields_many: "Afficher {{count}} de champs vides",
1257
+ showEmptyFields_other: "Afficher {{count}} champs vides",
1004
1258
  hideEmptyFields: "Masquer les champs vides",
1005
1259
  noValue: "Aucune valeur",
1260
+ unresolvedReference: "Référence non résolue : {{value}} n'a pas été résolue en utilisateur",
1261
+ unresolvedLookupReference: "Référence non résolue : {{value}} n'a pas été résolue en enregistrement sur cet écran",
1262
+ repeaterItemCount: "{{count}} éléments",
1263
+ repeaterItemCount_one: "{{count}} élément",
1264
+ repeaterItemCount_many: "{{count}} d'éléments",
1265
+ repeaterItemCount_other: "{{count}} éléments",
1266
+ fileCount: "{{count}} fichiers",
1267
+ fileCount_one: "{{count}} fichier",
1268
+ fileCount_many: "{{count}} de fichiers",
1269
+ fileCount_other: "{{count}} fichiers",
1006
1270
  },
1007
1271
  chart: {
1008
- noData: "Aucune donnée de graphique disponible",
1009
1272
  loading: "Chargement du graphique…",
1273
+ refreshing: "Actualisation…",
1010
1274
  nullCategory: "(Non défini)",
1011
- },
1012
- map: {
1013
- searchLocations: "Rechercher des lieux…",
1014
- locationDetails: "Détails du lieu",
1015
- markersCount: "{{count}} marqueurs",
1016
- invalidCoordinates: "{{count}} enregistrement avec des coordonnées manquantes ou invalides exclu de la carte.",
1017
- invalidCoordinatesPlural: "{{count}} enregistrements avec des coordonnées manquantes ou invalides exclus de la carte.",
1018
- },
1019
- workflow: {
1020
- draft: "Brouillon",
1021
- active: "Actif",
1022
- paused: "En pause",
1023
- completed: "Terminé",
1024
- cancelled: "Annulé",
1025
- save: "Enregistrer",
1026
- publish: "Publier",
1027
- addNode: "Ajouter un nœud",
1028
- workflowFlow: "Flux de travail",
1029
- properties: "Propriétés",
1030
- connections: "Connexions",
1031
- quickConnect: "Connexion rapide",
1032
- fromPlaceholder: "De…",
1033
- toPlaceholder: "Vers…",
1034
- connect: "Connecter",
1035
- label: "Libellé",
1036
- type: "Type",
1037
- description: "Description",
1038
- assignee: "Responsable",
1039
- assigneeType: "Type de responsable",
1040
- user: "Utilisateur",
1041
- role: "Rôle",
1042
- group: "Groupe",
1043
- expression: "Expression",
1044
- timeoutMinutes: "Délai (minutes)",
1045
- selectNodeToEdit: "Sélectionnez un nœud pour modifier ses propriétés",
1046
- workflowTitle: "Titre du workflow",
1047
- newWorkflow: "Nouveau workflow",
1048
- outConnections: "{{count}} sortie(s)",
1049
- start: "Début",
1050
- end: "Fin",
1051
- task: "Tâche",
1052
- userTask: "Tâche utilisateur",
1053
- serviceTask: "Tâche service",
1054
- scriptTask: "Tâche script",
1055
- approval: "Approbation",
1056
- condition: "Condition",
1057
- parallelGateway: "Passerelle parallèle",
1058
- joinGateway: "Passerelle de jonction",
1059
- boundaryEvent: "Événement limite",
1060
- delay: "Délai",
1061
- notification: "Notification",
1062
- webhook: "Webhook",
1063
- allowConcurrency: "Autoriser (exécution simultanée)",
1064
- forbidConcurrency: "Interdire (ignorer les nouveaux)",
1065
- replaceConcurrency: "Remplacer (annuler les existants)",
1066
- queueConcurrency: "File d'attente (exécuter après)",
1067
- conditionEvent: "Condition",
1068
- manualEvent: "Manuel",
1069
- webhookEvent: "Webhook",
1070
- timerEvent: "Minuterie",
1071
- signalEvent: "Signal",
1072
- versionHistory: "Historique des versions",
1073
- importBpmn: "Importer BPMN",
1074
- exportBpmn: "Exporter BPMN",
1075
- undo: "Annuler",
1076
- redo: "Rétablir",
1077
- resetZoom: "Réinitialiser le zoom",
1275
+ scatterOneMeasure: "Un nuage de points trace une seule mesure. Ne conservez qu’une série :",
1276
+ unconfigured: {
1277
+ noCategoryAxis: "Axe de catégories requis — un graphique lié à un objet n’en invente pas. Déclarez l’un des suivants :",
1278
+ },
1078
1279
  },
1079
1280
  dashboard: {
1080
- noRows: "Aucune ligne",
1281
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1282
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1283
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1284
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1285
+ // read them. The copy here has to read as a state rather than a failure,
1286
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1287
+ // punctuation so the call site concatenates no separator (see
1288
+ // `WidgetEmptyState`).
1289
+ empty: {
1290
+ title: "Pas encore de données",
1291
+ message: "Ce widget s'est chargé correctement, mais la requête n'a encore renvoyé aucun enregistrement.",
1292
+ sourceLabel: "Source de données :",
1293
+ },
1081
1294
  loading: "Chargement…",
1295
+ refreshing: "Actualisation…",
1296
+ refreshAll: "Tout actualiser",
1297
+ refreshDashboard: "Actualiser le tableau de bord",
1082
1298
  pickMeasures: "Choisissez des mesures (valeurs) pour ce widget de dataset.",
1083
1299
  datasetUnsupported: "Cette source de données ne prend pas en charge les requêtes de dataset.",
1300
+ widgetForbiddenTitle: "Accès refusé",
1301
+ widgetForbiddenMessage: "Vous n’avez pas l’autorisation de voir les données de ce widget.",
1084
1302
  details: "Détails",
1085
1303
  exportCsv: "Exporter en CSV",
1086
1304
  openInList: "Ouvrir dans la liste",
@@ -1108,13 +1326,110 @@ const fr = {
1108
1326
  },
1109
1327
  },
1110
1328
  addWidget: "Ajouter un widget",
1111
- removeWidget: "Supprimer un widget",
1112
1329
  editLayout: "Modifier la mise en page",
1113
1330
  saveLayout: "Enregistrer la mise en page",
1114
1331
  resetLayout: "Réinitialiser la mise en page",
1115
1332
  total: "Total",
1116
- noDataAvailable: "Aucune donnée disponible",
1117
1333
  noDataSourceFor: "Aucune source de données pour",
1334
+ config: {
1335
+ breadcrumb: {
1336
+ dashboard: "Tableau de bord",
1337
+ configuration: "Configuration",
1338
+ widget: "Widget",
1339
+ chart: "Graphique",
1340
+ table: "Tableau",
1341
+ pivotTable: "Tableau croisé",
1342
+ },
1343
+ section: {
1344
+ general: "Général",
1345
+ layout: "Disposition",
1346
+ data: "Données",
1347
+ dataBinding: "Liaison de données",
1348
+ appearance: "Apparence",
1349
+ },
1350
+ field: {
1351
+ title: "Titre",
1352
+ description: "Description",
1353
+ columns: "Colonnes",
1354
+ gap: "Espacement",
1355
+ rowHeight: "Hauteur de ligne (px)",
1356
+ autoRefresh: "Actualisation automatique",
1357
+ showDescription: "Afficher la description",
1358
+ theme: "Thème",
1359
+ widgetType: "Type de widget",
1360
+ colorVariant: "Variante de couleur",
1361
+ dataset: "Jeu de données",
1362
+ dimensions: "Dimensions",
1363
+ values: "Valeurs",
1364
+ width: "Largeur (colonnes)",
1365
+ height: "Hauteur (lignes)",
1366
+ },
1367
+ placeholder: {
1368
+ dashboardTitle: "Titre du tableau de bord",
1369
+ dashboardDescription: "Résumé court affiché sous le titre",
1370
+ widgetTitle: "Titre du widget",
1371
+ widgetDescription: "Description du widget",
1372
+ datasetName: "Nom du jeu de données",
1373
+ selectDataset: "Sélectionner un jeu de données…",
1374
+ searchDatasets: "Rechercher des jeux de données…",
1375
+ addDimension: "Ajouter une dimension…",
1376
+ addMeasure: "Ajouter une mesure…",
1377
+ searchMembers: "Rechercher…",
1378
+ },
1379
+ empty: {
1380
+ datasets: "Aucun jeu de données trouvé.",
1381
+ dimensions: "Aucune dimension sélectionnée.",
1382
+ measures: "Aucune mesure sélectionnée.",
1383
+ nothingToAdd: "Plus rien à ajouter.",
1384
+ },
1385
+ help: {
1386
+ dataset: "Le jeu de données de la couche sémantique auquel ce widget est lié (ADR-0021).",
1387
+ dimensions: "Grouper/diviser les valeurs selon ces dimensions du jeu de données.",
1388
+ dimensionsPivot: "Champs de groupement/division. La dernière dimension se déploie en colonnes.",
1389
+ values: "Mesures du jeu de données à afficher (au moins une).",
1390
+ },
1391
+ action: {
1392
+ add: "Ajouter",
1393
+ remove: "Supprimer {{name}}",
1394
+ },
1395
+ refresh: {
1396
+ off: "Désactivé",
1397
+ every30s: "Toutes les 30 s",
1398
+ every1m: "Toutes les minutes",
1399
+ every5m: "Toutes les 5 min",
1400
+ every15m: "Toutes les 15 min",
1401
+ every30m: "Toutes les 30 min",
1402
+ every1h: "Toutes les heures",
1403
+ },
1404
+ themeOption: {
1405
+ light: "Clair",
1406
+ dark: "Sombre",
1407
+ auto: "Automatique",
1408
+ },
1409
+ widgetType: {
1410
+ metric: "Indicateur",
1411
+ bar: "Graphique à barres",
1412
+ horizontalBar: "Barres horizontales",
1413
+ line: "Graphique en courbes",
1414
+ pie: "Graphique circulaire",
1415
+ donut: "Graphique en anneau",
1416
+ area: "Graphique en aires",
1417
+ scatter: "Nuage de points",
1418
+ funnel: "Entonnoir",
1419
+ table: "Tableau",
1420
+ pivot: "Tableau croisé",
1421
+ },
1422
+ color: {
1423
+ default: "Par défaut",
1424
+ blue: "Bleu",
1425
+ teal: "Sarcelle",
1426
+ orange: "Orange",
1427
+ purple: "Violet",
1428
+ success: "Succès",
1429
+ warning: "Avertissement",
1430
+ danger: "Danger",
1431
+ },
1432
+ },
1118
1433
  trend: {
1119
1434
  vsLastQuarter: "vs. trimestre dernier",
1120
1435
  vsLastMonth: "vs. mois dernier",
@@ -1124,24 +1439,6 @@ const fr = {
1124
1439
  vsPreviousPeriod: "vs. période précédente",
1125
1440
  },
1126
1441
  },
1127
- configPanel: {
1128
- save: "Enregistrer",
1129
- discard: "Annuler",
1130
- close: "Fermer",
1131
- layout: "Disposition",
1132
- columns: "Colonnes",
1133
- gap: "Espacement",
1134
- rowHeight: "Hauteur de ligne",
1135
- data: "Données",
1136
- refreshInterval: "Intervalle de rafraîchissement",
1137
- appearance: "Apparence",
1138
- title: "Titre",
1139
- showDescription: "Afficher la description",
1140
- theme: "Thème",
1141
- configuration: "Configuration",
1142
- general: "Général",
1143
- advanced: "Avancé",
1144
- },
1145
1442
  appDesigner: {
1146
1443
  createApp: "Créer une application",
1147
1444
  editApp: "Modifier l'application",
@@ -1154,10 +1451,6 @@ const fr = {
1154
1451
  appDescription: "Description",
1155
1452
  appIcon: "Icône",
1156
1453
  template: "Modèle",
1157
- layout: "Disposition",
1158
- layoutSidebar: "Barre latérale",
1159
- layoutHeader: "En-tête",
1160
- layoutEmpty: "Vide",
1161
1454
  selectObjects: "Sélectionner des objets",
1162
1455
  searchObjects: "Rechercher des objets…",
1163
1456
  selectAll: "Tout sélectionner",
@@ -1166,7 +1459,6 @@ const fr = {
1166
1459
  addGroup: "Ajouter un groupe",
1167
1460
  addUrl: "Ajouter une URL",
1168
1461
  addSeparator: "Ajouter un séparateur",
1169
- noNavItems: "Aucun élément de navigation pour l'instant.",
1170
1462
  logoUrl: "URL du logo",
1171
1463
  primaryColor: "Couleur principale",
1172
1464
  faviconUrl: "URL du favicon",
@@ -1192,16 +1484,13 @@ const fr = {
1192
1484
  showSort: "Afficher le tri",
1193
1485
  appearance: "Apparence",
1194
1486
  rowHeight: "Hauteur de ligne",
1195
- stripedRows: "Lignes alternées",
1196
- bordered: "Avec bordure",
1197
1487
  livePreview: "Aperçu en direct",
1198
- stepBasicDesc: "Nom, titre et mise en page",
1488
+ stepBasicDesc: "Nom, titre et icône",
1199
1489
  stepObjectsDesc: "Sélectionner les objets métier",
1200
1490
  stepNavigationDesc: "Construire l'arbre de navigation",
1201
1491
  stepBrandingDesc: "Logo, couleurs et favicon",
1202
1492
  noObjectsFound: "Aucun objet trouvé.",
1203
1493
  noNavItemsHint: "Pas encore d'éléments de navigation. Sélectionnez des objets à l'étape précédente ou ajoutez-en manuellement.",
1204
- separator: "Séparateur",
1205
1494
  separatorLabel: "— Séparateur —",
1206
1495
  newGroup: "Nouveau groupe",
1207
1496
  newLink: "Nouveau lien",
@@ -1235,6 +1524,7 @@ const fr = {
1235
1524
  navTypeSeparator: "Séparateur",
1236
1525
  navTypeAction: "Action",
1237
1526
  navTypeComponent: "Composant",
1527
+ navTypeDoc: "Document",
1238
1528
  navEditIcon: "Modifier l'icône",
1239
1529
  navToggleVisible: "Basculer la visibilité",
1240
1530
  navHidden: "Masqué",
@@ -1307,17 +1597,13 @@ const fr = {
1307
1597
  unique: "Unique",
1308
1598
  readOnly: "Lecture seule",
1309
1599
  hidden: "Masqué",
1310
- indexed: "Indexé",
1311
1600
  externalId: "ID externe",
1312
1601
  trackHistory: "Suivre l'historique",
1313
1602
  defaultValue: "Valeur par défaut",
1314
1603
  placeholder: "Espace réservé",
1315
1604
  referenceTo: "Référence à",
1316
- formula: "Formule",
1317
1605
  options: "Options",
1318
1606
  addOption: "Ajouter une option",
1319
- validationRules: "Règles de validation",
1320
- addRule: "Ajouter une règle",
1321
1607
  systemBadge: "Système",
1322
1608
  ungrouped: "Général",
1323
1609
  deleteConfirmTitle: "Supprimer le champ ?",
@@ -1336,7 +1622,23 @@ const fr = {
1336
1622
  },
1337
1623
  },
1338
1624
  console: {
1625
+ studio: {
1626
+ backToHome: "Retour à l'accueil",
1627
+ },
1339
1628
  saveAdvisoryTitle: "Enregistré — le contrôle de création a signalé {{count}} recommandation(s)",
1629
+ saveAdvisoryTitle_one: "Enregistré — le contrôle de création a signalé {{count}} recommandation",
1630
+ saveAdvisoryTitle_many: "Enregistré — le contrôle de création a signalé {{count}} de recommandations",
1631
+ saveAdvisoryTitle_other: "Enregistré — le contrôle de création a signalé {{count}} recommandations",
1632
+ publishAdvisoryTitle: "Publié — le contrôle de création a signalé {{count}} recommandation(s)",
1633
+ publishAdvisoryTitle_one: "Publié — le contrôle de création a signalé {{count}} recommandation",
1634
+ publishAdvisoryTitle_many: "Publié — le contrôle de création a signalé {{count}} de recommandations",
1635
+ publishAdvisoryTitle_other: "Publié — le contrôle de création a signalé {{count}} recommandations",
1636
+ importMappingsUnavailable: "Impossible de charger les mappages d’import enregistrés pour {{object}}",
1637
+ importMappingsRefused: "Le serveur a refusé cette requête : cette liste est donc vide parce qu’elle n’a pas pu être lue, et non parce que rien n’est enregistré. Reconnectez-vous ou demandez un accès à un administrateur.",
1638
+ importMappingsUnreadable: "Cette liste est vide parce qu’elle n’a pas pu être lue, et non parce que rien n’est enregistré. Réessayez, et signalez le problème s’il persiste.",
1639
+ savedViewsUnavailable: "Impossible de charger les vues enregistrées pour {{object}}",
1640
+ savedViewsRefused: "Le serveur a refusé cette requête : cette liste est donc vide parce qu’elle n’a pas pu être lue, et non parce que cet objet n’aurait aucune vue enregistrée. Reconnectez-vous ou demandez un accès à un administrateur.",
1641
+ savedViewsUnreadable: "Cette liste est vide parce qu’elle n’a pas pu être lue, et non parce que cet objet n’aurait aucune vue enregistrée. Réessayez, et signalez le problème s’il persiste.",
1340
1642
  settingsHub: {
1341
1643
  title: "Paramètres",
1342
1644
  subtitle: "Configurez votre espace de travail, vos intégrations et vos indicateurs de fonctionnalité.",
@@ -1381,6 +1683,13 @@ const fr = {
1381
1683
  passwordsDownload: "Télécharger le CSV",
1382
1684
  },
1383
1685
  ai: {
1686
+ pendingDrafts: {
1687
+ count: "{{count}} modification(s) ne sont pas encore publiée(s) — les utilisateurs ne peuvent pas les voir.",
1688
+ publish: "Publier",
1689
+ published: "Toutes les modifications en attente sont actives.",
1690
+ failed: "Échec de la publication.",
1691
+ publishedWithFindings: "Publié, mais les contrôles d'exécution ont signalé des problèmes : {{detail}}",
1692
+ },
1384
1693
  usage: {
1385
1694
  title: "Utilisation de l'IA",
1386
1695
  meterBuild: "Créer",
@@ -1390,9 +1699,18 @@ const fr = {
1390
1699
  statusFull: "Limite atteinte",
1391
1700
  resetsDaily: "Réinitialisation ce soir",
1392
1701
  resetsMonthly: "Réinitialisation au prochain cycle",
1702
+ resetsWeeklyDays: "Réinitialisation dans {{count}} jours",
1703
+ resetsWeeklyDays_one: "Réinitialisation dans {{count}} jour",
1704
+ resetsWeeklyDays_many: "Réinitialisation dans {{count}} de jours",
1705
+ resetsWeeklyDays_other: "Réinitialisation dans {{count}} jours",
1706
+ resetsWeeklyHours: "Réinitialisation dans {{count}} heures",
1707
+ resetsWeeklyHours_one: "Réinitialisation dans {{count}} heure",
1708
+ resetsWeeklyHours_many: "Réinitialisation dans {{count}} d'heures",
1709
+ resetsWeeklyHours_other: "Réinitialisation dans {{count}} heures",
1393
1710
  ctaUpgrade: "Passer à l'offre supérieure pour continuer",
1394
1711
  ctaTopUp: "Ajouter des crédits pour continuer",
1395
1712
  ariaLabel: "Utilisation de l'IA : {{status}}",
1713
+ breakdownTitle: "Utilisé jusqu'à présent",
1396
1714
  },
1397
1715
  workspaceTitle: "Espace de travail IA",
1398
1716
  workspaceSubtitle: "Posez des questions, inspectez et reprenez vos conversations",
@@ -1402,6 +1720,31 @@ const fr = {
1402
1720
  share: "Partager",
1403
1721
  shareTitle: "Partager cette conversation",
1404
1722
  shareDisabledTitle: "Commencez à discuter pour activer le partage",
1723
+ buildDoctor: "Diagnostic de build",
1724
+ buildDoctorTitle: "Diagnostic de build — qu'est-ce qui a réellement été appliqué ?",
1725
+ buildDoctorDisabledTitle: "Envoyez d'abord un message",
1726
+ buildDoctorDrawer: {
1727
+ description: "Ce que l'agent a annoncé face à ce qui est réellement en ligne. Diagnostic en lecture seule.",
1728
+ reconciling: 'Rapprochement…',
1729
+ notAvailable: "Non disponible — la conversation est introuvable ou vous n'êtes pas autorisé.",
1730
+ untitled: '(sans titre)',
1731
+ summary: '{{turns}} tour(s) · {{messages}} msg · {{tokens}} jetons · {{seconds}} s LLM',
1732
+ allLive: "Les {{count}} modification(s) tentée(s) sont en ligne — rien ne s'est perdu.",
1733
+ discrepancies: '{{count}} écart(s) — ce que le chat a annoncé ne correspond pas à ce qui est en ligne.',
1734
+ orphanedTitle: 'Proposé mais jamais appliqué',
1735
+ orphanedHint: "Une carte de confirmation proposée par l'agent qu'aucun tour ultérieur n'a appliquée — la modification s'est perdue silencieusement.",
1736
+ missingTitle: 'Annoncé mais absent',
1737
+ missingHint: "Un résultat d'outil indiquait une application, mais l'artefact n'est pas en ligne dans sys_metadata.",
1738
+ toolErrorsTitle: "Erreurs d'outils",
1739
+ toolErrorsHint: "Appels d'outils ayant renvoyé une erreur pendant le build.",
1740
+ verifyTitle: 'Vérification du build (verify_build)',
1741
+ yourApp: 'Votre application :',
1742
+ noIssues: '0 problème',
1743
+ issueCount: '{{count}} problème(s)',
1744
+ platformNoise: '{{count}} constat(s) sys_* de la plateforme masqué(s)',
1745
+ pendingActions: 'Actions en attente',
1746
+ timeline: 'Chronologie ({{count}})',
1747
+ },
1405
1748
  newChat: "Nouveau",
1406
1749
  searchChats: "Rechercher des discussions…",
1407
1750
  noChatsYet: "Aucune discussion pour l'instant",
@@ -1431,7 +1774,7 @@ const fr = {
1431
1774
  empty: {
1432
1775
  build: {
1433
1776
  title: "Créer avec l'IA",
1434
- description: "Décrivez une application ou un flux de travail en langage courant — je rédige les objets, les écrans et les automatisations, puis vous vérifiez et publiez.",
1777
+ description: "Décrivez une application en langage courant — je rédige les objets, les écrans et les données d'exemple, puis vous vérifiez et publiez.",
1435
1778
  },
1436
1779
  ask: {
1437
1780
  title: "Interroger vos données",
@@ -1440,7 +1783,7 @@ const fr = {
1440
1783
  editApp: {
1441
1784
  title: "Modification de « {{app}} »",
1442
1785
  titleGeneric: "Modifier cette application",
1443
- description: "Que souhaitez-vous changer ? Je modifie cette application sur place — ajouter un champ, un objet, une vue ou une automatisation, ou ajuster l'existant.",
1786
+ description: "Que souhaitez-vous changer ? Je modifie cette application sur place — ajouter un champ, un objet, une vue ou un tableau de bord, ou ajuster l'existant.",
1444
1787
  },
1445
1788
  },
1446
1789
  clearConversation: "Effacer",
@@ -1493,29 +1836,52 @@ const fr = {
1493
1836
  recentRecords: "Liste les 5 enregistrements créés le plus récemment.",
1494
1837
  recordCounts: "Compte les enregistrements pour chaque objet.",
1495
1838
  },
1839
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1840
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1841
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1842
+ // wording that promises autonomous behaviour (alert / remind / notify /
1843
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1844
+ // the model silently degrades such a request into a board or a filtered
1845
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1846
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1496
1847
  metadataAssistant: {
1497
- buildCrm: "Crée un CRM commercial — clients, contacts et un pipeline d'affaires que je peux totaliser par étape.",
1498
- buildApp: "Crée un suivi de projets — projets, tâches avec responsables et échéances, et un tableau par statut.",
1499
- buildFlow: "Conçois un service d'assistance — tickets avec priorité, un flux de statuts et des liens vers les clients.",
1500
- buildInventory: "Crée une application de stock — produits, niveaux de stock, fournisseurs et visibilité des stocks faibles.",
1501
- buildRecruiting: "Crée un suivi de candidatures — candidats, postes ouverts, étapes d'entretien et notes.",
1848
+ buildCrm: "Crée un CRM commercial — clients, contacts et affaires avec un champ étape, plus un tableau de bord qui totalise le montant par étape.",
1849
+ buildApp: "Crée un suivi de projets — projets, tâches avec responsables et échéances, un tableau par statut et un calendrier des échéances.",
1850
+ buildFlow: "Conçois un service d'assistance — tickets avec des champs priorité et statut, un tableau par statut et des liens vers les clients.",
1851
+ buildInventory: "Crée une application de stock — produits, niveaux de stock, fournisseurs et une vue qui filtre les articles sous leur seuil de réapprovisionnement.",
1852
+ buildRecruiting: "Crée un suivi de candidatures — candidats, postes ouverts, un champ étape d'entretien et un tableau par étape.",
1502
1853
  },
1503
1854
  generic: {
1504
1855
  help: "En quoi peux-tu m'aider ?",
1505
1856
  availableObjects: "Liste les objets de données disponibles.",
1506
1857
  recentActivity: "Résume mon activité récente.",
1507
1858
  },
1859
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1860
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1861
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1862
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1863
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1864
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1865
+ // no data is what an existing app most often lacks. REVERT: when
1866
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1867
+ // comes back as `addAutomation`; the retired string is pinned for every
1868
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1508
1869
  editApp: {
1509
1870
  addField: "Ajoute un champ à l'un des objets.",
1510
1871
  addObject: "Ajoute un nouvel objet et relie-le à un objet existant.",
1511
1872
  addDashboard: "Ajoute un tableau de bord pour les indicateurs clés.",
1512
- addAutomation: "Ajoute une automatisation — une approbation, un flux de statuts ou une notification.",
1873
+ addSampleData: "Remplis les objets existants avec des données d'exemple réalistes pour que je puisse présenter l'application.",
1513
1874
  },
1514
1875
  },
1515
1876
  changesTitle: "Confirmer les modifications",
1516
1877
  changesConfirmed: "Confirmé",
1517
1878
  changesConfirm: "Confirmer",
1518
1879
  changesConfirmHint: "Répondez pour confirmer ou ajuster cette modification.",
1880
+ changesApplying: "Application…",
1881
+ changesApplied: "Appliqué",
1882
+ changesDrafted: "Enregistré comme brouillon",
1883
+ changesFailed: "Non appliqué",
1884
+ discussing: "Sujet : {{target}}",
1519
1885
  changeVerb: {
1520
1886
  createObject: "Créer un objet",
1521
1887
  addField: "Ajouter un champ",
@@ -1586,6 +1952,13 @@ const fr = {
1586
1952
  pages: "Pages",
1587
1953
  reports: "Rapports",
1588
1954
  system: "Système",
1955
+ marketplace: "Marketplace",
1956
+ settings: 'Paramètres',
1957
+ apps: 'Applications',
1958
+ profile: 'Profil',
1959
+ approvals: 'Approbations',
1960
+ aiApprovals: 'Approbations IA',
1961
+ auditLog: "Journal d'audit",
1589
1962
  },
1590
1963
  // objectui#4024 — the single-namespace settings screen. Its sibling
1591
1964
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1605,6 +1978,7 @@ const fr = {
1605
1978
  saveChanges: "Enregistrer les modifications",
1606
1979
  unsavedCount: "{{count}} modifications non enregistrées",
1607
1980
  unsavedCount_one: "{{count}} modification non enregistrée",
1981
+ unsavedCount_many: "{{count}} de modifications non enregistrées",
1608
1982
  unsavedCount_other: "{{count}} modifications non enregistrées",
1609
1983
  cryptoRefusalTitle: "Ce déploiement ne peut pas chiffrer les secrets",
1610
1984
  cryptoRefusalSubjectSuffix: "est déclaré chiffré, aucune écriture n'a donc eu lieu.",
@@ -1677,6 +2051,21 @@ const fr = {
1677
2051
  records: "Enregistrements",
1678
2052
  recentRecords: "Récemment consultés",
1679
2053
  },
2054
+ // objectui#9954 — see the `en` pack for what raises each case.
2055
+ readRate: {
2056
+ ratioTitle: 'Volume de lecture inhabituel dans cet environnement',
2057
+ ratio: '{{ratio}} lignes sont lues pour chaque ligne écrite. La plateforme signale tout ce qui dépasse {{threshold}}. Rien n’est limité ni bloqué ; il s’agit d’un rapport permettant d’examiner le schéma de lecture.',
2058
+ noWritesTitle: 'Lectures sans aucune écriture dans cet environnement',
2059
+ noWrites: 'Des lignes sont lues alors qu’aucune n’est écrite, de sorte que le taux de lecture n’a aucune limite supérieure. C’est la mesure la plus grave. La plateforme signale tout ce qui dépasse {{threshold}}. Rien n’est limité ni bloqué ; il s’agit d’un rapport permettant d’examiner le schéma de lecture.',
2060
+ },
2061
+ // objectui#10439 — see the `en` pack for what raises each case.
2062
+ storageUsage: {
2063
+ warningTitle: 'Le stockage est presque plein',
2064
+ warning: '{{used}} Mo sur {{limit}} Mo utilisés. Les envois et les importations sont suspendus dès que le stockage est plein.',
2065
+ blockedTitle: 'Stockage plein : les envois et les importations sont suspendus',
2066
+ blocked: "{{used}} Mo sur {{limit}} Mo utilisés. Les données existantes ne sont pas modifiées, et la lecture, l'export et la modification d'enregistrements individuels fonctionnent toujours.",
2067
+ upgrade: "Passer à l'offre supérieure pour continuer",
2068
+ },
1680
2069
  errors: {
1681
2070
  somethingWentWrong: "Quelque chose s'est mal passé",
1682
2071
  unexpectedError: "Une erreur inattendue est survenue lors du rendu de cette vue.",
@@ -1707,6 +2096,7 @@ const fr = {
1707
2096
  viewNameInvalid: "Utilisez des minuscules, des chiffres et des tirets bas ; commencez par une lettre ou un tiret bas.",
1708
2097
  systemViewReadonly: "Vue système définie dans le code — en lecture seule.",
1709
2098
  cannotEditMetaView: "Cette vue est intégrée et définie dans le code — elle ne peut pas être modifiée.",
2099
+ viewConfigPermissionDenied: "Les paramètres de vue s’appliquent à tous les utilisateurs de cette vue ; les modifier requiert donc l’autorisation « Gérer les métadonnées ». Demandez à un administrateur d’effectuer ce changement.",
1710
2100
  cannotDeleteMetaView: "Cette vue est intégrée et définie dans le code — elle ne peut pas être supprimée.",
1711
2101
  expandToPage: "Ouvrir en pleine page",
1712
2102
  objectNotFound: "Objet introuvable",
@@ -1715,101 +2105,35 @@ const fr = {
1715
2105
  filterOrNotSavable: "Ce filtre relie les conditions par OU, ce qu'une vue enregistrée ne peut pas encore stocker. Il s'applique toujours à cette liste — supprimez le groupement OU pour l'enregistrer dans la vue.",
1716
2106
  filterNestedNotSavable: "Ce filtre utilise des groupes de conditions imbriqués, qu'une vue enregistrée ne peut pas stocker. Aplatissez-le en une seule liste de conditions pour l'enregistrer dans la vue.",
1717
2107
  allRecords: "Tous les enregistrements",
1718
- exitDesignMode: "Quitter le mode conception",
1719
- enterDesignMode: "Entrer en mode conception",
1720
- metadataInspector: "Inspecteur de métadonnées",
1721
- editView: "Modifier la vue",
1722
- addView: "Ajouter une vue",
1723
- designTools: "Outils de conception",
1724
2108
  new: "Nouveau",
1725
2109
  configureView: "Configurer la vue",
1726
- closePanel: "Fermer le panneau",
1727
- page: "Page",
1728
- pageConfigHint: "Barre d'outils, navigation et paramètres du shell de vue",
1729
- listConfigHint: "Rendu des données, colonnes et apparence pour ce type de liste",
1730
- general: "Général",
1731
- generalHint: "Titre, description et type de la vue",
1732
- toolbar: "Barre d'outils",
1733
- toolbarHint: "Recherche, filtre, tri, regroupement et bascule de densité",
1734
2110
  toolbarEnabledCount: "{{count}} sur {{total}} activés",
1735
- navigationSection: "Navigation",
1736
- navigationHint: "Comportement au clic sur la ligne et paramètres de la vue détaillée",
1737
- records: "Enregistrements",
1738
- recordsHint: "Mode de sélection, ajout d'enregistrement et édition en ligne",
1739
- exportPrint: "Export et impression",
1740
- exportPrintHint: "Formats d'export, impression et affichage du nombre d'enregistrements",
1741
- showAllFields: "Tout afficher",
1742
- hideAllFields: "Tout masquer",
1743
2111
  searchFields: "Rechercher des champs…",
1744
2112
  title: "Titre",
1745
- description: "Description",
1746
- data: "Données",
1747
- source: "Source",
1748
- columns: "Colonnes",
1749
- filterBy: "Filtrer par",
1750
- sortBy: "Trier par",
1751
- appearance: "Apparence",
1752
- showDescription: "Afficher la description",
1753
2113
  viewType: "Type de vue",
1754
- userFilters: "Filtres utilisateur",
1755
- enableSearch: "Activer la recherche",
1756
- enableFilter: "Activer le filtre",
1757
- enableSort: "Activer le tri",
1758
- enableHideFields: "Activer masquer les champs",
1759
- enableGroup: "Activer le regroupement",
1760
- enableColor: "Activer la couleur",
1761
- enableDensity: "Activer la densité",
1762
- userActions: "Actions utilisateur",
1763
- addRecordViaForm: "Ajouter des enregistrements via un formulaire",
1764
- advanced: "Avancé",
1765
- allowExport: "Autoriser l'exportation",
1766
2114
  recordCount: "{{count}} enregistrements",
1767
- noDescription: "Aucune description",
1768
- none: "Aucun",
1769
- columnsConfigured: "{{count}} colonnes",
2115
+ recordCount_one: "{{count}} enregistrement",
2116
+ recordCount_many: "{{count}} d'enregistrements",
2117
+ recordCount_other: "{{count}} enregistrements",
1770
2118
  save: "Enregistrer",
1771
2119
  discard: "Annuler",
1772
2120
  createView: "Créer une vue",
1773
2121
  newView: "Nouvelle vue",
1774
- typeOptions: "Options de type",
1775
2122
  groupByField: "Champ de regroupement",
1776
2123
  startDateField: "Champ de date de début",
1777
2124
  titleField: "Champ de titre",
1778
2125
  latitudeField: "Champ de latitude",
1779
2126
  longitudeField: "Champ de longitude",
1780
2127
  imageField: "Champ d'image",
1781
- dateField: "Champ de date",
1782
2128
  selectField: "Sélectionner un champ…",
1783
- gridOptionsHint: "La vue grille utilise les colonnes configurées ci-dessus.",
1784
- groupBy: "Regrouper par",
1785
- prefixField: "Champ de préfixe",
1786
- fields: "Champs",
1787
- fieldsVisible: "{{count}} visibles",
1788
- sortsCount: "{{count}} tris",
1789
- filtersCount: "{{count}} filtres",
1790
2129
  endDateField: "Champ de date de fin",
1791
- color: "Couleur",
1792
- fieldTextColor: "Couleur du texte du champ",
1793
- rowHeight: "Hauteur de ligne",
1794
- wrapHeaders: "Retour à la ligne des en-têtes",
1795
- showFieldDescriptions: "Afficher les descriptions des champs",
1796
- collapseAllByDefault: "Tout réduire par défaut",
1797
- striped: "Lignes rayées",
1798
- bordered: "Cellules bordées",
1799
- inlineEdit: "Modifier les enregistrements en ligne",
1800
- addDeleteRecordsInline: "Ajouter/supprimer des enregistrements en ligne",
1801
- clickIntoRecordDetails: "Cliquer pour les détails de l'enregistrement",
1802
- navigationMode: "Mode de navigation",
1803
- navigationWidth: "Largeur de navigation",
1804
- navigationWidthHint: "Disponible pour les modes de navigation tiroir, modale et partagée",
1805
- openNewTab: "Ouvrir dans un nouvel onglet",
1806
- openNewTabHint: "Disponible pour les modes de navigation page et nouvelle fenêtre",
1807
2130
  import: "Importer",
1808
2131
  importTitle: "Importer depuis CSV",
1809
2132
  importedToast: "{{count}} ligne(s) importée(s).",
2133
+ importedToast_one: "{{count}} ligne importée.",
2134
+ importedToast_many: "{{count}} de lignes importées.",
2135
+ importedToast_other: "{{count}} lignes importées.",
1810
2136
  importedWithSkipped: "{{ok}} ligne(s) importée(s) ; {{skipped}} ignorée(s).",
1811
- showAdvancedSettings: "Afficher les paramètres avancés",
1812
- showFewerSettings: "Afficher moins de paramètres",
1813
2137
  createViewDesc: "Choisissez un type de vue et donnez-lui un nom. Tous les paramètres peuvent être modifiés ensuite.",
1814
2138
  cancel: "Annuler",
1815
2139
  create: "Créer",
@@ -1817,6 +2141,9 @@ const fr = {
1817
2141
  deleteViewTitle: "Supprimer la vue",
1818
2142
  deleteViewConfirm: "Supprimer la vue \"{{name}}\" ? Ceci est irréversible.",
1819
2143
  bulkDeleteConfirm: "Supprimer {{count}} enregistrements sélectionnés ? Ceci est irréversible.",
2144
+ bulkDeleteConfirm_one: "Supprimer {{count}} enregistrement sélectionné ? Ceci est irréversible.",
2145
+ bulkDeleteConfirm_many: "Supprimer {{count}} d'enregistrements sélectionnés ? Ceci est irréversible.",
2146
+ bulkDeleteConfirm_other: "Supprimer {{count}} enregistrements sélectionnés ? Ceci est irréversible.",
1820
2147
  duplicateViewName: "Une vue avec ce nom existe déjà.",
1821
2148
  viewTypeGrid: "Grille",
1822
2149
  viewTypeGridDesc: "Tableau de type tableur d'enregistrements.",
@@ -1853,62 +2180,17 @@ const fr = {
1853
2180
  chartTypePie: "Graphique circulaire",
1854
2181
  chartTypeArea: "Graphique en aires",
1855
2182
  chartTypeScatter: "Nuage de points",
1856
- xAxisField: "Champ axe X",
1857
- xAxisFieldHelp: "La dimension catégorielle ou temporelle.",
1858
- yAxisField: "Champ axe Y",
1859
- yAxisFieldHelp: "Le champ numérique à agréger.",
1860
- selectionMode: "Mode de sélection",
1861
- selectionNone: "Aucun",
1862
- selectionSingle: "Unique",
1863
- selectionMultiple: "Multiple",
1864
- pageSize: "Taille de page",
1865
- pageSizeOptions: "Options de taille de page",
1866
- exportFormats: "Formats d'exportation",
1867
- exportMaxRecords: "Enregistrements max",
1868
- exportIncludeHeaders: "Inclure les en-têtes",
1869
- exportFileNamePrefix: "Préfixe du nom de fichier",
1870
- searchableFields: "Champs recherchables",
1871
- filterableFields: "Champs filtrables",
1872
- resizableColumns: "Colonnes redimensionnables",
1873
- densityCompact: "Compact",
1874
- densityComfortable: "Normal",
1875
- densitySpacious: "Spacieux",
1876
- densityMode: "Mode de densité",
1877
- hiddenFields: "Champs masqués",
1878
- rowActions: "Actions de ligne",
1879
- bulkActions: "Actions en masse",
1880
- sharing: "Partage",
1881
- sharingEnabled: "Partage activé",
1882
- sharingVisibility: "Visibilité",
1883
- addRecordEnabled: "Ajout d'enregistrement activé",
1884
- addRecordPosition: "Position",
1885
- addRecordMode: "Mode",
1886
- addRecordFormView: "Vue formulaire",
1887
- conditionalFormatting: "Mise en forme conditionnelle",
1888
- addRule: "Ajouter une règle",
1889
- quickFilters: "Filtres rapides",
1890
- addQuickFilter: "Ajouter un filtre rapide",
1891
- ufElements: "Éléments",
1892
- ufDropdown: "Liste déroulante",
2183
+ dataset: "Jeu de données",
2184
+ datasetHelp: "Le graphique lit ses valeurs dans ce jeu de données de l’objet.",
2185
+ chartMeasure: "Mesure",
2186
+ chartMeasureHelp: "La mesure du jeu de données tracée sur l’axe des valeurs.",
2187
+ chartDimension: "Dimension",
2188
+ chartDimensionHelp: "La dimension du jeu de données selon laquelle les valeurs sont regroupées (facultatif).",
2189
+ viewTypeUnavailableDataset: "Cet objet n’expose aucun jeu de données à représenter.",
2190
+ noDatasetMeasure: "Ce jeu de données ne déclare aucune mesure à représenter.",
1893
2191
  ufTabs: "Onglets",
1894
- ufToggle: "Bascule",
1895
2192
  ufAddField: "+ Ajouter un champ de filtre…",
1896
- ufNoFields: "Aucun champ disponible",
1897
- ufAddTab: "+ Ajouter un onglet",
1898
- ufTabLabel: "Étiquette",
1899
2193
  ufShowAllRecords: "Afficher l'onglet \"Tous les enregistrements\"",
1900
- ufAllowAddTab: "Autoriser l'ajout d'onglets",
1901
- showRecordCount: "Afficher le nombre d'enregistrements",
1902
- allowPrinting: "Autoriser l'impression",
1903
- virtualScroll: "Défilement virtuel",
1904
- emptyStateTitle: "Titre de l'état vide",
1905
- emptyStateMessage: "Message de l'état vide",
1906
- emptyStateIcon: "Icône de l'état vide",
1907
- ariaLabel: "Étiquette ARIA",
1908
- ariaDescribedBy: "Décrit par ARIA",
1909
- ariaLive: "ARIA en direct",
1910
- accessibility: "Accessibilité",
1911
- viewTabs: "Onglets de vue",
1912
2194
  },
1913
2195
  localeSwitcher: {
1914
2196
  label: "Langue",
@@ -1919,6 +2201,9 @@ const fr = {
1919
2201
  unpinItem: "Désépingler {{name}}",
1920
2202
  dragToReorder: "Glisser pour réorganiser",
1921
2203
  favorites: "Favoris",
2204
+ launcherLabel: "Lanceur d'applications",
2205
+ menuLabel: "Navigation de l'application",
2206
+ menuEmpty: "Cette application n'a aucune entrée de navigation que vous pouvez ouvrir.",
1922
2207
  },
1923
2208
  },
1924
2209
  auth: {
@@ -1972,6 +2257,8 @@ const fr = {
1972
2257
  resendOtpCountdownText: "Renvoyer dans {seconds} s",
1973
2258
  usePhoneOtpText: "Se connecter avec un code de vérification",
1974
2259
  usePasswordSignInText: "Se connecter avec un mot de passe à la place",
2260
+ socialButton: "Continuer avec {provider}",
2261
+ orText: "ou continuer avec l'e-mail",
1975
2262
  },
1976
2263
  register: {
1977
2264
  title: "Créer un compte",
@@ -1990,8 +2277,12 @@ const fr = {
1990
2277
  submittingButton: "Création du compte…",
1991
2278
  hasAccountText: "Vous avez déjà un compte ?",
1992
2279
  signInText: "Se connecter",
2280
+ socialButton: "S'inscrire avec {provider}",
2281
+ orText: "ou continuer avec l'e-mail",
1993
2282
  errors: {
1994
2283
  userExists: "Un compte avec cet e-mail existe déjà. Essayez de vous connecter.",
2284
+ selfRegistrationClosed: "L'inscription libre n'est pas ouverte dans cet environnement. Demandez une invitation à un administrateur.",
2285
+ emailDomainNotAllowed: "Le domaine de cet e-mail n'est pas autorisé à s'inscrire ici. Utilisez l'e-mail de votre organisation ou demandez une invitation à un administrateur.",
1995
2286
  },
1996
2287
  verifyInbox: {
1997
2288
  title: "Vérifiez votre boîte de réception",
@@ -2010,7 +2301,7 @@ const fr = {
2010
2301
  submitButton: "Envoyer le lien de réinitialisation",
2011
2302
  submittingButton: "Envoi en cours…",
2012
2303
  successTitle: "Vérifiez vos e-mails",
2013
- successDescription: "Nous avons envoyé un lien de réinitialisation du mot de passe à {{email}}. Veuillez vérifier votre boîte de réception.",
2304
+ successDescription: "Nous avons envoyé un lien de réinitialisation du mot de passe à {email}. Veuillez vérifier votre boîte de réception.",
2014
2305
  backToSignInText: "Retour à la connexion",
2015
2306
  rememberPasswordText: "Vous vous souvenez de votre mot de passe ?",
2016
2307
  signInText: "Se connecter",
@@ -2190,6 +2481,15 @@ const fr = {
2190
2481
  role: "Rôle",
2191
2482
  save: "Enregistrer les modifications",
2192
2483
  },
2484
+ language: {
2485
+ title: "Langue",
2486
+ description: "La langue utilisée pour les notifications et les messages qui vous sont envoyés. La langue de l'interface se choisit séparément, dans le menu du globe.",
2487
+ label: "Langue préférée",
2488
+ systemDefault: "Utiliser la valeur par défaut du déploiement",
2489
+ save: "Enregistrer",
2490
+ saved: "Préférence de langue mise à jour.",
2491
+ readOnly: "La langue de votre compte est gérée par votre administrateur.",
2492
+ },
2193
2493
  password: {
2194
2494
  changeTitle: "Changer le mot de passe",
2195
2495
  setTitle: "Définir un mot de passe local",
@@ -2221,7 +2521,6 @@ const fr = {
2221
2521
  label: "Espaces de travail",
2222
2522
  default: "Mon espace de travail",
2223
2523
  switch: "Changer d'espace de travail",
2224
- create: "Créer un espace de travail",
2225
2524
  createTitle: "Créer un espace de travail",
2226
2525
  createDescription: "Un espace de travail est un lieu partagé pour la collaboration de votre équipe.",
2227
2526
  createButton: "Créer un espace de travail",
@@ -2246,7 +2545,6 @@ const fr = {
2246
2545
  packageManagement: "Gestion des packages",
2247
2546
  searchNavigation: "Rechercher dans la navigation…",
2248
2547
  settings: "Paramètres",
2249
- help: "Aide",
2250
2548
  helpTooltip: "Aide et documentation",
2251
2549
  activityFeed: "Flux d'activité",
2252
2550
  notifications: "Notifications",
@@ -2285,10 +2583,12 @@ const fr = {
2285
2583
  build: {
2286
2584
  title: "Créer une application",
2287
2585
  subtitle: "Partir de zéro — concevez les objets, formulaires, automatisations et interfaces.",
2586
+ noCapability: "La création d'applications n'est pas disponible dans cet espace de travail : elle requiert l'autorisation « Gérer les métadonnées », que votre compte ne possède pas.",
2288
2587
  },
2289
2588
  template: {
2290
2589
  title: "Partir d'un modèle",
2291
2590
  subtitle: "Installez une application modèle depuis la place de marché et personnalisez-la.",
2591
+ marketplaceDisabled: "Aucune place de marché d'applications n'est configurée pour ce runtime : il n'y a donc aucun modèle à installer ici.",
2292
2592
  },
2293
2593
  welcomeAdminDescription: "Décrivez votre activité en une phrase — l'IA génère les objets, les écrans, les API et les outils d'agent. Ou configurez tout vous-même depuis le menu de gauche.",
2294
2594
  welcomeAdminDescriptionNoBuild: "Configurez votre première application depuis le menu Administration à gauche. Une fois les données en place, l'assistant IA pourra vous aider à les explorer.",
@@ -2304,6 +2604,9 @@ const fr = {
2304
2604
  },
2305
2605
  pendingDrafts: {
2306
2606
  message: "Vous avez {{count}} modification(s) non publiée(s) — publiez-les pour les activer.",
2607
+ message_one: "Vous avez {{count}} modification non publiée — publiez-la pour l'activer.",
2608
+ message_many: "Vous avez {{count}} de modifications non publiées — publiez-les pour les activer.",
2609
+ message_other: "Vous avez {{count}} modifications non publiées — publiez-les pour les activer.",
2307
2610
  cta: "Publier",
2308
2611
  publishing: "Publication…",
2309
2612
  published: "Publié ! Vos modifications sont actives.",
@@ -2318,7 +2621,6 @@ const fr = {
2318
2621
  capabilityWarn: "Contrôle de conception : {{count}} référence(s) de capacité ne mènent à rien.",
2319
2622
  },
2320
2623
  title: "Accueil",
2321
- subtitle: "Tableau de bord de votre espace de travail",
2322
2624
  nav: "Accueil",
2323
2625
  allApps: "Toutes les applications",
2324
2626
  yourApps: "Vos applications",
@@ -2330,8 +2632,6 @@ const fr = {
2330
2632
  empty: "Vous êtes à jour",
2331
2633
  },
2332
2634
  loading: "Chargement de l'espace de travail…",
2333
- recent: "Récent",
2334
- starred: "Favoris",
2335
2635
  welcome: "Bienvenue dans ObjectUI",
2336
2636
  welcomeDescription: "Commencez par créer votre première application ou configurer les paramètres système.",
2337
2637
  createFirstApp: "Créez votre première app",
@@ -2339,8 +2639,6 @@ const fr = {
2339
2639
  browseMarketplace: "Parcourir la marketplace d'apps",
2340
2640
  quickActions: {
2341
2641
  title: "Actions rapides",
2342
- createApp: "Créer une app",
2343
- createAppDesc: "Commencez avec une nouvelle application",
2344
2642
  manageObjects: "Gérer les objets",
2345
2643
  manageObjectsDesc: "Configurer les modèles de données",
2346
2644
  systemSettings: "Paramètres système",
@@ -2356,18 +2654,15 @@ const fr = {
2356
2654
  greetingNight: "Travail de nuit",
2357
2655
  heroTagline: "Reprenez là où vous vous êtes arrêté ou découvrez quelque chose de nouveau.",
2358
2656
  open: "Ouvrir",
2359
- stats: {
2360
- apps: "Applications",
2361
- starred: "Étoilés",
2362
- recent: "Récents",
2363
- },
2364
2657
  recentApps: {
2365
2658
  title: "Récemment ouverts",
2366
2659
  itemType: {
2367
2660
  object: "Objet",
2368
2661
  dashboard: "Tableau de bord",
2369
2662
  page: "Page",
2663
+ report: "Rapport",
2370
2664
  record: "Enregistrement",
2665
+ metadata: "Métadonnées",
2371
2666
  },
2372
2667
  },
2373
2668
  starredApps: {
@@ -2389,7 +2684,6 @@ const fr = {
2389
2684
  organizations: "Organisations",
2390
2685
  roles: "Rôles",
2391
2686
  configuration: "Configuration",
2392
- createApp: "Créer une application",
2393
2687
  administration: "Administration",
2394
2688
  datasources: "Sources de données",
2395
2689
  documentation: "Documentation",
@@ -2414,6 +2708,7 @@ const fr = {
2414
2708
  typeUpdate: "Mettre à jour",
2415
2709
  typeDelete: "Supprimer",
2416
2710
  typeComment: "Commentaire",
2711
+ typeSystem: "Système",
2417
2712
  relativeJustNow: "à l'instant",
2418
2713
  relativeSecondsAgo: "il y a {{count}}s",
2419
2714
  relativeMinutesAgo: "il y a {{count}}m",
@@ -2435,8 +2730,13 @@ const fr = {
2435
2730
  placeholder: "Rechercher des objets, tableaux de bord, pages, rapports…",
2436
2731
  inputAriaLabel: "Rechercher des objets, tableaux de bord, pages, rapports",
2437
2732
  resultsCount: "{{count}} résultat pour \"{{query}}\"",
2438
- resultsCountPlural: "{{count}} résultats pour \"{{query}}\"",
2733
+ resultsCount_one: "{{count}} résultat pour \"{{query}}\"",
2734
+ resultsCount_many: "{{count}} de résultats pour \"{{query}}\"",
2735
+ resultsCount_other: "{{count}} résultats pour \"{{query}}\"",
2439
2736
  itemsAvailable: "{{count}} éléments disponibles",
2737
+ itemsAvailable_one: "{{count}} élément disponible",
2738
+ itemsAvailable_many: "{{count}} d'éléments disponibles",
2739
+ itemsAvailable_other: "{{count}} éléments disponibles",
2440
2740
  noResults: "Aucun résultat trouvé",
2441
2741
  noResultsHint: "Essayez d'ajuster vos termes de recherche",
2442
2742
  typeObjects: "Objets",
@@ -2461,7 +2761,11 @@ const fr = {
2461
2761
  noAppsConfigured: "Aucune application configurée",
2462
2762
  noAppsConfiguredDescription: "Aucune application n'est enregistrée. Créez votre première application ou visitez les paramètres système.",
2463
2763
  appNotAvailable: "Application non disponible",
2464
- appNotAvailableDescription: "Cette application n'est pas encore disponible — sa publication est peut-être en cours. Réessayez dans un instant.",
2764
+ appNotAvailableDescription: "Cette application n'est pas disponible — réessayez dans un instant.",
2765
+ appNotFound: "Impossible d'ouvrir cette application",
2766
+ appNotFoundDescription: "Le serveur n'a pas renvoyé cette application pour votre compte.",
2767
+ appUnreachable: "Impossible de joindre le serveur",
2768
+ appUnreachableDescription: "Cette application n'a pas pu être vérifiée. Réessayez dans un instant.",
2465
2769
  appAccessDenied: "Vous n'avez pas accès à cette application",
2466
2770
  appAccessDeniedDescription: "Cette application existe, mais votre compte n'est pas autorisé à l'ouvrir. Demandez l'accès à un administrateur.",
2467
2771
  appAccessDeniedHome: "Retour à l'accueil",
@@ -2471,31 +2775,16 @@ const fr = {
2471
2775
  recordNotFound: "Enregistrement introuvable",
2472
2776
  recordNotFoundDescription: "L'enregistrement que vous recherchez n'existe pas ou a peut-être été supprimé.",
2473
2777
  },
2474
- renderer: {
2475
- noPageSchema: "Aucun schéma de page fourni",
2476
- noFormSchema: "Aucun schéma de formulaire fourni",
2477
- noDashboardSchema: "Aucun schéma de tableau de bord fourni",
2478
- pageRendering: "Rendu de la page : {{name}}",
2479
- dashboardRendering: "Rendu du tableau de bord : {{name}}",
2480
- formRenderingMode: "Formulaire rendu en mode {{mode}}",
2481
- formRenderingFor: "pour l'enregistrement {{id}}",
2482
- createRecord: "Créer un enregistrement",
2483
- editRecord: "Modifier l'enregistrement",
2484
- page: "Page",
2485
- dashboard: "Tableau de bord",
2486
- save: "Enregistrer",
2487
- cancel: "Annuler",
2488
- },
2489
2778
  actionDialog: {
2490
2779
  title: "Paramètres d'action",
2491
2780
  description: "Veuillez saisir les informations requises pour continuer.",
2492
2781
  selectPlaceholder: "Sélectionner {{label}}",
2493
2782
  requiredError: "{{label}} est obligatoire",
2783
+ unresolvedParam: 'Ce paramètre ne peut pas être affiché : le champ dont il dépend est absent des métadonnées de l’objet, le contrôle nécessaire ne peut donc pas être construit. Demandez à un administrateur de corriger la définition de l’action.',
2784
+ carryOverHint: 'Repris tel quel (lecture seule)',
2494
2785
  cancel: "Annuler",
2495
2786
  confirm: "Confirmer",
2496
2787
  uploading: "Téléversement…",
2497
- defaultActionTitle: "Action",
2498
- ok: "OK",
2499
2788
  lookupPlaceholder: "ID d'enregistrement pour {{label}}",
2500
2789
  lookupHelpText: "Aucun objet de référence n'est configuré pour ce paramètre, le sélecteur d'enregistrement est donc indisponible. Saisissez un ID d'enregistrement ou demandez à un administrateur de corriger le paramètre d'action.",
2501
2790
  },
@@ -2504,11 +2793,6 @@ const fr = {
2504
2793
  confirm: "Continuer",
2505
2794
  cancel: "Annuler",
2506
2795
  },
2507
- rowAction: {
2508
- openMenu: "Ouvrir le menu",
2509
- edit: "Modifier",
2510
- delete: "Supprimer",
2511
- },
2512
2796
  navigationSync: {
2513
2797
  addedPage: "Navigation mise à jour : page \"{{name}}\" ajoutée",
2514
2798
  addedDashboard: "Navigation mise à jour : tableau de bord \"{{name}}\" ajouté",
@@ -2529,6 +2813,9 @@ const fr = {
2529
2813
  noRecordId: "Aucun ID d'enregistrement fourni",
2530
2814
  deleteConfirm: "Supprimer cet enregistrement ?",
2531
2815
  bulkDeleteSuccess: "{{count}} enregistrement(s) {{label}} supprimé(s)",
2816
+ bulkDeleteSuccess_one: "{{count}} enregistrement {{label}} supprimé",
2817
+ bulkDeleteSuccess_many: "{{count}} d'enregistrements {{label}} supprimés",
2818
+ bulkDeleteSuccess_other: "{{count}} enregistrements {{label}} supprimés",
2532
2819
  bulkDeletePartial: "{{succeeded}} supprimé(s), {{failed}} échoué(s)",
2533
2820
  },
2534
2821
  objectViewActions: {
@@ -2540,15 +2827,6 @@ const fr = {
2540
2827
  exportFailed: "Échec de l'export : {{message}}",
2541
2828
  forecastSoon: "La vue de prévision arrive bientôt",
2542
2829
  },
2543
- recordDetail: {
2544
- viewersTooltip: "Utilisateurs consultant cet enregistrement en ce moment",
2545
- },
2546
- cellRender: {
2547
- empty: "Vide",
2548
- yes: "Oui",
2549
- no: "Non",
2550
- systemFields: "Système",
2551
- },
2552
2830
  user: {
2553
2831
  profile: "Profil",
2554
2832
  settings: "Paramètres",
@@ -2585,17 +2863,17 @@ const fr = {
2585
2863
  },
2586
2864
  organizations: {
2587
2865
  create: "Créer un espace de travail",
2588
- mine: "Mes organisations",
2589
- title: "Organisations",
2590
- heading: "Vos organisations",
2591
- subtitle: "Sélectionnez une organisation pour continuer ou créez-en une nouvelle.",
2592
- searchPlaceholder: "Rechercher une organisation",
2593
- new: "Nouvelle organisation",
2594
- current: "Organisation actuelle",
2866
+ mine: "Mes espaces de travail",
2867
+ title: "Espaces de travail",
2868
+ heading: "Vos espaces de travail",
2869
+ subtitle: "Sélectionnez un espace de travail pour continuer ou créez-en un nouveau.",
2870
+ searchPlaceholder: "Rechercher un espace de travail",
2871
+ new: "Nouvel espace de travail",
2872
+ current: "Espace de travail actuel",
2595
2873
  manage: "Gérer",
2596
- emptyTitle: "Aucune organisation pour le moment",
2597
- emptyDescription: "Créez votre première organisation pour commencer.",
2598
- noMatches: "Aucune organisation ne correspond à votre recherche.",
2874
+ emptyTitle: "Aucun espace de travail pour le moment",
2875
+ emptyDescription: "Créez votre premier espace de travail pour commencer.",
2876
+ noMatches: "Aucun espace de travail ne correspond à votre recherche.",
2599
2877
  },
2600
2878
  organization: {
2601
2879
  roles: {
@@ -2724,6 +3002,9 @@ const fr = {
2724
3002
  declined: "Invitation refusée",
2725
3003
  declineFailed: "Impossible de refuser l'invitation",
2726
3004
  },
3005
+ current: {
3006
+ label: "Organisation actuelle",
3007
+ },
2727
3008
  switcher: {
2728
3009
  label: "Changer d'organisation",
2729
3010
  groupLabel: "Organisation de travail",
@@ -2735,18 +3016,37 @@ const fr = {
2735
3016
  regionLabel: "Notifications",
2736
3017
  groupCount: "{{count}} notifications",
2737
3018
  groupUnread: "{{count}} non lues",
3019
+ groupUnread_one: "{{count}} non lue",
3020
+ groupUnread_many: "{{count}} non lues",
3021
+ groupUnread_other: "{{count}} non lues",
2738
3022
  groupMarkRead: "Marquer comme lu",
2739
3023
  groupMarkReadTitle: "Tout marquer comme lu pour ce type",
2740
3024
  empty: "Aucune notification",
2741
3025
  markAllRead: "Tout marquer comme lu",
2742
3026
  viewAll: "Voir toutes les notifications",
2743
3027
  approvalsPending: "{{count}} approbations en attente",
3028
+ approvalsPending_one: "{{count}} approbation en attente",
3029
+ approvalsPending_many: "{{count}} d'approbations en attente",
3030
+ approvalsPending_other: "{{count}} approbations en attente",
2744
3031
  viewApprovals: "Voir les approbations",
2745
3032
  noPendingApprovals: "Aucune approbation en attente",
2746
3033
  openApprovalsInbox: "Ouvrir la boîte d'approbations",
2747
3034
  badgeTotal: "{{total}} au total",
2748
3035
  badgeNotifications: "{{unread}} notifications",
2749
3036
  badgeApprovals: "{{approvals}} approbations en attente",
3037
+ arrivalMany: "{{count}} nouveaux messages",
3038
+ arrivalMany_one: "{{count}} nouveau message",
3039
+ arrivalMany_many: "{{count}} de nouveaux messages",
3040
+ arrivalMany_other: "{{count}} nouveaux messages",
3041
+ arrivalRepeats: "{{count}} nouveaux messages sur ce sujet",
3042
+ arrivalRepeats_one: "{{count}} nouveau message sur ce sujet",
3043
+ arrivalRepeats_many: "{{count}} de nouveaux messages sur ce sujet",
3044
+ arrivalRepeats_other: "{{count}} nouveaux messages sur ce sujet",
3045
+ arrivalOpen: "Afficher",
3046
+ toastEnabled: "Alertes dans l'application",
3047
+ desktopEnabled: "Notifications du bureau",
3048
+ desktopBlocked: "Bloqué. Autorisez les notifications pour ce site dans les paramètres du navigateur.",
3049
+ desktopUnsupported: "Ce navigateur ne prend pas en charge les notifications du bureau.",
2750
3050
  emptyUnread: "Tout est lu",
2751
3051
  filterUnread: "Non lus",
2752
3052
  filterAll: "Tous",
@@ -2760,63 +3060,19 @@ const fr = {
2760
3060
  thankYouTitle: "Merci !",
2761
3061
  thankYouMessage: "Votre soumission a été reçue avec succès.",
2762
3062
  redirecting: "Redirection dans {{seconds}} seconde(s)…",
3063
+ redirectPending: "Redirection…",
2763
3064
  unavailableTitle: "Formulaire non disponible",
2764
3065
  unavailableDescription: "Aucun formulaire public n'est disponible à cette URL. Assurez-vous que la vue sous-jacente a le partage anonyme activé.",
2765
3066
  tryDemo: "Essayer la démo",
2766
3067
  retry: "Réessayer",
2767
3068
  loading: "Chargement du formulaire…",
2768
3069
  requiredHint: "* Champ obligatoire",
3070
+ requiredFields: "Champs obligatoires : {{fields}}",
2769
3071
  consentLabelDefault: "J'accepte la politique de confidentialité et consens au traitement de mes données pour cette demande.",
2770
3072
  consentLink: "Politique de confidentialité",
2771
3073
  consentRequired: "Veuillez accepter la politique de confidentialité pour continuer.",
2772
3074
  rateLimited: "Prenez un moment pour vérifier vos réponses avant d'envoyer.",
2773
3075
  redirectBlocked: "Soumission acceptée, mais l'URL de redirection a été bloquée pour des raisons de sécurité.",
2774
- demo: {
2775
- contactTitle: "Nous contacter",
2776
- contactDescription: "Parlez-nous de votre projet et un représentant commercial vous contactera dans un jour ouvrable.",
2777
- supportTitle: "Soumettre une demande d'assistance",
2778
- supportDescription: "Décrivez-nous le problème — notre équipe répondra dans un jour ouvrable.",
2779
- thankYouSalesTitle: "Merci — nous avons reçu votre message !",
2780
- thankYouSalesMessage: "Un représentant commercial vous contactera dans un jour ouvrable.",
2781
- thankYouSupportTitle: "C'est bon — votre demande est en file d'attente.",
2782
- thankYouSupportMessage: "Un ingénieur d'assistance vous fera un suivi bientôt. Sauvegardez cette page si vous avez des captures d'écran supplémentaires.",
2783
- field: {
2784
- firstName: "Prénom",
2785
- lastName: "Nom",
2786
- email: "E-mail professionnel",
2787
- phone: "Téléphone",
2788
- jobTitle: "Titre du poste",
2789
- company: "Entreprise",
2790
- website: "Site web",
2791
- industry: "Secteur",
2792
- companySize: "Taille de l'entreprise",
2793
- howCanWeHelp: "Comment pouvons-nous vous aider ?",
2794
- subject: "Sujet",
2795
- description: "Description",
2796
- issueType: "Type de problème",
2797
- priority: "Priorité",
2798
- },
2799
- industry: {
2800
- technology: "Technologie",
2801
- software: "Logiciel / SaaS",
2802
- finance: "Finance",
2803
- healthcare: "Santé",
2804
- retail: "Commerce de détail",
2805
- other: "Autre",
2806
- },
2807
- issueType: {
2808
- question: "Question",
2809
- problem: "Problème",
2810
- bug: "Bug",
2811
- feature_request: "Demande de fonctionnalité",
2812
- },
2813
- priority: {
2814
- low: "Faible",
2815
- medium: "Moyen",
2816
- high: "Élevé",
2817
- critical: "Critique",
2818
- },
2819
- },
2820
3076
  },
2821
3077
  connectAgent: {
2822
3078
  disabled: {
@@ -2862,6 +3118,9 @@ const fr = {
2862
3118
  noImportableFields: "Cet objet n'a aucun champ importable.",
2863
3119
  schemaReadFailed: "Impossible de lire le schéma de l'objet.",
2864
3120
  imported: "{{count}} ligne(s) importée(s) dans {{object}}.",
3121
+ imported_one: "{{count}} ligne importée dans {{object}}.",
3122
+ imported_many: "{{count}} de lignes importées dans {{object}}.",
3123
+ imported_other: "{{count}} lignes importées dans {{object}}.",
2865
3124
  importFrom: "Importer les lignes réelles depuis",
2866
3125
  into: "vers",
2867
3126
  opening: "Ouverture…",
@@ -2875,6 +3134,78 @@ const fr = {
2875
3134
  openProduction: "Ouvrir la production",
2876
3135
  manageEnvironments: "Gérer les environnements",
2877
3136
  },
3137
+ cloudPlanStatus: {
3138
+ current: "Offre actuelle",
3139
+ },
3140
+ ai: {
3141
+ nlQuery: {
3142
+ placeholder: "Posez une question sur vos données…",
3143
+ ask: "Demander",
3144
+ results: "Résultats",
3145
+ match: "Correspondance : {{percent}}",
3146
+ simulatedSummary: "Résultats pour : {{query}}",
3147
+ noResults: "Aucun enregistrement correspondant",
3148
+ recentQueries: "Requêtes récentes",
3149
+ },
3150
+ formAssist: {
3151
+ title: "Suggestions de l’IA",
3152
+ suggestionCount: "{{count}} suggestions",
3153
+ suggestionCount_one: "{{count}} suggestion",
3154
+ suggestionCount_many: "{{count}} de suggestions",
3155
+ suggestionCount_other: "{{count}} suggestions",
3156
+ applyAll: "Tout appliquer",
3157
+ confidence: "Confiance : {{percent}}",
3158
+ appliedCount: "{{count}} suggestions appliquées",
3159
+ appliedCount_one: "{{count}} suggestion appliquée",
3160
+ appliedCount_many: "{{count}} de suggestions appliquées",
3161
+ appliedCount_other: "{{count}} suggestions appliquées",
3162
+ },
3163
+ recommendations: {
3164
+ title: "Recommandations",
3165
+ generating: "Génération des recommandations…",
3166
+ empty: "Aucune recommandation disponible",
3167
+ },
3168
+ },
3169
+ aiApprovals: {
3170
+ title: "Approbations IA",
3171
+ description: "Actions proposées par un agent IA qui nécessitent une validation humaine avant exécution.",
3172
+ tabPending: "En attente",
3173
+ tabDecided: "Traitées",
3174
+ tabAll: "Toutes",
3175
+ statusPending: "En attente",
3176
+ statusApproved: "Approuvée",
3177
+ statusExecuted: "Exécutée",
3178
+ statusFailed: "Échouée",
3179
+ statusRejected: "Rejetée",
3180
+ colTool: "Outil",
3181
+ colAction: "Action",
3182
+ colObject: "Objet",
3183
+ colStatus: "Statut",
3184
+ colProposed: "Proposée",
3185
+ colDecision: "Décision",
3186
+ emptyTitle: "Aucune action en attente",
3187
+ emptyDescription: "Lorsque l'IA propose une action sensible, elle apparaît ici pour validation.",
3188
+ view: "Voir",
3189
+ approve: "Approuver",
3190
+ reject: "Rejeter",
3191
+ working: "En cours…",
3192
+ approveAndExecute: "Approuver et exécuter",
3193
+ outcomeApprove: "Approbation de {{id}} : {{message}}",
3194
+ outcomeReject: "Rejet de {{id}} : {{message}}",
3195
+ outcomeExecuteFailed: "L'action a échoué pendant son exécution",
3196
+ drawerFallbackTitle: "Action en attente",
3197
+ drawerSubtitle: "Outil {{tool}} sur {{object}}",
3198
+ fieldProposedBy: "Proposée par",
3199
+ fieldDecidedBy: "Décidée par",
3200
+ fieldConversation: "Conversation",
3201
+ fieldToolInput: "Entrée de l'outil",
3202
+ fieldResult: "Résultat",
3203
+ fieldError: "Erreur",
3204
+ fieldRejectionReason: "Motif du rejet",
3205
+ rejectTitle: "Rejeter cette action ?",
3206
+ rejectBody: "Le motif est renvoyé à l'IA pour qu'elle ajuste sa prochaine réponse.",
3207
+ rejectPlaceholder: "Motif facultatif (par ex. « Identifiant d'enregistrement erroné — merci de confirmer d'abord avec l'utilisateur. »)",
3208
+ },
2878
3209
  aiModelStatus: {
2879
3210
  summary: "Créer / Demander utilise {{conversational}} ({{conversationalSource}}) ; structuré utilise {{structured}} ({{structuredSource}}).",
2880
3211
  summaryRouting: "Politique de routage : offres gratuites → {{free}}, offres payantes → {{paid}}.",
@@ -2892,6 +3223,114 @@ const fr = {
2892
3223
  sourceInherits: "identique à build/ask",
2893
3224
  sourcePinned: "figé par {{source}}",
2894
3225
  },
3226
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3227
+ // English-only until this landed while every other string on the same screen
3228
+ // was translated:
3229
+ //
3230
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3231
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3232
+ // closed registry those runtimes are conformance-tested
3233
+ // against). `humanizeToolName` looks each up as
3234
+ // `chatbot.tool.<tool_name>` and falls back to its English
3235
+ // title-caser for a custom / third-party tool, so a name
3236
+ // missing here is degraded, never broken. The `en` values
3237
+ // are deliberately EQUAL to what that title-caser produces:
3238
+ // adding the key must not silently reword the English UI.
3239
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3240
+ // set for both surfaces (they used to carry separate
3241
+ // tables and disagreed on casing).
3242
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3243
+ // FAMILIES: one slot per CLDR category the pack's language
3244
+ // selects (objectui#11432), plus the base key for a call
3245
+ // made without a count. `all-locales-key-parity.test.ts`
3246
+ // derives the required slots from `Intl.PluralRules`.
3247
+ //
3248
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3249
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3250
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3251
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3252
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3253
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3254
+ // against the registry instead of against its own hand-held list.
3255
+ chatbot: {
3256
+ tool: {
3257
+ aggregate_data: "Agréger les données",
3258
+ get_record: "Lire un enregistrement",
3259
+ query_data: "Interroger les données",
3260
+ query_records: "Interroger les enregistrements",
3261
+ search_knowledge: "Rechercher dans la base de connaissances",
3262
+ visualize_data: "Créer un graphique",
3263
+ add_field: "Ajouter un champ",
3264
+ apply_blueprint: "Construire l’application",
3265
+ apply_edit: "Appliquer les modifications",
3266
+ create_metadata: "Créer des métadonnées",
3267
+ create_object: "Créer un objet",
3268
+ create_package: "Créer un paquet",
3269
+ create_seed: "Générer des données d’exemple",
3270
+ delete_field: "Supprimer un champ",
3271
+ describe_metadata: "Consulter les métadonnées",
3272
+ describe_object: "Consulter la structure de l’objet",
3273
+ get_active_package: "Lire le paquet actif",
3274
+ get_authoring_rules: "Lire les règles d'écriture",
3275
+ get_metadata_schema: "Lire le schéma des métadonnées",
3276
+ get_package: "Lire le paquet",
3277
+ list_metadata: "Lister les métadonnées",
3278
+ list_objects: "Lister les objets",
3279
+ list_packages: "Lister les paquets",
3280
+ load_tools: "Charger les outils",
3281
+ modify_field: "Modifier un champ",
3282
+ open_record: "Ouvrir la fiche",
3283
+ propose_blueprint: "Concevoir le plan de l’application",
3284
+ set_active_package: "Changer le paquet actif",
3285
+ suggest_builder: "Proposer une méthode de construction",
3286
+ test_flow: "Tester le flux",
3287
+ todo_write: "Noter les tâches",
3288
+ toggle_flow: "Activer ou désactiver le flux",
3289
+ update_metadata: "Mettre à jour les métadonnées",
3290
+ validate_expression: "Valider l’expression",
3291
+ verify_build: "Vérifier la construction",
3292
+ },
3293
+ toolState: {
3294
+ agentActivity: "Activité de l’agent",
3295
+ pending: "En attente",
3296
+ running: "En cours",
3297
+ awaitingApproval: "En attente d’approbation",
3298
+ responded: "Répondu",
3299
+ completed: "Terminé",
3300
+ error: "Erreur",
3301
+ denied: "Refusé",
3302
+ failed: "Échec",
3303
+ },
3304
+ plan: {
3305
+ countObjects: "{{count}} objets",
3306
+ countObjects_one: "{{count}} objet",
3307
+ countObjects_many: "{{count}} d'objets",
3308
+ countObjects_other: "{{count}} objets",
3309
+ countViews: "{{count}} vues",
3310
+ countViews_one: "{{count}} vue",
3311
+ countViews_many: "{{count}} de vues",
3312
+ countViews_other: "{{count}} vues",
3313
+ countDashboards: "{{count}} tableaux de bord",
3314
+ countDashboards_one: "{{count}} tableau de bord",
3315
+ countDashboards_many: "{{count}} de tableaux de bord",
3316
+ countDashboards_other: "{{count}} tableaux de bord",
3317
+ countSeedData: "données d’exemple",
3318
+ },
3319
+ build: {
3320
+ building: "Création de {{app}}…",
3321
+ built: "Création de {{app}} terminée",
3322
+ appFallback: "votre application",
3323
+ addingSampleData: "ajout de données d’exemple",
3324
+ group: {
3325
+ object: "Objets",
3326
+ view: "Vues",
3327
+ dashboard: "Tableaux de bord",
3328
+ app: "Application",
3329
+ seed: "Données d’exemple",
3330
+ },
3331
+ moreArtifacts: "+{{n}} autres",
3332
+ },
3333
+ },
2895
3334
  chatbotError: {
2896
3335
  title: "Échec de la réponse",
2897
3336
  fallbackDetail: "Une erreur s'est produite. Veuillez réessayer.",
@@ -2929,6 +3368,7 @@ const fr = {
2929
3368
  retry: "Réessayer",
2930
3369
  errors: {
2931
3370
  expired: "La demande a expiré avant d'être approuvée. Recommencez.",
3371
+ accessDenied: "La demande de connexion a été refusée. Recommencez.",
2932
3372
  bindFailed: "Échec de la liaison.",
2933
3373
  deviceCodeFailed: "Échec de la demande de code d'appareil.",
2934
3374
  },
@@ -2971,7 +3411,7 @@ const fr = {
2971
3411
  },
2972
3412
  title: "Marketplace d'applications",
2973
3413
  subtitle: "Parcourez les applications approuvées publiées dans le catalogue ObjectStack. Cliquez sur une application pour voir les détails et l'installer dans l'un de vos environnements.",
2974
- searchPlaceholder: "Rechercher des applications par nom ou ID de manifeste…",
3414
+ searchPlaceholder: "Rechercher des applications par nom ou ID d'application…",
2975
3415
  searchAria: "Rechercher des applications du marketplace",
2976
3416
  installed: "Installé",
2977
3417
  installedCount: "Installées ({{count}})",
@@ -2994,10 +3434,16 @@ const fr = {
2994
3434
  installedBadge: "Installé v{{version}}",
2995
3435
  load: {
2996
3436
  failed: "Impossible de charger le marketplace",
2997
- failedHint: "Par défaut, ce runtime pointe vers le cloud public ObjectStack. Assurez-vous que le runtime est en ligne.",
3437
+ failedHintConfigured: "Ce runtime accède à la place de marché via le plan de contrôle situé à {{url}}. Vérifiez qu'il est en ligne et joignable depuis ici.",
3438
+ failedHintSameOrigin: "Ce runtime sert lui-même le catalogue de la place de marché. Vérifiez qu'il est en ligne.",
2998
3439
  packageFailed: "Impossible de charger le paquet",
2999
3440
  notFound: "Introuvable.",
3000
3441
  },
3442
+ disabled: {
3443
+ title: "La place de marché des applications est désactivée",
3444
+ description: "Aucune place de marché n'est configurée pour ce runtime : il n'y a donc rien à parcourir ni à installer ici.",
3445
+ hint: "C'est l'état attendu lorsque le runtime démarre avec <code>OS_CLOUD_URL=off</code> (ou <code>none</code>, <code>local</code>, <code>disabled</code>). Pour activer la place de marché, faites pointer <code>OS_CLOUD_URL</code> vers un plan de contrôle puis redémarrez le runtime.",
3446
+ },
3001
3447
  detail: {
3002
3448
  homepage: "Page d'accueil",
3003
3449
  installedV: "Installé · v{{version}}",
@@ -3013,10 +3459,17 @@ const fr = {
3013
3459
  purgeSampleData: 'Supprimer les données d\'exemple',
3014
3460
  purgeConfirm: 'Supprimer tous les enregistrements d\'exemple créés par ce paquet ? Les enregistrements ajoutés par l\'utilisateur ne seront PAS touchés.',
3015
3461
  purgeSuccess: '{{count}} enregistrement(s) d\'exemple supprimé(s).',
3462
+ purgeSuccess_one: "{{count}} enregistrement d'exemple supprimé.",
3463
+ purgeSuccess_many: "{{count}} d'enregistrements d'exemple supprimés.",
3464
+ purgeSuccess_other: "{{count}} enregistrements d'exemple supprimés.",
3016
3465
  purgeNoData: 'Aucun enregistrement d\'exemple à supprimer.',
3017
3466
  reseedQueued: 'Les données d\'exemple seront rechargées au prochain accès à l\'environnement.',
3018
3467
  reseedLocalSuccess: 'Données d\'exemple rechargées : {{inserted}} ajoutés, {{updated}} mis à jour.',
3019
3468
  reseedPartialErrors: '({{count}} enregistrement(s) n\'ont pas pu être écrits)',
3469
+ reseedPartialErrors_one: "({{count}} enregistrement n'a pas pu être écrit)",
3470
+ reseedPartialErrors_many: "({{count}} d'enregistrements n'ont pas pu être écrits)",
3471
+ reseedPartialErrors_other: "({{count}} enregistrements n'ont pas pu être écrits)",
3472
+ sampleDataKernelUnavailable: 'Ce plan de contrôle n\'a pas de noyau d\'environnement : les données d\'exemple ne peuvent donc être ni rechargées ni supprimées ici. Faites-le depuis le runtime propre à l\'environnement.',
3020
3473
  updateAvailable: 'Mise à jour disponible',
3021
3474
  },
3022
3475
  action: {
@@ -3069,7 +3522,8 @@ const fr = {
3069
3522
  reviewed: "Examiné et approuvé",
3070
3523
  unreviewed: "Pas encore examiné",
3071
3524
  signed: "Signé",
3072
- grantsIntro: "À l'installation, ce paquet obtiendra :",
3525
+ grantsIntro: "Ce paquet demande :",
3526
+ notEnforced: "Cette liste est enregistrée à l'installation et reconfirmée si une version ultérieure en demande davantage, mais l'exécution ne restreint pas encore le paquet à cette liste.",
3073
3527
  services: "Services de la plateforme",
3074
3528
  hooks: "Hooks de cycle de vie",
3075
3529
  network: "Accès réseau",
@@ -3108,30 +3562,21 @@ const fr = {
3108
3562
  storage: "Stockage",
3109
3563
  other: "Autre",
3110
3564
  },
3111
- pricing: {
3112
- free: "Gratuit",
3113
- freemium: "Freemium",
3114
- paid: "Payant",
3115
- subscription: "Abonnement",
3116
- "usage-based": "À l'utilisation",
3117
- "contact-sales": "Contacter les ventes",
3118
- },
3119
3565
  relativeTime: {
3120
3566
  today: "aujourd'hui",
3121
3567
  daysAgo: "il y a {{count}}j",
3122
3568
  monthsAgo: "il y a {{count}} mois",
3569
+ monthsAgo_one: "il y a {{count}} mois",
3570
+ monthsAgo_many: "il y a {{count}} mois",
3571
+ monthsAgo_other: "il y a {{count}} mois",
3123
3572
  yearsAgo: "il y a {{count}} ans",
3573
+ yearsAgo_one: "il y a {{count}} an",
3574
+ yearsAgo_many: "il y a {{count}} ans",
3575
+ yearsAgo_other: "il y a {{count}} ans",
3124
3576
  },
3125
3577
  },
3126
- approvals: {
3127
- approve: 'Approuver',
3128
- reject: 'Rejeter',
3129
- comment: 'Commentaire (facultatif)',
3130
- approveSuccess: 'Approuvé',
3131
- rejectSuccess: 'Rejeté',
3132
- rejectConfirm: 'Rejeter cette demande d’approbation ?',
3133
- },
3134
3578
  approvalsInbox: {
3579
+ recordUnresolvable: 'Cet enregistrement ne peut pas être ouvert',
3135
3580
  loadMore: 'Charger plus',
3136
3581
  loadingMore: 'Chargement…',
3137
3582
  loadedOf: '{{loaded}} sur {{total}} chargées',
@@ -3150,6 +3595,9 @@ const fr = {
3150
3595
  requestInfoSent: 'Renvoyée au demandeur pour complément',
3151
3596
  remindBtn: 'Relancer',
3152
3597
  remindSuccess: 'Relance envoyée à {{count}} approbateur(s)',
3598
+ remindSuccess_one: 'Relance envoyée à {{count}} approbateur',
3599
+ remindSuccess_many: "Relance envoyée à {{count}} d'approbateurs",
3600
+ remindSuccess_other: 'Relance envoyée à {{count}} approbateurs',
3153
3601
  remindThrottled: 'Une relance a déjà été envoyée récemment — réessayez plus tard.',
3154
3602
  replyPlaceholder: 'Répondre sur cette demande…',
3155
3603
  slaRemaining: 'SLA : {{dur}} restants',
@@ -3166,6 +3614,9 @@ const fr = {
3166
3614
  progressApprovals: 'Approbations — {{got}} sur {{need}}',
3167
3615
  progressGroups: 'Avancement des visas — {{got}} sur {{need}} groupes',
3168
3616
  progressEligible: '{{count}} approbateur(s) éligible(s)',
3617
+ progressEligible_one: '{{count}} approbateur éligible',
3618
+ progressEligible_many: "{{count}} d'approbateurs éligibles",
3619
+ progressEligible_other: '{{count}} approbateurs éligibles',
3169
3620
  progressBar: 'Avancement de la décision',
3170
3621
  declaredActions: 'Actions',
3171
3622
  attachmentChip: 'Pièce jointe',
@@ -3197,6 +3648,9 @@ const fr = {
3197
3648
  filterCount: '{{shown}} sur {{total}}',
3198
3649
  selected: 'sélectionnées',
3199
3650
  actionableCount: '({{count}} actionnables)',
3651
+ actionableCount_one: '({{count}} actionnable)',
3652
+ actionableCount_many: '({{count}} actionnables)',
3653
+ actionableCount_other: '({{count}} actionnables)',
3200
3654
  selectAll: 'Tout sélectionner',
3201
3655
  selectRow: 'Sélectionner la demande',
3202
3656
  colRequest: 'Demande',
@@ -3237,12 +3691,19 @@ const fr = {
3237
3691
  submittedAgo: 'Soumise {{when}}',
3238
3692
  completedAt: 'Terminée {{when}}',
3239
3693
  waitingOn: 'En attente de',
3694
+ approverNameSeparator: ', ',
3695
+ approverUnstaffed: '{{seat}} (poste actuellement vacant)',
3240
3696
  history: 'Activité',
3241
3697
  noActions: 'Aucune action pour le moment.',
3242
3698
  actSubmit: 'Soumise',
3243
3699
  actApprove: 'Approuvée',
3244
3700
  actReject: 'Rejetée',
3245
3701
  actRecall: 'Retirée',
3702
+ overrideActionLabel: '{{action}} (dérogation)',
3703
+ overrideNotice: "Vous n'occupez aucun poste d'approbateur à cette étape. En continuant, votre dérogation d'administrateur sera utilisée : l'étape est finalisée immédiatement et tout approbateur n'ayant pas encore statué est contourné. La décision est enregistrée comme une dérogation d'administrateur.",
3704
+ overrideNoticeWho: "Vous n'occupez aucun poste d'approbateur à cette étape. En continuant, votre dérogation d'administrateur sera utilisée : l'étape est finalisée immédiatement et les approbateurs n'ayant pas encore statué sont contournés — {{who}}. La décision est enregistrée comme une dérogation d'administrateur.",
3705
+ viaOverrideChip: 'Dérogation administrateur',
3706
+ viaOverrideHint: "L'auteur n'occupait aucun poste d'approbateur à cette étape — admis par la voie de dérogation administrateur.",
3246
3707
  rawData: 'Données brutes (JSON)',
3247
3708
  copy: 'Copier',
3248
3709
  copied: 'Copié',
@@ -3263,11 +3724,23 @@ const fr = {
3263
3724
  approveN: 'Approuver {{count}}',
3264
3725
  rejectN: 'Rejeter {{count}}',
3265
3726
  bulkApproveTitle: 'Approuver {{count}} demandes ?',
3727
+ bulkApproveTitle_one: 'Approuver {{count}} demande ?',
3728
+ bulkApproveTitle_many: 'Approuver {{count}} de demandes ?',
3729
+ bulkApproveTitle_other: 'Approuver {{count}} demandes ?',
3266
3730
  bulkApproveBody: 'Chaque demande est approuvée avec votre identité et son flux continue sur la branche d\'approbation.',
3267
3731
  bulkRejectTitle: 'Rejeter {{count}} demandes ?',
3732
+ bulkRejectTitle_one: 'Rejeter {{count}} demande ?',
3733
+ bulkRejectTitle_many: 'Rejeter {{count}} de demandes ?',
3734
+ bulkRejectTitle_other: 'Rejeter {{count}} demandes ?',
3268
3735
  bulkRejectBody: 'Les demandes sélectionnées seront rejetées et leurs demandeurs notifiés.',
3269
3736
  bulkApproved: '{{count}} demandes approuvées',
3737
+ bulkApproved_one: '{{count}} demande approuvée',
3738
+ bulkApproved_many: '{{count}} de demandes approuvées',
3739
+ bulkApproved_other: '{{count}} demandes approuvées',
3270
3740
  bulkRejected: '{{count}} demandes rejetées',
3741
+ bulkRejected_one: '{{count}} demande rejetée',
3742
+ bulkRejected_many: '{{count}} de demandes rejetées',
3743
+ bulkRejected_other: '{{count}} demandes rejetées',
3271
3744
  bulkPartial: '{{ok}} réussies, {{fail}} échouées : {{which}}',
3272
3745
  rejectOneTitle: 'Rejeter « {{title}} » ?',
3273
3746
  rejectOneBody: 'La demande sera rejetée et le demandeur notifié.',
@@ -3292,8 +3765,17 @@ const fr = {
3292
3765
  alreadyDecided: 'Cette demande a déjà été traitée. Actualisez la liste.',
3293
3766
  justNow: 'à l\'instant',
3294
3767
  minutesAgo: 'il y a {{count}} min',
3768
+ minutesAgo_one: 'il y a {{count}} min',
3769
+ minutesAgo_many: 'il y a {{count}} min',
3770
+ minutesAgo_other: 'il y a {{count}} min',
3295
3771
  hoursAgo: 'il y a {{count}} h',
3772
+ hoursAgo_one: 'il y a {{count}} h',
3773
+ hoursAgo_many: 'il y a {{count}} h',
3774
+ hoursAgo_other: 'il y a {{count}} h',
3296
3775
  daysAgo: 'il y a {{count}} jours',
3776
+ daysAgo_one: 'il y a {{count}} jour',
3777
+ daysAgo_many: 'il y a {{count}} jours',
3778
+ daysAgo_other: 'il y a {{count}} jours',
3297
3779
  },
3298
3780
  preview: {
3299
3781
  empty: {
@@ -3328,7 +3810,18 @@ const fr = {
3328
3810
  detailNone: 'Aucune différence détectée — le brouillon correspond à la version publiée.',
3329
3811
  detailChangedKeys: 'Également modifié :',
3330
3812
  confirmNote: 'La publication libère atomiquement les {{count}} brouillons en attente de ce paquet.',
3813
+ confirmNote_one: 'La publication libère atomiquement {{count}} brouillon en attente de ce paquet.',
3814
+ confirmNote_many: 'La publication libère atomiquement les {{count}} de brouillons en attente de ce paquet.',
3815
+ confirmNote_other: 'La publication libère atomiquement les {{count}} brouillons en attente de ce paquet.',
3331
3816
  publishConfirm: 'Tout publier',
3817
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3818
+ // the confirm button so a refusal the door would issue is read BEFORE
3819
+ // the click rather than as a toast after the batch rolled back.
3820
+ securityBlockTitle: 'La publication sera refusée — {{count}} élément(s) nécessitent d’abord une décision',
3821
+ securityBlockTitle_one: 'La publication sera refusée — {{count}} élément nécessite d’abord une décision',
3822
+ securityBlockTitle_many: 'La publication sera refusée — {{count}} d’éléments nécessitent d’abord une décision',
3823
+ securityBlockTitle_other: 'La publication sera refusée — {{count}} éléments nécessitent d’abord une décision',
3824
+ securityBlockWhere: 'Corrigez-le sur l’objet dans Paramètres → Partage d’enregistrements, puis publiez à nouveau.',
3332
3825
  },
3333
3826
  // ADR-0045 — the materialized-but-unlisted app banner
3334
3827
  // (UnpublishedAppBar.tsx), sibling of draftBar above.
@@ -3352,7 +3845,7 @@ const fr = {
3352
3845
  revertLabel: 'Modification annulée',
3353
3846
  applyLabel: 'Modification de génération',
3354
3847
  revert: 'annulation',
3355
- items: 'éléments',
3848
+ items: 'Éléments : {{count}}',
3356
3849
  revertAction: 'Annuler',
3357
3850
  reverted: 'Annulé — la modification a été retirée.',
3358
3851
  revertFailed: 'Échec de l\'annulation',
@@ -3375,22 +3868,33 @@ const fr = {
3375
3868
  noResults: "Aucun résultat",
3376
3869
  searchField: "Rechercher {{label}}…",
3377
3870
  enterId: "Saisir l'ID {{label}}",
3871
+ addValue: "Saisir une valeur, puis Entrée",
3872
+ removeValue: "Supprimer {{value}}",
3873
+ rangeStart: "De",
3874
+ rangeEnd: "À",
3378
3875
  operators: {
3379
3876
  equals: "Égal à",
3380
- notEquals: "Différent de",
3877
+ not_equals: "Différent de",
3381
3878
  contains: "Contient",
3382
- notContains: "Ne contient pas",
3383
- isEmpty: "Est vide",
3384
- isNotEmpty: "N'est pas vide",
3385
- greaterThan: "Supérieur à",
3386
- lessThan: "Inférieur à",
3387
- greaterOrEqual: "Supérieur ou égal",
3388
- lessOrEqual: "Inférieur ou égal",
3879
+ icontains: "Contient (ignorer la casse)",
3880
+ not_contains: "Ne contient pas",
3881
+ is_empty: "Est vide",
3882
+ is_not_empty: "N'est pas vide",
3883
+ greater_than: "Supérieur à",
3884
+ less_than: "Inférieur à",
3885
+ greater_than_or_equal: "Supérieur ou égal",
3886
+ less_than_or_equal: "Inférieur ou égal",
3389
3887
  before: "Avant",
3390
3888
  after: "Après",
3391
3889
  between: "Entre",
3392
3890
  in: "Dans",
3393
- notIn: "Pas dans",
3891
+ not_in: "Pas dans",
3892
+ starts_with: "Commence par",
3893
+ ends_with: "Se termine par",
3894
+ is_null: "Est null",
3895
+ is_not_null: "N'est pas null",
3896
+ exists: "Est défini",
3897
+ notExists: "N'est pas défini",
3394
3898
  },
3395
3899
  },
3396
3900
  sortBuilder: {
@@ -3404,7 +3908,9 @@ const fr = {
3404
3908
  },
3405
3909
  collaboration: {
3406
3910
  commentCount: "{{count}} commentaires",
3407
- commentCountOne: "{{count}} commentaire",
3911
+ commentCount_one: "{{count}} commentaire",
3912
+ commentCount_many: "{{count}} de commentaires",
3913
+ commentCount_other: "{{count}} commentaires",
3408
3914
  resolvedSuffix: " · Résolu",
3409
3915
  sortComments: "Trier les commentaires",
3410
3916
  sortOldest: "Plus anciens",
@@ -3413,11 +3919,22 @@ const fr = {
3413
3919
  reopen: "Rouvrir",
3414
3920
  justNow: "à l'instant",
3415
3921
  minutesAgo: "il y a {{count}} min",
3922
+ minutesAgo_one: "il y a {{count}} min",
3923
+ minutesAgo_many: "il y a {{count}} min",
3924
+ minutesAgo_other: "il y a {{count}} min",
3416
3925
  hoursAgo: "il y a {{count}} h",
3926
+ hoursAgo_one: "il y a {{count}} h",
3927
+ hoursAgo_many: "il y a {{count}} h",
3928
+ hoursAgo_other: "il y a {{count}} h",
3417
3929
  daysAgo: "il y a {{count}} j",
3930
+ daysAgo_one: "il y a {{count}} j",
3931
+ daysAgo_many: "il y a {{count}} j",
3932
+ daysAgo_other: "il y a {{count}} j",
3418
3933
  edited: "(modifié)",
3419
3934
  reactionCount: "{{count}} réactions",
3420
- reactionCountOne: "{{count}} réaction",
3935
+ reactionCount_one: "{{count}} réaction",
3936
+ reactionCount_many: "{{count}} de réactions",
3937
+ reactionCount_other: "{{count}} réactions",
3421
3938
  addThumbsUp: "Ajouter un pouce levé",
3422
3939
  reply: "Répondre",
3423
3940
  reactThumbsUp: "Réagir avec un pouce levé",
@@ -3428,9 +3945,13 @@ const fr = {
3428
3945
  commentPlaceholder: "Ajouter un commentaire… (utilisez @ pour mentionner)",
3429
3946
  send: "Envoyer",
3430
3947
  presentUserCount: "{{count}} utilisateurs présents",
3431
- presentUserCountOne: "{{count}} utilisateur présent",
3948
+ presentUserCount_one: "{{count}} utilisateur présent",
3949
+ presentUserCount_many: "{{count}} d'utilisateurs présents",
3950
+ presentUserCount_other: "{{count}} utilisateurs présents",
3432
3951
  moreUserCount: "{{count}} autres utilisateurs",
3433
- moreUserCountOne: "{{count}} autre utilisateur",
3952
+ moreUserCount_one: "{{count}} autre utilisateur",
3953
+ moreUserCount_many: "{{count}} d'autres utilisateurs",
3954
+ moreUserCount_other: "{{count}} autres utilisateurs",
3434
3955
  userStatusTitle: "{{name}} ({{status}})",
3435
3956
  statusActive: "actif",
3436
3957
  statusIdle: "inactif",
@@ -3438,6 +3959,18 @@ const fr = {
3438
3959
  },
3439
3960
  wizard: {
3440
3961
  missingRequired: "Veuillez renseigner les champs obligatoires : {{fields}}",
3962
+ back: "Retour",
3963
+ submitting: "Envoi…",
3964
+ stepFallback: "Étape {{n}}",
3965
+ progressLabel: "Progression",
3966
+ emptyStep: "Aucun champ configuré pour cette étape",
3967
+ },
3968
+ flowRunner: {
3969
+ title: 'Saisie',
3970
+ submitting: 'Envoi…',
3971
+ saveAndContinue: 'Enregistrer et continuer',
3972
+ nextStep: 'Enregistré — étape suivante',
3973
+ completed: 'Flux « {{flow}} » terminé',
3441
3974
  },
3442
3975
  appManagement: {
3443
3976
  title: "Applications",
@@ -3488,5 +4021,49 @@ const fr = {
3488
4021
  bulkOperationFailed: "Échec de l'opération groupée : {{reason}}",
3489
4022
  },
3490
4023
  },
4024
+ // objectui#6301 — Configuration › Automatisation des packages (ADR-0126
4025
+ // §7.4). Terminologie du pack : `common.package` = Package,
4026
+ // `flowRunner.completed` = Flux, guillemets « … ». ⛔ Aucune formulation
4027
+ // d'ascendance ou de dérive dans ce groupe (§9).
4028
+ packagedAutomation: {
4029
+ title: "Automatisation des packages",
4030
+ subtitle: "Flux et actions fournis par les packages installés. Désactivez-en un pour ce déploiement, ou clonez un flux sous un nouveau nom pour le personnaliser. La modification se fait dans Studio.",
4031
+ refresh: "Actualiser",
4032
+ flowsHeading: "Flux des packages",
4033
+ actionsHeading: "Actions des packages",
4034
+ colFlow: "Flux",
4035
+ colActivation: "Activation",
4036
+ colActions: "Actions",
4037
+ toggleLabel: "Activation de {{label}}",
4038
+ on: "Activé",
4039
+ off: "Désactivé",
4040
+ clone: "Cloner",
4041
+ cloneTitle: "Cloner le flux du package",
4042
+ cloneBody: "La copie reprend toute la définition et exige un nouveau nom machine et un nouveau libellé. Modifiez la copie dans Studio.",
4043
+ cloneName: "Nouveau nom machine",
4044
+ cloneLabel: "Nouveau libellé",
4045
+ cancel: "Annuler",
4046
+ cloneConfirm: "Créer le clone",
4047
+ cloneCreated: "Flux « {{name}} » créé.",
4048
+ emptyTitle: "Aucun flux de package",
4049
+ emptyBody: "Aucun package installé ne fournit de flux d'automatisation sur ce déploiement. Les flux que vous créez vous-même se trouvent dans Studio.",
4050
+ loadFailed: "Impossible de charger l'automatisation des packages.",
4051
+ toggleFailedHttp: "Impossible de modifier l'activation (HTTP {{status}}).",
4052
+ toggleFailed: "Impossible de modifier l'activation.",
4053
+ cloneFailedHttp: "Impossible de cloner ce flux (HTTP {{status}}).",
4054
+ cloneFailed: "Impossible de cloner ce flux.",
4055
+ actionsSubtitle: "Actions fournies par les packages installés. Désactivez-en une pour ce déploiement et elle cesse de s'exécuter partout où elle est proposée. Vous pouvez toujours créer votre propre action à côté, dans Studio.",
4056
+ colAction: "Action",
4057
+ colObject: "Objet",
4058
+ actionToggleLabel: "Activation de {{label}} sur {{object}}",
4059
+ actionsEmptyTitle: "Aucune action de package",
4060
+ actionsEmptyBody: "Aucun package installé ne déclare d'action sur ce déploiement. Les actions que vous créez vous-même se trouvent dans Studio.",
4061
+ actionsLoadFailed: "Impossible de charger les actions des packages.",
4062
+ },
4063
+ element: {
4064
+ number: {
4065
+ noObject: "Aucun objet indiqué : définissez object ou dataSource.object.",
4066
+ },
4067
+ },
3491
4068
  };
3492
4069
  export default fr;