@adminiumjs/i18n 0.2.5 → 0.2.6

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 (430) hide show
  1. package/dist/a11y-keys.d.ts +1 -1
  2. package/dist/a11y-keys.d.ts.map +1 -1
  3. package/dist/a11y-keys.js +545 -18
  4. package/dist/a11y-keys.js.map +1 -1
  5. package/dist/format/index.d.ts +15 -3
  6. package/dist/format/index.d.ts.map +1 -1
  7. package/dist/format/index.js +15 -4
  8. package/dist/format/index.js.map +1 -1
  9. package/dist/resources/ar-eg/automations.d.ts +417 -0
  10. package/dist/resources/ar-eg/automations.d.ts.map +1 -0
  11. package/dist/resources/ar-eg/automations.js +417 -0
  12. package/dist/resources/ar-eg/automations.js.map +1 -0
  13. package/dist/resources/ar-eg/common.d.ts +23 -91
  14. package/dist/resources/ar-eg/common.d.ts.map +1 -1
  15. package/dist/resources/ar-eg/common.js +25 -93
  16. package/dist/resources/ar-eg/common.js.map +1 -1
  17. package/dist/resources/ar-eg/dataio.d.ts +260 -0
  18. package/dist/resources/ar-eg/dataio.d.ts.map +1 -0
  19. package/dist/resources/ar-eg/dataio.js +260 -0
  20. package/dist/resources/ar-eg/dataio.js.map +1 -0
  21. package/dist/resources/ar-eg/email.d.ts +824 -0
  22. package/dist/resources/ar-eg/email.d.ts.map +1 -0
  23. package/dist/resources/ar-eg/email.js +824 -0
  24. package/dist/resources/ar-eg/email.js.map +1 -0
  25. package/dist/resources/ar-eg/files.d.ts +112 -0
  26. package/dist/resources/ar-eg/files.d.ts.map +1 -0
  27. package/dist/resources/ar-eg/files.js +112 -0
  28. package/dist/resources/ar-eg/files.js.map +1 -0
  29. package/dist/resources/ar-eg/invoices.d.ts +717 -0
  30. package/dist/resources/ar-eg/invoices.d.ts.map +1 -0
  31. package/dist/resources/ar-eg/invoices.js +717 -0
  32. package/dist/resources/ar-eg/invoices.js.map +1 -0
  33. package/dist/resources/ar-eg/onboarding.d.ts +190 -0
  34. package/dist/resources/ar-eg/onboarding.d.ts.map +1 -0
  35. package/dist/resources/ar-eg/onboarding.js +190 -0
  36. package/dist/resources/ar-eg/onboarding.js.map +1 -0
  37. package/dist/resources/ar-eg/reportBuilder.d.ts +415 -0
  38. package/dist/resources/ar-eg/reportBuilder.d.ts.map +1 -0
  39. package/dist/resources/ar-eg/reportBuilder.js +415 -0
  40. package/dist/resources/ar-eg/reportBuilder.js.map +1 -0
  41. package/dist/resources/ar-eg/studio.d.ts +1760 -1117
  42. package/dist/resources/ar-eg/studio.d.ts.map +1 -1
  43. package/dist/resources/ar-eg/studio.js +1782 -1139
  44. package/dist/resources/ar-eg/studio.js.map +1 -1
  45. package/dist/resources/ar-eg/ui.d.ts +45 -9
  46. package/dist/resources/ar-eg/ui.d.ts.map +1 -1
  47. package/dist/resources/ar-eg/ui.js +47 -11
  48. package/dist/resources/ar-eg/ui.js.map +1 -1
  49. package/dist/resources/cs-cz/automations.d.ts +417 -0
  50. package/dist/resources/cs-cz/automations.d.ts.map +1 -0
  51. package/dist/resources/cs-cz/automations.js +417 -0
  52. package/dist/resources/cs-cz/automations.js.map +1 -0
  53. package/dist/resources/cs-cz/common.d.ts +23 -91
  54. package/dist/resources/cs-cz/common.d.ts.map +1 -1
  55. package/dist/resources/cs-cz/common.js +25 -93
  56. package/dist/resources/cs-cz/common.js.map +1 -1
  57. package/dist/resources/cs-cz/dataio.d.ts +260 -0
  58. package/dist/resources/cs-cz/dataio.d.ts.map +1 -0
  59. package/dist/resources/cs-cz/dataio.js +260 -0
  60. package/dist/resources/cs-cz/dataio.js.map +1 -0
  61. package/dist/resources/cs-cz/email.d.ts +824 -0
  62. package/dist/resources/cs-cz/email.d.ts.map +1 -0
  63. package/dist/resources/cs-cz/email.js +824 -0
  64. package/dist/resources/cs-cz/email.js.map +1 -0
  65. package/dist/resources/cs-cz/files.d.ts +112 -0
  66. package/dist/resources/cs-cz/files.d.ts.map +1 -0
  67. package/dist/resources/cs-cz/files.js +112 -0
  68. package/dist/resources/cs-cz/files.js.map +1 -0
  69. package/dist/resources/cs-cz/invoices.d.ts +717 -0
  70. package/dist/resources/cs-cz/invoices.d.ts.map +1 -0
  71. package/dist/resources/cs-cz/invoices.js +717 -0
  72. package/dist/resources/cs-cz/invoices.js.map +1 -0
  73. package/dist/resources/cs-cz/onboarding.d.ts +190 -0
  74. package/dist/resources/cs-cz/onboarding.d.ts.map +1 -0
  75. package/dist/resources/cs-cz/onboarding.js +190 -0
  76. package/dist/resources/cs-cz/onboarding.js.map +1 -0
  77. package/dist/resources/cs-cz/reportBuilder.d.ts +415 -0
  78. package/dist/resources/cs-cz/reportBuilder.d.ts.map +1 -0
  79. package/dist/resources/cs-cz/reportBuilder.js +415 -0
  80. package/dist/resources/cs-cz/reportBuilder.js.map +1 -0
  81. package/dist/resources/cs-cz/studio.d.ts +1759 -1116
  82. package/dist/resources/cs-cz/studio.d.ts.map +1 -1
  83. package/dist/resources/cs-cz/studio.js +1774 -1131
  84. package/dist/resources/cs-cz/studio.js.map +1 -1
  85. package/dist/resources/cs-cz/ui.d.ts +45 -9
  86. package/dist/resources/cs-cz/ui.d.ts.map +1 -1
  87. package/dist/resources/cs-cz/ui.js +47 -11
  88. package/dist/resources/cs-cz/ui.js.map +1 -1
  89. package/dist/resources/da-dk/automations.d.ts +417 -0
  90. package/dist/resources/da-dk/automations.d.ts.map +1 -0
  91. package/dist/resources/da-dk/automations.js +417 -0
  92. package/dist/resources/da-dk/automations.js.map +1 -0
  93. package/dist/resources/da-dk/common.d.ts +23 -91
  94. package/dist/resources/da-dk/common.d.ts.map +1 -1
  95. package/dist/resources/da-dk/common.js +25 -93
  96. package/dist/resources/da-dk/common.js.map +1 -1
  97. package/dist/resources/da-dk/dataio.d.ts +260 -0
  98. package/dist/resources/da-dk/dataio.d.ts.map +1 -0
  99. package/dist/resources/da-dk/dataio.js +260 -0
  100. package/dist/resources/da-dk/dataio.js.map +1 -0
  101. package/dist/resources/da-dk/email.d.ts +824 -0
  102. package/dist/resources/da-dk/email.d.ts.map +1 -0
  103. package/dist/resources/da-dk/email.js +824 -0
  104. package/dist/resources/da-dk/email.js.map +1 -0
  105. package/dist/resources/da-dk/files.d.ts +112 -0
  106. package/dist/resources/da-dk/files.d.ts.map +1 -0
  107. package/dist/resources/da-dk/files.js +112 -0
  108. package/dist/resources/da-dk/files.js.map +1 -0
  109. package/dist/resources/da-dk/invoices.d.ts +717 -0
  110. package/dist/resources/da-dk/invoices.d.ts.map +1 -0
  111. package/dist/resources/da-dk/invoices.js +717 -0
  112. package/dist/resources/da-dk/invoices.js.map +1 -0
  113. package/dist/resources/da-dk/onboarding.d.ts +190 -0
  114. package/dist/resources/da-dk/onboarding.d.ts.map +1 -0
  115. package/dist/resources/da-dk/onboarding.js +190 -0
  116. package/dist/resources/da-dk/onboarding.js.map +1 -0
  117. package/dist/resources/da-dk/reportBuilder.d.ts +415 -0
  118. package/dist/resources/da-dk/reportBuilder.d.ts.map +1 -0
  119. package/dist/resources/da-dk/reportBuilder.js +415 -0
  120. package/dist/resources/da-dk/reportBuilder.js.map +1 -0
  121. package/dist/resources/da-dk/studio.d.ts +1760 -1117
  122. package/dist/resources/da-dk/studio.d.ts.map +1 -1
  123. package/dist/resources/da-dk/studio.js +1771 -1128
  124. package/dist/resources/da-dk/studio.js.map +1 -1
  125. package/dist/resources/da-dk/ui.d.ts +45 -9
  126. package/dist/resources/da-dk/ui.d.ts.map +1 -1
  127. package/dist/resources/da-dk/ui.js +47 -11
  128. package/dist/resources/da-dk/ui.js.map +1 -1
  129. package/dist/resources/de-de/automations.d.ts +417 -0
  130. package/dist/resources/de-de/automations.d.ts.map +1 -0
  131. package/dist/resources/de-de/automations.js +417 -0
  132. package/dist/resources/de-de/automations.js.map +1 -0
  133. package/dist/resources/de-de/common.d.ts +23 -91
  134. package/dist/resources/de-de/common.d.ts.map +1 -1
  135. package/dist/resources/de-de/common.js +25 -93
  136. package/dist/resources/de-de/common.js.map +1 -1
  137. package/dist/resources/de-de/dataio.d.ts +260 -0
  138. package/dist/resources/de-de/dataio.d.ts.map +1 -0
  139. package/dist/resources/de-de/dataio.js +260 -0
  140. package/dist/resources/de-de/dataio.js.map +1 -0
  141. package/dist/resources/de-de/email.d.ts +824 -0
  142. package/dist/resources/de-de/email.d.ts.map +1 -0
  143. package/dist/resources/de-de/email.js +824 -0
  144. package/dist/resources/de-de/email.js.map +1 -0
  145. package/dist/resources/de-de/files.d.ts +112 -0
  146. package/dist/resources/de-de/files.d.ts.map +1 -0
  147. package/dist/resources/de-de/files.js +112 -0
  148. package/dist/resources/de-de/files.js.map +1 -0
  149. package/dist/resources/de-de/invoices.d.ts +717 -0
  150. package/dist/resources/de-de/invoices.d.ts.map +1 -0
  151. package/dist/resources/de-de/invoices.js +717 -0
  152. package/dist/resources/de-de/invoices.js.map +1 -0
  153. package/dist/resources/de-de/onboarding.d.ts +190 -0
  154. package/dist/resources/de-de/onboarding.d.ts.map +1 -0
  155. package/dist/resources/de-de/onboarding.js +190 -0
  156. package/dist/resources/de-de/onboarding.js.map +1 -0
  157. package/dist/resources/de-de/reportBuilder.d.ts +415 -0
  158. package/dist/resources/de-de/reportBuilder.d.ts.map +1 -0
  159. package/dist/resources/de-de/reportBuilder.js +415 -0
  160. package/dist/resources/de-de/reportBuilder.js.map +1 -0
  161. package/dist/resources/de-de/studio.d.ts +1759 -1116
  162. package/dist/resources/de-de/studio.d.ts.map +1 -1
  163. package/dist/resources/de-de/studio.js +1770 -1127
  164. package/dist/resources/de-de/studio.js.map +1 -1
  165. package/dist/resources/de-de/ui.d.ts +45 -9
  166. package/dist/resources/de-de/ui.d.ts.map +1 -1
  167. package/dist/resources/de-de/ui.js +47 -11
  168. package/dist/resources/de-de/ui.js.map +1 -1
  169. package/dist/resources/en-us/automations.d.ts +417 -0
  170. package/dist/resources/en-us/automations.d.ts.map +1 -0
  171. package/dist/resources/en-us/automations.js +417 -0
  172. package/dist/resources/en-us/automations.js.map +1 -0
  173. package/dist/resources/en-us/common.d.ts +23 -91
  174. package/dist/resources/en-us/common.d.ts.map +1 -1
  175. package/dist/resources/en-us/common.js +25 -93
  176. package/dist/resources/en-us/common.js.map +1 -1
  177. package/dist/resources/en-us/dataio.d.ts +260 -0
  178. package/dist/resources/en-us/dataio.d.ts.map +1 -0
  179. package/dist/resources/en-us/dataio.js +260 -0
  180. package/dist/resources/en-us/dataio.js.map +1 -0
  181. package/dist/resources/en-us/email.d.ts +824 -0
  182. package/dist/resources/en-us/email.d.ts.map +1 -0
  183. package/dist/resources/en-us/email.js +824 -0
  184. package/dist/resources/en-us/email.js.map +1 -0
  185. package/dist/resources/en-us/files.d.ts +112 -0
  186. package/dist/resources/en-us/files.d.ts.map +1 -0
  187. package/dist/resources/en-us/files.js +112 -0
  188. package/dist/resources/en-us/files.js.map +1 -0
  189. package/dist/resources/en-us/invoices.d.ts +717 -0
  190. package/dist/resources/en-us/invoices.d.ts.map +1 -0
  191. package/dist/resources/en-us/invoices.js +717 -0
  192. package/dist/resources/en-us/invoices.js.map +1 -0
  193. package/dist/resources/en-us/onboarding.d.ts +190 -0
  194. package/dist/resources/en-us/onboarding.d.ts.map +1 -0
  195. package/dist/resources/en-us/onboarding.js +190 -0
  196. package/dist/resources/en-us/onboarding.js.map +1 -0
  197. package/dist/resources/en-us/reportBuilder.d.ts +415 -0
  198. package/dist/resources/en-us/reportBuilder.d.ts.map +1 -0
  199. package/dist/resources/en-us/reportBuilder.js +415 -0
  200. package/dist/resources/en-us/reportBuilder.js.map +1 -0
  201. package/dist/resources/en-us/studio.d.ts +1742 -1099
  202. package/dist/resources/en-us/studio.d.ts.map +1 -1
  203. package/dist/resources/en-us/studio.js +1769 -1126
  204. package/dist/resources/en-us/studio.js.map +1 -1
  205. package/dist/resources/en-us/ui.d.ts +37 -1
  206. package/dist/resources/en-us/ui.d.ts.map +1 -1
  207. package/dist/resources/en-us/ui.js +39 -3
  208. package/dist/resources/en-us/ui.js.map +1 -1
  209. package/dist/resources/fr-fr/automations.d.ts +417 -0
  210. package/dist/resources/fr-fr/automations.d.ts.map +1 -0
  211. package/dist/resources/fr-fr/automations.js +417 -0
  212. package/dist/resources/fr-fr/automations.js.map +1 -0
  213. package/dist/resources/fr-fr/common.d.ts +23 -91
  214. package/dist/resources/fr-fr/common.d.ts.map +1 -1
  215. package/dist/resources/fr-fr/common.js +25 -93
  216. package/dist/resources/fr-fr/common.js.map +1 -1
  217. package/dist/resources/fr-fr/dataio.d.ts +260 -0
  218. package/dist/resources/fr-fr/dataio.d.ts.map +1 -0
  219. package/dist/resources/fr-fr/dataio.js +260 -0
  220. package/dist/resources/fr-fr/dataio.js.map +1 -0
  221. package/dist/resources/fr-fr/email.d.ts +824 -0
  222. package/dist/resources/fr-fr/email.d.ts.map +1 -0
  223. package/dist/resources/fr-fr/email.js +824 -0
  224. package/dist/resources/fr-fr/email.js.map +1 -0
  225. package/dist/resources/fr-fr/files.d.ts +112 -0
  226. package/dist/resources/fr-fr/files.d.ts.map +1 -0
  227. package/dist/resources/fr-fr/files.js +112 -0
  228. package/dist/resources/fr-fr/files.js.map +1 -0
  229. package/dist/resources/fr-fr/invoices.d.ts +717 -0
  230. package/dist/resources/fr-fr/invoices.d.ts.map +1 -0
  231. package/dist/resources/fr-fr/invoices.js +717 -0
  232. package/dist/resources/fr-fr/invoices.js.map +1 -0
  233. package/dist/resources/fr-fr/onboarding.d.ts +190 -0
  234. package/dist/resources/fr-fr/onboarding.d.ts.map +1 -0
  235. package/dist/resources/fr-fr/onboarding.js +190 -0
  236. package/dist/resources/fr-fr/onboarding.js.map +1 -0
  237. package/dist/resources/fr-fr/reportBuilder.d.ts +415 -0
  238. package/dist/resources/fr-fr/reportBuilder.d.ts.map +1 -0
  239. package/dist/resources/fr-fr/reportBuilder.js +415 -0
  240. package/dist/resources/fr-fr/reportBuilder.js.map +1 -0
  241. package/dist/resources/fr-fr/studio.d.ts +1759 -1116
  242. package/dist/resources/fr-fr/studio.d.ts.map +1 -1
  243. package/dist/resources/fr-fr/studio.js +1774 -1131
  244. package/dist/resources/fr-fr/studio.js.map +1 -1
  245. package/dist/resources/fr-fr/ui.d.ts +44 -8
  246. package/dist/resources/fr-fr/ui.d.ts.map +1 -1
  247. package/dist/resources/fr-fr/ui.js +46 -10
  248. package/dist/resources/fr-fr/ui.js.map +1 -1
  249. package/dist/resources/index.d.ts.map +1 -1
  250. package/dist/resources/index.js +14 -0
  251. package/dist/resources/index.js.map +1 -1
  252. package/dist/resources/lazy.d.ts.map +1 -1
  253. package/dist/resources/lazy.js +57 -1
  254. package/dist/resources/lazy.js.map +1 -1
  255. package/dist/resources/namespaces.d.ts +62 -3
  256. package/dist/resources/namespaces.d.ts.map +1 -1
  257. package/dist/resources/namespaces.js +84 -3
  258. package/dist/resources/namespaces.js.map +1 -1
  259. package/dist/resources/zh-cn/automations.d.ts +417 -0
  260. package/dist/resources/zh-cn/automations.d.ts.map +1 -0
  261. package/dist/resources/zh-cn/automations.js +417 -0
  262. package/dist/resources/zh-cn/automations.js.map +1 -0
  263. package/dist/resources/zh-cn/common.d.ts +23 -91
  264. package/dist/resources/zh-cn/common.d.ts.map +1 -1
  265. package/dist/resources/zh-cn/common.js +25 -93
  266. package/dist/resources/zh-cn/common.js.map +1 -1
  267. package/dist/resources/zh-cn/dataio.d.ts +260 -0
  268. package/dist/resources/zh-cn/dataio.d.ts.map +1 -0
  269. package/dist/resources/zh-cn/dataio.js +260 -0
  270. package/dist/resources/zh-cn/dataio.js.map +1 -0
  271. package/dist/resources/zh-cn/email.d.ts +824 -0
  272. package/dist/resources/zh-cn/email.d.ts.map +1 -0
  273. package/dist/resources/zh-cn/email.js +824 -0
  274. package/dist/resources/zh-cn/email.js.map +1 -0
  275. package/dist/resources/zh-cn/files.d.ts +112 -0
  276. package/dist/resources/zh-cn/files.d.ts.map +1 -0
  277. package/dist/resources/zh-cn/files.js +112 -0
  278. package/dist/resources/zh-cn/files.js.map +1 -0
  279. package/dist/resources/zh-cn/invoices.d.ts +717 -0
  280. package/dist/resources/zh-cn/invoices.d.ts.map +1 -0
  281. package/dist/resources/zh-cn/invoices.js +717 -0
  282. package/dist/resources/zh-cn/invoices.js.map +1 -0
  283. package/dist/resources/zh-cn/onboarding.d.ts +190 -0
  284. package/dist/resources/zh-cn/onboarding.d.ts.map +1 -0
  285. package/dist/resources/zh-cn/onboarding.js +190 -0
  286. package/dist/resources/zh-cn/onboarding.js.map +1 -0
  287. package/dist/resources/zh-cn/reportBuilder.d.ts +415 -0
  288. package/dist/resources/zh-cn/reportBuilder.d.ts.map +1 -0
  289. package/dist/resources/zh-cn/reportBuilder.js +415 -0
  290. package/dist/resources/zh-cn/reportBuilder.js.map +1 -0
  291. package/dist/resources/zh-cn/studio.d.ts +1758 -1115
  292. package/dist/resources/zh-cn/studio.d.ts.map +1 -1
  293. package/dist/resources/zh-cn/studio.js +1764 -1121
  294. package/dist/resources/zh-cn/studio.js.map +1 -1
  295. package/dist/resources/zh-cn/ui.d.ts +45 -9
  296. package/dist/resources/zh-cn/ui.d.ts.map +1 -1
  297. package/dist/resources/zh-cn/ui.js +47 -11
  298. package/dist/resources/zh-cn/ui.js.map +1 -1
  299. package/dist/resources/zh-tw/automations.d.ts +417 -0
  300. package/dist/resources/zh-tw/automations.d.ts.map +1 -0
  301. package/dist/resources/zh-tw/automations.js +417 -0
  302. package/dist/resources/zh-tw/automations.js.map +1 -0
  303. package/dist/resources/zh-tw/common.d.ts +23 -91
  304. package/dist/resources/zh-tw/common.d.ts.map +1 -1
  305. package/dist/resources/zh-tw/common.js +25 -93
  306. package/dist/resources/zh-tw/common.js.map +1 -1
  307. package/dist/resources/zh-tw/dataio.d.ts +260 -0
  308. package/dist/resources/zh-tw/dataio.d.ts.map +1 -0
  309. package/dist/resources/zh-tw/dataio.js +260 -0
  310. package/dist/resources/zh-tw/dataio.js.map +1 -0
  311. package/dist/resources/zh-tw/email.d.ts +824 -0
  312. package/dist/resources/zh-tw/email.d.ts.map +1 -0
  313. package/dist/resources/zh-tw/email.js +824 -0
  314. package/dist/resources/zh-tw/email.js.map +1 -0
  315. package/dist/resources/zh-tw/files.d.ts +112 -0
  316. package/dist/resources/zh-tw/files.d.ts.map +1 -0
  317. package/dist/resources/zh-tw/files.js +112 -0
  318. package/dist/resources/zh-tw/files.js.map +1 -0
  319. package/dist/resources/zh-tw/invoices.d.ts +717 -0
  320. package/dist/resources/zh-tw/invoices.d.ts.map +1 -0
  321. package/dist/resources/zh-tw/invoices.js +717 -0
  322. package/dist/resources/zh-tw/invoices.js.map +1 -0
  323. package/dist/resources/zh-tw/onboarding.d.ts +190 -0
  324. package/dist/resources/zh-tw/onboarding.d.ts.map +1 -0
  325. package/dist/resources/zh-tw/onboarding.js +190 -0
  326. package/dist/resources/zh-tw/onboarding.js.map +1 -0
  327. package/dist/resources/zh-tw/reportBuilder.d.ts +415 -0
  328. package/dist/resources/zh-tw/reportBuilder.d.ts.map +1 -0
  329. package/dist/resources/zh-tw/reportBuilder.js +415 -0
  330. package/dist/resources/zh-tw/reportBuilder.js.map +1 -0
  331. package/dist/resources/zh-tw/studio.d.ts +1759 -1116
  332. package/dist/resources/zh-tw/studio.d.ts.map +1 -1
  333. package/dist/resources/zh-tw/studio.js +1773 -1130
  334. package/dist/resources/zh-tw/studio.js.map +1 -1
  335. package/dist/resources/zh-tw/ui.d.ts +45 -9
  336. package/dist/resources/zh-tw/ui.d.ts.map +1 -1
  337. package/dist/resources/zh-tw/ui.js +47 -11
  338. package/dist/resources/zh-tw/ui.js.map +1 -1
  339. package/dist/review-status.js +7 -7
  340. package/dist/server.d.ts.map +1 -1
  341. package/dist/server.js +14 -1
  342. package/dist/server.js.map +1 -1
  343. package/locales/ar-EG/.meta.json +15999 -5979
  344. package/locales/ar-EG/automations.json +406 -0
  345. package/locales/ar-EG/common.json +25 -93
  346. package/locales/ar-EG/dataio.json +249 -0
  347. package/locales/ar-EG/email.json +813 -0
  348. package/locales/ar-EG/files.json +101 -0
  349. package/locales/ar-EG/invoices.json +706 -0
  350. package/locales/ar-EG/onboarding.json +179 -0
  351. package/locales/ar-EG/reportBuilder.json +404 -0
  352. package/locales/ar-EG/studio.json +1782 -1139
  353. package/locales/ar-EG/ui.json +47 -11
  354. package/locales/cs-CZ/.meta.json +16271 -6251
  355. package/locales/cs-CZ/automations.json +406 -0
  356. package/locales/cs-CZ/common.json +25 -93
  357. package/locales/cs-CZ/dataio.json +249 -0
  358. package/locales/cs-CZ/email.json +813 -0
  359. package/locales/cs-CZ/files.json +101 -0
  360. package/locales/cs-CZ/invoices.json +706 -0
  361. package/locales/cs-CZ/onboarding.json +179 -0
  362. package/locales/cs-CZ/reportBuilder.json +404 -0
  363. package/locales/cs-CZ/studio.json +1774 -1131
  364. package/locales/cs-CZ/ui.json +47 -11
  365. package/locales/da-DK/.meta.json +16245 -6225
  366. package/locales/da-DK/automations.json +406 -0
  367. package/locales/da-DK/common.json +25 -93
  368. package/locales/da-DK/dataio.json +249 -0
  369. package/locales/da-DK/email.json +813 -0
  370. package/locales/da-DK/files.json +101 -0
  371. package/locales/da-DK/invoices.json +706 -0
  372. package/locales/da-DK/onboarding.json +179 -0
  373. package/locales/da-DK/reportBuilder.json +404 -0
  374. package/locales/da-DK/studio.json +1771 -1128
  375. package/locales/da-DK/ui.json +47 -11
  376. package/locales/de-DE/.meta.json +16094 -6074
  377. package/locales/de-DE/automations.json +406 -0
  378. package/locales/de-DE/common.json +25 -93
  379. package/locales/de-DE/dataio.json +249 -0
  380. package/locales/de-DE/email.json +813 -0
  381. package/locales/de-DE/files.json +101 -0
  382. package/locales/de-DE/invoices.json +706 -0
  383. package/locales/de-DE/onboarding.json +179 -0
  384. package/locales/de-DE/reportBuilder.json +404 -0
  385. package/locales/de-DE/studio.json +1770 -1127
  386. package/locales/de-DE/ui.json +47 -11
  387. package/locales/en-US/automations.json +406 -0
  388. package/locales/en-US/common.json +25 -93
  389. package/locales/en-US/dataio.json +249 -0
  390. package/locales/en-US/email.json +813 -0
  391. package/locales/en-US/files.json +101 -0
  392. package/locales/en-US/invoices.json +706 -0
  393. package/locales/en-US/onboarding.json +179 -0
  394. package/locales/en-US/reportBuilder.json +404 -0
  395. package/locales/en-US/studio.json +1769 -1126
  396. package/locales/en-US/ui.json +39 -3
  397. package/locales/fr-FR/.meta.json +14117 -4097
  398. package/locales/fr-FR/automations.json +406 -0
  399. package/locales/fr-FR/common.json +25 -93
  400. package/locales/fr-FR/dataio.json +249 -0
  401. package/locales/fr-FR/email.json +813 -0
  402. package/locales/fr-FR/files.json +101 -0
  403. package/locales/fr-FR/invoices.json +706 -0
  404. package/locales/fr-FR/onboarding.json +179 -0
  405. package/locales/fr-FR/reportBuilder.json +404 -0
  406. package/locales/fr-FR/studio.json +1774 -1131
  407. package/locales/fr-FR/ui.json +46 -10
  408. package/locales/zh-CN/.meta.json +16223 -6203
  409. package/locales/zh-CN/automations.json +406 -0
  410. package/locales/zh-CN/common.json +25 -93
  411. package/locales/zh-CN/dataio.json +249 -0
  412. package/locales/zh-CN/email.json +813 -0
  413. package/locales/zh-CN/files.json +101 -0
  414. package/locales/zh-CN/invoices.json +706 -0
  415. package/locales/zh-CN/onboarding.json +179 -0
  416. package/locales/zh-CN/reportBuilder.json +404 -0
  417. package/locales/zh-CN/studio.json +1764 -1121
  418. package/locales/zh-CN/ui.json +47 -11
  419. package/locales/zh-TW/.meta.json +15999 -5979
  420. package/locales/zh-TW/automations.json +406 -0
  421. package/locales/zh-TW/common.json +25 -93
  422. package/locales/zh-TW/dataio.json +249 -0
  423. package/locales/zh-TW/email.json +813 -0
  424. package/locales/zh-TW/files.json +101 -0
  425. package/locales/zh-TW/invoices.json +706 -0
  426. package/locales/zh-TW/onboarding.json +179 -0
  427. package/locales/zh-TW/reportBuilder.json +404 -0
  428. package/locales/zh-TW/studio.json +1773 -1130
  429. package/locales/zh-TW/ui.json +47 -11
  430. package/package.json +1 -1
