@adminiumjs/i18n 0.2.2 → 0.2.4

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 (227) 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 +319 -224
  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/index.d.ts +2 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +19 -8
  12. package/dist/index.js.map +1 -1
  13. package/dist/keys.d.ts +6 -4
  14. package/dist/keys.d.ts.map +1 -1
  15. package/dist/keys.js +6 -4
  16. package/dist/keys.js.map +1 -1
  17. package/dist/overrides.d.ts +1 -1
  18. package/dist/overrides.d.ts.map +1 -1
  19. package/dist/resources/ar-eg/common.d.ts +31 -1071
  20. package/dist/resources/ar-eg/common.d.ts.map +1 -1
  21. package/dist/resources/ar-eg/common.js +31 -1071
  22. package/dist/resources/ar-eg/common.js.map +1 -1
  23. package/dist/resources/ar-eg/errors.d.ts +3 -2
  24. package/dist/resources/ar-eg/errors.d.ts.map +1 -1
  25. package/dist/resources/ar-eg/errors.js +3 -2
  26. package/dist/resources/ar-eg/errors.js.map +1 -1
  27. package/dist/resources/ar-eg/generated.d.ts +3 -2
  28. package/dist/resources/ar-eg/generated.d.ts.map +1 -1
  29. package/dist/resources/ar-eg/generated.js +3 -2
  30. package/dist/resources/ar-eg/generated.js.map +1 -1
  31. package/dist/resources/ar-eg/studio.d.ts +1282 -2
  32. package/dist/resources/ar-eg/studio.d.ts.map +1 -1
  33. package/dist/resources/ar-eg/studio.js +1282 -2
  34. package/dist/resources/ar-eg/studio.js.map +1 -1
  35. package/dist/resources/ar-eg/ui.d.ts +51 -2
  36. package/dist/resources/ar-eg/ui.d.ts.map +1 -1
  37. package/dist/resources/ar-eg/ui.js +55 -6
  38. package/dist/resources/ar-eg/ui.js.map +1 -1
  39. package/dist/resources/cs-cz/common.d.ts +31 -1071
  40. package/dist/resources/cs-cz/common.d.ts.map +1 -1
  41. package/dist/resources/cs-cz/common.js +31 -1071
  42. package/dist/resources/cs-cz/common.js.map +1 -1
  43. package/dist/resources/cs-cz/errors.d.ts +3 -2
  44. package/dist/resources/cs-cz/errors.d.ts.map +1 -1
  45. package/dist/resources/cs-cz/errors.js +3 -2
  46. package/dist/resources/cs-cz/errors.js.map +1 -1
  47. package/dist/resources/cs-cz/generated.d.ts +3 -2
  48. package/dist/resources/cs-cz/generated.d.ts.map +1 -1
  49. package/dist/resources/cs-cz/generated.js +3 -2
  50. package/dist/resources/cs-cz/generated.js.map +1 -1
  51. package/dist/resources/cs-cz/studio.d.ts +1282 -2
  52. package/dist/resources/cs-cz/studio.d.ts.map +1 -1
  53. package/dist/resources/cs-cz/studio.js +1282 -2
  54. package/dist/resources/cs-cz/studio.js.map +1 -1
  55. package/dist/resources/cs-cz/ui.d.ts +51 -2
  56. package/dist/resources/cs-cz/ui.d.ts.map +1 -1
  57. package/dist/resources/cs-cz/ui.js +55 -6
  58. package/dist/resources/cs-cz/ui.js.map +1 -1
  59. package/dist/resources/da-dk/common.d.ts +31 -1071
  60. package/dist/resources/da-dk/common.d.ts.map +1 -1
  61. package/dist/resources/da-dk/common.js +31 -1071
  62. package/dist/resources/da-dk/common.js.map +1 -1
  63. package/dist/resources/da-dk/errors.d.ts +3 -2
  64. package/dist/resources/da-dk/errors.d.ts.map +1 -1
  65. package/dist/resources/da-dk/errors.js +3 -2
  66. package/dist/resources/da-dk/errors.js.map +1 -1
  67. package/dist/resources/da-dk/generated.d.ts +3 -2
  68. package/dist/resources/da-dk/generated.d.ts.map +1 -1
  69. package/dist/resources/da-dk/generated.js +3 -2
  70. package/dist/resources/da-dk/generated.js.map +1 -1
  71. package/dist/resources/da-dk/studio.d.ts +1282 -2
  72. package/dist/resources/da-dk/studio.d.ts.map +1 -1
  73. package/dist/resources/da-dk/studio.js +1282 -2
  74. package/dist/resources/da-dk/studio.js.map +1 -1
  75. package/dist/resources/da-dk/ui.d.ts +51 -2
  76. package/dist/resources/da-dk/ui.d.ts.map +1 -1
  77. package/dist/resources/da-dk/ui.js +55 -6
  78. package/dist/resources/da-dk/ui.js.map +1 -1
  79. package/dist/resources/de-de/common.d.ts +31 -1071
  80. package/dist/resources/de-de/common.d.ts.map +1 -1
  81. package/dist/resources/de-de/common.js +31 -1071
  82. package/dist/resources/de-de/common.js.map +1 -1
  83. package/dist/resources/de-de/errors.d.ts +3 -2
  84. package/dist/resources/de-de/errors.d.ts.map +1 -1
  85. package/dist/resources/de-de/errors.js +3 -2
  86. package/dist/resources/de-de/errors.js.map +1 -1
  87. package/dist/resources/de-de/generated.d.ts +3 -2
  88. package/dist/resources/de-de/generated.d.ts.map +1 -1
  89. package/dist/resources/de-de/generated.js +3 -2
  90. package/dist/resources/de-de/generated.js.map +1 -1
  91. package/dist/resources/de-de/studio.d.ts +1282 -2
  92. package/dist/resources/de-de/studio.d.ts.map +1 -1
  93. package/dist/resources/de-de/studio.js +1282 -2
  94. package/dist/resources/de-de/studio.js.map +1 -1
  95. package/dist/resources/de-de/ui.d.ts +51 -2
  96. package/dist/resources/de-de/ui.d.ts.map +1 -1
  97. package/dist/resources/de-de/ui.js +55 -6
  98. package/dist/resources/de-de/ui.js.map +1 -1
  99. package/dist/resources/eager.d.ts +3 -0
  100. package/dist/resources/eager.d.ts.map +1 -0
  101. package/dist/resources/eager.js +25 -0
  102. package/dist/resources/eager.js.map +1 -0
  103. package/dist/resources/en-us/common.d.ts +31 -1071
  104. package/dist/resources/en-us/common.d.ts.map +1 -1
  105. package/dist/resources/en-us/common.js +31 -1071
  106. package/dist/resources/en-us/common.js.map +1 -1
  107. package/dist/resources/en-us/errors.d.ts +3 -2
  108. package/dist/resources/en-us/errors.d.ts.map +1 -1
  109. package/dist/resources/en-us/errors.js +3 -2
  110. package/dist/resources/en-us/errors.js.map +1 -1
  111. package/dist/resources/en-us/generated.d.ts +3 -2
  112. package/dist/resources/en-us/generated.d.ts.map +1 -1
  113. package/dist/resources/en-us/generated.js +3 -2
  114. package/dist/resources/en-us/generated.js.map +1 -1
  115. package/dist/resources/en-us/studio.d.ts +1282 -2
  116. package/dist/resources/en-us/studio.d.ts.map +1 -1
  117. package/dist/resources/en-us/studio.js +1282 -2
  118. package/dist/resources/en-us/studio.js.map +1 -1
  119. package/dist/resources/en-us/ui.d.ts +51 -2
  120. package/dist/resources/en-us/ui.d.ts.map +1 -1
  121. package/dist/resources/en-us/ui.js +55 -6
  122. package/dist/resources/en-us/ui.js.map +1 -1
  123. package/dist/resources/fr-fr/common.d.ts +31 -1071
  124. package/dist/resources/fr-fr/common.d.ts.map +1 -1
  125. package/dist/resources/fr-fr/common.js +31 -1071
  126. package/dist/resources/fr-fr/common.js.map +1 -1
  127. package/dist/resources/fr-fr/errors.d.ts +3 -2
  128. package/dist/resources/fr-fr/errors.d.ts.map +1 -1
  129. package/dist/resources/fr-fr/errors.js +3 -2
  130. package/dist/resources/fr-fr/errors.js.map +1 -1
  131. package/dist/resources/fr-fr/generated.d.ts +3 -2
  132. package/dist/resources/fr-fr/generated.d.ts.map +1 -1
  133. package/dist/resources/fr-fr/generated.js +3 -2
  134. package/dist/resources/fr-fr/generated.js.map +1 -1
  135. package/dist/resources/fr-fr/studio.d.ts +1282 -2
  136. package/dist/resources/fr-fr/studio.d.ts.map +1 -1
  137. package/dist/resources/fr-fr/studio.js +1282 -2
  138. package/dist/resources/fr-fr/studio.js.map +1 -1
  139. package/dist/resources/fr-fr/ui.d.ts +51 -2
  140. package/dist/resources/fr-fr/ui.d.ts.map +1 -1
  141. package/dist/resources/fr-fr/ui.js +55 -6
  142. package/dist/resources/fr-fr/ui.js.map +1 -1
  143. package/dist/resources/index.d.ts +3 -6
  144. package/dist/resources/index.d.ts.map +1 -1
  145. package/dist/resources/index.js +15 -14
  146. package/dist/resources/index.js.map +1 -1
  147. package/dist/resources/lazy.d.ts +19 -9
  148. package/dist/resources/lazy.d.ts.map +1 -1
  149. package/dist/resources/lazy.js +4 -2
  150. package/dist/resources/lazy.js.map +1 -1
  151. package/dist/resources/namespaces.d.ts +43 -0
  152. package/dist/resources/namespaces.d.ts.map +1 -0
  153. package/dist/resources/namespaces.js +37 -0
  154. package/dist/resources/namespaces.js.map +1 -0
  155. package/dist/resources/zh-cn/common.d.ts +31 -1071
  156. package/dist/resources/zh-cn/common.d.ts.map +1 -1
  157. package/dist/resources/zh-cn/common.js +31 -1071
  158. package/dist/resources/zh-cn/common.js.map +1 -1
  159. package/dist/resources/zh-cn/errors.d.ts +3 -2
  160. package/dist/resources/zh-cn/errors.d.ts.map +1 -1
  161. package/dist/resources/zh-cn/errors.js +3 -2
  162. package/dist/resources/zh-cn/errors.js.map +1 -1
  163. package/dist/resources/zh-cn/generated.d.ts +3 -2
  164. package/dist/resources/zh-cn/generated.d.ts.map +1 -1
  165. package/dist/resources/zh-cn/generated.js +3 -2
  166. package/dist/resources/zh-cn/generated.js.map +1 -1
  167. package/dist/resources/zh-cn/studio.d.ts +1282 -2
  168. package/dist/resources/zh-cn/studio.d.ts.map +1 -1
  169. package/dist/resources/zh-cn/studio.js +1282 -2
  170. package/dist/resources/zh-cn/studio.js.map +1 -1
  171. package/dist/resources/zh-cn/ui.d.ts +51 -2
  172. package/dist/resources/zh-cn/ui.d.ts.map +1 -1
  173. package/dist/resources/zh-cn/ui.js +55 -6
  174. package/dist/resources/zh-cn/ui.js.map +1 -1
  175. package/dist/resources/zh-tw/common.d.ts +31 -1071
  176. package/dist/resources/zh-tw/common.d.ts.map +1 -1
  177. package/dist/resources/zh-tw/common.js +31 -1071
  178. package/dist/resources/zh-tw/common.js.map +1 -1
  179. package/dist/resources/zh-tw/errors.d.ts +3 -2
  180. package/dist/resources/zh-tw/errors.d.ts.map +1 -1
  181. package/dist/resources/zh-tw/errors.js +3 -2
  182. package/dist/resources/zh-tw/errors.js.map +1 -1
  183. package/dist/resources/zh-tw/generated.d.ts +3 -2
  184. package/dist/resources/zh-tw/generated.d.ts.map +1 -1
  185. package/dist/resources/zh-tw/generated.js +3 -2
  186. package/dist/resources/zh-tw/generated.js.map +1 -1
  187. package/dist/resources/zh-tw/studio.d.ts +1282 -2
  188. package/dist/resources/zh-tw/studio.d.ts.map +1 -1
  189. package/dist/resources/zh-tw/studio.js +1282 -2
  190. package/dist/resources/zh-tw/studio.js.map +1 -1
  191. package/dist/resources/zh-tw/ui.d.ts +51 -2
  192. package/dist/resources/zh-tw/ui.d.ts.map +1 -1
  193. package/dist/resources/zh-tw/ui.js +55 -6
  194. package/dist/resources/zh-tw/ui.js.map +1 -1
  195. package/dist/review-status.js +7 -7
  196. package/locales/ar-EG/.meta.json +3187 -2267
  197. package/locales/ar-EG/common.json +28 -1069
  198. package/locales/ar-EG/studio.json +1279 -0
  199. package/locales/ar-EG/ui.json +52 -4
  200. package/locales/cs-CZ/.meta.json +3203 -2283
  201. package/locales/cs-CZ/common.json +28 -1069
  202. package/locales/cs-CZ/studio.json +1279 -0
  203. package/locales/cs-CZ/ui.json +52 -4
  204. package/locales/da-DK/.meta.json +3208 -2288
  205. package/locales/da-DK/common.json +28 -1069
  206. package/locales/da-DK/studio.json +1279 -0
  207. package/locales/da-DK/ui.json +52 -4
  208. package/locales/de-DE/.meta.json +3201 -2281
  209. package/locales/de-DE/common.json +28 -1069
  210. package/locales/de-DE/studio.json +1279 -0
  211. package/locales/de-DE/ui.json +52 -4
  212. package/locales/en-US/common.json +28 -1069
  213. package/locales/en-US/studio.json +1279 -0
  214. package/locales/en-US/ui.json +52 -4
  215. package/locales/fr-FR/.meta.json +3205 -2285
  216. package/locales/fr-FR/common.json +28 -1069
  217. package/locales/fr-FR/studio.json +1279 -0
  218. package/locales/fr-FR/ui.json +52 -4
  219. package/locales/zh-CN/.meta.json +3185 -2265
  220. package/locales/zh-CN/common.json +28 -1069
  221. package/locales/zh-CN/studio.json +1279 -0
  222. package/locales/zh-CN/ui.json +52 -4
  223. package/locales/zh-TW/.meta.json +3188 -2268
  224. package/locales/zh-TW/common.json +28 -1069
  225. package/locales/zh-TW/studio.json +1279 -0
  226. package/locales/zh-TW/ui.json +52 -4
  227. package/package.json +1 -1
