pgkiln 0.82.0 → 0.83.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 (61) hide show
  1. package/db/migrations/153_component_events.sql +21 -0
  2. package/docs/apex-feature-parity.md +3 -3
  3. package/docs/guide/03-builder.md +8 -1
  4. package/docs/guide/04-pages-and-regions.md +2 -1
  5. package/docs/guide/07-dynamic-actions.md +27 -0
  6. package/docs/guide/11-from-apex.md +2 -1
  7. package/docs/guide/12-development.md +9 -1
  8. package/package.json +1 -1
  9. package/public/app.css +2 -0
  10. package/public/app.js +85 -4
  11. package/public/builder.css +25 -2
  12. package/public/data-modeler.js +8 -5
  13. package/public/sql-monitor.js +5 -2
  14. package/src/builder/ai-builder.ts +50 -46
  15. package/src/builder/api.ts +49 -49
  16. package/src/builder/autorest.ts +92 -87
  17. package/src/builder/changelog.ts +39 -37
  18. package/src/builder/components.ts +5 -4
  19. package/src/builder/data-modeler.ts +89 -84
  20. package/src/builder/data-security.ts +39 -37
  21. package/src/builder/dataload.ts +69 -65
  22. package/src/builder/datapump.ts +108 -97
  23. package/src/builder/ddl-tools.ts +38 -34
  24. package/src/builder/document-view.ts +11 -11
  25. package/src/builder/i18n/de.ts +1627 -0
  26. package/src/builder/i18n/en.ts +1627 -0
  27. package/src/builder/i18n/es.ts +1627 -0
  28. package/src/builder/i18n/fr.ts +1627 -0
  29. package/src/builder/i18n/it.ts +1627 -0
  30. package/src/builder/i18n/ja.ts +1627 -0
  31. package/src/builder/i18n/ko.ts +1627 -0
  32. package/src/builder/i18n/nl.ts +1627 -0
  33. package/src/builder/i18n/pt.ts +1627 -0
  34. package/src/builder/i18n/zh-cn.ts +1627 -0
  35. package/src/builder/i18n/zh-tw.ts +1627 -0
  36. package/src/builder/i18n.ts +18 -0
  37. package/src/builder/object-actions.ts +18 -16
  38. package/src/builder/object-browser.ts +2 -2
  39. package/src/builder/querybuilder.ts +42 -36
  40. package/src/builder/quicksql.ts +16 -18
  41. package/src/builder/region-settings.ts +201 -199
  42. package/src/builder/report-settings.ts +64 -60
  43. package/src/builder/rest-modules.ts +145 -143
  44. package/src/builder/sampledata.ts +59 -52
  45. package/src/builder/scheduling.ts +180 -159
  46. package/src/builder/scripts.ts +71 -65
  47. package/src/builder/sql-charts.ts +36 -30
  48. package/src/builder/sql-monitor.ts +95 -89
  49. package/src/builder/sql-utilities.ts +47 -40
  50. package/src/builder/top-sql.ts +21 -17
  51. package/src/builder/unload.ts +48 -44
  52. package/src/builder/worksheet.ts +3 -3
  53. package/src/cron-schedule.ts +47 -17
  54. package/src/metadata.ts +3 -1
  55. package/src/runtime/calendar.ts +3 -2
  56. package/src/runtime/context.ts +2 -0
  57. package/src/runtime/grid.ts +1 -0
  58. package/src/runtime/maps.ts +7 -4
  59. package/src/runtime/render.ts +6 -1
  60. package/src/runtime/routes.ts +4 -0
  61. package/src/runtime/tree.ts +4 -3
