@antelopejs/dms-database 0.0.13 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +30 -5
  2. package/dist/db/models/query_history.model.d.ts +1 -0
  3. package/dist/db/models/query_history.model.js +6 -0
  4. package/dist/db/models/query_history.model.js.map +1 -1
  5. package/dist/db/tables/query_history.table.d.ts +3 -0
  6. package/dist/db/tables/query_history.table.js +12 -0
  7. package/dist/db/tables/query_history.table.js.map +1 -1
  8. package/dist/db/tables/saved_queries.table.d.ts +1 -0
  9. package/dist/db/tables/saved_queries.table.js +4 -0
  10. package/dist/db/tables/saved_queries.table.js.map +1 -1
  11. package/dist/i18n/messages.d.ts +39 -0
  12. package/dist/i18n/messages.js +64 -0
  13. package/dist/i18n/messages.js.map +1 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.js +1 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/module.d.ts +11 -0
  18. package/dist/module.js +55 -0
  19. package/dist/module.js.map +1 -0
  20. package/dist/pages/data.d.ts +1 -1
  21. package/dist/pages/data.js +9 -6
  22. package/dist/pages/data.js.map +1 -1
  23. package/dist/pages/diagram.d.ts +9 -0
  24. package/dist/pages/diagram.js +45 -0
  25. package/dist/pages/diagram.js.map +1 -0
  26. package/dist/pages/index.d.ts +1 -0
  27. package/dist/pages/index.js +1 -0
  28. package/dist/pages/index.js.map +1 -1
  29. package/dist/pages/overview.d.ts +4 -1
  30. package/dist/pages/overview.js +113 -6
  31. package/dist/pages/overview.js.map +1 -1
  32. package/dist/pages/query.d.ts +1 -1
  33. package/dist/pages/query.js +22 -6
  34. package/dist/pages/query.js.map +1 -1
  35. package/dist/pages/schemas.d.ts +2 -1
  36. package/dist/pages/schemas.js +143 -6
  37. package/dist/pages/schemas.js.map +1 -1
  38. package/dist/routes/data.d.ts +8 -0
  39. package/dist/routes/data.js +84 -21
  40. package/dist/routes/data.js.map +1 -1
  41. package/dist/routes/index.d.ts +1 -0
  42. package/dist/routes/index.js +1 -0
  43. package/dist/routes/index.js.map +1 -1
  44. package/dist/routes/overview.d.ts +12 -0
  45. package/dist/routes/overview.js +55 -0
  46. package/dist/routes/overview.js.map +1 -0
  47. package/dist/routes/query.d.ts +5 -1
  48. package/dist/routes/query.js +162 -27
  49. package/dist/routes/query.js.map +1 -1
  50. package/dist/routes/tables.d.ts +15 -12
  51. package/dist/routes/tables.js +95 -55
  52. package/dist/routes/tables.js.map +1 -1
  53. package/dist/service/catalog.d.ts +3 -0
  54. package/dist/service/catalog.js +26 -0
  55. package/dist/service/catalog.js.map +1 -0
  56. package/dist/service/health.d.ts +3 -3
  57. package/dist/service/health.js +17 -14
  58. package/dist/service/health.js.map +1 -1
  59. package/dist/service/introspect.d.ts +3 -1
  60. package/dist/service/introspect.js +131 -43
  61. package/dist/service/introspect.js.map +1 -1
  62. package/dist/service/overview.d.ts +9 -0
  63. package/dist/service/overview.js +113 -0
  64. package/dist/service/overview.js.map +1 -0
  65. package/dist/service/queryInspection.d.ts +15 -0
  66. package/dist/service/queryInspection.js +107 -0
  67. package/dist/service/queryInspection.js.map +1 -0
  68. package/dist/service/references.d.ts +9 -0
  69. package/dist/service/references.js +52 -0
  70. package/dist/service/references.js.map +1 -0
  71. package/dist/service/schemaFilters.d.ts +26 -0
  72. package/dist/service/schemaFilters.js +42 -0
  73. package/dist/service/schemaFilters.js.map +1 -0
  74. package/dist/service/stagedSerialization.d.ts +2 -0
  75. package/dist/service/stagedSerialization.js +38 -10
  76. package/dist/service/stagedSerialization.js.map +1 -1
  77. package/dist/service/types.d.ts +11 -1
  78. package/dist/types/constants.d.ts +2 -0
  79. package/dist/types/constants.js +3 -1
  80. package/dist/types/constants.js.map +1 -1
  81. package/dist/utils/query.d.ts +0 -2
  82. package/dist/utils/query.js +0 -20
  83. package/dist/utils/query.js.map +1 -1
  84. package/frontend-vue/app/{composables → build/composables}/useDataBrowserGrid.ts +65 -50
  85. package/frontend-vue/app/build/composables/useDataBrowserTabs.ts +366 -0
  86. package/frontend-vue/app/build/composables/useDatabaseHealth.ts +50 -0
  87. package/frontend-vue/app/build/composables/useDatabaseSchemas.ts +140 -0
  88. package/frontend-vue/app/{composables → build/composables}/useDiagramPersistence.ts +47 -39
  89. package/frontend-vue/app/build/composables/useQueryRuntime.ts +217 -0
  90. package/frontend-vue/app/build/composables/useQueryStore.ts +162 -0
  91. package/frontend-vue/app/build/data/cellValues.ts +132 -0
  92. package/frontend-vue/app/build/data/instanceOptions.ts +36 -0
  93. package/frontend-vue/app/build/data/pickerMenus.ts +175 -0
  94. package/frontend-vue/app/build/data/recentTables.ts +48 -0
  95. package/frontend-vue/app/build/data/stagedEdits.ts +117 -0
  96. package/frontend-vue/app/build/data/stagedWrites.ts +64 -0
  97. package/frontend-vue/app/build/data/useStagedSave.ts +298 -0
  98. package/frontend-vue/app/build/diagram/autosave.ts +72 -0
  99. package/frontend-vue/app/build/diagram/graph.ts +585 -0
  100. package/frontend-vue/app/build/diagram/history.ts +178 -0
  101. package/frontend-vue/app/build/diagram/shortcuts.ts +62 -0
  102. package/frontend-vue/app/build/diagram/sync.ts +137 -0
  103. package/frontend-vue/app/build/query/completion.ts +100 -0
  104. package/frontend-vue/app/build/query/csv.ts +32 -0
  105. package/frontend-vue/app/build/query/examples.ts +38 -0
  106. package/frontend-vue/app/build/query/runs.ts +168 -0
  107. package/frontend-vue/app/build/query/tableColumns.ts +35 -0
  108. package/frontend-vue/app/build/query/target.ts +143 -0
  109. package/frontend-vue/app/build/schemas/filterState.ts +128 -0
  110. package/frontend-vue/app/build/schemas/useSchemasListing.ts +62 -0
  111. package/frontend-vue/app/build/utils/databaseLinks.ts +98 -0
  112. package/frontend-vue/app/build/utils/fieldTypes.ts +198 -0
  113. package/frontend-vue/app/build/utils/relativeTime.ts +19 -0
  114. package/frontend-vue/app/{utils → build/utils}/stagedSerialization.ts +7 -1
  115. package/frontend-vue/app/components/ConnectionStatus.vue +122 -0
  116. package/frontend-vue/app/components/DataBrowser.vue +126 -0
  117. package/frontend-vue/app/components/DataBrowserSidebar.vue +293 -210
  118. package/frontend-vue/app/components/DataBrowserTabBar.vue +185 -93
  119. package/frontend-vue/app/components/DataFilterBar.vue +163 -0
  120. package/frontend-vue/app/components/DataGrid.vue +737 -499
  121. package/frontend-vue/app/components/DataGridCell.vue +125 -77
  122. package/frontend-vue/app/components/DataGridHeaderCell.vue +119 -81
  123. package/frontend-vue/app/components/DiagramNoteNode.vue +81 -63
  124. package/frontend-vue/app/components/DiagramRelationEdge.vue +57 -27
  125. package/frontend-vue/app/components/DiagramStubNode.vue +16 -17
  126. package/frontend-vue/app/components/DiagramTableNode.vue +106 -68
  127. package/frontend-vue/app/components/InstancePicker.vue +195 -0
  128. package/frontend-vue/app/components/JsonCellPanel.vue +30 -29
  129. package/frontend-vue/app/components/QueryBuilderPanel.vue +290 -238
  130. package/frontend-vue/app/components/QueryConsole.vue +726 -0
  131. package/frontend-vue/app/components/QueryLibrary.vue +314 -0
  132. package/frontend-vue/app/components/QueryResultPanel.vue +556 -126
  133. package/frontend-vue/app/components/RowDrawer.vue +520 -0
  134. package/frontend-vue/app/components/SchemaDiagram.vue +1016 -1051
  135. package/frontend-vue/app/components/SchemaPicker.vue +86 -0
  136. package/frontend-vue/app/components/SchemasFilterBar.vue +201 -0
  137. package/frontend-vue/app/components/TableInspector.vue +741 -0
  138. package/frontend-vue/app/config/shortcuts-registry.ts +65 -0
  139. package/frontend-vue/dms.frontend.ts +5 -14
  140. package/frontend-vue/i18n/locales/database-en-GB.json +526 -193
  141. package/frontend-vue/i18n/locales/database-fr-FR.json +528 -195
  142. package/frontend-vue/package.json +2 -1
  143. package/frontend-vue/pnpm-lock.yaml +2601 -858
  144. package/frontend-vue/pnpm-workspace.yaml +1 -1
  145. package/frontend-vue/tests/dataBrowser.test.ts +206 -0
  146. package/frontend-vue/tests/diagram.test.ts +516 -0
  147. package/frontend-vue/tests/helpers.test.ts +205 -0
  148. package/frontend-vue/tests/instanceOptions.test.ts +53 -0
  149. package/frontend-vue/tests/locales.test.ts +56 -0
  150. package/frontend-vue/tests/persistence.test.ts +106 -5
  151. package/frontend-vue/tests/pickerMenus.test.ts +254 -0
  152. package/frontend-vue/tests/queryConsole.test.ts +282 -0
  153. package/frontend-vue/tests/queryRuntime.test.ts +2 -2
  154. package/frontend-vue/tests/registration.test.ts +36 -25
  155. package/frontend-vue/tests/schemasFilters.test.ts +115 -0
  156. package/package.json +9 -6
  157. package/frontend-vue/app/components/QueryFavoritesPanel.vue +0 -127
  158. package/frontend-vue/app/components/QueryHistoryPanel.vue +0 -134
  159. package/frontend-vue/app/components/SchemaTableInspector.vue +0 -278
  160. package/frontend-vue/app/composables/useDataBrowserTabs.ts +0 -255
  161. package/frontend-vue/app/composables/useDatabaseHealth.ts +0 -50
  162. package/frontend-vue/app/composables/useDatabaseSchemas.ts +0 -92
  163. package/frontend-vue/app/composables/useQueryRuntime.ts +0 -118
  164. package/frontend-vue/app/composables/useQueryStore.ts +0 -117
  165. package/frontend-vue/app/composables/useTableViewRowClick.ts +0 -22
  166. package/frontend-vue/app/custom-pages/database/data.vue +0 -41
  167. package/frontend-vue/app/custom-pages/database/overview.vue +0 -367
  168. package/frontend-vue/app/custom-pages/database/query.vue +0 -436
  169. package/frontend-vue/app/custom-pages/database/schemas.vue +0 -218
  170. package/frontend-vue/app/utils/databaseFieldModifiers.ts +0 -33
  171. package/frontend-vue/app/utils/databaseFieldTypeIcons.ts +0 -224
  172. package/frontend-vue/app/utils/dmsTableView.ts +0 -83
  173. package/frontend-vue/app/utils/relativeTime.ts +0 -18
