@adminiumjs/i18n 0.2.2-rc.0 → 0.2.3

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 (229) 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 +481 -172
  4. package/dist/a11y-keys.js.map +1 -1
  5. package/dist/create-i18n.d.ts +16 -6
  6. package/dist/create-i18n.d.ts.map +1 -1
  7. package/dist/create-i18n.js +23 -9
  8. package/dist/create-i18n.js.map +1 -1
  9. package/dist/editing.d.ts +1 -1
  10. package/dist/editing.js +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +19 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/keys.d.ts +6 -4
  16. package/dist/keys.d.ts.map +1 -1
  17. package/dist/keys.js +6 -4
  18. package/dist/keys.js.map +1 -1
  19. package/dist/overrides.d.ts +1 -1
  20. package/dist/overrides.d.ts.map +1 -1
  21. package/dist/resources/ar-eg/common.d.ts +96 -970
  22. package/dist/resources/ar-eg/common.d.ts.map +1 -1
  23. package/dist/resources/ar-eg/common.js +99 -973
  24. package/dist/resources/ar-eg/common.js.map +1 -1
  25. package/dist/resources/ar-eg/errors.d.ts +3 -2
  26. package/dist/resources/ar-eg/errors.d.ts.map +1 -1
  27. package/dist/resources/ar-eg/errors.js +3 -2
  28. package/dist/resources/ar-eg/errors.js.map +1 -1
  29. package/dist/resources/ar-eg/generated.d.ts +3 -2
  30. package/dist/resources/ar-eg/generated.d.ts.map +1 -1
  31. package/dist/resources/ar-eg/generated.js +3 -2
  32. package/dist/resources/ar-eg/generated.js.map +1 -1
  33. package/dist/resources/ar-eg/studio.d.ts +1282 -2
  34. package/dist/resources/ar-eg/studio.d.ts.map +1 -1
  35. package/dist/resources/ar-eg/studio.js +1282 -2
  36. package/dist/resources/ar-eg/studio.js.map +1 -1
  37. package/dist/resources/ar-eg/ui.d.ts +60 -2
  38. package/dist/resources/ar-eg/ui.d.ts.map +1 -1
  39. package/dist/resources/ar-eg/ui.js +72 -14
  40. package/dist/resources/ar-eg/ui.js.map +1 -1
  41. package/dist/resources/cs-cz/common.d.ts +96 -970
  42. package/dist/resources/cs-cz/common.d.ts.map +1 -1
  43. package/dist/resources/cs-cz/common.js +99 -973
  44. package/dist/resources/cs-cz/common.js.map +1 -1
  45. package/dist/resources/cs-cz/errors.d.ts +3 -2
  46. package/dist/resources/cs-cz/errors.d.ts.map +1 -1
  47. package/dist/resources/cs-cz/errors.js +3 -2
  48. package/dist/resources/cs-cz/errors.js.map +1 -1
  49. package/dist/resources/cs-cz/generated.d.ts +3 -2
  50. package/dist/resources/cs-cz/generated.d.ts.map +1 -1
  51. package/dist/resources/cs-cz/generated.js +3 -2
  52. package/dist/resources/cs-cz/generated.js.map +1 -1
  53. package/dist/resources/cs-cz/studio.d.ts +1282 -2
  54. package/dist/resources/cs-cz/studio.d.ts.map +1 -1
  55. package/dist/resources/cs-cz/studio.js +1282 -2
  56. package/dist/resources/cs-cz/studio.js.map +1 -1
  57. package/dist/resources/cs-cz/ui.d.ts +60 -2
  58. package/dist/resources/cs-cz/ui.d.ts.map +1 -1
  59. package/dist/resources/cs-cz/ui.js +72 -14
  60. package/dist/resources/cs-cz/ui.js.map +1 -1
  61. package/dist/resources/da-dk/common.d.ts +96 -970
  62. package/dist/resources/da-dk/common.d.ts.map +1 -1
  63. package/dist/resources/da-dk/common.js +99 -973
  64. package/dist/resources/da-dk/common.js.map +1 -1
  65. package/dist/resources/da-dk/errors.d.ts +3 -2
  66. package/dist/resources/da-dk/errors.d.ts.map +1 -1
  67. package/dist/resources/da-dk/errors.js +3 -2
  68. package/dist/resources/da-dk/errors.js.map +1 -1
  69. package/dist/resources/da-dk/generated.d.ts +3 -2
  70. package/dist/resources/da-dk/generated.d.ts.map +1 -1
  71. package/dist/resources/da-dk/generated.js +3 -2
  72. package/dist/resources/da-dk/generated.js.map +1 -1
  73. package/dist/resources/da-dk/studio.d.ts +1282 -2
  74. package/dist/resources/da-dk/studio.d.ts.map +1 -1
  75. package/dist/resources/da-dk/studio.js +1282 -2
  76. package/dist/resources/da-dk/studio.js.map +1 -1
  77. package/dist/resources/da-dk/ui.d.ts +60 -2
  78. package/dist/resources/da-dk/ui.d.ts.map +1 -1
  79. package/dist/resources/da-dk/ui.js +72 -14
  80. package/dist/resources/da-dk/ui.js.map +1 -1
  81. package/dist/resources/de-de/common.d.ts +96 -970
  82. package/dist/resources/de-de/common.d.ts.map +1 -1
  83. package/dist/resources/de-de/common.js +99 -973
  84. package/dist/resources/de-de/common.js.map +1 -1
  85. package/dist/resources/de-de/errors.d.ts +3 -2
  86. package/dist/resources/de-de/errors.d.ts.map +1 -1
  87. package/dist/resources/de-de/errors.js +3 -2
  88. package/dist/resources/de-de/errors.js.map +1 -1
  89. package/dist/resources/de-de/generated.d.ts +3 -2
  90. package/dist/resources/de-de/generated.d.ts.map +1 -1
  91. package/dist/resources/de-de/generated.js +3 -2
  92. package/dist/resources/de-de/generated.js.map +1 -1
  93. package/dist/resources/de-de/studio.d.ts +1282 -2
  94. package/dist/resources/de-de/studio.d.ts.map +1 -1
  95. package/dist/resources/de-de/studio.js +1282 -2
  96. package/dist/resources/de-de/studio.js.map +1 -1
  97. package/dist/resources/de-de/ui.d.ts +60 -2
  98. package/dist/resources/de-de/ui.d.ts.map +1 -1
  99. package/dist/resources/de-de/ui.js +72 -14
  100. package/dist/resources/de-de/ui.js.map +1 -1
  101. package/dist/resources/eager.d.ts +3 -0
  102. package/dist/resources/eager.d.ts.map +1 -0
  103. package/dist/resources/eager.js +25 -0
  104. package/dist/resources/eager.js.map +1 -0
  105. package/dist/resources/en-us/common.d.ts +96 -970
  106. package/dist/resources/en-us/common.d.ts.map +1 -1
  107. package/dist/resources/en-us/common.js +99 -973
  108. package/dist/resources/en-us/common.js.map +1 -1
  109. package/dist/resources/en-us/errors.d.ts +3 -2
  110. package/dist/resources/en-us/errors.d.ts.map +1 -1
  111. package/dist/resources/en-us/errors.js +3 -2
  112. package/dist/resources/en-us/errors.js.map +1 -1
  113. package/dist/resources/en-us/generated.d.ts +3 -2
  114. package/dist/resources/en-us/generated.d.ts.map +1 -1
  115. package/dist/resources/en-us/generated.js +3 -2
  116. package/dist/resources/en-us/generated.js.map +1 -1
  117. package/dist/resources/en-us/studio.d.ts +1282 -2
  118. package/dist/resources/en-us/studio.d.ts.map +1 -1
  119. package/dist/resources/en-us/studio.js +1282 -2
  120. package/dist/resources/en-us/studio.js.map +1 -1
  121. package/dist/resources/en-us/ui.d.ts +60 -2
  122. package/dist/resources/en-us/ui.d.ts.map +1 -1
  123. package/dist/resources/en-us/ui.js +72 -14
  124. package/dist/resources/en-us/ui.js.map +1 -1
  125. package/dist/resources/fr-fr/common.d.ts +96 -970
  126. package/dist/resources/fr-fr/common.d.ts.map +1 -1
  127. package/dist/resources/fr-fr/common.js +99 -973
  128. package/dist/resources/fr-fr/common.js.map +1 -1
  129. package/dist/resources/fr-fr/errors.d.ts +3 -2
  130. package/dist/resources/fr-fr/errors.d.ts.map +1 -1
  131. package/dist/resources/fr-fr/errors.js +3 -2
  132. package/dist/resources/fr-fr/errors.js.map +1 -1
  133. package/dist/resources/fr-fr/generated.d.ts +3 -2
  134. package/dist/resources/fr-fr/generated.d.ts.map +1 -1
  135. package/dist/resources/fr-fr/generated.js +3 -2
  136. package/dist/resources/fr-fr/generated.js.map +1 -1
  137. package/dist/resources/fr-fr/studio.d.ts +1282 -2
  138. package/dist/resources/fr-fr/studio.d.ts.map +1 -1
  139. package/dist/resources/fr-fr/studio.js +1282 -2
  140. package/dist/resources/fr-fr/studio.js.map +1 -1
  141. package/dist/resources/fr-fr/ui.d.ts +60 -2
  142. package/dist/resources/fr-fr/ui.d.ts.map +1 -1
  143. package/dist/resources/fr-fr/ui.js +72 -14
  144. package/dist/resources/fr-fr/ui.js.map +1 -1
  145. package/dist/resources/index.d.ts +3 -6
  146. package/dist/resources/index.d.ts.map +1 -1
  147. package/dist/resources/index.js +15 -14
  148. package/dist/resources/index.js.map +1 -1
  149. package/dist/resources/lazy.d.ts +19 -9
  150. package/dist/resources/lazy.d.ts.map +1 -1
  151. package/dist/resources/lazy.js +4 -2
  152. package/dist/resources/lazy.js.map +1 -1
  153. package/dist/resources/namespaces.d.ts +43 -0
  154. package/dist/resources/namespaces.d.ts.map +1 -0
  155. package/dist/resources/namespaces.js +37 -0
  156. package/dist/resources/namespaces.js.map +1 -0
  157. package/dist/resources/zh-cn/common.d.ts +96 -970
  158. package/dist/resources/zh-cn/common.d.ts.map +1 -1
  159. package/dist/resources/zh-cn/common.js +99 -973
  160. package/dist/resources/zh-cn/common.js.map +1 -1
  161. package/dist/resources/zh-cn/errors.d.ts +3 -2
  162. package/dist/resources/zh-cn/errors.d.ts.map +1 -1
  163. package/dist/resources/zh-cn/errors.js +3 -2
  164. package/dist/resources/zh-cn/errors.js.map +1 -1
  165. package/dist/resources/zh-cn/generated.d.ts +3 -2
  166. package/dist/resources/zh-cn/generated.d.ts.map +1 -1
  167. package/dist/resources/zh-cn/generated.js +3 -2
  168. package/dist/resources/zh-cn/generated.js.map +1 -1
  169. package/dist/resources/zh-cn/studio.d.ts +1282 -2
  170. package/dist/resources/zh-cn/studio.d.ts.map +1 -1
  171. package/dist/resources/zh-cn/studio.js +1282 -2
  172. package/dist/resources/zh-cn/studio.js.map +1 -1
  173. package/dist/resources/zh-cn/ui.d.ts +60 -2
  174. package/dist/resources/zh-cn/ui.d.ts.map +1 -1
  175. package/dist/resources/zh-cn/ui.js +72 -14
  176. package/dist/resources/zh-cn/ui.js.map +1 -1
  177. package/dist/resources/zh-tw/common.d.ts +96 -970
  178. package/dist/resources/zh-tw/common.d.ts.map +1 -1
  179. package/dist/resources/zh-tw/common.js +99 -973
  180. package/dist/resources/zh-tw/common.js.map +1 -1
  181. package/dist/resources/zh-tw/errors.d.ts +3 -2
  182. package/dist/resources/zh-tw/errors.d.ts.map +1 -1
  183. package/dist/resources/zh-tw/errors.js +3 -2
  184. package/dist/resources/zh-tw/errors.js.map +1 -1
  185. package/dist/resources/zh-tw/generated.d.ts +3 -2
  186. package/dist/resources/zh-tw/generated.d.ts.map +1 -1
  187. package/dist/resources/zh-tw/generated.js +3 -2
  188. package/dist/resources/zh-tw/generated.js.map +1 -1
  189. package/dist/resources/zh-tw/studio.d.ts +1282 -2
  190. package/dist/resources/zh-tw/studio.d.ts.map +1 -1
  191. package/dist/resources/zh-tw/studio.js +1282 -2
  192. package/dist/resources/zh-tw/studio.js.map +1 -1
  193. package/dist/resources/zh-tw/ui.d.ts +60 -2
  194. package/dist/resources/zh-tw/ui.d.ts.map +1 -1
  195. package/dist/resources/zh-tw/ui.js +72 -14
  196. package/dist/resources/zh-tw/ui.js.map +1 -1
  197. package/dist/review-status.js +7 -7
  198. package/locales/ar-EG/.meta.json +3783 -2339
  199. package/locales/ar-EG/common.json +96 -971
  200. package/locales/ar-EG/studio.json +1279 -0
  201. package/locales/ar-EG/ui.json +69 -12
  202. package/locales/cs-CZ/.meta.json +3849 -2405
  203. package/locales/cs-CZ/common.json +96 -971
  204. package/locales/cs-CZ/studio.json +1279 -0
  205. package/locales/cs-CZ/ui.json +69 -12
  206. package/locales/da-DK/.meta.json +3935 -2491
  207. package/locales/da-DK/common.json +96 -971
  208. package/locales/da-DK/studio.json +1279 -0
  209. package/locales/da-DK/ui.json +69 -12
  210. package/locales/de-DE/.meta.json +3895 -2451
  211. package/locales/de-DE/common.json +96 -971
  212. package/locales/de-DE/studio.json +1279 -0
  213. package/locales/de-DE/ui.json +69 -12
  214. package/locales/en-US/common.json +96 -971
  215. package/locales/en-US/studio.json +1279 -0
  216. package/locales/en-US/ui.json +69 -12
  217. package/locales/fr-FR/.meta.json +3964 -2520
  218. package/locales/fr-FR/common.json +96 -971
  219. package/locales/fr-FR/studio.json +1279 -0
  220. package/locales/fr-FR/ui.json +69 -12
  221. package/locales/zh-CN/.meta.json +3781 -2337
  222. package/locales/zh-CN/common.json +96 -971
  223. package/locales/zh-CN/studio.json +1279 -0
  224. package/locales/zh-CN/ui.json +69 -12
  225. package/locales/zh-TW/.meta.json +3785 -2341
  226. package/locales/zh-TW/common.json +96 -971
  227. package/locales/zh-TW/studio.json +1279 -0
  228. package/locales/zh-TW/ui.json +69 -12
  229. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * GENERATED MIRROR of ../../../locales/en-US/common.json — do not edit by hand.