@@ -2422,4 +2422,1631 @@ export const fr: BuilderMessages = {
2422
2422
  'gallery.item.autocomplete': 'Champ de texte avec saisie semi-automatique',
2423
2423
  'gallery.item.percent_graph': 'Graphique de pourcentage',
2424
2424
  'gallery.item.display_map': 'Afficher la carte',
2425
+ // ------------------------------------------------------------ SQL Monitor, Top SQL (sprint 162, CD-8)
2426
+ 'sm.views': 'Vues du moniteur SQL',
2427
+ 'sm.sessions': 'Sessions',
2428
+ 'sm.active': 'Actives',
2429
+ 'sm.idle_tx': 'Inactives dans une transaction',
2430
+ 'sm.blocked': 'Bloquées',
2431
+ 'sm.longest': 'Exécution la plus longue (s)',
2432
+ 'sm.cancel': 'Annuler',
2433
+ 'sm.terminate': 'Terminer',
2434
+ 'sm.cancel_confirm': 'Annuler l\'instruction exécutée par la session {pid} ?',
2435
+ 'sm.terminate_confirm': 'Terminer la session {pid} ? Sa transaction ouverte est annulée et le client est déconnecté.',
2436
+ 'sm.cancel_label': 'Annuler l\'instruction de la session {pid}',
2437
+ 'sm.terminate_label': 'Terminer la session {pid}',
2438
+ 'sm.sessions_intro': 'Les sessions clientes de cette base (pg_stat_activity), sans les inactives, les actives d\'abord.',
2439
+ 'sm.sessions_intro_all': 'Les sessions clientes de cette base (pg_stat_activity), les actives d\'abord.',
2440
+ 'sm.hide_idle': 'Masquer les sessions inactives',
2441
+ 'sm.show_idle': 'Afficher les sessions inactives',
2442
+ 'sm.query_text_note': 'Le texte d\'une requête n\'est affiché que pour les rôles dont le propriétaire peut lire les statistiques ({role}).',
2443
+ 'sm.col.user': 'Utilisateur',
2444
+ 'sm.col.application': 'Application',
2445
+ 'sm.col.state': 'État',
2446
+ 'sm.col.wait': 'Attente',
2447
+ 'sm.col.running': 'En cours (s)',
2448
+ 'sm.col.blocked_by': 'Bloquée par',
2449
+ 'sm.col.query': 'Requête',
2450
+ 'sm.col.actions': 'Actions',
2451
+ 'sm.statement_link': 'Statistiques et plan de cette instruction',
2452
+ 'sm.no_other': 'Aucune autre session.',
2453
+ 'sm.no_busy': 'Aucune session occupée.',
2454
+ 'sm.waits': 'Événements d\'attente',
2455
+ 'sm.waits_intro': 'Ce qu\'attendent maintenant les sessions actives du serveur ({cpu} quand elles n\'attendent pas).',
2456
+ 'sm.cpu_running': 'CPU : en cours',
2457
+ 'sm.col.type': 'Type',
2458
+ 'sm.col.event': 'Événement',
2459
+ 'sm.no_other_active': 'Aucune autre session active.',
2460
+ 'sm.in_progress': 'En cours',
2461
+ 'sm.col.command': 'Commande',
2462
+ 'sm.col.object': 'Objet',
2463
+ 'sm.col.phase': 'Phase',
2464
+ 'sm.col.done': 'Fait',
2465
+ 'sm.updated': 'Mis à jour {time} UTC',
2466
+ 'sm.refresh': 'Actualiser',
2467
+ 'sm.refresh_every': 'Actualiser toutes les',
2468
+ 'sm.seconds': '{n} secondes',
2469
+ 'sm.pause': 'Pause',
2470
+ 'sm.not_client': 'La session {pid} n\'est pas (ou plus) une session cliente de cette base.',
2471
+ 'sm.cancelled': 'La session {pid} a été priée d\'annuler son instruction.',
2472
+ 'sm.terminated': 'Session {pid} terminée.',
2473
+ 'sm.not_signalled': 'La session {pid} n\'a pas pu être signalée.',
2474
+ 'sm.col.role': 'Rôle',
2475
+ 'sm.col.calls': 'Appels',
2476
+ 'sm.col.total_ms': 'Total ms',
2477
+ 'sm.col.mean_ms': 'Moyenne ms',
2478
+ 'sm.col.rows': 'Lignes',
2479
+ 'sm.col.hit': 'Blocs trouvés',
2480
+ 'sm.col.read': 'Blocs lus',
2481
+ 'sm.col.statement': 'Instruction',
2482
+ 'sm.sort_by': 'Trier par {column}',
2483
+ 'sm.contains': 'L\'instruction contient',
2484
+ 'sm.no_match': 'Aucune instruction ne correspond.',
2485
+ 'sm.none_yet': 'Aucune instruction enregistrée pour l\'instant.',
2486
+ 'sm.since': 'Statistiques depuis {time}.',
2487
+ 'sm.at_most': '100 instructions au plus sont affichées ; les littéraux et variables liées apparaissent comme {p1}, {p2}….',
2488
+ 'sm.reset_confirm': 'Effacer les statistiques d\'instructions de tout le serveur ?',
2489
+ 'sm.reset': 'Réinitialiser les statistiques',
2490
+ 'sm.reset_done': 'Statistiques d\'instructions réinitialisées.',
2491
+ 'sm.top_intro': 'Les instructions de cette base issues de {ext}, tous rôles confondus. Cliquez sur une instruction pour son plan.',
2492
+ 'sm.statement': 'Instruction',
2493
+ 'sm.temp_blocks_written': 'Blocs temporaires écrits',
2494
+ 'sm.text': 'Texte',
2495
+ 'sm.sql_text': 'Texte SQL',
2496
+ 'sm.open_worksheet': 'Ouvrir dans la feuille de calcul',
2497
+ 'sm.back_top': 'Retour à Top SQL',
2498
+ 'sm.by_role': 'Par rôle',
2499
+ 'sm.nested': 'imbriquée',
2500
+ 'sm.col.stddev_ms': 'Écart type ms',
2501
+ 'sm.col.min_ms': 'Min ms',
2502
+ 'sm.col.max_ms': 'Max ms',
2503
+ 'sm.col.hit_short': 'Trouvés',
2504
+ 'sm.col.read_short': 'Lus',
2505
+ 'sm.col.temp_read': 'Temp. lus',
2506
+ 'sm.col.temp_written': 'Temp. écrits',
2507
+ 'sm.explain_plan': 'Plan d\'exécution',
2508
+ 'sm.explain_intro': 'EXPLAIN sans exécuter l\'instruction. Les noms non qualifiés sont recherchés d\'abord dans le schéma choisi.',
2509
+ 'sm.explain_intro_params': 'EXPLAIN sans exécuter l\'instruction : ses paramètres ($1, …) reçoivent un plan générique. Les noms non qualifiés sont recherchés d\'abord dans le schéma choisi.',
2510
+ 'sm.schema': 'Schéma',
2511
+ 'sm.search_path': '(le chemin de recherche)',
2512
+ 'sm.explain': 'Expliquer',
2513
+ 'sm.err.one': 'Une seule instruction SQL peut être expliquée.',
2514
+ 'sm.err.kind': 'Seules les instructions SELECT, INSERT, UPDATE, DELETE, MERGE et VALUES ont un plan.',
2515
+ 'sm.err.generic': 'L\'instruction a des paramètres ($1, …) : PostgreSQL 16 ou plus récent peut l\'expliquer avec un plan générique. Ouvrez-la dans la feuille de calcul et saisissez des valeurs.',
2516
+ 'sm.err.params': 'L\'instruction a trop de paramètres pour être expliquée.',
2517
+ 'topsql.not_installed': 'L\'extension {ext} n\'est pas installée dans cette base. Pour l\'activer : définissez {setting} (postgresql.conf ou {alter}), redémarrez PostgreSQL, puis en superutilisateur : {create}',
2518
+ 'topsql.not_loaded': 'Le serveur ne charge pas encore {ext}. Définissez {setting} (le {compose} de développement le fait) et redémarrez PostgreSQL.',
2519
+ 'topsql.read_error': 'Les statistiques n\'ont pas pu être lues : {message}',
2520
+ 'topsql.sort_by': 'Trier par {total} {mean} {calls} {rows}',
2521
+ 'topsql.sort.total': 'temps total',
2522
+ 'topsql.sort.mean': 'temps par appel',
2523
+ 'topsql.sort.calls': 'appels',
2524
+ 'topsql.sort.rows': 'lignes',
2525
+ 'topsql.share': 'Part',
2526
+ 'topsql.reset_confirm': 'Effacer les statistiques du rôle {role} ?',
2527
+ 'topsql.reset': 'Réinitialiser les statistiques',
2528
+ 'topsql.none_yet': 'Aucune instruction enregistrée pour {role} pour l\'instant. Utilisez l\'application, puis revenez.',
2529
+ 'topsql.no_role': 'Cette application s\'exécute avec le rôle propriétaire : ses instructions ne peuvent pas être distinguées. Donnez-lui un rôle de base de données dans les Paramètres.',
2530
+ 'topsql.owner': '(propriétaire)',
2531
+ 'topsql.intro': 'Instructions exécutées avec le rôle {role} depuis la dernière réinitialisation des statistiques, issues de {ext}. Les littéraux et variables liées apparaissent comme {p1}, {p2}… ; les applications qui partagent un rôle partagent cette liste.',
2532
+ 'topsql.back_activity': 'Retour à l\'activité',
2533
+ 'topsql.activity': 'Activité',
2534
+ 'topsql.no_db_role': 'L\'application n\'a pas de rôle de base de données.',
2535
+ 'topsql.reset_done': 'Statistiques réinitialisées.',
2536
+ // ------------------------------------------------------------ SQL Monitor and Data Modeler in the browser (sprint 162)
2537
+ 'js.sm.resume': 'Reprendre',
2538
+ 'js.sm.pause': 'Pause',
2539
+ 'js.sm.stopped': 'Actualisation arrêtée : le moniteur est injoignable (déconnecté ?). Rechargez la page.',
2540
+ 'js.dm.unsaved': 'Modifications non enregistrées',
2541
+ 'js.dm.saving': 'Enregistrement…',
2542
+ 'js.dm.saved': 'Enregistré',
2543
+ 'js.dm.not_saved': 'Non enregistré ({error}) : réessayez',
2544
+ 'js.dm.no_png': 'Le PNG n\'a pas pu être créé : exportez plutôt en SVG',
2545
+ // ------------------------------------------------------------ Quick SQL, SQL Scripts (sprint 162, CD-8)
2546
+ 'qs.syntax': 'Syntaxe',
2547
+ 'qs.syntax.tables': 'Un nom de table sur sa propre ligne, ses colonnes indentées en dessous. Une table indentée sous une autre est une table enfant : elle reçoit `<parent>_id` qui référence la table parente.',
2548
+ 'qs.syntax.types': 'Types de colonne déduits du nom (`*_id` bigint, `*_at` timestamptz, `*_date`/`*_on` date, `is_*` boolean, `price`/`amount` numeric, sinon text) ou écrits après : `vc200`, `num`, `num(10,2)`, `int`, `date`, `ts`, `tstz`, `clob`, `blob`, `json`, `bool`, `uuid`.',
2549
+ 'qs.syntax.directives': 'Directives de colonne : `/nn`, `/pk`, `/unique`, `/idx`, `/fk table`, `/check a, b`, `/between 1 and 10`, `/default value`, `/lower`, `/upper` ; `[a comment]`. Directive de table : `/auditcols`.',
2550
+ 'qs.syntax.settings': 'Paramètres : `# pk: identity | seq | guid | none`, `# schema: name`, `# prefix: xx`, `# drop: true`, `# auditcols: true` ou `# settings = { pk: "guid", schema: "app" }`.',
2551
+ 'qs.syntax.views': '`view name table1 table2` : une vue qui joint les tables par leurs clés étrangères. `--` commence un commentaire.',
2552
+ 'qs.generate': 'Générer le SQL',
2553
+ 'qs.line': 'Ligne {line} : {message}',
2554
+ 'qs.generated': 'SQL généré',
2555
+ 'qs.save_or_run': 'Enregistrer ou exécuter',
2556
+ 'qs.script_name': 'Nom du script',
2557
+ 'qs.save_script': 'Enregistrer comme script',
2558
+ 'qs.run': 'Exécuter',
2559
+ 'qs.too_large': 'Le Quick SQL dépasse 1 Mo.',
2560
+ 'qs.script_too_large': 'Le script généré est trop volumineux.',
2561
+ 'qs.saved': 'Enregistré comme script « {name} ».',
2562
+ 'scr.error': 'Erreur',
2563
+ 'scr.skipped': 'Ignorée',
2564
+ 'scr.not_run': 'Non exécutée',
2565
+ 'scr.summary': '{n} instruction(s) : {ok} réussie(s), {failed} en échec.',
2566
+ 'scr.summary_rest': '{n} instruction(s) : {ok} réussie(s), {failed} en échec, {rest} non exécutée(s) ou ignorée(s).',
2567
+ 'scr.rolled_back_note': 'La transaction a été annulée : rien n\'a été modifié.',
2568
+ 'scr.no_statements': 'Le script ne contient aucune instruction.',
2569
+ 'scr.line': 'ligne {line}',
2570
+ 'scr.done': 'terminé',
2571
+ 'scr.rows': '{n} ligne(s)',
2572
+ 'scr.first_rows': '{shown} premières lignes sur {n}.',
2573
+ 'scr.when_fails': 'Quand une instruction échoue',
2574
+ 'scr.stop': 'Arrêter le script',
2575
+ 'scr.continue': 'Continuer avec l\'instruction suivante',
2576
+ 'scr.one_tx': 'Exécuter dans une transaction (avec « Arrêter », un échec annule tout le script)',
2577
+ 'scr.col.started': 'Début',
2578
+ 'scr.col.script': 'Script',
2579
+ 'scr.col.by': 'Par',
2580
+ 'scr.col.statements': 'Instructions',
2581
+ 'scr.col.failed': 'En échec',
2582
+ 'scr.col.result': 'Résultat',
2583
+ 'scr.rolled_back': 'Annulé',
2584
+ 'scr.errors': 'Erreurs',
2585
+ 'scr.no_runs': 'Aucune exécution pour l\'instant.',
2586
+ 'scr.col.updated': 'Modifié',
2587
+ 'scr.col.size': 'Taille',
2588
+ 'scr.col.last_run': 'Dernière exécution',
2589
+ 'scr.col.open': 'Ouvrir',
2590
+ 'scr.by': 'par {user}',
2591
+ 'scr.never': 'jamais',
2592
+ 'scr.worksheet': 'Feuille de calcul',
2593
+ 'scr.download': 'Télécharger',
2594
+ 'scr.none_yet': 'Aucun script pour l\'instant. Créez-en un, chargez un fichier .sql ou générez-en un avec Quick SQL.',
2595
+ 'scr.create': 'Créer un script',
2596
+ 'scr.scripts': 'Scripts',
2597
+ 'scr.upload_title': 'Charger un script',
2598
+ 'scr.file': 'Fichier .sql (UTF-8, jusqu\'à {mb} Mo)',
2599
+ 'scr.upload': 'Charger',
2600
+ 'scr.recent_runs': 'Exécutions récentes',
2601
+ 'scr.name': 'Nom',
2602
+ 'scr.description': 'Description',
2603
+ 'scr.content_help': 'Les instructions se terminent par un point-virgule (hors chaînes, commentaires et corps $$). Les commandes psql (\\set, \\i …) sont ignorées.',
2604
+ 'scr.statements': '{n} instruction(s).',
2605
+ 'scr.save': 'Enregistrer',
2606
+ 'scr.save_run': 'Enregistrer et exécuter',
2607
+ 'scr.delete_confirm': 'Supprimer ce script et son historique d\'exécution ?',
2608
+ 'scr.delete': 'Supprimer',
2609
+ 'scr.new': 'Nouveau script',
2610
+ 'scr.script_title': 'Script : {name}',
2611
+ 'scr.runs': 'Exécutions',
2612
+ 'scr.err.name': 'Donnez un nom au script (200 caractères au plus).',
2613
+ 'scr.err.size': 'Le script dépasse {mb} Mo.',
2614
+ 'scr.err.exists': 'Un script nommé « {name} » existe déjà.',
2615
+ 'scr.saved': 'Script « {name} » enregistré.',
2616
+ 'scr.deleted': 'Script « {name} » supprimé.',
2617
+ 'scr.err.choose': 'Choisissez un fichier .sql.',
2618
+ 'scr.err.file_size': 'Le fichier dépasse {mb} Mo.',
2619
+ 'scr.err.utf8': 'Le fichier n\'est pas du texte UTF-8.',
2620
+ 'scr.err.text': 'Le fichier n\'est pas un fichier texte.',
2621
+ 'scr.uploaded': 'Script « {name} » chargé.',
2622
+ 'scr.opt.stop': 'arrêt en cas d\'erreur',
2623
+ 'scr.opt.continue': 'continuer en cas d\'erreur',
2624
+ 'scr.opt.one_tx': 'une transaction',
2625
+ 'scr.results_title': 'Résultats du script',
2626
+ 'scr.results': 'Résultats',
2627
+ 'scr.results_of': 'Résultats : {name}',
2628
+ 'scr.run_by': 'Exécuté par {user} à {time} en {ms} ms ({options}).',
2629
+ 'scr.edit': 'Modifier le script',
2630
+ // ------------------------------------------------------------ Generate DDL, Schema Comparison, Change Log (sprint 162, CD-8)
2631
+ 'ddl.type.types': 'Types et domaines',
2632
+ 'ddl.type.sequences': 'Séquences',
2633
+ 'ddl.type.tables': 'Tables (contraintes, index)',
2634
+ 'ddl.type.views': 'Vues et vues matérialisées',
2635
+ 'ddl.type.functions': 'Fonctions et procédures',
2636
+ 'ddl.type.triggers': 'Déclencheurs',
2637
+ 'ddl.type.policies': 'Sécurité au niveau des lignes et politiques',
2638
+ 'ddl.choose_schema': '- choisir un schéma -',
2639
+ 'ddl.of': 'DDL de {schema}',
2640
+ 'ddl.objects_review': '{n} objet(s). Relisez le script avant de l\'exécuter (SQL Workshop → Scripts SQL).',
2641
+ 'ddl.download': 'Télécharger {file}',
2642
+ 'ddl.intro': 'Le DDL des objets d\'un schéma, issu du catalogue, dans un ordre qui s\'exécute : types, séquences, tables, fonctions, vues, contraintes, index, déclencheurs, sécurité au niveau des lignes, commentaires et droits (APEX : Générer le DDL). Les objets des extensions sont exclus.',
2643
+ 'ddl.objects': 'Objets',
2644
+ 'ddl.comments': 'Commentaires',
2645
+ 'ddl.grants': 'Droits',
2646
+ 'ddl.generate': 'Générer',
2647
+ 'cmp.only_source': 'Uniquement dans la source',
2648
+ 'cmp.only_target': 'Uniquement dans la cible',
2649
+ 'cmp.different': 'Différents',
2650
+ 'cmp.n_only_source': '{n} uniquement dans la source',
2651
+ 'cmp.n_only_target': '{n} uniquement dans la cible',
2652
+ 'cmp.n_different': '{n} différent(s)',
2653
+ 'cmp.apply_confirm': 'Exécuter le script de modification sur {target} en une transaction ?',
2654
+ 'cmp.apply': 'Appliquer et enregistrer',
2655
+ 'cmp.apply_note': 'Exécute le script sur {target} (les drops commentés restent exclus) et l\'enregistre dans le {log}.',
2656
+ 'cmp.change_log': 'journal des modifications',
2657
+ 'cmp.two_different': 'Choisissez deux schémas différents.',
2658
+ 'cmp.summary': 'Résumé',
2659
+ 'cmp.differences': '{n} différence(s) : {parts} ; {same} objet(s) identique(s).',
2660
+ 'cmp.same': 'Les schémas sont identiques ({n} objets).',
2661
+ 'cmp.both': '{source} et {target}',
2662
+ 'cmp.script_title': 'Script de modification : rendre {target} comme {source}',
2663
+ 'cmp.script_intro': 'Crée ce que seul {source} possède, modifie ce qui diffère et liste ce que seul {target} possède sous forme de drops commentés ; les colonnes dont l\'identité ou la génération change, ainsi que les types, domaines et séquences différents, sont laissés à relire. Rien ne s\'exécute avant que vous choisissiez Appliquer et enregistrer.',
2664
+ 'cmp.change_script': 'Script de modification',
2665
+ 'cmp.intro': 'Compare les objets de deux schémas de cette base par leur DDL (APEX : Comparaison de schémas), p. ex. une copie de développement avec son schéma d\'origine, et écrit un script qui rend la cible identique à la source. L\'ordre des colonnes d\'une table n\'est pas comparé.',
2666
+ 'cmp.source': 'Source',
2667
+ 'cmp.target': 'Cible (à rendre identique à la source)',
2668
+ 'cmp.compare': 'Comparer',
2669
+ 'cmp.nothing': '{target} est déjà identique à {source} : rien à appliquer.',
2670
+ 'cmp.failed': 'Rien n\'a été modifié : le script s\'est exécuté dans une transaction, qui a été annulée. {error}',
2671
+ 'cmp.applied': '{target} est maintenant identique à {source} : {n} instruction(s), enregistrées dans le journal des modifications.',
2672
+ 'cl.from.table': 'Propriétés de la table',
2673
+ 'cl.schemas': 'Schémas',
2674
+ 'cl.col.change_set': 'Ensemble de modifications',
2675
+ 'cl.col.author': 'Auteur',
2676
+ 'cl.col.recorded': 'Enregistré',
2677
+ 'cl.col.from': 'Depuis',
2678
+ 'cl.col.latest_export': 'Dernier export de l\'application',
2679
+ 'cl.col.migration_file': 'Fichier de migration',
2680
+ 'cl.rename': 'Renommer',
2681
+ 'cl.delete_confirm': 'Supprimer l\'ensemble de modifications {n} du journal ? La base n\'est pas modifiée et son numéro n\'est pas réattribué.',
2682
+ 'cl.in_it': 'inclus',
2683
+ 'cl.after_it': 'après',
2684
+ 'cl.written': 'écrit {time}',
2685
+ 'cl.not_yet': 'pas encore',
2686
+ 'cl.none_yet': 'Aucun ensemble de modifications pour l\'instant. Le DDL exécuté dans la feuille SQL, appliqué dans Propriétés de la table ou depuis la comparaison de schémas est enregistré ici.',
2687
+ 'cl.compare_with': 'Comparer avec le dernier export de',
2688
+ 'cl.show': 'Afficher',
2689
+ 'cl.export_note': '✓ inclus : enregistré avant le dernier export de l\'application, donc un déploiement de cet export attend la modification. {after} : à livrer avec le prochain export.',
2690
+ 'cl.no_exports': 'Aucune application de cet espace de travail n\'a encore été exportée depuis le générateur (Application › Exporter) : les ensembles de modifications ne peuvent pas être comparés à un export.',
2691
+ 'cl.format': 'Format',
2692
+ 'cl.format.flyway': 'Flyway : fichiers V0001__name.sql (un zip pour plusieurs)',
2693
+ 'cl.format.liquibase': 'Liquibase : changelog SQL formaté',
2694
+ 'cl.format.sql': 'Script SQL simple',
2695
+ 'cl.change_sets': 'Ensembles de modifications',
2696
+ 'cl.which.pending': 'Pas encore écrits dans un fichier ({n})',
2697
+ 'cl.which.all': 'Tous ceux de {schema} ({n})',
2698
+ 'cl.which.after': 'Après le dernier export de {app} ({n})',
2699
+ 'cl.download': 'Télécharger la migration',
2700
+ 'cl.intro': 'Le journal des modifications (Liquibase, Flyway) : le DDL exécuté depuis la feuille SQL, les propriétés de table et la comparaison de schémas est conservé en ensembles de modifications par schéma, avec qui l\'a exécuté et quand. Téléchargez-les comme migration pour une autre base : fichiers versionnés Flyway, changelog SQL formaté Liquibase ou script simple. Seules les instructions réussies sont conservées ; les modifications de données (INSERT, UPDATE, DELETE) ne le sont pas.',
2701
+ 'cl.change_sets_of': 'Ensembles de modifications de {schema}',
2702
+ 'cl.nothing_to_write': 'Aucun ensemble de modifications à écrire : chacun est dans un fichier antérieur. Choisissez « Tous ».',
2703
+ 'cl.bad_name': 'Un nom se compose de minuscules, chiffres et _ (60 au plus) et commence par une lettre ou un chiffre.',
2704
+ 'cl.renamed': 'L\'ensemble de modifications {n} est maintenant {file}.',
2705
+ 'cl.deleted': 'Ensemble de modifications {n} retiré du journal ; la base est inchangée.',
2706
+ // ------------------------------------------------------------ Charts, Unload Data (sprint 162, CD-8)
2707
+ 'ch.kind.bar': 'Barres',
2708
+ 'ch.kind.column': 'Colonnes',
2709
+ 'ch.kind.stacked': 'Barres empilées',
2710
+ 'ch.kind.line': 'Courbe',
2711
+ 'ch.kind.area': 'Aire',
2712
+ 'ch.kind.donut': 'Anneau',
2713
+ 'ch.kind.pie': 'Secteurs',
2714
+ 'ch.kind.scatter': 'Nuage de points',
2715
+ 'ch.type': 'Type',
2716
+ 'ch.labels': 'Libellés',
2717
+ 'ch.values': 'Valeurs',
2718
+ 'ch.no_number': 'La requête n\'a aucune colonne numérique à dessiner.',
2719
+ 'ch.row_one': '1 ligne.',
2720
+ 'ch.rows': '{n} lignes.',
2721
+ 'ch.rows_first': '{n} lignes (les {n} premières).',
2722
+ 'ch.intro': 'Des requêtes dessinées en graphiques. Créez-en un à partir d\'une requête dans la {worksheet} (onglet Graphique, Ctrl+F11), puis enregistrez-le.',
2723
+ 'ch.all': 'Tous les graphiques',
2724
+ 'ch.chart': 'Graphique',
2725
+ 'ch.on_dashboard_col': 'Sur le tableau de bord',
2726
+ 'ch.changed': 'Modifié',
2727
+ 'ch.yes': 'Oui',
2728
+ 'ch.no': 'Non',
2729
+ 'ch.none_yet': 'Aucun graphique pour l\'instant.',
2730
+ 'ch.on_dashboard': 'Sur le tableau de bord des graphiques',
2731
+ 'ch.query': 'La requête',
2732
+ 'ch.open_worksheet': 'Ouvrir dans la feuille de calcul',
2733
+ 'ch.delete_confirm': 'Supprimer le graphique {name} ?',
2734
+ 'ch.deleted': 'Graphique {name} supprimé.',
2735
+ 'ch.err.name': 'Un graphique a besoin d\'un nom (120 caractères au plus).',
2736
+ 'ch.err.exists': 'Un graphique nommé « {name} » existe déjà.',
2737
+ 'ch.saved': 'Graphique {name} enregistré.',
2738
+ 'ch.err.select': 'Seul un graphique d\'un unique SELECT peut être enregistré.',
2739
+ 'ch.err.name_new': 'Nommez le graphique pour l\'enregistrer (120 caractères au plus).',
2740
+ 'ch.saved_new': 'Graphique {name} enregistré : il est sur le tableau de bord des graphiques.',
2741
+ 'ul.fmt.xlsx': 'Excel (.xlsx)',
2742
+ 'ul.fmt.sql': 'Insertions SQL',
2743
+ 'ul.separator': 'Séparateur',
2744
+ 'ul.sep.comma': 'Virgule ,',
2745
+ 'ul.sep.semicolon': 'Point-virgule ;',
2746
+ 'ul.sep.tab': 'Tabulation',
2747
+ 'ul.sep.pipe': 'Barre verticale |',
2748
+ 'ul.enclosed': 'Encadré par',
2749
+ 'ul.enc.double': 'Guillemet double "',
2750
+ 'ul.enc.single': 'Apostrophe \'',
2751
+ 'ul.enclosed_help': 'Seules les valeurs contenant le séparateur, l\'encadrement ou un saut de ligne sont encadrées.',
2752
+ 'ul.header': 'Première ligne : noms des colonnes',
2753
+ 'ul.bom': 'Indicateur d\'ordre des octets UTF-8 (pour Excel)',
2754
+ 'ul.root': 'Élément racine',
2755
+ 'ul.row': 'Élément de ligne',
2756
+ 'ul.row_help': 'Un élément enfant par colonne ; les valeurs vides (null) sont omises.',
2757
+ 'ul.from': 'Décharger depuis',
2758
+ 'ul.table_or_view': 'Table ou vue',
2759
+ 'ul.intro': 'Téléchargez les lignes d\'une table, d\'une vue ou d\'une requête en CSV, JSON, Excel ou XML (jusqu\'à {n} lignes).',
2760
+ 'ul.intro2': 'S\'exécute avec la connexion propriétaire du générateur (l\'identifiant développeur d\'un espace de travail isolé pour ses développeurs) dans une transaction en lecture seule. Pour charger un fichier dans une table, utilisez {load}.',
2761
+ 'ul.unload_query': 'Décharger une requête',
2762
+ 'ul.one_select': 'Une instruction SELECT (ou WITH … SELECT).',
2763
+ 'ul.choose_table': '- choisir une table ou une vue -',
2764
+ 'ul.view': '(vue)',
2765
+ 'ul.choose': 'Choisir',
2766
+ 'ul.unload_table': 'Décharger une table ou une vue',
2767
+ 'ul.unload_of': 'Décharger {name}',
2768
+ 'ul.columns': 'Colonnes',
2769
+ 'ul.where': 'Where',
2770
+ 'ul.eg': 'p. ex. {x}',
2771
+ 'ul.where_help': 'Facultatif : une condition, sans le mot WHERE.',
2772
+ 'ul.order': 'Order by',
2773
+ 'ul.order_help': 'Facultatif : des colonnes, sans les mots ORDER BY.',
2774
+ 'ul.err.table': 'Choisissez une table ou une vue.',
2775
+ 'ul.err.column': 'Choisissez au moins une colonne.',
2776
+ 'ul.err.failed': 'La requête a échoué : {error}',
2777
+ // ------------------------------------------------------------ Sample Data (sprint 162, CD-8)
2778
+ 'sd.help': 'Générateurs et leurs options',
2779
+ 'sd.intro': 'Générez des lignes réalistes pour les tables d\'un schéma : noms, adresses e-mail, dates et nombres dans une plage, valeurs d\'une liste, clés étrangères qui choisissent des lignes parentes existantes. Prévisualisez-les, insérez-les en une transaction (parents d\'abord) ou téléchargez-les en SQL ou CSV. S\'exécute avec la connexion propriétaire du générateur (l\'identifiant développeur d\'un espace de travail isolé pour ses développeurs), comme la {worksheet}.',
2780
+ 'sd.none_saved': 'Aucun générateur enregistré pour l\'instant : générez des lignes ci-dessous, puis enregistrez la définition pour la relancer.',
2781
+ 'sd.table_one': '1 table',
2782
+ 'sd.tables_n': '{n} tables',
2783
+ 'sd.tables_of': 'Tables de {schema}',
2784
+ 'sd.about_rows': '~{n} lignes',
2785
+ 'sd.propose': 'Proposer des générateurs',
2786
+ 'sd.own_schema': 'Choisissez un de vos schémas : pas meta, information_schema ni pg_*.',
2787
+ 'sd.new': 'Nouveau générateur',
2788
+ 'sd.saved_title': 'Générateurs enregistrés',
2789
+ 'sd.generator': 'Générateur',
2790
+ 'sd.col_generator': '{column} : générateur',
2791
+ 'sd.col_options': '{column} : options',
2792
+ 'sd.options': 'options',
2793
+ 'sd.col_nulls': '{column} : % null',
2794
+ 'sd.pct_null': '% null',
2795
+ 'sd.missing': 'Introuvables désormais, omises : {tables}.',
2796
+ 'sd.seed': 'Graine',
2797
+ 'sd.seed_help': 'La même graine donne les mêmes lignes (pour les mêmes tables et lignes parentes). Vide : une nouvelle graine à chaque exécution ; un aperçu la remplit, ainsi Insérer ajoute les lignes que vous avez vues.',
2798
+ 'sd.change_tables': 'changer de tables',
2799
+ 'sd.preview': 'Aperçu',
2800
+ 'sd.insert': 'Insérer les lignes',
2801
+ 'sd.download_sql': 'Télécharger le SQL',
2802
+ 'sd.download_csv': 'Télécharger le CSV',
2803
+ 'sd.save_def': 'Enregistrer la définition',
2804
+ 'sd.save_new': 'Enregistrer comme nouveau générateur',
2805
+ 'sd.delete_confirm': 'Supprimer cette définition de générateur ? Les lignes déjà insérées restent.',
2806
+ 'sd.delete': 'Supprimer le générateur',
2807
+ 'sd.inserted': 'Inséré',
2808
+ 'sd.inserted_counts': '{counts} insérée(s) (graine {seed}).',
2809
+ 'sd.rolled_back': 'Annulé : rien n\'a été enregistré.',
2810
+ 'sd.seed_is': 'graine {seed}',
2811
+ 'sd.first_of': '{shown} premières sur {n}',
2812
+ 'sd.no_rows': 'Aucune ligne.',
2813
+ 'sd.err.name': 'Donnez un nom au générateur pour l\'enregistrer.',
2814
+ 'sd.err.length': 'Le nom fait au plus 100 caractères, la description 1000.',
2815
+ 'sd.err.table': 'Choisissez au moins une table.',
2816
+ 'sd.saved': 'Générateur {name} enregistré.',
2817
+ 'sd.err.action': 'Action inconnue.',
2818
+ 'sd.nothing_inserted': 'Rien n\'a été inséré : la transaction a été annulée.',
2819
+ 'sd.deleted': 'Générateur {name} supprimé.',
2820
+ // ------------------------------------------------------------ Sample Data generators (run-time keys sd.gen.*, sd.opt.*)
2821
+ 'sd.gen.skip': 'Ignorer (défaut / identité)',
2822
+ 'sd.gen.first_name': 'Prénom',
2823
+ 'sd.gen.last_name': 'Nom de famille',
2824
+ 'sd.gen.full_name': 'Nom complet',
2825
+ 'sd.gen.email': 'Adresse e-mail',
2826
+ 'sd.gen.username': 'Nom d\'utilisateur',
2827
+ 'sd.gen.phone': 'Numéro de téléphone',
2828
+ 'sd.gen.company': 'Nom de société',
2829
+ 'sd.gen.job_title': 'Intitulé de poste',
2830
+ 'sd.gen.address': 'Adresse',
2831
+ 'sd.gen.postal_code': 'Code postal',
2832
+ 'sd.gen.city': 'Ville',
2833
+ 'sd.gen.country': 'Pays',
2834
+ 'sd.gen.word': 'Mot',
2835
+ 'sd.gen.words': 'Mots (titre)',
2836
+ 'sd.gen.sentence': 'Phrase',
2837
+ 'sd.gen.code': 'Code (motif)',
2838
+ 'sd.gen.url': 'Adresse web',
2839
+ 'sd.gen.uuid': 'UUID',
2840
+ 'sd.gen.integer': 'Nombre entier (plage)',
2841
+ 'sd.gen.decimal': 'Nombre décimal (plage)',
2842
+ 'sd.gen.date': 'Date (plage)',
2843
+ 'sd.gen.timestamp': 'Horodatage (plage)',
2844
+ 'sd.gen.time': 'Heure (plage)',
2845
+ 'sd.gen.boolean': 'Booléen (% vrai)',
2846
+ 'sd.gen.list': 'Valeur d\'une liste',
2847
+ 'sd.gen.sequence': 'Séquence (début, pas)',
2848
+ 'sd.gen.foreign_key': 'Clé étrangère (ligne parente existante)',
2849
+ 'sd.gen.fixed': 'Valeur fixe',
2850
+ 'sd.opt.skip': 'non inséré : la valeur par défaut, l\'identité ou null',
2851
+ 'sd.opt.first_name': 'aucune option',
2852
+ 'sd.opt.last_name': 'aucune option',
2853
+ 'sd.opt.full_name': 'aucune option',
2854
+ 'sd.opt.email': 'aucune option',
2855
+ 'sd.opt.username': 'aucune option',
2856
+ 'sd.opt.phone': 'aucune option',
2857
+ 'sd.opt.company': 'aucune option',
2858
+ 'sd.opt.job_title': 'aucune option',
2859
+ 'sd.opt.address': 'aucune option',
2860
+ 'sd.opt.postal_code': 'aucune option',
2861
+ 'sd.opt.city': 'aucune option',
2862
+ 'sd.opt.country': 'aucune option',
2863
+ 'sd.opt.word': 'aucune option',
2864
+ 'sd.opt.words': 'nombre de mots, p. ex. 1..3',
2865
+ 'sd.opt.sentence': 'nombre de mots, p. ex. 4..12',
2866
+ 'sd.opt.code': 'motif : A lettre, a lettre minuscule, 9 chiffre, autres caractères tels quels, p. ex. AAA-9999',
2867
+ 'sd.opt.url': 'aucune option',
2868
+ 'sd.opt.uuid': 'aucune option',
2869
+ 'sd.opt.integer': 'min..max, p. ex. 1..1000 ; ou une autre colonne plus une plage, p. ex. quantity + 0..10',
2870
+ 'sd.opt.decimal': 'min..max ; les décimales de la colonne ou des nombres, p. ex. 0.00..999.99 ; ou colonne + min..max',
2871
+ 'sd.opt.date': 'de..à, p. ex. 2021-01-01..2026-12-31 ; ou une autre colonne plus des jours, p. ex. start_date + 0..14',
2872
+ 'sd.opt.timestamp': 'de..à (dates), p. ex. 2021-01-01..2026-12-31 ; ou colonne + min..max jours, p. ex. created_at + 0..2',
2873
+ 'sd.opt.time': 'de..à, p. ex. 08:00..18:00',
2874
+ 'sd.opt.boolean': 'pourcentage vrai, p. ex. 50',
2875
+ 'sd.opt.list': 'valeurs séparées par des virgules, p. ex. NEW, OPEN, CLOSED',
2876
+ 'sd.opt.sequence': 'début ou début, pas, p. ex. 1000, 10',
2877
+ 'sd.opt.foreign_key': 'une ligne parente existante au hasard ; les parents générés dans la même exécution sont insérés d\'abord',
2878
+ 'sd.opt.fixed': 'la valeur',
2879
+ // ------------------------------------------------------------ Query Builder (sprint 162, CD-8)
2880
+ 'qb.tables': 'Tables et vues',
2881
+ 'qb.tables_of': 'Tables et vues de {schema}',
2882
+ 'qb.view': 'vue',
2883
+ 'qb.no_tables': 'Ce schéma n\'a ni tables ni vues.',
2884
+ 'qb.apply': 'Appliquer',
2885
+ 'qb.columns_help': 'Aucune cochée : toutes les colonnes. Une fonction (count, sum, …) regroupe les lignes selon les autres colonnes choisies. Faites glisser une table par sa poignée (ou mettez le focus sur la poignée et utilisez les flèches) ; faites glisser le point à côté d\'une colonne sur une colonne d\'une autre table pour les joindre.',
2886
+ 'qb.distinct': 'Lignes distinctes',
2887
+ 'qb.move': 'Déplacer {table} (flèches)',
2888
+ 'qb.drag_move': 'Faire glisser pour déplacer',
2889
+ 'qb.function_for': 'Fonction pour {column}',
2890
+ 'qb.join_label': 'Joindre {column} à une colonne d\'une autre table',
2891
+ 'qb.join_title': 'Faire glisser sur une colonne d\'une autre table pour les joindre',
2892
+ 'qb.joins': 'Jointures',
2893
+ 'qb.joins_help': 'D\'après les clés étrangères entre les tables choisies, ou les colonnes que vous avez jointes.',
2894
+ 'qb.cross_join': 'Aucune clé étrangère ne relie {table} aux autres tables : produit cartésien. Joignez deux de leurs colonnes sur le canevas ou sous Jointures.',
2895
+ 'qb.on': 'sur',
2896
+ 'qb.and': 'et',
2897
+ 'qb.cross': 'produit cartésien',
2898
+ 'qb.join_type': 'Type de jointure pour {table}',
2899
+ 'qb.inner': 'jointure interne',
2900
+ 'qb.left': 'jointure gauche (garder les lignes sans correspondance)',
2901
+ 'qb.join_two': 'Joindre deux colonnes',
2902
+ 'qb.join_a': 'Jointure : colonne',
2903
+ 'qb.join_b': 'Jointure : colonne d\'une autre table',
2904
+ 'qb.conditions': 'Conditions',
2905
+ 'qb.rows_match': 'Les lignes doivent remplir',
2906
+ 'qb.all': 'toutes les conditions',
2907
+ 'qb.any': 'une condition quelconque',
2908
+ 'qb.cond_column': 'Condition {n} : colonne',
2909
+ 'qb.cond_operator': 'Condition {n} : opérateur',
2910
+ 'qb.cond_value': 'Condition {n} : valeur',
2911
+ 'qb.add_condition': 'Appliquer / ajouter une condition',
2912
+ 'qb.sort_limit': 'Tri et limite',
2913
+ 'qb.sort_column': 'Tri {n} : colonne',
2914
+ 'qb.sort_dir': 'Tri {n} : sens',
2915
+ 'qb.asc': 'croissant',
2916
+ 'qb.desc': 'décroissant',
2917
+ 'qb.limit': 'Au plus (lignes)',
2918
+ 'qb.run': 'Exécuter dans la feuille SQL',
2919
+ 'qb.fn.count': 'nombre',
2920
+ 'qb.fn.count_distinct': 'nombre distinct',
2921
+ 'qb.fn.sum': 'somme',
2922
+ 'qb.fn.avg': 'moyenne',
2923
+ 'qb.fn.min': 'minimum',
2924
+ 'qb.fn.max': 'maximum',
2925
+ 'qb.op.eq': 'égal à',
2926
+ 'qb.op.ne': 'différent de',
2927
+ 'qb.op.lt': 'inférieur à',
2928
+ 'qb.op.le': 'au plus',
2929
+ 'qb.op.gt': 'supérieur à',
2930
+ 'qb.op.ge': 'au moins',
2931
+ 'qb.op.like': 'comme (% _)',
2932
+ 'qb.op.ilike': 'comme, sans casse',
2933
+ 'qb.op.in': 'dans (a, b, c)',
2934
+ 'qb.op.is_null': 'est vide',
2935
+ 'qb.op.is_not_null': 'n\'est pas vide',
2936
+ // ------------------------------------------------------------ Object actions menu (sprint 162, CD-8)
2937
+ 'oa.actions_for': 'Actions pour {name}',
2938
+ 'oa.open': 'Ouvrir',
2939
+ 'oa.edit': 'Modifier…',
2940
+ 'oa.template': 'Utiliser comme modèle',
2941
+ 'oa.security': 'Sécurité…',
2942
+ 'oa.load': 'Charger des données',
2943
+ 'oa.fulltext': 'Ajouter la recherche plein texte…',
2944
+ 'oa.vector': 'Ajouter une colonne vectorielle…',
2945
+ 'oa.document': 'Vue document…',
2946
+ 'oa.index': 'Ajouter un index',
2947
+ 'oa.trigger': 'Ajouter un déclencheur',
2948
+ 'oa.policy': 'Ajouter une politique',
2949
+ 'oa.rest': 'REST › Activer / Désactiver',
2950
+ 'oa.ddl': 'DDL rapide vers la feuille',
2951
+ 'oa.ddl_file': 'DDL rapide en fichier',
2952
+ 'oa.drop': 'Supprimer…',
2953
+ 'oa.flash.ddl': 'Le DDL de {name}.',
2954
+ 'oa.flash.drop': 'Relisez l\'instruction DROP et exécutez-la vous-même : rien n\'a encore été supprimé.',
2955
+ 'oa.flash.fill': 'Complétez l\'instruction et exécutez-la : rien n\'a encore été modifié.',
2956
+ // ------------------------------------------------------------ Data Modeler (sprint 162, CD-8)
2957
+ 'dm.diagrams': 'Diagrammes',
2958
+ 'dm.delete_confirm': 'Supprimer le diagramme {name} ? Les tables restent telles quelles.',
2959
+ 'dm.delete_confirm_short': 'Supprimer le diagramme {name} ?',
2960
+ 'dm.none_yet': 'Aucun diagramme dans cet espace de travail pour l\'instant.',
2961
+ 'dm.name_placeholder': 'tables principales',
2962
+ 'dm.objects_placeholder': 'orders, customers ou *',
2963
+ 'dm.objects_help': 'Noms séparés par des virgules ou des espaces ; `*` pour tous, `ord*` pour ceux qui commencent par ord. Vous pourrez en ajouter plus tard.',
2964
+ 'dm.create': 'Créer un diagramme',
2965
+ 'dm.intro': 'Diagrammes relationnels des tables et vues d\'un schéma : leurs colonnes, clés et les clés étrangères entre elles. À partir d\'un diagramme : son DDL et un dictionnaire de données.',
2966
+ 'dm.schema_gone': 'Le schéma {schema} n\'existe plus, ou cet espace de travail ne peut pas l\'utiliser.',
2967
+ 'dm.delete_diagram': 'Supprimer le diagramme',
2968
+ 'dm.diagram': 'Diagramme',
2969
+ 'dm.undo': 'Annuler',
2970
+ 'dm.redo': 'Rétablir',
2971
+ 'dm.zoom_out': 'Zoom arrière',
2972
+ 'dm.zoom_in': 'Zoom avant',
2973
+ 'dm.fit': 'Ajuster',
2974
+ 'dm.auto': 'Disposition automatique',
2975
+ 'dm.minimap': 'Mini-carte',
2976
+ 'dm.export_svg': 'Exporter en SVG',
2977
+ 'dm.print': 'Imprimer',
2978
+ 'dm.dictionary': 'Dictionnaire de données',
2979
+ 'dm.add_objects': 'Ajouter des objets',
2980
+ 'dm.objects_in': 'Objets de ce diagramme',
2981
+ 'dm.kind': 'Type',
2982
+ 'dm.references': 'Références',
2983
+ 'dm.remove_label': 'Retirer {name} du diagramme',
2984
+ 'dm.remove': 'Retirer',
2985
+ 'dm.no_objects': 'Aucun objet pour l\'instant : ajoutez-en ci-dessous.',
2986
+ 'dm.search_label': 'Rechercher dans les tables et vues de {schema}',
2987
+ 'dm.search_placeholder': 'Partie d\'un nom, emp* ou * pour tous',
2988
+ 'dm.found': '{n} trouvé(s)',
2989
+ 'dm.found_first': '500 trouvés (les 500 premiers)',
2990
+ 'dm.add_to': 'Ajouter au diagramme',
2991
+ 'dm.nothing_matches': 'Rien d\'autre ne correspond à {q}.',
2992
+ 'dm.settings': 'Renommer ou supprimer le diagramme',
2993
+ 'dm.head': 'Schéma {schema} · {n} objets · modifié {time} par {user}',
2994
+ 'dm.missing': 'Plus dans {schema} : {names}. L\'enregistrement du diagramme les omet.',
2995
+ 'dm.canvas_label': 'Diagramme {name} : faites glisser une boîte pour la déplacer, ou mettez-la au focus et utilisez les flèches',
2996
+ 'dm.legend': 'P clé primaire · F clé étrangère · U unique · {star} non null · une ligne va de la table qui référence (patte d\'oie : plusieurs) à la table référencée (barre : un) ; en pointillés quand la clé étrangère peut être vide.',
2997
+ 'dm.legend_opens_table': 'Le nom d\'une boîte ouvre les propriétés de la table.',
2998
+ 'dm.legend_opens_object': 'Le nom d\'une boîte ouvre l\'objet.',
2999
+ 'dm.add_title': 'Ajouter des objets au diagramme',
3000
+ 'dm.con.p': 'Clé primaire',
3001
+ 'dm.con.u': 'Unique',
3002
+ 'dm.con.f': 'Clé étrangère',
3003
+ 'dm.con.c': 'Vérification',
3004
+ 'dm.dict_title': 'Dictionnaire de données : {name}',
3005
+ 'dm.dict_head': 'Schéma {schema} · {n} objets · généré {time} UTC',
3006
+ 'dm.columns_of': 'Colonnes de {name}',
3007
+ 'dm.col.column': 'Colonne',
3008
+ 'dm.col.null': 'Null',
3009
+ 'dm.col.default': 'Défaut',
3010
+ 'dm.col.key': 'Clé',
3011
+ 'dm.col.comment': 'Commentaire',
3012
+ 'dm.constraints': 'Contraintes',
3013
+ 'dm.constraints_of': 'Contraintes de {name}',
3014
+ 'dm.definition': 'Définition',
3015
+ 'dm.referenced_by': 'Référencée par',
3016
+ 'dm.err.name': 'Un diagramme a besoin d\'un nom.',
3017
+ 'dm.created_n': 'Diagramme {name} créé avec {n} objets.',
3018
+ 'dm.created_empty': 'Diagramme {name} créé : ajoutez-y des objets.',
3019
+ 'dm.err.exists': 'Il existe déjà un diagramme {name} dans cet espace de travail.',
3020
+ 'dm.removed': '{name} retiré du diagramme (la table reste telle quelle).',
3021
+ 'dm.err.nothing': 'Rien à ajouter : choisissez des tables ou vues du schéma absentes du diagramme.',
3022
+ 'dm.added': '{n} objet(s) ajouté(s) : {names}.',
3023
+ 'dm.laid_out': 'Les boîtes ont été redisposées.',
3024
+ 'dm.saved': 'Diagramme enregistré.',
3025
+ 'dm.renamed': 'Diagramme renommé en {name}.',
3026
+ 'dm.deleted': 'Diagramme {name} supprimé.',
3027
+ 'dm.ddl_intro': 'Les instructions CREATE des {n} objets du diagramme dans le schéma {schema} : tables, clés, index, déclencheurs, sécurité au niveau des lignes, politiques, commentaires et droits, et vues. À relire avant exécution.',
3028
+ 'dm.back': 'Retour au diagramme',
3029
+ 'dm.open_worksheet': 'Ouvrir dans la feuille SQL',
3030
+ 'dm.download_html': 'Télécharger le HTML',
3031
+ 'dm.print_pdf': 'Imprimer ou enregistrer en PDF',
3032
+ // ------------------------------------------------------------ Data Modeler (singular)
3033
+ 'dm.added_one': '1 objet ajouté : {names}.',
3034
+ // ------------------------------------------------------------ Change Log (note)
3035
+ 'cl.after_it_title': 'Après',
3036
+ // ------------------------------------------------------------ SQL Workshop Utilities, Object Reports, About Database (sprint 162, CD-8)
3037
+ 'su.title': 'Utilitaires de SQL Workshop',
3038
+ 'su.failed': 'Le rapport a échoué.',
3039
+ 'su.nothing': 'Rien trouvé.',
3040
+ 'su.over': 'Sur les schémas que {role} peut utiliser.',
3041
+ 'su.col.owner': 'Propriétaire',
3042
+ 'su.tables': 'Tables',
3043
+ 'su.setting': 'Paramètre',
3044
+ 'su.value': 'Valeur',
3045
+ 'su.extension': 'Extension',
3046
+ 'su.version': 'Version',
3047
+ 'su.database': 'Base de données',
3048
+ 'su.running_since': 'En service depuis',
3049
+ 'su.runs_as': 'SQL Workshop s\'exécute en tant que {user} (connecté en tant que {login}).',
3050
+ 'su.settings': 'Paramètres',
3051
+ 'su.extensions': 'Extensions',
3052
+ 'su.no_schemas': 'Aucun schéma.',
3053
+ 'su.r.no_primary_key': 'Tables sans clé primaire',
3054
+ 'su.r.no_primary_key.about': 'Les formulaires, grilles interactives et l\'écriture REST ont besoin d\'une clé pour retrouver une ligne.',
3055
+ 'su.r.unindexed_foreign_keys': 'Clés étrangères sans index',
3056
+ 'su.r.unindexed_foreign_keys.about': 'Supprimer ou modifier une ligne parente parcourt la table enfant, et les jointures depuis le parent sont plus lentes. Un index sur les colonnes de la clé étrangère (dans cet ordre) l\'évite.',
3057
+ 'su.r.rls_without_policies': 'Sécurité au niveau des lignes sans politiques',
3058
+ 'su.r.rls_without_policies.about': 'La sécurité au niveau des lignes est activée mais la table n\'a pas de politique : tous les rôles sauf son propriétaire (et ceux qui contournent RLS) ne voient aucune ligne et n\'en modifient aucune.',
3059
+ 'su.r.no_row_level_security': 'Tables sans sécurité au niveau des lignes',
3060
+ 'su.r.no_row_level_security.about': 'Tout rôle ayant un droit sur ces tables voit et modifie toutes leurs lignes. Bien pour des tables de référence ; activez la sécurité au niveau des lignes quand les lignes appartiennent à des utilisateurs ou des locataires.',
3061
+ 'su.r.public_grants': 'Droits accordés à PUBLIC',
3062
+ 'su.r.public_grants.about': 'Chaque rôle de base de données, y compris ceux créés plus tard, a ces droits.',
3063
+ 'su.r.unused_indexes': 'Index inutilisés',
3064
+ 'su.r.unused_indexes.about': 'Index qu\'aucune requête n\'a utilisés depuis la dernière réinitialisation des statistiques (hors clés primaires et uniques). Ils ralentissent les écritures et prennent de la place ; vérifiez chaque serveur (les réplicas comptent séparément) avant d\'en supprimer un.',
3065
+ 'su.r.largest_tables': 'Plus grandes tables',
3066
+ 'su.r.largest_tables.about': 'Les 100 plus grandes tables avec leurs index et données TOAST.',
3067
+ 'su.r.no_comments': 'Tables sans commentaire',
3068
+ 'su.r.no_comments.about': 'Les commentaires (COMMENT ON) documentent un modèle de données ; l\'App Builder et son IA les lisent. SQL Workshop → IA → Décrire les tables en rédige.',
3069
+ 'su.col.rows': 'Lignes (estimation)',
3070
+ 'su.col.constraint': 'Clé étrangère',
3071
+ 'su.col.columns': 'Colonnes',
3072
+ 'su.col.parent': 'Référence',
3073
+ 'su.col.suggestion': 'Index',
3074
+ 'su.col.forced': 'Forcée pour le propriétaire',
3075
+ 'su.col.grants': 'Accordé à',
3076
+ 'su.col.kind': 'Type',
3077
+ 'su.col.privileges': 'Droits',
3078
+ 'su.col.index': 'Index',
3079
+ 'su.col.size': 'Taille',
3080
+ 'su.col.table_size': 'Table',
3081
+ 'su.col.index_size': 'Index',
3082
+ 'su.col.total': 'Total',
3083
+ 'su.col.commented': 'Avec un commentaire',
3084
+ // ------------------------------------------------------------ SQL Workshop AI (sprint 162, CD-8)
3085
+ 'swai.service': 'Service d\'IA : {name} ({provider}, {model}). Les noms, types et descriptions des tables et colonnes, et ce que vous saisissez, lui sont envoyés.',
3086
+ 'swai.no_service': 'L\'App Builder n\'a pas encore de service d\'IA : demandez à un administrateur d\'en choisir un ici.',
3087
+ 'swai.service_label': 'Service d\'IA de l\'App Builder (administrateurs)',
3088
+ 'swai.none': '- aucun : pas d\'IA dans l\'App Builder -',
3089
+ 'swai.service_help': 'Les noms, types et descriptions des tables et colonnes (jamais les lignes), et ce que saisissent les développeurs, lui sont envoyés. Ses appels sont journalisés sans application.',
3090
+ 'swai.describe_link': 'Décrire les tables pour l\'IA',
3091
+ 'swai.describe_why': '(meilleures réponses : dites ce que signifient tables et colonnes)',
3092
+ 'swai.question_title': 'SQL à partir d\'une question',
3093
+ 'swai.question_intro': 'La réponse est affichée, jamais exécutée : vérifiez-la, puis exécutez-la dans la feuille SQL si vous le souhaitez.',
3094
+ 'swai.question': 'Question',
3095
+ 'swai.question_placeholder': 'p. ex. employés par département avec leur salaire moyen',
3096
+ 'swai.thinking': 'Réflexion…',
3097
+ 'swai.write_sql': 'Écrire le SQL',
3098
+ 'swai.explain_title': 'Expliquer une requête ou une erreur',
3099
+ 'swai.schema_optional': 'Schéma (facultatif)',
3100
+ 'swai.none_short': '- aucun -',
3101
+ 'swai.error_optional': 'Message d\'erreur (facultatif)',
3102
+ 'swai.back': 'IA de SQL Workshop',
3103
+ 'swai.describe_intro': 'Dites ce que signifient tables et colonnes : les descriptions accompagnent la liste des tables quand l\'App Builder demande du SQL ou des pages à un modèle. Sans description, le commentaire de la base est utilisé.',
3104
+ 'swai.choose': '- choisir -',
3105
+ 'swai.show_tables': 'Afficher les tables',
3106
+ 'swai.described': 'décrite',
3107
+ 'swai.drafted': 'Rédigé par l\'IA à partir des noms et types : vérifiez et modifiez les descriptions, puis enregistrez.',
3108
+ 'swai.the_kind': 'Description ({kind})',
3109
+ 'swai.key': 'clé',
3110
+ 'swai.description_of': 'Description de {name}',
3111
+ 'swai.as_comments': 'Les enregistrer aussi comme commentaires de base (COMMENT ON)',
3112
+ 'swai.save_descriptions': 'Enregistrer les descriptions',
3113
+ 'swai.draft': 'Rédiger avec l\'IA',
3114
+ 'swai.describe_crumb': 'Décrire les tables',
3115
+ 'swai.proposed': 'SQL proposé',
3116
+ 'swai.not_run': 'SQL (non exécuté)',
3117
+ 'swai.explanation': 'Explication',
3118
+ 'swai.err.question': 'Saisissez une question.',
3119
+ 'swai.err.schema': 'Choisissez un schéma.',
3120
+ 'swai.err.paste': 'Collez une requête, un message d\'erreur ou les deux.',
3121
+ 'swai.err.no_such': 'Il n\'y a pas de service d\'IA {name}.',
3122
+ 'swai.uses': 'L\'App Builder utilise le service d\'IA {name}.',
3123
+ 'swai.uses_none': 'L\'App Builder n\'utilise aucun service d\'IA.',
3124
+ 'swai.saved': 'Descriptions de {name} enregistrées.',
3125
+ 'swai.saved_comments': 'Descriptions de {name} enregistrées, aussi comme commentaires de base.',
3126
+ 'swai.not_saved': 'Non enregistré : {error}',
3127
+ // ------------------------------------------------------------ Schema Export / Import (sprint 162, CD-8)
3128
+ 'dp.content.all': 'Définitions et données',
3129
+ 'dp.content.definitions': 'Définitions seulement',
3130
+ 'dp.content.data': 'Données seulement',
3131
+ 'dp.admins_only': 'Seuls les administrateurs exportent et importent des schémas : un export contient toutes les lignes d\'un schéma, un import exécute son SQL avec le rôle propriétaire de pgkiln.',
3132
+ 'dp.status.uploaded': 'chargé',
3133
+ 'dp.status.running': 'en cours',
3134
+ 'dp.status.succeeded': 'réussi',
3135
+ 'dp.status.failed': 'échoué',
3136
+ 'dp.status.cancelled': 'annulé',
3137
+ 'dp.what.export': 'Export de {schema}',
3138
+ 'dp.plain_sql': '(SQL simple)',
3139
+ 'dp.what.upload': 'Chargement de {file}',
3140
+ 'dp.what.import': 'Import de {schema} dans {target}',
3141
+ 'dp.tools': '{version} et pg_restore pour un serveur PostgreSQL {server}. Les fichiers sont gardés {n} jours dans le répertoire des dumps.',
3142
+ 'dp.tools_one': '{version} et pg_restore pour un serveur PostgreSQL {server}. Les fichiers sont gardés {n} jour dans le répertoire des dumps.',
3143
+ 'dp.need_tools': 'L\'export et l\'import nécessitent pg_dump et pg_restore.',
3144
+ 'dp.found': 'Trouvés : {list}.',
3145
+ 'dp.col.job': 'Tâche',
3146
+ 'dp.col.what': 'Quoi',
3147
+ 'dp.col.seconds': 'Secondes',
3148
+ 'dp.intro': 'Un schéma vers un fichier avec pg_dump, et un fichier vers un schéma avec pg_restore (Data Pump), en tâches de fond.',
3149
+ 'dp.export_schema': 'Exporter un schéma',
3150
+ 'dp.import': 'Importer',
3151
+ 'dp.jobs': 'Tâches',
3152
+ 'dp.removed': 'supprimé',
3153
+ 'dp.no_jobs': 'Aucun export ni import pour l\'instant.',
3154
+ 'dp.export_of': 'Exporter {schema}',
3155
+ 'dp.fmt.custom': 'Personnalisé (compressé ; s\'importe ici avec pg_restore)',
3156
+ 'dp.fmt.plain': 'SQL simple (pour psql ; ne s\'importe pas ici)',
3157
+ 'dp.content': 'Contenu',
3158
+ 'dp.tables': 'Tables, vues et séquences',
3159
+ 'dp.mode.all': 'Tout le schéma',
3160
+ 'dp.mode.only': 'Seulement ceux cochés',
3161
+ 'dp.mode.except': 'Tous sauf ceux cochés',
3162
+ 'dp.no_tables': 'Le schéma n\'a ni tables, ni vues, ni séquences.',
3163
+ 'dp.some_tables_note': 'Seulement certaines tables : le fichier n\'a pas de CREATE SCHEMA, et les fonctions, types et autres objets du schéma restent exclus.',
3164
+ 'dp.start_export': 'Lancer l\'export',
3165
+ 'dp.export': 'Export',
3166
+ 'dp.col.file': 'Fichier',
3167
+ 'dp.col.made': 'Créé',
3168
+ 'dp.upload_title': 'Charger un dump',
3169
+ 'dp.upload_label': 'Une archive custom ou tar d\'un schéma (pg_dump -Fc ou -Ft), jusqu\'à {mb} Mo',
3170
+ 'dp.upload_note': 'La page suivante montre le contenu de l\'archive avant toute exécution. Un dump est du code : ses fonctions et déclencheurs s\'exécutent avec le rôle propriétaire de pgkiln, n\'importez donc que des dumps de confiance.',
3171
+ 'dp.or_export': 'Ou un export de ce serveur',
3172
+ 'dp.import_dots': 'Importer…',
3173
+ 'dp.no_exports': 'Aucun export au format custom n\'est conservé.',
3174
+ 'dp.no_create_schema': '(certaines tables : pas de CREATE SCHEMA)',
3175
+ 'dp.none': 'aucun',
3176
+ 'dp.data_of': '(données de {n})',
3177
+ 'dp.object_type': 'Type d\'objet',
3178
+ 'dp.entries': 'Entrées',
3179
+ 'dp.import_into': 'Importer dans',
3180
+ 'dp.target_help': 'Un nouveau schéma est créé ; dans un schéma existant, les objets du dump sont ajoutés (ou remplacés, ci-dessous). Un autre nom que {schema} renomme le schéma du dump dans la même transaction.',
3181
+ 'dp.clean': 'Supprimer d\'abord les objets du dump dans le schéma',
3182
+ 'dp.one_tx_note': 'Tout s\'exécute en une transaction : une erreur annule tout. Les objets appartiennent au rôle propriétaire de pgkiln. Les noms dans les corps PL/pgSQL sont du texte : après un renommage ils indiquent toujours {schema}.',
3183
+ 'dp.start_import': 'Lancer l\'import',
3184
+ 'dp.holds': 'Ce que contient {file}',
3185
+ 'dp.job': 'Tâche n° {id}',
3186
+ 'dp.opt.format': 'format {format}',
3187
+ 'dp.opt.only': 'seulement {list}',
3188
+ 'dp.opt.without': 'sans {list}',
3189
+ 'dp.opt.cleaned': 'objets existants supprimés d\'abord',
3190
+ 'dp.created': 'Créé',
3191
+ 'dp.finished': 'Terminé',
3192
+ 'dp.options': 'Options',
3193
+ 'dp.job_lower': 'tâche n° {id}',
3194
+ 'dp.kept_until': 'conservé jusqu\'au {time}',
3195
+ 'dp.delete_with_file': 'Supprimer avec son fichier',
3196
+ 'dp.job_kind': 'Tâche n° {id} : {kind}',
3197
+ 'dp.kind.export': 'export',
3198
+ 'dp.kind.import': 'import',
3199
+ 'dp.log': 'Journal',
3200
+ 'dp.nothing_logged': 'Rien de journalisé.',
3201
+ 'dp.nothing_logged_yet': 'Rien de journalisé pour l\'instant.',
3202
+ 'dp.err.check_tables': 'Cochez les tables à exporter.',
3203
+ 'dp.err.not_importable': 'Ce fichier ne peut pas (ou plus) être importé.',
3204
+ 'dp.err.schema_name': 'Le schéma : lettres, chiffres, _ et $, jusqu\'à 63, sans commencer par un chiffre.',
3205
+ 'dp.err.choose_file': 'Choisissez un fichier.',
3206
+ 'dp.err.too_large': 'Le fichier dépasse {mb} Mo (PGKILN_DUMP_MAX_MB).',
3207
+ 'dp.err.empty': 'Le fichier est vide.',
3208
+ 'dp.cancelling': 'Annulation de la tâche.',
3209
+ 'dp.not_running': 'La tâche ne s\'exécute pas (ou plus) sur ce serveur.',
3210
+ 'dp.deleted': 'Tâche n° {id} supprimée.',
3211
+ // ------------------------------------------------------------ Scheduling (sprint 162, CD-8)
3212
+ 'cr.job_n': 'Tâche {id}',
3213
+ 'cr.job_n_lower': 'tâche {id}',
3214
+ 'cr.admins_only': 'Seuls les administrateurs planifient des tâches de base : pg_cron les exécute sur le serveur, sous n\'importe quel rôle.',
3215
+ 'cr.next_runs': 'Prochaines exécutions ({tz}) :',
3216
+ 'cr.no_times': 'Aucune heure planifiée : elle s\'exécute au démarrage du serveur de base.',
3217
+ 'cr.inactive': 'inactif',
3218
+ 'cr.at_start': 'au démarrage du serveur',
3219
+ 'cr.unreadable': 'illisible',
3220
+ 'cr.never_ran': 'jamais exécutée',
3221
+ 'cr.step1': 'Installez le paquet pg_cron sur le serveur de base (par exemple {apt}, ou l\'option pg_cron de votre fournisseur cloud).',
3222
+ 'cr.step2': 'Dans {conf} (ou {alter}) : {preload} et {db} ; éventuellement {tz} (GMT par défaut). Redémarrez PostgreSQL.',
3223
+ 'cr.step3': 'En superutilisateur, dans cette base : {create}',
3224
+ 'cr.why.not_available': 'pg_cron n\'est pas installé sur ce serveur de base.',
3225
+ 'cr.why.not_loaded': 'pg_cron est installé sur le serveur mais pas chargé : il n\'est pas dans {preload}.',
3226
+ 'cr.why.other_database': 'pg_cron s\'exécute dans la base {other} ({setting}), pas dans {db}. Définissez {set} et redémarrez, ou planifiez depuis cette base (les tâches peuvent toujours s\'exécuter ici avec {fn}).',
3227
+ 'cr.why.not_created': 'pg_cron est chargé, mais l\'extension n\'est pas encore créée dans cette base.',
3228
+ 'cr.why.no_access': 'pg_cron est installé, mais la connexion propriétaire de pgkiln ne peut pas lire ses tâches : {message}. Accordez-lui l\'accès (en superutilisateur : {grant}) ou connectez pgkiln avec le rôle propriétaire des tâches.',
3229
+ 'cr.why.old': 'Ce pg_cron ({version}) est trop ancien : pgkiln a besoin de la version 1.4 ou plus ({fn1}, {fn2}). {update}',
3230
+ 'cr.to_schedule': 'Pour planifier du SQL avec pg_cron :',
3231
+ 'cr.own_scheduler': 'Le planificateur de pgkiln fonctionne sans lui : les {automations} d\'une application exécutent du SQL selon un calendrier en tant que l\'application, et les chaînes d\'exécution en arrière-plan s\'exécutent comme {jobs}. Elles sont listées ci-dessous.',
3232
+ 'cr.automations_path': 'Composants partagés › Automatisations',
3233
+ 'cr.process_jobs_lower': 'tâches de processus',
3234
+ 'cr.col.automation': 'Automatisation',
3235
+ 'cr.col.schedule': 'Planification',
3236
+ 'cr.col.next_run': 'Prochaine exécution',
3237
+ 'cr.col.last_run': 'Dernière exécution',
3238
+ 'cr.col.started_by': 'Lancé par',
3239
+ 'cr.col.queued': 'En file',
3240
+ 'cr.col.ended': 'Terminé',
3241
+ 'cr.automations': 'Automatisations',
3242
+ 'cr.automations_intro': 'Planifiées par pgkiln lui-même, par application (Composants partagés › Automatisations), dans le fuseau de chaque automatisation.',
3243
+ 'cr.disabled': 'désactivée',
3244
+ 'cr.soon': 'bientôt',
3245
+ 'cr.no_automations': 'Aucune automatisation.',
3246
+ 'cr.process_jobs': 'Tâches de processus',
3247
+ 'cr.process_jobs_intro': 'Les dernières chaînes d\'exécution lancées en arrière-plan par des pages.',
3248
+ 'cr.no_process_jobs': 'Aucune tâche de processus.',
3249
+ 'cr.col.run_as': 'Exécuter en tant que',
3250
+ 'cr.create': 'Créer une tâche',
3251
+ 'cr.history': 'Historique des exécutions',
3252
+ 'cr.jobs': 'Tâches',
3253
+ 'cr.failed_last': 'Échouées à leur dernière exécution',
3254
+ 'cr.pg_cron_jobs': 'Tâches pg_cron',
3255
+ 'cr.list_intro': 'pg_cron {version} exécute ces tâches sur le serveur de base ; les heures sont dans son fuseau {tz} ({setting}).',
3256
+ 'cr.own_only': 'La connexion propriétaire de pgkiln ({user}) ne voit que ses propres tâches : pg_cron montre à chaque rôle les siennes.',
3257
+ 'cr.search': 'Rechercher des tâches',
3258
+ 'cr.failures': '{n} échecs sur les 10 dernières exécutions',
3259
+ 'cr.no_match': 'Aucune tâche ne correspond.',
3260
+ 'cr.none_yet': 'Aucune tâche pour l\'instant. {create}.',
3261
+ 'cr.create_one': 'Créez-en une',
3262
+ 'cr.own_work': 'Travail planifié propre à pgkiln (automatisations, tâches de processus)',
3263
+ 'cr.job': 'Tâche',
3264
+ 'cr.name_placeholder': 'vacuum nocturne',
3265
+ 'cr.name_help': 'Unique par rôle d\'exécution.',
3266
+ 'cr.database_help': 'pg_cron s\'y connecte pour exécuter la commande.',
3267
+ 'cr.run_as_help': 'Le rôle sous lequel la commande s\'exécute. Seul un superutilisateur planifie des tâches pour un autre rôle.',
3268
+ 'cr.active_help': 'Une tâche inactive garde sa planification et ne s\'exécute pas.',
3269
+ 'cr.command': 'Commande',
3270
+ 'cr.command_help': 'SQL exécuté hors d\'un bloc de transaction, comme pg_cron l\'exécute : `vacuum analyze` fonctionne ; plusieurs instructions sont validées chacune séparément.',
3271
+ 'cr.schedule_help': 'Cinq champs, `minute hour day-of-month month day-of-week` ; `n seconds` (1 à 59) ; ou `@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly`, `@reboot`.',
3272
+ 'cr.presets': 'Planifications courantes',
3273
+ 'cr.choose': 'Choisir…',
3274
+ 'cr.use': 'Utiliser',
3275
+ 'cr.builder': 'Générateur de planification',
3276
+ 'cr.use_fields': 'Utiliser ces champs',
3277
+ 'cr.review': 'Vérifier le SQL',
3278
+ 'cr.review_intro': 'Ces instructions s\'exécutent en une transaction sur la connexion propriétaire de pgkiln quand vous les appliquez : toutes ou aucune.',
3279
+ 'cr.nothing': 'Rien à modifier.',
3280
+ 'cr.failed_box': '{nothing} : les instructions se sont exécutées dans une transaction, qui a été annulée.',
3281
+ 'cr.nothing_changed': 'Rien n\'a été modifié',
3282
+ 'cr.edit_title': 'Modifier {name}',
3283
+ 'cr.edit': 'Modifier',
3284
+ 'cr.create_crumb': 'Créer',
3285
+ 'cr.err.clash': '{user} a déjà une tâche nommée {name}.',
3286
+ 'cr.change_title': 'Modifier {name}',
3287
+ 'cr.create_title': 'Créer la tâche {name}',
3288
+ 'cr.back_form': 'Retour au formulaire',
3289
+ 'cr.review_crumb': 'Vérifier',
3290
+ 'cr.err.changed_form': 'Les instructions ont changé depuis votre vérification (la tâche ou le formulaire a changé) : vérifiez-les à nouveau.',
3291
+ 'cr.changed': 'Tâche {name} modifiée.',
3292
+ 'cr.created': 'Tâche {name} créée.',
3293
+ 'cr.col.run': 'Exécution',
3294
+ 'cr.col.duration': 'Durée',
3295
+ 'cr.col.message': 'Message',
3296
+ 'cr.no_runs': 'Aucune exécution.',
3297
+ 'cr.run_confirm': 'Exécuter {name} maintenant, en tant que {user} dans {db} ?',
3298
+ 'cr.run_now': 'Exécuter maintenant',
3299
+ 'cr.disable': 'Désactiver',
3300
+ 'cr.enable': 'Activer',
3301
+ 'cr.unschedule_dots': 'Déplanifier…',
3302
+ 'cr.job_id': 'Id de la tâche',
3303
+ 'cr.recent_runs': 'Exécutions récentes',
3304
+ 'cr.all_runs': 'Toutes les exécutions de cette tâche',
3305
+ 'cr.purge_its': 'Purger son historique',
3306
+ 'cr.enable_failed': 'L\'activation a échoué : {error}',
3307
+ 'cr.disable_failed': 'La désactivation a échoué : {error}',
3308
+ 'cr.enabled': '{name} activée : {sql}',
3309
+ 'cr.disabled_flash': '{name} désactivée : {sql}',
3310
+ 'cr.err.changed': 'Les instructions ont changé depuis votre vérification : vérifiez-les à nouveau.',
3311
+ 'cr.unscheduled': '{name} déplanifiée. Son historique reste jusqu\'à ce que vous le purgiez.',
3312
+ 'cr.unschedule_title': 'Déplanifier {name}',
3313
+ 'cr.unschedule_note': 'pg_cron oublie la tâche ; ses exécutions restent dans l\'historique jusqu\'à leur purge.',
3314
+ 'cr.unschedule': 'Déplanifier',
3315
+ 'cr.ran': '{what} en {secs}, en tant que {user} dans {db} : {message}',
3316
+ 'cr.ran_ok': 'Exécutée',
3317
+ 'cr.ran_failed': 'Échouée',
3318
+ 'cr.run_now_note': 'Exécuter maintenant lance la commande depuis pgkiln, pas depuis pg_cron : elle n\'apparaît pas dans l\'historique de pg_cron ; le journal d\'activité de pgkiln la contient.',
3319
+ 'cr.purge_dots': 'Purger…',
3320
+ 'cr.runs': 'Exécutions',
3321
+ 'cr.history_intro': '{table} de pg_cron, les plus récentes d\'abord (200 au plus) ; heures en {tz}. pg_cron garde chaque exécution jusqu\'à sa purge.',
3322
+ 'cr.all_jobs': 'Toutes les tâches',
3323
+ 'cr.any_status': 'Tout statut',
3324
+ 'cr.search_messages_label': 'Rechercher messages et commandes',
3325
+ 'cr.search_messages': 'Rechercher des messages',
3326
+ 'cr.filter': 'Filtrer',
3327
+ 'cr.older_7': 'de plus de 7 jours',
3328
+ 'cr.older_30': 'de plus de 30 jours',
3329
+ 'cr.older_90': 'de plus de 90 jours',
3330
+ 'cr.purge_all': 'toutes',
3331
+ 'cr.purged': 'Historique des exécutions purgé.',
3332
+ 'cr.purge_title': 'Purger l\'historique des exécutions',
3333
+ 'cr.which_runs': 'Quelles exécutions',
3334
+ 'cr.runs_of': 'Exécutions de {name}',
3335
+ 'cr.would_delete_one': '1 exécution serait supprimée.',
3336
+ 'cr.would_delete': '{n} exécutions seraient supprimées.',
3337
+ 'cr.purge': 'Purger',
3338
+ // ------------------------------------------------------------ Scheduling: fields, statuses, presets, schedules in words (cron.*)
3339
+ 'cr.f.minute': 'Minute',
3340
+ 'cr.f.minute_help': '0-59',
3341
+ 'cr.f.hour': 'Heure',
3342
+ 'cr.f.hour_help': '0-23',
3343
+ 'cr.f.day': 'Jour du mois',
3344
+ 'cr.f.day_help': '1-31, $ = dernier',
3345
+ 'cr.f.month': 'Mois',
3346
+ 'cr.f.month_help': '1-12 ou jan-dec',
3347
+ 'cr.f.weekday': 'Jour de la semaine',
3348
+ 'cr.f.weekday_help': '0-6 (0 = dimanche) ou sun-sat',
3349
+ 'cr.status.starting': 'démarrage',
3350
+ 'cr.status.running': 'en cours',
3351
+ 'cr.status.sending': 'envoi',
3352
+ 'cr.status.connecting': 'connexion',
3353
+ 'cr.status.succeeded': 'réussie',
3354
+ 'cr.status.failed': 'échouée',
3355
+ 'cr.preset.p1': 'Chaque minute',
3356
+ 'cr.preset.p2': 'Toutes les 30 secondes',
3357
+ 'cr.preset.p3': 'Toutes les 5 minutes',
3358
+ 'cr.preset.p4': 'Toutes les 15 minutes',
3359
+ 'cr.preset.p5': 'Chaque heure',
3360
+ 'cr.preset.p6': 'Chaque jour à 02:00',
3361
+ 'cr.preset.p7': 'Chaque jour à minuit',
3362
+ 'cr.preset.p8': 'En semaine à 07:00',
3363
+ 'cr.preset.p9': 'Chaque dimanche à 03:00',
3364
+ 'cr.preset.p10': 'Premier jour du mois à 01:00',
3365
+ 'cr.preset.p11': 'Dernier jour du mois à 23:00',
3366
+ 'cr.preset.p12': 'Chaque année le 1er janvier',
3367
+ 'cron.reboot': 'Au démarrage du serveur de base',
3368
+ 'cron.every_second': 'Chaque seconde',
3369
+ 'cron.every_seconds': 'Toutes les {n} secondes',
3370
+ 'cron.every_minute': 'Chaque minute',
3371
+ 'cron.every_minutes': 'Toutes les {n} minutes',
3372
+ 'cron.every_hour': 'Chaque heure',
3373
+ 'cron.minute_of_hour': 'À la minute {m} de chaque heure',
3374
+ 'cron.minutes_of_hour': 'Aux minutes {list} de chaque heure',
3375
+ 'cron.at': 'À {times}',
3376
+ 'cron.at_minute': 'À la minute {m}',
3377
+ 'cron.at_minutes': 'Aux minutes {list}',
3378
+ 'cron.of_every_hours': '{mins} toutes les {n} heures',
3379
+ 'cron.past_hours': '{mins} des heures {list}',
3380
+ 'cron.day_and_last': 'le jour {list} et le dernier jour du mois',
3381
+ 'cron.last_day': 'le dernier jour du mois',
3382
+ 'cron.day_of_month': 'le jour {list} du mois',
3383
+ 'cron.weekdays': 'en semaine',
3384
+ 'cron.on_days': 'le {list}',
3385
+ 'cron.a_days': 'un {list}',
3386
+ 'cron.either': '{dom} ou {dow}',
3387
+ 'cron.if': '{dom} si c\'est {dow}',
3388
+ 'cron.every_day': 'chaque jour',
3389
+ 'cron.in_months': 'en {list}',
3390
+ 'cron.range': '{from} à {to}',
3391
+ // ------------------------------------------------------------ Region and report settings (CD-8)
3392
+ 'rs.set_items': 'Définir les éléments',
3393
+ 'rs.text_when_there_are_no': 'Texte quand il n\'y a pas de lignes',
3394
+ 'rs.fill_colour_lines_polygons': 'Couleur de remplissage (lignes / polygones)',
3395
+ 'rs.line_colour': 'Couleur de ligne',
3396
+ 'rs.line_width': 'Épaisseur de ligne',
3397
+ 'rs.opacity_0_1': 'Opacité (0–1)',
3398
+ 'rs.rows_per_page': 'Lignes par page',
3399
+ 'rs.aggregates_in_the_footer': 'Agrégats dans le pied',
3400
+ 'rs.frozen_columns': 'Colonnes figées',
3401
+ 'rs.public_reports_by': 'Rapports publics par',
3402
+ 'rs.as_a_master_column_of': 'En maître : colonne de la ligne sélectionnée',
3403
+ 'rs.goes_into_item': '… va dans l\'élément',
3404
+ 'rs.as_a_detail_follows_item': 'En détail : suit l\'élément',
3405
+ 'rs.and_new_rows_get_it': '… et les nouvelles lignes le reçoivent dans la colonne',
3406
+ 'rs.load': 'Chargement',
3407
+ 'rs.name_legend': 'Nom (légende)',
3408
+ 'rs.show_places_as': 'Afficher les lieux comme',
3409
+ 'rs.query': 'Requête',
3410
+ 'rs.each_place_links_to_page': 'Chaque lieu renvoie à la page',
3411
+ 'rs.report_region': 'Région de rapport',
3412
+ 'rs.filter_by': 'Filtrer par',
3413
+ 'rs.suggestions_per_facet_0_10': 'Suggestions par facette (0–10)',
3414
+ 'rs.placeholder_of_the_search_field': 'Texte indicatif du champ de recherche',
3415
+ 'rs.shown_first': 'Affiché en premier',
3416
+ 'rs.week_and_day_views_from': 'Vues semaine et jour à partir de l\'heure',
3417
+ 'rs.until_hour': 'Jusqu\'à l\'heure',
3418
+ 'rs.sql_that_moves_an_event': 'SQL qui déplace un événement',
3419
+ 'rs.key_column': 'Colonne clé',
3420
+ 'rs.who_may_drag': 'Qui peut faire glisser',
3421
+ 'rs.show_as': 'Afficher comme',
3422
+ 'rs.carousel_next_region_every_seconds': 'Carrousel : région suivante toutes les (secondes)',
3423
+ 'rs.chart_type': 'Type de graphique',
3424
+ 'rs.sql_that_moves_a_task': 'SQL qui déplace une tâche',
3425
+ 'rs.steps': 'Étapes',
3426
+ 'rs.style': 'Style',
3427
+ 'rs.list': 'Liste',
3428
+ 'rs.template': 'Modèle',
3429
+ 'rs.layer_name_legend': 'Nom de la couche (légende)',
3430
+ 'rs.height': 'Hauteur',
3431
+ 'rs.zoom_for_a_single_place': 'Zoom pour un seul lieu (1–19)',
3432
+ 'rs.levels_open_at_first': 'Niveaux ouverts au départ',
3433
+ 'rs.show': 'Afficher',
3434
+ 'rs.behaviour': 'Comportement',
3435
+ 'rs.totals_and_columns': 'Totaux et colonnes',
3436
+ 'rs.views': 'Vues',
3437
+ 'rs.row_actions': 'Actions de ligne',
3438
+ 'rs.master_detail': 'Maître-détail',
3439
+ 'rs.columns': 'Colonnes',
3440
+ 'rs.filter_a_report': 'Filtrer un rapport',
3441
+ 'rs.filters': 'Filtres',
3442
+ 'rs.facets': 'Facettes',
3443
+ 'rs.drag_and_drop': 'Glisser-déposer',
3444
+ 'rs.appearance': 'Apparence',
3445
+ 'rs.regions': 'Régions',
3446
+ 'rs.gauge': 'Jauge',
3447
+ 'rs.gantt_drag_and_drop': 'Gantt : glisser-déposer',
3448
+ 'rs.workflows': 'Workflows',
3449
+ 'rs.tasks': 'Tâches',
3450
+ 'rs.saving_needs_a_process_of': 'L\'enregistrement nécessite un processus de type "grid_dml" pour cette région ; sans lui la grille est en lecture seule.',
3451
+ 'rs.column_sum_avg_count_min': 'colonne=sum, avg, count, min ou max ; séparez les colonnes par ";". Calculé sur toutes les lignes de la recherche, pas seulement la page. Les utilisateurs peuvent ajouter les leurs (Actions → Agrégat).',
3452
+ 'rs.stay_in_view_while_the': 'Restent visibles pendant le défilement horizontal de la grille. Les utilisateurs peuvent le changer, déplacer, redimensionner et masquer les colonnes ; "layout" dans le JSON fixe l\'ordre et les largeurs par défaut.',
3453
+ 'rs.views_users_may_switch_to': 'Vues vers lesquelles les utilisateurs peuvent basculer en plus de la grille. La vue ligne unique modifie une ligne à la fois (aussi depuis le menu des actions de ligne) ; regroupement et graphique se configurent dans Actions.',
3454
+ 'rs.a_master_grid_s_selected': 'La ligne sélectionnée d\'une grille maître met sa valeur dans un élément de page ; les grilles détail et les rapports l\'utilisent dans leur requête (:P1_ID) et sont actualisés sans recharger la page. D\'autres types de région suivent avec {"master": {"item": "P1_ID"}}.',
3455
+ 'rs.edit_as_picks_a_shared': '« Modifier comme » choisit une liste de valeurs partagée (Composants partagés → Listes de valeurs) pour une liste déroulante.',
3456
+ 'rs.the_visible_area_and_vector': 'La zone visible et les tuiles vectorielles nécessitent `lat`/`lng` (ou une géométrie PostGIS) et se rechargent quand la carte bouge. Les tuiles vectorielles dessinent points, lignes et zones, sans regroupement ni liste.',
3457
+ 'rs.the_same_columns_as_the': 'Les mêmes colonnes que la requête de la carte. Videz la requête pour retirer la couche.',
3458
+ 'rs.the_condition_runs_on_the': 'La condition s\'exécute sur le serveur : avec PostGIS installé sur une colonne geometry/geography, sinon sur la latitude et la longitude.',
3459
+ 'rs.users_switch_between_the_ticked': 'Les utilisateurs basculent entre les vues cochées. Les heures hors plage sont ajoutées quand un événement en a besoin.',
3460
+ 'rs.runs_as_the_application_s': 'S\'exécute avec le rôle de base de l\'application (la sécurité au niveau des lignes s\'applique) avec `:EVENT_ID` (la valeur de la colonne clé), `:NEW_START` et `:NEW_END` (même durée qu\'avant). Vide : les événements ne peuvent pas être déplacés.',
3461
+ 'rs.only_events_the_user_sees': 'Seuls les événements que l\'utilisateur voit dans ce calendrier peuvent être déplacés ; sans souris, le lien de modification change les dates.',
3462
+ 'rs.not_while_the_pointer_or': 'Pas tant que le pointeur ou le focus est dans le carrousel, ni pour les utilisateurs qui préfèrent les animations réduites. Un carrousel n\'a pas de « Tout afficher ».',
3463
+ 'rs.a_chosen_region_gets_display': 'Une région choisie reçoit `"display_selector": true` dans ses paramètres (un onglet à son nom) ou le nom de l\'onglet : les régions de même nom d\'onglet partagent un onglet (p. ex. les filtres intelligents et leur rapport). Sans JavaScript, toutes les régions s\'affichent, avec des liens vers chacune.',
3464
+ 'rs.gauge_charts_only_a_warning': 'Graphiques jauge uniquement. Un seuil d\'avertissement au-dessus du critique signifie que les valeurs basses sont mauvaises (p. ex. avertissement 50, critique 20).',
3465
+ 'rs.drill_down_column_takes_the': 'Exploration : `#column#` prend la valeur de la ligne du point, `#series#` le nom de sa série. Les colonnes auxquelles seul le lien fait référence ne sont pas dessinées.',
3466
+ 'rs.gantt_charts_with_a_task': 'Graphiques de Gantt avec une colonne `task_id`. S\'exécute avec le rôle de base de l\'application (la sécurité au niveau des lignes s\'applique) avec `:TASK_ID`, `:NEW_START` et `:NEW_END` (`YYYY-MM-DD`, ou `YYYY-MM-DDTHH:MM` à l\'heure ; un jalon reçoit le même début et la même fin). Vide : les tâches ne peuvent pas être déplacées.',
3467
+ 'rs.only_tasks_the_user_sees': 'Seules les tâches que l\'utilisateur voit dans ce graphique peuvent être déplacées ; le graphique est ensuite redessiné à partir de sa requête.',
3468
+ 'rs.column': 'Colonne',
3469
+ 'rs.heading': 'En-tête',
3470
+ 'rs.shown': 'Affichée',
3471
+ 'rs.read_only': 'Lecture seule',
3472
+ 'rs.required': 'Obligatoire',
3473
+ 'rs.edit_as': 'Modifier comme',
3474
+ 'rs.facet': 'Facette',
3475
+ 'rs.label': 'Libellé',
3476
+ 'rs.type': 'Type',
3477
+ 'rs.values_shown': 'Valeurs affichées',
3478
+ 'rs.exclude': 'Exclure',
3479
+ 'rs.ranges': 'Plages',
3480
+ 'rs.from_to': 'De/à',
3481
+ 'rs.chart': 'Graphique',
3482
+ 'rs.order': 'Ordre',
3483
+ 'rs.region': 'Région',
3484
+ 'rs.in_a_tab': 'Dans un onglet',
3485
+ 'rs.tab_name': 'Nom de l\'onglet',
3486
+ 'rs.no_columns_yet': 'Aucune colonne pour l\'instant.',
3487
+ 'rs.the_report_has_no_columns': 'Le rapport n\'a pas de colonnes.',
3488
+ 'rs.there_are_no_other_regions': 'Il n\'y a pas d\'autres régions sur cette page.',
3489
+ 'rs.shows_a_list_from_shared': 'Affiche une liste issue de Composants partagés → Listes. Les entrées que l\'utilisateur ne peut pas ouvrir sont omises.',
3490
+ 'rs.these_fields_write_the_region': 'Ces champs écrivent le JSON des paramètres de la région ci-dessus (les autres clés sont conservées).',
3491
+ 'rs.users_may_add_rows': 'Les utilisateurs peuvent ajouter des lignes',
3492
+ 'rs.users_may_change_rows': 'Les utilisateurs peuvent modifier des lignes',
3493
+ 'rs.users_may_delete_rows': 'Les utilisateurs peuvent supprimer des lignes',
3494
+ 'rs.actions_menu_columns_aggregates_saved': 'Menu Actions (colonnes, agrégats, rapports enregistrés)',
3495
+ 'rs.users_may_save_grid_reports': 'Les utilisateurs peuvent enregistrer des rapports de grille',
3496
+ 'rs.row_actions_menu': 'Menu des actions de ligne',
3497
+ 'rs.duplicate': 'Dupliquer',
3498
+ 'rs.delete': 'Supprimer',
3499
+ 'rs.read_the_search_as_a': 'Lire la recherche comme une phrase (« employés avec un salaire entre 1000 et 3000 ») et la proposer comme filtres',
3500
+ 'rs.a_search_field_searches_all': 'Un champ de recherche (cherche dans toutes les colonnes du rapport)',
3501
+ 'rs.show_all_choice_shows_every': 'Choix « Tout afficher » (affiche chaque région)',
3502
+ 'rs.remember_the_choice_during_the': 'Mémoriser le choix pendant la session',
3503
+ 'rs.group_markers_that_are_close': 'Regrouper les marqueurs proches (clustering)',
3504
+ 'rs.include_completed_and_terminated_workflows': 'Inclure les workflows terminés et arrêtés',
3505
+ 'rs.include_completed_and_cancelled_tasks': 'Inclure les tâches terminées et annulées',
3506
+ 'rs.no_link': '- aucun lien -',
3507
+ 'rs.text_field': '- champ texte -',
3508
+ 'rs.nobody': '- personne -',
3509
+ 'rs.not_a_master': '- pas maître -',
3510
+ 'rs.all_rows_with_the_page': 'Toutes les lignes avec la page',
3511
+ 'rs.rows_in_the_visible_area': 'Lignes de la zone visible',
3512
+ 'rs.vector_tiles_large_data_sets': 'Tuiles vectorielles (grands jeux de données)',
3513
+ 'rs.markers': 'Marqueurs',
3514
+ 'rs.heat_map': 'Carte de chaleur',
3515
+ 'rs.lines': 'Lignes',
3516
+ 'rs.polygons': 'Polygones',
3517
+ 'rs.extruded_polygons_shaded_by_height': 'Polygones extrudés (ombrés selon la hauteur)',
3518
+ 'rs.none': '- aucun -',
3519
+ 'rs.the_visible_area': 'La zone visible',
3520
+ 'rs.distance_from_the_centre': 'Distance depuis le centre',
3521
+ 'rs.none_2': 'Aucun',
3522
+ 'rs.bar': 'Barres',
3523
+ 'rs.pie': 'Secteurs',
3524
+ 'rs.choose': '- choisir -',
3525
+ 'rs.everyone_who_sees_the_calendar': 'Tous ceux qui voient le calendrier',
3526
+ 'rs.signed_in_users': 'Utilisateurs connectés',
3527
+ 'rs.tabs': 'Onglets',
3528
+ 'rs.select_list': 'Liste déroulante',
3529
+ 'rs.carousel_one_at_a_time': 'Carrousel (une à la fois, Précédent et Suivant)',
3530
+ 'rs.everyone_who_sees_the_chart': 'Tous ceux qui voient le graphique',
3531
+ 'rs.days_or_hours_when_a': 'Jours, ou heures quand une tâche a une heure',
3532
+ 'rs.days': 'Jours',
3533
+ 'rs.hours': 'Heures',
3534
+ 'rs.cards': 'Cartes',
3535
+ 'rs.kpi_tiles_metric': 'Tuiles KPI (indicateur)',
3536
+ 'rs.links_nested': 'Liens (imbriqués)',
3537
+ 'rs.badge_list': 'Liste de badges',
3538
+ 'rs.cards_menu': 'Cartes (menu)',
3539
+ 'rs.wizard_progress_numbered_steps': 'Progression de l\'assistant (étapes numérotées)',
3540
+ 'rs.small': 'Petit',
3541
+ 'rs.medium': 'Moyen',
3542
+ 'rs.large': 'Grand',
3543
+ 'rs.workflows_i_started': 'Workflows que j\'ai lancés',
3544
+ 'rs.workflows_i_administer': 'Workflows que j\'administre',
3545
+ 'rs.my_tasks_to_act_on': 'Mes tâches : à traiter, à prendre ou qui me sont attribuées',
3546
+ 'rs.tasks_i_requested': 'Tâches que j\'ai demandées',
3547
+ 'rs.tasks_i_administer': 'Tâches que j\'administre',
3548
+ 'rs.aria_list_of_values_of': 'Liste de valeurs de {name}',
3549
+ 'rs.aria_heading_of': 'En-tête de {name}',
3550
+ 'rs.aria_show': 'Afficher {name}',
3551
+ 'rs.aria_facet_on': 'Facette sur {name}',
3552
+ 'rs.aria_label_of': 'Libellé de {name}',
3553
+ 'rs.aria_type_of_the_facet_on': 'Type de la facette sur {name}',
3554
+ 'rs.aria_values_shown_for': 'Valeurs affichées pour {name}',
3555
+ 'rs.aria_users_may_exclude_values_of': 'Les utilisateurs peuvent exclure des valeurs de {name}',
3556
+ 'rs.aria_ranges_of': 'Plages de {name}',
3557
+ 'rs.aria_users_may_type_a_range': 'Les utilisateurs peuvent saisir une plage pour {name}',
3558
+ 'rs.aria_chart_of_the_facet_on': 'Graphique de la facette sur {name}',
3559
+ 'rs.aria_order_of': 'Ordre de {name}',
3560
+ 'rs.aria_show_in_the_display_selector': 'Afficher {name} dans le sélecteur d\'affichage',
3561
+ 'rs.aria_tab_name_of': 'Nom d\'onglet de {name}',
3562
+ 'rs.no_data_found': 'Aucune donnée trouvée',
3563
+ 'rs.search_or_filter': 'Rechercher ou filtrer…',
3564
+ 'rs.link': 'Lien',
3565
+ 'rs.link_help': 'ÉLÉMENT=#column#, séparés par des virgules ; #column# est remplacé par la valeur de la ligne.',
3566
+ 'rs.links_to_page': '{what} renvoie à la page',
3567
+ 'rs.w.edit': 'Modifier',
3568
+ 'rs.row_actions_edit': 'Actions de ligne : modifier',
3569
+ 'rs.w.event': 'Chaque événement',
3570
+ 'rs.edit_link': 'Lien de modification',
3571
+ 'rs.w.slot': 'Un créneau vide de jour ou d\'heure',
3572
+ 'rs.create_on_click': 'Créer au clic',
3573
+ 'rs.create_help': 'ÉLÉMENT=#start#, #end# ou #date# : le créneau cliqué (YYYY-MM-DD, ou YYYY-MM-DD HH:MI pour un créneau horaire).',
3574
+ 'rs.w.point': 'Chaque point de données',
3575
+ 'rs.w.card': 'Chaque carte',
3576
+ 'rs.w.place': 'Chaque lieu',
3577
+ 'rs.w.node': 'Chaque nœud',
3578
+ 'rs.layer_n': 'Couche {n} : {name}',
3579
+ 'rs.add_layer': 'Ajouter une couche',
3580
+ 'rs.group_markers': 'Regrouper les marqueurs proches',
3581
+ 'rs.off_at_first': 'Désactivée au départ',
3582
+ 'rs.map_report_help': 'Les utilisateurs peuvent n\'afficher que les lignes de la zone visible de la carte (« Afficher cette zone dans la liste ») ou près de son centre. Le rapport a besoin de colonnes lat et lng (ou location), ou d\'une colonne PostGIS geometry/geography.',
3583
+ 'rs.map_report_none': 'Ajoutez une région de rapport à cette page pour la filtrer par la zone de la carte.',
3584
+ 'rs.report_smart_help': 'Le rapport de cette page que filtrent les filtres intelligents. Enregistrez pour lister ses colonnes.',
3585
+ 'rs.report_facets_help': 'Le rapport de cette page que filtrent les facettes. Enregistrez pour lister ses colonnes.',
3586
+ 'rs.report_first': 'Ajoutez d\'abord une région de rapport à cette page.',
3587
+ 'rs.untitled': '(sans titre)',
3588
+ 'rs.gauge.min': 'Minimum',
3589
+ 'rs.gauge.max': 'Maximum',
3590
+ 'rs.gauge.warning': 'Avertissement à partir de',
3591
+ 'rs.gauge.critical': 'Critique à partir de',
3592
+ 'rs.t.settings': 'Paramètres',
3593
+ 'rs.t.grid': 'Paramètres de la grille',
3594
+ 'rs.t.chart': 'Paramètres du graphique',
3595
+ 'rs.t.cards': 'Paramètres des cartes',
3596
+ 'rs.t.calendar': 'Paramètres du calendrier',
3597
+ 'rs.t.facets': 'Paramètres de la recherche à facettes',
3598
+ 'rs.t.smart': 'Paramètres des filtres intelligents',
3599
+ 'rs.t.selector': 'Paramètres du sélecteur d\'affichage',
3600
+ 'rs.t.list': 'Paramètres de la liste',
3601
+ 'rs.t.map': 'Paramètres de la carte',
3602
+ 'rs.t.tree': 'Paramètres de l\'arborescence',
3603
+ 'rs.t.workflows': 'Paramètres de la console des workflows',
3604
+ 'rs.t.tasks': 'Paramètres de la liste des tâches',
3605
+ 'rs.saved': 'Paramètres enregistrés.',
3606
+ 'rs.chart.bar': 'Barres (horizontales)',
3607
+ 'rs.chart.column': 'Colonnes',
3608
+ 'rs.chart.stacked': 'Colonnes empilées',
3609
+ 'rs.chart.line': 'Courbe',
3610
+ 'rs.chart.area': 'Aire',
3611
+ 'rs.chart.combo': 'Colonnes et courbe (première série en colonnes)',
3612
+ 'rs.chart.scatter': 'Nuage de points (première colonne = x)',
3613
+ 'rs.chart.donut': 'Anneau',
3614
+ 'rs.chart.pie': 'Secteurs',
3615
+ 'rs.chart.bubble': 'Bulles (colonnes label, x, y et size)',
3616
+ 'rs.chart.gauge': 'Jauge (un cadran par ligne)',
3617
+ 'rs.chart.funnel': 'Entonnoir (étapes dans l\'ordre de la requête)',
3618
+ 'rs.chart.radar': 'Radar (un axe par ligne)',
3619
+ 'rs.chart.gantt': 'Gantt (colonnes task, start et end)',
3620
+ 'rs.chart.treemap': 'Treemap (label et value ; node_id, parent_id pour une hiérarchie)',
3621
+ 'rs.chart.sunburst': 'Sunburst (label et value ; node_id, parent_id pour une hiérarchie)',
3622
+ 'rs.chart.timeline': 'Chronologie (label, start, end ; une colonne series pour les couloirs)',
3623
+ 'rs.chart.pyramid': 'Pyramide (une série ; deux séries dos à dos)',
3624
+ 'rs.chart.polar': 'Aire polaire (un secteur par ligne)',
3625
+ 'rs.chart.range': 'Plage (colonnes low et high : colonnes flottantes)',
3626
+ 'rs.chart.boxplot': 'Boîte à moustaches (une valeur par ligne, ou min, Q1, median, Q3 et max)',
3627
+ 'rs.chart.stock': 'Boursier (colonnes open, high, low et close : chandeliers)',
3628
+ 'rs.gridview.row': 'Vue ligne unique',
3629
+ 'rs.gridview.group': 'Regrouper par',
3630
+ 'rs.gridview.chart': 'Graphique',
3631
+ 'rs.facet.checkbox': 'Cases à cocher',
3632
+ 'rs.facet.range': 'Plages',
3633
+ 'rs.facet.star': 'Note en étoiles',
3634
+ 'rs.view.month': 'Mois',
3635
+ 'rs.view.week': 'Semaine',
3636
+ 'rs.view.day': 'Jour',
3637
+ 'rs.view.list': 'Liste',
3638
+ 'rpt.rows_per_page': 'Lignes par page',
3639
+ 'rpt.on_phones': 'Sur les téléphones',
3640
+ 'rpt.text_when_there_are_no': 'Texte quand il n\'y a pas de lignes',
3641
+ 'rpt.who_may_save_public_reports': 'Qui peut enregistrer des rapports publics',
3642
+ 'rpt.pagination': 'Pagination',
3643
+ 'rpt.keyset_columns': 'Colonnes keyset',
3644
+ 'rpt.maximum_row_count': 'Nombre maximal de lignes',
3645
+ 'rpt.cache': 'Cache',
3646
+ 'rpt.cache_for_seconds': 'Cache pendant (secondes)',
3647
+ 'rpt.columns_read_from_a_json': 'Colonnes lues dans une colonne json ou jsonb',
3648
+ 'rpt.link_column': 'Colonne de lien',
3649
+ 'rpt.to_page': 'Vers la page',
3650
+ 'rpt.set_items': 'Définir les éléments',
3651
+ 'rpt.value_column': 'Colonne de valeur',
3652
+ 'rpt.into_item': 'Dans l\'élément',
3653
+ 'rpt.report_layout': 'Mise en page du rapport',
3654
+ 'rpt.behaviour': 'Comportement',
3655
+ 'rpt.large_tables': 'Grandes tables',
3656
+ 'rpt.json_path_columns': 'Colonnes de chemin JSON',
3657
+ 'rpt.columns': 'Colonnes',
3658
+ 'rpt.link': 'Lien',
3659
+ 'rpt.row_selection': 'Sélection de lignes',
3660
+ 'rpt.pdf': 'PDF',
3661
+ 'rpt.row_ranges_skip_counting_the': 'Les plages de lignes ne comptent pas les lignes : utilisez-les pour les grandes tables.',
3662
+ 'rpt.with_row_ranges_columns_that': 'Avec les plages de lignes : colonnes qui rendent une ligne unique (séparées par des virgules, indexées). Suivant et Précédent reprennent alors après la dernière ligne au lieu de sauter des lignes (pages profondes rapides).',
3663
+ 'rpt.the_report_and_its_downloads': 'Le rapport (et ses téléchargements) lit au plus ce nombre de lignes.',
3664
+ 'rpt.a_submit_of_the_page': 'Une soumission de la page vide son cache.',
3665
+ 'rpt.format_masks_numbers_like_999g999g990d00': 'Masques de format : nombres comme 999G999G990D00, FML999G990D00 (devise), 990D0% ou 0000 (G et D sont les séparateurs de la langue) ; dates comme DD-MON-YYYY. Vide : les formats de l\'application. Les téléchargements Excel et CSV gardent les valeurs brutes.',
3666
+ 'rpt.item_column_comma_separated_column': 'ÉLÉMENT=#column#, séparés par des virgules ; #column# est remplacé par la valeur de la ligne.',
3667
+ 'rpt.a_checkbox_per_row_on': 'Une case par ligne ; à la soumission, les valeurs des lignes cochées arrivent dans l\'élément, séparées par des deux-points (p. ex. 7839:7902). En général un élément masqué. Traitez les valeurs comme une saisie utilisateur dans votre processus.',
3668
+ 'rpt.layouts_are_under_shared_components': 'Les mises en page sont sous Composants partagés → Mises en page de rapport.',
3669
+ 'rpt.column': 'Colonne',
3670
+ 'rpt.heading': 'En-tête',
3671
+ 'rpt.format_mask': 'Masque de format',
3672
+ 'rpt.display': 'Affichage',
3673
+ 'rpt.shown': 'Affichée',
3674
+ 'rpt.in_pdf': 'Dans le PDF',
3675
+ 'rpt.pdf_width_mm': 'Largeur PDF (mm)',
3676
+ 'rpt.these_fields_write_the_region': 'Ces champs écrivent le JSON des paramètres de la région ci-dessus (les autres clés sont conservées).',
3677
+ 'rpt.no_columns_yet': 'Aucune colonne pour l\'instant.',
3678
+ 'rpt.search_box': 'Zone de recherche',
3679
+ 'rpt.actions_menu_filters_break_aggregates': 'Menu Actions (filtres, ruptures, agrégats, téléchargements…)',
3680
+ 'rpt.sortable': 'Triable',
3681
+ 'rpt.users_may_save_reports': 'Les utilisateurs peuvent enregistrer des rapports',
3682
+ 'rpt.load_after_the_page_shows': 'Charger après l\'affichage de la page (chargement différé)',
3683
+ 'rpt.normal': 'Normal',
3684
+ 'rpt.cards_reflow': 'Cartes (reflow)',
3685
+ 'rpt.scrolling_table': 'Tableau défilant',
3686
+ 'rpt.nobody': '- personne -',
3687
+ 'rpt.rows_x_y_of_z': 'Lignes X–Y sur Z (compte le total)',
3688
+ 'rpt.row_ranges_x_y_no': 'Plages de lignes X–Y (sans total)',
3689
+ 'rpt.no_cache': '- pas de cache -',
3690
+ 'rpt.per_user': 'Par utilisateur',
3691
+ 'rpt.per_session': 'Par session',
3692
+ 'rpt.for_all_users_with_the': 'Pour tous les utilisateurs (avec les mêmes rôles)',
3693
+ 'rpt.no_link': '- aucun lien -',
3694
+ 'rpt.choose': '- choisir -',
3695
+ 'rpt.no_row_selection': '- pas de sélection de lignes -',
3696
+ 'rpt.aria_heading_of': 'En-tête de {name}',
3697
+ 'rpt.aria_format_mask_of': 'Masque de format de {name}',
3698
+ 'rpt.aria_display_of': 'Affichage de {name}',
3699
+ 'rpt.aria_show': 'Afficher {name}',
3700
+ 'rpt.aria_print': 'Imprimer {name}',
3701
+ 'rpt.aria_pdf_width_of': 'Largeur PDF de {name}',
3702
+ 'rpt.no_data_found': 'Aucune donnée trouvée',
3703
+ 'rpt.saved_without': 'Paramètres du rapport enregistrés, sans ces masques de format : {masks}.',
3704
+ 'rpt.saved': 'Paramètres du rapport enregistrés.',
3705
+ // ------------------------------------------------------------ Region settings help (CD-8)
3706
+ 'rs.not_in_query': 'absente de la requête',
3707
+ 'rpt.report_settings': 'Paramètres du rapport',
3708
+ 'rpt.save_report_settings': 'Enregistrer les paramètres du rapport',
3709
+ 'rs.no_position_alert': 'Le rapport n\'a pas de colonnes `lat`/`lng` ou `location` : la zone de carte ne peut donc pas le filtrer.',
3710
+ 'rs.facets_help': 'Les cases à cocher listent les valeurs les plus fréquentes (Exclure permet plutôt de les écarter). Plages et De/à demandent une colonne numérique ou date : les plages sont `from..to = label` séparées par `;`, une borne ouverte laissée vide (`..1000`, `2020-01-01..`) ; une plage inclut son début, pas sa fin. Une note en étoiles propose « 4 étoiles et plus », etc. (jusqu\'à 5 ; `"max"` dans le JSON le change).',
3711
+ 'rs.facets_help_chart': 'Graphique : un histogramme ou camembert des effectifs sous la facette (replié) ; une barre ou une part filtre sur sa valeur.',
3712
+ 'rs.calendar_help': 'La requête renvoie `start_date`, `title` et éventuellement `end_date` (des dates pour les événements sur la journée, des horodatages pour ceux avec une heure).',
3713
+ 'rs.chart_help': 'La première colonne est le libellé ; chaque colonne numérique suivante est une série (jusqu\'à 8). Un diagramme de Gantt lit `label, start, end` (dates ou horodatages ; une fin vide est un jalon) et des colonnes facultatives nommées `progress` (0 à 100), `task_id` et `depends_on` (les identifiants qu\'une tâche attend, par ex. `3,4`).',
3714
+ 'rs.map_help': 'Chaque ligne est un marqueur en `lat`, `lng` (ou `location` sous la forme "lat,lng"), avec `title` et `body` dans sa bulle ; une colonne `geojson` trace des lignes et des surfaces (avec PostGIS installé, une colonne `geometry` ou `geography` en WGS 84 fonctionne aussi). Une carte de chaleur pondère chaque lieu par une colonne `weight`.',
3715
+ 'rs.tree_help': 'La requête renvoie `id`, `parent_id` et `label` (et éventuellement `icon`) ; les lignes dont le parent n\'est pas dans le résultat sont les racines.',
3716
+ 'rs.workflow_help': 'Les workflows viennent des définitions de workflow (Composants partagés) ; le SQL de l\'application les démarre avec `meta.start_workflow(…)`.',
3717
+ 'rs.task_help': 'Les tâches viennent des définitions de tâche (Composants partagés) ; le SQL de l\'application les crée avec `meta.create_task(…)`.',
3718
+ // ------------------------------------------------------------ SQL Workshop › RESTful Services › Modules (CD-8)
3719
+ 'rm.type.collection': 'Requête de collection : lignes, paginées',
3720
+ 'rm.type.item': 'Ligne unique : un objet, 404 sans ligne',
3721
+ 'rm.type.sql': 'SQL : la première ligne de la dernière instruction',
3722
+ 'rm.type.plpgsql': 'Bloc PL/pgSQL : meta.rest_reply(body, status)',
3723
+ 'rm.type.media': 'Ressource média : content_type et content',
3724
+ 'rm.modules': 'Modules',
3725
+ 'rm.module': 'Module',
3726
+ 'rm.autorest_tab': 'AutoREST (tables et vues)',
3727
+ 'rm.run_only_suffix': 'Remettez-la sur Exécuter et créer pour la modifier.',
3728
+ 'rm.locked_suffix': 'Les modifications sont refusées tant qu\'elle n\'est pas déverrouillée.',
3729
+ 'rm.or': 'ou',
3730
+ 'rm.public': 'public',
3731
+ 'rm.token': 'jeton',
3732
+ 'rm.module_role': 'rôle du module {roles}',
3733
+ 'rm.role': 'rôle {roles}',
3734
+ 'rm.tree_aria': 'Modèles et gestionnaires',
3735
+ 'rm.disabled_suffix': 'désactivé',
3736
+ 'rm.base_path': 'Chemin de base',
3737
+ 'rm.application': 'Application',
3738
+ 'rm.templates': 'Modèles',
3739
+ 'rm.template': 'Modèle',
3740
+ 'rm.handlers': 'Gestionnaires',
3741
+ 'rm.privilege': 'Privilège',
3742
+ 'rm.off': 'désactivé',
3743
+ 'rm.any_token': 'tout jeton',
3744
+ 'rm.none_yet': 'Aucun module REST pour l\'instant. Créez-en un ci-dessous : un chemin de base, puis des modèles et des gestionnaires.',
3745
+ 'rm.app_help': 'Son rôle de base de données exécute les gestionnaires ; ses jetons et rôles décident qui peut les appeler.',
3746
+ 'rm.base_path_rule': 'lettres minuscules, chiffres, _ et - (40 au plus)',
3747
+ 'rm.eg': 'p. ex. {example}',
3748
+ 'rm.eg_sales_api': 'p. ex. API des ventes',
3749
+ 'rm.title': 'Titre',
3750
+ 'rm.privilege_roles': 'Privilège : rôles',
3751
+ 'rm.any_caller': 'tout appelant muni d\'un jeton',
3752
+ 'rm.roles_help_app': 'Séparés par des virgules : chaque gestionnaire exige l\'un de ces rôles d\'application.',
3753
+ 'rm.roles_help': 'Séparés par des virgules : chaque gestionnaire exige l\'un de ces rôles.',
3754
+ 'rm.description': 'Description',
3755
+ 'rm.create_module': 'Créer le module',
3756
+ 'rm.create_a_module': 'Créer un module',
3757
+ 'rm.list_title': 'Services RESTful : modules',
3758
+ 'rm.enabled': 'Activé',
3759
+ 'rm.status': 'Statut',
3760
+ 'rm.disabled_404': 'Désactivé (404)',
3761
+ 'rm.save': 'Enregistrer',
3762
+ 'rm.saved': 'Enregistré.',
3763
+ 'rm.no_templates': 'Aucun modèle pour l\'instant.',
3764
+ 'rm.uri_template': 'Modèle d\'URI',
3765
+ 'rm.add_template': 'Ajouter un modèle',
3766
+ 'rm.checks': 'Vérifications',
3767
+ 'rm.delete_module': 'Supprimer le module',
3768
+ 'rm.module_title': 'Module REST {name}',
3769
+ 'rm.method': 'Méthode',
3770
+ 'rm.source_type': 'Type de source',
3771
+ 'rm.access': 'Accès',
3772
+ 'rm.no_handlers': 'Aucun gestionnaire pour l\'instant : l\'URI répond 404.',
3773
+ 'rm.add_handler': 'Ajouter un gestionnaire',
3774
+ 'rm.url': 'URL :',
3775
+ 'rm.uri_rename_help': 'La renommer déplace aussi ses gestionnaires.',
3776
+ 'rm.delete_template': 'Supprimer le modèle',
3777
+ 'rm.source': 'Source',
3778
+ 'rm.none_here': 'aucun ici',
3779
+ 'rm.who': 'Qui peut l\'appeler',
3780
+ 'rm.auth_token': 'Un jeton bearer de l\'application',
3781
+ 'rm.auth_public': 'Public : sans jeton',
3782
+ 'rm.roles': 'Rôles',
3783
+ 'rm.no_further_role': 'aucun autre rôle',
3784
+ 'rm.roles_help_handler': 'Séparés par des virgules : l\'appelant doit aussi avoir l\'un d\'eux.',
3785
+ 'rm.page_size': 'Taille de page',
3786
+ 'rm.page_size_help': 'Requêtes de collection : lignes sans ?limit=.',
3787
+ 'rm.status_ph': '201 pour POST, sinon 200',
3788
+ 'rm.status_help': 'Gestionnaires SQL et PL/pgSQL.',
3789
+ 'rm.params': 'Paramètres (documentation)',
3790
+ 'rm.create_handler': 'Créer le gestionnaire',
3791
+ 'rm.delete_handler': 'Supprimer le gestionnaire',
3792
+ 'rm.new_handler_for': 'Nouveau gestionnaire pour {uri}',
3793
+ 'rm.new_handler': 'Nouveau gestionnaire',
3794
+ 'rm.response': 'Réponse',
3795
+ 'rm.no_token': 'sans jeton',
3796
+ 'rm.no_token_option': 'Sans jeton',
3797
+ 'rm.try_it': 'Essayer',
3798
+ 'rm.as': 'En tant que',
3799
+ 'rm.query_string': 'Chaîne de requête',
3800
+ 'rm.json_body': 'Corps JSON',
3801
+ 'rm.send': 'Envoyer {method}',
3802
+ 'rm.content': 'contenu',
3803
+ 'rm.characters': '({n} caractères)',
3804
+ 'rm.bytes_of': '({n} octets de {type})',
3805
+ 'rm.openapi_doc': 'Le document OpenAPI 3 du module (sans le SQL) :',
3806
+ 'rm.openapi_help': 'Importez-le dans Swagger UI, Postman ou un générateur de clients. Les paramètres documentés des gestionnaires deviennent ses paramètres de requête et corps de requête.',
3807
+ 'rm.delete_module_confirm': 'Supprimer le module {name} avec tous ses modèles et gestionnaires ?',
3808
+ 'rm.delete_template_confirm': 'Supprimer le modèle {uri} et ses {n} gestionnaire(s) ?',
3809
+ 'rm.delete_handler_confirm': 'Supprimer le gestionnaire {method} {uri} ?',
3810
+ 'rm.auth_token_role': 'Un jeton bearer de l\'application avec le rôle du module {roles}',
3811
+ 'rm.auth_public_help': '(s\'exécute en tant que `nobody`)',
3812
+ 'rm.auth_public_403': '(s\'exécute en tant que `nobody` ; les rôles du module s\'appliquent toujours, il répond donc 403)',
3813
+ 'rm.uri_help': 'Segments et `:parameters` (liés en tant que `:ID`)',
3814
+ 'rm.chk.runs_as': 'Les gestionnaires s\'exécutent en tant que `{role}`, avec `meta.app_user()` comme appelant',
3815
+ 'rm.chk.role_problem': 'Le rôle de base de données de l\'application : {problem} Ses gestionnaires répondent 403.',
3816
+ 'rm.chk.no_role': 'L\'application n\'a pas de rôle de base de données : les gestionnaires s\'exécutent avec le rôle d\'exécution de pgkiln. Donnez-lui son propre rôle (Application › Paramètres) pour que les droits et la sécurité au niveau des lignes soient les siens.',
3817
+ 'rm.chk.disabled': 'Désactivé : chaque gestionnaire répond 404',
3818
+ 'rm.chk.privilege': 'Privilège : les appelants doivent avoir le rôle {roles}',
3819
+ 'rm.chk.no_privilege': 'Aucun rôle de privilège : tout jeton valide de l\'application (les gestionnaires peuvent ajouter des rôles)',
3820
+ 'rm.response_as': '{request} en tant que {as}',
3821
+ 'rm.try_intro': 'Envoie la requête au vrai point de terminaison : un PUT, POST ou DELETE modifie les données. {as} un compte émet pour lui un jeton de courte durée, comme le fait App › API REST ; sans compte, vous voyez ce qu\'obtient un appelant sans jeton.',
3822
+ 'rm.intro': 'Modules des services RESTful : un module est un chemin de base d\'une application, ses modèles sont des URI avec des `:parameters`, et chaque modèle a des gestionnaires par méthode avec leur source : une requête de collection, une ligne unique, du SQL, un bloc PL/pgSQL ou une ressource média. Les gestionnaires s\'exécutent avec le rôle de base de données de l\'application et l\'appelant comme `meta.app_user()` : ses droits et la sécurité au niveau des lignes s\'appliquent ; les paramètres sont liés, jamais collés dans le SQL. Chaque module a un document OpenAPI. Les modules appartiennent à leur application : ils voyagent avec son export (aussi dans Composants partagés › Services RESTful).',
3823
+ 'rm.source_help': 'Liaisons, en majuscules : paramètres de chemin ({params}), paramètres de requête et champs du corps JSON ; `:BODY` est le corps entier ; `:APP_USER` est l\'appelant. Les valeurs sont liées, jamais collées dans le SQL. PL/pgSQL : un bloc (`declare … begin … end`, ou des instructions) qui répond avec `perform meta.rest_reply(jsonb_build_object(…), 201)`. Média : une requête qui renvoie `content_type`, `content` et éventuellement `filename`.',
3824
+ 'rm.params_help': 'Un par ligne : `name query|body [{types}] [required] [description]`. Ils vont dans le document OpenAPI et le formulaire Essayer ; s\'il en manque un obligatoire, la réponse est 400.',
3825
+ 'rm.e.params_line': 'Paramètres, ligne {n} : écrivez "name query" ou "name body", puis éventuellement un type ({types}), "required" et une description.',
3826
+ 'rm.e.choose_app': 'Choisissez une application de cet espace de travail.',
3827
+ 'rm.e.base_path': 'Le chemin de base commence par une lettre minuscule : lettres, chiffres, _ et - (40 au plus).',
3828
+ 'rm.e.title': 'Le titre fait 1 à 200 caractères.',
3829
+ 'rm.created': 'Module {name} créé à {path}. Ajoutez ensuite un modèle.',
3830
+ 'rm.e.exists': '{app} a déjà un module {name}.',
3831
+ 'rm.deleted': 'Module {name} supprimé : ses URL répondent 404.',
3832
+ 'rm.e.template_exists': 'Le modèle {uri} existe déjà.',
3833
+ 'rm.e.template_gone': 'Le modèle n\'existe plus.',
3834
+ 'rm.template_deleted': 'Modèle {uri} et ses gestionnaires supprimés.',
3835
+ 'rm.e.handler_gone': 'Le gestionnaire n\'existe plus.',
3836
+ 'rm.handler_deleted': 'Gestionnaire {method} {uri} supprimé.',
3837
+ 'rm.e.choose_account': 'Choisissez un compte ayant accès à l\'application.',
3838
+ 'rm.e.bad_json': 'Le corps n\'est pas un JSON valide.',
3839
+ 'rm.e.module_gone': 'Le module n\'existe plus.',
3840
+ 'rm.e.auth': 'Choisissez qui peut l\'appeler : un jeton de l\'application, ou public.',
3841
+ 'rm.e.role_length': 'Les noms de rôle font au plus 100 caractères.',
3842
+ 'rm.e.page_size': 'La taille de page va de 1 à 500.',
3843
+ 'rm.e.status': 'Le statut va de 200 à 299.',
3844
+ // ------------------------------------------------------------ SQL Workshop › RESTful Services › AutoREST (CD-8)
3845
+ 'ar.kind.table': 'table',
3846
+ 'ar.kind.view': 'vue',
3847
+ 'ar.kind.mview': 'vue matérialisée',
3848
+ 'ar.kind.foreign': 'table étrangère',
3849
+ 'ar.m.get': 'lignes et une ligne',
3850
+ 'ar.m.post': 'insérer une ligne',
3851
+ 'ar.m.put': 'modifier une ligne',
3852
+ 'ar.m.delete': 'supprimer une ligne',
3853
+ 'ar.methods': 'Méthodes',
3854
+ 'ar.auth_token_help': '(le jeton d\'un compte ou un client OAuth, App › API REST)',
3855
+ 'ar.auth_public': 'Public : n\'importe qui, sans jeton',
3856
+ 'ar.auth_public_help': '(s\'exécute en tant que `nobody` ; les droits et la sécurité au niveau des lignes s\'appliquent toujours)',
3857
+ 'ar.object': 'Objet',
3858
+ 'ar.none_yet': 'Aucune table ni vue publiée pour l\'instant. Activez-en une ci-dessous, ou avec {menu} dans le menu ⋯ d\'un objet.',
3859
+ 'ar.menu_enable': 'REST › Activer',
3860
+ 'ar.table_or_view': 'Table ou vue',
3861
+ 'ar.choose': '- choisir -',
3862
+ 'ar.runs_as': 's\'exécute en tant que {role}',
3863
+ 'ar.app_help': 'Son rôle de base de données exécute les instructions, ses jetons et rôles décident qui peut l\'appeler.',
3864
+ 'ar.url_name': 'Nom dans l\'URL',
3865
+ 'ar.object_name_ph': 'le nom de l\'objet',
3866
+ 'ar.url_name_rule': 'lettres minuscules, chiffres, _ et -',
3867
+ 'ar.any_caller': 'tout appelant',
3868
+ 'ar.roles_help': 'Séparés par des virgules : l\'appelant doit avoir l\'un de ces rôles d\'application.',
3869
+ 'ar.page_size_help': 'Lignes par page sans ?limit= ({max} au plus).',
3870
+ 'ar.enable': 'Activer',
3871
+ 'ar.no_usable_app': 'Aucune application de cet espace de travail n\'a de rôle de base de données sous lequel s\'exécuter.',
3872
+ 'ar.intro': 'Services RESTful : publiez une table ou une vue comme points de terminaison REST (AutoREST). Les lignes arrivent paginées en JSON, avec des filtres ; une clé primaire permet GET, PUT et DELETE d\'une ligne. Les requêtes s\'exécutent avec le rôle de base de données de l\'application qui publie et l\'appelant comme `meta.app_user()` : ses droits et la sécurité au niveau des lignes s\'appliquent.',
3873
+ 'ar.intro_module': 'Pour des points de terminaison sur mesure avec votre propre SQL ou PL/pgSQL, créez un {module}.',
3874
+ 'ar.module_link': 'module',
3875
+ 'ar.published': 'Objets publiés',
3876
+ 'ar.enable_a': 'Activer une table ou une vue',
3877
+ 'ar.gone': 'L\'objet n\'existe plus : ses points de terminaison répondent 404.',
3878
+ 'ar.chk.runs_as': 'S\'exécute en tant que `{role}` : ni propriétaire, ni superutilisateur, sans contournement de la sécurité au niveau des lignes',
3879
+ 'ar.chk.may': '`{role}` peut {priv}',
3880
+ 'ar.chk.may_not': '`{role}` ne peut pas {priv}',
3881
+ 'ar.chk.rls_on_1': 'La sécurité au niveau des lignes est active (1 politique)',
3882
+ 'ar.chk.rls_on': 'La sécurité au niveau des lignes est active ({n} politiques)',
3883
+ 'ar.chk.rls_off': 'La sécurité au niveau des lignes est inactive : les appelants voient toutes les lignes que le rôle peut lire',
3884
+ 'ar.chk.invoker': 'La vue est security_invoker : la sécurité au niveau des lignes des tables s\'applique à l\'appelant',
3885
+ 'ar.chk.definer': 'La vue s\'exécute avec les droits de son propriétaire : la sécurité au niveau des lignes des tables sous-jacentes ne s\'applique pas :',
3886
+ 'ar.chk.key': 'Clé primaire {columns} : lignes individuelles à',
3887
+ 'ar.chk.no_key': 'Pas de clé primaire : la collection seulement (GET et POST)',
3888
+ 'ar.chk.hidden_columns': 'Les colonnes que le rôle ne peut pas lire sont omises : {columns}',
3889
+ 'ar.ep.rows': 'Lignes, paginées : ?limit= (1–{max}, par défaut {size}) &offset= ; ?<column>=<value> ; ?q=<text> ; ?order=<column>.desc',
3890
+ 'ar.ep.post': 'Un objet JSON de valeurs de colonnes : la nouvelle ligne (201)',
3891
+ 'ar.ep.one': 'Une ligne (404 s\'il n\'y en a pas)',
3892
+ 'ar.ep.put': 'Modifier les colonnes que nomme l\'objet JSON',
3893
+ 'ar.ep.delete': 'Supprimer la ligne (204)',
3894
+ 'ar.enabled_l': 'activé',
3895
+ 'ar.disabled_alert': 'Désactivé : les points de terminaison répondent 404.',
3896
+ 'ar.endpoints': 'Points de terminaison',
3897
+ 'ar.does': 'Effet',
3898
+ 'ar.openapi_note': '(les objets publics ; envoyez un jeton pour les avoir tous)',
3899
+ 'ar.public_no_token': 'Public : aucun jeton nécessaire.',
3900
+ 'ar.get_token': 'Obtenez {token} dans {link} : émettez un jeton pour un compte, ou utilisez le jeton d\'accès d\'un client OAuth.',
3901
+ 'ar.caller_needs': 'L\'appelant doit avoir le rôle {roles}.',
3902
+ 'ar.status_codes': 'Sans jeton valide, les points de terminaison répondent 401 ; sans le rôle ou un droit, 403.',
3903
+ 'ar.settings': 'Paramètres',
3904
+ 'ar.published_by': 'Publié par {app} (s\'exécute en tant que {role}) à {path}.',
3905
+ 'ar.remove': 'Désactiver REST (retirer)',
3906
+ 'ar.remove_help': 'Les points de terminaison répondent 404 aussitôt ; la table elle-même n\'est pas modifiée.',
3907
+ 'ar.e.no_role': 'L\'application n\'a pas de rôle de base de données. AutoREST s\'exécute avec le rôle de l\'application : définissez-en un dans ses paramètres.',
3908
+ 'ar.e.role_problem': 'Le rôle de base de données de l\'application : {problem}',
3909
+ 'ar.e.owner': '"{role}" possède {object} (ou est membre de son propriétaire) : les droits et la sécurité au niveau des lignes ne s\'appliqueraient pas. Publiez-le via une application dont le rôle ne le possède pas.',
3910
+ 'ar.e.method': 'Choisissez au moins une méthode.',
3911
+ 'ar.e.page_size': 'La taille de page va de 1 à {max}.',
3912
+ 'ar.e.mview': 'Une vue matérialisée ne répond qu\'à GET.',
3913
+ 'ar.e.no_key': 'PUT et DELETE exigent une clé primaire ; cet objet n\'en a pas.',
3914
+ 'ar.e.choose_object': 'Choisissez une table ou une vue d\'un schéma que le SQL Workshop peut utiliser.',
3915
+ 'ar.e.url_name': 'Le nom dans l\'URL commence par une lettre minuscule : lettres, chiffres, _ et - (63 au plus).',
3916
+ 'ar.published_at': '{object} est publié à {path}.',
3917
+ 'ar.e.alias_taken': '{app} publie déjà quelque chose sous {alias} : choisissez un autre nom dans l\'URL.',
3918
+ 'ar.e.already': '{app} publie déjà {object}.',
3919
+ 'ar.unpublished': '{object} n\'est plus publié.',
3920
+ // ------------------------------------------------------------ SQL Workshop › Load Data (CD-8)
3921
+ 'dl.row': 'Ligne',
3922
+ 'dl.error': 'Erreur',
3923
+ 'dl.first_errors': 'Les {n} premières erreurs sont affichées.',
3924
+ 'dl.failed': '{n} ligne(s) n\'ont pas pu être chargées, donc rien n\'a été chargé. Corrigez le fichier, ou cochez « Ignorer les lignes en erreur ».',
3925
+ 'dl.inserted': '{n} ligne(s) insérée(s)',
3926
+ 'dl.updated': '{n} mise(s) à jour',
3927
+ 'dl.skipped': '{n} ignorée(s)',
3928
+ 'dl.from_file': 'Charger des données depuis un fichier',
3929
+ 'dl.intro': 'CSV ou TSV (UTF-8 ou Windows-1252 ; le séparateur est détecté), Excel .xlsx (la première feuille), JSON (un tableau d\'objets, ou JSON Lines) ou XML (lignes d\'un élément répété), jusqu\'à {mb} Mo. Vous choisissez ensuite une table nouvelle ou existante. Le chargement passe par la connexion propriétaire du builder.',
3930
+ 'dl.intro_unload': 'Pour télécharger une table ou une requête sous forme de fichier, utilisez {link}.',
3931
+ 'dl.file': 'Fichier',
3932
+ 'dl.headers': 'La première ligne contient les noms de colonnes',
3933
+ 'dl.row_tag': 'Élément de ligne XML',
3934
+ 'dl.row_tag_ph': 'p. ex. employee (vide : détecté)',
3935
+ 'dl.row_tag_help': 'XML uniquement. Les DTD et déclarations d\'entités ne sont pas acceptées.',
3936
+ 'dl.no_definition': '- aucune : choisir la table ensuite -',
3937
+ 'dl.definition_help': 'Composants partagés d\'une application : table, correspondance des colonnes et transformations.',
3938
+ 'dl.next': 'Suivant',
3939
+ 'dl.e.no_file': 'Choisissez un fichier.',
3940
+ 'dl.e.too_large': 'Le fichier dépasse {mb} Mo.',
3941
+ 'dl.info': '{rows} ligne(s), {columns} colonne(s)',
3942
+ 'dl.xml_rows': 'lignes XML {path}',
3943
+ 'dl.delimiter': 'séparateur {d}',
3944
+ 'dl.tab': 'tabulation',
3945
+ 'dl.first_shown': '({n} premières affichées)',
3946
+ 'dl.another_file': 'Choisir un autre fichier',
3947
+ 'dl.def_into': 'Définition {def} : dans {table}, mode {mode}',
3948
+ 'dl.def_skipping': 'en ignorant les lignes en erreur',
3949
+ 'dl.def_by_name': 'Les colonnes du fichier sont associées aux colonnes de la table par leur nom.',
3950
+ 'dl.after_mapping': 'Après la correspondance et les transformations :',
3951
+ 'dl.after_mapping_first': 'Après la correspondance et les transformations ({n} premières lignes) :',
3952
+ 'dl.load_into': 'Charger dans {table}',
3953
+ 'dl.preview': 'Aperçu',
3954
+ 'dl.load_with': 'Charger avec {name}',
3955
+ 'dl.skip_errors': 'Ignorer les lignes en erreur (sinon rien n\'est chargé quand une ligne échoue)',
3956
+ 'dl.table_name': 'Nom de la table',
3957
+ 'dl.table_name_help': 'schema.table ; la table reçoit une clé primaire identity `id`.',
3958
+ 'dl.file_column': 'Colonne du fichier',
3959
+ 'dl.column_name': 'Nom de colonne (vide = ignorer)',
3960
+ 'dl.type': 'Type',
3961
+ 'dl.aria_name': 'Nom de colonne pour {column}',
3962
+ 'dl.aria_type': 'Type de {column}',
3963
+ 'dl.create_and_load': 'Créer la table et charger',
3964
+ 'dl.table_column': 'Colonne de la table',
3965
+ 'dl.aria_map': 'Colonne de la table pour {column}',
3966
+ 'dl.skip': '- ignorer -',
3967
+ 'dl.key': 'clé',
3968
+ 'dl.mode': 'Mode',
3969
+ 'dl.mode_append': 'Ajouter : insérer toutes les lignes',
3970
+ 'dl.mode_merge': 'Fusionner : mettre à jour les lignes ayant la même clé primaire, insérer les autres',
3971
+ 'dl.mode_replace': 'Remplacer : supprimer d\'abord toutes les lignes',
3972
+ 'dl.save_mapping': 'Enregistrer cette correspondance comme définition de chargement',
3973
+ 'dl.save_mapping_help': 'Pour le processus data_load d\'une application, et pour recharger des fichiers comme celui-ci.',
3974
+ 'dl.name': 'Nom',
3975
+ 'dl.save_definition': 'Enregistrer comme définition',
3976
+ 'dl.table': 'Table',
3977
+ 'dl.choose_table': '- choisir une table -',
3978
+ 'dl.map_columns': 'Associer les colonnes',
3979
+ 'dl.into_new': 'Charger dans une nouvelle table',
3980
+ 'dl.into_existing': 'Charger dans une table existante',
3981
+ 'dl.def_saved': 'Définition de chargement {name} enregistrée.',
3982
+ 'dl.def_not_saved': 'La définition n\'a pas pu être enregistrée : {reason}',
3983
+ 'dl.def_exists': 'l\'application a déjà une définition nommée {name}.',
3984
+ 'dl.e.def_gone': 'La définition de chargement n\'existe plus.',
3985
+ 'dl.e.no_columns': 'Donnez un nom à au moins une colonne.',
3986
+ 'dl.view': 'Voir {table}',
3987
+ 'dl.load_another': 'Charger un autre fichier',
3988
+ // ------------------------------------------------------------ SQL Workshop › Object Browser › Security and Document view (CD-8)
3989
+ 'ds.roles_and_columns': 'Rôles de base de données et colonnes',
3990
+ 'ds.db_role': 'Rôle de base de données',
3991
+ 'ds.masked_in': 'Masquée dans {view}',
3992
+ 'ds.masked': 'masquée',
3993
+ 'ds.runs': 'exécute {apps}',
3994
+ 'ds.read': 'lire',
3995
+ 'ds.update': 'modifier',
3996
+ 'ds.no_grants': 'Aucun rôle de base de données n\'a de privilèges sur cette table, et aucune application de l\'espace de travail ne s\'exécute avec un rôle de base de données.',
3997
+ 'ds.excluded': 'Absents de la matrice, car les privilèges de colonne ne peuvent pas les restreindre :',
3998
+ 'ds.masks_per_column': 'Masques par colonne',
3999
+ 'ds.column': 'Colonne',
4000
+ 'ds.mask': 'Masque',
4001
+ 'ds.role_sees': '{role} la voit',
4002
+ 'ds.others_see': 'Tous les autres la voient',
4003
+ 'ds.aria_mask': 'Masque de {column}',
4004
+ 'ds.not_masked': 'Non masquée',
4005
+ 'ds.mask.null': 'vide (null)',
4006
+ 'ds.mask.stars': '***',
4007
+ 'ds.mask.partial': '*** + 4 derniers',
4008
+ 'ds.aria_role_sees': '{role} voit {column}',
4009
+ 'ds.aria_others_see': 'Tous les autres voient {column}',
4010
+ 'ds.rows': 'Lignes',
4011
+ 'ds.rls_is': 'La sécurité au niveau des lignes est {state}',
4012
+ 'ds.rls_on_owner': 'active, aussi pour le propriétaire',
4013
+ 'ds.rls_on': 'active',
4014
+ 'ds.rls_off': 'inactive',
4015
+ 'ds.rls_off_detail': 'tout rôle qui peut lire la table lit toutes les lignes',
4016
+ 'ds.rls_how': '{props} l\'active ; {policy} en écrit une dans la feuille de calcul.',
4017
+ 'ds.table_properties': 'Propriétés de la table',
4018
+ 'ds.add_policy': 'Ajouter une politique',
4019
+ 'ds.policy': 'Politique',
4020
+ 'ds.command': 'Commande',
4021
+ 'ds.roles': 'Rôles',
4022
+ 'ds.restrictive': 'restrictive',
4023
+ 'ds.no_policies': 'Aucune politique.',
4024
+ 'ds.no_policies_rls': 'Aucune politique : avec la sécurité au niveau des lignes active, les rôles ci-dessous ne lisent aucune ligne.',
4025
+ 'ds.columns': 'Colonnes',
4026
+ 'ds.columns_help': 'Ce que chaque rôle de base de données peut lire et modifier, par colonne. PostgreSQL refuse une colonne qu\'un rôle ne peut pas lire, quel que soit l\'émetteur de la requête : pages, gestionnaires REST, AutoREST, outils IA, MCP ou psql.',
4027
+ 'ds.values': 'Valeurs',
4028
+ 'ds.values_help': 'Les colonnes masquées ne montrent leur valeur qu\'aux rôles d\'application cochés (`meta.has_role()` de l\'utilisateur connecté) ; les autres voient le masque. Les masques se trouvent dans une vue à côté de la table, que les rôles ci-dessus lisent à la place de la table.',
4029
+ 'ds.masking_view': 'Vue de masquage',
4030
+ 'ds.view_name': 'Nom de la vue',
4031
+ 'ds.app_roles': 'Rôles d\'application',
4032
+ 'ds.app_roles_help': 'Séparés par des virgules. Les rôles modifiés obtiennent leur colonne dans le tableau ci-dessous après Aperçu SQL.',
4033
+ 'ds.no_changes': 'Aucun changement : la sécurité de la table est telle que le formulaire l\'affiche.',
4034
+ 'ds.preview_sql': 'Aperçu SQL',
4035
+ 'ds.changed_1': 'Sécurité de {table} modifiée : 1 instruction.',
4036
+ 'ds.changed': 'Sécurité de {table} modifiée : {n} instructions.',
4037
+ 'ds.rolled_back': 'Rien n\'a été modifié : les instructions se sont exécutées dans une transaction, qui a été annulée.',
4038
+ 'ds.failed_statement': 'Instruction en échec',
4039
+ 'ds.title': 'Sécurité de {table}',
4040
+ 'ds.security': 'Sécurité',
4041
+ 'docv.no_key': '{table} n\'a pas de clé primaire : une vue document trouve ses lignes par elle.',
4042
+ 'docv.doc_is_key': 'La colonne document ne peut pas porter le nom d\'une colonne clé ({name}).',
4043
+ 'docv.made': 'La vue document {view} est créée.',
4044
+ 'docv.children': 'Tables enfants dans le document',
4045
+ 'docv.list': 'Liste dans le document',
4046
+ 'docv.fk': 'Clé étrangère',
4047
+ 'docv.no_children': 'Aucune autre table ne référence {table} : le document est la ligne seule.',
4048
+ 'docv.children_help': 'Chaque ligne enfant est un objet de sa liste, sans les colonnes de clé étrangère. Écrire un document met à jour les enfants qu\'il liste par leur clé, insère ceux sans clé et supprime ceux qu\'il omet ; un document sans la liste laisse les enfants intacts.',
4049
+ 'docv.view': 'Vue',
4050
+ 'docv.doc_column': 'Colonne document',
4051
+ 'docv.intro': 'Une vue document montre chaque ligne de {table} avec ses lignes enfants comme un seul document JSON, comme une JSON Relational Duality View d\'Oracle. Les rapports, REST (AutoREST sur la vue) et MCP lisent des documents entiers ; un update de la colonne document réécrit la ligne et ses enfants en une instruction. La sécurité au niveau des lignes et les droits de la table s\'appliquent (la vue est security_invoker et reçoit les droits de la table).',
2425
4052
  };