@@ -9,659 +9,835 @@
9
9
  * scripts/gen-resources.mjs.
10
10
  */
11
11
  export default {
12
- "title": "Studio",
13
- "settings": {
14
- "title": "Paramètres",
15
- "workspaceSection": "Espace de travail",
16
- "globalDefaultsNav": "Valeurs par défaut globales"
17
- },
18
- "source": {
19
- "engine": {
20
- "label": "Moteur de base de données",
21
- "postgres": "PostgreSQL",
22
- "mysql": "MySQL / MariaDB",
23
- "sqlite": "SQLite"
12
+ "addOns": {
13
+ "browse": {
14
+ "all": "Tout",
15
+ "bundled": "Inclus",
16
+ "categories": "Catégories",
17
+ "discard": "Supprimer",
18
+ "download": "Télécharger",
19
+ "emptyBody": "Cette version n’en contient aucun et le catalogue en ligne est désactivé.",
20
+ "emptyOnlineBody": "Le catalogue en ligne est activé, mais la dernière vérification n’a rien trouvé. Cherchez des nouveautés.",
21
+ "emptyTitle": "Aucun module disponible",
22
+ "install": "Installer",
23
+ "noMatchBody": "Aucun module ne correspond à cette recherche et à cette catégorie.",
24
+ "noMatchTitle": "Aucun résultat",
25
+ "offline": "Affiche les modules livrés avec cette version. La navigation en ligne est désactivée et rien ici n’a contacté Internet.",
26
+ "online": "Inclut les modules du catalogue en ligne. Rechercher des versions plus récentes est une action distincte.",
27
+ "refresh": "Rechercher des nouveautés",
28
+ "search": "Rechercher des modules",
29
+ "title": "Disponibles",
30
+ "toggle": "Parcourir le catalogue en ligne",
31
+ "upgrade": "v{version} disponible",
32
+ "upgradeAction": "Mettre à jour"
24
33
  },
25
- "format": {
26
- "label": "Format du schéma",
27
- "helper": "Laissez la détection automatique, sauf si elle se trompe.",
28
- "auto": "Détection automatique",
29
- "sql": "DDL SQL / pg_dump",
30
- "prisma": "Schéma Prisma",
31
- "drizzle": "Drizzle ORM",
32
- "typeorm": "Entités TypeORM",
33
- "sequelize": "Modèles Sequelize",
34
- "rails": "schema.rb Rails",
35
- "django": "models.py Django",
36
- "json": "JSON Adminium"
34
+ "card": {
35
+ "needsApiKey": "Nécessite une clé API",
36
+ "needsOauth": "Se connecte via OAuth"
37
37
  },
38
- "sqlite": {
39
- "file": "Chemin du fichier de base de données",
40
- "helper": "SQLite est un fichier, pas un serveur — indiquez le chemin absolu sur la machine qui exécute Adminium."
38
+ "category": {
39
+ "artwork": "Création",
40
+ "data": "Données",
41
+ "delivery": "Expédition",
42
+ "email": "E-mail",
43
+ "payments": "Paiements"
41
44
  },
42
- "file": {
43
- "detectedAs": "Détecté : {format}",
44
- "moreWarnings": "+{count} avertissements supplémentaires — la liste complète apparaît à l’étape d’analyse.",
45
- "dropTitle": "Déposez votre fichier de schéma ici, ou parcourez",
46
- "dropHint": "SQL DDL / pg_dump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, modèles Django, Adminium JSON",
47
- "pitch": "Aucune connexion à la base requise — nous analysons votre fichier de schéma et construisons les mêmes tableaux de bord.",
48
- "parsing": "Lecture du fichier de schéma téléversé…",
49
- "tables": "tables",
50
- "columns": "colonnes",
51
- "warnings": "avertissements",
52
- "errorTitle": "Impossible danalyser le fichier",
53
- "parseFailed": "Nous n’avons pas pu analyser ce fichier. Si la détection automatique s’est trompée, choisissez le format explicitement et réessayez.",
54
- "unsupported": "Format non reconnu — SQL DDL, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, modèles Django et Adminium JSON sont pris en charge. Choisissez-en un explicitement et réessayez.",
55
- "requestFailed": "Échec du téléversement — vérifiez votre connexion et réessayez."
45
+ "confirm": {
46
+ "cancel": "Annuler",
47
+ "close": "Fermer",
48
+ "discard": "Supprimer",
49
+ "discardBody": "Les fichiers téléchargés sont supprimés. Rien n’a été installé, donc rien d’autre ne change — vous pouvez le retélécharger quand vous voulez.",
50
+ "discardTitle": "Supprimer ce téléchargement",
51
+ "disconnect": "Déconnecter",
52
+ "disconnectBody": "Ses clés sont supprimées et il cesse ses appels. Chaque table et chaque ligne qu’il a créées restent telles quelles, et vous pouvez le reconnecter à tout moment.",
53
+ "disconnectTitle": "Déconnecter ce module",
54
+ "uninstall": "Désinstaller",
55
+ "uninstallBody": "Ses clés sont supprimées et ses fichiers retirés de ce serveur. Chaque table et chaque ligne quil a créées restent telles quelles. Vous pourrez le réinstaller plus tard.",
56
+ "uninstallTitle": "Désinstaller ce module"
56
57
  },
57
- "title": "Connectez votre base de données",
58
- "subtitle": "Pointez Adminium vers une base de données et nous générerons un tableau de bord d’administration à partir de son schéma.",
59
- "name": "Nom de la connexion",
60
- "namePlaceholder": "Postgres de production",
61
- "modeLabel": "Mode de saisie de la source",
62
- "mode": {
63
- "dsn": "Chaîne de connexion",
64
- "fields": "Champs individuels",
65
- "file": "Fichier de schéma"
58
+ "connect": {
59
+ "apiKey": "Clé API",
60
+ "submit": "Connecter"
66
61
  },
67
- "dsn": {
68
- "label": "Chaîne de connexion",
69
- "helper": "postgres://utilisateur:motdepasse@hote:5432/base — mysql:// et sqlite: fonctionnent aussi.",
70
- "incomplete": "Ajoutez l’hôte et la base, p. ex. postgres://user@host:5432/db",
71
- "invalidScheme": "Schéma non reconnu — attendu : postgres://, mysql://, mariadb:// ou sqlite:",
72
- "quickFill": "Remplissage rapide :"
62
+ "consent": {
63
+ "cancel": "Annuler",
64
+ "close": "Fermer",
65
+ "confirm": "Installer",
66
+ "hosts": "Attacher à",
67
+ "loading": "Analyse de ce que cela ferait…",
68
+ "subtitle": "Ce que ce module fera, avant qu’il puisse le faire.",
69
+ "title": "Installer {name}"
73
70
  },
74
- "fields": {
75
- "host": "Hôte",
76
- "port": "Port",
77
- "database": "Base de données",
78
- "user": "Utilisateur",
79
- "password": "Mot de passe",
80
- "ssl": "Mode SSL",
81
- "preview": "Aperçu de la chaîne de connexion :"
71
+ "error": "Une erreur est survenue",
72
+ "installed": {
73
+ "connected": "Connecté",
74
+ "disconnect": "Déconnecter",
75
+ "egress": "Peut contacter : {hosts}",
76
+ "emptyBody": "Installez un module ci-dessus et il apparaîtra ici avec ses hôtes et sa connexion.",
77
+ "emptyTitle": "Rien d’installé pour l’instant",
78
+ "notConnected": "Non connecté",
79
+ "off": "désactivé",
80
+ "on": "activé",
81
+ "title": "Installés",
82
+ "uninstall": "Désinstaller"
82
83
  },
83
- "readOnlyRole": {
84
- "title": "Utilisez un rôle en lecture seule",
85
- "body": "Adminium n’écrit jamais dans votre base la configuration n’utilise que les métadonnées du schéma. Nous recommandons un utilisateur dédié avec des droits SELECT uniquement ; vous choisirez où Adminium range ses propres tables à l’étape du stockage méta."
84
+ "job": {
85
+ "body": "Récupération et vérification. Rien n’est installé sans votre accord.",
86
+ "failed": "Le téléchargement ne s’est pas terminé. Rien n’a été installé.",
87
+ "title": "Téléchargement"
88
+ },
89
+ "plan": {
90
+ "blocked": "Impossible d’installer ici",
91
+ "needsColumns": "Ce module a besoin de colonnes que vous n’avez pas",
92
+ "needsColumnsBody": "Adminium n’ajoute pas de colonnes aux tables qui vous appartiennent déjà. Ajoutez-les vous-même, puis installez.",
93
+ "noData": "Ce module ne lit ni n’écrit de tables qui lui soient propres.",
94
+ "reuse": "Ce module utilisera des tables que vous avez déjà :",
95
+ "willCreate": "Cela créera des tables dans votre base de données",
96
+ "willCreateBody": "L’installation crée ces tables. Une désinstallation ultérieure les laisse intactes, ainsi que leurs données."
97
+ },
98
+ "settings": {
99
+ "badJson": "Ce n’est pas du JSON valide ; rien n’a été enregistré.",
100
+ "save": "Enregistrer les réglages",
101
+ "title": "Réglages"
102
+ },
103
+ "sideload": {
104
+ "file": "Fichier du paquet (.tgz)",
105
+ "hint": "Pour un serveur sans internet. Vérifié exactement comme un téléchargement, il lui faut donc l’empreinte fournie.",
106
+ "key": "Clé du module",
107
+ "sha": "Intégrité (sha512-…)",
108
+ "shaHint": "La valeur `integrity` affichée par `npm pack --json`. Refusé si les octets n’y correspondent pas.",
109
+ "submit": "Téléverser",
110
+ "title": "Téléverser un paquet",
111
+ "version": "Version"
112
+ },
113
+ "subtitle": "Des capacités supplémentaires pour vos applications — expédition, graphisme, données. Chacune indique ce dont elle a besoin avant l’installation.",
114
+ "title": "Modules",
115
+ "upgradeNote": "La mise à jour conserve les hôtes auxquels un module est attaché ainsi que sa connexion existante.",
116
+ "veto": {
117
+ "body": "Le réglage est enregistré, mais les fonctions réseau sont coupées sur ce serveur et cela prime. Les modules déjà téléchargés fonctionnent, et vous pouvez en téléverser un.",
118
+ "title": "Ce déploiement ne peut pas consulter le catalogue en ligne"
86
119
  }
87
120
  },
88
121
  "capability": {
122
+ "importNoLiveHealth": "Pas de connexion à une base de données réelle — les contrôles de santé et la détection de dérive du schéma sont indisponibles pour cette source.",
123
+ "importNoRowCounts": "Les fichiers de schéma ne contiennent pas de nombres de lignes — la liste des tables affiche — plutôt que des chiffres inventés.",
89
124
  "mysqlApproxRows": "Les nombres de lignes MySQL sont des estimations du moteur de stockage (dérive possible jusqu’à ±40 %) — affichés avec ≈.",
90
125
  "mysqlFkEnum": "Les métadonnées FK/enum de MySQL sont plus limitées : les tables MyISAM ne déclarent pas de clés étrangères, les enums sont des types enum(…) par colonne et les contraintes CHECK requièrent MySQL 8.0.16+ / MariaDB 10.2+.",
91
- "sqliteCheckEnums": "SQLite n’a pas de type enum natif les enums sont synthétisés à partir des contraintes CHECK (col IN (…)).",
92
- "sqliteNoComments": "SQLite n’a pas de commentaires de colonne — utilisez l’éditeur de remappage du schéma pour ajouter des libellés.",
93
- "importNoRowCounts": "Les fichiers de schéma ne contiennent pas de nombres de lignes — la liste des tables affiche — plutôt que des chiffres inventés.",
94
- "importNoLiveHealth": "Pas de connexion à une base de données réelle — les contrôles de santé et la détection de dérive du schéma sont indisponibles pour cette source.",
95
- "rowsUnavailable": "Les fichiers de schéma n’ont pas de base de données réelle — les nombres de lignes restent inconnus tant que vous n’en connectez pas une.",
96
- "rowsRunAnalyze": "Pas encore d’estimation — exécutez ANALYZE sur la base pour obtenir les nombres de lignes.",
126
+ "rowsApproximate": "Estimation du moteur de stockagedérive possible jusqu’à ±40 % avec InnoDB.",
97
127
  "rowsNoEstimate": "Le moteur n’a communiqué aucune estimation pour cette table.",
98
- "rowsApproximate": "Estimation du moteur de stockage dérive possible jusqu’à ±40 % avec InnoDB."
99
- },
100
- "test": {
101
- "log": {
102
- "moreWarnings": "+{count} avertissements du parseur supplémentaires",
103
- "connecting": "Établissement d’une connexion sécurisée…",
104
- "connected": "Connecté ({latency} ms) · introspection en lecture seule",
105
- "connectFailed": "Échec de la connexion.",
106
- "readingSchema": "Lecture du schéma : public",
107
- "readingFile": "Lecture du fichier de schéma téléversé…",
108
- "parsingFile": "Analyse de {file}…",
109
- "detected": "{tables} tables · {columns} colonnes détectées",
110
- "found": "{tables} tables · {columns} colonnes trouvées",
111
- "mapping": "Correspondance des types de colonnes → widgets de saisie",
112
- "relations": "Détection des relations…",
113
- "piiScan": "Recherche de colonnes PII…",
114
- "piiDone": "Analyse PII terminée — {count} colonnes masquées par défaut",
115
- "piiDoneUnknown": "Analyse PII terminée",
116
- "jobFailed": "Échec de l’introspection.",
117
- "networkFailed": "Échec de la requête — vérifiez votre connexion et réessayez.",
118
- "ready": "Prêt"
119
- },
120
- "title": "Analyse de votre schéma",
121
- "subtitle": "Introspection des tables, colonnes et relations. Cela prend quelques secondes.",
122
- "trust": "Nous ne faisons que lire votre schéma et vos données. Rien n’est modifié.",
123
- "errorTitle": "Échec de la connexion",
124
- "retry": "Réessayer",
125
- "logLabel": "Journal d’introspection",
126
- "hint": {
127
- "auth": "Échec de l’authentification — vérifiez le nom d’utilisateur et le mot de passe dans votre DSN.",
128
- "hostUnreachable": "Hôte injoignable — vérifiez le nom d’hôte et le port, et que la base accepte les connexions depuis cette machine (ajoutez nos IP à la liste d’autorisation).",
129
- "metaPlacement": "Cette source ne peut pas héberger les tables méta d’Adminium — continuez avec une base méta séparée.",
130
- "permission": "Le rôle s’est connecté mais n’a pas les droits de lecture du schéma — accordez USAGE sur le schéma à votre rôle d’introspection.",
131
- "timeout": "La base n’a pas répondu à temps — vérifiez le chemin réseau et la charge, puis réessayez.",
132
- "tls": "Échec de la négociation TLS — essayez sslmode=require, ou téléversez le certificat CA attendu par votre serveur.",
133
- "unknown": "Échec de la connexion — vérifiez la DSN et réessayez."
134
- }
135
- },
136
- "tables": {
137
- "importNoCounts": "Les fichiers de schéma ne contiennent pas de nombres de lignes — la colonne affiche — tant qu’aucune base réelle n’est connectée.",
138
- "title": "Choisissez vos tables",
139
- "subtitle": "Choisissez lesquelles inclure. Vous pourrez en changer à tout moment.",
140
- "search": "Filtrer les tables…",
141
- "listLabel": "Tables incluables",
142
- "emptyFilter": "Aucune table ne correspond à votre filtre.",
143
- "pii": "PII",
144
- "highVolume": "gros volume",
145
- "highVolumeNote": "Les tables de plus de 100 000 lignes démarrent décochées — les tables techniques ont rarement leur place dans un tableau de bord.",
146
- "joinHidden": "{count} tables de jointure/système sont masquées d’avance — elles alimentent toujours les relations plusieurs-à-plusieurs."
128
+ "rowsRunAnalyze": "Pas encore d’estimation exécutez ANALYZE sur la base pour obtenir les nombres de lignes.",
129
+ "rowsUnavailable": "Les fichiers de schéma n’ont pas de base de données réelle — les nombres de lignes restent inconnus tant que vous n’en connectez pas une.",
130
+ "sqliteCheckEnums": "SQLite n’a pas de type enum natif — les enums sont synthétisés à partir des contraintes CHECK (col IN (…)).",
131
+ "sqliteNoComments": "SQLite n’a pas de commentaires de colonne — utilisez l’éditeur de remappage du schéma pour ajouter des libellés."
147
132
  },
148
- "hub": {
149
- "title": "Connexions de données",
150
- "subtitle": "{healthy, number} sur {total, plural, one {# connexion} other {# connexions}} en bonne santé",
151
- "connectNew": "Nouvelle connexion",
152
- "stats": {
153
- "connections": "Connexions",
154
- "healthy": "En bonne santé",
155
- "tables": "Tables incluses",
156
- "pages": "Pages générées"
157
- },
158
- "status": {
159
- "connected": "Connectée",
160
- "error": "Erreur",
161
- "unconfigured": "Brouillon",
162
- "testing": "Test en cours…",
163
- "paused": "En pause"
164
- },
165
- "card": {
166
- "readOnly": "Lecture seule",
167
- "tables": "Tables",
168
- "pages": "Pages",
169
- "latency": "Latence",
170
- "latencyMs": "{latency, number} ms",
171
- "lastIntrospected": "Dernière introspection",
172
- "never": "Jamais",
173
- "timezone": "Fuseau horaire",
174
- "timezoneGuessed": "depuis ce serveur",
175
- "paused": "Adminium ne se connecte pas à cette base de données. Ses pages se chargeront de nouveau dès que vous la reprendrez.",
176
- "pausedSince": "En pause {when} — Adminium ne se connecte pas à cette base de données. Ses pages se chargeront de nouveau dès que vous la reprendrez."
177
- },
178
- "action": {
179
- "test": "Tester",
180
- "reintrospect": "Réintrospecter",
181
- "reintrospectFile": "Les sources de type fichier de schéma n’ont pas de base de données active — téléversez à nouveau le fichier.",
182
- "remap": "Remapper le schéma",
183
- "delete": "Supprimer",
184
- "regional": "Paramètres régionaux",
185
- "pause": "Mettre en pause",
186
- "resume": "Reprendre",
187
- "pausedHint": "Cette connexion est en pause — reprenez-la pour atteindre la base de données.",
188
- "rename": "Renommer"
189
- },
190
- "regional": {
191
- "title": "Paramètres régionaux",
192
- "intro": "Ils décrivent l'entreprise à laquelle appartient cette base de données, et non la personne qui la consulte. Les applications servies par Adminium les lisent ici.",
193
- "timezone": "Fuseau horaire",
194
- "timezoneHelper": "Les dates et heures s'affichent dans ce fuseau. Sans fuseau, les applications hébergées par Adminium basculent en UTC et l'indiquent à l'écran.",
195
- "guessedTitle": "Ce fuseau vient du serveur",
196
- "guessedBody": "Adminium l'a repris de la machine sur laquelle il tourne ; personne ne l'a choisi ici. Enregistrez pour le confirmer, ou choisissez le fuseau dans lequel cette entreprise travaille réellement.",
197
- "timezonePlaceholder": "Région/Ville",
198
- "currency": "Devise",
199
- "currencyHelper": "Sert à formater les montants. Facultatif : ne pas la définir n'affecte que le formatage.",
200
- "currencyPlaceholder": "Code ISO-4217",
201
- "notSet": "Non défini",
202
- "noMatch": "Aucun fuseau correspondant",
203
- "noMatchCurrency": "Aucune devise correspondante",
204
- "save": "Enregistrer",
205
- "failed": "Impossible d'enregistrer les paramètres régionaux",
206
- "saved": "Paramètres régionaux mis à jour"
207
- },
208
- "test": {
209
- "ok": "Connexion en bonne santé · {latency, number} ms",
210
- "failed": "Échec du test de connexion"
133
+ "design": {
134
+ "adopt": {
135
+ "action": "Ajouter à mon application",
136
+ "done": "{created} pages créées, {updated} mises à jour, {unchanged} déjà à jour.",
137
+ "everything": "Cette connexion affiche déjà toutes les tables ; rien n’a eu besoin d’être inclus.",
138
+ "forbidden": "Votre rôle peut modifier le schéma mais pas générer des pages. Demandez à un administrateur disposant de la gestion des connexions d’ajouter ces tables à l’application.",
139
+ "grants": "Aucun rôle ne reçoit l’accès automatiquement — accordez-le dans Paramètres → Rôles.",
140
+ "offer": "Une nouvelle table ne sert à rien tant qu'elle n'a pas de page. Ajouter {tables} à votre application ?",
141
+ "skippedEdited": "Laissées intactes parce que vous les avez modifiées : {pages}."
142
+ },
143
+ "apply": "Appliquer",
144
+ "ceiling": {
145
+ "authorise": "Autoriser cette réécriture",
146
+ "body": "{table} contient plus de {rows} lignes — au-delà de la taille qu’Adminium réécrit de lui-même. Seul un Super Admin peut l’autoriser, et la table restera verrouillée pendant toute la réécriture.",
147
+ "hint": "Saisissez le nom de la table exactement tel qu’il apparaît ci-dessus.",
148
+ "notYours": "{table} contient plus de {rows} lignes. Seul un Super Admin peut autoriser une réécriture de cette taille — demandez-en un, ou effectuez la modification pendant une fenêtre de maintenance avec vos propres outils.",
149
+ "prompt": "Saisissez à nouveau {table} pour autoriser la réécriture"
211
150
  },
212
- "introspect": {
213
- "noChanges": "Schéma inchangé aucun nouvel instantané.",
214
- "updated": "Schéma réintrospecté",
215
- "masksProposed": "{count, plural, one {# colonne proposée} other {# colonnes proposées}} au masquage — à vérifier dans l’éditeur de remappage.",
216
- "failed": "Échec de l’introspection. Réessayez."
151
+ "column": {
152
+ "help": "Que signifient ces réglages ?",
153
+ "key": "Clé",
154
+ "length": "Longueur",
155
+ "link": "Lié à",
156
+ "linkHelp": "Reliez ceci à une ligne d’une autre table.",
157
+ "linkTypeNote": "Le type correspond à la clé de la table liée.",
158
+ "name": "Nom",
159
+ "namePlaceholder": "client_id",
160
+ "noLink": "Rien",
161
+ "onDelete": "Si la ligne liée est supprimée",
162
+ "precision": "Précision",
163
+ "primaryKey": "Clé primaire",
164
+ "remove": "Supprimer {name}",
165
+ "required": "Obligatoire",
166
+ "type": "Type",
167
+ "unique": "Unique"
217
168
  },
218
- "delete": {
219
- "title": "Supprimer la connexion",
220
- "body": "Cette action supprime « {name} » et les pages générées. Votre base de données n’est jamais touchée.",
221
- "prompt": "Saisissez {name} pour confirmer",
222
- "confirm": "Supprimer la connexion",
169
+ "confirm": {
170
+ "body": "Cette modification supprime des données ou un objet. Adminium ne peut pas l'annuler.",
223
171
  "cancel": "Annuler",
224
172
  "close": "Fermer",
225
- "success": "Connexion « {name} » supprimée",
226
- "failed": "Impossible de supprimer la connexion. Réessayez."
173
+ "confirm": "Appliquer les modifications",
174
+ "prompt": "Saisissez {word} pour confirmer",
175
+ "title": "Appliquer une modification destructrice"
227
176
  },
177
+ "designer": "Concepteur de tables",
178
+ "discard": "Abandonner les modifications",
179
+ "dropping": "Marquée pour suppression",
228
180
  "empty": {
229
- "title": "Aucune source de données",
230
- "body": "Connectez une base de données : Adminium génère votre panneau d’administration à partir de son schéma.",
231
- "cta": "Connecter une base de données"
181
+ "body": "Créez une table ou choisissez-en une à modifier. Rien n'atteint votre base de données avant que vous n'examiniez les instructions et ne les appliquiez.",
182
+ "title": "Concevez votre schéma"
183
+ },
184
+ "error": {
185
+ "atColumn": "Colonne {n}, {field}",
186
+ "atTable": "Table {field}",
187
+ "empty": "Un nom est requis.",
188
+ "identifier": "Utilisez des minuscules, des chiffres et des tirets bas, en commençant par une lettre.",
189
+ "tooLong": "Trop long — {dialect} autorise {max} caractères."
190
+ },
191
+ "existing": "Tables existantes",
192
+ "hazard": {
193
+ "irreversible": "Irréversible",
194
+ "locking": "Pose un verrou",
195
+ "lossy": "Supprime des données",
196
+ "refused": "Refusé",
197
+ "rewrite": "Réécrit la table",
198
+ "safe": "Sûr"
199
+ },
200
+ "help": {
201
+ "close": "Fermer",
202
+ "link": {
203
+ "example": "Une réservation est liée à un client. Adminium affiche alors le client sur la réservation, et les réservations sur le client.",
204
+ "term": "Lien vers une autre table",
205
+ "what": "Relie cette ligne à une ligne d’une autre table, et demande à la base de données de veiller à ce que ce lien reste valide — vous ne pouvez pas pointer vers quelque chose qui n’existe pas."
206
+ },
207
+ "primaryKey": {
208
+ "example": "Sans clé primaire, Adminium peut lister les lignes, mais il ne peut ni en modifier ni en supprimer une en particulier.",
209
+ "term": "Clé primaire",
210
+ "what": "Le champ qui identifie chaque ligne — celui qu’Adminium utilise pour distinguer une ligne d’une autre. Chaque table devrait en avoir exactement un, et c’est presque toujours le champ « id » créé pour vous."
211
+ },
212
+ "required": {
213
+ "example": "Une commande a besoin d’un client, donc ce champ est obligatoire. Une note de livraison est facultative, donc elle ne l’est pas.",
214
+ "term": "Obligatoire",
215
+ "what": "Le champ doit être rempli. Une ligne ne peut pas être enregistrée tant qu’il est vide."
216
+ },
217
+ "subtitle": "Des descriptions en langage simple de chaque paramètre, et de ce qu’il change pour les personnes qui utilisent votre application.",
218
+ "title": "Ce que signifient ces champs",
219
+ "type": {
220
+ "example": "Un numéro de téléphone est généralement du texte, pas un nombre — les nombres perdent les zéros du début.",
221
+ "term": "Type",
222
+ "what": "Le genre d’information que contient le champ — des mots, des nombres entiers, de l’argent, une date, une réponse oui/non. Choisir le bon type est ce qui permet à Adminium d’afficher un sélecteur de date plutôt qu’une zone de texte, et d’additionner une colonne de montants."
223
+ },
224
+ "unique": {
225
+ "example": "Deux clients ne devraient pas partager la même adresse e-mail — marquez ce champ comme unique et ils ne le pourront plus.",
226
+ "term": "Unique",
227
+ "what": "Deux lignes ne peuvent pas contenir la même valeur. La base de données refuse la seconde."
228
+ }
232
229
  },
233
- "hostedApps": "Apps hébergées",
234
- "subtitlePaused": "{healthy, number} sur {total, plural, one {# connexion} other {# connexions}} en bonne santé · {paused, number} en pause",
235
- "pause": {
236
- "title": "Mettre cette connexion en pause ?",
237
- "body": "Adminium n’ouvre plus aucune connexion vers « {name} ». Ses {pages, plural, one {# page} other {# pages}}, ses rapports planifiés et ses applications hébergées cessent de charger des données jusqu’à ce que vous la repreniez.",
238
- "keeps": "Rien n’est supprimé — la connexion, son schéma et ses {pages, plural, one {# page} other {# pages}} sont conservés, et un clic les ramène.",
239
- "confirm": "Mettre la connexion en pause",
240
- "pausedToast": "Connexion « {name} » mise en pause",
241
- "resumedToast": "Connexion « {name} » reprise",
242
- "pauseFailed": "Impossible de mettre la connexion en pause. Réessayez.",
243
- "resumeFailed": "Impossible de reprendre la connexion. Réessayez."
230
+ "keepTable": "Conserver {table}",
231
+ "newTable": "Nouvelle table",
232
+ "onDelete": {
233
+ "cascade": "Supprimer aussi cette ligne",
234
+ "restrict": "Empêcher la suppression",
235
+ "setNull": "Laisser ce champ vide"
244
236
  },
245
- "rename": {
246
- "title": "Renommer la connexion",
247
- "label": "Nom",
248
- "helper": "Le nom de cette base partout dans Adminium la carte, le groupe de la barre latérale au-dessus de ses pages, et chaque sélecteur qui la propose. La base elle-même n'est pas renommée.",
249
- "save": "Renommer",
250
- "saved": "Connexion renommée",
251
- "failed": "La connexion n'a pas pu être renommée"
252
- }
253
- },
254
- "settingsHub": {
255
- "title": "Paramètres de l’espace de travail",
256
- "subtitle": "Identité, sécurité et actions destructrices pour cet espace de travail.",
257
- "save": "Enregistrer les modifications",
258
- "saved": "Paramètres de l’espace de travail mis à jour",
259
- "saveFailed": "Impossible d’enregistrer les paramètres de l’espace de travail. Réessayez.",
260
- "superAdminOnlyTitle": "Super administrateur requis",
261
- "superAdminOnly": "Seul un super administrateur peut modifier l’identité et les paramètres de sécurité de l’espace de travail.",
262
- "identity": {
263
- "heading": "Identité de l’espace de travail",
264
- "appName": {
265
- "label": "Nom de l’application",
266
- "helper": "Affiché dans la barre latérale, le titre du navigateur et les e-mails.",
267
- "error": "Saisissez un nom de 60 caractères maximum."
268
- },
269
- "logo": {
270
- "label": "Logo",
271
- "drop": "Déposez une image ici",
272
- "helper": "PNG, JPEG, WebP, GIF ou SVG, jusqu’à 1 Mo. Remplace la marque intégrée partout.",
273
- "upload": "Importer un logo",
274
- "replace": "Remplacer le logo",
275
- "remove": "Supprimer",
276
- "uploaded": "Logo mis à jour",
277
- "removed": "Logo supprimé",
278
- "tooLarge": "Cette image dépasse 1 Mo.",
279
- "badType": "Choisissez une image PNG, JPEG, WebP, GIF ou SVG.",
280
- "undo": "Annuler"
281
- },
282
- "showVersion": {
283
- "label": "Version dans la barre latérale",
284
- "helper": "Le numéro de build à côté du logo. Désactivé, il masque votre version."
285
- }
286
- },
287
- "security": {
288
- "heading": "Sécurité",
289
- "require2fa": {
290
- "label": "Exiger l’authentification à deux facteurs",
291
- "desc": "Chaque membre doit activer la 2FA pour se connecter.",
292
- "note": "Indicatif, pas bloquant : les membres sans 2FA sont dirigés vers sa configuration et ne peuvent plus la désactiver, mais leur connexion n’est jamais bloquée, et les clés API ne sont pas concernées."
293
- },
294
- "allowSignup": {
295
- "label": "Autoriser l’auto-inscription",
296
- "desc": "N’importe qui peut créer un compte — désactivé, l’espace de travail reste sur invitation uniquement."
297
- },
298
- "sessionTtl": {
299
- "label": "Durée de session (heures)",
300
- "error": "Entre {min, number} et {max, number} heures."
301
- },
302
- "passwordMin": {
303
- "label": "Longueur minimale du mot de passe",
304
- "error": "Entre {min, number} et {max, number} caractères."
305
- }
306
- },
307
- "email": {
308
- "heading": "E-mail (SMTP)",
309
- "unconfigured": "Aucun serveur de messagerie n’est configuré, donc Adminium ne peut envoyer ni réinitialisation de mot de passe, ni invitation, ni rapport planifié.",
310
- "host": {
311
- "label": "Hôte SMTP",
312
- "error": "Un nom d’hôte ou une adresse IP uniquement — sans schéma, port ni identifiants."
313
- },
314
- "port": {
315
- "label": "Port",
316
- "error": "Entre {min, number} et {max, number}."
317
- },
318
- "user": {
319
- "label": "Nom d’utilisateur",
320
- "helper": "Laissez vide si le relais ne demande pas d’authentification."
321
- },
322
- "pass": {
323
- "label": "Mot de passe",
324
- "helper": "Chiffré au stockage et jamais réaffiché. Laissez vide pour conserver l’actuel.",
325
- "error": "Ce nom d’utilisateur exige un mot de passe."
326
- },
327
- "from": {
328
- "label": "Adresse d’expéditeur",
329
- "helper": "Une adresse seule, ou un nom d’affichage devant.",
330
- "error": "Saisissez une adresse e-mail."
331
- },
332
- "secure": {
333
- "label": "TLS implicite",
334
- "helper": "Activé pour le port 465. Désactivé démarre en clair puis passe à STARTTLS, ce qu’attend le port 587."
335
- },
336
- "remove": "Supprimer le serveur de messagerie",
337
- "review": {
338
- "removed": "Supprimé",
339
- "password": "Remplacé"
340
- }
237
+ "plan": "Examiner les modifications",
238
+ "result": {
239
+ "applied": "Appliqué. Adminium a relu votre schéma.",
240
+ "failed": "Rien n'a été appliquévotre base de données est inchangée. {error}",
241
+ "partial": "Partiellement appliqué : {done} étapes sur {total} ont été exécutées. Réappliquer les mêmes modifications les termine.",
242
+ "repaired": "Le renommage a été répercuté sur {pages, plural, one {# page} other {# pages}}, {grants, plural, one {# autorisation de rôle} other {# autorisations de rôle}} et {overrides, plural, one {# substitution de schéma} other {# substitutions de schéma}}."
341
243
  },
342
244
  "review": {
343
- "title": "Enregistrer les paramètres de l’espace de travail",
344
- "subtitle": "Vérifiez vos modifications avant denregistrer.",
345
- "confirm": "Enregistrer les modifications",
346
- "cancel": "Annuler",
347
- "close": "Fermer",
348
- "on": "Activé",
349
- "off": "Désactivé",
350
- "shown": "Affiché",
351
- "hidden": "Masqué",
352
- "change": "{before} → {after}"
353
- },
354
- "defaultsCard": {
355
- "heading": "Valeurs par défaut d’apparence et de langue",
356
- "body": "Le thème, la couleur d’accent, la densité et la langue de tout l’espace de travail se trouvent dans les valeurs par défaut globales.",
357
- "cta": "Ouvrir les valeurs par défaut globales"
358
- },
359
- "danger": {
360
- "heading": "Zone de danger",
361
- "subtitle": "Actions irréversibles.",
362
- "empty": "Rien à supprimer — aucune connexion pour l’instant.",
363
- "deleteDesc": "Supprime la connexion et les pages générées. Votre base de données n’est pas touchée. Irréversible.",
364
- "deleteCta": "Supprimer la connexion"
365
- },
366
- "aiCard": {
367
- "heading": "Enrichissement par IA",
368
- "body": "Configurez un fournisseur IA (ou l’aller-retour copier-coller) pour enrichir libellés, groupes et relations.",
369
- "cta": "Ouvrir les réglages IA"
370
- },
371
- "pagesCard": {
372
- "heading": "Pages",
373
- "body": "Ajoutez, modifiez et supprimez des pages, changez leur contenu et réordonnez la barre latérale.",
374
- "cta": "Gérer les pages"
245
+ "noChanges": "Aucune modification de schéma pour l’instant.",
246
+ "pending": "Examinez vos modifications pour voir les instructions exactes quAdminium exécutera.",
247
+ "steps": "Étapes prévues",
248
+ "superAdmin": "Super administrateur",
249
+ "unfinished": "Une application précédente sur cette connexion n’a jamais signalé de résultat. Son schéma est peut-être à mi-chemin entre deux formes — consultez l’historique des modifications avant d’en appliquer d’autres."
375
250
  },
376
- "translationsCard": {
377
- "heading": "Langues et traductions",
378
- "body": "Reformulez n’importe quel texte d’Adminium, choisissez les langues proposées et ajoutez les vôtres.",
379
- "cta": "Ouvrir les traductions"
380
- }
251
+ "reviewPane": "Examen",
252
+ "table": {
253
+ "addColumn": "Ajouter une colonne",
254
+ "columns": "Colonnes",
255
+ "drop": "Supprimer cette table",
256
+ "dropHelp": "La table et toutes ses lignes sont détruites. Vous verrez exactement ce qui sera cassé avant toute exécution.",
257
+ "name": "Nom de la table",
258
+ "nameHelp": "Lettres minuscules, chiffres et tirets bas.",
259
+ "namePlaceholder": "reservations",
260
+ "noKey": "Cette table n’a pas de clé primaire ; Adminium la traitera comme étant en lecture seule — les lignes peuvent être listées mais pas modifiées.",
261
+ "renameHelp": "La modifier renomme la table dans votre base de données.",
262
+ "uuidKeyUnavailable": "Sur ce moteur, une clé doit être un entier généré : un uuid généré par la base ne peut pas être relu après une insertion."
263
+ },
264
+ "unnamed": "Nommez chaque table et chaque colonne pour examiner les modifications.",
265
+ "unrepresentableDefaults": "Ces colonnes conservent une valeur par défaut générée par la base qu’Adminium ne peut pas modifier ici ; elle est laissée telle quelle : {columns}"
381
266
  },
382
- "settingsAi": {
383
- "title": "Enrichissement par IA",
384
- "subtitle": "Connectez un modèle pour qu’Adminium suggère des libellés, des groupes, des relations et plus encore — toujours revus sous forme de diff avant toute application.",
385
- "saved": "Fournisseur IA enregistré",
386
- "saveFailed": "Impossible d’enregistrer le fournisseur IA. Réessayez.",
387
- "save": "Enregistrer le fournisseur",
388
- "test": "Tester la connexion",
389
- "testHintDirty": "Enregistrez vos modifications avant de tester.",
390
- "testing": "Test du fournisseur en cours…",
391
- "testError": "Échec du test",
392
- "testErrorBody": "Impossible de joindre le fournisseur. Vérifiez la clé et l’URL de base.",
393
- "testOk": "Connecté à {model} en {latency} ms",
394
- "testUnknownModel": "le fournisseur",
395
- "provider": {
396
- "heading": "Fournisseur IA",
397
- "subtitle": "Choisissez comment Adminium atteint un modèle pour enrichir votre schéma. Les clés sont stockées chiffrées et ne sont jamais réaffichées.",
398
- "active": "Actif",
399
- "anthropic": {
400
- "label": "Anthropic",
401
- "desc": "Modèles Claude via l’API Anthropic."
402
- },
403
- "openai": {
404
- "label": "OpenAI",
405
- "desc": "Modèles GPT via l’API OpenAI."
406
- },
407
- "openaiCompatible": {
408
- "label": "Compatible OpenAI",
409
- "desc": "Tout point de terminaison au format OpenAI — Groq, Together, vLLM, LM Studio."
410
- },
411
- "ollama": {
412
- "label": "Ollama (local)",
413
- "desc": "Modèles exécutés localement via Ollama sans clé, sans cloud."
414
- },
415
- "requiresNetwork": "Nécessite Internet et une clé API",
416
- "networkDisabledTitle": "Les fournisseurs IA directs sont désactivés sur cette installation",
417
- "networkDisabledBody": "Cet Adminium est configuré sans accès Internet sortant : il ne peut joindre aucune API de fournisseur. Utilisez l'aller-retour copier-coller ci-dessous — ni clé ni réseau requis."
418
- },
419
- "configure": {
420
- "heading": "Configurer {provider}"
421
- },
422
- "field": {
423
- "baseUrl": "URL de base",
424
- "baseUrlOptional": "Laissez tel quel, sauf si Ollama tourne sur un autre hôte.",
425
- "baseUrlHelper": "La racine du point de terminaison qui sert /chat/completions.",
426
- "model": "Modèle",
427
- "modelFreeText": "Saisissez l’identifiant exact du modèle servi par votre point de terminaison.",
428
- "modelLive": "Chargé en direct depuis le fournisseur.",
429
- "modelStatic": "Une liste éprouvée ; saisissez un identifiant personnalisé après l’enregistrement pour l’actualiser.",
430
- "modelLoading": "Chargement…",
431
- "modelPlaceholder": "Sélectionner un modèle…",
432
- "key": "Clé API",
433
- "keyStored": "Stockée chiffrée. Remplacez-la pour utiliser une autre clé.",
434
- "keyMask": "sk-…{last4}",
435
- "keyReplace": "Remplacer la clé",
436
- "keyOptional": "Facultatif — certains points de terminaison n’exigent aucune clé.",
437
- "keyWriteOnly": "En écriture seule : une fois enregistrée, elle n’est jamais réaffichée.",
438
- "noKeyTitle": "Aucune clé API requise",
439
- "noKeyBody": "Ollama tourne localement, donc rien ne quitte cette machine."
440
- },
441
- "runStatus": {
442
- "draft": "Brouillon",
443
- "running": "En cours",
444
- "awaitingResponse": "En attente de réponse",
445
- "validated": "Validé",
446
- "applied": "Appliqué",
447
- "partiallyApplied": "Partiellement appliqué",
448
- "failed": "Échoué",
449
- "discarded": "Abandonné"
450
- },
451
- "byo": {
452
- "heading": "Pas de clé ? Utilisez votre propre outil IA",
453
- "subtitle": "L’aller-retour copier-collerrien ne quitte cette machine.",
454
- "body": "Studio peut générer un prompt autonome à partir de votre schéma. Exécutez-le dans Claude Code, ChatGPT ou l’outil de votre choix, puis collez le JSON renvoyé dans l’assistant de connexion. Même validation, même revue, même résultat que la voie directe.",
455
- "guaranteeTitle": "Garantie sans télémétrie",
456
- "guarantee1": "Le prompt ne contient que votre schéma et des statistiques agrégées — jamais de données de lignes par défaut.",
457
- "guarantee2": "Aucun identifiant, URL d’instance ni justificatif n’y est intégré.",
458
- "guarantee3": "Les exécutions BYO ne font aucun appel réseau.",
459
- "promptVersion": "Prompt {version}",
460
- "schemaVersion": "Schéma {version}",
461
- "headingRecommended": "Utilisez votre propre outil IA — aucune clé requise",
462
- "recommended": "Recommandé"
267
+ "diagram": {
268
+ "ceiling": "Affichage des {shown} tables les plus connectées. {omitted} autres sont masquées — recherchez-en une pour l’ajouter.",
269
+ "legend": {
270
+ "declared": "Clé étrangère",
271
+ "inferred": "Déduit",
272
+ "virtual": "Ajouté dans Adminium"
273
+ },
274
+ "legendLabel": "Légende",
275
+ "node": {
276
+ "foreignKey": "Clé étrangère",
277
+ "more": "+{count} de plus",
278
+ "primaryKey": "Clé primaire"
279
+ },
280
+ "outline": {
281
+ "intro": "{tables} tables et {relations} relations, sous forme de liste.",
282
+ "more": " et {count} de plus",
283
+ "referencedBy": "Référencé par : {list}",
284
+ "references": "Références : {list}"
285
+ },
286
+ "saveLayout": "Enregistrer la disposition",
287
+ "search": "Rechercher une table ou une colonne",
288
+ "showDiagram": "Afficher le diagramme",
289
+ "showList": "Afficher en liste"
290
+ },
291
+ "documents": {
292
+ "cancel": "Annuler",
293
+ "connectionLabel": "Connexion",
294
+ "delete": "Supprimer",
295
+ "delivery": {
296
+ "email": "Envoyer à",
297
+ "noEmail": "À personne — garder sur la fiche",
298
+ "noEmailSlot": "Ce type de document n'a pas de champ d'adresse : il ne peut pas être envoyé.",
299
+ "noSmtp": "Aucun serveur e-mail n'est configuré pour cet Adminium, rien ne peut donc être envoyé. Configurez-en un dans Studio → Paramètres → E-mail.",
300
+ "stored": "Conservé sur la fiche, toujours."
301
+ },
302
+ "disabled": "désactivée",
303
+ "edit": "Modifier",
304
+ "empty": "Aucune correspondance pour l’instant.",
305
+ "grants": {
306
+ "refused": "Cette correspondance lit {tables}, que vous n’avez pas le droit de lire. Les documents qui en viennent échoueront pour vous.",
307
+ "title": "Vous n’avez pas accès à tout cela"
308
+ },
309
+ "intro": "Une correspondance indique quelles colonnes de quelle table font une sorte de document, ce qui le déclenche et il va.",
310
+ "name": "Nommer cette correspondance",
311
+ "newFrom": "Nouvelle correspondance pour :",
312
+ "noProvider": "Aucun add-on installé ne peut encore établir de documents. Installez-en un depuis Add-ons et les correspondances possibles apparaîtront ici.",
313
+ "pickTable": "Choisir une table…",
314
+ "prefix": "Préfixe de numéro",
315
+ "render": {
316
+ "failedRow": "Rien n'a été dessiné : {reason}",
317
+ "intro": "Dessinez-en un maintenant, à partir d'une ligne de votre choix. Rien n'est envoyé nulle part — il reste sur la fiche comme les autres.",
318
+ "noRows": "Aucune ligne à dessiner pour l'instant.",
319
+ "open": "Ouvrir",
320
+ "pending": "Dessin en cours…",
321
+ "pick": "Dessiner celle-ci",
322
+ "ready": "Dessiné.",
323
+ "saveFirst": "Enregistrez d'abord la correspondance. Un document se dessine à partir d'une correspondance enregistrée : vous verrez ce qu'elle donne avant tout le monde.",
324
+ "search": "Rechercher des lignes",
325
+ "slow": "Aucun document n'est encore apparu. Il attend peut-être son tour, ou cette installation n'exécute aucune tâche de fond — rien ne sera dessiné tant qu'elle ne le fait pas.",
326
+ "slowTitle": "Toujours rien"
327
+ },
328
+ "save": "Enregistrer la correspondance",
329
+ "slot": {
330
+ "byDefault": "Rempli par Adminium",
331
+ "lineColumnOf": "{column} de chaque ligne",
332
+ "lineColumns": "Ce qui remplit chaque colonne d'une ligne",
333
+ "looksLikeLines": "ressemble à des lignes",
334
+ "noChildren": "Rien dans votre base ne pointe vers cette table : il n'y a donc aucune ligne à dessiner. Un document a besoin d'une table enfant avec une clé étrangère vers celle-ci.",
335
+ "noLines": "Aucune ligne",
336
+ "pii": "données masquées",
337
+ "typed": "Une valeur que je saisis",
338
+ "typedHint": "Saisie ici, non lue dans vos données chaque document de cette correspondance reçoit la même valeur.",
339
+ "typedValue": "Valeur pour {slot}",
340
+ "unmapped": "Non rempli"
463
341
  },
464
- "history": {
465
- "heading": "Historique des exécutions",
466
- "subtitle": "Exécutions d’enrichissement passées. Ouvrez-en une pour revoir ses suggestions.",
467
- "tableLabel": "Exécutions d’enrichissement",
468
- "colDate": "Date",
469
- "colSource": "Source",
470
- "colStatus": "Statut",
471
- "colChunks": "Blocs",
472
- "openReview": "Ouvrir la revue de l’exécution du {date}",
473
- "connection": "Connexion",
474
- "empty": "Aucune exécution d’enrichissement pour l’instant. Enrichissez un schéma depuis l’assistant de connexion pour voir l’historique ici.",
475
- "errorTitle": "Impossible de charger les exécutions",
476
- "errorBody": "Rechargez la page pour réessayer.",
477
- "noConnections": "Connectez d’abord une base de données — les exécutions d’enrichissement sont enregistrées par connexion.",
478
- "byo": "BYO",
479
- "directPath": "Directe"
480
- }
342
+ "step": {
343
+ "delivery": " il va",
344
+ "kind": "Sorte",
345
+ "mapping": "Ce qui remplit chaque champ",
346
+ "mappingHelp": "Chaque champ lit une colonne, ou prend une valeur que vous saisissez ici.",
347
+ "render": "Essayer sur une ligne",
348
+ "table": "Connexion et table",
349
+ "trigger": "Ce qui le déclenche"
350
+ },
351
+ "tableLabel": "Table",
352
+ "title": "Correspondances de documents",
353
+ "trigger": {
354
+ "created": "Quand une ligne est ajoutée",
355
+ "manual": "Uniquement à la demande",
356
+ "manualShort": "à la demande",
357
+ "note": "Les lignes venues d’un import ou écrites directement dans la base ne déclenchent rien — seules les écritures passant par Adminium le font.",
358
+ "noteTitle": "Ce qui compte comme changement",
359
+ "updated": "Quand une ligne change"
360
+ },
361
+ "unbound": "Reste à remplir : {slots}"
481
362
  },
482
363
  "enrich": {
483
- "title": "Enrichir avec l’IA",
484
- "subtitle": "Affinez éventuellement les libellés, groupes, énumérations et tableaux de bord générés à l’aide d’un LLM. La base heuristique fonctionne sans cela — ceci ajoute seulement des suggestions que vous vérifiez avant toute application.",
485
- "intentLabel": "Comment souhaitez-vous enrichir ?",
486
- "sectionsLegend": "Que doit décider l’IA ?",
487
- "localesLegend": "Traduire les libellés en",
488
- "localeLocked": "(requis)",
489
- "samplingTitle": "Inclure des valeurs d’exemple",
490
- "samplingHint": "Inclut jusqu’à 20 valeurs réelles par colonne non-PII dans l’invite.",
491
- "samplingPreviewTitle": "Ce qui quitte cette machine",
492
- "samplingPreviewBody": "Jusqu’à 20 valeurs les plus fréquentes par colonne non-PII, plus min/max pour les colonnes numériques et de date. Les colonnes marquées PII ne sont jamais échantillonnées. Tout le reste demeure purement agrégé. Vérifiez l’invite exacte avant de copier (BYO) — rien n’est envoyé sans votre action.",
493
- "noSections": "Sélectionnez au moins un groupe de décisions à enrichir.",
494
- "generatePrompt": "Générer l’invite",
495
- "startProvider": "Démarrer l’enrichissement",
496
- "startOver": "Recommencer",
497
- "copied": "Copié",
498
- "createFailed": "Impossible de construire l’invite d’enrichissement — réessayez.",
499
- "createFailedTitle": "Impossible de démarrer",
500
- "providerFallback": "votre fournisseur d’IA",
501
- "fileTitle": "L’enrichissement par IA nécessite une base de données active",
502
- "fileBody": "Les sources de type fichier de schéma n’ont pas encore d’instantané à enrichir. Connectez une base de données active pour utiliser l’enrichissement par IA, ou continuez — la base heuristique génère tout de même une application complète.",
503
- "section": {
504
- "labels": "Libellés et descriptions",
505
- "groups": "Groupes de navigation",
506
- "enums": "Sémantique des énumérations",
507
- "relations": "Relations",
508
- "keys": "Colonnes clés",
509
- "templates": "Modèles de page",
510
- "widgets": "Widgets de tableau de bord",
511
- "pii": "PII et masquage",
512
- "icons": "Icônes",
513
- "microcopy": "Microcopie"
514
- },
515
- "provider": {
516
- "title": "Utiliser mon fournisseur d’IA",
517
- "description": "Lancez l’enrichissement maintenant avec votre fournisseur configuré. Vous vérifiez chaque suggestion sous forme de diff.",
518
- "unconfigured": "Aucun fournisseur d’IA n’est encore configuré — copiez une invite dans votre propre outil ci-dessous, ou configurez d’abord un fournisseur.",
519
- "settingsHint": "Vous voulez le lancer directement ?",
520
- "settingsLink": "Configurer un fournisseur dans Paramètres → IA",
521
- "networkDisabled": "Cet Adminium n'a pas d'accès Internet sortant : il ne peut joindre aucune API de fournisseur. Utilisez plutôt l'aller-retour copier-coller — même invite, même revue."
522
- },
523
364
  "byo": {
524
- "cardTitle": "Copier une invite vers mon propre outil d’IA",
525
365
  "cardDescription": "Copiez une invite autonome dans Claude Code, ChatGPT, n’importe quoi — puis recollez le JSON. Aucune clé nécessaire, rien ne quitte cette machine automatiquement.",
526
- "guidance": "Exécutez ceci dans n’importe quel outil d’IA — Claude Code, ChatGPT, peu importe. Collez le JSON renvoyé ci-dessous.",
527
- "promptLabel": "Invite d’enrichissement",
528
- "promptLabelN": "Invite d’enrichissement {index} sur {total}",
529
- "tokenChip": "≈ {tokens} jetons",
530
- "copyPrompt": "Copier l’invite",
531
- "copyPromptDone": "Invite copiée",
532
- "download": "Télécharger .md",
533
- "chunkTabs": "Segments d’invite",
366
+ "cardTitle": "Copier une invite vers mon propre outil d’IA",
367
+ "cardTitleRecommended": "Copier une invite vers mon propre outil IA — recommandé",
534
368
  "chunkTab": "Invite {index}",
369
+ "chunkTabs": "Segments d’invite",
535
370
  "chunkValid": "Segment {index} validé",
536
- "pasteLabel": "Collez la réponse JSON",
537
- "pastePlaceholder": "Collez la réponse JSON ici…",
538
- "validate": "Valider",
539
- "valid": "Réponse validée",
540
- "mergedTitle": "Les {count} segments sont validés et fusionnés",
541
- "mergedTitleSingle": "Réponse validée",
542
- "mergedBody": "Les suggestions sont prêtes à être vérifiées par rapport à la base heuristique.",
543
- "errorsTitle": "La validation a trouvé {count} problèmes",
371
+ "continueReview": "Continuer vers la vérification",
544
372
  "copyErrors": "Copier les erreurs pour votre outil d’IA",
545
373
  "copyErrorsDone": "Erreurs copiées",
546
374
  "copyErrorsHint": "Recollez ceci dans votre outil d’IA pour obtenir une réponse corrigée.",
375
+ "copyPrompt": "Copier l’invite",
376
+ "copyPromptDone": "Invite copiée",
377
+ "download": "Télécharger .md",
547
378
  "droppedItems": "{count} suggestions ont été écartées lors de la validation — la vérification montre le reste.",
548
- "pendingTitle": "Validez chaque invite pour continuer",
379
+ "errorsTitle": "La validation a trouvé {count} problèmes",
380
+ "guidance": "Exécutez ceci dans n’importe quel outil d’IA — Claude Code, ChatGPT, peu importe. Collez le JSON renvoyé ci-dessous.",
381
+ "mergedBody": "Les suggestions sont prêtes à être vérifiées par rapport à la base heuristique.",
382
+ "mergedTitle": "Les {count} segments sont validés et fusionnés",
383
+ "mergedTitleSingle": "Réponse validée",
384
+ "pasteLabel": "Collez la réponse JSON",
385
+ "pastePlaceholder": "Collez la réponse JSON ici…",
549
386
  "pendingBody": "Collez la réponse JSON ci-dessus et validez-la pour passer à la vérification.",
550
387
  "pendingBodyChunked": "Chaque segment doit être validé avant la fusion des suggestions. Collez et validez chaque invite ci-dessus.",
388
+ "pendingTitle": "Validez chaque invite pour continuer",
389
+ "promptLabel": "Invite d’enrichissement",
390
+ "promptLabelN": "Invite d’enrichissement {index} sur {total}",
551
391
  "requestFailed": "Impossible de joindre le serveur pour valider — réessayez.",
552
- "continueReview": "Continuer vers la vérification",
553
- "wholeDocument": "document entier",
554
- "cardTitleRecommended": "Copier une invite vers mon propre outil IA — recommandé"
392
+ "tokenChip": " {tokens} jetons",
393
+ "valid": "Réponse validée",
394
+ "validate": "Valider",
395
+ "wholeDocument": "document entier"
555
396
  },
397
+ "copied": "Copié",
398
+ "createFailed": "Impossible de construire l’invite d’enrichissement — réessayez.",
399
+ "createFailedTitle": "Impossible de démarrer",
556
400
  "direct": {
557
- "title": "Enrichissement par IA",
558
- "subtitle": "Envoi de votre schéma à",
401
+ "back": "Retour aux options",
559
402
  "building": "Construction de l’invite…",
560
- "logLabel": "Journal d’enrichissement",
561
403
  "cancel": "Annuler",
562
- "back": "Retour aux options",
563
- "retry": "Réessayer",
564
- "done": "Enrichissement terminé — vérifiez les suggestions.",
565
404
  "continueReview": "Continuer vers la vérification",
405
+ "done": "Enrichissement terminé — vérifiez les suggestions.",
406
+ "errorTitle": "Échec de l’enrichissement",
566
407
  "failed": "L’exécution du fournisseur a échoué. Vérifiez vos paramètres d’IA et réessayez.",
567
408
  "jobFailed": "L’exécution de l’enrichissement ne s’est pas terminée.",
409
+ "logLabel": "Journal d’enrichissement",
410
+ "retry": "Réessayer",
568
411
  "startFailed": "Impossible de démarrer l’exécution — réessayez.",
569
- "errorTitle": "Échec de l’enrichissement"
412
+ "subtitle": "Envoi de votre schéma à",
413
+ "title": "Enrichissement par IA"
414
+ },
415
+ "fileBody": "Les sources de type fichier de schéma n’ont pas encore d’instantané à enrichir. Connectez une base de données active pour utiliser l’enrichissement par IA, ou continuez — la base heuristique génère tout de même une application complète.",
416
+ "fileTitle": "L’enrichissement par IA nécessite une base de données active",
417
+ "generatePrompt": "Générer l’invite",
418
+ "intentLabel": "Comment souhaitez-vous enrichir ?",
419
+ "localeLocked": "(requis)",
420
+ "localesLegend": "Traduire les libellés en",
421
+ "noSections": "Sélectionnez au moins un groupe de décisions à enrichir.",
422
+ "provider": {
423
+ "configError": "Impossible de charger les paramètres du fournisseur — configurez-en un dans Paramètres → IA, puis revenez à cette étape.",
424
+ "description": "Lancez l’enrichissement maintenant avec votre fournisseur configuré. Vous vérifiez chaque suggestion sous forme de diff.",
425
+ "networkDisabled": "Cet Adminium n'a pas d'accès Internet sortant : il ne peut joindre aucune API de fournisseur. Utilisez plutôt l'aller-retour copier-coller — même invite, même revue.",
426
+ "readyBody": "Choisissez « Utiliser mon fournisseur d’IA » ci-dessus pour lancer l’enrichissement de cette connexion maintenant.",
427
+ "readyTitle": "Fournisseur d’IA configuré",
428
+ "setUpHere": "Configurer un fournisseur ici",
429
+ "setUpHide": "Masquer la configuration du fournisseur",
430
+ "settingsHint": "Vous voulez le lancer directement ?",
431
+ "settingsLink": "Configurer un fournisseur dans Paramètres → IA",
432
+ "title": "Utiliser mon fournisseur d’IA",
433
+ "unconfigured": "Aucun fournisseur d’IA n’est encore configuré — configurez-en un ci-dessous, ou copiez une invite dans votre propre outil d’IA."
434
+ },
435
+ "providerFallback": "votre fournisseur d’IA",
436
+ "samplingHint": "Inclut jusqu’à 20 valeurs réelles par colonne non-PII dans l’invite.",
437
+ "samplingPreviewBody": "Jusqu’à 20 valeurs les plus fréquentes par colonne non-PII, plus min/max pour les colonnes numériques et de date. Les colonnes marquées PII ne sont jamais échantillonnées. Tout le reste demeure purement agrégé. Vérifiez l’invite exacte avant de copier (BYO) — rien n’est envoyé sans votre action.",
438
+ "samplingPreviewTitle": "Ce qui quitte cette machine",
439
+ "samplingTitle": "Inclure des valeurs d’exemple",
440
+ "section": {
441
+ "enums": "Sémantique des énumérations",
442
+ "groups": "Groupes de navigation",
443
+ "icons": "Icônes",
444
+ "keys": "Colonnes clés",
445
+ "labels": "Libellés et descriptions",
446
+ "microcopy": "Microcopie",
447
+ "pii": "PII et masquage",
448
+ "relations": "Relations",
449
+ "templates": "Modèles de page",
450
+ "widgets": "Widgets de tableau de bord"
570
451
  },
452
+ "sectionsLegend": "Que doit décider l’IA ?",
571
453
  "skip": {
572
- "title": "Ignorerutiliser uniquement l’heuristique",
573
- "description": "Générer à partir de la base heuristique. Vous pourrez enrichir plus tard depuis Paramètres → IA — ignorer n’est jamais pénalisé.",
454
+ "confirmBody": "L’application générée utilisera les libellés, groupes et tableaux de bord heuristiques. Continuez la génération vous pouvez lancer l’enrichissement par IA à tout moment depuis Paramètres → IA.",
574
455
  "confirmTitle": "Poursuite avec l’heuristique",
575
- "confirmBody": "L’application générée utilisera les libellés, groupes et tableaux de bord heuristiques. Continuez la génération vous pouvez lancer l’enrichissement par IA à tout moment depuis Paramètres → IA."
456
+ "description": "Générer à partir de la base heuristique. Vous pourrez enrichir plus tard depuis Paramètres IA ignorer n’est jamais pénalisé.",
457
+ "title": "Ignorer — utiliser uniquement l’heuristique"
458
+ },
459
+ "startOver": "Recommencer",
460
+ "startProvider": "Démarrer l’enrichissement",
461
+ "subtitle": "Affinez éventuellement les libellés, groupes, énumérations et tableaux de bord générés à l’aide d’un LLM. La base heuristique fonctionne sans cela — ceci ajoute seulement des suggestions que vous vérifiez avant toute application.",
462
+ "title": "Enrichir avec l’IA"
463
+ },
464
+ "generate": {
465
+ "errorTitle": "Échec de la génération",
466
+ "failed": "Échec de la génération — réessayez, ou relancez d’abord l’introspection.",
467
+ "fileBody": "Votre schéma a été analysé proprement et l’aperçu ci-dessus est réel. Générer une application fonctionnelle directement depuis un fichier de schéma (avec des lignes fictives) n’est pas encore disponible — connectez une base active pour générer dès aujourd’hui.",
468
+ "fileTitle": "Fichier de schéma analysé — la génération nécessite une base active",
469
+ "log": {
470
+ "classifying": "Classification du schéma…",
471
+ "composing": "Composition des modèles…",
472
+ "done": "{pages} pages générées dans {groups} groupes de navigation",
473
+ "writing": "Écriture des pages…"
474
+ },
475
+ "logLabel": "Journal de génération",
476
+ "openApp": "Ouvrir votre application",
477
+ "run": "Générer le tableau de bord",
478
+ "subtitle": "Une page par table incluse plus des tableaux de bord par domaine — intention :",
479
+ "successBody": "{pages} pages dans {groups} groupes de navigation — générées depuis votre schéma, modifiables dans le Studio.",
480
+ "successTitle": "Votre tableau de bord est prêt",
481
+ "title": "Générez votre application"
482
+ },
483
+ "hostedApps": {
484
+ "domains": {
485
+ "add": "Attacher un domaine",
486
+ "hostLabel": "Hôte",
487
+ "instanceLabel": "Instance",
488
+ "instanceOwn": "L'application elle-même",
489
+ "issuesTitle": "La carte des domaines a été refusée",
490
+ "none": "Aucun domaine attaché.",
491
+ "remove": "Retirer",
492
+ "save": "Enregistrer les domaines",
493
+ "savedBody": "Les attributions prennent effet en quelques secondes. Un hôte ne répond que lorsque son DNS et votre proxy atteignent réellement cette instance.",
494
+ "savedTitle": "Enregistré",
495
+ "subtitle": "Pointez le DNS d’un domaine vers votre proxy, transmettez l’en-tête Host à Adminium, puis attachez-le ici — cet hôte sert alors la surface au lieu de ce tableau de bord. Les certificats restent sur votre proxy.",
496
+ "surfaceLabel": "Surface",
497
+ "title": "Domaines"
498
+ },
499
+ "emptyBody": "Pointez ADMINIUM_SURFACES_DIR vers un répertoire de surfaces compilées — un dossier par app et par côté, chacun avec son index.html — puis redémarrez. Elles sont alors servies sous /apps/ et apparaissent ici.",
500
+ "emptyTitle": "Aucune surface d’app n’est servie",
501
+ "error": "Un problème est survenu",
502
+ "instances": {
503
+ "add": "Ajouter une instance",
504
+ "appLabel": "Application",
505
+ "body": "Servir la même application sur plusieurs bases. Chaque instance est accessible à /apps/<app>/<segment>/<side>/ et ne lit que la connexion que vous lui donnez.",
506
+ "empty": "Aucune instance supplémentaire.",
507
+ "failed": "Les instances n'ont pas été enregistrées",
508
+ "readsLabel": "Lit",
509
+ "remove": "Retirer",
510
+ "save": "Enregistrer les instances",
511
+ "slugLabel": "Segment d'URL",
512
+ "title": "Instances"
513
+ },
514
+ "subtitle": "Les surfaces d’app que cette instance sert — où chacune apparaît, et les domaines qui pointent vers elles.",
515
+ "surfaces": {
516
+ "boundKey": "Sert la clé",
517
+ "connectionLabel": "Lit",
518
+ "connectionUnset": "Celle qui est active",
519
+ "customer": "Client",
520
+ "mintLink": "En créer une sous API publique",
521
+ "noKey": "Aucune clé liée — cette surface ne peut pas lire de données tant qu’une clé n’est pas créée pour elle.",
522
+ "noNav": "Placement interne indisponible — recompilez cette surface avec le toolkit actuel pour qu’elle émette surface.json.",
523
+ "placementExternal": "Externe (URL propre uniquement)",
524
+ "placementInternal": "Dans la barre latérale (fondue)",
525
+ "placementLabel": "Placement",
526
+ "staff": "Équipe",
527
+ "subtitle": "Une surface équipe peut se fondre dans la barre latérale de ce tableau de bord ou rester autonome ; une surface client est publique et lit via sa clé liée.",
528
+ "title": "Surfaces"
529
+ },
530
+ "title": "Apps hébergées",
531
+ "install": {
532
+ "steps": {
533
+ "bundle": "Paquet",
534
+ "database": "Base de données",
535
+ "plan": "Plan de schéma",
536
+ "done": "Terminé"
537
+ },
538
+ "progress": "Progression de l’installation",
539
+ "failed": "Échec de l’installation",
540
+ "bundle": {
541
+ "title": "Téléverser le paquet de l’application",
542
+ "hint": "Le .tgz produit par `npm pack` pour une surface compilée — il contient manifest.json et un dossier staff/ ou customer/.",
543
+ "file": "Fichier du paquet (.tgz)",
544
+ "fileHint": "Rien n’est créé tant que vous n’avez pas confirmé à l’étape du plan de schéma.",
545
+ "key": "Clé de l’application",
546
+ "version": "Version",
547
+ "integrity": "Intégrité (facultatif)",
548
+ "integrityHint": "Collez la valeur sha512- de `npm pack --json` pour que le serveur vérifie ces octets exacts. Laissée vide, elle est calculée ici."
549
+ },
550
+ "database": {
551
+ "title": "Dans quelle base de données installer ?",
552
+ "hint": "Choisissez une connexion accessible en écriture. C’est là que les tables seront créées, et c’est ce que l’application lit ensuite.",
553
+ "tables": "Tables : {count}",
554
+ "readOnly": "Lecture seule",
555
+ "writable": "Accessible en écriture",
556
+ "noWritable": "Aucune connexion en écriture",
557
+ "allReadOnly": "Toutes les connexions ici utilisent un rôle en lecture seule, aucune application ne peut donc créer ses tables. Connectez-en d’abord une capable d’exécuter du DDL."
558
+ },
559
+ "plan": {
560
+ "title": "Vérifier le plan de schéma",
561
+ "hint": "Exactement ce qui sera créé dans votre base. Rien n’a encore été écrit.",
562
+ "refused": "Cette application ne peut pas être installée ici",
563
+ "create": "Créer",
564
+ "reuse": "Réutiliser l’existante",
565
+ "toggleDdl": "Afficher l’aperçu DDL",
566
+ "ddl": "Aperçu DDL",
567
+ "ddlNote": "À titre indicatif. Le serveur produit l’instruction exacte pour votre moteur, clés étrangères comprises.",
568
+ "summary": "{created} créées · {reused} réutilisées"
569
+ },
570
+ "done": {
571
+ "title": "Installée",
572
+ "body": "{key} est désormais servie. Choisissez ci-dessous où apparaît son côté personnel.",
573
+ "schema": "Tables créées : {created} · réutilisées : {reused}"
574
+ },
575
+ "cancel": "Annuler",
576
+ "back": "Retour",
577
+ "upload": "Téléverser",
578
+ "continue": "Continuer",
579
+ "confirm": "Installer",
580
+ "finish": "Gérer les applications",
581
+ "staged": "Fichiers décompressés : {files}",
582
+ "footerStep": "Étape {n} sur {total}",
583
+ "footerStepApp": "Étape {n} sur {total} · {app}",
584
+ "chosen": {
585
+ "title": "Installer {app}",
586
+ "hint": "Cette application est livrée avec votre version et se trouve déjà sur le disque. Rien n’est créé tant que vous n’avez pas confirmé le plan de schéma."
587
+ }
588
+ },
589
+ "installed": {
590
+ "title": "Applications installées",
591
+ "install": "Installer une application",
592
+ "emptyTitle": "Aucune application installée",
593
+ "emptyBody": "Téléversez un paquet de surface compilé pour en installer une. Les applications installées ici sont servies immédiatement — sans redémarrage, contrairement à un dossier.",
594
+ "uninstall": "Désinstaller",
595
+ "confirmTitle": "Désinstaller cette application ?",
596
+ "confirmBody": "Ses surfaces cessent d’être servies et le paquet est supprimé. Les tables qu’elle a créées dans votre base ne sont pas touchées.",
597
+ "confirmPrompt": "Saisissez {key} pour confirmer",
598
+ "confirmCancel": "Annuler",
599
+ "confirmClose": "Fermer",
600
+ "stagedTitle": "Téléversés mais non installés",
601
+ "stagedHint": "Écartez celui que vous avez renoncé à installer, ou téléversez à nouveau la même clé pour le remplacer.",
602
+ "discard": "Écarter",
603
+ "installedAt": "installé {when}"
604
+ },
605
+ "browse": {
606
+ "title": "Applications installables",
607
+ "subtitle": "Des applications prêtes à l’emploi livrées avec cette version. En installer une crée les tables nécessaires et sert ses écrans — rien ne se passe avant que vous confirmiez le plan.",
608
+ "search": "Rechercher des applications…",
609
+ "clear": "Effacer la recherche",
610
+ "all": "Toutes",
611
+ "by": "par {publisher}",
612
+ "install": "Installer",
613
+ "installed": "Installée",
614
+ "noMatch": "Aucune application ne correspond",
615
+ "noMatchBody": "Essayez un autre terme, ou une autre catégorie.",
616
+ "emptyTitle": "Aucune application à installer",
617
+ "emptyBody": "Les applications livrées avec cette version apparaissent ici. Faites pointer ADMINIUM_BUNDLED_APPS vers un dossier de paquets, ou téléversez-en un.",
618
+ "unreadable": "Le manifeste de ce paquet n’a pas pu être lu. Il ne peut pas être installé — écartez-le ci-dessous."
576
619
  }
577
620
  },
578
- "review": {
579
- "unavailableTitle": "Écran de revue indisponible",
580
- "unavailableBody": "Cette version n’inclut pas encore l’écran de revue d’enrichissement (06-T14). Il arrive avec le flux diff-et-application."
621
+ "hub": {
622
+ "action": {
623
+ "delete": "Supprimer",
624
+ "pause": "Mettre en pause",
625
+ "pausedHint": "Cette connexion est en pause — reprenez-la pour atteindre la base de données.",
626
+ "regional": "Paramètres régionaux",
627
+ "reintrospect": "Réintrospecter",
628
+ "reintrospectFile": "Les sources de type fichier de schéma n’ont pas de base de données active — téléversez à nouveau le fichier.",
629
+ "remap": "Remapper le schéma",
630
+ "rename": "Renommer",
631
+ "resume": "Reprendre",
632
+ "test": "Tester"
633
+ },
634
+ "card": {
635
+ "lastIntrospected": "Dernière introspection",
636
+ "latency": "Latence",
637
+ "latencyMs": "{latency, number} ms",
638
+ "never": "Jamais",
639
+ "pages": "Pages",
640
+ "paused": "Adminium ne se connecte pas à cette base de données. Ses pages se chargeront de nouveau dès que vous la reprendrez.",
641
+ "pausedSince": "En pause {when} — Adminium ne se connecte pas à cette base de données. Ses pages se chargeront de nouveau dès que vous la reprendrez.",
642
+ "readOnly": "Lecture seule",
643
+ "tables": "Tables",
644
+ "timezone": "Fuseau horaire",
645
+ "timezoneGuessed": "depuis ce serveur"
646
+ },
647
+ "connectNew": "Nouvelle connexion",
648
+ "delete": {
649
+ "body": "Cette action supprime « {name} » et les pages générées. Votre base de données n’est jamais touchée.",
650
+ "cancel": "Annuler",
651
+ "close": "Fermer",
652
+ "confirm": "Supprimer la connexion",
653
+ "failed": "Impossible de supprimer la connexion. Réessayez.",
654
+ "prompt": "Saisissez {name} pour confirmer",
655
+ "success": "Connexion « {name} » supprimée",
656
+ "title": "Supprimer la connexion"
657
+ },
658
+ "empty": {
659
+ "body": "Connectez une base de données : Adminium génère votre panneau d’administration à partir de son schéma.",
660
+ "cta": "Connecter une base de données",
661
+ "title": "Aucune source de données"
662
+ },
663
+ "hostedApps": "Apps hébergées",
664
+ "introspect": {
665
+ "failed": "Échec de l’introspection. Réessayez.",
666
+ "masksProposed": "{count, plural, one {# colonne proposée} other {# colonnes proposées}} au masquage — à vérifier dans l’éditeur de remappage.",
667
+ "noChanges": "Schéma inchangé — aucun nouvel instantané.",
668
+ "updated": "Schéma réintrospecté"
669
+ },
670
+ "pause": {
671
+ "body": "Adminium n’ouvre plus aucune connexion vers « {name} ». Ses {pages, plural, one {# page} other {# pages}}, ses rapports planifiés et ses applications hébergées cessent de charger des données jusqu’à ce que vous la repreniez.",
672
+ "confirm": "Mettre la connexion en pause",
673
+ "keeps": "Rien n’est supprimé — la connexion, son schéma et ses {pages, plural, one {# page} other {# pages}} sont conservés, et un clic les ramène.",
674
+ "pauseFailed": "Impossible de mettre la connexion en pause. Réessayez.",
675
+ "pausedToast": "Connexion « {name} » mise en pause",
676
+ "resumeFailed": "Impossible de reprendre la connexion. Réessayez.",
677
+ "resumedToast": "Connexion « {name} » reprise",
678
+ "title": "Mettre cette connexion en pause ?"
679
+ },
680
+ "regional": {
681
+ "currency": "Devise",
682
+ "currencyHelper": "Sert à formater les montants. Facultatif : ne pas la définir n'affecte que le formatage.",
683
+ "currencyPlaceholder": "Code ISO-4217",
684
+ "failed": "Impossible d'enregistrer les paramètres régionaux",
685
+ "guessedBody": "Adminium l'a repris de la machine sur laquelle il tourne ; personne ne l'a choisi ici. Enregistrez pour le confirmer, ou choisissez le fuseau dans lequel cette entreprise travaille réellement.",
686
+ "guessedTitle": "Ce fuseau vient du serveur",
687
+ "intro": "Ils décrivent l'entreprise à laquelle appartient cette base de données, et non la personne qui la consulte. Les applications servies par Adminium les lisent ici.",
688
+ "noMatch": "Aucun fuseau correspondant",
689
+ "noMatchCurrency": "Aucune devise correspondante",
690
+ "notSet": "Non défini",
691
+ "save": "Enregistrer",
692
+ "saved": "Paramètres régionaux mis à jour",
693
+ "timezone": "Fuseau horaire",
694
+ "timezoneHelper": "Les dates et heures s'affichent dans ce fuseau. Sans fuseau, les applications hébergées par Adminium basculent en UTC et l'indiquent à l'écran.",
695
+ "timezonePlaceholder": "Région/Ville",
696
+ "title": "Paramètres régionaux"
697
+ },
698
+ "rename": {
699
+ "failed": "La connexion n'a pas pu être renommée",
700
+ "helper": "Le nom de cette base partout dans Adminium — la carte, le groupe de la barre latérale au-dessus de ses pages, et chaque sélecteur qui la propose. La base elle-même n'est pas renommée.",
701
+ "label": "Nom",
702
+ "save": "Renommer",
703
+ "saved": "Connexion renommée",
704
+ "title": "Renommer la connexion"
705
+ },
706
+ "stats": {
707
+ "connections": "Connexions",
708
+ "healthy": "En bonne santé",
709
+ "pages": "Pages générées",
710
+ "tables": "Tables incluses"
711
+ },
712
+ "status": {
713
+ "connected": "Connectée",
714
+ "error": "Erreur",
715
+ "paused": "En pause",
716
+ "testing": "Test en cours…",
717
+ "unconfigured": "Brouillon"
718
+ },
719
+ "subtitle": "{healthy, number} sur {total, plural, one {# connexion} other {# connexions}} en bonne santé",
720
+ "subtitlePaused": "{healthy, number} sur {total, plural, one {# connexion} other {# connexions}} en bonne santé · {paused, number} en pause",
721
+ "test": {
722
+ "failed": "Échec du test de connexion",
723
+ "ok": "Connexion en bonne santé · {latency, number} ms"
724
+ },
725
+ "title": "Connexions de données"
726
+ },
727
+ "intent": {
728
+ "analytics": {
729
+ "description": "Tableaux de bord, graphiques et grilles en lecture seule. Pas de formulaires, pas d’écritures — chaque rôle plafonné à Lecteur.",
730
+ "title": "Analytique en lecture seule"
731
+ },
732
+ "crud": {
733
+ "description": "Une page d’édition par table plus recherche et import/export — un accueil minimal, sans tableaux de bord.",
734
+ "title": "Tables CRUD"
735
+ },
736
+ "fullAdmin": {
737
+ "description": "Tableaux de bord, pages CRUD, recherche, imports et exports — tout ce que votre schéma permet.",
738
+ "title": "Panneau d’administration complet"
739
+ },
740
+ "subtitle": "L’intention détermine quelles pages sont générées. Vous pourrez la changer plus tard — la changer propose une régénération, jamais une réécriture silencieuse.",
741
+ "support": {
742
+ "description": "Files d’attente, pages de tickets et de fiches clients d’abord. Suppressions désactivées par défaut. (Les modèles de files arrivent en M7 — l’ensemble de pages v1 correspond à l’admin complet.)",
743
+ "title": "Console de support"
744
+ },
745
+ "title": "De quoi avez-vous besoin ?",
746
+ "trust": "Nous ne lisons que votre schéma — jamais vos données de lignes pendant la configuration."
581
747
  },
582
748
  "llmRuns": {
583
749
  "review": {
584
- "header": {
585
- "title": "Examiner les suggestions de l’IA",
586
- "model": "Modèle",
587
- "snapshot": "Instantané",
588
- "byo": "BYO",
589
- "pathDirect": "API directe",
590
- "pathByo": "Copier-coller",
591
- "agree": "{n} d’accord",
592
- "conflict": "{n} en conflit",
593
- "new": "{n} nouvelles",
594
- "rejects": "{n} rejets",
595
- "countsAria": "Nombre de suggestions"
750
+ "applied": {
751
+ "body": "Les suggestions acceptées ci-dessous sont en lecture seule.",
752
+ "title": "Cette exécution a été appliquée"
596
753
  },
754
+ "apply": {
755
+ "confirm": "Appliquer les modifications",
756
+ "empty": "Rien à appliquer.",
757
+ "subtitle": "Ces modifications sont écrites en une seule transaction et peuvent être annulées.",
758
+ "title": "Appliquer {n} suggestions"
759
+ },
760
+ "applyFailed": "Rien n’a été appliqué",
761
+ "applyUnknown": "Le serveur n’a pas dit pourquoi.",
597
762
  "bulk": {
598
- "thresholdLabel": "Seuil de confiance",
599
- "thresholdAria": "Seuil de confiance pour « Tout accepter »",
600
763
  "acceptAll": "Tout accepter ≥ {pct}%",
601
- "clear": "Effacer la sélection"
764
+ "clear": "Effacer la sélection",
765
+ "thresholdAria": "Seuil de confiance pour « Tout accepter »",
766
+ "thresholdLabel": "Seuil de confiance"
602
767
  },
603
- "section": {
604
- "selectAllAria": "Tout sélectionner dans {group}",
605
- "acceptedCount": "{n} acceptées"
768
+ "cat": {
769
+ "copy": "microcopie",
770
+ "dashboard": "tableau de bord",
771
+ "enum": "énumération",
772
+ "group": "groupe de navigation",
773
+ "key": "colonnes clés",
774
+ "label": "libellé",
775
+ "pii": "DCP",
776
+ "relation": "relation",
777
+ "template": "modèle de page",
778
+ "widget": "widget"
779
+ },
780
+ "empty": {
781
+ "body": "Cette exécution n’a produit aucune suggestion à examiner.",
782
+ "title": "Aucune suggestion"
783
+ },
784
+ "error": {
785
+ "title": "Impossible de charger cette exécution"
786
+ },
787
+ "footer": {
788
+ "apply": "Appliquer {n} suggestions acceptées",
789
+ "count": "{n} suggestions sélectionnées",
790
+ "failed": "Échec de l’application"
606
791
  },
607
792
  "group": {
608
- "labels": "Libellés et traductions",
609
- "navigation": "Navigation et domaines",
793
+ "dashboards": "Tableaux de bord et widgets",
610
794
  "enums": "Sémantique des énumérations",
611
- "relations": "Relations",
795
+ "icons": "Icônes",
612
796
  "keys": "Colonnes clés",
613
- "templates": "Modèles de page",
614
- "dashboards": "Tableaux de bord et widgets",
797
+ "labels": "Libellés et traductions",
798
+ "microcopy": "Microcopie",
799
+ "navigation": "Navigation et domaines",
615
800
  "pii": "DCP et masquage",
616
- "icons": "Icônes",
617
- "microcopy": "Microcopie"
801
+ "relations": "Relations",
802
+ "templates": "Modèles de page"
618
803
  },
619
- "status": {
620
- "agree": "Concorde",
621
- "conflict": "Conflit",
622
- "new": "Nouveau",
623
- "heuristicOnly": "Heuristique seule",
624
- "rejects": "Rejette l’heuristique",
625
- "locked": "Verrouillé"
804
+ "header": {
805
+ "agree": "{n} d’accord",
806
+ "byo": "BYO",
807
+ "conflict": "{n} en conflit",
808
+ "countsAria": "Nombre de suggestions",
809
+ "model": "Modèle",
810
+ "new": "{n} nouvelles",
811
+ "pathByo": "Copier-coller",
812
+ "pathDirect": "API directe",
813
+ "rejects": "{n} rejets",
814
+ "snapshot": "Instantané",
815
+ "title": "Examiner les suggestions de l’IA"
816
+ },
817
+ "notReady": {
818
+ "body": "Une exécution doit être validée avant que ses suggestions puissent être examinées. Générez ou collez d’abord une réponse.",
819
+ "title": "Cette exécution n’a pas encore de suggestions à examiner"
626
820
  },
627
821
  "row": {
628
822
  "acceptAria": "Accepter la suggestion {noun} pour {target}",
823
+ "confidenceAria": "Confiance {pct}%",
824
+ "hideTranslations": "Masquer les traductions",
629
825
  "keptEdited": "conservé — modifié par vous",
826
+ "noAi": "Aucune suggestion de l’IA",
630
827
  "rejectsCallout": "L’IA rejette une décision heuristique — confirmez avant d’accepter.",
631
- "showTranslations": "Afficher les traductions",
632
- "hideTranslations": "Masquer les traductions",
633
- "confidenceAria": "Confiance {pct}%",
634
- "noAi": "Aucune suggestion de l’IA"
635
- },
636
- "value": {
637
- "none": "Aucune valeur",
638
- "absent": "Aucun",
639
- "dash": "—",
640
- "display": "Affichage",
641
- "key": "Clé",
642
- "rank": "rang {n}",
643
- "span": "largeur {n}",
644
- "tableCount": "{n} tables",
645
- "widgetCount": "{n} widgets",
646
- "enumWorkflow": "Flux",
647
- "enumCategory": "Catégorie",
648
- "notPii": "Pas de DCP",
649
- "label": "Libellé",
650
- "description": "Description",
651
- "subtitle": "Sous-titre de page",
652
- "headline": "Titre de l’état vide",
653
- "guidance": "Conseil de l’état vide"
828
+ "showTranslations": "Afficher les traductions"
654
829
  },
655
- "apply": {
656
- "title": "Appliquer {n} suggestions",
657
- "subtitle": "Ces modifications sont écrites en une seule transaction et peuvent être annulées.",
658
- "empty": "Rien à appliquer.",
659
- "confirm": "Appliquer les modifications"
830
+ "section": {
831
+ "acceptedCount": "{n} acceptées",
832
+ "selectAllAria": "Tout sélectionner dans {group}"
660
833
  },
661
- "footer": {
662
- "count": "{n} suggestions sélectionnées",
663
- "apply": "Appliquer {n} suggestions acceptées",
664
- "failed": "Échec de l’application"
834
+ "status": {
835
+ "agree": "Concorde",
836
+ "conflict": "Conflit",
837
+ "heuristicOnly": "Heuristique seule",
838
+ "locked": "Verrouillé",
839
+ "new": "Nouveau",
840
+ "rejects": "Rejette l’heuristique"
665
841
  },
666
842
  "toast": {
667
843
  "applied": "{n} suggestions appliquées",
@@ -669,630 +845,1097 @@ export default {
669
845
  "applyFailed": "Impossible d’appliquer les suggestions",
670
846
  "undoFailed": "Impossible d’annuler cette modification"
671
847
  },
672
- "error": {
673
- "title": "Impossible de charger cette exécution"
674
- },
675
- "notReady": {
676
- "title": "Cette exécution n’a pas encore de suggestions à examiner",
677
- "body": "Une exécution doit être validée avant que ses suggestions puissent être examinées. Générez ou collez d’abord une réponse."
678
- },
679
- "applied": {
680
- "title": "Cette exécution a été appliquée",
681
- "body": "Les suggestions acceptées ci-dessous sont en lecture seule."
682
- },
683
- "empty": {
684
- "title": "Aucune suggestion",
685
- "body": "Cette exécution n’a produit aucune suggestion à examiner."
686
- },
687
- "cat": {
688
- "label": "libellé",
689
- "key": "colonnes clés",
690
- "enum": "énumération",
691
- "relation": "relation",
692
- "pii": "DCP",
693
- "template": "modèle de page",
694
- "group": "groupe de navigation",
695
- "dashboard": "tableau de bord",
696
- "widget": "widget",
697
- "copy": "microcopie"
848
+ "value": {
849
+ "absent": "Aucun",
850
+ "dash": "—",
851
+ "description": "Description",
852
+ "display": "Affichage",
853
+ "enumCategory": "Catégorie",
854
+ "enumWorkflow": "Flux",
855
+ "guidance": "Conseil de l’état vide",
856
+ "headline": "Titre de l’état vide",
857
+ "key": "Clé",
858
+ "label": "Libellé",
859
+ "none": "Aucune valeur",
860
+ "notPii": "Pas de DCP",
861
+ "rank": "rang {n}",
862
+ "span": "largeur {n}",
863
+ "subtitle": "Sous-titre de page",
864
+ "tableCount": "{n} tables",
865
+ "widgetCount": "{n} widgets"
698
866
  }
699
867
  }
700
868
  },
701
- "wizard": {
702
- "title": "Nouvelle connexion",
703
- "back": "Retour",
704
- "continue": "Continuer",
705
- "progress": "Progression de la configuration",
706
- "persistFailed": "Impossible d’enregistrer votre sélection de tables — réessayez.",
707
- "persistFailedTitle": "Échec de l’enregistrement",
708
- "bridgeAppliedTitle": "Chaîne de connexion reçue",
709
- "bridgeAppliedBody": "Transmise depuis adminium.dev par votre navigateur — elle est allée directement à cette machine et n’a jamais été téléversée. Vérifiez-la ci-dessous, puis continuez.",
710
- "bridgeFailedTitle": "Ce transfert n’a pas pu être utilisé",
711
- "bridgeFailedBody": "Il a déjà été utilisé ou a expiré. Collez plutôt votre chaîne de connexion ci-dessous.",
712
- "step": {
713
- "source": "Source",
714
- "test": "Analyser",
715
- "tables": "Tables",
716
- "meta": "Stockage méta",
717
- "intent": "Intention",
718
- "enrich": "Enrichir",
719
- "generate": "Générer"
720
- }
721
- },
722
869
  "meta": {
723
- "title": "Où Adminium doit-il ranger ses propres tables ?",
724
- "subtitle": "Pages, rôles, journal d’audit et paramètres vivent dans des tables préfixées adminium_ — jamais mêlés à vos données.",
870
+ "move": {
871
+ "copying": "Déplacement des tables d’Adminium…",
872
+ "copyingBody": "Copie de chaque table adminium_ vers la nouvelle base. Vos données sources ne sont pas touchées, et rien n’est basculé tant que la copie n’est pas vérifiée.",
873
+ "failed": "Impossible de déplacer les tables d’Adminium — réessayez.",
874
+ "restarting": "Redémarrage…",
875
+ "restartingBody": "La copie est terminée. Adminium redémarre sur la nouvelle base — cette page continuera d’elle-même dans quelques secondes.",
876
+ "timeout": "Adminium a déplacé ses tables mais n’est pas encore revenu. Vos données sont en sécurité dans la nouvelle base — rechargez cette page dans un instant.",
877
+ "title": "Déplacement des tables d’Adminium"
878
+ },
725
879
  "sameDb": {
726
- "title": "Même base de données",
727
880
  "description": "Les tables adminium_* sont créées à côté de vos tables sources. La configuration la plus simple — nécessite un rôle avec droits d’écriture et CREATE TABLE.",
728
- "disabledReadOnly": "Votre rôle est en lecture seule Adminium n’écrit jamais dans cette base. Choisissez une base séparée pour les tables d’Adminium.",
881
+ "disabledFile": "Un fichier de schéma n’a pas de base active choisissez une base séparée pour les tables d’Adminium.",
729
882
  "disabledNoDdl": "Ce rôle ne peut pas exécuter de DDL — les migrations d’Adminium exigent CREATE TABLE. Choisissez une base séparée pour les tables d’Adminium.",
730
- "disabledFile": "Un fichier de schéma n’a pas de base active — choisissez une base séparée pour les tables d’Adminium."
883
+ "disabledReadOnly": "Votre rôle est en lecture seule — Adminium n’écrit jamais dans cette base. Choisissez une base séparée pour les tables d’Adminium.",
884
+ "title": "Même base de données"
731
885
  },
732
886
  "separate": {
733
- "title": "Base de données séparée",
734
887
  "description": "Adminium garde ses tables dans une autre base. Votre source reste intacte — requis pour les sources en lecture seule.",
735
888
  "dsn": "Chaîne de connexion de la base méta",
889
+ "errorTitle": "Magasin méta incompatible",
736
890
  "helper": "Nécessite des droits d’écriture + DDL — Adminium y exécute ses propres migrations.",
737
- "test": "Tester la connexion",
738
- "ok": "Compatible — écriture ✓ · DDL ✓",
739
891
  "insufficient": "Ce rôle ne peut pas héberger le magasin méta — Adminium y a besoin des droits d’écriture et CREATE TABLE.",
740
- "errorTitle": "Magasin méta incompatible"
892
+ "ok": "Compatible écriture ✓ · DDL ✓",
893
+ "test": "Tester la connexion",
894
+ "title": "Base de données séparée"
741
895
  },
896
+ "subtitle": "Pages, rôles, journal d’audit et paramètres vivent dans des tables préfixées adminium_ — jamais mêlés à vos données.",
742
897
  "testFailed": "Échec de la connexion.",
898
+ "title": "Où Adminium doit-il ranger ses propres tables ?",
743
899
  "v1Note": {
744
- "title": "À propos de cette installation",
745
- "body": "Ce serveur garde déjà ses propres tables dans une base configurée, et cette étape ne les déplace pas. Elle vérifie que votre choix est compatible avec cette connexion — le serveur applique la même règle indépendamment (409 META_PLACEMENT_INVALID)."
746
- },
747
- "move": {
748
- "title": "Déplacement des tables d’Adminium",
749
- "copying": "Déplacement des tables d’Adminium…",
750
- "restarting": "Redémarrage…",
751
- "copyingBody": "Copie de chaque table adminium_ vers la nouvelle base. Vos données sources ne sont pas touchées, et rien n’est basculé tant que la copie n’est pas vérifiée.",
752
- "restartingBody": "La copie est terminée. Adminium redémarre sur la nouvelle base — cette page continuera d’elle-même dans quelques secondes.",
753
- "failed": "Impossible de déplacer les tables d’Adminium — réessayez.",
754
- "timeout": "Adminium a déplacé ses tables mais n’est pas encore revenu. Vos données sont en sécurité dans la nouvelle base — rechargez cette page dans un instant."
900
+ "body": "Ce serveur garde déjà ses propres tables dans une base configurée, et cette étape ne les déplace pas. Elle vérifie que votre choix est compatible avec cette connexion — le serveur applique la même règle indépendamment (409 META_PLACEMENT_INVALID).",
901
+ "title": "À propos de cette installation"
755
902
  },
756
903
  "willMove": {
757
- "title": "Cette étape va déplacer les tables d’Adminium",
758
- "body": "Adminium utilise actuellement son magasin SQLite intégré. « Continuer » copie ce magasin dans la base choisie et redémarre dessus — comptes, pages et paramètres suivent, vous restez connecté."
904
+ "body": "Adminium utilise actuellement son magasin SQLite intégré. « Continuer » copie ce magasin dans la base choisie et redémarre dessus — comptes, pages et paramètres suivent, vous restez connecté.",
905
+ "title": "Cette étape va déplacer les tables d’Adminium"
759
906
  }
760
907
  },
761
- "intent": {
762
- "title": "De quoi avez-vous besoin ?",
763
- "subtitle": "L’intention détermine quelles pages sont générées. Vous pourrez la changer plus tard — la changer propose une régénération, jamais une réécriture silencieuse.",
764
- "trust": "Nous ne lisons que votre schéma — jamais vos données de lignes pendant la configuration.",
765
- "fullAdmin": {
766
- "title": "Panneau d’administration complet",
767
- "description": "Tableaux de bord, pages CRUD, recherche, imports et exports — tout ce que votre schéma permet."
768
- },
769
- "analytics": {
770
- "title": "Analytique en lecture seule",
771
- "description": "Tableaux de bord, graphiques et grilles en lecture seule. Pas de formulaires, pas d’écritures chaque rôle plafonné à Lecteur."
908
+ "pages": {
909
+ "action": {
910
+ "delete": "Supprimer la page",
911
+ "duplicate": "Dupliquer",
912
+ "edit": "Modifier la page",
913
+ "hide": "Masquer dans la barre latérale",
914
+ "show": "Afficher dans la barre latérale"
915
+ },
916
+ "attachments": {
917
+ "accept": "Types de fichiers acceptés",
918
+ "acceptHint": "N’en choisir aucun accepte tout ce que cet espace de travail autorise. Un choix ici ne peut que restreindre cette liste, jamais l’élargir.",
919
+ "column": {
920
+ "adoptHint": "Cette table possède déjà cette colonne ; rien n’est créé — elle est utilisée telle quelle.",
921
+ "bound": "Les fichiers sont stockés dans la colonne {column} de cette table.",
922
+ "boundHint": "Désactiver les pièces jointes plus tard ne délie que cette page. La colonne et ses fichiers restent intacts.",
923
+ "confirm": "Exécuter",
924
+ "create": "Créer la colonne",
925
+ "createHint": "Adminium ajoute une colonne texte à cette table. Vous verrez l’instruction exacte avant toute exécution.",
926
+ "createdHint": "La colonne existe désormais. Enregistrez cette page pour terminer.",
927
+ "failed": "Cela n’a pas fonctionné",
928
+ "invalid": "Un nom de colonne doit commencer par une lettre et ne contenir que des minuscules, des chiffres et des tirets bas.",
929
+ "label": "Colonne qui contient les fichiers",
930
+ "required": "Donnez un nom à la colonne.",
931
+ "tooLong": "Ce nom est trop long pour une colonne.",
932
+ "use": "Utiliser cette colonne",
933
+ "wrongType": "Cette table possède déjà une colonne de ce nom, et elle ne peut pas contenir une référence de fichier. Choisissez un autre nom."
934
+ },
935
+ "destination": "Où vont les fichiers",
936
+ "destinationDefault": "La destination par défaut",
937
+ "destinationHint": "Laissez la destination par défaut, sauf si les fichiers de cette table ont leur place ailleurs.",
938
+ "destinationIsDefault": "{name} (par défaut)",
939
+ "destinationLocal": "Le disque de ce serveur",
940
+ "enable": "Autoriser les pièces jointes sur les enregistrements de cette table",
941
+ "enableHint": "Les fichiers sont liés du côté d’Adminium : cette table n’a donc besoin d’aucune nouvelle colonne — cela fonctionne sur une connexion en lecture seule, comme sur une table que vous préférez ne pas modifier.",
942
+ "enableHintColumn": "Les fichiers sont stockés dans une colonne de cette table : ils apparaissent donc dans les boîtes de dialogue Nouveau et Modifier ainsi que sur chaque enregistrement.",
943
+ "enableHintSidecar": "Les fichiers sont liés du côté d’Adminium à la place. Ils apparaissent sur la page de chaque enregistrement, pas dans la boîte de dialogue Nouveau.",
944
+ "maxBytes": "Fichier le plus volumineux (Mo)",
945
+ "maxBytesHint": "Laissez vide pour suivre la limite de l’espace de travail. Un nombre ici ne peut que l’abaisser.",
946
+ "maxCount": "Nombre maximal de fichiers par enregistrement",
947
+ "maxCountHint": "Laissez vide pour en accepter autant qu’un enregistrement en a besoin.",
948
+ "sidecar": {
949
+ "noPrivilege": "Le rôle de cette connexion ne peut pas modifier de tables, Adminium ne peut donc pas y ajouter de colonne.",
950
+ "readOnlyIntent": "Cette connexion est configurée pour l’analyse en lecture seule, Adminium ne peut donc pas y ajouter de colonne.",
951
+ "readOnlyRole": "Cette connexion se connecte avec un rôle en lecture seule, Adminium ne peut donc pas y ajouter de colonne.",
952
+ "schemaFile": "Cette connexion a été créée à partir d’un fichier de schéma, Adminium ne peut donc pas y ajouter de colonne."
953
+ },
954
+ "type": {
955
+ "office": "Documents Office",
956
+ "text": "Texte brut"
957
+ }
772
958
  },
773
- "crud": {
774
- "title": "Tables CRUD",
775
- "description": "Une page d’édition par table plus recherche et import/export — un accueil minimal, sans tableaux de bord."
959
+ "columns": {
960
+ "addFromLinked": "Depuis les tables liées",
961
+ "addFromTable": "Depuis {table}",
962
+ "addLinkedFrom": "Tables qui pointent ici",
963
+ "addLinkedFromHelp": "Comptez les lignes qui pointent vers chaque enregistrement, ou additionnez l’un de leurs nombres.",
964
+ "addLinkedHelp": "Affiche une valeur de la table vers laquelle pointe une colonne de liaison.",
965
+ "addNoMatches": "Aucune colonne ne correspond à « {query} ».",
966
+ "addOpen": "Ajouter une colonne",
967
+ "addSearch": "Rechercher des colonnes…",
968
+ "addTitle": "Ajouter une colonne",
969
+ "addVia": "via {column}",
970
+ "avatar": "Avatar",
971
+ "avatarToggle": "Afficher un monogramme à côté de {name}",
972
+ "countBadge": "Nombre",
973
+ "dragHandle": "Réordonner {name}",
974
+ "empty": "Pas encore de colonnes — ajoutez-en ci-dessous.",
975
+ "file": {
976
+ "acceptHelp": "Ne cochez aucun type pour accepter tout ce que cet espace de travail accepte. Choisir des types ne peut que restreindre cette liste — une colonne ne peut jamais accepter un type que l’espace de travail refuse.",
977
+ "acceptLabel": "Types acceptés",
978
+ "badge": "Fichier",
979
+ "destinationDefault": "La destination par défaut",
980
+ "destinationHelp": "L’endroit où sont conservés les octets téléversés via cette colonne.",
981
+ "destinationLabel": "Destination",
982
+ "inlineHelp": "Seules les images sont dessinées dans la cellule. Tout le reste demeure une pastille portant son nom et sa taille, quel que soit ce réglage.",
983
+ "inlineLabel": "L’afficher dans le tableau",
984
+ "maxCountHelp": "Laissez vide pour accepter autant de fichiers qu’un enregistrement en a besoin.",
985
+ "maxCountLabel": "Nombre maximal de fichiers par enregistrement",
986
+ "maxCountToggle": "Nombre maximal de fichiers pour {name}",
987
+ "maxHelp": "Laissez vide pour utiliser la limite de l’espace de travail. Une colonne ne peut qu’en demander moins.",
988
+ "maxLabel": "Fichier le plus volumineux (Mo)",
989
+ "maxToggle": "Fichier le plus volumineux accepté par {name}, en Mo",
990
+ "multipleHelp": "La colonne stocke une liste de fichiers au lieu d’un seul. Les valeurs uniques existantes continuent de fonctionner — elles sont lues comme une liste d’un élément.",
991
+ "multipleLabel": "Contenir plusieurs fichiers",
992
+ "ref": {
993
+ "id": "L’identifiant de fichier d’Adminium",
994
+ "key": "La clé dans la destination",
995
+ "url": "Un lien vers le fichier"
996
+ },
997
+ "refHelp": "Ce qui est écrit dans cette colonne lorsqu’un fichier est téléversé. Les valeurs déjà stockées continuent de fonctionner — ceci ne change que la suivante.",
998
+ "refLabel": "Valeur stockée",
999
+ "refTooNarrow": "Cette colonne est trop courte pour contenir cette valeur. Choisissez-en une qu’elle peut contenir, ou élargissez la colonne dans la base de données.",
1000
+ "refWidth": "{shape} — nécessite {needs} caractères, cette colonne en contient {holds}",
1001
+ "switch": "Fichier",
1002
+ "switchToggle": "{name} stocke un fichier",
1003
+ "type": {
1004
+ "csv": "CSV",
1005
+ "gif": "GIF",
1006
+ "heic": "HEIC",
1007
+ "jpeg": "JPEG",
1008
+ "json": "JSON",
1009
+ "markdown": "Markdown",
1010
+ "mp3": "Audio MP3",
1011
+ "mp4": "Vidéo MP4",
1012
+ "office": "Documents Office",
1013
+ "ogg": "Ogg",
1014
+ "pdf": "PDF",
1015
+ "png": "PNG",
1016
+ "svg": "SVG",
1017
+ "text": "Texte brut",
1018
+ "wav": "Audio WAV",
1019
+ "webm": "WebM",
1020
+ "webp": "WebP",
1021
+ "zip": "ZIP"
1022
+ }
1023
+ },
1024
+ "fold": {
1025
+ "avg": "Moyenne",
1026
+ "max": "Max",
1027
+ "min": "Min",
1028
+ "sum": "Somme"
1029
+ },
1030
+ "foldAdd": "Ajouter",
1031
+ "foldLabel": "Agrégat",
1032
+ "followColumn": "Suivre {name}",
1033
+ "header": "En-tête de {name}",
1034
+ "help": "Glissez pour réordonner les colonnes, renommez leurs en-têtes et choisissez celles qui apparaissent dans le tableau.",
1035
+ "lookupBack": "Retour",
1036
+ "lookupBadge": "Liée",
1037
+ "lookupBroken": "Ce lien ne se résout plus",
1038
+ "lookupBrokenBody": "Le schéma a changé pendant votre navigation. Recommencez le lien.",
1039
+ "lookupBrowse": "Choisissez quoi afficher depuis {table}",
1040
+ "mask": "Masquer",
1041
+ "maskHelp": "Le masquage cache une valeur derrière un bouton d’affichage pour les lecteurs autorisés à la voir. Le fait que la donnée quitte ou non la base se règle sur la connexion, pas ici.",
1042
+ "maskToggle": "Masquer {name} derrière un bouton d’affichage",
1043
+ "masked": "Masquée",
1044
+ "none": {
1045
+ "body": "Les colonnes sont lues dans la table lors de la génération de la page. Liez cette page à une table puis régénérez pour les renseigner.",
1046
+ "title": "Cette page n’a pas encore de colonnes"
1047
+ },
1048
+ "pk": "Clé",
1049
+ "remove": "Retirer {name}",
1050
+ "schemaUnavailable": "Les colonnes de la base n’ont pas pu être listées ; impossible d’ajouter des colonnes ici.",
1051
+ "shown": "Affichée",
1052
+ "toggle": "Afficher {name} dans le tableau"
776
1053
  },
777
- "support": {
778
- "title": "Console de support",
779
- "description": "Files d’attente, pages de tickets et de fiches clients d’abord. Suppressions désactivées par défaut. (Les modèles de files arrivent en M7 — l’ensemble de pages v1 correspond à l’admin complet.)"
780
- }
781
- },
782
- "generate": {
783
- "title": "Générez votre application",
784
- "subtitle": "Une page par table incluse plus des tableaux de bord par domaine — intention :",
785
- "run": "Générer le tableau de bord",
786
- "openApp": "Ouvrir votre application",
787
- "logLabel": "Journal de génération",
788
- "log": {
789
- "classifying": "Classification du schéma…",
790
- "composing": "Composition des modèles…",
791
- "writing": "Écriture des pages…",
792
- "done": "{pages} pages générées dans {groups} groupes de navigation"
1054
+ "create": {
1055
+ "failed": "Impossible de créer la page",
1056
+ "submit": "Créer la page",
1057
+ "subtitle": "Choisissez ce que cette page affiche et son apparence. L’aperçu suit vos choix.",
1058
+ "title": "Nouvelle page"
793
1059
  },
794
- "successTitle": "Votre tableau de bord est prêt",
795
- "successBody": "{pages} pages dans {groups} groupes de navigation — générées depuis votre schéma, modifiables dans le Studio.",
796
- "errorTitle": "Échec de la génération",
797
- "failed": "Échec de la génération réessayez, ou relancez d’abord l’introspection.",
798
- "fileTitle": "Fichier de schéma analysé — la génération nécessite une base active",
799
- "fileBody": "Votre schéma a été analysé proprement et l’aperçu ci-dessus est réel. Générer une application fonctionnelle directement depuis un fichier de schéma (avec des lignes fictives) n’est pas encore disponible — connectez une base active pour générer dès aujourd’hui."
800
- },
801
- "remap": {
802
- "column": {
803
- "nullable": "nullable",
804
- "labelOverride": "Libellé d’affichage",
805
- "labelHelper": "Inféré : {name}",
806
- "logicalType": "Type logique",
807
- "logicalTypeHelper": "Inféré : {type} (depuis {dbType}) — mappé par l’adaptateur ; non remplaçable en v1.",
808
- "semantic": "Type sémantique",
809
- "unclassified": "Pas encore classifié.",
810
- "semanticHelper": "Classificateur : {tag} · confiance {confidence}% · source : {source}",
811
- "semanticInferred": "inféré : {tag}",
812
- "currency": "Devise",
813
- "currencyHelper": "Code ISO 4217 appliqué au formatage monétaire.",
814
- "pii": "Masquer par défaut",
815
- "piiHelper": "Les valeurs masquées s’affichent caviardées ; le démasquage requiert la permission data.unmask_pii et est consigné dans le journal d’audit.",
816
- "enum": "Sémantique de l’énumération",
817
- "enumKind": "Nature de l’énumération",
818
- "enumWorkflow": "Flux",
819
- "enumCategory": "Catégorie",
820
- "enumLabelFor": "Libellé pour {value}",
821
- "enumToneFor": "Tonalité pour {value}",
822
- "enumToneAuto": "auto",
823
- "enumHelper": "Les énumérations de flux pilotent les pastilles de statut et les colonnes de tableau ; les tonalités associent les valeurs à l’échelle de teintes sémantiques."
1060
+ "createButton": "Nouvelle page",
1061
+ "delete": {
1062
+ "body": "Cette action est irréversible. Les vues enregistrées et les dispositions personnelles de cette page sont supprimées pour tout le monde.",
1063
+ "bodyGenerated": "Cette page provient de la génération du schéma : elle réapparaîtra à la prochaine génération. Les vues enregistrées et les dispositions personnelles sont supprimées pour tout le monde.",
1064
+ "confirm": "Supprimer la page",
1065
+ "prompt": "Saisissez {slug} pour confirmer",
1066
+ "title": "Supprimer cette page ?"
824
1067
  },
825
- "diff": {
826
- "one": "1 modification",
827
- "count": "{count} modifications",
828
- "saved": "Remplacements enregistrés.",
829
- "revertOne": "Annuler {change}",
830
- "regenerate": "Régénérer les pages",
831
- "revertAll": "Tout annuler",
832
- "save": "Enregistrer les remplacements"
1068
+ "derived": {
1069
+ "add": "Ajouter une colonne",
1070
+ "atLeast": "est au moins",
1071
+ "cancel": "Annuler",
1072
+ "emptyBody": "Synthétisez d’abord une table liée dans la carte Colonnes — les règles ici s’appuient sur ces nombres.",
1073
+ "emptyTitle": "Aucun nombre calculé pour l’instant",
1074
+ "fieldBadge": "Calculé",
1075
+ "foldBadge": "Synthèse",
1076
+ "help": "Calculez des nombres à partir des synthèses ci-dessus et des colonnes de cet enregistrement. Ils sont calculés au chargement de la page et ne peuvent pas être triés.",
1077
+ "label": "En-tête de colonne",
1078
+ "minus": "moins",
1079
+ "numberHelp": "Les nombres sont des décimaux simples — 500 ou 12.50, jamais 1,000 ni 5e3.",
1080
+ "operandA": "Nombre",
1081
+ "operandB": "Nombre",
1082
+ "operator": "Opérateur",
1083
+ "otherwise": "sinon",
1084
+ "percentOf": "pour cent de cet enregistrement",
1085
+ "plus": "plus",
1086
+ "preset": {
1087
+ "combine": "Additionner ou soustraire deux nombres",
1088
+ "percent": "Pourcentage d’un nombre",
1089
+ "rule": "Règle avec un seuil"
1090
+ },
1091
+ "previewHelp": "Valeurs d’exemple, calculées par le même code que la page.",
1092
+ "previewTitle": "Aperçu",
1093
+ "remove": "Retirer {name}",
1094
+ "thenShow": "alors afficher"
833
1095
  },
834
- "table": {
835
- "iconPicker": "Icône de la table",
836
- "system": "Système",
837
- "labelOverride": "Libellé d’affichage",
838
- "labelHelper": "Inféré : {name}",
839
- "icon": "Icône",
840
- "navGroup": "Groupe de navigation",
841
- "navGroupHelper": "Le placement dans la navigation est décidé par le générateur — un remplacement table.navGroup ne fait pas partie du vocabulaire v1.",
842
- "include": "Inclure dans l’application générée",
843
- "includeHelper": "Les tables exclues n’ont aucune page et disparaissent de la navigation.",
844
- "shape": "Forme de la table (classifiée)",
845
- "role": "Rôle",
846
- "unclassified": "Non classifiée",
847
- "kind": "Nature",
848
- "hierarchy": "Hiérarchie",
849
- "selfFk": "Auto-référence via {column}",
850
- "polymorphic": "Paires polymorphes",
851
- "rows": "Estimation du nombre de lignes",
852
- "shapeHelper": "La classification est recalculée à chaque introspection ; les remplacements se superposent et survivent à la régénération."
1096
+ "duplicate": {
1097
+ "failed": "Impossible de dupliquer la page",
1098
+ "submit": "Dupliquer",
1099
+ "title": "Dupliquer la page"
853
1100
  },
854
- "relations": {
855
- "declared": "Clés étrangères déclarées",
856
- "noneDeclared": "Aucune clé étrangère déclarée ne touche cette table.",
857
- "inferred": "Relations inférées",
858
- "noneInferred": "Rien d’inféré pour cette table.",
859
- "confidence": "inférée · {pct}%",
860
- "accepted": "Acceptée",
861
- "suppressed": "Écartée",
862
- "accept": "Accepter",
863
- "suppress": "Écarter",
864
- "overrides": "Relations de remplacement (appliquées)",
865
- "overrideBadge": "remplacement",
866
- "add": "Ajouter une relation virtuelle",
867
- "fromColumn": "Colonne source",
868
- "noColumns": "Aucune colonne correspondante",
869
- "fromPlaceholder": "customer_id",
870
- "toTable": "Table cible",
871
- "noTables": "Aucune table correspondante",
872
- "toColumn": "Colonne cible",
873
- "cardinality": "Cardinalité",
874
- "addButton": "Ajouter la relation"
875
- },
876
- "toast": {
877
- "saved": "Remplacements de schéma enregistrés",
878
- "savedDetail": "Le schéma appliqué ci-dessous reflète vos modifications.",
879
- "regenerated": "{created} créées · {updated} mises à jour · {unchanged} inchangées",
880
- "regeneratedDetail": "Les pages que vous avez modifiées à la main sont préservées seules les pages dont le generated_hash est intact ont été régénérées sur place.",
881
- "regenerateFailed": "Échec de la régénération"
1101
+ "editor": {
1102
+ "appearance": "Apparence",
1103
+ "attachments": "Pièces jointes",
1104
+ "columns": "Colonnes",
1105
+ "contentInvalid": "La configuration de cette page est illisible",
1106
+ "contentInvalidBody": "Elle provient d’une version plus récente, ou elle est corrompue. Régénérez la page ou supprimez-la.",
1107
+ "contentUnavailable": "Impossible de charger le contenu de la page",
1108
+ "contentUnavailableBody": "Les informations ci-dessus peuvent tout de même être enregistrées.",
1109
+ "data": "Données",
1110
+ "derived": "Nombres calculés",
1111
+ "details": "Détails",
1112
+ "generated": {
1113
+ "body": "Vos modifications sont conservées lors d’une nouvelle génération : la page est marquée comme modifiée et laissée intacte. En revanche, une suppression ne tient que jusqu’à ce que la génération suivante la recrée.",
1114
+ "title": "Cette page a été générée à partir de votre schéma"
1115
+ },
1116
+ "itemsPending": "Enregistrez d’abord la modification ci-dessus — le contenu de la page est reconstruit à partir du nouveau modèle et de la nouvelle table.",
1117
+ "missing": "Cette page n’existe plus",
1118
+ "missingBody": "Elle a peut-être été supprimée, ou retirée par une génération.",
1119
+ "notBindable": "Ce modèle n’est pas lié à une seule table",
1120
+ "notBindableBody": "Son contenu se construit widget par widget. Ouvrez la page et utilisez « Modifier » pour les ajouter.",
1121
+ "openPage": "Ouvrir la page",
1122
+ "recompose": "Cette page va être reconstruite",
1123
+ "recomposeBody": "L’enregistrement remplace son contenu par une nouvelle disposition pour le modèle et la table ci-dessus. Les ajustements de colonnes et les modifications de widgets de cette page seront perdus.",
1124
+ "save": "Enregistrer les modifications",
1125
+ "saveFailed": "Impossible d’enregistrer les modifications",
1126
+ "schemaFailed": "Impossible de lister les tables",
1127
+ "schemaFailedBody": "Cette connexion n’a peut-être pas encore été analysée. Lancez l’introspection depuis Studio Connexions de données.",
1128
+ "title": "Modifier la page"
882
1129
  },
883
- "title": "Remappage du schéma",
884
- "subtitle": "{tables} tables · {applied} remplacements appliqués",
885
- "saveFailed": "Échec de l’enregistrement : {message}",
886
- "loadFailed": "Impossible de charger le schéma de cette connexion.",
887
- "inspector": "Inspecteur",
888
1130
  "empty": {
889
- "title": "Choisissez une table ou une colonne",
890
- "description": "Sélectionnez un élément dans l’arborescence du schéma pour remapper son libellé, son type, ses relations ou son masquage."
1131
+ "body": "Connectez une base de données pour générer des pages automatiquement, ou créez-en une à la main.",
1132
+ "title": "Aucune page pour l’instant"
891
1133
  },
892
- "tabs": {
893
- "details": "Détails",
894
- "relations": "Relations"
1134
+ "field": {
1135
+ "connection": "Source de données",
1136
+ "connectionNone": "Aucune",
1137
+ "group": "Groupe de la barre latérale",
1138
+ "groupHint": "La section de la barre latérale où elle apparaît.",
1139
+ "icon": "Icône",
1140
+ "iconHint": "Affichée à côté du nom de la page dans la barre latérale.",
1141
+ "iconPick": "Choisir l’icône de la page",
1142
+ "newRowLabel": "Bouton d’ajout",
1143
+ "newRowLabelHint": "Le texte du bouton qui ajoute un enregistrement. Laissez vide pour utiliser le libellé par défaut, qui est traduit.",
1144
+ "padding": "Marge de la page",
1145
+ "slug": "Adresse de la page",
1146
+ "slugHint": "Minuscules, chiffres et tirets. Seulement la dernière partie — le reste de l’adresse est ajouté pour vous.",
1147
+ "slugTaken": "Une autre page utilise déjà cette adresse.",
1148
+ "slugWarning": "Modifier l’adresse casse les liens et les favoris existants vers cette page.",
1149
+ "table": "Table",
1150
+ "tableCreateHint": "La table que cette page lit. Choisissez-en une maintenant et la page est prête à l’emploi ; laissez vide pour la lier plus tard.",
1151
+ "tableNeedsConnection": "Choisissez d’abord une source de données.",
1152
+ "tableNone": "Non liée",
1153
+ "template": "Modèle",
1154
+ "templateHint": "Détermine ce que la page peut contenir. Modifiable par la suite.",
1155
+ "title": "Titre",
1156
+ "titleHint": "Affiché dans la barre latérale et dans l’en-tête de la page.",
1157
+ "visible": "Afficher dans la barre latérale",
1158
+ "visibleHint": "Une page masquée reste accessible à son URL pour qui possède le lien.",
1159
+ "width": "Largeur du contenu",
1160
+ "widthHint": "Largeur maximale de la colonne de contenu de la page sur un grand écran."
895
1161
  },
896
- "tree": {
897
- "label": "Schéma",
898
- "search": "Rechercher des tables et des colonnes",
899
- "searchPlaceholder": "Rechercher des tables…",
900
- "noMatches": "Aucune table ne correspond à votre recherche.",
901
- "collapse": "Replier la table",
902
- "expand": "Déplier la table",
903
- "unsaved": "Modification non enregistrée",
904
- "excluded": "Exclue"
1162
+ "icon": {
1163
+ "noMatches": "Aucune icône ne correspond à cette recherche.",
1164
+ "none": "Choisir une icône",
1165
+ "search": "Rechercher des icônes"
905
1166
  },
906
- "badge": {
907
- "pk": "PK",
908
- "fk": "FK",
909
- "unique": "UNIQUE",
910
- "pii": "PII",
911
- "masked": "Masquée"
1167
+ "list": {
1168
+ "count": "{count, plural, one {# page} other {# pages}}",
1169
+ "title": "Pages"
912
1170
  },
913
- "unavailableTitle": "Éditeur de remappage du schéma indisponible",
914
- "unavailableBody": "Cette version n’inclut pas encore l’éditeur de remappage (09-T12). Relancez la génération une fois qu’il sera disponible pour remapper les libellés, les types et les relations."
915
- },
916
- "publicApi": {
917
- "error": "Something went wrong",
918
- "scopes": {
919
- "deleteTitle": "Delete this scope",
920
- "deleteBody": "Any page using a key bound to this scope stops loading data. Keys are not deleted — revoke them first if that is what you meant.",
921
- "deletePrompt": "Type the scope name to confirm",
922
- "deleteConfirm": "Delete scope",
923
- "issuesTitle": "This scope did not compile",
924
- "title": "Scopes",
925
- "subtitle": "A scope is the whole of what a key may reach — the tables, the exact columns, and a filter the caller can narrow but never remove.",
926
- "emptyTitle": "No scopes yet",
927
- "emptyBody": "Create one below. It is checked against your live schema before it is saved.",
928
- "keyCount": "{count, plural, =0 {no keys} one {# key} other {# keys}}",
929
- "delete": "Delete",
930
- "nameLabel": "Name",
931
- "connectionLabel": "Connection ID",
932
- "documentLabel": "Scope document",
933
- "documentHint": "Compiled against your schema when you save. Every column a caller can reach is listed here and nowhere else.",
934
- "create": "Create scope",
935
- "formLabel": "Create a scope"
936
- },
937
- "cancel": "Cancel",
938
- "close": "Close",
939
- "title": "Public API",
940
- "subtitle": "Let your own customer- or staff-facing pages read this database, through a scope you define.",
941
- "notRegistered": {
942
- "title": "Not enabled on this server",
943
- "body": "Set ADMINIUM_PUBLIC_API_ORIGINS to the exact origins allowed to call it, then restart. Until then these routes are not served at all."
1171
+ "loadFailed": {
1172
+ "body": "La gestion des pages requiert l’autorisation « Gérer les pages ». Demandez à un administrateur de l’attribuer à l’un de vos rôles.",
1173
+ "title": "Impossible de charger les pages"
944
1174
  },
945
- "toggle": {
946
- "label": "Serve the public API",
947
- "hint": "Turning this off stops every public request immediately. Nothing is deleted — keys, scopes and data all survive."
1175
+ "origin": {
1176
+ "generated": "Générée",
1177
+ "llm": "Assistant",
1178
+ "manifest": "Extension",
1179
+ "system": "Système",
1180
+ "user": "Personnalisée"
948
1181
  },
949
- "origins": {
950
- "label": "Origins allowed to call it"
1182
+ "padding": {
1183
+ "custom": "Personnalisée…",
1184
+ "default": "Par défaut pour ce modèle",
1185
+ "none": "Aucune",
1186
+ "standard": "Standard (28 × 24)",
1187
+ "x": "Côtés (px)",
1188
+ "y": "Haut et bas (px)"
951
1189
  },
952
- "keys": {
953
- "title": "Keys",
954
- "subtitle": "These go in your page’s JavaScript, so anyone can read them. That is expected — a key can only ever do what its scope allows.",
955
- "emptyTitle": "No keys yet",
956
- "emptyBody": "Create a scope first, then mint a key for it.",
957
- "reveal": "Show key",
958
- "rotate": "Rotate",
959
- "revoke": "Revoke",
960
- "nameLabel": "Name",
961
- "scopeLabel": "Scope",
962
- "scopePlaceholder": "Choose a scope",
963
- "create": "Create key",
964
- "formLabel": "Create a key",
965
- "scopeIsAuthTitle": "The scope is the only permission",
966
- "scopeIsAuthBody": "A key can reach exactly what its scope lists and nothing else. It does not use roles or table permissions, and it cannot read anything through the rest of the API.",
967
- "appLabel": "Lier à une surface d’app hébergée (facultatif)",
968
- "appHint": "La surface client de l’app sert alors cette clé elle-même — la faire tourner n’exige aucune recompilation.",
969
- "appNone": "Non liée"
1190
+ "preview": {
1191
+ "note": "Une illustration de la disposition, pas de vos données. La vraie page se remplit une fois enregistrée.",
1192
+ "untitled": "Page sans titre"
1193
+ },
1194
+ "row": {
1195
+ "menu": "Actions pour {title}"
1196
+ },
1197
+ "sidebar": {
1198
+ "discard": "Abandonner",
1199
+ "emptyGroup": "Aucune page dans ce groupe.",
1200
+ "help": "Réordonnez les pages au sein d’un groupe, ou déplacez-en une vers un autre groupe. Les changements s’appliquent à tout le monde.",
1201
+ "moveDown": "Descendre {title}",
1202
+ "moveTo": "Déplacer {title} vers un groupe",
1203
+ "moveUp": "Monter {title}",
1204
+ "save": "Enregistrer l’ordre",
1205
+ "saveFailed": "Impossible d’enregistrer le nouvel ordre",
1206
+ "ungrouped": {
1207
+ "body": "Ces pages fonctionnent à leur URL mais n’apparaissent nulle part dans la barre latérale. Ouvrez chacune d’elles et choisissez un groupe.",
1208
+ "title": "Certaines pages n’appartiennent à aucun groupe"
1209
+ }
970
1210
  },
971
1211
  "status": {
972
- "heading": "Status"
973
- }
974
- },
975
- "hostedApps": {
976
- "title": "Apps hébergées",
977
- "subtitle": "Les surfaces d’app que cette instance sert — où chacune apparaît, et les domaines qui pointent vers elles.",
978
- "error": "Un problème est survenu",
979
- "emptyTitle": "Aucune surface d’app n’est servie",
980
- "emptyBody": "Pointez ADMINIUM_SURFACES_DIR vers un répertoire de surfaces compilées — un dossier par app et par côté, chacun avec son index.html — puis redémarrez. Elles sont alors servies sous /apps/ et apparaissent ici.",
981
- "surfaces": {
982
- "title": "Surfaces",
983
- "subtitle": "Une surface équipe peut se fondre dans la barre latérale de ce tableau de bord ou rester autonome ; une surface client est publique et lit via sa clé liée.",
984
- "staff": "Équipe",
985
- "customer": "Client",
986
- "noNav": "Placement interne indisponible — recompilez cette surface avec le toolkit actuel pour qu’elle émette surface.json.",
987
- "noKey": "Aucune clé liée — cette surface ne peut pas lire de données tant qu’une clé n’est pas créée pour elle.",
988
- "mintLink": "En créer une sous API publique",
989
- "boundKey": "Sert la clé",
990
- "placementLabel": "Placement",
991
- "placementInternal": "Dans la barre latérale (fondue)",
992
- "placementExternal": "Externe (URL propre uniquement)",
993
- "connectionLabel": "Lit",
994
- "connectionUnset": "Celle qui est active"
1212
+ "hidden": "Masquée",
1213
+ "live": "Active"
995
1214
  },
996
- "domains": {
997
- "title": "Domaines",
998
- "subtitle": "Pointez le DNS d’un domaine vers votre proxy, transmettez l’en-tête Host à Adminium, puis attachez-le ici — cet hôte sert alors la surface au lieu de ce tableau de bord. Les certificats restent sur votre proxy.",
999
- "issuesTitle": "La carte des domaines a été refusée",
1000
- "savedTitle": "Enregistré",
1001
- "savedBody": "Les attributions prennent effet en quelques secondes. Un hôte ne répond que lorsque son DNS et votre proxy atteignent réellement cette instance.",
1002
- "none": "Aucun domaine attaché.",
1003
- "hostLabel": "Hôte",
1004
- "surfaceLabel": "Surface",
1005
- "remove": "Retirer",
1006
- "add": "Attacher un domaine",
1007
- "save": "Enregistrer les domaines",
1008
- "instanceLabel": "Instance",
1009
- "instanceOwn": "L'application elle-même"
1215
+ "subtitle": "Ajoutez, modifiez et organisez les pages de votre application, ainsi que leur ordre dans la barre latérale.",
1216
+ "tab": {
1217
+ "pages": "Toutes les pages",
1218
+ "sidebar": "Ordre de la barre latérale"
1010
1219
  },
1011
- "instances": {
1012
- "title": "Instances",
1013
- "body": "Servir la même application sur plusieurs bases. Chaque instance est accessible à /apps/<app>/<segment>/<côté>/ et ne lit que la connexion que vous lui donnez.",
1014
- "appLabel": "Application",
1015
- "slugLabel": "Segment d'URL",
1016
- "readsLabel": "Lit",
1017
- "add": "Ajouter une instance",
1018
- "save": "Enregistrer les instances",
1019
- "remove": "Retirer",
1020
- "empty": "Aucune instance supplémentaire.",
1021
- "failed": "Les instances n'ont pas été enregistrées"
1220
+ "title": "Pages",
1221
+ "width": {
1222
+ "content": "Contenu (900 px)",
1223
+ "dash": "Tableau de bord (1320 px)",
1224
+ "default": "Valeur par défaut de ce modèle",
1225
+ "full": "Pleine largeur (sans limite)",
1226
+ "narrow": "Étroite (720 px)",
1227
+ "page": "Page (1080 px)",
1228
+ "wide": "Large (1800 px)"
1022
1229
  }
1023
1230
  },
1024
- "addOns": {
1025
- "plan": {
1026
- "blocked": "Impossible d’installer ici",
1027
- "needsColumns": "Ce module a besoin de colonnes que vous n’avez pas",
1028
- "needsColumnsBody": "Adminium n’ajoute pas de colonnes aux tables qui vous appartiennent déjà. Ajoutez-les vous-même, puis installez.",
1029
- "willCreate": "Cela créera des tables dans votre base de données",
1030
- "willCreateBody": "L’installation crée ces tables. Une désinstallation ultérieure les laisse intactes, ainsi que leurs données.",
1031
- "noData": "Ce module ne lit ni n’écrit de tables qui lui soient propres.",
1032
- "reuse": "Ce module utilisera des tables que vous avez déjà :"
1033
- },
1034
- "consent": {
1035
- "title": "Installer {name}",
1036
- "subtitle": "Ce que ce module fera, avant qu’il puisse le faire.",
1037
- "close": "Fermer",
1038
- "loading": "Analyse de ce que cela ferait…",
1039
- "hosts": "Attacher à",
1040
- "cancel": "Annuler",
1041
- "confirm": "Installer"
1042
- },
1043
- "connect": {
1044
- "apiKey": "Clé API",
1045
- "submit": "Connecter"
1046
- },
1047
- "title": "Modules",
1048
- "subtitle": "Des capacités supplémentaires pour vos applications — expédition, graphisme, données. Chacune indique ce dont elle a besoin avant l’installation.",
1049
- "error": "Une erreur est survenue",
1050
- "browse": {
1051
- "title": "Disponibles",
1052
- "online": "Inclut les modules du catalogue en ligne. Rechercher des versions plus récentes est une action distincte.",
1053
- "offline": "Affiche les modules livrés avec cette version. La navigation en ligne est désactivée et rien ici n’a contacté Internet.",
1054
- "refresh": "Rechercher des nouveautés",
1055
- "emptyTitle": "Aucun module disponible",
1056
- "emptyBody": "Cette version n’en contient aucun et le catalogue en ligne est désactivé.",
1057
- "bundled": "Inclus",
1058
- "upgrade": "v{version} disponible",
1059
- "download": "Télécharger",
1060
- "install": "Installer",
1061
- "discard": "Supprimer",
1062
- "upgradeAction": "Mettre à jour",
1063
- "toggle": "Parcourir le catalogue en ligne"
1231
+ "publicApi": {
1232
+ "cancel": "Annuler",
1233
+ "close": "Fermer",
1234
+ "error": "Un problème est survenu",
1235
+ "keys": {
1236
+ "appHint": "La surface client de l’app sert alors cette clé elle-même — la faire tourner n’exige aucune recompilation.",
1237
+ "appLabel": "Lier à une surface d’app hébergée (facultatif)",
1238
+ "appNone": "Non liée",
1239
+ "create": "Créer la clé",
1240
+ "emptyBody": "Créez d’abord une portée, puis créez-lui une clé.",
1241
+ "emptyTitle": "Aucune clé pour l’instant",
1242
+ "formLabel": "Créer une clé",
1243
+ "nameLabel": "Nom",
1244
+ "reveal": "Afficher la clé",
1245
+ "revoke": "Révoquer",
1246
+ "rotate": "Faire tourner",
1247
+ "scopeIsAuthBody": "Une clé atteint exactement ce que sa portée énumère, et rien d’autre. Elle n’utilise ni les rôles ni les autorisations de table, et elle ne peut rien lire via le reste de l’API.",
1248
+ "scopeIsAuthTitle": "La portée est la seule autorisation",
1249
+ "scopeLabel": "Portée",
1250
+ "scopePlaceholder": "Choisissez une portée",
1251
+ "subtitle": "Elles vont dans le JavaScript de votre page, donc n’importe qui peut les lire. C’est normal — une clé ne peut jamais faire que ce que sa portée autorise.",
1252
+ "title": "Clés"
1064
1253
  },
1065
- "installed": {
1066
- "title": "Installés",
1067
- "emptyTitle": "Rien d’installé pour l’instant",
1068
- "emptyBody": "Installez un module ci-dessus et il apparaîtra ici avec ses hôtes et sa connexion.",
1069
- "connected": "Connecté",
1070
- "notConnected": "Non connecté",
1071
- "egress": "Peut contacter : {hosts}",
1072
- "on": "activé",
1073
- "off": "désactivé",
1074
- "disconnect": "Déconnecter",
1075
- "uninstall": "Désinstaller"
1254
+ "notRegistered": {
1255
+ "body": "Définissez ADMINIUM_PUBLIC_API_ORIGINS avec les origines exactes autorisées à l’appeler, puis redémarrez. D’ici là, ces routes ne sont pas servies du tout.",
1256
+ "title": "Non activée sur ce serveur"
1076
1257
  },
1077
- "confirm": {
1078
- "close": "Fermer",
1079
- "disconnectTitle": "Déconnecter ce module",
1080
- "uninstallTitle": "Désinstaller ce module",
1081
- "discardTitle": "Supprimer ce téléchargement",
1082
- "disconnectBody": "Ses clés sont supprimées et il cesse ses appels. Chaque table et chaque ligne qu’il a créées restent telles quelles, et vous pouvez le reconnecter à tout moment.",
1083
- "uninstallBody": "Ses clés sont supprimées et ses fichiers retirés de ce serveur. Chaque table et chaque ligne qu’il a créées restent telles quelles. Vous pourrez le réinstaller plus tard.",
1084
- "discardBody": "Les fichiers téléchargés sont supprimés. Rien n’a été installé, donc rien d’autre ne change — vous pouvez le retélécharger quand vous voulez.",
1085
- "cancel": "Annuler",
1086
- "disconnect": "Déconnecter",
1087
- "uninstall": "Désinstaller",
1088
- "discard": "Supprimer"
1258
+ "origins": {
1259
+ "label": "Origines autorisées à l’appeler"
1089
1260
  },
1090
- "upgradeNote": "La mise à jour conserve les hôtes auxquels un module est attaché ainsi que sa connexion existante.",
1091
- "job": {
1092
- "title": "Téléchargement",
1093
- "body": "Récupération et vérification. Rien n’est installé sans votre accord.",
1094
- "failed": "Le téléchargement ne s’est pas terminé. Rien na été installé."
1261
+ "scopes": {
1262
+ "connectionLabel": "Identifiant de connexion",
1263
+ "create": "Créer la portée",
1264
+ "delete": "Supprimer",
1265
+ "deleteBody": "Toute page utilisant une clé liée à cette portée cesse de charger des données. Les clés ne sont pas supprimées révoquez-les dabord si c’est ce que vous vouliez.",
1266
+ "deleteConfirm": "Supprimer la portée",
1267
+ "deletePrompt": "Saisissez le nom de la portée pour confirmer",
1268
+ "deleteTitle": "Supprimer cette portée",
1269
+ "documentHint": "Compilé par rapport à votre schéma lors de l’enregistrement. Toutes les colonnes qu’un appelant peut atteindre sont listées ici et nulle part ailleurs. Une valeur par défaut peut être '{'\"$generate\": \"uuid\"'}' ou '{'\"$generate\": \"now\"'}' — le serveur les remplit à la création, pour qu’un visiteur puisse ajouter une ligne sans choisir son id.",
1270
+ "documentLabel": "Document de portée",
1271
+ "emptyBody": "Créez-en une ci-dessous. Elle est vérifiée par rapport à votre schéma actif avant d’être enregistrée.",
1272
+ "emptyTitle": "Aucune portée pour l’instant",
1273
+ "formLabel": "Créer une portée",
1274
+ "issuesTitle": "Cette portée n’a pas compilé",
1275
+ "keyCount": "{count, plural, =0 {aucune clé} one {# clé} other {# clés}}",
1276
+ "nameLabel": "Nom",
1277
+ "subtitle": "Une portée est tout ce qu’une clé peut atteindre — les tables, les colonnes exactes et un filtre que l’appelant peut restreindre mais jamais retirer.",
1278
+ "title": "Portées"
1095
1279
  },
1096
- "veto": {
1097
- "title": "Ce déploiement ne peut pas consulter le catalogue en ligne",
1098
- "body": "Le réglage est enregistré, mais les fonctions réseau sont coupées sur ce serveur et cela prime. Les modules déjà téléchargés fonctionnent, et vous pouvez en téléverser un."
1280
+ "status": {
1281
+ "heading": "Statut"
1099
1282
  },
1100
- "sideload": {
1101
- "title": "Téléverser un paquet",
1102
- "hint": "Pour un serveur sans internet. Vérifié exactement comme un téléchargement, il lui faut donc l’empreinte fournie.",
1103
- "file": "Fichier du paquet (.tgz)",
1104
- "key": "Clé du module",
1105
- "version": "Version",
1106
- "sha": "Intégrité (sha512-…)",
1107
- "shaHint": "La valeur `integrity` affichée par `npm pack --json`. Refusé si les octets n’y correspondent pas.",
1108
- "submit": "Téléverser"
1283
+ "subtitle": "Laissez vos propres pages destinées aux clients ou au personnel lire cette base de données, via une portée que vous définissez.",
1284
+ "title": "API publique",
1285
+ "toggle": {
1286
+ "hint": "La désactiver arrête immédiatement toutes les requêtes publiques. Rien n’est supprimé — les clés, les portées et les données sont conservées.",
1287
+ "label": "Servir l’API publique"
1109
1288
  }
1110
1289
  },
1111
- "pages": {
1112
- "title": "Pages",
1113
- "subtitle": "Ajoutez, modifiez et organisez les pages de votre application, ainsi que leur ordre dans la barre latérale.",
1114
- "createButton": "Nouvelle page",
1115
- "loadFailed": {
1116
- "title": "Impossible de charger les pages",
1117
- "body": "La gestion des pages requiert l’autorisation « Gérer les pages ». Demandez à un administrateur de l’attribuer à l’un de vos rôles."
1290
+ "remap": {
1291
+ "badge": {
1292
+ "fk": "FK",
1293
+ "masked": "Masquée",
1294
+ "pii": "PII",
1295
+ "pk": "PK",
1296
+ "unique": "UNIQUE"
1118
1297
  },
1119
- "tab": {
1120
- "pages": "Toutes les pages",
1121
- "sidebar": "Ordre de la barre latérale"
1298
+ "column": {
1299
+ "currency": "Devise",
1300
+ "currencyHelper": "Code ISO 4217 appliqué au formatage monétaire.",
1301
+ "enum": "Sémantique de l’énumération",
1302
+ "enumCategory": "Catégorie",
1303
+ "enumHelper": "Les énumérations de flux pilotent les pastilles de statut et les colonnes de tableau ; les tonalités associent les valeurs à l’échelle de teintes sémantiques.",
1304
+ "enumKind": "Nature de l’énumération",
1305
+ "enumLabelFor": "Libellé pour {value}",
1306
+ "enumToneAuto": "auto",
1307
+ "enumToneFor": "Tonalité pour {value}",
1308
+ "enumWorkflow": "Flux",
1309
+ "labelHelper": "Inféré : {name}",
1310
+ "labelOverride": "Libellé d’affichage",
1311
+ "logicalType": "Type logique",
1312
+ "logicalTypeHelper": "Inféré : {type} (depuis {dbType}) — mappé par l’adaptateur ; non remplaçable en v1.",
1313
+ "nullable": "nullable",
1314
+ "pii": "Masquer par défaut",
1315
+ "piiHelper": "Les valeurs masquées s’affichent caviardées ; le démasquage requiert la permission data.unmask_pii et est consigné dans le journal d’audit.",
1316
+ "semantic": "Type sémantique",
1317
+ "semanticHelper": "Classificateur : {tag} · confiance {confidence}% · source : {source}",
1318
+ "semanticInferred": "inféré : {tag}",
1319
+ "unclassified": "Pas encore classifié."
1122
1320
  },
1123
- "list": {
1124
- "title": "Pages",
1125
- "count": "{count, plural, one {# page} other {# pages}}"
1321
+ "diff": {
1322
+ "count": "{count} modifications",
1323
+ "one": "1 modification",
1324
+ "regenerate": "Régénérer les pages",
1325
+ "revertAll": "Tout annuler",
1326
+ "revertOne": "Annuler {change}",
1327
+ "save": "Enregistrer les remplacements",
1328
+ "saved": "Remplacements enregistrés."
1126
1329
  },
1127
1330
  "empty": {
1128
- "title": "Aucune page pour l’instant",
1129
- "body": "Connectez une base de données pour générer des pages automatiquement, ou créez-en une à la main."
1331
+ "description": "Sélectionnez un élément dans l’arborescence du schéma pour remapper son libellé, son type, ses relations ou son masquage.",
1332
+ "title": "Choisissez une table ou une colonne"
1130
1333
  },
1131
- "status": {
1132
- "live": "Active",
1133
- "hidden": "Masquée"
1334
+ "inspector": "Inspecteur",
1335
+ "loadFailed": "Impossible de charger le schéma de cette connexion.",
1336
+ "mode": {
1337
+ "design": "Conception",
1338
+ "diagram": "Diagramme",
1339
+ "remap": "Libellés et relations"
1134
1340
  },
1135
- "origin": {
1136
- "generated": "Générée",
1137
- "manifest": "Extension",
1138
- "llm": "Assistant",
1341
+ "modeLabel": "Mode d’édition",
1342
+ "noDesign": {
1343
+ "noPrivilege": "Le rôle de cette connexion ne peut ni créer ni modifier de tables. Accordez-lui des privilèges de schéma, ou connectez un rôle qui en dispose.",
1344
+ "readOnlyIntent": "Cette connexion a été configurée pour de l'analytique en lecture seule. Modifiez son intention dans les Paramètres pour modifier son schéma.",
1345
+ "readOnlyRole": "Cette connexion utilise un rôle en lecture seule ; Adminium ne peut donc pas modifier son schéma.",
1346
+ "schemaFile": "Cette connexion a été créée à partir d'un fichier de schéma ; il n'y a donc aucune base de données à modifier. Les libellés et les relations fonctionnent toujours."
1347
+ },
1348
+ "relations": {
1349
+ "accept": "Accepter",
1350
+ "accepted": "Acceptée",
1351
+ "add": "Ajouter une relation virtuelle",
1352
+ "addButton": "Ajouter la relation",
1353
+ "cardinality": "Cardinalité",
1354
+ "confidence": "inférée · {pct}%",
1355
+ "declared": "Clés étrangères déclarées",
1356
+ "fromColumn": "Colonne source",
1357
+ "fromPlaceholder": "customer_id",
1358
+ "inferred": "Relations inférées",
1359
+ "noColumns": "Aucune colonne correspondante",
1360
+ "noTables": "Aucune table correspondante",
1361
+ "noneDeclared": "Aucune clé étrangère déclarée ne touche cette table.",
1362
+ "noneInferred": "Rien d’inféré pour cette table.",
1363
+ "overrideBadge": "remplacement",
1364
+ "overrides": "Relations de remplacement (appliquées)",
1365
+ "suppress": "Écarter",
1366
+ "suppressed": "Écartée",
1367
+ "toColumn": "Colonne cible",
1368
+ "toTable": "Table cible"
1369
+ },
1370
+ "saveFailed": "Échec de l’enregistrement : {message}",
1371
+ "subtitle": "{tables} tables · {applied} remplacements appliqués",
1372
+ "table": {
1373
+ "hierarchy": "Hiérarchie",
1374
+ "icon": "Icône",
1375
+ "iconPicker": "Icône de la table",
1376
+ "include": "Inclure dans l’application générée",
1377
+ "includeHelper": "Les tables exclues n’ont aucune page et disparaissent de la navigation.",
1378
+ "kind": "Nature",
1379
+ "labelHelper": "Inféré : {name}",
1380
+ "labelOverride": "Libellé d’affichage",
1381
+ "navGroup": "Groupe de navigation",
1382
+ "navGroupHelper": "Le placement dans la navigation est décidé par le générateur — un remplacement table.navGroup ne fait pas partie du vocabulaire v1.",
1383
+ "polymorphic": "Paires polymorphes",
1384
+ "role": "Rôle",
1385
+ "rows": "Estimation du nombre de lignes",
1386
+ "selfFk": "Auto-référence via {column}",
1387
+ "shape": "Forme de la table (classifiée)",
1388
+ "shapeHelper": "La classification est recalculée à chaque introspection ; les remplacements se superposent et survivent à la régénération.",
1139
1389
  "system": "Système",
1140
- "user": "Personnalisée"
1390
+ "unclassified": "Non classifiée"
1141
1391
  },
1142
- "row": {
1143
- "menu": "Actions pour {title}"
1392
+ "tabs": {
1393
+ "details": "Détails",
1394
+ "relations": "Relations"
1144
1395
  },
1145
- "action": {
1146
- "edit": "Modifier la page",
1147
- "duplicate": "Dupliquer",
1148
- "hide": "Masquer dans la barre latérale",
1149
- "show": "Afficher dans la barre latérale",
1150
- "delete": "Supprimer la page"
1396
+ "title": "Schéma",
1397
+ "toast": {
1398
+ "regenerateFailed": "Échec de la régénération",
1399
+ "regenerated": "{created} créées · {updated} mises à jour · {unchanged} inchangées",
1400
+ "regeneratedDetail": "Les pages que vous avez modifiées à la main sont préservées — seules les pages dont le generated_hash est intact ont été régénérées sur place.",
1401
+ "saved": "Remplacements de schéma enregistrés",
1402
+ "savedDetail": "Le schéma appliqué ci-dessous reflète vos modifications."
1151
1403
  },
1152
- "create": {
1153
- "title": "Nouvelle page",
1154
- "failed": "Impossible de créer la page",
1155
- "submit": "Créer la page",
1156
- "subtitle": "Choisissez ce que cette page affiche et son apparence. L’aperçu suit vos choix."
1404
+ "tree": {
1405
+ "collapse": "Replier la table",
1406
+ "excluded": "Exclue",
1407
+ "expand": "Déplier la table",
1408
+ "label": "Schéma",
1409
+ "noMatches": "Aucune table ne correspond à votre recherche.",
1410
+ "search": "Rechercher des tables et des colonnes",
1411
+ "searchPlaceholder": "Rechercher des tables…",
1412
+ "unsaved": "Modification non enregistrée"
1157
1413
  },
1158
- "duplicate": {
1159
- "title": "Dupliquer la page",
1160
- "failed": "Impossible de dupliquer la page",
1161
- "submit": "Dupliquer"
1414
+ "unavailableBody": "Cette version n’inclut pas encore l’éditeur de remappage (09-T12). Relancez la génération une fois qu’il sera disponible pour remapper les libellés, les types et les relations.",
1415
+ "unavailableTitle": "Éditeur de remappage du schéma indisponible"
1416
+ },
1417
+ "review": {
1418
+ "unavailableBody": "Cette version n’inclut pas encore l’écran de revue d’enrichissement (06-T14). Il arrive avec le flux diff-et-application.",
1419
+ "unavailableTitle": "Écran de revue indisponible"
1420
+ },
1421
+ "settings": {
1422
+ "globalDefaultsNav": "Valeurs par défaut globales",
1423
+ "title": "Paramètres",
1424
+ "workspaceSection": "Espace de travail"
1425
+ },
1426
+ "settingsAi": {
1427
+ "byo": {
1428
+ "body": "Studio peut générer un prompt autonome à partir de votre schéma. Exécutez-le dans Claude Code, ChatGPT ou l’outil de votre choix, puis collez le JSON renvoyé dans l’assistant de connexion. Même validation, même revue, même résultat que la voie directe.",
1429
+ "guarantee1": "Le prompt ne contient que votre schéma et des statistiques agrégées — jamais de données de lignes par défaut.",
1430
+ "guarantee2": "Aucun identifiant, URL d’instance ni justificatif n’y est intégré.",
1431
+ "guarantee3": "Les exécutions BYO ne font aucun appel réseau.",
1432
+ "guaranteeTitle": "Garantie sans télémétrie",
1433
+ "heading": "Pas de clé ? Utilisez votre propre outil IA",
1434
+ "headingRecommended": "Utilisez votre propre outil IA — aucune clé requise",
1435
+ "promptVersion": "Prompt {version}",
1436
+ "recommended": "Recommandé",
1437
+ "schemaVersion": "Schéma {version}",
1438
+ "subtitle": "L’aller-retour copier-coller — rien ne quitte cette machine."
1162
1439
  },
1163
- "delete": {
1164
- "title": "Supprimer cette page ?",
1165
- "body": "Cette action est irréversible. Les vues enregistrées et les dispositions personnelles de cette page sont supprimées pour tout le monde.",
1166
- "bodyGenerated": "Cette page provient de la génération du schéma : elle réapparaîtra à la prochaine génération. Les vues enregistrées et les dispositions personnelles sont supprimées pour tout le monde.",
1167
- "prompt": "Saisissez {slug} pour confirmer",
1168
- "confirm": "Supprimer la page"
1440
+ "configure": {
1441
+ "heading": "Configurer {provider}"
1169
1442
  },
1170
1443
  "field": {
1171
- "title": "Titre",
1172
- "titleHint": "Affiché dans la barre latérale et dans l’en-tête de la page.",
1173
- "slug": "Adresse de la page",
1174
- "slugHint": "Minuscules, chiffres et tirets. Seulement la dernière partie — le reste de l’adresse est ajouté pour vous.",
1175
- "slugTaken": "Une autre page utilise déjà cette adresse.",
1176
- "slugWarning": "Modifier l’adresse casse les liens et les favoris existants vers cette page.",
1177
- "template": "Modèle",
1178
- "templateHint": "Détermine ce que la page peut contenir. Modifiable par la suite.",
1179
- "group": "Groupe de la barre latérale",
1180
- "groupHint": "La section de la barre latérale où elle apparaît.",
1181
- "icon": "Icône",
1182
- "iconHint": "Affichée à côté du nom de la page dans la barre latérale.",
1183
- "visible": "Afficher dans la barre latérale",
1184
- "visibleHint": "Une page masquée reste accessible à son URL pour qui possède le lien.",
1185
- "table": "Table",
1186
- "tableCreateHint": "La table que cette page lit. Choisissez-en une maintenant et la page est prête à l’emploi ; laissez vide pour la lier plus tard.",
1187
- "tableNone": "Non liée",
1188
- "tableNeedsConnection": "Choisissez d’abord une source de données.",
1189
- "connection": "Source de données",
1190
- "connectionNone": "Aucune",
1191
- "iconPick": "Choisir l’icône de la page",
1192
- "padding": "Marge de la page",
1193
- "width": "Largeur du contenu",
1194
- "widthHint": "Largeur maximale de la colonne de contenu de la page sur un grand écran."
1444
+ "baseUrl": "URL de base",
1445
+ "baseUrlHelper": "La racine du point de terminaison qui sert /chat/completions.",
1446
+ "baseUrlOptional": "Laissez tel quel, sauf si Ollama tourne sur un autre hôte.",
1447
+ "key": "Clé API",
1448
+ "keyMask": "sk-…{last4}",
1449
+ "keyOptional": "Facultatif certains points de terminaison n’exigent aucune clé.",
1450
+ "keyReplace": "Remplacer la clé",
1451
+ "keyStored": "Stockée chiffrée. Remplacez-la pour utiliser une autre clé.",
1452
+ "keyWriteOnly": "En écriture seule : une fois enregistrée, elle n’est jamais réaffichée.",
1453
+ "model": "Modèle",
1454
+ "modelFreeText": "Saisissez l’identifiant exact du modèle servi par votre point de terminaison.",
1455
+ "modelLive": "Chargé en direct depuis le fournisseur.",
1456
+ "modelLoading": "Chargement…",
1457
+ "modelPlaceholder": "Sélectionner un modèle…",
1458
+ "modelStatic": "Une liste éprouvée ; saisissez un identifiant personnalisé après l’enregistrement pour l’actualiser.",
1459
+ "noKeyBody": "Ollama tourne localement, donc rien ne quitte cette machine.",
1460
+ "noKeyTitle": "Aucune clé API requise"
1195
1461
  },
1196
- "editor": {
1197
- "title": "Modifier la page",
1198
- "save": "Enregistrer les modifications",
1199
- "saveFailed": "Impossible d’enregistrer les modifications",
1200
- "openPage": "Ouvrir la page",
1201
- "generated": {
1202
- "title": "Cette page a été générée à partir de votre schéma",
1203
- "body": "Vos modifications sont conservées lors d’une nouvelle génération : la page est marquée comme modifiée et laissée intacte. En revanche, une suppression ne tient que jusqu’à ce que la génération suivante la recrée."
1462
+ "history": {
1463
+ "byo": "BYO",
1464
+ "colChunks": "Blocs",
1465
+ "colDate": "Date",
1466
+ "colSource": "Source",
1467
+ "colStatus": "Statut",
1468
+ "connection": "Connexion",
1469
+ "directPath": "Directe",
1470
+ "empty": "Aucune exécution d’enrichissement pour l’instant. Enrichissez un schéma depuis l’assistant de connexion pour voir l’historique ici.",
1471
+ "errorBody": "Rechargez la page pour réessayer.",
1472
+ "errorTitle": "Impossible de charger les exécutions",
1473
+ "heading": "Historique des exécutions",
1474
+ "noConnections": "Connectez d’abord une base de données — les exécutions d’enrichissement sont enregistrées par connexion.",
1475
+ "openReview": "Ouvrir la revue de l’exécution du {date}",
1476
+ "subtitle": "Exécutions d’enrichissement passées. Ouvrez-en une pour revoir ses suggestions.",
1477
+ "tableLabel": "Exécutions d’enrichissement"
1478
+ },
1479
+ "provider": {
1480
+ "active": "Actif",
1481
+ "anthropic": {
1482
+ "desc": "Modèles Claude via l’API Anthropic.",
1483
+ "label": "Anthropic"
1204
1484
  },
1205
- "contentUnavailable": "Impossible de charger le contenu de la page",
1206
- "contentUnavailableBody": "Les informations ci-dessus peuvent tout de même être enregistrées.",
1207
- "contentInvalid": "La configuration de cette page est illisible",
1208
- "contentInvalidBody": "Elle provient d’une version plus récente, ou elle est corrompue. Régénérez la page ou supprimez-la.",
1209
- "data": "Données",
1210
- "schemaFailed": "Impossible de lister les tables",
1211
- "schemaFailedBody": "Cette connexion n’a peut-être pas encore été analysée. Lancez l’introspection depuis Studio → Connexions de données.",
1212
- "notBindable": "Ce modèle n’est pas lié à une seule table",
1213
- "notBindableBody": "Son contenu se construit widget par widget. Ouvrez la page et utilisez « Modifier » pour les ajouter.",
1214
- "recompose": "Cette page va être reconstruite",
1215
- "recomposeBody": "L’enregistrement remplace son contenu par une nouvelle disposition pour le modèle et la table ci-dessus. Les ajustements de colonnes et les modifications de widgets de cette page seront perdus.",
1216
- "missing": "Cette page n’existe plus",
1217
- "missingBody": "Elle a peut-être été supprimée, ou retirée par une génération.",
1218
- "details": "Détails",
1219
- "itemsPending": "Enregistrez d’abord la modification ci-dessus — le contenu de la page est reconstruit à partir du nouveau modèle et de la nouvelle table.",
1220
- "columns": "Colonnes",
1221
- "appearance": "Apparence"
1485
+ "heading": "Fournisseur IA",
1486
+ "networkDisabledBody": "Cet Adminium est configuré sans accès Internet sortant : il ne peut joindre aucune API de fournisseur. Utilisez l'aller-retour copier-coller ci-dessous ni clé ni réseau requis.",
1487
+ "networkDisabledTitle": "Les fournisseurs IA directs sont désactivés sur cette installation",
1488
+ "ollama": {
1489
+ "desc": "Modèles exécutés localement via Ollama — sans clé, sans cloud.",
1490
+ "label": "Ollama (local)"
1491
+ },
1492
+ "openai": {
1493
+ "desc": "Modèles GPT via l’API OpenAI.",
1494
+ "label": "OpenAI"
1495
+ },
1496
+ "openaiCompatible": {
1497
+ "desc": "Tout point de terminaison au format OpenAI — Groq, Together, vLLM, LM Studio.",
1498
+ "label": "Compatible OpenAI"
1499
+ },
1500
+ "requiresNetwork": "Nécessite Internet et une clé API",
1501
+ "subtitle": "Choisissez comment Adminium atteint un modèle pour enrichir votre schéma. Les clés sont stockées chiffrées et ne sont jamais réaffichées."
1222
1502
  },
1223
- "sidebar": {
1224
- "help": "Réordonnez les pages au sein d’un groupe, ou déplacez-en une vers un autre groupe. Les changements s’appliquent à tout le monde.",
1225
- "discard": "Abandonner",
1226
- "save": "Enregistrer l’ordre",
1227
- "saveFailed": "Impossible d’enregistrer le nouvel ordre",
1228
- "emptyGroup": "Aucune page dans ce groupe.",
1229
- "moveUp": "Monter {title}",
1230
- "moveDown": "Descendre {title}",
1231
- "moveTo": "Déplacer {title} vers un groupe",
1232
- "ungrouped": {
1233
- "title": "Certaines pages n’appartiennent à aucun groupe",
1234
- "body": "Ces pages fonctionnent à leur URL mais napparaissent nulle part dans la barre latérale. Ouvrez chacune d’elles et choisissez un groupe."
1503
+ "runStatus": {
1504
+ "applied": "Appliqué",
1505
+ "awaitingResponse": "En attente de réponse",
1506
+ "discarded": "Abandonné",
1507
+ "draft": "Brouillon",
1508
+ "failed": "Échoué",
1509
+ "partiallyApplied": "Partiellement appliqué",
1510
+ "running": "En cours",
1511
+ "validated": "Validé"
1512
+ },
1513
+ "save": "Enregistrer le fournisseur",
1514
+ "saveFailed": "Impossible denregistrer le fournisseur IA. Réessayez.",
1515
+ "saved": "Fournisseur IA enregistré",
1516
+ "subtitle": "Connectez un modèle pour qu’Adminium suggère des libellés, des groupes, des relations et plus encore — toujours revus sous forme de diff avant toute application.",
1517
+ "test": "Tester la connexion",
1518
+ "testError": "Échec du test",
1519
+ "testErrorBody": "Impossible de joindre le fournisseur. Vérifiez la clé et l’URL de base.",
1520
+ "testHintDirty": "Enregistrez vos modifications avant de tester.",
1521
+ "testOk": "Connecté à {model} en {latency} ms",
1522
+ "testUnknownModel": "le fournisseur",
1523
+ "testing": "Test du fournisseur en cours…",
1524
+ "title": "Enrichissement par IA"
1525
+ },
1526
+ "settingsHub": {
1527
+ "addOnsCard": {
1528
+ "body": "Parcourez, installez et connectez des modules — blocs supplémentaires, packs de données et intégrations — ou téléversez-en un vous-même.",
1529
+ "cta": "Ouvrir les modules",
1530
+ "heading": "Modules"
1531
+ },
1532
+ "aiCard": {
1533
+ "body": "Configurez un fournisseur IA (ou l’aller-retour copier-coller) pour enrichir libellés, groupes et relations.",
1534
+ "cta": "Ouvrir les réglages IA",
1535
+ "heading": "Enrichissement par IA"
1536
+ },
1537
+ "danger": {
1538
+ "deleteCta": "Supprimer la connexion",
1539
+ "deleteDesc": "Supprime la connexion et les pages générées. Votre base de données n’est pas touchée. Irréversible.",
1540
+ "empty": "Rien à supprimer — aucune connexion pour l’instant.",
1541
+ "heading": "Zone de danger",
1542
+ "subtitle": "Actions irréversibles."
1543
+ },
1544
+ "defaultsCard": {
1545
+ "body": "Le thème, la couleur d’accent, la densité et la langue de tout l’espace de travail se trouvent dans les valeurs par défaut globales.",
1546
+ "cta": "Ouvrir les valeurs par défaut globales",
1547
+ "heading": "Valeurs par défaut d’apparence et de langue"
1548
+ },
1549
+ "email": {
1550
+ "attachmentCap": {
1551
+ "error": "Entre {min, number} et {max, number} Mo.",
1552
+ "helper": "La taille maximale des pièces jointes d’un même message.",
1553
+ "label": "Limite des pièces jointes (Mo)"
1554
+ },
1555
+ "from": {
1556
+ "error": "Saisissez une adresse e-mail.",
1557
+ "helper": "Une adresse seule, ou un nom d’affichage devant.",
1558
+ "label": "Adresse d’expéditeur"
1559
+ },
1560
+ "heading": "E-mail (SMTP)",
1561
+ "host": {
1562
+ "error": "Un nom d’hôte ou une adresse IP uniquement — sans schéma, port ni identifiants.",
1563
+ "label": "Hôte SMTP"
1564
+ },
1565
+ "pass": {
1566
+ "error": "Ce nom d’utilisateur exige un mot de passe.",
1567
+ "helper": "Chiffré au stockage et jamais réaffiché. Laissez vide pour conserver l’actuel.",
1568
+ "label": "Mot de passe"
1569
+ },
1570
+ "port": {
1571
+ "error": "Entre {min, number} et {max, number}.",
1572
+ "label": "Port"
1573
+ },
1574
+ "remove": "Supprimer le serveur de messagerie",
1575
+ "review": {
1576
+ "password": "Remplacé",
1577
+ "removed": "Supprimé"
1578
+ },
1579
+ "secure": {
1580
+ "helper": "Activé pour le port 465. Désactivé démarre en clair puis passe à STARTTLS, ce qu’attend le port 587.",
1581
+ "label": "TLS implicite"
1582
+ },
1583
+ "senders": {
1584
+ "add": "Ajouter un expéditeur",
1585
+ "address": "Adresse",
1586
+ "error": "Saisissez une adresse e-mail.",
1587
+ "heading": "Expéditeurs",
1588
+ "helper": "Adresses depuis lesquelles un e-mail peut être envoyé. L’adresse d’expédition SMTP est toujours disponible.",
1589
+ "implicit": "Adresse d’expédition SMTP",
1590
+ "name": "Nom affiché",
1591
+ "remove": "Retirer l’expéditeur",
1592
+ "review": "Expéditeurs"
1593
+ },
1594
+ "unconfigured": "Aucun serveur de messagerie n’est configuré, donc Adminium ne peut envoyer ni réinitialisation de mot de passe, ni invitation, ni rapport planifié.",
1595
+ "user": {
1596
+ "helper": "Laissez vide si le relais ne demande pas d’authentification.",
1597
+ "label": "Nom d’utilisateur"
1235
1598
  }
1236
1599
  },
1237
- "columns": {
1238
- "help": "Glissez pour réordonner les colonnes, renommez leurs en-têtes et choisissez celles qui apparaissent dans le tableau.",
1239
- "empty": "Pas encore de colonnes ajoutez-en ci-dessous.",
1240
- "pk": "Clé",
1241
- "pii": "PII",
1242
- "header": "En-tête de {name}",
1243
- "shown": "Affichée",
1244
- "toggle": "Afficher {name} dans le tableau",
1245
- "dragHandle": "Réordonner {name}",
1246
- "remove": "Retirer {name}",
1247
- "addOpen": "Ajouter une colonne",
1248
- "addTitle": "Ajouter une colonne",
1249
- "addSearch": "Rechercher des colonnes…",
1250
- "addFromTable": "Depuis {table}",
1251
- "addFromLinked": "Depuis les tables liées",
1252
- "addLinkedHelp": "Affiche une valeur de la table vers laquelle pointe une colonne de liaison.",
1253
- "addVia": "via {column}",
1254
- "addNoMatches": "Aucune colonne ne correspond à « {query} ».",
1255
- "followColumn": "Suivre {name}",
1256
- "addLinkedFrom": "Tables qui pointent ici",
1257
- "addLinkedFromHelp": "Ajoute le nombre de lignes qui pointent vers chaque enregistrement.",
1258
- "countBadge": "Nombre",
1259
- "lookupBadge": "Liée",
1260
- "lookupBack": "Retour",
1261
- "lookupBrowse": "Choisissez quoi afficher depuis {table}",
1262
- "lookupBroken": "Ce lien ne se résout plus",
1263
- "lookupBrokenBody": "Le schéma a changé pendant votre navigation. Recommencez le lien.",
1264
- "schemaUnavailable": "Les colonnes de la base n’ont pas pu être listées ; impossible d’ajouter des colonnes ici.",
1265
- "none": {
1266
- "title": "Cette page n’a pas encore de colonnes",
1267
- "body": "Les colonnes sont lues dans la table lors de la génération de la page. Liez cette page à une table puis régénérez pour les renseigner."
1600
+ "identity": {
1601
+ "appName": {
1602
+ "error": "Saisissez un nom de 60 caractères maximum.",
1603
+ "helper": "Affiché dans la barre latérale, le titre du navigateur et les e-mails.",
1604
+ "label": "Nom de l’application"
1605
+ },
1606
+ "heading": "Identité de l’espace de travail",
1607
+ "logo": {
1608
+ "badType": "Choisissez une image PNG, JPEG, WebP, GIF ou SVG.",
1609
+ "drop": "Déposez une image ici",
1610
+ "helper": "PNG, JPEG, WebP, GIF ou SVG, jusqu’à 1 Mo. Remplace la marque intégrée partout.",
1611
+ "label": "Logo",
1612
+ "remove": "Supprimer",
1613
+ "removed": "Logo supprimé",
1614
+ "replace": "Remplacer le logo",
1615
+ "tooLarge": "Cette image dépasse 1 Mo.",
1616
+ "undo": "Annuler",
1617
+ "upload": "Importer un logo",
1618
+ "uploaded": "Logo mis à jour"
1619
+ },
1620
+ "showVersion": {
1621
+ "helper": "Le numéro de build à côté du logo. Désactivé, il masque votre version.",
1622
+ "label": "Version dans la barre latérale"
1268
1623
  }
1269
1624
  },
1270
- "icon": {
1271
- "none": "Choisir une icône",
1272
- "search": "Rechercher des icônes",
1273
- "noMatches": "Aucune icône ne correspond à cette recherche."
1625
+ "pagesCard": {
1626
+ "body": "Ajoutez, modifiez et supprimez des pages, changez leur contenu et réordonnez la barre latérale.",
1627
+ "cta": "Gérer les pages",
1628
+ "heading": "Pages"
1274
1629
  },
1275
- "preview": {
1276
- "untitled": "Page sans titre",
1277
- "note": "Une illustration de la disposition, pas de vos données. La vraie page se remplit une fois enregistrée."
1630
+ "publicApiCard": {
1631
+ "body": "Laissez vos propres pages destinées aux clients ou au personnel lire cette base de données, via une portée que vous définissez.",
1632
+ "cta": "Ouvrir l’API publique",
1633
+ "heading": "API publique"
1278
1634
  },
1279
- "padding": {
1280
- "default": "Par défaut pour ce modèle",
1281
- "none": "Aucune",
1282
- "standard": "Standard (28 × 24)",
1283
- "custom": "Personnalisée…",
1284
- "x": "Côtés (px)",
1285
- "y": "Haut et bas (px)"
1635
+ "review": {
1636
+ "cancel": "Annuler",
1637
+ "change": "{before} → {after}",
1638
+ "close": "Fermer",
1639
+ "confirm": "Enregistrer les modifications",
1640
+ "hidden": "Masqué",
1641
+ "off": "Désactivé",
1642
+ "on": "Activé",
1643
+ "shown": "Affiché",
1644
+ "subtitle": "Vérifiez vos modifications avant d’enregistrer.",
1645
+ "title": "Enregistrer les paramètres de l’espace de travail"
1286
1646
  },
1287
- "width": {
1288
- "default": "Valeur par défaut de ce modèle",
1289
- "narrow": "Étroite (720 px)",
1290
- "content": "Contenu (900 px)",
1291
- "page": "Page (1080 px)",
1292
- "dash": "Tableau de bord (1320 px)",
1293
- "wide": "Large (1800 px)",
1294
- "full": "Pleine largeur (sans limite)"
1647
+ "save": "Enregistrer les modifications",
1648
+ "saveFailed": "Impossible d’enregistrer les paramètres de l’espace de travail. Réessayez.",
1649
+ "saved": "Paramètres de l’espace de travail mis à jour",
1650
+ "security": {
1651
+ "allowSignup": {
1652
+ "desc": "N’importe qui peut créer un compte — désactivé, l’espace de travail reste sur invitation uniquement.",
1653
+ "label": "Autoriser l’auto-inscription"
1654
+ },
1655
+ "heading": "Sécurité",
1656
+ "passwordMin": {
1657
+ "error": "Entre {min, number} et {max, number} caractères.",
1658
+ "label": "Longueur minimale du mot de passe"
1659
+ },
1660
+ "require2fa": {
1661
+ "desc": "Chaque membre doit activer la 2FA pour se connecter.",
1662
+ "label": "Exiger l’authentification à deux facteurs",
1663
+ "note": "Indicatif, pas bloquant : les membres sans 2FA sont dirigés vers sa configuration et ne peuvent plus la désactiver, mais leur connexion n’est jamais bloquée, et les clés API ne sont pas concernées."
1664
+ },
1665
+ "sessionTtl": {
1666
+ "error": "Entre {min, number} et {max, number} heures.",
1667
+ "label": "Durée de session (heures)"
1668
+ }
1669
+ },
1670
+ "storageCard": {
1671
+ "body": "Choisissez où vivent les fichiers téléversés, les exports et les autres octets stockés — ce serveur, un bucket ou votre propre serveur.",
1672
+ "cta": "Ouvrir le stockage",
1673
+ "heading": "Stockage"
1674
+ },
1675
+ "subtitle": "Identité, sécurité et actions destructrices pour cet espace de travail.",
1676
+ "superAdminOnly": "Seul un super administrateur peut modifier l’identité et les paramètres de sécurité de l’espace de travail.",
1677
+ "superAdminOnlyTitle": "Super administrateur requis",
1678
+ "title": "Paramètres de l’espace de travail",
1679
+ "translationsCard": {
1680
+ "body": "Reformulez n’importe quel texte d’Adminium, choisissez les langues proposées et ajoutez les vôtres.",
1681
+ "cta": "Ouvrir les traductions",
1682
+ "heading": "Langues et traductions"
1295
1683
  }
1684
+ },
1685
+ "source": {
1686
+ "dsn": {
1687
+ "helper": "postgres://utilisateur:motdepasse@hote:5432/base — mysql:// et sqlite: fonctionnent aussi.",
1688
+ "incomplete": "Ajoutez l’hôte et la base, p. ex. postgres://user@host:5432/db",
1689
+ "invalidScheme": "Schéma non reconnu — attendu : postgres://, mysql://, mariadb:// ou sqlite:",
1690
+ "label": "Chaîne de connexion",
1691
+ "quickFill": "Remplissage rapide :"
1692
+ },
1693
+ "engine": {
1694
+ "label": "Moteur de base de données",
1695
+ "mysql": "MySQL / MariaDB",
1696
+ "postgres": "PostgreSQL",
1697
+ "sqlite": "SQLite"
1698
+ },
1699
+ "fields": {
1700
+ "database": "Base de données",
1701
+ "host": "Hôte",
1702
+ "password": "Mot de passe",
1703
+ "port": "Port",
1704
+ "preview": "Aperçu de la chaîne de connexion :",
1705
+ "ssl": "Mode SSL",
1706
+ "user": "Utilisateur"
1707
+ },
1708
+ "file": {
1709
+ "columns": "colonnes",
1710
+ "detectedAs": "Détecté : {format}",
1711
+ "dropHint": "SQL DDL / pg_dump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, modèles Django, Adminium JSON",
1712
+ "dropTitle": "Déposez votre fichier de schéma ici, ou parcourez",
1713
+ "errorTitle": "Impossible d’analyser le fichier",
1714
+ "moreWarnings": "+{count} avertissements supplémentaires — la liste complète apparaît à l’étape d’analyse.",
1715
+ "parseFailed": "Nous n’avons pas pu analyser ce fichier. Si la détection automatique s’est trompée, choisissez le format explicitement et réessayez.",
1716
+ "parsing": "Lecture du fichier de schéma téléversé…",
1717
+ "pitch": "Aucune connexion à la base requise — nous analysons votre fichier de schéma et construisons les mêmes tableaux de bord.",
1718
+ "requestFailed": "Échec du téléversement — vérifiez votre connexion et réessayez.",
1719
+ "tables": "tables",
1720
+ "unsupported": "Format non reconnu — SQL DDL, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, modèles Django et Adminium JSON sont pris en charge. Choisissez-en un explicitement et réessayez.",
1721
+ "warnings": "avertissements"
1722
+ },
1723
+ "format": {
1724
+ "auto": "Détection automatique",
1725
+ "django": "models.py Django",
1726
+ "drizzle": "Drizzle ORM",
1727
+ "helper": "Laissez la détection automatique, sauf si elle se trompe.",
1728
+ "json": "JSON Adminium",
1729
+ "label": "Format du schéma",
1730
+ "prisma": "Schéma Prisma",
1731
+ "rails": "schema.rb Rails",
1732
+ "sequelize": "Modèles Sequelize",
1733
+ "sql": "DDL SQL / pg_dump",
1734
+ "typeorm": "Entités TypeORM"
1735
+ },
1736
+ "mode": {
1737
+ "dsn": "Chaîne de connexion",
1738
+ "fields": "Champs individuels",
1739
+ "file": "Fichier de schéma"
1740
+ },
1741
+ "modeLabel": "Mode de saisie de la source",
1742
+ "name": "Nom de la connexion",
1743
+ "namePlaceholder": "Postgres de production",
1744
+ "readOnlyRole": {
1745
+ "body": "Lors de la configuration, Adminium ne lit que les métadonnées du schéma — jamais vos lignes. Nous recommandons un utilisateur dédié avec des droits SELECT uniquement ; vous choisirez où Adminium conserve ses propres tables à l’étape de stockage des métadonnées.",
1746
+ "title": "Utilisez un rôle en lecture seule"
1747
+ },
1748
+ "sqlite": {
1749
+ "file": "Chemin du fichier de base de données",
1750
+ "helper": "SQLite est un fichier, pas un serveur — indiquez le chemin absolu sur la machine qui exécute Adminium."
1751
+ },
1752
+ "subtitle": "Pointez Adminium vers une base de données et nous générerons un tableau de bord d’administration à partir de son schéma.",
1753
+ "title": "Connectez votre base de données"
1754
+ },
1755
+ "storage": {
1756
+ "actionFailed": "Cela n’a pas fonctionné",
1757
+ "add": "Ajouter une destination",
1758
+ "availableOnDisk": "{size} disponibles sur ce disque",
1759
+ "default": "Par défaut",
1760
+ "defaultBlockedByDisabled": "Une destination désactivée ne peut pas être la destination par défaut. Activez-la d’abord.",
1761
+ "delete": {
1762
+ "blockedBody": "{name} contient encore {count, plural, one {# fichier} other {# fichiers}}. Déplacez-les d’abord vers une autre destination, puis supprimez-la.",
1763
+ "blockedTitle": "Cette destination contient encore des fichiers",
1764
+ "body": "Adminium oublie {name} et ses identifiants. Rien de ce qui y est stocké n’est touché — le bucket ou le serveur vous appartient, et des fichiers encore enregistrés sur cette destination feront échouer la suppression.",
1765
+ "confirm": "Supprimer la destination",
1766
+ "title": "Supprimer cette destination"
1767
+ },
1768
+ "deleteButton": "Supprimer",
1769
+ "disable": "Désactiver",
1770
+ "disabled": "Désactivée",
1771
+ "driver": {
1772
+ "local": "Un chemin sur cette machine",
1773
+ "s3": "Bucket compatible S3",
1774
+ "webdav": "Serveur WebDAV"
1775
+ },
1776
+ "edit": "Modifier",
1777
+ "editor": {
1778
+ "createTitle": "Ajouter une destination",
1779
+ "editTitle": "Modifier la destination",
1780
+ "subtitle": "Adminium lit et écrit à travers cette destination en votre nom ; c’est une infrastructure que vous contrôlez."
1781
+ },
1782
+ "enable": "Activer",
1783
+ "field": {
1784
+ "accessKeyId": "Identifiant de clé d’accès",
1785
+ "bucket": "Bucket",
1786
+ "driver": "Type",
1787
+ "driverLocked": "Changer le type d’une destination qui contient déjà des fichiers rendrait ces fichiers inaccessibles.",
1788
+ "endpoint": "Point de terminaison",
1789
+ "endpointDerived": "Laissez vide pour AWS lui-même — le point de terminaison découle de la région.",
1790
+ "name": "Nom",
1791
+ "namePlaceholder": "Bucket des téléversements",
1792
+ "password": "Mot de passe",
1793
+ "pathStyle": "Adressage par chemin",
1794
+ "pathStyleToggle": "Adresser le bucket comme un chemin plutôt que comme un nom d’hôte",
1795
+ "prefix": "Préfixe",
1796
+ "prefixHelper": "Un dossier à l’intérieur de la destination. Deux destinations sur un même bucket qui ne diffèrent que par ce champ partagent le bucket sans partager d’espace de noms.",
1797
+ "preset": "Fournisseur",
1798
+ "presetHelper": "Renseigne le point de terminaison, la région et le style d’adressage. Ce que le fournisseur ne peut pas savoir de votre compte reste vide, à vous de le saisir.",
1799
+ "publicBaseUrl": "URL de base publique",
1800
+ "publicBaseUrlHelper": "Facultatif. L’endroit où ces objets sont lisibles sans Adminium — un CDN devant un bucket public. Utilisé uniquement lorsqu’une colonne stocke un lien.",
1801
+ "region": "Région",
1802
+ "root": "Répertoire",
1803
+ "rootHelper": "Un chemin absolu dans lequel ce serveur peut écrire — un volume monté ou un partage réseau. Pas le répertoire par défaut, qui figure déjà en première ligne de la liste.",
1804
+ "secretAccessKey": "Clé d’accès secrète",
1805
+ "secretKept": "Une clé est enregistrée. Laissez les deux champs vides pour la conserver ; remplissez-les tous les deux pour la remplacer.",
1806
+ "url": "URL de la collection",
1807
+ "urlHelper": "La collection dans laquelle Adminium écrit, telle que votre serveur la publie.",
1808
+ "username": "Nom d’utilisateur"
1809
+ },
1810
+ "fileCount": "{count, plural, one {# fichier} other {# fichiers}}",
1811
+ "kind": {
1812
+ "archive": "Lots archivés du journal d’audit",
1813
+ "branding": "Le logo de l’espace de travail",
1814
+ "export": "Fichiers issus des exports de données",
1815
+ "import": "CSV téléversés et leurs rapports d’erreurs",
1816
+ "schema": "Fichiers de schéma importés",
1817
+ "upload": "Fichiers joints à des enregistrements"
1818
+ },
1819
+ "list": {
1820
+ "subtitle": "Les nouveaux fichiers vont vers la destination par défaut. Les fichiers existants restent où ils sont tant que vous ne les déplacez pas.",
1821
+ "title": "Destinations"
1822
+ },
1823
+ "loadFailed": {
1824
+ "forbidden": "Changer l’endroit où les fichiers sont stockés requiert l’autorisation « Gérer le stockage ». Demandez à un administrateur de l’attribuer à l’un de vos rôles.",
1825
+ "title": "Impossible de charger les destinations"
1826
+ },
1827
+ "localDisk": "Le disque de ce serveur",
1828
+ "move": {
1829
+ "from": "Depuis",
1830
+ "kinds": "Limiter à",
1831
+ "kindsHelp": "Ne cochez rien pour tous les déplacer. Les téléversements sont les fichiers que les gens joignent ; le reste, ce sont les artefacts produits par Adminium.",
1832
+ "open": "Déplacer des fichiers…",
1833
+ "start": "Démarrer le déplacement",
1834
+ "startedBody": "Il s’exécute en arrière-plan sous la tâche {jobId} et se poursuit même si vous quittez cette page. Les compteurs ci-dessous évoluent à mesure que les fichiers arrivent — rechargez la page pour les voir.",
1835
+ "startedTitle": "Le déplacement a commencé",
1836
+ "subtitle": "Copie tous les fichiers d’une destination vers une autre, puis oublie l’ancienne copie. Les téléchargements continuent de fonctionner pendant toute l’opération.",
1837
+ "title": "Déplacer des fichiers",
1838
+ "to": "Vers"
1839
+ },
1840
+ "preset": {
1841
+ "aws": "AWS S3",
1842
+ "b2": "Backblaze B2",
1843
+ "minio": "MinIO ou un autre serveur compatible S3",
1844
+ "r2": "Cloudflare R2",
1845
+ "spaces": "DigitalOcean Spaces",
1846
+ "tigris": "Tigris",
1847
+ "wasabi": "Wasabi"
1848
+ },
1849
+ "save": "Enregistrer la destination",
1850
+ "secret": {
1851
+ "partialBody": "Remplissez les deux champs pour remplacer les identifiants enregistrés, ou videz-les tous les deux pour les conserver. N’en enregistrer qu’un seul conserverait discrètement les anciens.",
1852
+ "partialTitle": "Des identifiants à moitié saisis n’en sont pas"
1853
+ },
1854
+ "setDefault": "Définir par défaut",
1855
+ "status": {
1856
+ "error": "Injoignable",
1857
+ "ok": "Joignable",
1858
+ "untested": "Non testée"
1859
+ },
1860
+ "subtitle": "L’endroit où cette instance conserve les fichiers téléversés, les exports et les autres octets stockés.",
1861
+ "test": {
1862
+ "button": "Tester",
1863
+ "failed": "Impossible de joindre cette destination",
1864
+ "ok": "Atteinte en {ms} ms",
1865
+ "unreachable": "Le test n’a pas pu être exécuté"
1866
+ },
1867
+ "title": "Stockage",
1868
+ "usedBytes": "{size} utilisés"
1869
+ },
1870
+ "tables": {
1871
+ "emptyFilter": "Aucune table ne correspond à votre filtre.",
1872
+ "highVolume": "gros volume",
1873
+ "highVolumeNote": "Les tables de plus de 100 000 lignes démarrent décochées — les tables techniques ont rarement leur place dans un tableau de bord.",
1874
+ "importNoCounts": "Les fichiers de schéma ne contiennent pas de nombres de lignes — la colonne affiche — tant qu’aucune base réelle n’est connectée.",
1875
+ "joinHidden": "{count} tables de jointure/système sont masquées d’avance — elles alimentent toujours les relations plusieurs-à-plusieurs.",
1876
+ "listLabel": "Tables incluables",
1877
+ "pii": "PII",
1878
+ "search": "Filtrer les tables…",
1879
+ "subtitle": "Choisissez lesquelles inclure. Vous pourrez en changer à tout moment.",
1880
+ "title": "Choisissez vos tables"
1881
+ },
1882
+ "test": {
1883
+ "errorTitle": "Échec de la connexion",
1884
+ "hint": {
1885
+ "auth": "Échec de l’authentification — vérifiez le nom d’utilisateur et le mot de passe dans votre DSN.",
1886
+ "hostUnreachable": "Hôte injoignable — vérifiez le nom d’hôte et le port, et que la base accepte les connexions depuis cette machine (ajoutez nos IP à la liste d’autorisation).",
1887
+ "metaPlacement": "Cette source ne peut pas héberger les tables méta d’Adminium — continuez avec une base méta séparée.",
1888
+ "permission": "Le rôle s’est connecté mais n’a pas les droits de lecture du schéma — accordez USAGE sur le schéma à votre rôle d’introspection.",
1889
+ "timeout": "La base n’a pas répondu à temps — vérifiez le chemin réseau et la charge, puis réessayez.",
1890
+ "tls": "Échec de la négociation TLS — essayez sslmode=require, ou téléversez le certificat CA attendu par votre serveur.",
1891
+ "unknown": "Échec de la connexion — vérifiez la DSN et réessayez."
1892
+ },
1893
+ "log": {
1894
+ "connectFailed": "Échec de la connexion.",
1895
+ "connected": "Connecté ({latency} ms) · introspection en lecture seule",
1896
+ "connecting": "Établissement d’une connexion sécurisée…",
1897
+ "detected": "{tables} tables · {columns} colonnes détectées",
1898
+ "found": "{tables} tables · {columns} colonnes trouvées",
1899
+ "jobFailed": "Échec de l’introspection.",
1900
+ "mapping": "Correspondance des types de colonnes → widgets de saisie",
1901
+ "moreWarnings": "+{count} avertissements du parseur supplémentaires",
1902
+ "networkFailed": "Échec de la requête — vérifiez votre connexion et réessayez.",
1903
+ "parsingFile": "Analyse de {file}…",
1904
+ "piiDone": "Analyse PII terminée — {count} colonnes masquées par défaut",
1905
+ "piiDoneUnknown": "Analyse PII terminée",
1906
+ "piiScan": "Recherche de colonnes PII…",
1907
+ "readingFile": "Lecture du fichier de schéma téléversé…",
1908
+ "readingSchema": "Lecture du schéma : public",
1909
+ "ready": "Prêt",
1910
+ "relations": "Détection des relations…"
1911
+ },
1912
+ "logLabel": "Journal d’introspection",
1913
+ "retry": "Réessayer",
1914
+ "subtitle": "Introspection des tables, colonnes et relations. Cela prend quelques secondes.",
1915
+ "title": "Analyse de votre schéma",
1916
+ "trust": "Nous ne faisons que lire votre schéma et vos données. Rien n’est modifié."
1917
+ },
1918
+ "title": "Studio",
1919
+ "wizard": {
1920
+ "back": "Retour",
1921
+ "bridgeAppliedBody": "Transmise depuis adminium.dev par votre navigateur — elle est allée directement à cette machine et n’a jamais été téléversée. Vérifiez-la ci-dessous, puis continuez.",
1922
+ "bridgeAppliedTitle": "Chaîne de connexion reçue",
1923
+ "bridgeFailedBody": "Il a déjà été utilisé ou a expiré. Collez plutôt votre chaîne de connexion ci-dessous.",
1924
+ "bridgeFailedTitle": "Ce transfert n’a pas pu être utilisé",
1925
+ "continue": "Continuer",
1926
+ "persistFailed": "Impossible d’enregistrer votre sélection de tables — réessayez.",
1927
+ "persistFailedTitle": "Échec de l’enregistrement",
1928
+ "progress": "Progression de la configuration",
1929
+ "step": {
1930
+ "enrich": "Enrichir",
1931
+ "generate": "Générer",
1932
+ "intent": "Intention",
1933
+ "meta": "Stockage méta",
1934
+ "source": "Source",
1935
+ "tables": "Tables",
1936
+ "test": "Analyser"
1937
+ },
1938
+ "title": "Nouvelle connexion"
1296
1939
  }
1297
1940
  };
1298
1941
  //# sourceMappingURL=studio.js.map