3
3
  * The JSON file is the canonical hand-authored bundle (10-i18n-theming.md §3.1);
4
- * this TS mirror exists so the runtime bundles en-US resources (and chunk-splits
5
- * the other locales) without JSON import attributes (browser + NodeNext safe).
4
+ * this TS mirror exists so the runtime can bundle a namespace (en-US's eager
5
+ * ones) or chunk-split it (every other locale, and en-US's deferred `studio`)
6
+ * without JSON import attributes (browser + NodeNext safe).
6
7
  * Parity is enforced by src/resources/parity.test.ts. Regenerate with
7
8
  * scripts/gen-resources.mjs.
8
9
  */
@@ -22,6 +23,7 @@ declare const _default: {
22
23
  };
23
24
  readonly auth: {
24
25
  readonly headline: "Turn any database into a dashboard.";
26
+ readonly description: "Connect PostgreSQL and Adminium generates a themeable, permission-aware admin app — no code required.";
25
27
  readonly trust: "AGPL core · Self-hosted · Your data stays yours";
26
28
  readonly signIn: {
27
29
  readonly title: "Welcome back";
@@ -112,6 +114,11 @@ declare const _default: {
112
114
  readonly audit: "Audit log";
113
115
  readonly security: "Password & sessions";
114
116
  };
117
+ readonly apps: {
118
+ readonly frame: {
119
+ readonly noFrames: "This app needs a browser that supports frames.";
120
+ };
121
+ };
115
122
  readonly topbar: {
116
123
  readonly search: "Search…";
117
124
  readonly notifications: "Notifications";
@@ -123,6 +130,8 @@ declare const _default: {
123
130
  readonly profile: "Profile";
124
131
  readonly preferences: "Preferences";
125
132
  readonly studio: "Studio";
133
+ readonly dataConnections: "Data connections";
134
+ readonly workspaceSettings: "Workspace settings";
126
135
  readonly signOut: "Sign out";
127
136
  };
128
137
  readonly palette: {
@@ -240,9 +249,15 @@ declare const _default: {
240
249
  readonly primary: "Contact owner";
241
250
  readonly secondary: "Go back";
242
251
  };
252
+ readonly connectionPaused: {
253
+ readonly title: "This connection is paused";
254
+ readonly body: "An admin paused the database behind this page, so it is not loading data right now. Nothing has been deleted — it comes back as soon as the connection is resumed in Studio → Data connections.";
255
+ readonly secondary: "Go back";
256
+ };
243
257
  };
244
258
  readonly notFound: {
245
259
  readonly title: "This page went missing";
260
+ readonly body: "The page you're looking for doesn't exist or was moved. Check the URL, or head back to your dashboard.";
246
261
  readonly errorLine: "Error 404";
247
262
  readonly searchPlaceholder: "Search for a page…";
248
263
  readonly matches: "Matching pages";
@@ -261,9 +276,11 @@ declare const _default: {
261
276
  };
262
277
  readonly tooNew: {
263
278
  readonly title: "This page needs a newer Adminium";
279
+ readonly body: "This page was saved with config version {version}, but this build understands up to version {latest}. Upgrade Adminium to open it.";
264
280
  };
265
281
  readonly unknownTemplate: {
266
282
  readonly title: "Unknown page template";
283
+ readonly body: "This page uses a template this build doesn’t recognize. It may come from a newer Adminium or an extension that isn’t installed.";
267
284
  };
268
285
  };
269
286
  readonly mutation: {
@@ -315,6 +332,20 @@ declare const _default: {
315
332
  readonly twoFactor: "Two-factor";
316
333
  readonly on: "Enabled";
317
334
  readonly off: "Off";
335
+ readonly nameRequired: "Enter your name.";
336
+ readonly emailHelper: "Used to sign in. Changing it needs your password.";
337
+ readonly confirmPassword: "Current password";
338
+ readonly confirmPasswordHelper: "Confirm it is you before your sign-in address changes.";
339
+ readonly save: "Save changes";
340
+ readonly saveFailed: "Could not save your profile";
341
+ readonly saved: "Profile updated";
342
+ readonly savedBody: "Your new details are in use across this workspace. If you changed your email, sign in with the new address from now on.";
343
+ readonly accessTitle: "Access";
344
+ readonly accessSubtitle: "What this account may do, and how it proves who it is.";
345
+ readonly rolesHelper: "Roles are granted by an administrator and cannot be changed from your own account.";
346
+ readonly manageTwoFactor: "Manage";
347
+ readonly setUpTwoFactor: "Set up";
348
+ readonly securityLink: "Password & sessions";
318
349
  readonly preferences: {
319
350
  readonly title: "Preferences";
320
351
  readonly subtitle: "How Adminium looks and reads for you — on this and every device you sign in from.";
@@ -353,815 +384,69 @@ declare const _default: {
353
384
  readonly emptyBody: "Notification events appear here as producers ship.";
354
385
  readonly saveFailed: "Could not save this change.";
355
386
  };
356
- };
357
- readonly studio: {
358
- readonly source: {
359
- readonly engine: {
360
- readonly label: "Database engine";
361
- readonly postgres: "PostgreSQL";
362
- readonly mysql: "MySQL / MariaDB";
363
- readonly sqlite: "SQLite";
364
- };
365
- readonly format: {
366
- readonly label: "Schema format";
367
- readonly helper: "Leave on auto-detect unless the detection gets it wrong.";
368
- readonly auto: "Auto-detect";
369
- readonly sql: "SQL DDL / pg_dump";
370
- readonly prisma: "Prisma schema";
371
- readonly drizzle: "Drizzle ORM";
372
- readonly typeorm: "TypeORM entities";
373
- readonly sequelize: "Sequelize models";
374
- readonly rails: "Rails schema.rb";
375
- readonly django: "Django models.py";
376
- readonly json: "Adminium JSON";
377
- };
378
- readonly sqlite: {
379
- readonly file: "Database file path";
380
- readonly helper: "SQLite is a file, not a server — give the absolute path on the machine running Adminium.";
381
- };
382
- readonly file: {
383
- readonly detectedAs: "Detected: {format}";
384
- readonly moreWarnings: "+{count} more warnings — the full list appears in the analyze step.";
385
- readonly dropTitle: "Drop your schema file here, or browse";
386
- readonly dropHint: "SQL DDL / pg_dump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django models, Adminium JSON";
387
- readonly pitch: "No database connection required — we parse your schema file and build the same dashboards.";
388
- readonly parsing: "Reading uploaded schema file…";
389
- readonly tables: "tables";
390
- readonly columns: "columns";
391
- readonly warnings: "warnings";
392
- readonly errorTitle: "Could not parse the file";
393
- readonly parseFailed: "We could not parse that file. If auto-detect guessed wrong, pick the format explicitly and retry.";
394
- readonly unsupported: "That format is not recognized — SQL DDL, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django models and Adminium JSON are supported. Pick one explicitly and retry.";
395
- readonly requestFailed: "Upload failed — check your connection and try again.";
396
- };
397
- readonly title: "Connect your database";
398
- readonly subtitle: "Point Adminium at a database and we'll generate an admin dashboard from its schema.";
399
- readonly name: "Connection name";
400
- readonly namePlaceholder: "Production Postgres";
401
- readonly modeLabel: "Source input mode";
402
- readonly mode: {
403
- readonly dsn: "Connection string";
404
- readonly fields: "Individual fields";
405
- readonly file: "Schema file";
406
- };
407
- readonly dsn: {
408
- readonly label: "Connection string";
409
- readonly helper: "postgres://user:password@host:5432/database — mysql:// and sqlite: work too.";
410
- readonly incomplete: "Add host and database, e.g. postgres://user@host:5432/db";
411
- readonly invalidScheme: "Unrecognized scheme — expected postgres://, mysql://, mariadb:// or sqlite:";
412
- readonly quickFill: "Quick fill:";
413
- };
414
- readonly fields: {
415
- readonly host: "Host";
416
- readonly port: "Port";
417
- readonly database: "Database";
418
- readonly user: "User";
419
- readonly password: "Password";
420
- readonly ssl: "SSL mode";
421
- readonly preview: "Connection string preview:";
422
- };
423
- readonly readOnlyRole: {
424
- readonly title: "Use a read-only role";
425
- readonly body: "Adminium never writes to your database — setup uses schema metadata only. We recommend a dedicated user with SELECT-only grants; you can decide where Adminium keeps its own tables in the meta-storage step.";
426
- };
427
- };
428
- readonly capability: {
429
- readonly mysqlApproxRows: "MySQL row counts are storage-engine estimates (they can drift up to ±40%) — shown with ≈.";
430
- readonly mysqlFkEnum: "MySQL FK/enum metadata is weaker: MyISAM tables declare no foreign keys, enums are per-column enum(…) types, and CHECK constraints need MySQL 8.0.16+ / MariaDB 10.2+.";
431
- readonly sqliteCheckEnums: "SQLite has no native enum type — enums are synthesized from CHECK (col IN (…)) constraints.";
432
- readonly sqliteNoComments: "SQLite has no column comments — use the schema remap editor to add labels.";
433
- readonly importNoRowCounts: "Schema files carry no row counts — the tables list shows — instead of made-up numbers.";
434
- readonly importNoLiveHealth: "No live database connection — health checks and schema-drift detection are unavailable for this source.";
435
- readonly rowsUnavailable: "Schema files have no live database — row counts are unknown until you connect one.";
436
- readonly rowsRunAnalyze: "No estimate yet — run ANALYZE on the database for row counts.";
437
- readonly rowsNoEstimate: "The engine reported no estimate for this table.";
438
- readonly rowsApproximate: "Storage-engine estimate — can drift up to ±40% on InnoDB.";
439
- };
440
- readonly test: {
441
- readonly log: {
442
- readonly moreWarnings: "+{count} more parser warnings";
443
- readonly connecting: "Establishing secure connection…";
444
- readonly connected: "Connected ({latency} ms) · read-only introspection";
445
- readonly connectFailed: "Connection failed.";
446
- readonly readingSchema: "Reading schema: public";
447
- readonly readingFile: "Reading uploaded schema file…";
448
- readonly parsingFile: "Parsing {file}…";
449
- readonly detected: "Detected {tables} tables · {columns} columns";
450
- readonly found: "Found {tables} tables · {columns} columns";
451
- readonly mapping: "Mapping column types → input widgets";
452
- readonly relations: "Detecting relations…";
453
- readonly piiScan: "Scanning for PII columns…";
454
- readonly piiDone: "PII scan complete — {count} columns masked by default";
455
- readonly piiDoneUnknown: "PII scan complete";
456
- readonly jobFailed: "Introspection failed.";
457
- readonly networkFailed: "Request failed — check your connection and retry.";
458
- readonly ready: "Ready";
459
- };
460
- readonly title: "Analyzing your schema";
461
- readonly subtitle: "Introspecting tables, columns, and relationships. This takes a few seconds.";
462
- readonly trust: "We only read your schema and data. Nothing is modified.";
463
- readonly errorTitle: "Connection failed";
464
- readonly retry: "Retry";
465
- readonly logLabel: "Introspection log";
466
- readonly hint: {
467
- readonly auth: "Authentication failed — check the user name and password in your DSN.";
468
- readonly hostUnreachable: "Host unreachable — check the hostname and port, and that the database accepts connections from this machine (allowlist our IPs).";
469
- readonly metaPlacement: "This source cannot host Adminium’s meta tables — continue with a separate meta database.";
470
- readonly permission: "The role connected but lacks schema-read privileges — grant USAGE on the schema to your introspection role.";
471
- readonly timeout: "The database did not answer in time — check network path and load, then retry.";
472
- readonly tls: "TLS negotiation failed — try sslmode=require, or upload the CA certificate your server expects.";
473
- readonly unknown: "Connection failed — verify the DSN and retry.";
474
- };
475
- };
476
- readonly tables: {
477
- readonly importNoCounts: "Schema files carry no row counts — the column shows — until a live database is connected.";
478
- readonly title: "Choose your tables";
479
- readonly subtitle: "Choose which to include. You can change this anytime.";
480
- readonly search: "Filter tables…";
481
- readonly listLabel: "Includable tables";
482
- readonly emptyFilter: "No tables match your filter.";
483
- readonly pii: "PII";
484
- readonly highVolume: "high volume";
485
- readonly highVolumeNote: "Tables over 100,000 rows start unchecked — ops tables rarely belong in a dashboard.";
486
- readonly joinHidden: "{count} join/system tables are pre-hidden — they still power many-to-many relations.";
487
- };
488
- readonly hub: {
489
- readonly title: "Data connections";
490
- readonly subtitle: "{healthy, number} of {total, plural, one {# connection} other {# connections}} healthy";
491
- readonly connectNew: "New connection";
492
- readonly stats: {
493
- readonly connections: "Connections";
494
- readonly healthy: "Healthy";
495
- readonly tables: "Tables included";
496
- readonly pages: "Generated pages";
497
- };
498
- readonly status: {
499
- readonly connected: "Connected";
500
- readonly error: "Error";
501
- readonly unconfigured: "Draft";
502
- readonly testing: "Testing…";
503
- };
504
- readonly card: {
505
- readonly readOnly: "Read-only";
506
- readonly tables: "Tables";
507
- readonly pages: "Pages";
508
- readonly latency: "Latency";
509
- readonly latencyMs: "{latency, number} ms";
510
- readonly lastIntrospected: "Last introspected";
511
- readonly never: "Never";
512
- };
513
- readonly action: {
514
- readonly test: "Test";
515
- readonly reintrospect: "Re-introspect";
516
- readonly reintrospectFile: "Schema-file sources have no live database — re-upload the file instead.";
517
- readonly remap: "Remap schema";
518
- readonly delete: "Delete";
519
- };
520
- readonly test: {
521
- readonly ok: "Connection healthy · {latency, number} ms";
522
- readonly failed: "Connection test failed";
523
- };
524
- readonly introspect: {
525
- readonly noChanges: "Schema unchanged — no new snapshot.";
526
- readonly updated: "Schema re-introspected";
527
- readonly masksProposed: "{count, plural, one {# column} other {# columns}} proposed for masking — review in the remap editor.";
528
- readonly failed: "Introspection failed. Try again.";
529
- };
530
- readonly delete: {
531
- readonly title: "Delete connection";
532
- readonly body: "This deletes “{name}” and its generated pages. Your database itself is never touched.";
533
- readonly prompt: "Type {name} to confirm";
534
- readonly confirm: "Delete connection";
535
- readonly cancel: "Cancel";
536
- readonly close: "Close";
537
- readonly success: "Connection “{name}” deleted";
538
- readonly failed: "Could not delete the connection. Try again.";
539
- };
540
- readonly empty: {
541
- readonly title: "No data sources yet";
542
- readonly body: "Connect a database and Adminium generates your admin panel from its schema.";
543
- readonly cta: "Connect a database";
544
- };
545
- };
546
- readonly settingsHub: {
547
- readonly title: "Workspace settings";
548
- readonly subtitle: "Identity, security and destructive actions for this workspace.";
549
- readonly save: "Save changes";
550
- readonly saved: "Workspace settings updated";
551
- readonly saveFailed: "Could not save workspace settings. Try again.";
552
- readonly superAdminOnlyTitle: "Super admin required";
553
- readonly superAdminOnly: "Only a super admin can change workspace identity and security settings.";
554
- readonly identity: {
555
- readonly heading: "Workspace identity";
556
- readonly appName: {
557
- readonly label: "Application name";
558
- readonly helper: "Shown in the sidebar, browser title, and emails.";
559
- readonly error: "Enter a name of at most 60 characters.";
560
- };
561
- readonly logo: {
562
- readonly label: "Logo";
563
- readonly drop: "Drop an image here";
564
- readonly helper: "PNG, JPEG, WebP, GIF or SVG, up to 1 MB. Replaces the built-in mark everywhere.";
565
- readonly upload: "Upload logo";
566
- readonly replace: "Replace logo";
567
- readonly remove: "Remove";
568
- readonly uploaded: "Logo updated";
569
- readonly removed: "Logo removed";
570
- readonly tooLarge: "That image is larger than 1 MB.";
571
- readonly badType: "Choose a PNG, JPEG, WebP, GIF or SVG image.";
572
- readonly undo: "Undo";
573
- };
574
- readonly showVersion: {
575
- readonly label: "Version in the sidebar";
576
- readonly helper: "The build number beside the logo. Off hides which version you run.";
577
- };
578
- };
579
- readonly security: {
580
- readonly heading: "Security";
581
- readonly require2fa: {
582
- readonly label: "Require two-factor auth";
583
- readonly desc: "Every member must enable 2FA to sign in.";
584
- };
585
- readonly allowSignup: {
586
- readonly label: "Allow self-signup";
587
- readonly desc: "Anyone can create an account — off keeps this workspace invite-only.";
588
- };
589
- readonly sessionTtl: {
590
- readonly label: "Session lifetime (hours)";
591
- readonly error: "Between {min, number} and {max, number} hours.";
592
- };
593
- readonly passwordMin: {
594
- readonly label: "Minimum password length";
595
- readonly error: "Between {min, number} and {max, number} characters.";
596
- };
597
- };
598
- readonly review: {
599
- readonly title: "Save workspace settings";
600
- readonly subtitle: "Review your changes before saving.";
601
- readonly confirm: "Save changes";
602
- readonly cancel: "Cancel";
603
- readonly close: "Close";
604
- readonly on: "On";
605
- readonly off: "Off";
606
- readonly shown: "Shown";
607
- readonly hidden: "Hidden";
608
- readonly change: "{before} → {after}";
609
- };
610
- readonly defaultsCard: {
611
- readonly heading: "Appearance & language defaults";
612
- readonly body: "Workspace-wide theme, accent, density and language live under Global defaults.";
613
- readonly cta: "Open global defaults";
614
- };
615
- readonly danger: {
616
- readonly heading: "Danger zone";
617
- readonly subtitle: "Irreversible actions.";
618
- readonly empty: "Nothing to delete — no connections yet.";
619
- readonly deleteDesc: "Deletes the connection and its generated pages. Your database is not touched. Cannot be undone.";
620
- readonly deleteCta: "Delete connection";
621
- };
622
- readonly aiCard: {
623
- readonly heading: "AI enrichment";
624
- readonly body: "Configure an AI provider (or the copy-paste round-trip) to enrich labels, groups and relations.";
625
- readonly cta: "Open AI settings";
626
- };
627
- readonly pagesCard: {
628
- readonly heading: "Pages";
629
- readonly body: "Add, edit and delete pages, change what each one shows, and reorder the sidebar.";
630
- readonly cta: "Manage pages";
631
- };
632
- };
633
- readonly settingsAi: {
634
- readonly title: "AI enrichment";
635
- readonly subtitle: "Connect a model to let Adminium suggest labels, groups, relations and more — always reviewed as a diff before anything applies.";
636
- readonly saved: "AI provider saved";
637
- readonly saveFailed: "Could not save the AI provider. Try again.";
638
- readonly save: "Save provider";
639
- readonly test: "Test connection";
640
- readonly testHintDirty: "Save your changes before testing.";
641
- readonly testing: "Pinging the provider…";
642
- readonly testError: "Test failed";
643
- readonly testErrorBody: "Could not reach the provider. Check the key and base URL.";
644
- readonly testOk: "Connected to {model} in {latency} ms";
645
- readonly testUnknownModel: "the provider";
646
- readonly provider: {
647
- readonly heading: "AI provider";
648
- readonly subtitle: "Choose how Adminium reaches a model to enrich your schema. Keys are stored encrypted and never shown again.";
649
- readonly active: "Active";
650
- readonly anthropic: {
651
- readonly label: "Anthropic";
652
- readonly desc: "Claude models via the Anthropic API.";
653
- };
654
- readonly openai: {
655
- readonly label: "OpenAI";
656
- readonly desc: "GPT models via the OpenAI API.";
657
- };
658
- readonly openaiCompatible: {
659
- readonly label: "OpenAI-compatible";
660
- readonly desc: "Any endpoint that speaks the OpenAI wire format — Groq, Together, vLLM, LM Studio.";
661
- };
662
- readonly ollama: {
663
- readonly label: "Ollama (local)";
664
- readonly desc: "Models running locally through Ollama — no key, no cloud.";
665
- };
666
- readonly requiresNetwork: "Requires internet & an API key";
667
- readonly networkDisabledTitle: "Direct AI providers are turned off on this install";
668
- readonly networkDisabledBody: "This Adminium is configured with no outbound internet access, so it cannot reach a provider API. Use the copy-paste round-trip below — it needs no key and no network.";
669
- };
670
- readonly configure: {
671
- readonly heading: "Configure {provider}";
672
- };
673
- readonly field: {
674
- readonly baseUrl: "Base URL";
675
- readonly baseUrlOptional: "Leave as-is unless Ollama runs on another host.";
676
- readonly baseUrlHelper: "The endpoint root that serves /chat/completions.";
677
- readonly model: "Model";
678
- readonly modelFreeText: "Enter the exact model id your endpoint serves.";
679
- readonly modelLive: "Loaded live from the provider.";
680
- readonly modelStatic: "A known-good list; type a custom id after saving to refresh it.";
681
- readonly modelLoading: "Loading…";
682
- readonly modelPlaceholder: "Select a model…";
683
- readonly key: "API key";
684
- readonly keyStored: "Stored encrypted. Replace it to use a different key.";
685
- readonly keyMask: "sk-…{last4}";
686
- readonly keyReplace: "Replace key";
687
- readonly keyOptional: "Optional — some endpoints need no key.";
688
- readonly keyWriteOnly: "Write-only: once saved it is never shown again.";
689
- readonly noKeyTitle: "No API key needed";
690
- readonly noKeyBody: "Ollama runs locally, so nothing leaves this machine.";
691
- };
692
- readonly runStatus: {
693
- readonly draft: "Draft";
694
- readonly running: "Running";
695
- readonly awaitingResponse: "Awaiting response";
696
- readonly validated: "Validated";
697
- readonly applied: "Applied";
698
- readonly partiallyApplied: "Partially applied";
699
- readonly failed: "Failed";
700
- readonly discarded: "Discarded";
701
- };
702
- readonly byo: {
703
- readonly heading: "No key? Use your own AI tool";
704
- readonly subtitle: "The copy-paste round-trip — nothing leaves this machine.";
705
- readonly body: "Studio can generate a self-contained prompt from your schema. Run it in Claude Code, ChatGPT, or any tool you like, then paste the JSON it returns back into the connect wizard. Same validation, same review, same result as the direct path.";
706
- readonly guaranteeTitle: "Telemetry-free guarantee";
707
- readonly guarantee1: "The prompt carries only your schema and aggregate stats — never row data by default.";
708
- readonly guarantee2: "No credentials, instance URL, or identifiers are embedded.";
709
- readonly guarantee3: "BYO runs make zero network calls.";
710
- readonly promptVersion: "Prompt {version}";
711
- readonly schemaVersion: "Schema {version}";
712
- readonly headingRecommended: "Use your own AI tool — no key needed";
713
- readonly recommended: "Recommended";
714
- };
715
- readonly history: {
716
- readonly heading: "Run history";
717
- readonly subtitle: "Past enrichment runs. Open one to review its suggestions.";
718
- readonly tableLabel: "Enrichment runs";
719
- readonly colDate: "Date";
720
- readonly colSource: "Source";
721
- readonly colStatus: "Status";
722
- readonly colChunks: "Chunks";
723
- readonly openReview: "Open review for the run from {date}";
724
- readonly connection: "Connection";
725
- readonly empty: "No enrichment runs yet. Enrich a schema from the connect wizard to see history here.";
726
- readonly errorTitle: "Could not load runs";
727
- readonly errorBody: "Refresh the page to try again.";
728
- readonly noConnections: "Connect a database first — enrichment runs are recorded per connection.";
729
- readonly byo: "BYO";
730
- readonly directPath: "Direct";
731
- };
732
- };
733
- readonly enrich: {
734
- readonly title: "Enrich with AI";
735
- readonly subtitle: "Optionally refine the generated labels, groups, enums and dashboards with an LLM. The heuristic baseline works without it — this only adds suggestions you review before anything applies.";
736
- readonly intentLabel: "How would you like to enrich?";
737
- readonly sectionsLegend: "What should the AI decide?";
738
- readonly localesLegend: "Translate labels into";
739
- readonly localeLocked: "(required)";
740
- readonly samplingTitle: "Include sample values";
741
- readonly samplingHint: "Includes up to 20 real values per non-PII column in the prompt.";
742
- readonly samplingPreviewTitle: "What leaves this machine";
743
- readonly samplingPreviewBody: "Up to 20 most-common values per non-PII column, plus min/max for numeric and date columns. PII-flagged columns are never sampled. Everything else stays aggregate-only. Review the exact prompt before copying (BYO) — nothing is sent without your action.";
744
- readonly noSections: "Select at least one decision group to enrich.";
745
- readonly generatePrompt: "Generate prompt";
746
- readonly startProvider: "Start enrichment";
747
- readonly startOver: "Start over";
748
- readonly copied: "Copied";
749
- readonly createFailed: "Could not build the enrichment prompt — retry.";
750
- readonly createFailedTitle: "Could not start";
751
- readonly providerFallback: "your AI provider";
752
- readonly fileTitle: "AI enrichment needs a live database";
753
- readonly fileBody: "Schema-file sources have no snapshot to enrich yet. Connect a live database to use AI enrichment, or continue — the heuristic baseline still generates a complete app.";
754
- readonly section: {
755
- readonly labels: "Labels & descriptions";
756
- readonly groups: "Navigation groups";
757
- readonly enums: "Enum semantics";
758
- readonly relations: "Relations";
759
- readonly keys: "Key columns";
760
- readonly templates: "Page templates";
761
- readonly widgets: "Dashboard widgets";
762
- readonly pii: "PII & masking";
763
- readonly icons: "Icons";
764
- readonly microcopy: "Micro-copy";
765
- };
766
- readonly provider: {
767
- readonly title: "Use my AI provider";
768
- readonly description: "Run enrichment now against your configured provider. You review every suggestion as a diff.";
769
- readonly unconfigured: "No AI provider is configured yet — copy a prompt to your own tool below, or configure a provider first.";
770
- readonly settingsHint: "Want to run it directly?";
771
- readonly settingsLink: "Configure a provider in Settings → AI";
772
- readonly networkDisabled: "This Adminium has no outbound internet access, so it cannot reach a provider API. Use the copy-paste round-trip instead — same prompt, same review.";
773
- };
774
- readonly byo: {
775
- readonly cardTitle: "Copy a prompt to my own AI tool";
776
- readonly cardDescription: "Copy a self-contained prompt into Claude Code, ChatGPT, anything — then paste the JSON back. No key needed, nothing leaves this machine automatically.";
777
- readonly guidance: "Run this in any AI tool — Claude Code, ChatGPT, anything. Paste the JSON it returns below.";
778
- readonly promptLabel: "Enrichment prompt";
779
- readonly promptLabelN: "Enrichment prompt {index} of {total}";
780
- readonly tokenChip: "≈ {tokens} tokens";
781
- readonly copyPrompt: "Copy prompt";
782
- readonly copyPromptDone: "Prompt copied";
783
- readonly download: "Download .md";
784
- readonly chunkTabs: "Prompt chunks";
785
- readonly chunkTab: "Prompt {index}";
786
- readonly chunkValid: "Chunk {index} validated";
787
- readonly pasteLabel: "Paste the JSON response";
788
- readonly pastePlaceholder: "Paste the JSON response here…";
789
- readonly validate: "Validate";
790
- readonly valid: "Response validated";
791
- readonly mergedTitle: "All {count} chunks validated and merged";
792
- readonly mergedTitleSingle: "Response validated";
793
- readonly mergedBody: "Suggestions are ready to review against the heuristic baseline.";
794
- readonly errorsTitle: "Validation found {count} issues";
795
- readonly copyErrors: "Copy errors for your AI tool";
796
- readonly copyErrorsDone: "Errors copied";
797
- readonly copyErrorsHint: "Paste this back into your AI tool to get a corrected response.";
798
- readonly droppedItems: "{count} suggestions were dropped during validation — review shows the rest.";
799
- readonly pendingTitle: "Validate every prompt to continue";
800
- readonly pendingBody: "Paste the JSON response above and validate it to continue to review.";
801
- readonly pendingBodyChunked: "Each chunk must validate before the suggestions merge. Paste and validate every prompt above.";
802
- readonly requestFailed: "Could not reach the server to validate — retry.";
803
- readonly continueReview: "Continue to review";
804
- readonly wholeDocument: "whole document";
805
- readonly cardTitleRecommended: "Copy a prompt to my own AI tool — recommended";
806
- };
807
- readonly direct: {
808
- readonly title: "Enriching with AI";
809
- readonly subtitle: "Sending your schema to";
810
- readonly building: "Building prompt…";
811
- readonly logLabel: "Enrichment log";
812
- readonly cancel: "Cancel";
813
- readonly back: "Back to options";
814
- readonly retry: "Retry";
815
- readonly done: "Enrichment complete — review the suggestions.";
816
- readonly continueReview: "Continue to review";
817
- readonly failed: "The provider run failed. Check your AI settings and retry.";
818
- readonly jobFailed: "The enrichment run did not finish.";
819
- readonly startFailed: "Could not start the run — retry.";
820
- readonly errorTitle: "Enrichment failed";
821
- };
822
- readonly skip: {
823
- readonly title: "Skip — use heuristics only";
824
- readonly description: "Generate from the heuristic baseline. You can enrich later from Settings → AI — skipping is never penalized.";
825
- readonly confirmTitle: "Continuing with heuristics";
826
- readonly confirmBody: "The generated app will use the heuristic labels, groups and dashboards. Continue to generate — you can run AI enrichment any time from Settings → AI.";
827
- };
828
- };
829
- readonly review: {
830
- readonly unavailableTitle: "Review screen not available";
831
- readonly unavailableBody: "This build does not include the enrichment review screen yet (06-T14). It lands with the diff-and-apply flow.";
832
- };
833
- readonly llmRuns: {
834
- readonly review: {
835
- readonly header: {
836
- readonly title: "Review AI suggestions";
837
- readonly model: "Model";
838
- readonly snapshot: "Snapshot";
839
- readonly byo: "BYO";
840
- readonly pathDirect: "Direct API";
841
- readonly pathByo: "Copy-paste";
842
- readonly agree: "{n} agree";
843
- readonly conflict: "{n} conflict";
844
- readonly new: "{n} new";
845
- readonly rejects: "{n} rejects";
846
- readonly countsAria: "Suggestion counts";
847
- };
848
- readonly bulk: {
849
- readonly thresholdLabel: "Confidence threshold";
850
- readonly thresholdAria: "Accept-all confidence threshold";
851
- readonly acceptAll: "Accept all ≥ {pct}%";
852
- readonly clear: "Clear selection";
853
- };
854
- readonly section: {
855
- readonly selectAllAria: "Select all in {group}";
856
- readonly acceptedCount: "{n} accepted";
857
- };
858
- readonly group: {
859
- readonly labels: "Labels & translations";
860
- readonly navigation: "Navigation & domains";
861
- readonly enums: "Enum semantics";
862
- readonly relations: "Relations";
863
- readonly keys: "Key columns";
864
- readonly templates: "Page templates";
865
- readonly dashboards: "Dashboards & widgets";
866
- readonly pii: "PII & masking";
867
- readonly icons: "Icons";
868
- readonly microcopy: "Micro-copy";
869
- };
870
- readonly status: {
871
- readonly agree: "Agrees";
872
- readonly conflict: "Conflict";
873
- readonly new: "New";
874
- readonly heuristicOnly: "Heuristic only";
875
- readonly rejects: "Rejects heuristic";
876
- readonly locked: "Locked";
877
- };
878
- readonly row: {
879
- readonly acceptAria: "Accept {noun} suggestion for {target}";
880
- readonly keptEdited: "kept — edited by you";
881
- readonly rejectsCallout: "The AI rejects a heuristic decision — confirm before accepting.";
882
- readonly showTranslations: "Show translations";
883
- readonly hideTranslations: "Hide translations";
884
- readonly confidenceAria: "Confidence {pct}%";
885
- readonly noAi: "No AI suggestion";
886
- };
887
- readonly value: {
888
- readonly none: "No value";
889
- readonly absent: "None";
890
- readonly dash: "—";
891
- readonly display: "Display";
892
- readonly key: "Key";
893
- readonly rank: "rank {n}";
894
- readonly span: "span {n}";
895
- readonly tableCount: "{n} tables";
896
- readonly widgetCount: "{n} widgets";
897
- readonly enumWorkflow: "Workflow";
898
- readonly enumCategory: "Category";
899
- readonly notPii: "Not PII";
900
- readonly label: "Label";
901
- readonly description: "Description";
902
- readonly subtitle: "Page subtitle";
903
- readonly headline: "Empty-state headline";
904
- readonly guidance: "Empty-state guidance";
905
- };
906
- readonly apply: {
907
- readonly title: "Apply {n} suggestions";
908
- readonly subtitle: "These changes are written in one transaction and can be undone.";
909
- readonly empty: "Nothing selected to apply.";
910
- readonly confirm: "Apply changes";
911
- };
912
- readonly footer: {
913
- readonly count: "{n} suggestions selected";
914
- readonly apply: "Apply {n} accepted suggestions";
915
- readonly failed: "Apply failed";
916
- };
917
- readonly toast: {
918
- readonly applied: "Applied {n} suggestions";
919
- readonly appliedPartial: "Applied {n} suggestions (some skipped)";
920
- readonly applyFailed: "Could not apply suggestions";
921
- readonly undoFailed: "Could not undo this change";
922
- };
923
- readonly error: {
924
- readonly title: "Could not load this run";
925
- };
926
- readonly notReady: {
927
- readonly title: "This run has no suggestions to review yet";
928
- readonly body: "A run must be validated before its suggestions can be reviewed. Generate or paste a response first.";
929
- };
930
- readonly applied: {
931
- readonly title: "This run has been applied";
932
- readonly body: "The accepted suggestions below are read-only.";
933
- };
934
- readonly empty: {
935
- readonly title: "No suggestions";
936
- readonly body: "This run produced no suggestions to review.";
937
- };
938
- readonly cat: {
939
- readonly label: "label";
940
- readonly key: "key columns";
941
- readonly enum: "enum";
942
- readonly relation: "relation";
943
- readonly pii: "PII";
944
- readonly template: "page template";
945
- readonly group: "navigation group";
946
- readonly dashboard: "dashboard";
947
- readonly widget: "widget";
948
- readonly copy: "micro-copy";
949
- };
950
- };
951
- };
952
- readonly wizard: {
953
- readonly title: "New connection";
954
- readonly back: "Back";
955
- readonly continue: "Continue";
956
- readonly progress: "Setup progress";
957
- readonly persistFailed: "Could not save your table selection — retry.";
958
- readonly persistFailedTitle: "Save failed";
959
- readonly bridgeAppliedTitle: "Connection string received";
960
- readonly bridgeAppliedBody: "Handed over from adminium.dev by your browser — it went straight to this machine and was never uploaded. Check it below, then continue.";
961
- readonly bridgeFailedTitle: "That hand-off could not be used";
962
- readonly bridgeFailedBody: "It has already been used or has expired. Paste your connection string below instead.";
963
- readonly step: {
964
- readonly source: "Source";
965
- readonly test: "Analyze";
966
- readonly tables: "Tables";
967
- readonly meta: "Meta storage";
968
- readonly intent: "Intent";
969
- readonly enrich: "Enrich";
970
- readonly generate: "Generate";
971
- };
972
- };
973
- readonly meta: {
974
- readonly title: "Where should Adminium keep its own tables?";
975
- readonly subtitle: "Pages, roles, audit log and settings live in adminium_-prefixed tables — never mixed into your data.";
976
- readonly sameDb: {
977
- readonly title: "Same database";
978
- readonly description: "adminium_* tables are created beside your source tables. Simplest setup — needs a role with write and CREATE TABLE privileges.";
979
- readonly disabledReadOnly: "Your role is read-only — Adminium never writes to this database. Choose a separate database for Adminium’s own tables.";
980
- readonly disabledNoDdl: "This role cannot run DDL — Adminium migrations need CREATE TABLE. Choose a separate database for Adminium’s own tables.";
981
- readonly disabledFile: "A schema file has no live database — choose a separate database for Adminium’s own tables.";
982
- };
983
- readonly separate: {
984
- readonly title: "Separate database";
985
- readonly description: "Adminium keeps its tables in a different database. Your source stays untouched — required for read-only sources.";
986
- readonly dsn: "Meta database connection string";
987
- readonly helper: "Needs write + DDL privileges — Adminium runs its own migrations there.";
988
- readonly test: "Test connection";
989
- readonly ok: "Compatible — write ✓ · DDL ✓";
990
- readonly insufficient: "This role cannot host the meta store — Adminium needs write and CREATE TABLE privileges there.";
991
- readonly errorTitle: "Meta store not compatible";
992
- };
993
- readonly testFailed: "Connection failed.";
994
- readonly v1Note: {
995
- readonly title: "About this install";
996
- readonly body: "This server already keeps its own tables in a configured database, and this step does not move them. It validates that your choice is compatible with this connection — the server enforces the same rule independently (409 META_PLACEMENT_INVALID).";
997
- };
998
- readonly move: {
999
- readonly title: "Moving Adminium’s tables";
1000
- readonly copying: "Moving Adminium’s tables…";
1001
- readonly restarting: "Restarting…";
1002
- readonly copyingBody: "Copying every adminium_ table into the new database. Your source data is not touched, and nothing is switched over until the copy is verified.";
1003
- readonly restartingBody: "The copy is done. Adminium is restarting onto the new database — this page will continue by itself in a few seconds.";
1004
- readonly failed: "Could not move Adminium’s tables — retry.";
1005
- readonly timeout: "Adminium moved its tables but has not come back yet. Your data is safe in the new database — reload this page in a moment.";
1006
- };
1007
- readonly willMove: {
1008
- readonly title: "This will move Adminium’s tables";
1009
- readonly body: "Adminium is currently using its built-in SQLite store. Continue copies that store into the database you picked and restarts onto it — accounts, pages and settings come with it, so you stay signed in.";
1010
- };
1011
- };
1012
- readonly intent: {
1013
- readonly title: "What do you need?";
1014
- readonly subtitle: "The intent shapes which pages get generated. You can change it later — changing it proposes a regeneration, never a silent rewrite.";
1015
- readonly trust: "We read your schema only — never your row data during setup.";
1016
- readonly fullAdmin: {
1017
- readonly title: "Full admin panel";
1018
- readonly description: "Dashboards, CRUD pages, search, imports and exports — everything your schema supports.";
1019
- };
1020
- readonly analytics: {
1021
- readonly title: "Read-only analytics";
1022
- readonly description: "Dashboards, charts and read-only grids. No forms, no writes — every role capped at Viewer.";
1023
- };
1024
- readonly crud: {
1025
- readonly title: "CRUD tables";
1026
- readonly description: "One editing page per table plus search and import/export — a minimal home, no dashboards.";
1027
- };
1028
- readonly support: {
1029
- readonly title: "Support console";
1030
- readonly description: "Queues, ticket and customer detail pages first. Deletes off by default. (Queue templates land in M7 — the v1 page set matches Full admin.)";
1031
- };
1032
- };
1033
- readonly generate: {
1034
- readonly title: "Generate your app";
1035
- readonly subtitle: "One page per included table plus dashboards per domain — intent:";
1036
- readonly run: "Generate dashboard";
1037
- readonly openApp: "Open your app";
1038
- readonly logLabel: "Generation log";
1039
- readonly log: {
1040
- readonly classifying: "Classifying schema…";
1041
- readonly composing: "Composing templates…";
1042
- readonly writing: "Writing pages…";
1043
- readonly done: "{pages} pages generated across {groups} nav groups";
1044
- };
1045
- readonly successTitle: "Your dashboard is ready";
1046
- readonly successBody: "{pages} pages across {groups} navigation groups — generated from your schema, editable in Studio.";
1047
- readonly errorTitle: "Generation failed";
1048
- readonly failed: "Generation failed — retry, or re-run introspection first.";
1049
- readonly fileTitle: "Schema file parsed — generation needs a live database";
1050
- readonly fileBody: "Your schema parsed cleanly and the preview above is real. Generating a running app straight from a schema file (with placeholder rows) is not available yet — connect a live database to generate today.";
1051
- };
1052
- readonly remap: {
1053
- readonly column: {
1054
- readonly nullable: "nullable";
1055
- readonly labelOverride: "Display label";
1056
- readonly labelHelper: "Inferred: {name}";
1057
- readonly logicalType: "Logical type";
1058
- readonly logicalTypeHelper: "Inferred: {type} (from {dbType}) — mapped by the adapter; not overridable in v1.";
1059
- readonly semantic: "Semantic type";
1060
- readonly unclassified: "Not classified yet.";
1061
- readonly semanticHelper: "Classifier: {tag} · {confidence}% confidence · source: {source}";
1062
- readonly semanticInferred: "inferred: {tag}";
1063
- readonly currency: "Currency";
1064
- readonly currencyHelper: "ISO 4217 code applied to money formatting.";
1065
- readonly pii: "Mask by default";
1066
- readonly piiHelper: "Masked values render redacted; unmasking requires the data.unmask_pii permission and is audit-logged.";
1067
- readonly enum: "Enum semantics";
1068
- readonly enumKind: "Enum kind";
1069
- readonly enumWorkflow: "Workflow";
1070
- readonly enumCategory: "Category";
1071
- readonly enumLabelFor: "Label for {value}";
1072
- readonly enumToneFor: "Tone for {value}";
1073
- readonly enumToneAuto: "auto";
1074
- readonly enumHelper: "Workflow enums drive status pills and board columns; tones map values onto the semantic tint scale.";
1075
- };
1076
- readonly diff: {
1077
- readonly one: "1 change";
1078
- readonly count: "{count} changes";
1079
- readonly saved: "Overrides saved.";
1080
- readonly revertOne: "Revert {change}";
1081
- readonly regenerate: "Regenerate pages";
1082
- readonly revertAll: "Revert all";
1083
- readonly save: "Save overrides";
1084
- };
1085
- readonly table: {
1086
- readonly iconPicker: "Table icon";
1087
- readonly system: "System";
1088
- readonly labelOverride: "Display label";
1089
- readonly labelHelper: "Inferred: {name}";
1090
- readonly icon: "Icon";
1091
- readonly navGroup: "Nav group";
1092
- readonly navGroupHelper: "Nav placement is decided by the generator — a table.navGroup override is not in the v1 vocabulary.";
1093
- readonly include: "Include in generated app";
1094
- readonly includeHelper: "Excluded tables get no pages and disappear from nav.";
1095
- readonly shape: "Table shape (classified)";
1096
- readonly role: "Role";
1097
- readonly unclassified: "Not classified";
1098
- readonly kind: "Kind";
1099
- readonly hierarchy: "Hierarchy";
1100
- readonly selfFk: "Self-reference via {column}";
1101
- readonly polymorphic: "Polymorphic pairs";
1102
- readonly rows: "Row estimate";
1103
- readonly shapeHelper: "Classification is recomputed on every introspection; overrides layer on top and survive regeneration.";
1104
- };
1105
- readonly relations: {
1106
- readonly declared: "Declared foreign keys";
1107
- readonly noneDeclared: "No declared foreign keys touch this table.";
1108
- readonly inferred: "Inferred relations";
1109
- readonly noneInferred: "Nothing inferred for this table.";
1110
- readonly confidence: "inferred · {pct}%";
1111
- readonly accepted: "Accepted";
1112
- readonly suppressed: "Suppressed";
1113
- readonly accept: "Accept";
1114
- readonly suppress: "Suppress";
1115
- readonly overrides: "Override relations (applied)";
1116
- readonly overrideBadge: "override";
1117
- readonly add: "Add virtual relation";
1118
- readonly fromColumn: "From column";
1119
- readonly noColumns: "No matching column";
1120
- readonly fromPlaceholder: "customer_id";
1121
- readonly toTable: "To table";
1122
- readonly noTables: "No matching table";
1123
- readonly toColumn: "To column";
1124
- readonly cardinality: "Cardinality";
1125
- readonly addButton: "Add relation";
1126
- };
1127
- readonly toast: {
1128
- readonly saved: "Schema overrides saved";
1129
- readonly savedDetail: "The applied schema below reflects your changes.";
1130
- readonly regenerated: "{created} created · {updated} updated · {unchanged} unchanged";
1131
- readonly regeneratedDetail: "Pages you edited by hand are preserved — only pages with an untouched generated_hash were regenerated in place.";
1132
- readonly regenerateFailed: "Regeneration failed";
1133
- };
1134
- readonly title: "Schema remap";
1135
- readonly subtitle: "{tables} tables · {applied} overrides applied";
1136
- readonly saveFailed: "Save failed: {message}";
1137
- readonly loadFailed: "Could not load the schema for this connection.";
1138
- readonly inspector: "Inspector";
1139
- readonly empty: {
1140
- readonly title: "Pick a table or column";
1141
- readonly description: "Select something in the schema tree to remap its label, type, relations or masking.";
1142
- };
1143
- readonly tabs: {
1144
- readonly details: "Details";
1145
- readonly relations: "Relations";
1146
- };
1147
- readonly tree: {
1148
- readonly label: "Schema";
1149
- readonly search: "Search tables and columns";
1150
- readonly searchPlaceholder: "Search tables…";
1151
- readonly noMatches: "No tables match your search.";
1152
- readonly collapse: "Collapse table";
1153
- readonly expand: "Expand table";
1154
- readonly unsaved: "Unsaved change";
1155
- readonly excluded: "Excluded";
1156
- };
387
+ readonly translations: {
388
+ readonly title: "Languages & translations";
389
+ readonly subtitle: "Change any wording in Adminium, choose which languages people can pick, and add languages of your own.";
390
+ readonly warning: "Error messages and sign-in text are editable too. Those are what people read when something goes wrong, so change them carefully.";
391
+ readonly editor: {
392
+ readonly heading: "Edit translations";
393
+ };
394
+ readonly localeLabel: "Language";
395
+ readonly groupLabel: "Area";
396
+ readonly allAreas: "All areas";
397
+ readonly stateLabel: "Show";
398
+ readonly state: {
399
+ readonly all: "Everything";
400
+ readonly overridden: "Customised only";
401
+ readonly untranslated: "Untranslated only";
402
+ readonly stale: "English changed since";
403
+ };
404
+ readonly searchLabel: "Search";
405
+ readonly searchPlaceholder: "Key or English text";
406
+ readonly loading: "Loading strings…";
407
+ readonly noMatches: "No strings match those filters.";
408
+ readonly count: "{total, plural, one {# string} other {# strings}}";
1157
409
  readonly badge: {
1158
- readonly pk: "PK";
1159
- readonly fk: "FK";
1160
- readonly unique: "UNIQUE";
1161
- readonly pii: "PII";
1162
- readonly masked: "Masked";
410
+ readonly custom: "Customised";
411
+ readonly stale: "English changed";
412
+ readonly a11y: "Accessible name";
413
+ };
414
+ readonly sourceLabel: "English source";
415
+ readonly valueLabel: "Translation";
416
+ readonly save: "Save";
417
+ readonly saved: "Translation saved";
418
+ readonly resetAction: "Reset to built-in";
419
+ readonly reset: "Reset to the built-in text";
420
+ readonly locales: {
421
+ readonly heading: "Available languages";
422
+ readonly help: "Turn a language off to remove it from every language picker. Anyone already using it keeps it until they choose another.";
423
+ };
424
+ readonly locale: {
425
+ readonly builtin: "Built in";
426
+ readonly custom: "Custom";
427
+ readonly overrides: "{count, plural, =0 {no custom text} one {# custom string} other {# custom strings}}";
428
+ readonly enable: "Turn on";
429
+ readonly disable: "Turn off";
430
+ readonly delete: "Delete";
431
+ readonly deleted: "Language removed";
432
+ readonly deletedDetail: "{users, plural, one {# person} other {# people}} moved back to the workspace default; {strings, plural, one {# translation} other {# translations}} deleted.";
433
+ readonly deleteFailed: "Could not remove that language";
434
+ readonly add: "Add a language";
435
+ readonly added: "Language added";
436
+ readonly create: "Add language";
437
+ readonly id: "Language code";
438
+ readonly intlTag: "Formatting rules from";
439
+ readonly native: "Name in the language itself";
440
+ readonly english: "Name in English";
441
+ readonly dir: "Text direction";
442
+ readonly ltr: "Left to right";
443
+ readonly rtl: "Right to left";
444
+ readonly font: "Script";
445
+ readonly latin: "Latin";
446
+ readonly arabic: "Arabic";
447
+ readonly cjk: "Chinese / Japanese / Korean";
448
+ readonly intlHelp: "Formatting rules decide how numbers, dates and plurals behave. Pick the closest language that already has them — it does not have to match your language code.";
1163
449
  };
1164
- readonly unavailableTitle: "Schema remap editor not available";
1165
450
  };
1166
451
  };
1167
452
  readonly onboarding: {
@@ -2261,166 +1546,6 @@ declare const _default: {
2261
1546
  readonly toLight: "Light mode";
2262
1547
  readonly toDark: "Dark mode";
2263
1548
  };
2264
- readonly studioPages: {
2265
- readonly title: "Pages";
2266
- readonly subtitle: "Add, edit and organise the pages of your app, and the order they appear in the sidebar.";
2267
- readonly createButton: "New page";
2268
- readonly loadFailed: {
2269
- readonly title: "Pages could not be loaded";
2270
- readonly body: "Managing pages needs the “Manage pages” permission. Ask an administrator to grant it to one of your roles.";
2271
- };
2272
- readonly tab: {
2273
- readonly pages: "All pages";
2274
- readonly sidebar: "Sidebar order";
2275
- };
2276
- readonly list: {
2277
- readonly title: "Pages";
2278
- readonly count: "{count, plural, one {# page} other {# pages}}";
2279
- };
2280
- readonly empty: {
2281
- readonly title: "No pages yet";
2282
- readonly body: "Connect a database to generate pages automatically, or create one by hand.";
2283
- };
2284
- readonly status: {
2285
- readonly live: "Live";
2286
- readonly hidden: "Hidden";
2287
- };
2288
- readonly origin: {
2289
- readonly generated: "Generated";
2290
- readonly manifest: "Add-on";
2291
- readonly llm: "Assistant";
2292
- readonly system: "System";
2293
- readonly user: "Custom";
2294
- };
2295
- readonly row: {
2296
- readonly menu: "Actions for {title}";
2297
- };
2298
- readonly action: {
2299
- readonly edit: "Edit page";
2300
- readonly duplicate: "Duplicate";
2301
- readonly hide: "Hide from sidebar";
2302
- readonly show: "Show in sidebar";
2303
- readonly delete: "Delete page";
2304
- };
2305
- readonly create: {
2306
- readonly title: "New page";
2307
- readonly failed: "The page could not be created";
2308
- readonly submit: "Create page";
2309
- readonly subtitle: "Pick what this page shows and how it looks.";
2310
- };
2311
- readonly duplicate: {
2312
- readonly title: "Duplicate page";
2313
- readonly failed: "The page could not be duplicated";
2314
- readonly submit: "Duplicate";
2315
- };
2316
- readonly delete: {
2317
- readonly title: "Delete this page?";
2318
- readonly body: "This cannot be undone. Saved views and personal layouts on this page are deleted for everyone.";
2319
- readonly bodyGenerated: "This page was created by schema generation, so it will come back the next time you regenerate. Saved views and personal layouts on it are deleted for everyone.";
2320
- readonly prompt: "Type {slug} to confirm";
2321
- readonly confirm: "Delete page";
2322
- };
2323
- readonly field: {
2324
- readonly title: "Title";
2325
- readonly titleHint: "Shown in the sidebar and the page header.";
2326
- readonly slug: "Page address";
2327
- readonly slugHint: "Lowercase letters, numbers and dashes. Just the last part — the rest of the address is added for you.";
2328
- readonly slugTaken: "Another page already uses this address.";
2329
- readonly slugWarning: "Changing the address breaks existing links and bookmarks to this page.";
2330
- readonly template: "Template";
2331
- readonly templateHint: "Decides what the page can hold. You can change it later.";
2332
- readonly group: "Sidebar group";
2333
- readonly groupHint: "Which section of the sidebar it appears in.";
2334
- readonly icon: "Icon";
2335
- readonly iconHint: "Shown beside the page name in the sidebar.";
2336
- readonly visible: "Show in sidebar";
2337
- readonly visibleHint: "A hidden page stays reachable at its URL for anyone who has the link.";
2338
- readonly table: "Table";
2339
- readonly tableCreateHint: "The table this page reads. You can bind it later.";
2340
- readonly tableNone: "Not bound";
2341
- readonly tableNeedsConnection: "Pick a data source first.";
2342
- readonly connection: "Data source";
2343
- readonly connectionNone: "None";
2344
- readonly iconPick: "Choose the page icon";
2345
- readonly padding: "Page padding";
2346
- };
2347
- readonly editor: {
2348
- readonly title: "Edit page";
2349
- readonly save: "Save changes";
2350
- readonly saveFailed: "Changes could not be saved";
2351
- readonly openPage: "Open page";
2352
- readonly generated: {
2353
- readonly title: "This page was generated from your schema";
2354
- readonly body: "Your changes survive regeneration. Deleting only lasts until the next run recreates it.";
2355
- };
2356
- readonly contentUnavailable: "Page contents could not be loaded";
2357
- readonly contentUnavailableBody: "The details above can still be saved.";
2358
- readonly contentInvalid: "This page’s configuration is not readable";
2359
- readonly contentInvalidBody: "It was written by a newer version, or it is malformed. Regenerate the page or delete it.";
2360
- readonly data: "Data";
2361
- readonly schemaFailed: "Tables could not be listed";
2362
- readonly schemaFailedBody: "This connection may not have been analysed yet. Run introspection from Studio → Data connections.";
2363
- readonly notBindable: "This template is not bound to one table";
2364
- readonly notBindableBody: "Its contents are built widget by widget instead. Open the page and use Edit to add them.";
2365
- readonly recompose: "This page will be rebuilt";
2366
- readonly recomposeBody: "Saving rebuilds the contents. Column and widget edits here are lost.";
2367
- readonly missing: "That page no longer exists";
2368
- readonly missingBody: "It may have been deleted, or removed by a regeneration run.";
2369
- readonly details: "Details";
2370
- readonly itemsPending: "Save the change above first — the contents are rebuilt from it.";
2371
- readonly columns: "Columns";
2372
- readonly appearance: "Appearance";
2373
- };
2374
- readonly sidebar: {
2375
- readonly help: "Reorder pages within a group, or move one to another group. Changes apply to every user.";
2376
- readonly discard: "Discard";
2377
- readonly save: "Save order";
2378
- readonly saveFailed: "The new order could not be saved";
2379
- readonly emptyGroup: "No pages in this group.";
2380
- readonly moveUp: "Move {title} up";
2381
- readonly moveDown: "Move {title} down";
2382
- readonly moveTo: "Move {title} to a group";
2383
- readonly ungrouped: {
2384
- readonly title: "Some pages are in no sidebar group";
2385
- readonly body: "These pages work at their URL but appear nowhere in the sidebar. Open each one and pick a group.";
2386
- };
2387
- };
2388
- readonly columns: {
2389
- readonly help: "Reorder columns, rename their headers, and choose which are shown in the table.";
2390
- readonly discard: "Discard";
2391
- readonly save: "Save columns";
2392
- readonly saveFailed: "Columns could not be saved";
2393
- readonly pk: "Key";
2394
- readonly pii: "PII";
2395
- readonly header: "Header for {name}";
2396
- readonly shown: "Shown";
2397
- readonly toggle: "Show {name} in the table";
2398
- readonly moveUp: "Move {name} up";
2399
- readonly moveDown: "Move {name} down";
2400
- readonly remove: "Remove {name}";
2401
- readonly none: {
2402
- readonly title: "This page has no columns yet";
2403
- readonly body: "Columns are read from the table when the page is generated. Bind this page to a table and regenerate to fill them in.";
2404
- };
2405
- };
2406
- readonly icon: {
2407
- readonly none: "Choose an icon";
2408
- readonly search: "Search icons";
2409
- readonly noMatches: "No icons match that search.";
2410
- };
2411
- readonly preview: {
2412
- readonly untitled: "Untitled page";
2413
- readonly note: "An illustration of the layout, not your data.";
2414
- };
2415
- readonly padding: {
2416
- readonly default: "Default for this template";
2417
- readonly none: "None";
2418
- readonly standard: "Standard (28 × 24)";
2419
- readonly custom: "Custom…";
2420
- readonly x: "Sides (px)";
2421
- readonly y: "Top and bottom (px)";
2422
- };
2423
- };
2424
1549
  readonly audit: {
2425
1550
  readonly action: {
2426
1551
  readonly view: "View";
@@ -2552,6 +1677,7 @@ declare const _default: {
2552
1677
  readonly exportsManage: "Manage everyone’s exports";
2553
1678
  readonly importsManage: "Manage everyone’s imports";
2554
1679
  readonly jobsManage: "Start and cancel background jobs";
1680
+ readonly manifestsManage: "Install and connect add-ons";
2555
1681
  readonly jobsRead: "See all background jobs";
2556
1682
  readonly llmRun: "Run AI assist";
2557
1683
  readonly pagesManage: "Create and organize pages";
@@ -2573,7 +1699,7 @@ declare const _default: {
2573
1699
  };
2574
1700
  readonly security: {
2575
1701
  readonly password: {
2576
- readonly changedBody: "Use the new password the next time you sign in. Sessions on other devices are unaffected revoke them below if you want them signed out.";
1702
+ readonly changedBody: "Use the new password the next time you sign in. Other devices stay signed inend those sessions if you want them out.";
2577
1703
  readonly changed: "Password changed";
2578
1704
  readonly confirm: "Confirm new password";
2579
1705
  readonly current: "Current password";