@@ -1,239 +1,572 @@
1
1
  {
2
2
  "dms_database": {
3
3
  "title": "Base de données",
4
- "description": "Inspecter les schémas, parcourir les données, visualiser le diagramme et vérifier la configuration de la connexion.",
4
+ "description": "Inspectez les schémas et les tables, parcourez et corrigez les lignes, cartographiez les relations et lancez des requêtes.",
5
5
  "overview": {
6
6
  "title": "Vue d'ensemble",
7
- "description": "Santé de la connexion, stockage et activité récente de votre base de données.",
7
+ "description": "Santé de la connexion, schémas et activité récente de la base.",
8
8
  "beta": {
9
- "title": "Ce module est en bêta",
10
- "body": "Aujourd'hui la console de base de données est en lecture seule — elle permet d'explorer les schémas, de parcourir les données et d'exécuter des requêtes. Dans une prochaine version, vous pourrez **modifier les tables directement**, changer leur structure, **ajouter ou renommer des colonnes et ajuster leurs types**, **créer et gérer des index**, définir des relations et des contraintes — le tout **sans écrire la moindre migration**. Antelope développe activement cette fonctionnalité ; elle arrivera avec le **Module Builder**, la future façon de configurer toute la plateforme sans écrire de code."
9
+ "title": "Bêta",
10
+ "body": "Les modifications enregistrées dans l'explorateur de données sont écrites directement en base. L'édition de la structure (colonnes, index, relations) arrive avec le Module Builder.",
11
+ "meta": "Avertissement bêta",
12
+ "meta_description": "L'avertissement d'une ligne sur les écritures et ce qui arrive."
11
13
  },
12
14
  "actions": {
13
- "schema": "Schéma",
14
- "openData": "Ouvrir l'explorateur"
15
+ "query": "Ouvrir la console",
16
+ "browse": "Parcourir les données"
15
17
  },
16
- "health": {
17
- "connection": "Connexion",
18
- "healthy": "En bonne santé",
19
- "down": "Indisponible",
20
- "driver": "Pilote",
21
- "latency": "Latence",
22
- "pool": "Pool",
23
- "collections": "Collections"
18
+ "recent": {
19
+ "title": "Requêtes récentes",
20
+ "console": "Console de requêtes",
21
+ "duration": "{duration} ms",
22
+ "rows": "{count} lignes",
23
+ "changed": "{count} modifiées",
24
+ "failed": "Échec",
25
+ "empty_title": "Aucune requête lancée",
26
+ "empty_description": "Les requêtes lancées dans la console apparaissent ici."
24
27
  },
25
- "kpis": {
26
- "schemas": "Schémas",
28
+ "connection": {
29
+ "meta": "État de la connexion",
30
+ "meta_description": "Si la base répond, la latence de la sonde et ce qu'elle contient.",
31
+ "label": "Connexion",
32
+ "healthy": "Opérationnelle",
33
+ "down": "Indisponible",
34
+ "checked_seconds": "vérifiée il y a {count} s",
35
+ "checked_minutes": "vérifiée il y a {count} min",
36
+ "latency": "Latence de la sonde",
37
+ "latency_sub": "dernière sonde",
27
38
  "tables": "Tables",
28
- "rows": "Lignes totales",
39
+ "tables_sub": "dans {count} schéma | dans {count} schémas",
40
+ "rows": "Lignes",
41
+ "rows_sub": "dans les instances par défaut",
29
42
  "indexes": "Index",
30
- "size": "Éléments stockés"
43
+ "indexes_sub": "déclarés dans le code",
44
+ "last_error": "Dernière erreur",
45
+ "no_answer": "Pas de réponse",
46
+ "next_probe": "Prochaine sonde",
47
+ "next_probe_sub": "tant que la page est ouverte",
48
+ "retry": "Vérifier à nouveau"
31
49
  },
32
- "storage": {
33
- "title": "Stockage par table",
34
- "subtitle": "Top des tables par nombre de lignes",
35
- "viewSchema": "Voir le schéma",
36
- "rowsUnit": "lignes",
37
- "empty": "Aucune table à afficher."
50
+ "schemas": {
51
+ "title": "Schémas",
52
+ "description": "Déclarés par les modules. Ouvrez-en un pour voir ses tables.",
53
+ "card": {
54
+ "instances": "{count} instance | {count} instances",
55
+ "tables": "{count} table | {count} tables",
56
+ "rows": "{count} ligne | {count} lignes",
57
+ "relations": "{count} relation | {count} relations",
58
+ "contents": "{tables} · {rows}"
59
+ },
60
+ "cards_meta": "Cartes des schémas",
61
+ "empty_title": "Aucun schéma déclaré",
62
+ "empty_description": "Les schémas apparaissent ici quand un module déclare des tables avec {'@'}RegisterTable. La connexion elle-même fonctionne."
38
63
  },
39
- "recent": {
40
- "title": "Requêtes récentes",
41
- "console": "Console de requêtes",
42
- "rowsUnit": "lignes",
43
- "justNow": "à l'instant",
44
- "empty": "Aucune requête récente."
45
- },
46
- "tables": {
47
- "title": "Tables",
48
- "subtitle": "Toutes les collections du schéma actif",
49
- "empty": "Aucune table ne correspond au filtre.",
50
- "cols": {
51
- "table": "Table",
52
- "rows": "Lignes",
53
- "columns": "Colonnes",
54
- "indexes": "Index"
55
- }
56
- }
64
+ "largest": {
65
+ "title": "Plus grandes tables",
66
+ "description": "Lignes par table, instance par défaut",
67
+ "empty": "Aucune table ne contient de ligne."
68
+ },
69
+ "activity_meta": "Tables et requêtes"
57
70
  },
58
71
  "schemas": {
59
72
  "title": "Schémas",
60
- "description": "Explorez les tables sous forme de liste ou de carte visuelle. Cliquez sur une table pour inspecter ses colonnes, index et relations.",
61
- "tableCount": "{count} table | {count} tables",
62
- "collections": "{count} collection | {count} collections",
63
- "selectSchema": "Sélection du schéma",
64
- "searchSchemaPlaceholder": "Rechercher un schéma…",
65
- "open": "Ouvrir",
66
- "view": {
67
- "list": "Liste",
68
- "diagram": "Diagramme"
69
- },
73
+ "description": "Toutes les tables déclarées par vos modules, avec leurs lignes comptées dans toutes les instances. Ouvrez-en une pour voir ses colonnes, index et relations.",
70
74
  "cols": {
71
- "relations": "Relations"
72
- },
73
- "inspector": {
75
+ "relations": "Relations",
76
+ "table": "Table",
77
+ "schema": "Schéma",
78
+ "rows": "Lignes",
74
79
  "columns": "Colonnes",
75
80
  "indexes": "Index",
76
- "preview": "Aperçu",
77
- "close": "Fermer",
78
- "colName": "Colonne",
79
- "colType": "Type",
80
- "colNullable": "Nullable",
81
- "yes": "Oui",
82
- "no": "Non",
83
- "multi": "multi",
84
- "single": "simple",
85
- "noIndexes": "Aucun index défini.",
86
- "previewError": "Impossible de charger un document exemple.",
87
- "previewEmpty": "Cette table n'a aucune ligne à prévisualiser.",
88
- "healthy": "En bonne santé"
81
+ "modifiers": "Modificateurs"
89
82
  },
90
- "stats": {
91
- "tables": "Tables",
92
- "elements": "Éléments",
93
- "instances": "Instances"
94
- },
95
- "menu": {
96
- "browseData": "Parcourir les données",
97
- "viewInDiagram": "Voir dans le diagramme",
98
- "copyId": "Copier l'identifiant",
99
- "rename": "Renommer",
100
- "duplicate": "Dupliquer",
101
- "export": "Exporter",
102
- "delete": "Supprimer",
103
- "comingSoon": "Bientôt disponible",
104
- "copied": "Identifiant copié"
83
+ "inspector": {
84
+ "title": "Table",
85
+ "meta": "Inspecteur de table",
86
+ "meta_description": "Colonnes, index, relations et ligne exemple d'une table.",
87
+ "not_found": "Table introuvable"
105
88
  },
106
- "browseData": "Parcourir les données",
107
- "viewDefinition": "Voir la définition",
108
- "columns": {
109
- "name": "Nom",
110
- "elementCount": "Éléments",
111
- "columnCount": "Colonnes",
112
- "indexCount": "Index"
89
+ "caption": "Tables",
90
+ "table_meta_description": "Toutes les tables déclarées, par schéma, avec leur inspecteur.",
91
+ "search": "Chercher une table ou une colonne",
92
+ "footer_hint": "J / K pour passer d'une table à l'autre dans l'inspecteur",
93
+ "actions": {
94
+ "inspect": "Inspecter",
95
+ "browse": "Parcourir les données",
96
+ "query": "Interroger cette table",
97
+ "diagram": "Voir dans le diagramme"
98
+ },
99
+ "empty": {
100
+ "first_title": "Aucune table déclarée",
101
+ "first_description": "Les tables apparaissent ici quand un module les déclare avec {'@'}RegisterTable.",
102
+ "no_result_title": "Aucun résultat",
103
+ "no_result_description": "Aucune table ne correspond à ces filtres.",
104
+ "clear_filters": "Effacer les filtres"
105
+ },
106
+ "filters": {
107
+ "meta": "Barre de filtres",
108
+ "meta_description": "Filtre les tables par schéma, instance, nom et structure.",
109
+ "label": "Filtrer les tables",
110
+ "has": {
111
+ "relations": "Avec relations",
112
+ "modifiers": "Avec modificateurs",
113
+ "empty": "Vides"
114
+ },
115
+ "has_hint": {
116
+ "relations": "Tables qui pointent vers une autre table",
117
+ "modifiers": "Tables avec des colonnes hachées, traduites ou chiffrées",
118
+ "empty": "Tables sans ligne dans l’instance choisie"
119
+ },
120
+ "count": "{shown} tables sur {total}",
121
+ "clear": "Effacer"
113
122
  }
114
123
  },
115
124
  "data": {
116
125
  "title": "Explorateur de données",
117
- "description": "Parcourir les lignes d'un schéma, d'une instance et d'une table sélectionnés.",
118
- "instanceDefault": "Par défaut",
119
- "instanceCross": "Toutes les instances (lecture seule)",
120
- "schema": "Schéma",
121
- "openInQuery": "Ouvrir dans la console",
122
- "findTable": "Rechercher une table…",
123
- "colCount": "{count} colonne | {count} colonnes",
124
- "crossInstanceNotice": "Lecture sur toutes les instances de ce schéma. Les écritures sont désactivées.",
125
- "noColumns": "Aucune colonne à afficher pour cette table.",
126
- "pickPrompt": "Sélectionnez un schéma et une table pour parcourir ses lignes.",
127
- "searchPlaceholder": "Rechercher dans les lignes…",
128
- "refresh": "Rafraîchir",
129
- "readOnly": "Lecture seule",
130
- "filtersActive": "{count} filtre actif | {count} filtres actifs",
131
- "filterModeIs": "est exactement",
132
- "filterModeContains": "contient",
133
- "filterApply": "Appliquer",
134
- "filterClear": "Effacer",
135
- "filterTitle": "Filtrer {column}",
136
- "rowsTotal": "{count} ligne | {count} lignes",
137
- "noRows": "Aucune ligne ne correspond à la vue actuelle.",
138
- "prevPage": "Page précédente",
139
- "nextPage": "Page suivante",
140
- "editError": "Échec de l'enregistrement de la cellule",
141
- "rowVanished": "Cette ligne n'existe plus — la vue a été rafraîchie.",
142
- "jsonPanelTitle": "Modifier {column}",
143
- "jsonInvalid": "JSON invalide",
144
- "jsonNotStructured": "La valeur doit être un objet ou un tableau JSON.",
145
- "save": "Enregistrer",
146
- "cancel": "Annuler",
147
- "closeTab": "Fermer l'onglet",
148
- "keepTab": "Garder l'onglet ouvert",
149
- "previewTab": "{name} (onglet d'aperçu)"
126
+ "description": "Parcourez et corrigez les lignes. Les modifications sont préparées et écrites seulement quand vous les enregistrez.",
127
+ "meta": "Explorateur de données",
128
+ "meta_description": "Les tables, les lignes et les modifications préparées d'une instance de schéma.",
129
+ "scope": {
130
+ "schema": "Schéma",
131
+ "instance": "Instance",
132
+ "search": "Recherche",
133
+ "default": "défaut",
134
+ "all": "toutes",
135
+ "find_table": "Chercher une table",
136
+ "tables": "Tables · {count}",
137
+ "rows": "Lignes",
138
+ "open_tab": "Ouverte dans un onglet",
139
+ "open_hint": "Un clic pour prévisualiser, un double-clic pour garder l'onglet",
140
+ "no_table": "Aucune table ne correspond.",
141
+ "counts_for": "Comptes de l'instance {instance}",
142
+ "counts_failed": "Les nombres de lignes n'ont pas pu être chargés.",
143
+ "loading_schemas": "Chargement des schémas…",
144
+ "schemas_failed": "Impossible de charger les schémas"
145
+ },
146
+ "tabs": {
147
+ "close": "Fermer l'onglet",
148
+ "keep": "Garder l'onglet",
149
+ "keep_hint": "Onglet d'aperçu : la prochaine table ouverte le remplace. Gardez-le ouvert.",
150
+ "preview": "{name} (onglet d'aperçu)",
151
+ "hint": "{italic} = onglet d'aperçu · double-clic pour le garder",
152
+ "italic": "Italique",
153
+ "unsaved": "{count} modification non enregistrée | {count} modifications non enregistrées",
154
+ "close_title": "Fermer {table} sans enregistrer ?",
155
+ "close_description": "Sa modification préparée sera perdue. | Ses {count} modifications préparées seront perdues.",
156
+ "close_discard": "Abandonner et fermer",
157
+ "close_keep": "Continuer"
158
+ },
159
+ "grid": {
160
+ "rows": "{count} ligne | {count} lignes",
161
+ "search": "Chercher dans les lignes",
162
+ "refresh": "Actualiser (R)",
163
+ "open_query": "Ouvrir dans la console",
164
+ "open_row": "Ouvrir la ligne (Espace)",
165
+ "sort_hint": "Trier sur cette colonne",
166
+ "read_only": "Lecture seule.",
167
+ "read_only_detail": "Vous lisez {table} dans toutes les instances. Choisissez une instance pour modifier.",
168
+ "switch_to": "Passer sur {instance}",
169
+ "page_size": "Lignes par page",
170
+ "pagination": "Pagination",
171
+ "previous_page": "Page précédente",
172
+ "next_page": "Page suivante",
173
+ "kbd_edit": "modifier",
174
+ "kbd_cancel": "annuler",
175
+ "kbd_open": "ouvrir la ligne",
176
+ "kbd_save": "vérifier et enregistrer",
177
+ "staged_title": "Non enregistré · valait {before}",
178
+ "invalid_number": "Un nombre est attendu, par ex. 860.50 · Échap pour annuler",
179
+ "invalid_boolean": "true ou false est attendu · Échap pour annuler",
180
+ "invalid_date": "Une date est attendue, par ex. 2026-10-09 ou 2026-10-09T14:30Z · Échap pour annuler",
181
+ "edit_cell": "Valeur de {column}",
182
+ "null_hint": "Tapez null pour vider la cellule, \\null pour le texte null",
183
+ "empty_text": "Texte vide"
184
+ },
185
+ "filters": {
186
+ "add": "Ajouter un filtre",
187
+ "apply": "Appliquer",
188
+ "remove": "Retirer le filtre",
189
+ "clear_all": "Tout effacer",
190
+ "value": "Valeur",
191
+ "contains": "contient",
192
+ "is": "est exactement",
193
+ "column_title": "Filtrer {column}",
194
+ "remove_chip": "Retirer le filtre sur {column}"
195
+ },
196
+ "empty": {
197
+ "pick_title": "Choisissez une table à parcourir",
198
+ "pick_description": "Choisissez une table à gauche, ou repartez d'une table ouverte récemment.",
199
+ "pick_description_first": "Choisissez une table à gauche pour voir ses lignes.",
200
+ "recent": "Ouvertes récemment",
201
+ "error_title": "Impossible de charger {table}",
202
+ "error_description": "Vos filtres et vos modifications non enregistrées sont conservés.",
203
+ "check_connection": "Vérifier la connexion",
204
+ "no_match_title": "Aucune ligne ne correspond",
205
+ "no_match_description": "{count} lignes cherchées dans {table}. La ligne est peut-être dans une autre instance.",
206
+ "clear_filters": "Effacer les filtres",
207
+ "search_all": "Chercher dans toutes les instances",
208
+ "no_rows_title": "{table} n'a encore aucune ligne",
209
+ "no_rows_description": "Les lignes écrites par vos modules apparaissent ici."
210
+ },
211
+ "save": {
212
+ "review": "Vérifier et enregistrer {count} modification | Vérifier et enregistrer {count} modifications",
213
+ "title": "Enregistrer {count} modification dans {table} ? | Enregistrer {count} modifications dans {table} ?",
214
+ "description": "Elle est écrite dans {scope}. | Elles sont écrites dans {scope}.",
215
+ "confirm": "Enregistrer {count} modification | Enregistrer {count} modifications",
216
+ "keep_editing": "Continuer à modifier",
217
+ "saved": "{count} modification enregistrée dans {scope} | {count} modifications enregistrées dans {scope}",
218
+ "undo": "Annuler",
219
+ "undone": "{count} modification annulée | {count} modifications annulées",
220
+ "undo_failed": "Impossible d'annuler les modifications",
221
+ "partial_title": "{saved} sur {total} modification enregistrée | {saved} sur {total} modifications enregistrées",
222
+ "rows_gone": "{count} ligne n'existe plus : ses modifications ont été abandonnées. | {count} lignes n'existent plus : leurs modifications ont été abandonnées.",
223
+ "not_written": "{count} modification n'a pas été écrite et reste préparée ({error}). | {count} modifications n'ont pas été écrites et restent préparées ({error}).",
224
+ "undo_partial": "{count} modification n'a pas pu être annulée | {count} modifications n'ont pas pu être annulées",
225
+ "rows_missing": "{count} ligne n'existe plus. | {count} lignes n'existent plus."
226
+ },
227
+ "row": {
228
+ "title": "Ligne de {table}",
229
+ "eyebrow": "Ligne · {scope}",
230
+ "previous": "Ligne précédente (K)",
231
+ "next": "Ligne suivante (J)",
232
+ "fields": "Champs",
233
+ "json": "JSON",
234
+ "references": "Référencée par",
235
+ "no_id": "Ligne sans identifiant",
236
+ "was": "valait {value}",
237
+ "not_editable": "non modifiable",
238
+ "set_null": "Mettre à null",
239
+ "invalid_json": "JSON invalide",
240
+ "open_relation": "Ouvrir {table}",
241
+ "references_failed": "Impossible de compter les lignes qui pointent ici.",
242
+ "references_none": "Aucune ligne d'une autre table ne pointe vers celle-ci.",
243
+ "reference_count": "{count} ligne · {field} | {count} lignes · {field}",
244
+ "no_change": "Aucune modification non enregistrée"
245
+ },
246
+ "json": {
247
+ "title": "Modifier {column}",
248
+ "invalid": "JSON invalide",
249
+ "not_structured": "La valeur doit être un objet JSON, un tableau ou null.",
250
+ "apply": "Appliquer"
251
+ }
150
252
  },
151
253
  "diagram": {
152
254
  "title": "Diagramme",
153
- "description": "Visualisation des schémas enregistrés et de leurs tables.",
154
- "recomputeLayout": "Recalculer la disposition",
155
- "tooManyTables": "Affichage de {shown} sur {total} tables. Utilisez le filtre de schéma pour affiner.",
255
+ "description": "Les tables d'un schéma et leurs relations. Déplacez les tables pour les arranger ; la disposition est enregistrée pour toute l'équipe.",
156
256
  "toolbar": {
157
- "autoLayout": "Auto layout",
158
- "help": "Aide",
159
- "helpText": "Réorganise automatiquement les tables du schéma avec un placement hiérarchique (dagre) et recadre la vue.",
160
- "undo": "Annuler la dernière action",
161
- "redo": "Refaire",
162
- "cancel": "Annuler",
163
- "apply": "Appliquer",
164
- "pointer": "Sélection",
165
- "hand": "Déplacer",
166
- "zoomIn": "Zoom avant",
167
- "zoomOut": "Zoom arrière",
168
- "resetZoom": "Réinitialiser le zoom",
169
- "fitView": "Ajuster",
170
- "notes": "Note"
257
+ "undo": "Annuler",
258
+ "redo": "Rétablir",
259
+ "auto_layout": "Disposition auto",
260
+ "auto_layout_hint": "Réorganise toutes les tables ; vous voyez le résultat avant de le garder",
261
+ "select": "Sélection",
262
+ "pan": "Déplacement",
263
+ "zoom_out": "Dézoomer",
264
+ "zoom_in": "Zoomer",
265
+ "reset_zoom": "Zoom à 100 %",
266
+ "fit": "Tout afficher",
267
+ "note": "Note",
268
+ "note_hint": "Ajouter une note"
171
269
  },
172
270
  "notes": {
173
- "placeholder": "Double-cliquez pour modifier",
174
- "delete": "Supprimer la note"
271
+ "placeholder": "Double-cliquez pour écrire",
272
+ "delete": "Supprimer la note",
273
+ "label": "Note"
274
+ },
275
+ "meta": "Diagramme du schéma",
276
+ "meta_description": "Les tables d'un schéma et leurs relations, avec des notes.",
277
+ "actions": {
278
+ "list": "Liste"
175
279
  },
176
- "unsavedConfirm": "Des modifications du diagramme n'ont pas été enregistrées. Quitter quand même ?"
280
+ "schema": "Schéma",
281
+ "search": "Chercher une table ou une colonne",
282
+ "search_empty": "Aucune table ni colonne",
283
+ "stub_title": "Ouvrir {schema}.{table}",
284
+ "not_found": {
285
+ "schema": "Schéma {schema} introuvable",
286
+ "table": "Table {table} introuvable dans {schema}"
287
+ },
288
+ "large": "{count} tables : sélectionnez-en une et isolez-la pour lire ses relations.",
289
+ "save": {
290
+ "idle": "Disposition enregistrée",
291
+ "saving": "Enregistrement…",
292
+ "error": "Impossible d'enregistrer la disposition",
293
+ "error_other": "Impossible d'enregistrer le diagramme de {schema}",
294
+ "just_now": "Disposition enregistrée · à l'instant",
295
+ "minutes": "Disposition enregistrée · il y a {count} min"
296
+ },
297
+ "preview": {
298
+ "title": "Aperçu de la disposition auto.",
299
+ "moved": "{count} table déplacée. | {count} tables déplacées.",
300
+ "discard": "Annuler",
301
+ "keep": "Garder la disposition"
302
+ },
303
+ "selection": {
304
+ "inspect": "Inspecter",
305
+ "focus": "Isoler",
306
+ "show_all": "Afficher toutes les tables"
307
+ },
308
+ "legend": {
309
+ "key": "Clé primaire",
310
+ "relation": "Relation",
311
+ "object": "Objet"
312
+ },
313
+ "empty": {
314
+ "no_schema": "Aucun schéma déclaré",
315
+ "title": "Aucune table dans {schema}",
316
+ "description": "Ce schéma est déclaré mais ne contient encore aucune table."
317
+ }
177
318
  },
178
319
  "query": {
179
320
  "title": "Console de requêtes",
180
- "description": "Écrivez, exécutez et sauvegardez des requêtes sur votre base de données avec des résultats en direct.",
181
- "builder": "Constructeur de requête",
182
- "result": "Résultat",
183
- "favorites": "Sauvegardées",
184
- "history": "Dernières requêtes",
185
- "format": "Formater",
186
- "save": "Sauvegarder",
187
- "saveAsFavorite": "Sauvegarder en favori",
188
- "hint": "Constructeur de requêtes JavaScript",
189
- "builderHintLabel": "Constructeur",
190
- "backToData": "Retour à l'explorateur",
191
- "clear": "Effacer",
192
- "clearHistory": "Effacer",
193
- "execute": "Exécuter",
194
- "table": "Tableau",
195
- "json": "JSON",
196
- "chart": "Graphique",
197
- "chartUnavailable": "Aucune colonne numérique à tracer.",
198
- "emptyResult": "Exécutez une requête pour voir les résultats",
199
- "emptyFavorites": "Aucune requête sauvegardée.",
200
- "emptyHistory": "Aucun historique.",
201
- "language": "Langage",
202
- "scopeMe": "Moi",
203
- "scopeShared": "Équipe",
204
- "sharedBadge": "Partagée avec l'équipe",
205
- "previous": "Précédent",
206
- "next": "Suivant",
207
- "rowCount": "{count} ligne | {count} lignes",
208
- "runtime": "{ms} ms",
209
- "saveModal": {
210
- "title": "Sauvegarder la requête",
321
+ "description": "Écrivez et lancez de l'AQL sur n'importe quel schéma. Les requêtes qui modifient des données montrent toujours d'abord ce qu'elles touchent.",
322
+ "meta": "Console de requêtes",
323
+ "meta_description": "L'éditeur, ses résultats et la bibliothèque des requêtes passées et enregistrées.",
324
+ "actions": {
325
+ "data": "Explorateur de données"
326
+ },
327
+ "library": {
328
+ "history": "Historique",
329
+ "saved": "Enregistrées",
330
+ "team": "Équipe",
331
+ "search": "Chercher une requête",
332
+ "today": "Aujourd'hui",
333
+ "yesterday": "Hier",
334
+ "failed": "Échec",
335
+ "rows": "{count} ligne | {count} lignes",
336
+ "changed": "{count} modifiée | {count} modifiées",
337
+ "save": "Enregistrer la requête",
338
+ "edit": "Modifier",
339
+ "delete": "Supprimer",
340
+ "shared": "Partagée",
341
+ "no_match": "Aucune requête ne correspond.",
342
+ "history_empty": "Les requêtes que vous lancez apparaissent ici.",
343
+ "saved_empty": "Les requêtes que vous enregistrez apparaissent ici.",
344
+ "team_empty": "Les requêtes partagées par l'équipe apparaissent ici.",
345
+ "history_kept": "Vos {count} dernières exécutions sont conservées.",
346
+ "clear": "Vider l'historique"
347
+ },
348
+ "editor": {
349
+ "untitled": "Requête sans titre",
350
+ "shared": "Partagée avec l'équipe",
351
+ "edited": "modifiée",
352
+ "new": "Nouvelle",
353
+ "new_hint": "Commencer une requête vide",
354
+ "format": "Formater",
355
+ "save": "Enregistrer",
356
+ "run": "Lancer",
357
+ "insert": "Insérer",
358
+ "complete": "compléter",
359
+ "position": "AQL · L {line}, Col {column}",
360
+ "aria_label": "Éditeur de requête (AQL)"
361
+ },
362
+ "result": {
363
+ "title": "Résultat",
364
+ "table": "Tableau",
365
+ "json": "JSON",
366
+ "chart": "Graphique",
367
+ "rows": "{count} ligne | {count} lignes",
368
+ "changed": "{count} modifiée | {count} modifiées",
369
+ "read_only": "lecture seule",
370
+ "wrote": "données modifiées",
371
+ "copy": "Copier en JSON",
372
+ "copied": "{count} ligne copiée en JSON | {count} lignes copiées en JSON",
373
+ "export": "Exporter en CSV",
374
+ "open_row": "Ouvrir dans l'explorateur",
375
+ "open_table": "Ouvrir {target} dans l'explorateur",
376
+ "failed_title": "La requête a échoué",
377
+ "failed_detail": "après {ms} ms · rien n'a été modifié",
378
+ "replace": "Remplacer par « {table} »",
379
+ "see_tables": "Voir les tables de {schema}",
380
+ "first_title": "Lancez une requête pour voir le résultat",
381
+ "first_description": "Partez d'un exemple construit sur vos propres tables :",
382
+ "example_latest": "Les 10 dernières lignes de {table}",
383
+ "example_count": "Compter {table}",
384
+ "no_rows": "La requête n'a renvoyé aucune ligne.",
385
+ "elsewhere_title": "Aucune ligne dans l'instance par défaut.",
386
+ "elsewhere_description": "Cette table a des lignes dans d'autres instances :",
387
+ "done": "Terminé. La requête n'a renvoyé aucune ligne.",
388
+ "bars": "Barres",
389
+ "x_axis": "Axe X",
390
+ "y_axis": "Axe Y",
391
+ "chart_first": "Les {count} premières sur {total}",
392
+ "chart_unavailable": "Aucune colonne numérique à tracer.",
393
+ "all_shown": "{count} ligne affichée. | Les {count} lignes sont affichées. Au-delà de 1 000 lignes le résultat est coupé ; ajoutez .slice() pour paginer.",
394
+ "truncated": "{shown} lignes affichées sur {total} : le résultat est coupé à 1 000. Ajoutez .slice() pour paginer.",
395
+ "table_first": "Le tableau montre les {shown} premières lignes sur {total} ; le JSON et l'export CSV les contiennent toutes.",
396
+ "running": "Exécution…",
397
+ "failed_local": "La requête n'a pas été envoyée · rien n'a été modifié",
398
+ "example_first": "Les 10 premières lignes de {table}"
399
+ },
400
+ "guard": {
401
+ "description": "Cette requête modifie des données. Un essai à blanc a trouvé ce qu'elle touche :",
402
+ "operation": "Opération",
403
+ "target": "Cible",
404
+ "rows": "Lignes",
405
+ "title_insert": "Insérer {count} ligne dans {table} ? | Insérer {count} lignes dans {table} ?",
406
+ "title_update": "Modifier {count} ligne de {table} ? | Modifier {count} lignes de {table} ?",
407
+ "title_replace": "Remplacer {count} ligne de {table} ? | Remplacer {count} lignes de {table} ?",
408
+ "title_delete": "Supprimer {count} ligne de {table} ? | Supprimer {count} lignes de {table} ?",
409
+ "title_unknown": "Lancer une requête qui modifie {table} ?",
410
+ "confirm_insert": "Insérer {count} ligne | Insérer {count} lignes",
411
+ "confirm_update": "Modifier {count} ligne | Modifier {count} lignes",
412
+ "confirm_replace": "Remplacer {count} ligne | Remplacer {count} lignes",
413
+ "confirm_delete": "Supprimer {count} ligne | Supprimer {count} lignes",
414
+ "confirm_unknown": "Lancer la requête",
415
+ "skip": "Ne plus demander pour les modifications d'une seule ligne",
416
+ "skip_detail": "Jusqu'à la fermeture de cet onglet. Les suppressions et les modifications de plusieurs lignes demandent toujours.",
417
+ "op_insert": "insertion",
418
+ "op_update": "modification",
419
+ "op_replace": "remplacement",
420
+ "op_delete": "suppression"
421
+ },
422
+ "save": {
423
+ "title": "Enregistrer la requête",
424
+ "edit_title": "Modifier la requête enregistrée",
425
+ "description": "Les requêtes enregistrées apparaissent sous Enregistrées, et sous Équipe quand elles sont partagées.",
211
426
  "name": "Nom",
212
- "namePlaceholder": "Requête sans titre",
213
- "description": "Description",
214
- "descriptionPlaceholder": "Notes optionnelles sur cette requête",
427
+ "name_placeholder": "Commandes EU en attente",
428
+ "notes": "Description",
429
+ "name_required": "Donnez un nom à la requête",
215
430
  "share": "Partager avec l'équipe",
216
- "shareDescription": "Les membres de l'équipe verront cette requête dans l'onglet Équipe.",
217
- "save": "Sauvegarder",
218
- "cancel": "Annuler"
431
+ "share_description": "L'équipe peut la lancer ; vous seul pouvez la modifier ou la supprimer.",
432
+ "confirm": "Enregistrer la requête",
433
+ "failed": "Impossible d'enregistrer la requête",
434
+ "saved": "« {name} » enregistrée"
219
435
  },
220
- "editModal": {
221
- "title": "Modifier la requête",
222
- "query": "Requête"
436
+ "delete": {
437
+ "title": "Supprimer « {name} » ?",
438
+ "shared": "L'équipe la perd aussi de son onglet Équipe.",
439
+ "confirm": "Supprimer la requête"
223
440
  },
224
- "itemMenu": {
225
- "load": "Charger dans l'éditeur",
226
- "edit": "Modifier",
227
- "delete": "Supprimer"
228
- },
229
- "errorTitle": "Échec de la requête",
230
- "mutationModal": {
231
- "title": "Exécuter une requête modifiante ?",
232
- "body": "Cette requête va modifier des données (insert, update, replace ou delete). Voulez-vous vraiment l'exécuter ?",
233
- "dontRemind": "Ne plus me demander",
234
- "confirm": "Exécuter",
235
- "cancel": "Annuler"
441
+ "clear": {
442
+ "title": "Vider votre historique de requêtes ?",
443
+ "description": "Vos exécutions passées sont supprimées. Les requêtes enregistrées restent.",
444
+ "confirm": "Vider l'historique"
445
+ },
446
+ "errors": {
447
+ "syntax": "Erreur de syntaxe : {detail}. Vérifiez les parenthèses, les guillemets et les virgules.",
448
+ "syntax_at": "Erreur de syntaxe ligne {line}, colonne {column}. Vérifiez les parenthèses, les guillemets et les virgules.",
449
+ "unknown_schema": "Schéma inconnu « {schema} »."
450
+ }
451
+ },
452
+ "catalog_category": "Données",
453
+ "nav": {
454
+ "explore": "Explorer",
455
+ "work": "Travailler les données"
456
+ },
457
+ "common": {
458
+ "retry": "Réessayer",
459
+ "cancel": "Annuler",
460
+ "clear": "Effacer"
461
+ },
462
+ "pickers": {
463
+ "schema": {
464
+ "label": "Schéma",
465
+ "all": "Tous les schémas",
466
+ "find": "Chercher un schéma",
467
+ "more": "{shown} premiers sur {total}",
468
+ "no_match": "Aucun schéma ne correspond",
469
+ "placeholder": "Choisissez un schéma"
470
+ },
471
+ "instance": {
472
+ "label": "Instance",
473
+ "all": "Toutes les instances",
474
+ "read_only": "Vue en lecture seule",
475
+ "default": "default",
476
+ "find": "Chercher une instance",
477
+ "more": "{shown} premières sur {total}",
478
+ "no_match": "Aucune instance ne correspond",
479
+ "no_named": "Aucune instance nommée",
480
+ "pick_schema": "Choisissez un schéma pour lister ses instances nommées",
481
+ "loading": "Chargement des instances…",
482
+ "failed": "Les instances n’ont pas pu être chargées"
236
483
  }
484
+ },
485
+ "modifiers": {
486
+ "hashed": "Haché",
487
+ "localized": "Traduit",
488
+ "encrypted": "Chiffré"
489
+ },
490
+ "inspector": {
491
+ "load_error": "Impossible de charger les schémas de cette table.",
492
+ "eyebrow": "Schéma · {schema}",
493
+ "previous": "Table précédente (K)",
494
+ "next": "Table suivante (J)",
495
+ "instances": "{count} instance | {count} instances",
496
+ "copy_name": "Copier le nom de la table",
497
+ "copied": "{name} copié",
498
+ "primary_key": "clé primaire",
499
+ "facts": {
500
+ "rows": "{count} ligne | {count} lignes",
501
+ "columns": "{count} colonne | {count} colonnes",
502
+ "indexes": "{count} index | {count} index",
503
+ "relations": "{count} relation | {count} relations",
504
+ "by_instance": "Parcourir par instance dans l'explorateur"
505
+ },
506
+ "actions": {
507
+ "browse": "Parcourir les données",
508
+ "query": "Interroger cette table",
509
+ "diagram": "Voir dans le diagramme"
510
+ },
511
+ "tabs": {
512
+ "columns": "Colonnes",
513
+ "indexes": "Index",
514
+ "relations": "Relations",
515
+ "sample": "Ligne exemple"
516
+ },
517
+ "cols": {
518
+ "column": "Colonne",
519
+ "type": "Type",
520
+ "null": "Null",
521
+ "notes": "Notes"
522
+ },
523
+ "index": {
524
+ "compound": "composé",
525
+ "single": "simple",
526
+ "empty": "Aucun index déclaré sur cette table."
527
+ },
528
+ "relations": {
529
+ "out": "Références · {count}",
530
+ "in": "Référencée par · {count}",
531
+ "none_out": "Cette table ne pointe vers aucune autre.",
532
+ "none_in": "Aucune table ne pointe vers celle-ci."
533
+ },
534
+ "sample": {
535
+ "position": "Ligne {position} sur {total} · {instance}",
536
+ "default_instance": "instance par défaut",
537
+ "named_instance": "instance {name}",
538
+ "another": "Une autre ligne",
539
+ "error": "Impossible de charger une ligne de cette table.",
540
+ "empty": "Cette table n'a encore aucune ligne."
541
+ }
542
+ },
543
+ "shortcuts": {
544
+ "data_browser": "Base de données · explorateur",
545
+ "diagram": "Base de données · diagramme",
546
+ "query_console": "Base de données · console",
547
+ "schemas": "Base de données · schémas",
548
+ "next_table": "Table suivante, dans l'inspecteur de table",
549
+ "previous_table": "Table précédente, dans l'inspecteur de table",
550
+ "find_table_or_column": "Chercher une table ou une colonne",
551
+ "find_table": "Chercher une table",
552
+ "search_rows": "Chercher dans les lignes",
553
+ "refresh": "Actualiser les lignes",
554
+ "edit_cell": "Modifier la cellule sélectionnée",
555
+ "open_row": "Ouvrir la ligne sélectionnée",
556
+ "next_row": "Ligne suivante, dans le panneau de ligne",
557
+ "previous_row": "Ligne précédente, dans le panneau de ligne",
558
+ "review_save": "Vérifier et enregistrer les modifications",
559
+ "add_note": "Ajouter une note",
560
+ "select": "Outil de sélection",
561
+ "pan": "Outil de déplacement",
562
+ "fit": "Tout afficher",
563
+ "reset_zoom": "Zoom à 100 %",
564
+ "undo": "Annuler",
565
+ "redo": "Rétablir",
566
+ "step_back": "Revenir en arrière : l'aperçu de la disposition, le focus, puis la sélection",
567
+ "run": "Lancer la requête",
568
+ "save": "Enregistrer la requête",
569
+ "complete": "Compléter la requête"
237
570
  }
238
571
  }
239
572
  }