@@ -2,8 +2,9 @@
2
2
  /**
3
3
  * GENERATED MIRROR of ../../../locales/en-US/common.json — do not edit by hand.
4
4
  * The JSON file is the canonical hand-authored bundle (10-i18n-theming.md §3.1);
5
- * this TS mirror exists so the runtime bundles en-US resources (and chunk-splits
6
- * the other locales) without JSON import attributes (browser + NodeNext safe).
5
+ * this TS mirror exists so the runtime can bundle a namespace (en-US's eager
6
+ * ones) or chunk-split it (every other locale, and en-US's deferred `studio`)
7
+ * without JSON import attributes (browser + NodeNext safe).
7
8
  * Parity is enforced by src/resources/parity.test.ts. Regenerate with
8
9
  * scripts/gen-resources.mjs.
9
10
  */
@@ -114,6 +115,11 @@ export default {
114
115
  "audit": "Audit log",
115
116
  "security": "Password & sessions"
116
117
  },
118
+ "apps": {
119
+ "frame": {
120
+ "noFrames": "This app needs a browser that supports frames."
121
+ }
122
+ },
117
123
  "topbar": {
118
124
  "search": "Search…",
119
125
  "notifications": "Notifications",
@@ -125,6 +131,8 @@ export default {
125
131
  "profile": "Profile",
126
132
  "preferences": "Preferences",
127
133
  "studio": "Studio",
134
+ "dataConnections": "Data connections",
135
+ "workspaceSettings": "Workspace settings",
128
136
  "signOut": "Sign out"
129
137
  },
130
138
  "palette": {
@@ -241,6 +249,11 @@ export default {
241
249
  "body": "This workspace has been suspended by an administrator. Your data is preserved — contact the workspace owner to restore access.",
242
250
  "primary": "Contact owner",
243
251
  "secondary": "Go back"
252
+ },
253
+ "connectionPaused": {
254
+ "title": "This connection is paused",
255
+ "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.",
256
+ "secondary": "Go back"
244
257
  }
245
258
  },
246
259
  "notFound": {
@@ -320,6 +333,20 @@ export default {
320
333
  "twoFactor": "Two-factor",
321
334
  "on": "Enabled",
322
335
  "off": "Off",
336
+ "nameRequired": "Enter your name.",
337
+ "emailHelper": "Used to sign in. Changing it needs your password.",
338
+ "confirmPassword": "Current password",
339
+ "confirmPasswordHelper": "Confirm it is you before your sign-in address changes.",
340
+ "save": "Save changes",
341
+ "saveFailed": "Could not save your profile",
342
+ "saved": "Profile updated",
343
+ "savedBody": "Your new details are in use across this workspace. If you changed your email, sign in with the new address from now on.",
344
+ "accessTitle": "Access",
345
+ "accessSubtitle": "What this account may do, and how it proves who it is.",
346
+ "rolesHelper": "Roles are granted by an administrator and cannot be changed from your own account.",
347
+ "manageTwoFactor": "Manage",
348
+ "setUpTwoFactor": "Set up",
349
+ "securityLink": "Password & sessions",
323
350
  "preferences": {
324
351
  "title": "Preferences",
325
352
  "subtitle": "How Adminium looks and reads for you — on this and every device you sign in from.",
@@ -423,914 +450,6 @@ export default {
423
450
  }
424
451
  }
425
452
  },
426
- "studio": {
427
- "source": {
428
- "engine": {
429
- "label": "Database engine",
430
- "postgres": "PostgreSQL",
431
- "mysql": "MySQL / MariaDB",
432
- "sqlite": "SQLite"
433
- },
434
- "format": {
435
- "label": "Schema format",
436
- "helper": "Leave on auto-detect unless the detection gets it wrong.",
437
- "auto": "Auto-detect",
438
- "sql": "SQL DDL / pg_dump",
439
- "prisma": "Prisma schema",
440
- "drizzle": "Drizzle ORM",
441
- "typeorm": "TypeORM entities",
442
- "sequelize": "Sequelize models",
443
- "rails": "Rails schema.rb",
444
- "django": "Django models.py",
445
- "json": "Adminium JSON"
446
- },
447
- "sqlite": {
448
- "file": "Database file path",
449
- "helper": "SQLite is a file, not a server — give the absolute path on the machine running Adminium."
450
- },
451
- "file": {
452
- "detectedAs": "Detected: {format}",
453
- "moreWarnings": "+{count} more warnings — the full list appears in the analyze step.",
454
- "dropTitle": "Drop your schema file here, or browse",
455
- "dropHint": "SQL DDL / pg_dump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django models, Adminium JSON",
456
- "pitch": "No database connection required — we parse your schema file and build the same dashboards.",
457
- "parsing": "Reading uploaded schema file…",
458
- "tables": "tables",
459
- "columns": "columns",
460
- "warnings": "warnings",
461
- "errorTitle": "Could not parse the file",
462
- "parseFailed": "We could not parse that file. If auto-detect guessed wrong, pick the format explicitly and retry.",
463
- "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.",
464
- "requestFailed": "Upload failed — check your connection and try again."
465
- },
466
- "title": "Connect your database",
467
- "subtitle": "Point Adminium at a database and we'll generate an admin dashboard from its schema.",
468
- "name": "Connection name",
469
- "namePlaceholder": "Production Postgres",
470
- "modeLabel": "Source input mode",
471
- "mode": {
472
- "dsn": "Connection string",
473
- "fields": "Individual fields",
474
- "file": "Schema file"
475
- },
476
- "dsn": {
477
- "label": "Connection string",
478
- "helper": "postgres://user:password@host:5432/database — mysql:// and sqlite: work too.",
479
- "incomplete": "Add host and database, e.g. postgres://user@host:5432/db",
480
- "invalidScheme": "Unrecognized scheme — expected postgres://, mysql://, mariadb:// or sqlite:",
481
- "quickFill": "Quick fill:"
482
- },
483
- "fields": {
484
- "host": "Host",
485
- "port": "Port",
486
- "database": "Database",
487
- "user": "User",
488
- "password": "Password",
489
- "ssl": "SSL mode",
490
- "preview": "Connection string preview:"
491
- },
492
- "readOnlyRole": {
493
- "title": "Use a read-only role",
494
- "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."
495
- }
496
- },
497
- "capability": {
498
- "mysqlApproxRows": "MySQL row counts are storage-engine estimates (they can drift up to ±40%) — shown with ≈.",
499
- "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+.",
500
- "sqliteCheckEnums": "SQLite has no native enum type — enums are synthesized from CHECK (col IN (…)) constraints.",
501
- "sqliteNoComments": "SQLite has no column comments — use the schema remap editor to add labels.",
502
- "importNoRowCounts": "Schema files carry no row counts — the tables list shows — instead of made-up numbers.",
503
- "importNoLiveHealth": "No live database connection — health checks and schema-drift detection are unavailable for this source.",
504
- "rowsUnavailable": "Schema files have no live database — row counts are unknown until you connect one.",
505
- "rowsRunAnalyze": "No estimate yet — run ANALYZE on the database for row counts.",
506
- "rowsNoEstimate": "The engine reported no estimate for this table.",
507
- "rowsApproximate": "Storage-engine estimate — can drift up to ±40% on InnoDB."
508
- },
509
- "test": {
510
- "log": {
511
- "moreWarnings": "+{count} more parser warnings",
512
- "connecting": "Establishing secure connection…",
513
- "connected": "Connected ({latency} ms) · read-only introspection",
514
- "connectFailed": "Connection failed.",
515
- "readingSchema": "Reading schema: public",
516
- "readingFile": "Reading uploaded schema file…",
517
- "parsingFile": "Parsing {file}…",
518
- "detected": "Detected {tables} tables · {columns} columns",
519
- "found": "Found {tables} tables · {columns} columns",
520
- "mapping": "Mapping column types → input widgets",
521
- "relations": "Detecting relations…",
522
- "piiScan": "Scanning for PII columns…",
523
- "piiDone": "PII scan complete — {count} columns masked by default",
524
- "piiDoneUnknown": "PII scan complete",
525
- "jobFailed": "Introspection failed.",
526
- "networkFailed": "Request failed — check your connection and retry.",
527
- "ready": "Ready"
528
- },
529
- "title": "Analyzing your schema",
530
- "subtitle": "Introspecting tables, columns, and relationships. This takes a few seconds.",
531
- "trust": "We only read your schema and data. Nothing is modified.",
532
- "errorTitle": "Connection failed",
533
- "retry": "Retry",
534
- "logLabel": "Introspection log",
535
- "hint": {
536
- "auth": "Authentication failed — check the user name and password in your DSN.",
537
- "hostUnreachable": "Host unreachable — check the hostname and port, and that the database accepts connections from this machine (allowlist our IPs).",
538
- "metaPlacement": "This source cannot host Adminium’s meta tables — continue with a separate meta database.",
539
- "permission": "The role connected but lacks schema-read privileges — grant USAGE on the schema to your introspection role.",
540
- "timeout": "The database did not answer in time — check network path and load, then retry.",
541
- "tls": "TLS negotiation failed — try sslmode=require, or upload the CA certificate your server expects.",
542
- "unknown": "Connection failed — verify the DSN and retry."
543
- }
544
- },
545
- "tables": {
546
- "importNoCounts": "Schema files carry no row counts — the column shows — until a live database is connected.",
547
- "title": "Choose your tables",
548
- "subtitle": "Choose which to include. You can change this anytime.",
549
- "search": "Filter tables…",
550
- "listLabel": "Includable tables",
551
- "emptyFilter": "No tables match your filter.",
552
- "pii": "PII",
553
- "highVolume": "high volume",
554
- "highVolumeNote": "Tables over 100,000 rows start unchecked — ops tables rarely belong in a dashboard.",
555
- "joinHidden": "{count} join/system tables are pre-hidden — they still power many-to-many relations."
556
- },
557
- "hub": {
558
- "title": "Data connections",
559
- "subtitle": "{healthy, number} of {total, plural, one {# connection} other {# connections}} healthy",
560
- "connectNew": "New connection",
561
- "stats": {
562
- "connections": "Connections",
563
- "healthy": "Healthy",
564
- "tables": "Tables included",
565
- "pages": "Generated pages"
566
- },
567
- "status": {
568
- "connected": "Connected",
569
- "error": "Error",
570
- "unconfigured": "Draft",
571
- "testing": "Testing…"
572
- },
573
- "card": {
574
- "readOnly": "Read-only",
575
- "tables": "Tables",
576
- "pages": "Pages",
577
- "latency": "Latency",
578
- "latencyMs": "{latency, number} ms",
579
- "lastIntrospected": "Last introspected",
580
- "never": "Never"
581
- },
582
- "action": {
583
- "test": "Test",
584
- "reintrospect": "Re-introspect",
585
- "reintrospectFile": "Schema-file sources have no live database — re-upload the file instead.",
586
- "remap": "Remap schema",
587
- "delete": "Delete"
588
- },
589
- "test": {
590
- "ok": "Connection healthy · {latency, number} ms",
591
- "failed": "Connection test failed"
592
- },
593
- "introspect": {
594
- "noChanges": "Schema unchanged — no new snapshot.",
595
- "updated": "Schema re-introspected",
596
- "masksProposed": "{count, plural, one {# column} other {# columns}} proposed for masking — review in the remap editor.",
597
- "failed": "Introspection failed. Try again."
598
- },
599
- "delete": {
600
- "title": "Delete connection",
601
- "body": "This deletes “{name}” and its generated pages. Your database itself is never touched.",
602
- "prompt": "Type {name} to confirm",
603
- "confirm": "Delete connection",
604
- "cancel": "Cancel",
605
- "close": "Close",
606
- "success": "Connection “{name}” deleted",
607
- "failed": "Could not delete the connection. Try again."
608
- },
609
- "empty": {
610
- "title": "No data sources yet",
611
- "body": "Connect a database and Adminium generates your admin panel from its schema.",
612
- "cta": "Connect a database"
613
- }
614
- },
615
- "settingsHub": {
616
- "title": "Workspace settings",
617
- "subtitle": "Identity, security and destructive actions for this workspace.",
618
- "save": "Save changes",
619
- "saved": "Workspace settings updated",
620
- "saveFailed": "Could not save workspace settings. Try again.",
621
- "superAdminOnlyTitle": "Super admin required",
622
- "superAdminOnly": "Only a super admin can change workspace identity and security settings.",
623
- "identity": {
624
- "heading": "Workspace identity",
625
- "appName": {
626
- "label": "Application name",
627
- "helper": "Shown in the sidebar, browser title, and emails.",
628
- "error": "Enter a name of at most 60 characters."
629
- },
630
- "logo": {
631
- "label": "Logo",
632
- "drop": "Drop an image here",
633
- "helper": "PNG, JPEG, WebP, GIF or SVG, up to 1 MB. Replaces the built-in mark everywhere.",
634
- "upload": "Upload logo",
635
- "replace": "Replace logo",
636
- "remove": "Remove",
637
- "uploaded": "Logo updated",
638
- "removed": "Logo removed",
639
- "tooLarge": "That image is larger than 1 MB.",
640
- "badType": "Choose a PNG, JPEG, WebP, GIF or SVG image.",
641
- "undo": "Undo"
642
- },
643
- "showVersion": {
644
- "label": "Version in the sidebar",
645
- "helper": "The build number beside the logo. Off hides which version you run."
646
- }
647
- },
648
- "security": {
649
- "heading": "Security",
650
- "require2fa": {
651
- "label": "Require two-factor auth",
652
- "desc": "Every member must enable 2FA to sign in.",
653
- "note": "Advisory, not a barrier: members without 2FA are sent to set it up and can no longer turn it off, but their sign-in is never blocked, and API keys are unaffected."
654
- },
655
- "allowSignup": {
656
- "label": "Allow self-signup",
657
- "desc": "Anyone can create an account — off keeps this workspace invite-only."
658
- },
659
- "sessionTtl": {
660
- "label": "Session lifetime (hours)",
661
- "error": "Between {min, number} and {max, number} hours."
662
- },
663
- "passwordMin": {
664
- "label": "Minimum password length",
665
- "error": "Between {min, number} and {max, number} characters."
666
- }
667
- },
668
- "email": {
669
- "heading": "Email (SMTP)",
670
- "unconfigured": "No mail server is set, so Adminium cannot send password resets, user invites or scheduled reports.",
671
- "host": {
672
- "label": "SMTP host",
673
- "error": "A bare hostname or IP address — no scheme, port or credentials."
674
- },
675
- "port": {
676
- "label": "Port",
677
- "error": "Between {min, number} and {max, number}."
678
- },
679
- "user": {
680
- "label": "Username",
681
- "helper": "Leave empty for a relay that does not authenticate."
682
- },
683
- "pass": {
684
- "label": "Password",
685
- "helper": "Stored encrypted and never shown again. Leave blank to keep the current one.",
686
- "error": "This username needs a password."
687
- },
688
- "from": {
689
- "label": "From address",
690
- "helper": "A bare address, or a display name in front of one.",
691
- "error": "Enter an email address."
692
- },
693
- "secure": {
694
- "label": "Implicit TLS",
695
- "helper": "On for port 465. Off starts in cleartext and upgrades with STARTTLS, which is what port 587 expects."
696
- },
697
- "remove": "Remove mail server",
698
- "review": {
699
- "removed": "Removed",
700
- "password": "Replaced"
701
- }
702
- },
703
- "review": {
704
- "title": "Save workspace settings",
705
- "subtitle": "Review your changes before saving.",
706
- "confirm": "Save changes",
707
- "cancel": "Cancel",
708
- "close": "Close",
709
- "on": "On",
710
- "off": "Off",
711
- "shown": "Shown",
712
- "hidden": "Hidden",
713
- "change": "{before} → {after}"
714
- },
715
- "defaultsCard": {
716
- "heading": "Appearance & language defaults",
717
- "body": "Workspace-wide theme, accent, density and language live under Global defaults.",
718
- "cta": "Open global defaults"
719
- },
720
- "danger": {
721
- "heading": "Danger zone",
722
- "subtitle": "Irreversible actions.",
723
- "empty": "Nothing to delete — no connections yet.",
724
- "deleteDesc": "Deletes the connection and its generated pages. Your database is not touched. Cannot be undone.",
725
- "deleteCta": "Delete connection"
726
- },
727
- "aiCard": {
728
- "heading": "AI enrichment",
729
- "body": "Configure an AI provider (or the copy-paste round-trip) to enrich labels, groups and relations.",
730
- "cta": "Open AI settings"
731
- },
732
- "pagesCard": {
733
- "heading": "Pages",
734
- "body": "Add, edit and delete pages, change what each one shows, and reorder the sidebar.",
735
- "cta": "Manage pages"
736
- },
737
- "translationsCard": {
738
- "heading": "Languages & translations",
739
- "body": "Reword anything in Adminium, choose which languages people can pick, and add your own.",
740
- "cta": "Open translations"
741
- }
742
- },
743
- "settingsAi": {
744
- "title": "AI enrichment",
745
- "subtitle": "Connect a model to let Adminium suggest labels, groups, relations and more — always reviewed as a diff before anything applies.",
746
- "saved": "AI provider saved",
747
- "saveFailed": "Could not save the AI provider. Try again.",
748
- "save": "Save provider",
749
- "test": "Test connection",
750
- "testHintDirty": "Save your changes before testing.",
751
- "testing": "Pinging the provider…",
752
- "testError": "Test failed",
753
- "testErrorBody": "Could not reach the provider. Check the key and base URL.",
754
- "testOk": "Connected to {model} in {latency} ms",
755
- "testUnknownModel": "the provider",
756
- "provider": {
757
- "heading": "AI provider",
758
- "subtitle": "Choose how Adminium reaches a model to enrich your schema. Keys are stored encrypted and never shown again.",
759
- "active": "Active",
760
- "anthropic": {
761
- "label": "Anthropic",
762
- "desc": "Claude models via the Anthropic API."
763
- },
764
- "openai": {
765
- "label": "OpenAI",
766
- "desc": "GPT models via the OpenAI API."
767
- },
768
- "openaiCompatible": {
769
- "label": "OpenAI-compatible",
770
- "desc": "Any endpoint that speaks the OpenAI wire format — Groq, Together, vLLM, LM Studio."
771
- },
772
- "ollama": {
773
- "label": "Ollama (local)",
774
- "desc": "Models running locally through Ollama — no key, no cloud."
775
- },
776
- "requiresNetwork": "Requires internet & an API key",
777
- "networkDisabledTitle": "Direct AI providers are turned off on this install",
778
- "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."
779
- },
780
- "configure": {
781
- "heading": "Configure {provider}"
782
- },
783
- "field": {
784
- "baseUrl": "Base URL",
785
- "baseUrlOptional": "Leave as-is unless Ollama runs on another host.",
786
- "baseUrlHelper": "The endpoint root that serves /chat/completions.",
787
- "model": "Model",
788
- "modelFreeText": "Enter the exact model id your endpoint serves.",
789
- "modelLive": "Loaded live from the provider.",
790
- "modelStatic": "A known-good list; type a custom id after saving to refresh it.",
791
- "modelLoading": "Loading…",
792
- "modelPlaceholder": "Select a model…",
793
- "key": "API key",
794
- "keyStored": "Stored encrypted. Replace it to use a different key.",
795
- "keyMask": "sk-…{last4}",
796
- "keyReplace": "Replace key",
797
- "keyOptional": "Optional — some endpoints need no key.",
798
- "keyWriteOnly": "Write-only: once saved it is never shown again.",
799
- "noKeyTitle": "No API key needed",
800
- "noKeyBody": "Ollama runs locally, so nothing leaves this machine."
801
- },
802
- "runStatus": {
803
- "draft": "Draft",
804
- "running": "Running",
805
- "awaitingResponse": "Awaiting response",
806
- "validated": "Validated",
807
- "applied": "Applied",
808
- "partiallyApplied": "Partially applied",
809
- "failed": "Failed",
810
- "discarded": "Discarded"
811
- },
812
- "byo": {
813
- "heading": "No key? Use your own AI tool",
814
- "subtitle": "The copy-paste round-trip — nothing leaves this machine.",
815
- "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.",
816
- "guaranteeTitle": "Telemetry-free guarantee",
817
- "guarantee1": "The prompt carries only your schema and aggregate stats — never row data by default.",
818
- "guarantee2": "No credentials, instance URL, or identifiers are embedded.",
819
- "guarantee3": "BYO runs make zero network calls.",
820
- "promptVersion": "Prompt {version}",
821
- "schemaVersion": "Schema {version}",
822
- "headingRecommended": "Use your own AI tool — no key needed",
823
- "recommended": "Recommended"
824
- },
825
- "history": {
826
- "heading": "Run history",
827
- "subtitle": "Past enrichment runs. Open one to review its suggestions.",
828
- "tableLabel": "Enrichment runs",
829
- "colDate": "Date",
830
- "colSource": "Source",
831
- "colStatus": "Status",
832
- "colChunks": "Chunks",
833
- "openReview": "Open review for the run from {date}",
834
- "connection": "Connection",
835
- "empty": "No enrichment runs yet. Enrich a schema from the connect wizard to see history here.",
836
- "errorTitle": "Could not load runs",
837
- "errorBody": "Refresh the page to try again.",
838
- "noConnections": "Connect a database first — enrichment runs are recorded per connection.",
839
- "byo": "BYO",
840
- "directPath": "Direct"
841
- }
842
- },
843
- "enrich": {
844
- "title": "Enrich with AI",
845
- "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.",
846
- "intentLabel": "How would you like to enrich?",
847
- "sectionsLegend": "What should the AI decide?",
848
- "localesLegend": "Translate labels into",
849
- "localeLocked": "(required)",
850
- "samplingTitle": "Include sample values",
851
- "samplingHint": "Includes up to 20 real values per non-PII column in the prompt.",
852
- "samplingPreviewTitle": "What leaves this machine",
853
- "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.",
854
- "noSections": "Select at least one decision group to enrich.",
855
- "generatePrompt": "Generate prompt",
856
- "startProvider": "Start enrichment",
857
- "startOver": "Start over",
858
- "copied": "Copied",
859
- "createFailed": "Could not build the enrichment prompt — retry.",
860
- "createFailedTitle": "Could not start",
861
- "providerFallback": "your AI provider",
862
- "fileTitle": "AI enrichment needs a live database",
863
- "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.",
864
- "section": {
865
- "labels": "Labels & descriptions",
866
- "groups": "Navigation groups",
867
- "enums": "Enum semantics",
868
- "relations": "Relations",
869
- "keys": "Key columns",
870
- "templates": "Page templates",
871
- "widgets": "Dashboard widgets",
872
- "pii": "PII & masking",
873
- "icons": "Icons",
874
- "microcopy": "Micro-copy"
875
- },
876
- "provider": {
877
- "title": "Use my AI provider",
878
- "description": "Run enrichment now against your configured provider. You review every suggestion as a diff.",
879
- "unconfigured": "No AI provider is configured yet — copy a prompt to your own tool below, or configure a provider first.",
880
- "settingsHint": "Want to run it directly?",
881
- "settingsLink": "Configure a provider in Settings → AI",
882
- "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."
883
- },
884
- "byo": {
885
- "cardTitle": "Copy a prompt to my own AI tool",
886
- "cardDescription": "Copy a self-contained prompt into Claude Code, ChatGPT, anything — then paste the JSON back. No key needed, nothing leaves this machine automatically.",
887
- "guidance": "Run this in any AI tool — Claude Code, ChatGPT, anything. Paste the JSON it returns below.",
888
- "promptLabel": "Enrichment prompt",
889
- "promptLabelN": "Enrichment prompt {index} of {total}",
890
- "tokenChip": "≈ {tokens} tokens",
891
- "copyPrompt": "Copy prompt",
892
- "copyPromptDone": "Prompt copied",
893
- "download": "Download .md",
894
- "chunkTabs": "Prompt chunks",
895
- "chunkTab": "Prompt {index}",
896
- "chunkValid": "Chunk {index} validated",
897
- "pasteLabel": "Paste the JSON response",
898
- "pastePlaceholder": "Paste the JSON response here…",
899
- "validate": "Validate",
900
- "valid": "Response validated",
901
- "mergedTitle": "All {count} chunks validated and merged",
902
- "mergedTitleSingle": "Response validated",
903
- "mergedBody": "Suggestions are ready to review against the heuristic baseline.",
904
- "errorsTitle": "Validation found {count} issues",
905
- "copyErrors": "Copy errors for your AI tool",
906
- "copyErrorsDone": "Errors copied",
907
- "copyErrorsHint": "Paste this back into your AI tool to get a corrected response.",
908
- "droppedItems": "{count} suggestions were dropped during validation — review shows the rest.",
909
- "pendingTitle": "Validate every prompt to continue",
910
- "pendingBody": "Paste the JSON response above and validate it to continue to review.",
911
- "pendingBodyChunked": "Each chunk must validate before the suggestions merge. Paste and validate every prompt above.",
912
- "requestFailed": "Could not reach the server to validate — retry.",
913
- "continueReview": "Continue to review",
914
- "wholeDocument": "whole document",
915
- "cardTitleRecommended": "Copy a prompt to my own AI tool — recommended"
916
- },
917
- "direct": {
918
- "title": "Enriching with AI",
919
- "subtitle": "Sending your schema to",
920
- "building": "Building prompt…",
921
- "logLabel": "Enrichment log",
922
- "cancel": "Cancel",
923
- "back": "Back to options",
924
- "retry": "Retry",
925
- "done": "Enrichment complete — review the suggestions.",
926
- "continueReview": "Continue to review",
927
- "failed": "The provider run failed. Check your AI settings and retry.",
928
- "jobFailed": "The enrichment run did not finish.",
929
- "startFailed": "Could not start the run — retry.",
930
- "errorTitle": "Enrichment failed"
931
- },
932
- "skip": {
933
- "title": "Skip — use heuristics only",
934
- "description": "Generate from the heuristic baseline. You can enrich later from Settings → AI — skipping is never penalized.",
935
- "confirmTitle": "Continuing with heuristics",
936
- "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."
937
- }
938
- },
939
- "review": {
940
- "unavailableTitle": "Review screen not available",
941
- "unavailableBody": "This build does not include the enrichment review screen yet (06-T14). It lands with the diff-and-apply flow."
942
- },
943
- "llmRuns": {
944
- "review": {
945
- "header": {
946
- "title": "Review AI suggestions",
947
- "model": "Model",
948
- "snapshot": "Snapshot",
949
- "byo": "BYO",
950
- "pathDirect": "Direct API",
951
- "pathByo": "Copy-paste",
952
- "agree": "{n} agree",
953
- "conflict": "{n} conflict",
954
- "new": "{n} new",
955
- "rejects": "{n} rejects",
956
- "countsAria": "Suggestion counts"
957
- },
958
- "bulk": {
959
- "thresholdLabel": "Confidence threshold",
960
- "thresholdAria": "Accept-all confidence threshold",
961
- "acceptAll": "Accept all ≥ {pct}%",
962
- "clear": "Clear selection"
963
- },
964
- "section": {
965
- "selectAllAria": "Select all in {group}",
966
- "acceptedCount": "{n} accepted"
967
- },
968
- "group": {
969
- "labels": "Labels & translations",
970
- "navigation": "Navigation & domains",
971
- "enums": "Enum semantics",
972
- "relations": "Relations",
973
- "keys": "Key columns",
974
- "templates": "Page templates",
975
- "dashboards": "Dashboards & widgets",
976
- "pii": "PII & masking",
977
- "icons": "Icons",
978
- "microcopy": "Micro-copy"
979
- },
980
- "status": {
981
- "agree": "Agrees",
982
- "conflict": "Conflict",
983
- "new": "New",
984
- "heuristicOnly": "Heuristic only",
985
- "rejects": "Rejects heuristic",
986
- "locked": "Locked"
987
- },
988
- "row": {
989
- "acceptAria": "Accept {noun} suggestion for {target}",
990
- "keptEdited": "kept — edited by you",
991
- "rejectsCallout": "The AI rejects a heuristic decision — confirm before accepting.",
992
- "showTranslations": "Show translations",
993
- "hideTranslations": "Hide translations",
994
- "confidenceAria": "Confidence {pct}%",
995
- "noAi": "No AI suggestion"
996
- },
997
- "value": {
998
- "none": "No value",
999
- "absent": "None",
1000
- "dash": "—",
1001
- "display": "Display",
1002
- "key": "Key",
1003
- "rank": "rank {n}",
1004
- "span": "span {n}",
1005
- "tableCount": "{n} tables",
1006
- "widgetCount": "{n} widgets",
1007
- "enumWorkflow": "Workflow",
1008
- "enumCategory": "Category",
1009
- "notPii": "Not PII",
1010
- "label": "Label",
1011
- "description": "Description",
1012
- "subtitle": "Page subtitle",
1013
- "headline": "Empty-state headline",
1014
- "guidance": "Empty-state guidance"
1015
- },
1016
- "apply": {
1017
- "title": "Apply {n} suggestions",
1018
- "subtitle": "These changes are written in one transaction and can be undone.",
1019
- "empty": "Nothing selected to apply.",
1020
- "confirm": "Apply changes"
1021
- },
1022
- "footer": {
1023
- "count": "{n} suggestions selected",
1024
- "apply": "Apply {n} accepted suggestions",
1025
- "failed": "Apply failed"
1026
- },
1027
- "toast": {
1028
- "applied": "Applied {n} suggestions",
1029
- "appliedPartial": "Applied {n} suggestions (some skipped)",
1030
- "applyFailed": "Could not apply suggestions",
1031
- "undoFailed": "Could not undo this change"
1032
- },
1033
- "error": {
1034
- "title": "Could not load this run"
1035
- },
1036
- "notReady": {
1037
- "title": "This run has no suggestions to review yet",
1038
- "body": "A run must be validated before its suggestions can be reviewed. Generate or paste a response first."
1039
- },
1040
- "applied": {
1041
- "title": "This run has been applied",
1042
- "body": "The accepted suggestions below are read-only."
1043
- },
1044
- "empty": {
1045
- "title": "No suggestions",
1046
- "body": "This run produced no suggestions to review."
1047
- },
1048
- "cat": {
1049
- "label": "label",
1050
- "key": "key columns",
1051
- "enum": "enum",
1052
- "relation": "relation",
1053
- "pii": "PII",
1054
- "template": "page template",
1055
- "group": "navigation group",
1056
- "dashboard": "dashboard",
1057
- "widget": "widget",
1058
- "copy": "micro-copy"
1059
- }
1060
- }
1061
- },
1062
- "wizard": {
1063
- "title": "New connection",
1064
- "back": "Back",
1065
- "continue": "Continue",
1066
- "progress": "Setup progress",
1067
- "persistFailed": "Could not save your table selection — retry.",
1068
- "persistFailedTitle": "Save failed",
1069
- "bridgeAppliedTitle": "Connection string received",
1070
- "bridgeAppliedBody": "Handed over from adminium.dev by your browser — it went straight to this machine and was never uploaded. Check it below, then continue.",
1071
- "bridgeFailedTitle": "That hand-off could not be used",
1072
- "bridgeFailedBody": "It has already been used or has expired. Paste your connection string below instead.",
1073
- "step": {
1074
- "source": "Source",
1075
- "test": "Analyze",
1076
- "tables": "Tables",
1077
- "meta": "Meta storage",
1078
- "intent": "Intent",
1079
- "enrich": "Enrich",
1080
- "generate": "Generate"
1081
- }
1082
- },
1083
- "meta": {
1084
- "title": "Where should Adminium keep its own tables?",
1085
- "subtitle": "Pages, roles, audit log and settings live in adminium_-prefixed tables — never mixed into your data.",
1086
- "sameDb": {
1087
- "title": "Same database",
1088
- "description": "adminium_* tables are created beside your source tables. Simplest setup — needs a role with write and CREATE TABLE privileges.",
1089
- "disabledReadOnly": "Your role is read-only — Adminium never writes to this database. Choose a separate database for Adminium’s own tables.",
1090
- "disabledNoDdl": "This role cannot run DDL — Adminium migrations need CREATE TABLE. Choose a separate database for Adminium’s own tables.",
1091
- "disabledFile": "A schema file has no live database — choose a separate database for Adminium’s own tables."
1092
- },
1093
- "separate": {
1094
- "title": "Separate database",
1095
- "description": "Adminium keeps its tables in a different database. Your source stays untouched — required for read-only sources.",
1096
- "dsn": "Meta database connection string",
1097
- "helper": "Needs write + DDL privileges — Adminium runs its own migrations there.",
1098
- "test": "Test connection",
1099
- "ok": "Compatible — write ✓ · DDL ✓",
1100
- "insufficient": "This role cannot host the meta store — Adminium needs write and CREATE TABLE privileges there.",
1101
- "errorTitle": "Meta store not compatible"
1102
- },
1103
- "testFailed": "Connection failed.",
1104
- "v1Note": {
1105
- "title": "About this install",
1106
- "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)."
1107
- },
1108
- "move": {
1109
- "title": "Moving Adminium’s tables",
1110
- "copying": "Moving Adminium’s tables…",
1111
- "restarting": "Restarting…",
1112
- "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.",
1113
- "restartingBody": "The copy is done. Adminium is restarting onto the new database — this page will continue by itself in a few seconds.",
1114
- "failed": "Could not move Adminium’s tables — retry.",
1115
- "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."
1116
- },
1117
- "willMove": {
1118
- "title": "This will move Adminium’s tables",
1119
- "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."
1120
- }
1121
- },
1122
- "intent": {
1123
- "title": "What do you need?",
1124
- "subtitle": "The intent shapes which pages get generated. You can change it later — changing it proposes a regeneration, never a silent rewrite.",
1125
- "trust": "We read your schema only — never your row data during setup.",
1126
- "fullAdmin": {
1127
- "title": "Full admin panel",
1128
- "description": "Dashboards, CRUD pages, search, imports and exports — everything your schema supports."
1129
- },
1130
- "analytics": {
1131
- "title": "Read-only analytics",
1132
- "description": "Dashboards, charts and read-only grids. No forms, no writes — every role capped at Viewer."
1133
- },
1134
- "crud": {
1135
- "title": "CRUD tables",
1136
- "description": "One editing page per table plus search and import/export — a minimal home, no dashboards."
1137
- },
1138
- "support": {
1139
- "title": "Support console",
1140
- "description": "Queues, ticket and customer detail pages first. Deletes off by default. (Queue templates land in M7 — the v1 page set matches Full admin.)"
1141
- }
1142
- },
1143
- "generate": {
1144
- "title": "Generate your app",
1145
- "subtitle": "One page per included table plus dashboards per domain — intent:",
1146
- "run": "Generate dashboard",
1147
- "openApp": "Open your app",
1148
- "logLabel": "Generation log",
1149
- "log": {
1150
- "classifying": "Classifying schema…",
1151
- "composing": "Composing templates…",
1152
- "writing": "Writing pages…",
1153
- "done": "{pages} pages generated across {groups} nav groups"
1154
- },
1155
- "successTitle": "Your dashboard is ready",
1156
- "successBody": "{pages} pages across {groups} navigation groups — generated from your schema, editable in Studio.",
1157
- "errorTitle": "Generation failed",
1158
- "failed": "Generation failed — retry, or re-run introspection first.",
1159
- "fileTitle": "Schema file parsed — generation needs a live database",
1160
- "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."
1161
- },
1162
- "remap": {
1163
- "column": {
1164
- "nullable": "nullable",
1165
- "labelOverride": "Display label",
1166
- "labelHelper": "Inferred: {name}",
1167
- "logicalType": "Logical type",
1168
- "logicalTypeHelper": "Inferred: {type} (from {dbType}) — mapped by the adapter; not overridable in v1.",
1169
- "semantic": "Semantic type",
1170
- "unclassified": "Not classified yet.",
1171
- "semanticHelper": "Classifier: {tag} · {confidence}% confidence · source: {source}",
1172
- "semanticInferred": "inferred: {tag}",
1173
- "currency": "Currency",
1174
- "currencyHelper": "ISO 4217 code applied to money formatting.",
1175
- "pii": "Mask by default",
1176
- "piiHelper": "Masked values render redacted; unmasking requires the data.unmask_pii permission and is audit-logged.",
1177
- "enum": "Enum semantics",
1178
- "enumKind": "Enum kind",
1179
- "enumWorkflow": "Workflow",
1180
- "enumCategory": "Category",
1181
- "enumLabelFor": "Label for {value}",
1182
- "enumToneFor": "Tone for {value}",
1183
- "enumToneAuto": "auto",
1184
- "enumHelper": "Workflow enums drive status pills and board columns; tones map values onto the semantic tint scale."
1185
- },
1186
- "diff": {
1187
- "one": "1 change",
1188
- "count": "{count} changes",
1189
- "saved": "Overrides saved.",
1190
- "revertOne": "Revert {change}",
1191
- "regenerate": "Regenerate pages",
1192
- "revertAll": "Revert all",
1193
- "save": "Save overrides"
1194
- },
1195
- "table": {
1196
- "iconPicker": "Table icon",
1197
- "system": "System",
1198
- "labelOverride": "Display label",
1199
- "labelHelper": "Inferred: {name}",
1200
- "icon": "Icon",
1201
- "navGroup": "Nav group",
1202
- "navGroupHelper": "Nav placement is decided by the generator — a table.navGroup override is not in the v1 vocabulary.",
1203
- "include": "Include in generated app",
1204
- "includeHelper": "Excluded tables get no pages and disappear from nav.",
1205
- "shape": "Table shape (classified)",
1206
- "role": "Role",
1207
- "unclassified": "Not classified",
1208
- "kind": "Kind",
1209
- "hierarchy": "Hierarchy",
1210
- "selfFk": "Self-reference via {column}",
1211
- "polymorphic": "Polymorphic pairs",
1212
- "rows": "Row estimate",
1213
- "shapeHelper": "Classification is recomputed on every introspection; overrides layer on top and survive regeneration."
1214
- },
1215
- "relations": {
1216
- "declared": "Declared foreign keys",
1217
- "noneDeclared": "No declared foreign keys touch this table.",
1218
- "inferred": "Inferred relations",
1219
- "noneInferred": "Nothing inferred for this table.",
1220
- "confidence": "inferred · {pct}%",
1221
- "accepted": "Accepted",
1222
- "suppressed": "Suppressed",
1223
- "accept": "Accept",
1224
- "suppress": "Suppress",
1225
- "overrides": "Override relations (applied)",
1226
- "overrideBadge": "override",
1227
- "add": "Add virtual relation",
1228
- "fromColumn": "From column",
1229
- "noColumns": "No matching column",
1230
- "fromPlaceholder": "customer_id",
1231
- "toTable": "To table",
1232
- "noTables": "No matching table",
1233
- "toColumn": "To column",
1234
- "cardinality": "Cardinality",
1235
- "addButton": "Add relation"
1236
- },
1237
- "toast": {
1238
- "saved": "Schema overrides saved",
1239
- "savedDetail": "The applied schema below reflects your changes.",
1240
- "regenerated": "{created} created · {updated} updated · {unchanged} unchanged",
1241
- "regeneratedDetail": "Pages you edited by hand are preserved — only pages with an untouched generated_hash were regenerated in place.",
1242
- "regenerateFailed": "Regeneration failed"
1243
- },
1244
- "title": "Schema remap",
1245
- "subtitle": "{tables} tables · {applied} overrides applied",
1246
- "saveFailed": "Save failed: {message}",
1247
- "loadFailed": "Could not load the schema for this connection.",
1248
- "inspector": "Inspector",
1249
- "empty": {
1250
- "title": "Pick a table or column",
1251
- "description": "Select something in the schema tree to remap its label, type, relations or masking."
1252
- },
1253
- "tabs": {
1254
- "details": "Details",
1255
- "relations": "Relations"
1256
- },
1257
- "tree": {
1258
- "label": "Schema",
1259
- "search": "Search tables and columns",
1260
- "searchPlaceholder": "Search tables…",
1261
- "noMatches": "No tables match your search.",
1262
- "collapse": "Collapse table",
1263
- "expand": "Expand table",
1264
- "unsaved": "Unsaved change",
1265
- "excluded": "Excluded"
1266
- },
1267
- "badge": {
1268
- "pk": "PK",
1269
- "fk": "FK",
1270
- "unique": "UNIQUE",
1271
- "pii": "PII",
1272
- "masked": "Masked"
1273
- },
1274
- "unavailableTitle": "Schema remap editor not available",
1275
- "unavailableBody": "This build does not include the remap editor yet (09-T12). Re-run generation after it lands to remap labels, types and relations."
1276
- },
1277
- "publicApi": {
1278
- "error": "Something went wrong",
1279
- "scopes": {
1280
- "deleteTitle": "Delete this scope",
1281
- "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.",
1282
- "deletePrompt": "Type the scope name to confirm",
1283
- "deleteConfirm": "Delete scope",
1284
- "issuesTitle": "This scope did not compile",
1285
- "title": "Scopes",
1286
- "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.",
1287
- "emptyTitle": "No scopes yet",
1288
- "emptyBody": "Create one below. It is checked against your live schema before it is saved.",
1289
- "keyCount": "{count, plural, =0 {no keys} one {# key} other {# keys}}",
1290
- "delete": "Delete",
1291
- "nameLabel": "Name",
1292
- "connectionLabel": "Connection ID",
1293
- "documentLabel": "Scope document",
1294
- "documentHint": "Compiled against your schema when you save. Every column a caller can reach is listed here and nowhere else.",
1295
- "create": "Create scope",
1296
- "formLabel": "Create a scope"
1297
- },
1298
- "cancel": "Cancel",
1299
- "close": "Close",
1300
- "title": "Public API",
1301
- "subtitle": "Let your own customer- or staff-facing pages read this database, through a scope you define.",
1302
- "notRegistered": {
1303
- "title": "Not enabled on this server",
1304
- "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."
1305
- },
1306
- "toggle": {
1307
- "label": "Serve the public API",
1308
- "hint": "Turning this off stops every public request immediately. Nothing is deleted — keys, scopes and data all survive."
1309
- },
1310
- "origins": {
1311
- "label": "Origins allowed to call it"
1312
- },
1313
- "keys": {
1314
- "title": "Keys",
1315
- "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.",
1316
- "emptyTitle": "No keys yet",
1317
- "emptyBody": "Create a scope first, then mint a key for it.",
1318
- "reveal": "Show key",
1319
- "rotate": "Rotate",
1320
- "revoke": "Revoke",
1321
- "nameLabel": "Name",
1322
- "scopeLabel": "Scope",
1323
- "scopePlaceholder": "Choose a scope",
1324
- "create": "Create key",
1325
- "formLabel": "Create a key",
1326
- "scopeIsAuthTitle": "The scope is the only permission",
1327
- "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."
1328
- },
1329
- "status": {
1330
- "heading": "Status"
1331
- }
1332
- }
1333
- },
1334
453
  "onboarding": {
1335
454
  "title": "Getting started",
1336
455
  "subtitle": "A few steps to get your workspace ready.",
@@ -2428,166 +1547,6 @@ export default {
2428
1547
  "toLight": "Light mode",
2429
1548
  "toDark": "Dark mode"
2430
1549
  },
2431
- "studioPages": {
2432
- "title": "Pages",
2433
- "subtitle": "Add, edit and organise the pages of your app, and the order they appear in the sidebar.",
2434
- "createButton": "New page",
2435
- "loadFailed": {
2436
- "title": "Pages could not be loaded",
2437
- "body": "Managing pages needs the “Manage pages” permission. Ask an administrator to grant it to one of your roles."
2438
- },
2439
- "tab": {
2440
- "pages": "All pages",
2441
- "sidebar": "Sidebar order"
2442
- },
2443
- "list": {
2444
- "title": "Pages",
2445
- "count": "{count, plural, one {# page} other {# pages}}"
2446
- },
2447
- "empty": {
2448
- "title": "No pages yet",
2449
- "body": "Connect a database to generate pages automatically, or create one by hand."
2450
- },
2451
- "status": {
2452
- "live": "Live",
2453
- "hidden": "Hidden"
2454
- },
2455
- "origin": {
2456
- "generated": "Generated",
2457
- "manifest": "Add-on",
2458
- "llm": "Assistant",
2459
- "system": "System",
2460
- "user": "Custom"
2461
- },
2462
- "row": {
2463
- "menu": "Actions for {title}"
2464
- },
2465
- "action": {
2466
- "edit": "Edit page",
2467
- "duplicate": "Duplicate",
2468
- "hide": "Hide from sidebar",
2469
- "show": "Show in sidebar",
2470
- "delete": "Delete page"
2471
- },
2472
- "create": {
2473
- "title": "New page",
2474
- "failed": "The page could not be created",
2475
- "submit": "Create page",
2476
- "subtitle": "Pick what this page shows and how it looks."
2477
- },
2478
- "duplicate": {
2479
- "title": "Duplicate page",
2480
- "failed": "The page could not be duplicated",
2481
- "submit": "Duplicate"
2482
- },
2483
- "delete": {
2484
- "title": "Delete this page?",
2485
- "body": "This cannot be undone. Saved views and personal layouts on this page are deleted for everyone.",
2486
- "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.",
2487
- "prompt": "Type {slug} to confirm",
2488
- "confirm": "Delete page"
2489
- },
2490
- "field": {
2491
- "title": "Title",
2492
- "titleHint": "Shown in the sidebar and the page header.",
2493
- "slug": "Page address",
2494
- "slugHint": "Lowercase letters, numbers and dashes. Just the last part — the rest of the address is added for you.",
2495
- "slugTaken": "Another page already uses this address.",
2496
- "slugWarning": "Changing the address breaks existing links and bookmarks to this page.",
2497
- "template": "Template",
2498
- "templateHint": "Decides what the page can hold. You can change it later.",
2499
- "group": "Sidebar group",
2500
- "groupHint": "Which section of the sidebar it appears in.",
2501
- "icon": "Icon",
2502
- "iconHint": "Shown beside the page name in the sidebar.",
2503
- "visible": "Show in sidebar",
2504
- "visibleHint": "A hidden page stays reachable at its URL for anyone who has the link.",
2505
- "table": "Table",
2506
- "tableCreateHint": "The table this page reads. You can bind it later.",
2507
- "tableNone": "Not bound",
2508
- "tableNeedsConnection": "Pick a data source first.",
2509
- "connection": "Data source",
2510
- "connectionNone": "None",
2511
- "iconPick": "Choose the page icon",
2512
- "padding": "Page padding"
2513
- },
2514
- "editor": {
2515
- "title": "Edit page",
2516
- "save": "Save changes",
2517
- "saveFailed": "Changes could not be saved",
2518
- "openPage": "Open page",
2519
- "generated": {
2520
- "title": "This page was generated from your schema",
2521
- "body": "Your changes survive regeneration. Deleting only lasts until the next run recreates it."
2522
- },
2523
- "contentUnavailable": "Page contents could not be loaded",
2524
- "contentUnavailableBody": "The details above can still be saved.",
2525
- "contentInvalid": "This page’s configuration is not readable",
2526
- "contentInvalidBody": "It was written by a newer version, or it is malformed. Regenerate the page or delete it.",
2527
- "data": "Data",
2528
- "schemaFailed": "Tables could not be listed",
2529
- "schemaFailedBody": "This connection may not have been analysed yet. Run introspection from Studio → Data connections.",
2530
- "notBindable": "This template is not bound to one table",
2531
- "notBindableBody": "Its contents are built widget by widget instead. Open the page and use Edit to add them.",
2532
- "recompose": "This page will be rebuilt",
2533
- "recomposeBody": "Saving rebuilds the contents. Column and widget edits here are lost.",
2534
- "missing": "That page no longer exists",
2535
- "missingBody": "It may have been deleted, or removed by a regeneration run.",
2536
- "details": "Details",
2537
- "itemsPending": "Save the change above first — the contents are rebuilt from it.",
2538
- "columns": "Columns",
2539
- "appearance": "Appearance"
2540
- },
2541
- "sidebar": {
2542
- "help": "Reorder pages within a group, or move one to another group. Changes apply to every user.",
2543
- "discard": "Discard",
2544
- "save": "Save order",
2545
- "saveFailed": "The new order could not be saved",
2546
- "emptyGroup": "No pages in this group.",
2547
- "moveUp": "Move {title} up",
2548
- "moveDown": "Move {title} down",
2549
- "moveTo": "Move {title} to a group",
2550
- "ungrouped": {
2551
- "title": "Some pages are in no sidebar group",
2552
- "body": "These pages work at their URL but appear nowhere in the sidebar. Open each one and pick a group."
2553
- }
2554
- },
2555
- "columns": {
2556
- "help": "Reorder columns, rename their headers, and choose which are shown in the table.",
2557
- "discard": "Discard",
2558
- "save": "Save columns",
2559
- "saveFailed": "Columns could not be saved",
2560
- "pk": "Key",
2561
- "pii": "PII",
2562
- "header": "Header for {name}",
2563
- "shown": "Shown",
2564
- "toggle": "Show {name} in the table",
2565
- "moveUp": "Move {name} up",
2566
- "moveDown": "Move {name} down",
2567
- "remove": "Remove {name}",
2568
- "none": {
2569
- "title": "This page has no columns yet",
2570
- "body": "Columns are read from the table when the page is generated. Bind this page to a table and regenerate to fill them in."
2571
- }
2572
- },
2573
- "icon": {
2574
- "none": "Choose an icon",
2575
- "search": "Search icons",
2576
- "noMatches": "No icons match that search."
2577
- },
2578
- "preview": {
2579
- "untitled": "Untitled page",
2580
- "note": "An illustration of the layout, not your data."
2581
- },
2582
- "padding": {
2583
- "default": "Default for this template",
2584
- "none": "None",
2585
- "standard": "Standard (28 × 24)",
2586
- "custom": "Custom…",
2587
- "x": "Sides (px)",
2588
- "y": "Top and bottom (px)"
2589
- }
2590
- },
2591
1550
  "audit": {
2592
1551
  "action": {
2593
1552
  "view": "View"
@@ -2719,6 +1678,7 @@ export default {
2719
1678
  "exportsManage": "Manage everyone’s exports",
2720
1679
  "importsManage": "Manage everyone’s imports",
2721
1680
  "jobsManage": "Start and cancel background jobs",
1681
+ "manifestsManage": "Install and connect add-ons",
2722
1682
  "jobsRead": "See all background jobs",
2723
1683
  "llmRun": "Run AI assist",
2724
1684
  "pagesManage": "Create and organize pages",
@@ -2740,7 +1700,7 @@ export default {
2740
1700
  },
2741
1701
  "security": {
2742
1702
  "password": {
2743
- "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.",
1703
+ "changedBody": "Use the new password the next time you sign in. Other devices stay signed inend those sessions if you want them out.",
2744
1704
  "changed": "Password changed",
2745
1705
  "confirm": "Confirm new password",
2746
1706
  "current": "Current password",