@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.
- package/dist/a11y-keys.d.ts +1 -1
- package/dist/a11y-keys.d.ts.map +1 -1
- package/dist/a11y-keys.js +481 -172
- package/dist/a11y-keys.js.map +1 -1
- package/dist/create-i18n.d.ts +16 -6
- package/dist/create-i18n.d.ts.map +1 -1
- package/dist/create-i18n.js +23 -9
- package/dist/create-i18n.js.map +1 -1
- package/dist/editing.d.ts +1 -1
- package/dist/editing.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -8
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +6 -4
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +6 -4
- package/dist/keys.js.map +1 -1
- package/dist/overrides.d.ts +1 -1
- package/dist/overrides.d.ts.map +1 -1
- package/dist/resources/ar-eg/common.d.ts +96 -970
- package/dist/resources/ar-eg/common.d.ts.map +1 -1
- package/dist/resources/ar-eg/common.js +99 -973
- package/dist/resources/ar-eg/common.js.map +1 -1
- package/dist/resources/ar-eg/errors.d.ts +3 -2
- package/dist/resources/ar-eg/errors.d.ts.map +1 -1
- package/dist/resources/ar-eg/errors.js +3 -2
- package/dist/resources/ar-eg/errors.js.map +1 -1
- package/dist/resources/ar-eg/generated.d.ts +3 -2
- package/dist/resources/ar-eg/generated.d.ts.map +1 -1
- package/dist/resources/ar-eg/generated.js +3 -2
- package/dist/resources/ar-eg/generated.js.map +1 -1
- package/dist/resources/ar-eg/studio.d.ts +1282 -2
- package/dist/resources/ar-eg/studio.d.ts.map +1 -1
- package/dist/resources/ar-eg/studio.js +1282 -2
- package/dist/resources/ar-eg/studio.js.map +1 -1
- package/dist/resources/ar-eg/ui.d.ts +60 -2
- package/dist/resources/ar-eg/ui.d.ts.map +1 -1
- package/dist/resources/ar-eg/ui.js +72 -14
- package/dist/resources/ar-eg/ui.js.map +1 -1
- package/dist/resources/cs-cz/common.d.ts +96 -970
- package/dist/resources/cs-cz/common.d.ts.map +1 -1
- package/dist/resources/cs-cz/common.js +99 -973
- package/dist/resources/cs-cz/common.js.map +1 -1
- package/dist/resources/cs-cz/errors.d.ts +3 -2
- package/dist/resources/cs-cz/errors.d.ts.map +1 -1
- package/dist/resources/cs-cz/errors.js +3 -2
- package/dist/resources/cs-cz/errors.js.map +1 -1
- package/dist/resources/cs-cz/generated.d.ts +3 -2
- package/dist/resources/cs-cz/generated.d.ts.map +1 -1
- package/dist/resources/cs-cz/generated.js +3 -2
- package/dist/resources/cs-cz/generated.js.map +1 -1
- package/dist/resources/cs-cz/studio.d.ts +1282 -2
- package/dist/resources/cs-cz/studio.d.ts.map +1 -1
- package/dist/resources/cs-cz/studio.js +1282 -2
- package/dist/resources/cs-cz/studio.js.map +1 -1
- package/dist/resources/cs-cz/ui.d.ts +60 -2
- package/dist/resources/cs-cz/ui.d.ts.map +1 -1
- package/dist/resources/cs-cz/ui.js +72 -14
- package/dist/resources/cs-cz/ui.js.map +1 -1
- package/dist/resources/da-dk/common.d.ts +96 -970
- package/dist/resources/da-dk/common.d.ts.map +1 -1
- package/dist/resources/da-dk/common.js +99 -973
- package/dist/resources/da-dk/common.js.map +1 -1
- package/dist/resources/da-dk/errors.d.ts +3 -2
- package/dist/resources/da-dk/errors.d.ts.map +1 -1
- package/dist/resources/da-dk/errors.js +3 -2
- package/dist/resources/da-dk/errors.js.map +1 -1
- package/dist/resources/da-dk/generated.d.ts +3 -2
- package/dist/resources/da-dk/generated.d.ts.map +1 -1
- package/dist/resources/da-dk/generated.js +3 -2
- package/dist/resources/da-dk/generated.js.map +1 -1
- package/dist/resources/da-dk/studio.d.ts +1282 -2
- package/dist/resources/da-dk/studio.d.ts.map +1 -1
- package/dist/resources/da-dk/studio.js +1282 -2
- package/dist/resources/da-dk/studio.js.map +1 -1
- package/dist/resources/da-dk/ui.d.ts +60 -2
- package/dist/resources/da-dk/ui.d.ts.map +1 -1
- package/dist/resources/da-dk/ui.js +72 -14
- package/dist/resources/da-dk/ui.js.map +1 -1
- package/dist/resources/de-de/common.d.ts +96 -970
- package/dist/resources/de-de/common.d.ts.map +1 -1
- package/dist/resources/de-de/common.js +99 -973
- package/dist/resources/de-de/common.js.map +1 -1
- package/dist/resources/de-de/errors.d.ts +3 -2
- package/dist/resources/de-de/errors.d.ts.map +1 -1
- package/dist/resources/de-de/errors.js +3 -2
- package/dist/resources/de-de/errors.js.map +1 -1
- package/dist/resources/de-de/generated.d.ts +3 -2
- package/dist/resources/de-de/generated.d.ts.map +1 -1
- package/dist/resources/de-de/generated.js +3 -2
- package/dist/resources/de-de/generated.js.map +1 -1
- package/dist/resources/de-de/studio.d.ts +1282 -2
- package/dist/resources/de-de/studio.d.ts.map +1 -1
- package/dist/resources/de-de/studio.js +1282 -2
- package/dist/resources/de-de/studio.js.map +1 -1
- package/dist/resources/de-de/ui.d.ts +60 -2
- package/dist/resources/de-de/ui.d.ts.map +1 -1
- package/dist/resources/de-de/ui.js +72 -14
- package/dist/resources/de-de/ui.js.map +1 -1
- package/dist/resources/eager.d.ts +3 -0
- package/dist/resources/eager.d.ts.map +1 -0
- package/dist/resources/eager.js +25 -0
- package/dist/resources/eager.js.map +1 -0
- package/dist/resources/en-us/common.d.ts +96 -970
- package/dist/resources/en-us/common.d.ts.map +1 -1
- package/dist/resources/en-us/common.js +99 -973
- package/dist/resources/en-us/common.js.map +1 -1
- package/dist/resources/en-us/errors.d.ts +3 -2
- package/dist/resources/en-us/errors.d.ts.map +1 -1
- package/dist/resources/en-us/errors.js +3 -2
- package/dist/resources/en-us/errors.js.map +1 -1
- package/dist/resources/en-us/generated.d.ts +3 -2
- package/dist/resources/en-us/generated.d.ts.map +1 -1
- package/dist/resources/en-us/generated.js +3 -2
- package/dist/resources/en-us/generated.js.map +1 -1
- package/dist/resources/en-us/studio.d.ts +1282 -2
- package/dist/resources/en-us/studio.d.ts.map +1 -1
- package/dist/resources/en-us/studio.js +1282 -2
- package/dist/resources/en-us/studio.js.map +1 -1
- package/dist/resources/en-us/ui.d.ts +60 -2
- package/dist/resources/en-us/ui.d.ts.map +1 -1
- package/dist/resources/en-us/ui.js +72 -14
- package/dist/resources/en-us/ui.js.map +1 -1
- package/dist/resources/fr-fr/common.d.ts +96 -970
- package/dist/resources/fr-fr/common.d.ts.map +1 -1
- package/dist/resources/fr-fr/common.js +99 -973
- package/dist/resources/fr-fr/common.js.map +1 -1
- package/dist/resources/fr-fr/errors.d.ts +3 -2
- package/dist/resources/fr-fr/errors.d.ts.map +1 -1
- package/dist/resources/fr-fr/errors.js +3 -2
- package/dist/resources/fr-fr/errors.js.map +1 -1
- package/dist/resources/fr-fr/generated.d.ts +3 -2
- package/dist/resources/fr-fr/generated.d.ts.map +1 -1
- package/dist/resources/fr-fr/generated.js +3 -2
- package/dist/resources/fr-fr/generated.js.map +1 -1
- package/dist/resources/fr-fr/studio.d.ts +1282 -2
- package/dist/resources/fr-fr/studio.d.ts.map +1 -1
- package/dist/resources/fr-fr/studio.js +1282 -2
- package/dist/resources/fr-fr/studio.js.map +1 -1
- package/dist/resources/fr-fr/ui.d.ts +60 -2
- package/dist/resources/fr-fr/ui.d.ts.map +1 -1
- package/dist/resources/fr-fr/ui.js +72 -14
- package/dist/resources/fr-fr/ui.js.map +1 -1
- package/dist/resources/index.d.ts +3 -6
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +15 -14
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/lazy.d.ts +19 -9
- package/dist/resources/lazy.d.ts.map +1 -1
- package/dist/resources/lazy.js +4 -2
- package/dist/resources/lazy.js.map +1 -1
- package/dist/resources/namespaces.d.ts +43 -0
- package/dist/resources/namespaces.d.ts.map +1 -0
- package/dist/resources/namespaces.js +37 -0
- package/dist/resources/namespaces.js.map +1 -0
- package/dist/resources/zh-cn/common.d.ts +96 -970
- package/dist/resources/zh-cn/common.d.ts.map +1 -1
- package/dist/resources/zh-cn/common.js +99 -973
- package/dist/resources/zh-cn/common.js.map +1 -1
- package/dist/resources/zh-cn/errors.d.ts +3 -2
- package/dist/resources/zh-cn/errors.d.ts.map +1 -1
- package/dist/resources/zh-cn/errors.js +3 -2
- package/dist/resources/zh-cn/errors.js.map +1 -1
- package/dist/resources/zh-cn/generated.d.ts +3 -2
- package/dist/resources/zh-cn/generated.d.ts.map +1 -1
- package/dist/resources/zh-cn/generated.js +3 -2
- package/dist/resources/zh-cn/generated.js.map +1 -1
- package/dist/resources/zh-cn/studio.d.ts +1282 -2
- package/dist/resources/zh-cn/studio.d.ts.map +1 -1
- package/dist/resources/zh-cn/studio.js +1282 -2
- package/dist/resources/zh-cn/studio.js.map +1 -1
- package/dist/resources/zh-cn/ui.d.ts +60 -2
- package/dist/resources/zh-cn/ui.d.ts.map +1 -1
- package/dist/resources/zh-cn/ui.js +72 -14
- package/dist/resources/zh-cn/ui.js.map +1 -1
- package/dist/resources/zh-tw/common.d.ts +96 -970
- package/dist/resources/zh-tw/common.d.ts.map +1 -1
- package/dist/resources/zh-tw/common.js +99 -973
- package/dist/resources/zh-tw/common.js.map +1 -1
- package/dist/resources/zh-tw/errors.d.ts +3 -2
- package/dist/resources/zh-tw/errors.d.ts.map +1 -1
- package/dist/resources/zh-tw/errors.js +3 -2
- package/dist/resources/zh-tw/errors.js.map +1 -1
- package/dist/resources/zh-tw/generated.d.ts +3 -2
- package/dist/resources/zh-tw/generated.d.ts.map +1 -1
- package/dist/resources/zh-tw/generated.js +3 -2
- package/dist/resources/zh-tw/generated.js.map +1 -1
- package/dist/resources/zh-tw/studio.d.ts +1282 -2
- package/dist/resources/zh-tw/studio.d.ts.map +1 -1
- package/dist/resources/zh-tw/studio.js +1282 -2
- package/dist/resources/zh-tw/studio.js.map +1 -1
- package/dist/resources/zh-tw/ui.d.ts +60 -2
- package/dist/resources/zh-tw/ui.d.ts.map +1 -1
- package/dist/resources/zh-tw/ui.js +72 -14
- package/dist/resources/zh-tw/ui.js.map +1 -1
- package/dist/review-status.js +7 -7
- package/locales/ar-EG/.meta.json +3783 -2339
- package/locales/ar-EG/common.json +96 -971
- package/locales/ar-EG/studio.json +1279 -0
- package/locales/ar-EG/ui.json +69 -12
- package/locales/cs-CZ/.meta.json +3849 -2405
- package/locales/cs-CZ/common.json +96 -971
- package/locales/cs-CZ/studio.json +1279 -0
- package/locales/cs-CZ/ui.json +69 -12
- package/locales/da-DK/.meta.json +3935 -2491
- package/locales/da-DK/common.json +96 -971
- package/locales/da-DK/studio.json +1279 -0
- package/locales/da-DK/ui.json +69 -12
- package/locales/de-DE/.meta.json +3895 -2451
- package/locales/de-DE/common.json +96 -971
- package/locales/de-DE/studio.json +1279 -0
- package/locales/de-DE/ui.json +69 -12
- package/locales/en-US/common.json +96 -971
- package/locales/en-US/studio.json +1279 -0
- package/locales/en-US/ui.json +69 -12
- package/locales/fr-FR/.meta.json +3964 -2520
- package/locales/fr-FR/common.json +96 -971
- package/locales/fr-FR/studio.json +1279 -0
- package/locales/fr-FR/ui.json +69 -12
- package/locales/zh-CN/.meta.json +3781 -2337
- package/locales/zh-CN/common.json +96 -971
- package/locales/zh-CN/studio.json +1279 -0
- package/locales/zh-CN/ui.json +69 -12
- package/locales/zh-TW/.meta.json +3785 -2341
- package/locales/zh-TW/common.json +96 -971
- package/locales/zh-TW/studio.json +1279 -0
- package/locales/zh-TW/ui.json +69 -12
- package/package.json +1 -1
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* GENERATED MIRROR of ../../../locales/en-US/studio.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
|
|
6
|
-
*
|
|
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
|
*/
|
|
@@ -13,6 +14,1285 @@ export default {
|
|
|
13
14
|
"title": "Settings",
|
|
14
15
|
"workspaceSection": "Workspace",
|
|
15
16
|
"globalDefaultsNav": "Global defaults"
|
|
17
|
+
},
|
|
18
|
+
"source": {
|
|
19
|
+
"engine": {
|
|
20
|
+
"label": "Database engine",
|
|
21
|
+
"postgres": "PostgreSQL",
|
|
22
|
+
"mysql": "MySQL / MariaDB",
|
|
23
|
+
"sqlite": "SQLite"
|
|
24
|
+
},
|
|
25
|
+
"format": {
|
|
26
|
+
"label": "Schema format",
|
|
27
|
+
"helper": "Leave on auto-detect unless the detection gets it wrong.",
|
|
28
|
+
"auto": "Auto-detect",
|
|
29
|
+
"sql": "SQL DDL / pg_dump",
|
|
30
|
+
"prisma": "Prisma schema",
|
|
31
|
+
"drizzle": "Drizzle ORM",
|
|
32
|
+
"typeorm": "TypeORM entities",
|
|
33
|
+
"sequelize": "Sequelize models",
|
|
34
|
+
"rails": "Rails schema.rb",
|
|
35
|
+
"django": "Django models.py",
|
|
36
|
+
"json": "Adminium JSON"
|
|
37
|
+
},
|
|
38
|
+
"sqlite": {
|
|
39
|
+
"file": "Database file path",
|
|
40
|
+
"helper": "SQLite is a file, not a server — give the absolute path on the machine running Adminium."
|
|
41
|
+
},
|
|
42
|
+
"file": {
|
|
43
|
+
"detectedAs": "Detected: {format}",
|
|
44
|
+
"moreWarnings": "+{count} more warnings — the full list appears in the analyze step.",
|
|
45
|
+
"dropTitle": "Drop your schema file here, or browse",
|
|
46
|
+
"dropHint": "SQL DDL / pg_dump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django models, Adminium JSON",
|
|
47
|
+
"pitch": "No database connection required — we parse your schema file and build the same dashboards.",
|
|
48
|
+
"parsing": "Reading uploaded schema file…",
|
|
49
|
+
"tables": "tables",
|
|
50
|
+
"columns": "columns",
|
|
51
|
+
"warnings": "warnings",
|
|
52
|
+
"errorTitle": "Could not parse the file",
|
|
53
|
+
"parseFailed": "We could not parse that file. If auto-detect guessed wrong, pick the format explicitly and retry.",
|
|
54
|
+
"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.",
|
|
55
|
+
"requestFailed": "Upload failed — check your connection and try again."
|
|
56
|
+
},
|
|
57
|
+
"title": "Connect your database",
|
|
58
|
+
"subtitle": "Point Adminium at a database and we'll generate an admin dashboard from its schema.",
|
|
59
|
+
"name": "Connection name",
|
|
60
|
+
"namePlaceholder": "Production Postgres",
|
|
61
|
+
"modeLabel": "Source input mode",
|
|
62
|
+
"mode": {
|
|
63
|
+
"dsn": "Connection string",
|
|
64
|
+
"fields": "Individual fields",
|
|
65
|
+
"file": "Schema file"
|
|
66
|
+
},
|
|
67
|
+
"dsn": {
|
|
68
|
+
"label": "Connection string",
|
|
69
|
+
"helper": "postgres://user:password@host:5432/database — mysql:// and sqlite: work too.",
|
|
70
|
+
"incomplete": "Add host and database, e.g. postgres://user@host:5432/db",
|
|
71
|
+
"invalidScheme": "Unrecognized scheme — expected postgres://, mysql://, mariadb:// or sqlite:",
|
|
72
|
+
"quickFill": "Quick fill:"
|
|
73
|
+
},
|
|
74
|
+
"fields": {
|
|
75
|
+
"host": "Host",
|
|
76
|
+
"port": "Port",
|
|
77
|
+
"database": "Database",
|
|
78
|
+
"user": "User",
|
|
79
|
+
"password": "Password",
|
|
80
|
+
"ssl": "SSL mode",
|
|
81
|
+
"preview": "Connection string preview:"
|
|
82
|
+
},
|
|
83
|
+
"readOnlyRole": {
|
|
84
|
+
"title": "Use a read-only role",
|
|
85
|
+
"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."
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"capability": {
|
|
89
|
+
"mysqlApproxRows": "MySQL row counts are storage-engine estimates (they can drift up to ±40%) — shown with ≈.",
|
|
90
|
+
"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+.",
|
|
91
|
+
"sqliteCheckEnums": "SQLite has no native enum type — enums are synthesized from CHECK (col IN (…)) constraints.",
|
|
92
|
+
"sqliteNoComments": "SQLite has no column comments — use the schema remap editor to add labels.",
|
|
93
|
+
"importNoRowCounts": "Schema files carry no row counts — the tables list shows — instead of made-up numbers.",
|
|
94
|
+
"importNoLiveHealth": "No live database connection — health checks and schema-drift detection are unavailable for this source.",
|
|
95
|
+
"rowsUnavailable": "Schema files have no live database — row counts are unknown until you connect one.",
|
|
96
|
+
"rowsRunAnalyze": "No estimate yet — run ANALYZE on the database for row counts.",
|
|
97
|
+
"rowsNoEstimate": "The engine reported no estimate for this table.",
|
|
98
|
+
"rowsApproximate": "Storage-engine estimate — can drift up to ±40% on InnoDB."
|
|
99
|
+
},
|
|
100
|
+
"test": {
|
|
101
|
+
"log": {
|
|
102
|
+
"moreWarnings": "+{count} more parser warnings",
|
|
103
|
+
"connecting": "Establishing secure connection…",
|
|
104
|
+
"connected": "Connected ({latency} ms) · read-only introspection",
|
|
105
|
+
"connectFailed": "Connection failed.",
|
|
106
|
+
"readingSchema": "Reading schema: public",
|
|
107
|
+
"readingFile": "Reading uploaded schema file…",
|
|
108
|
+
"parsingFile": "Parsing {file}…",
|
|
109
|
+
"detected": "Detected {tables} tables · {columns} columns",
|
|
110
|
+
"found": "Found {tables} tables · {columns} columns",
|
|
111
|
+
"mapping": "Mapping column types → input widgets",
|
|
112
|
+
"relations": "Detecting relations…",
|
|
113
|
+
"piiScan": "Scanning for PII columns…",
|
|
114
|
+
"piiDone": "PII scan complete — {count} columns masked by default",
|
|
115
|
+
"piiDoneUnknown": "PII scan complete",
|
|
116
|
+
"jobFailed": "Introspection failed.",
|
|
117
|
+
"networkFailed": "Request failed — check your connection and retry.",
|
|
118
|
+
"ready": "Ready"
|
|
119
|
+
},
|
|
120
|
+
"title": "Analyzing your schema",
|
|
121
|
+
"subtitle": "Introspecting tables, columns, and relationships. This takes a few seconds.",
|
|
122
|
+
"trust": "We only read your schema and data. Nothing is modified.",
|
|
123
|
+
"errorTitle": "Connection failed",
|
|
124
|
+
"retry": "Retry",
|
|
125
|
+
"logLabel": "Introspection log",
|
|
126
|
+
"hint": {
|
|
127
|
+
"auth": "Authentication failed — check the user name and password in your DSN.",
|
|
128
|
+
"hostUnreachable": "Host unreachable — check the hostname and port, and that the database accepts connections from this machine (allowlist our IPs).",
|
|
129
|
+
"metaPlacement": "This source cannot host Adminium’s meta tables — continue with a separate meta database.",
|
|
130
|
+
"permission": "The role connected but lacks schema-read privileges — grant USAGE on the schema to your introspection role.",
|
|
131
|
+
"timeout": "The database did not answer in time — check network path and load, then retry.",
|
|
132
|
+
"tls": "TLS negotiation failed — try sslmode=require, or upload the CA certificate your server expects.",
|
|
133
|
+
"unknown": "Connection failed — verify the DSN and retry."
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"tables": {
|
|
137
|
+
"importNoCounts": "Schema files carry no row counts — the column shows — until a live database is connected.",
|
|
138
|
+
"title": "Choose your tables",
|
|
139
|
+
"subtitle": "Choose which to include. You can change this anytime.",
|
|
140
|
+
"search": "Filter tables…",
|
|
141
|
+
"listLabel": "Includable tables",
|
|
142
|
+
"emptyFilter": "No tables match your filter.",
|
|
143
|
+
"pii": "PII",
|
|
144
|
+
"highVolume": "high volume",
|
|
145
|
+
"highVolumeNote": "Tables over 100,000 rows start unchecked — ops tables rarely belong in a dashboard.",
|
|
146
|
+
"joinHidden": "{count} join/system tables are pre-hidden — they still power many-to-many relations."
|
|
147
|
+
},
|
|
148
|
+
"hub": {
|
|
149
|
+
"title": "Data connections",
|
|
150
|
+
"subtitle": "{healthy, number} of {total, plural, one {# connection} other {# connections}} healthy",
|
|
151
|
+
"connectNew": "New connection",
|
|
152
|
+
"stats": {
|
|
153
|
+
"connections": "Connections",
|
|
154
|
+
"healthy": "Healthy",
|
|
155
|
+
"tables": "Tables included",
|
|
156
|
+
"pages": "Generated pages"
|
|
157
|
+
},
|
|
158
|
+
"status": {
|
|
159
|
+
"connected": "Connected",
|
|
160
|
+
"error": "Error",
|
|
161
|
+
"unconfigured": "Draft",
|
|
162
|
+
"testing": "Testing…",
|
|
163
|
+
"paused": "Paused"
|
|
164
|
+
},
|
|
165
|
+
"card": {
|
|
166
|
+
"readOnly": "Read-only",
|
|
167
|
+
"tables": "Tables",
|
|
168
|
+
"pages": "Pages",
|
|
169
|
+
"latency": "Latency",
|
|
170
|
+
"latencyMs": "{latency, number} ms",
|
|
171
|
+
"lastIntrospected": "Last introspected",
|
|
172
|
+
"never": "Never",
|
|
173
|
+
"timezone": "Timezone",
|
|
174
|
+
"timezoneGuessed": "from this server",
|
|
175
|
+
"paused": "Adminium is not connecting to this database. Its pages load again when you resume it.",
|
|
176
|
+
"pausedSince": "Paused {when} — Adminium is not connecting to this database. Its pages load again when you resume it."
|
|
177
|
+
},
|
|
178
|
+
"action": {
|
|
179
|
+
"test": "Test",
|
|
180
|
+
"reintrospect": "Re-introspect",
|
|
181
|
+
"reintrospectFile": "Schema-file sources have no live database — re-upload the file instead.",
|
|
182
|
+
"remap": "Remap schema",
|
|
183
|
+
"delete": "Delete",
|
|
184
|
+
"regional": "Regional settings",
|
|
185
|
+
"pause": "Pause",
|
|
186
|
+
"resume": "Resume",
|
|
187
|
+
"pausedHint": "This connection is paused — resume it to reach the database.",
|
|
188
|
+
"rename": "Rename"
|
|
189
|
+
},
|
|
190
|
+
"regional": {
|
|
191
|
+
"title": "Regional settings",
|
|
192
|
+
"intro": "These describe the business this database belongs to, not the person reading it. Apps served from Adminium read them from here.",
|
|
193
|
+
"timezone": "Timezone",
|
|
194
|
+
"timezoneHelper": "Dates and times render in this zone. Apps hosted by Adminium fall back to UTC without one, and say on screen that they are doing it.",
|
|
195
|
+
"guessedTitle": "This zone came from the server",
|
|
196
|
+
"guessedBody": "Adminium filled it in from the machine it runs on, not from anyone here. Save to confirm it, or pick the zone this business actually keeps.",
|
|
197
|
+
"timezonePlaceholder": "Region/City",
|
|
198
|
+
"currency": "Currency",
|
|
199
|
+
"currencyHelper": "Used to format money. Optional — leaving it unset affects formatting only.",
|
|
200
|
+
"currencyPlaceholder": "ISO-4217 code",
|
|
201
|
+
"notSet": "Not set",
|
|
202
|
+
"noMatch": "No matching zone",
|
|
203
|
+
"noMatchCurrency": "No matching currency",
|
|
204
|
+
"save": "Save",
|
|
205
|
+
"failed": "Regional settings could not be saved",
|
|
206
|
+
"saved": "Regional settings updated"
|
|
207
|
+
},
|
|
208
|
+
"test": {
|
|
209
|
+
"ok": "Connection healthy · {latency, number} ms",
|
|
210
|
+
"failed": "Connection test failed"
|
|
211
|
+
},
|
|
212
|
+
"introspect": {
|
|
213
|
+
"noChanges": "Schema unchanged — no new snapshot.",
|
|
214
|
+
"updated": "Schema re-introspected",
|
|
215
|
+
"masksProposed": "{count, plural, one {# column} other {# columns}} proposed for masking — review in the remap editor.",
|
|
216
|
+
"failed": "Introspection failed. Try again."
|
|
217
|
+
},
|
|
218
|
+
"delete": {
|
|
219
|
+
"title": "Delete connection",
|
|
220
|
+
"body": "This deletes “{name}” and its generated pages. Your database itself is never touched.",
|
|
221
|
+
"prompt": "Type {name} to confirm",
|
|
222
|
+
"confirm": "Delete connection",
|
|
223
|
+
"cancel": "Cancel",
|
|
224
|
+
"close": "Close",
|
|
225
|
+
"success": "Connection “{name}” deleted",
|
|
226
|
+
"failed": "Could not delete the connection. Try again."
|
|
227
|
+
},
|
|
228
|
+
"empty": {
|
|
229
|
+
"title": "No data sources yet",
|
|
230
|
+
"body": "Connect a database and Adminium generates your admin panel from its schema.",
|
|
231
|
+
"cta": "Connect a database"
|
|
232
|
+
},
|
|
233
|
+
"hostedApps": "Hosted apps",
|
|
234
|
+
"subtitlePaused": "{healthy, number} of {total, plural, one {# connection} other {# connections}} healthy · {paused, number} paused",
|
|
235
|
+
"pause": {
|
|
236
|
+
"title": "Pause this connection?",
|
|
237
|
+
"body": "Adminium stops opening any connection to “{name}”. Its {pages, plural, one {# page} other {# pages}}, scheduled reports and hosted apps stop loading data until you resume it.",
|
|
238
|
+
"keeps": "Nothing is deleted — the connection, its schema and its {pages, plural, one {# page} other {# pages}} are all kept, and one click brings them back.",
|
|
239
|
+
"confirm": "Pause connection",
|
|
240
|
+
"pausedToast": "Connection “{name}” paused",
|
|
241
|
+
"resumedToast": "Connection “{name}” resumed",
|
|
242
|
+
"pauseFailed": "Could not pause the connection. Try again.",
|
|
243
|
+
"resumeFailed": "Could not resume the connection. Try again."
|
|
244
|
+
},
|
|
245
|
+
"rename": {
|
|
246
|
+
"title": "Rename connection",
|
|
247
|
+
"label": "Name",
|
|
248
|
+
"helper": "What this database is called throughout Adminium — the card, the sidebar group over its pages, and every picker that offers it. The database itself is not renamed.",
|
|
249
|
+
"save": "Rename",
|
|
250
|
+
"saved": "Connection renamed",
|
|
251
|
+
"failed": "The connection could not be renamed"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"settingsHub": {
|
|
255
|
+
"title": "Workspace settings",
|
|
256
|
+
"subtitle": "Identity, security and destructive actions for this workspace.",
|
|
257
|
+
"save": "Save changes",
|
|
258
|
+
"saved": "Workspace settings updated",
|
|
259
|
+
"saveFailed": "Could not save workspace settings. Try again.",
|
|
260
|
+
"superAdminOnlyTitle": "Super admin required",
|
|
261
|
+
"superAdminOnly": "Only a super admin can change workspace identity and security settings.",
|
|
262
|
+
"identity": {
|
|
263
|
+
"heading": "Workspace identity",
|
|
264
|
+
"appName": {
|
|
265
|
+
"label": "Application name",
|
|
266
|
+
"helper": "Shown in the sidebar, browser title, and emails.",
|
|
267
|
+
"error": "Enter a name of at most 60 characters."
|
|
268
|
+
},
|
|
269
|
+
"logo": {
|
|
270
|
+
"label": "Logo",
|
|
271
|
+
"drop": "Drop an image here",
|
|
272
|
+
"helper": "PNG, JPEG, WebP, GIF or SVG, up to 1 MB. Replaces the built-in mark everywhere.",
|
|
273
|
+
"upload": "Upload logo",
|
|
274
|
+
"replace": "Replace logo",
|
|
275
|
+
"remove": "Remove",
|
|
276
|
+
"uploaded": "Logo updated",
|
|
277
|
+
"removed": "Logo removed",
|
|
278
|
+
"tooLarge": "That image is larger than 1 MB.",
|
|
279
|
+
"badType": "Choose a PNG, JPEG, WebP, GIF or SVG image.",
|
|
280
|
+
"undo": "Undo"
|
|
281
|
+
},
|
|
282
|
+
"showVersion": {
|
|
283
|
+
"label": "Version in the sidebar",
|
|
284
|
+
"helper": "The build number beside the logo. Off hides which version you run."
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
"security": {
|
|
288
|
+
"heading": "Security",
|
|
289
|
+
"require2fa": {
|
|
290
|
+
"label": "Require two-factor auth",
|
|
291
|
+
"desc": "Every member must enable 2FA to sign in.",
|
|
292
|
+
"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."
|
|
293
|
+
},
|
|
294
|
+
"allowSignup": {
|
|
295
|
+
"label": "Allow self-signup",
|
|
296
|
+
"desc": "Anyone can create an account — off keeps this workspace invite-only."
|
|
297
|
+
},
|
|
298
|
+
"sessionTtl": {
|
|
299
|
+
"label": "Session lifetime (hours)",
|
|
300
|
+
"error": "Between {min, number} and {max, number} hours."
|
|
301
|
+
},
|
|
302
|
+
"passwordMin": {
|
|
303
|
+
"label": "Minimum password length",
|
|
304
|
+
"error": "Between {min, number} and {max, number} characters."
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
"email": {
|
|
308
|
+
"heading": "Email (SMTP)",
|
|
309
|
+
"unconfigured": "No mail server is set, so Adminium cannot send password resets, user invites or scheduled reports.",
|
|
310
|
+
"host": {
|
|
311
|
+
"label": "SMTP host",
|
|
312
|
+
"error": "A bare hostname or IP address — no scheme, port or credentials."
|
|
313
|
+
},
|
|
314
|
+
"port": {
|
|
315
|
+
"label": "Port",
|
|
316
|
+
"error": "Between {min, number} and {max, number}."
|
|
317
|
+
},
|
|
318
|
+
"user": {
|
|
319
|
+
"label": "Username",
|
|
320
|
+
"helper": "Leave empty for a relay that does not authenticate."
|
|
321
|
+
},
|
|
322
|
+
"pass": {
|
|
323
|
+
"label": "Password",
|
|
324
|
+
"helper": "Stored encrypted and never shown again. Leave blank to keep the current one.",
|
|
325
|
+
"error": "This username needs a password."
|
|
326
|
+
},
|
|
327
|
+
"from": {
|
|
328
|
+
"label": "From address",
|
|
329
|
+
"helper": "A bare address, or a display name in front of one.",
|
|
330
|
+
"error": "Enter an email address."
|
|
331
|
+
},
|
|
332
|
+
"secure": {
|
|
333
|
+
"label": "Implicit TLS",
|
|
334
|
+
"helper": "On for port 465. Off starts in cleartext and upgrades with STARTTLS, which is what port 587 expects."
|
|
335
|
+
},
|
|
336
|
+
"remove": "Remove mail server",
|
|
337
|
+
"review": {
|
|
338
|
+
"removed": "Removed",
|
|
339
|
+
"password": "Replaced"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"review": {
|
|
343
|
+
"title": "Save workspace settings",
|
|
344
|
+
"subtitle": "Review your changes before saving.",
|
|
345
|
+
"confirm": "Save changes",
|
|
346
|
+
"cancel": "Cancel",
|
|
347
|
+
"close": "Close",
|
|
348
|
+
"on": "On",
|
|
349
|
+
"off": "Off",
|
|
350
|
+
"shown": "Shown",
|
|
351
|
+
"hidden": "Hidden",
|
|
352
|
+
"change": "{before} → {after}"
|
|
353
|
+
},
|
|
354
|
+
"defaultsCard": {
|
|
355
|
+
"heading": "Appearance & language defaults",
|
|
356
|
+
"body": "Workspace-wide theme, accent, density and language live under Global defaults.",
|
|
357
|
+
"cta": "Open global defaults"
|
|
358
|
+
},
|
|
359
|
+
"danger": {
|
|
360
|
+
"heading": "Danger zone",
|
|
361
|
+
"subtitle": "Irreversible actions.",
|
|
362
|
+
"empty": "Nothing to delete — no connections yet.",
|
|
363
|
+
"deleteDesc": "Deletes the connection and its generated pages. Your database is not touched. Cannot be undone.",
|
|
364
|
+
"deleteCta": "Delete connection"
|
|
365
|
+
},
|
|
366
|
+
"aiCard": {
|
|
367
|
+
"heading": "AI enrichment",
|
|
368
|
+
"body": "Configure an AI provider (or the copy-paste round-trip) to enrich labels, groups and relations.",
|
|
369
|
+
"cta": "Open AI settings"
|
|
370
|
+
},
|
|
371
|
+
"pagesCard": {
|
|
372
|
+
"heading": "Pages",
|
|
373
|
+
"body": "Add, edit and delete pages, change what each one shows, and reorder the sidebar.",
|
|
374
|
+
"cta": "Manage pages"
|
|
375
|
+
},
|
|
376
|
+
"translationsCard": {
|
|
377
|
+
"heading": "Languages & translations",
|
|
378
|
+
"body": "Reword anything in Adminium, choose which languages people can pick, and add your own.",
|
|
379
|
+
"cta": "Open translations"
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"settingsAi": {
|
|
383
|
+
"title": "AI enrichment",
|
|
384
|
+
"subtitle": "Connect a model to let Adminium suggest labels, groups, relations and more — always reviewed as a diff before anything applies.",
|
|
385
|
+
"saved": "AI provider saved",
|
|
386
|
+
"saveFailed": "Could not save the AI provider. Try again.",
|
|
387
|
+
"save": "Save provider",
|
|
388
|
+
"test": "Test connection",
|
|
389
|
+
"testHintDirty": "Save your changes before testing.",
|
|
390
|
+
"testing": "Pinging the provider…",
|
|
391
|
+
"testError": "Test failed",
|
|
392
|
+
"testErrorBody": "Could not reach the provider. Check the key and base URL.",
|
|
393
|
+
"testOk": "Connected to {model} in {latency} ms",
|
|
394
|
+
"testUnknownModel": "the provider",
|
|
395
|
+
"provider": {
|
|
396
|
+
"heading": "AI provider",
|
|
397
|
+
"subtitle": "Choose how Adminium reaches a model to enrich your schema. Keys are stored encrypted and never shown again.",
|
|
398
|
+
"active": "Active",
|
|
399
|
+
"anthropic": {
|
|
400
|
+
"label": "Anthropic",
|
|
401
|
+
"desc": "Claude models via the Anthropic API."
|
|
402
|
+
},
|
|
403
|
+
"openai": {
|
|
404
|
+
"label": "OpenAI",
|
|
405
|
+
"desc": "GPT models via the OpenAI API."
|
|
406
|
+
},
|
|
407
|
+
"openaiCompatible": {
|
|
408
|
+
"label": "OpenAI-compatible",
|
|
409
|
+
"desc": "Any endpoint that speaks the OpenAI wire format — Groq, Together, vLLM, LM Studio."
|
|
410
|
+
},
|
|
411
|
+
"ollama": {
|
|
412
|
+
"label": "Ollama (local)",
|
|
413
|
+
"desc": "Models running locally through Ollama — no key, no cloud."
|
|
414
|
+
},
|
|
415
|
+
"requiresNetwork": "Requires internet & an API key",
|
|
416
|
+
"networkDisabledTitle": "Direct AI providers are turned off on this install",
|
|
417
|
+
"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."
|
|
418
|
+
},
|
|
419
|
+
"configure": {
|
|
420
|
+
"heading": "Configure {provider}"
|
|
421
|
+
},
|
|
422
|
+
"field": {
|
|
423
|
+
"baseUrl": "Base URL",
|
|
424
|
+
"baseUrlOptional": "Leave as-is unless Ollama runs on another host.",
|
|
425
|
+
"baseUrlHelper": "The endpoint root that serves /chat/completions.",
|
|
426
|
+
"model": "Model",
|
|
427
|
+
"modelFreeText": "Enter the exact model id your endpoint serves.",
|
|
428
|
+
"modelLive": "Loaded live from the provider.",
|
|
429
|
+
"modelStatic": "A known-good list; type a custom id after saving to refresh it.",
|
|
430
|
+
"modelLoading": "Loading…",
|
|
431
|
+
"modelPlaceholder": "Select a model…",
|
|
432
|
+
"key": "API key",
|
|
433
|
+
"keyStored": "Stored encrypted. Replace it to use a different key.",
|
|
434
|
+
"keyMask": "sk-…{last4}",
|
|
435
|
+
"keyReplace": "Replace key",
|
|
436
|
+
"keyOptional": "Optional — some endpoints need no key.",
|
|
437
|
+
"keyWriteOnly": "Write-only: once saved it is never shown again.",
|
|
438
|
+
"noKeyTitle": "No API key needed",
|
|
439
|
+
"noKeyBody": "Ollama runs locally, so nothing leaves this machine."
|
|
440
|
+
},
|
|
441
|
+
"runStatus": {
|
|
442
|
+
"draft": "Draft",
|
|
443
|
+
"running": "Running",
|
|
444
|
+
"awaitingResponse": "Awaiting response",
|
|
445
|
+
"validated": "Validated",
|
|
446
|
+
"applied": "Applied",
|
|
447
|
+
"partiallyApplied": "Partially applied",
|
|
448
|
+
"failed": "Failed",
|
|
449
|
+
"discarded": "Discarded"
|
|
450
|
+
},
|
|
451
|
+
"byo": {
|
|
452
|
+
"heading": "No key? Use your own AI tool",
|
|
453
|
+
"subtitle": "The copy-paste round-trip — nothing leaves this machine.",
|
|
454
|
+
"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.",
|
|
455
|
+
"guaranteeTitle": "Telemetry-free guarantee",
|
|
456
|
+
"guarantee1": "The prompt carries only your schema and aggregate stats — never row data by default.",
|
|
457
|
+
"guarantee2": "No credentials, instance URL, or identifiers are embedded.",
|
|
458
|
+
"guarantee3": "BYO runs make zero network calls.",
|
|
459
|
+
"promptVersion": "Prompt {version}",
|
|
460
|
+
"schemaVersion": "Schema {version}",
|
|
461
|
+
"headingRecommended": "Use your own AI tool — no key needed",
|
|
462
|
+
"recommended": "Recommended"
|
|
463
|
+
},
|
|
464
|
+
"history": {
|
|
465
|
+
"heading": "Run history",
|
|
466
|
+
"subtitle": "Past enrichment runs. Open one to review its suggestions.",
|
|
467
|
+
"tableLabel": "Enrichment runs",
|
|
468
|
+
"colDate": "Date",
|
|
469
|
+
"colSource": "Source",
|
|
470
|
+
"colStatus": "Status",
|
|
471
|
+
"colChunks": "Chunks",
|
|
472
|
+
"openReview": "Open review for the run from {date}",
|
|
473
|
+
"connection": "Connection",
|
|
474
|
+
"empty": "No enrichment runs yet. Enrich a schema from the connect wizard to see history here.",
|
|
475
|
+
"errorTitle": "Could not load runs",
|
|
476
|
+
"errorBody": "Refresh the page to try again.",
|
|
477
|
+
"noConnections": "Connect a database first — enrichment runs are recorded per connection.",
|
|
478
|
+
"byo": "BYO",
|
|
479
|
+
"directPath": "Direct"
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
"enrich": {
|
|
483
|
+
"title": "Enrich with AI",
|
|
484
|
+
"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.",
|
|
485
|
+
"intentLabel": "How would you like to enrich?",
|
|
486
|
+
"sectionsLegend": "What should the AI decide?",
|
|
487
|
+
"localesLegend": "Translate labels into",
|
|
488
|
+
"localeLocked": "(required)",
|
|
489
|
+
"samplingTitle": "Include sample values",
|
|
490
|
+
"samplingHint": "Includes up to 20 real values per non-PII column in the prompt.",
|
|
491
|
+
"samplingPreviewTitle": "What leaves this machine",
|
|
492
|
+
"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.",
|
|
493
|
+
"noSections": "Select at least one decision group to enrich.",
|
|
494
|
+
"generatePrompt": "Generate prompt",
|
|
495
|
+
"startProvider": "Start enrichment",
|
|
496
|
+
"startOver": "Start over",
|
|
497
|
+
"copied": "Copied",
|
|
498
|
+
"createFailed": "Could not build the enrichment prompt — retry.",
|
|
499
|
+
"createFailedTitle": "Could not start",
|
|
500
|
+
"providerFallback": "your AI provider",
|
|
501
|
+
"fileTitle": "AI enrichment needs a live database",
|
|
502
|
+
"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.",
|
|
503
|
+
"section": {
|
|
504
|
+
"labels": "Labels & descriptions",
|
|
505
|
+
"groups": "Navigation groups",
|
|
506
|
+
"enums": "Enum semantics",
|
|
507
|
+
"relations": "Relations",
|
|
508
|
+
"keys": "Key columns",
|
|
509
|
+
"templates": "Page templates",
|
|
510
|
+
"widgets": "Dashboard widgets",
|
|
511
|
+
"pii": "PII & masking",
|
|
512
|
+
"icons": "Icons",
|
|
513
|
+
"microcopy": "Micro-copy"
|
|
514
|
+
},
|
|
515
|
+
"provider": {
|
|
516
|
+
"title": "Use my AI provider",
|
|
517
|
+
"description": "Run enrichment now against your configured provider. You review every suggestion as a diff.",
|
|
518
|
+
"unconfigured": "No AI provider is configured yet — copy a prompt to your own tool below, or configure a provider first.",
|
|
519
|
+
"settingsHint": "Want to run it directly?",
|
|
520
|
+
"settingsLink": "Configure a provider in Settings → AI",
|
|
521
|
+
"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."
|
|
522
|
+
},
|
|
523
|
+
"byo": {
|
|
524
|
+
"cardTitle": "Copy a prompt to my own AI tool",
|
|
525
|
+
"cardDescription": "Copy a self-contained prompt into Claude Code, ChatGPT, anything — then paste the JSON back. No key needed, nothing leaves this machine automatically.",
|
|
526
|
+
"guidance": "Run this in any AI tool — Claude Code, ChatGPT, anything. Paste the JSON it returns below.",
|
|
527
|
+
"promptLabel": "Enrichment prompt",
|
|
528
|
+
"promptLabelN": "Enrichment prompt {index} of {total}",
|
|
529
|
+
"tokenChip": "≈ {tokens} tokens",
|
|
530
|
+
"copyPrompt": "Copy prompt",
|
|
531
|
+
"copyPromptDone": "Prompt copied",
|
|
532
|
+
"download": "Download .md",
|
|
533
|
+
"chunkTabs": "Prompt chunks",
|
|
534
|
+
"chunkTab": "Prompt {index}",
|
|
535
|
+
"chunkValid": "Chunk {index} validated",
|
|
536
|
+
"pasteLabel": "Paste the JSON response",
|
|
537
|
+
"pastePlaceholder": "Paste the JSON response here…",
|
|
538
|
+
"validate": "Validate",
|
|
539
|
+
"valid": "Response validated",
|
|
540
|
+
"mergedTitle": "All {count} chunks validated and merged",
|
|
541
|
+
"mergedTitleSingle": "Response validated",
|
|
542
|
+
"mergedBody": "Suggestions are ready to review against the heuristic baseline.",
|
|
543
|
+
"errorsTitle": "Validation found {count} issues",
|
|
544
|
+
"copyErrors": "Copy errors for your AI tool",
|
|
545
|
+
"copyErrorsDone": "Errors copied",
|
|
546
|
+
"copyErrorsHint": "Paste this back into your AI tool to get a corrected response.",
|
|
547
|
+
"droppedItems": "{count} suggestions were dropped during validation — review shows the rest.",
|
|
548
|
+
"pendingTitle": "Validate every prompt to continue",
|
|
549
|
+
"pendingBody": "Paste the JSON response above and validate it to continue to review.",
|
|
550
|
+
"pendingBodyChunked": "Each chunk must validate before the suggestions merge. Paste and validate every prompt above.",
|
|
551
|
+
"requestFailed": "Could not reach the server to validate — retry.",
|
|
552
|
+
"continueReview": "Continue to review",
|
|
553
|
+
"wholeDocument": "whole document",
|
|
554
|
+
"cardTitleRecommended": "Copy a prompt to my own AI tool — recommended"
|
|
555
|
+
},
|
|
556
|
+
"direct": {
|
|
557
|
+
"title": "Enriching with AI",
|
|
558
|
+
"subtitle": "Sending your schema to",
|
|
559
|
+
"building": "Building prompt…",
|
|
560
|
+
"logLabel": "Enrichment log",
|
|
561
|
+
"cancel": "Cancel",
|
|
562
|
+
"back": "Back to options",
|
|
563
|
+
"retry": "Retry",
|
|
564
|
+
"done": "Enrichment complete — review the suggestions.",
|
|
565
|
+
"continueReview": "Continue to review",
|
|
566
|
+
"failed": "The provider run failed. Check your AI settings and retry.",
|
|
567
|
+
"jobFailed": "The enrichment run did not finish.",
|
|
568
|
+
"startFailed": "Could not start the run — retry.",
|
|
569
|
+
"errorTitle": "Enrichment failed"
|
|
570
|
+
},
|
|
571
|
+
"skip": {
|
|
572
|
+
"title": "Skip — use heuristics only",
|
|
573
|
+
"description": "Generate from the heuristic baseline. You can enrich later from Settings → AI — skipping is never penalized.",
|
|
574
|
+
"confirmTitle": "Continuing with heuristics",
|
|
575
|
+
"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."
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
"review": {
|
|
579
|
+
"unavailableTitle": "Review screen not available",
|
|
580
|
+
"unavailableBody": "This build does not include the enrichment review screen yet (06-T14). It lands with the diff-and-apply flow."
|
|
581
|
+
},
|
|
582
|
+
"llmRuns": {
|
|
583
|
+
"review": {
|
|
584
|
+
"header": {
|
|
585
|
+
"title": "Review AI suggestions",
|
|
586
|
+
"model": "Model",
|
|
587
|
+
"snapshot": "Snapshot",
|
|
588
|
+
"byo": "BYO",
|
|
589
|
+
"pathDirect": "Direct API",
|
|
590
|
+
"pathByo": "Copy-paste",
|
|
591
|
+
"agree": "{n} agree",
|
|
592
|
+
"conflict": "{n} conflict",
|
|
593
|
+
"new": "{n} new",
|
|
594
|
+
"rejects": "{n} rejects",
|
|
595
|
+
"countsAria": "Suggestion counts"
|
|
596
|
+
},
|
|
597
|
+
"bulk": {
|
|
598
|
+
"thresholdLabel": "Confidence threshold",
|
|
599
|
+
"thresholdAria": "Accept-all confidence threshold",
|
|
600
|
+
"acceptAll": "Accept all ≥ {pct}%",
|
|
601
|
+
"clear": "Clear selection"
|
|
602
|
+
},
|
|
603
|
+
"section": {
|
|
604
|
+
"selectAllAria": "Select all in {group}",
|
|
605
|
+
"acceptedCount": "{n} accepted"
|
|
606
|
+
},
|
|
607
|
+
"group": {
|
|
608
|
+
"labels": "Labels & translations",
|
|
609
|
+
"navigation": "Navigation & domains",
|
|
610
|
+
"enums": "Enum semantics",
|
|
611
|
+
"relations": "Relations",
|
|
612
|
+
"keys": "Key columns",
|
|
613
|
+
"templates": "Page templates",
|
|
614
|
+
"dashboards": "Dashboards & widgets",
|
|
615
|
+
"pii": "PII & masking",
|
|
616
|
+
"icons": "Icons",
|
|
617
|
+
"microcopy": "Micro-copy"
|
|
618
|
+
},
|
|
619
|
+
"status": {
|
|
620
|
+
"agree": "Agrees",
|
|
621
|
+
"conflict": "Conflict",
|
|
622
|
+
"new": "New",
|
|
623
|
+
"heuristicOnly": "Heuristic only",
|
|
624
|
+
"rejects": "Rejects heuristic",
|
|
625
|
+
"locked": "Locked"
|
|
626
|
+
},
|
|
627
|
+
"row": {
|
|
628
|
+
"acceptAria": "Accept {noun} suggestion for {target}",
|
|
629
|
+
"keptEdited": "kept — edited by you",
|
|
630
|
+
"rejectsCallout": "The AI rejects a heuristic decision — confirm before accepting.",
|
|
631
|
+
"showTranslations": "Show translations",
|
|
632
|
+
"hideTranslations": "Hide translations",
|
|
633
|
+
"confidenceAria": "Confidence {pct}%",
|
|
634
|
+
"noAi": "No AI suggestion"
|
|
635
|
+
},
|
|
636
|
+
"value": {
|
|
637
|
+
"none": "No value",
|
|
638
|
+
"absent": "None",
|
|
639
|
+
"dash": "—",
|
|
640
|
+
"display": "Display",
|
|
641
|
+
"key": "Key",
|
|
642
|
+
"rank": "rank {n}",
|
|
643
|
+
"span": "span {n}",
|
|
644
|
+
"tableCount": "{n} tables",
|
|
645
|
+
"widgetCount": "{n} widgets",
|
|
646
|
+
"enumWorkflow": "Workflow",
|
|
647
|
+
"enumCategory": "Category",
|
|
648
|
+
"notPii": "Not PII",
|
|
649
|
+
"label": "Label",
|
|
650
|
+
"description": "Description",
|
|
651
|
+
"subtitle": "Page subtitle",
|
|
652
|
+
"headline": "Empty-state headline",
|
|
653
|
+
"guidance": "Empty-state guidance"
|
|
654
|
+
},
|
|
655
|
+
"apply": {
|
|
656
|
+
"title": "Apply {n} suggestions",
|
|
657
|
+
"subtitle": "These changes are written in one transaction and can be undone.",
|
|
658
|
+
"empty": "Nothing selected to apply.",
|
|
659
|
+
"confirm": "Apply changes"
|
|
660
|
+
},
|
|
661
|
+
"footer": {
|
|
662
|
+
"count": "{n} suggestions selected",
|
|
663
|
+
"apply": "Apply {n} accepted suggestions",
|
|
664
|
+
"failed": "Apply failed"
|
|
665
|
+
},
|
|
666
|
+
"toast": {
|
|
667
|
+
"applied": "Applied {n} suggestions",
|
|
668
|
+
"appliedPartial": "Applied {n} suggestions (some skipped)",
|
|
669
|
+
"applyFailed": "Could not apply suggestions",
|
|
670
|
+
"undoFailed": "Could not undo this change"
|
|
671
|
+
},
|
|
672
|
+
"error": {
|
|
673
|
+
"title": "Could not load this run"
|
|
674
|
+
},
|
|
675
|
+
"notReady": {
|
|
676
|
+
"title": "This run has no suggestions to review yet",
|
|
677
|
+
"body": "A run must be validated before its suggestions can be reviewed. Generate or paste a response first."
|
|
678
|
+
},
|
|
679
|
+
"applied": {
|
|
680
|
+
"title": "This run has been applied",
|
|
681
|
+
"body": "The accepted suggestions below are read-only."
|
|
682
|
+
},
|
|
683
|
+
"empty": {
|
|
684
|
+
"title": "No suggestions",
|
|
685
|
+
"body": "This run produced no suggestions to review."
|
|
686
|
+
},
|
|
687
|
+
"cat": {
|
|
688
|
+
"label": "label",
|
|
689
|
+
"key": "key columns",
|
|
690
|
+
"enum": "enum",
|
|
691
|
+
"relation": "relation",
|
|
692
|
+
"pii": "PII",
|
|
693
|
+
"template": "page template",
|
|
694
|
+
"group": "navigation group",
|
|
695
|
+
"dashboard": "dashboard",
|
|
696
|
+
"widget": "widget",
|
|
697
|
+
"copy": "micro-copy"
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
},
|
|
701
|
+
"wizard": {
|
|
702
|
+
"title": "New connection",
|
|
703
|
+
"back": "Back",
|
|
704
|
+
"continue": "Continue",
|
|
705
|
+
"progress": "Setup progress",
|
|
706
|
+
"persistFailed": "Could not save your table selection — retry.",
|
|
707
|
+
"persistFailedTitle": "Save failed",
|
|
708
|
+
"bridgeAppliedTitle": "Connection string received",
|
|
709
|
+
"bridgeAppliedBody": "Handed over from adminium.dev by your browser — it went straight to this machine and was never uploaded. Check it below, then continue.",
|
|
710
|
+
"bridgeFailedTitle": "That hand-off could not be used",
|
|
711
|
+
"bridgeFailedBody": "It has already been used or has expired. Paste your connection string below instead.",
|
|
712
|
+
"step": {
|
|
713
|
+
"source": "Source",
|
|
714
|
+
"test": "Analyze",
|
|
715
|
+
"tables": "Tables",
|
|
716
|
+
"meta": "Meta storage",
|
|
717
|
+
"intent": "Intent",
|
|
718
|
+
"enrich": "Enrich",
|
|
719
|
+
"generate": "Generate"
|
|
720
|
+
}
|
|
721
|
+
},
|
|
722
|
+
"meta": {
|
|
723
|
+
"title": "Where should Adminium keep its own tables?",
|
|
724
|
+
"subtitle": "Pages, roles, audit log and settings live in adminium_-prefixed tables — never mixed into your data.",
|
|
725
|
+
"sameDb": {
|
|
726
|
+
"title": "Same database",
|
|
727
|
+
"description": "adminium_* tables are created beside your source tables. Simplest setup — needs a role with write and CREATE TABLE privileges.",
|
|
728
|
+
"disabledReadOnly": "Your role is read-only — Adminium never writes to this database. Choose a separate database for Adminium’s own tables.",
|
|
729
|
+
"disabledNoDdl": "This role cannot run DDL — Adminium migrations need CREATE TABLE. Choose a separate database for Adminium’s own tables.",
|
|
730
|
+
"disabledFile": "A schema file has no live database — choose a separate database for Adminium’s own tables."
|
|
731
|
+
},
|
|
732
|
+
"separate": {
|
|
733
|
+
"title": "Separate database",
|
|
734
|
+
"description": "Adminium keeps its tables in a different database. Your source stays untouched — required for read-only sources.",
|
|
735
|
+
"dsn": "Meta database connection string",
|
|
736
|
+
"helper": "Needs write + DDL privileges — Adminium runs its own migrations there.",
|
|
737
|
+
"test": "Test connection",
|
|
738
|
+
"ok": "Compatible — write ✓ · DDL ✓",
|
|
739
|
+
"insufficient": "This role cannot host the meta store — Adminium needs write and CREATE TABLE privileges there.",
|
|
740
|
+
"errorTitle": "Meta store not compatible"
|
|
741
|
+
},
|
|
742
|
+
"testFailed": "Connection failed.",
|
|
743
|
+
"v1Note": {
|
|
744
|
+
"title": "About this install",
|
|
745
|
+
"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)."
|
|
746
|
+
},
|
|
747
|
+
"move": {
|
|
748
|
+
"title": "Moving Adminium’s tables",
|
|
749
|
+
"copying": "Moving Adminium’s tables…",
|
|
750
|
+
"restarting": "Restarting…",
|
|
751
|
+
"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.",
|
|
752
|
+
"restartingBody": "The copy is done. Adminium is restarting onto the new database — this page will continue by itself in a few seconds.",
|
|
753
|
+
"failed": "Could not move Adminium’s tables — retry.",
|
|
754
|
+
"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."
|
|
755
|
+
},
|
|
756
|
+
"willMove": {
|
|
757
|
+
"title": "This will move Adminium’s tables",
|
|
758
|
+
"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."
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
"intent": {
|
|
762
|
+
"title": "What do you need?",
|
|
763
|
+
"subtitle": "The intent shapes which pages get generated. You can change it later — changing it proposes a regeneration, never a silent rewrite.",
|
|
764
|
+
"trust": "We read your schema only — never your row data during setup.",
|
|
765
|
+
"fullAdmin": {
|
|
766
|
+
"title": "Full admin panel",
|
|
767
|
+
"description": "Dashboards, CRUD pages, search, imports and exports — everything your schema supports."
|
|
768
|
+
},
|
|
769
|
+
"analytics": {
|
|
770
|
+
"title": "Read-only analytics",
|
|
771
|
+
"description": "Dashboards, charts and read-only grids. No forms, no writes — every role capped at Viewer."
|
|
772
|
+
},
|
|
773
|
+
"crud": {
|
|
774
|
+
"title": "CRUD tables",
|
|
775
|
+
"description": "One editing page per table plus search and import/export — a minimal home, no dashboards."
|
|
776
|
+
},
|
|
777
|
+
"support": {
|
|
778
|
+
"title": "Support console",
|
|
779
|
+
"description": "Queues, ticket and customer detail pages first. Deletes off by default. (Queue templates land in M7 — the v1 page set matches Full admin.)"
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
"generate": {
|
|
783
|
+
"title": "Generate your app",
|
|
784
|
+
"subtitle": "One page per included table plus dashboards per domain — intent:",
|
|
785
|
+
"run": "Generate dashboard",
|
|
786
|
+
"openApp": "Open your app",
|
|
787
|
+
"logLabel": "Generation log",
|
|
788
|
+
"log": {
|
|
789
|
+
"classifying": "Classifying schema…",
|
|
790
|
+
"composing": "Composing templates…",
|
|
791
|
+
"writing": "Writing pages…",
|
|
792
|
+
"done": "{pages} pages generated across {groups} nav groups"
|
|
793
|
+
},
|
|
794
|
+
"successTitle": "Your dashboard is ready",
|
|
795
|
+
"successBody": "{pages} pages across {groups} navigation groups — generated from your schema, editable in Studio.",
|
|
796
|
+
"errorTitle": "Generation failed",
|
|
797
|
+
"failed": "Generation failed — retry, or re-run introspection first.",
|
|
798
|
+
"fileTitle": "Schema file parsed — generation needs a live database",
|
|
799
|
+
"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."
|
|
800
|
+
},
|
|
801
|
+
"remap": {
|
|
802
|
+
"column": {
|
|
803
|
+
"nullable": "nullable",
|
|
804
|
+
"labelOverride": "Display label",
|
|
805
|
+
"labelHelper": "Inferred: {name}",
|
|
806
|
+
"logicalType": "Logical type",
|
|
807
|
+
"logicalTypeHelper": "Inferred: {type} (from {dbType}) — mapped by the adapter; not overridable in v1.",
|
|
808
|
+
"semantic": "Semantic type",
|
|
809
|
+
"unclassified": "Not classified yet.",
|
|
810
|
+
"semanticHelper": "Classifier: {tag} · {confidence}% confidence · source: {source}",
|
|
811
|
+
"semanticInferred": "inferred: {tag}",
|
|
812
|
+
"currency": "Currency",
|
|
813
|
+
"currencyHelper": "ISO 4217 code applied to money formatting.",
|
|
814
|
+
"pii": "Mask by default",
|
|
815
|
+
"piiHelper": "Masked values render redacted; unmasking requires the data.unmask_pii permission and is audit-logged.",
|
|
816
|
+
"enum": "Enum semantics",
|
|
817
|
+
"enumKind": "Enum kind",
|
|
818
|
+
"enumWorkflow": "Workflow",
|
|
819
|
+
"enumCategory": "Category",
|
|
820
|
+
"enumLabelFor": "Label for {value}",
|
|
821
|
+
"enumToneFor": "Tone for {value}",
|
|
822
|
+
"enumToneAuto": "auto",
|
|
823
|
+
"enumHelper": "Workflow enums drive status pills and board columns; tones map values onto the semantic tint scale."
|
|
824
|
+
},
|
|
825
|
+
"diff": {
|
|
826
|
+
"one": "1 change",
|
|
827
|
+
"count": "{count} changes",
|
|
828
|
+
"saved": "Overrides saved.",
|
|
829
|
+
"revertOne": "Revert {change}",
|
|
830
|
+
"regenerate": "Regenerate pages",
|
|
831
|
+
"revertAll": "Revert all",
|
|
832
|
+
"save": "Save overrides"
|
|
833
|
+
},
|
|
834
|
+
"table": {
|
|
835
|
+
"iconPicker": "Table icon",
|
|
836
|
+
"system": "System",
|
|
837
|
+
"labelOverride": "Display label",
|
|
838
|
+
"labelHelper": "Inferred: {name}",
|
|
839
|
+
"icon": "Icon",
|
|
840
|
+
"navGroup": "Nav group",
|
|
841
|
+
"navGroupHelper": "Nav placement is decided by the generator — a table.navGroup override is not in the v1 vocabulary.",
|
|
842
|
+
"include": "Include in generated app",
|
|
843
|
+
"includeHelper": "Excluded tables get no pages and disappear from nav.",
|
|
844
|
+
"shape": "Table shape (classified)",
|
|
845
|
+
"role": "Role",
|
|
846
|
+
"unclassified": "Not classified",
|
|
847
|
+
"kind": "Kind",
|
|
848
|
+
"hierarchy": "Hierarchy",
|
|
849
|
+
"selfFk": "Self-reference via {column}",
|
|
850
|
+
"polymorphic": "Polymorphic pairs",
|
|
851
|
+
"rows": "Row estimate",
|
|
852
|
+
"shapeHelper": "Classification is recomputed on every introspection; overrides layer on top and survive regeneration."
|
|
853
|
+
},
|
|
854
|
+
"relations": {
|
|
855
|
+
"declared": "Declared foreign keys",
|
|
856
|
+
"noneDeclared": "No declared foreign keys touch this table.",
|
|
857
|
+
"inferred": "Inferred relations",
|
|
858
|
+
"noneInferred": "Nothing inferred for this table.",
|
|
859
|
+
"confidence": "inferred · {pct}%",
|
|
860
|
+
"accepted": "Accepted",
|
|
861
|
+
"suppressed": "Suppressed",
|
|
862
|
+
"accept": "Accept",
|
|
863
|
+
"suppress": "Suppress",
|
|
864
|
+
"overrides": "Override relations (applied)",
|
|
865
|
+
"overrideBadge": "override",
|
|
866
|
+
"add": "Add virtual relation",
|
|
867
|
+
"fromColumn": "From column",
|
|
868
|
+
"noColumns": "No matching column",
|
|
869
|
+
"fromPlaceholder": "customer_id",
|
|
870
|
+
"toTable": "To table",
|
|
871
|
+
"noTables": "No matching table",
|
|
872
|
+
"toColumn": "To column",
|
|
873
|
+
"cardinality": "Cardinality",
|
|
874
|
+
"addButton": "Add relation"
|
|
875
|
+
},
|
|
876
|
+
"toast": {
|
|
877
|
+
"saved": "Schema overrides saved",
|
|
878
|
+
"savedDetail": "The applied schema below reflects your changes.",
|
|
879
|
+
"regenerated": "{created} created · {updated} updated · {unchanged} unchanged",
|
|
880
|
+
"regeneratedDetail": "Pages you edited by hand are preserved — only pages with an untouched generated_hash were regenerated in place.",
|
|
881
|
+
"regenerateFailed": "Regeneration failed"
|
|
882
|
+
},
|
|
883
|
+
"title": "Schema remap",
|
|
884
|
+
"subtitle": "{tables} tables · {applied} overrides applied",
|
|
885
|
+
"saveFailed": "Save failed: {message}",
|
|
886
|
+
"loadFailed": "Could not load the schema for this connection.",
|
|
887
|
+
"inspector": "Inspector",
|
|
888
|
+
"empty": {
|
|
889
|
+
"title": "Pick a table or column",
|
|
890
|
+
"description": "Select something in the schema tree to remap its label, type, relations or masking."
|
|
891
|
+
},
|
|
892
|
+
"tabs": {
|
|
893
|
+
"details": "Details",
|
|
894
|
+
"relations": "Relations"
|
|
895
|
+
},
|
|
896
|
+
"tree": {
|
|
897
|
+
"label": "Schema",
|
|
898
|
+
"search": "Search tables and columns",
|
|
899
|
+
"searchPlaceholder": "Search tables…",
|
|
900
|
+
"noMatches": "No tables match your search.",
|
|
901
|
+
"collapse": "Collapse table",
|
|
902
|
+
"expand": "Expand table",
|
|
903
|
+
"unsaved": "Unsaved change",
|
|
904
|
+
"excluded": "Excluded"
|
|
905
|
+
},
|
|
906
|
+
"badge": {
|
|
907
|
+
"pk": "PK",
|
|
908
|
+
"fk": "FK",
|
|
909
|
+
"unique": "UNIQUE",
|
|
910
|
+
"pii": "PII",
|
|
911
|
+
"masked": "Masked"
|
|
912
|
+
},
|
|
913
|
+
"unavailableTitle": "Schema remap editor not available",
|
|
914
|
+
"unavailableBody": "This build does not include the remap editor yet (09-T12). Re-run generation after it lands to remap labels, types and relations."
|
|
915
|
+
},
|
|
916
|
+
"publicApi": {
|
|
917
|
+
"error": "Something went wrong",
|
|
918
|
+
"scopes": {
|
|
919
|
+
"deleteTitle": "Delete this scope",
|
|
920
|
+
"deleteBody": "Any page using a key bound to this scope stops loading data. Keys are not deleted — revoke them first if that is what you meant.",
|
|
921
|
+
"deletePrompt": "Type the scope name to confirm",
|
|
922
|
+
"deleteConfirm": "Delete scope",
|
|
923
|
+
"issuesTitle": "This scope did not compile",
|
|
924
|
+
"title": "Scopes",
|
|
925
|
+
"subtitle": "A scope is the whole of what a key may reach — the tables, the exact columns, and a filter the caller can narrow but never remove.",
|
|
926
|
+
"emptyTitle": "No scopes yet",
|
|
927
|
+
"emptyBody": "Create one below. It is checked against your live schema before it is saved.",
|
|
928
|
+
"keyCount": "{count, plural, =0 {no keys} one {# key} other {# keys}}",
|
|
929
|
+
"delete": "Delete",
|
|
930
|
+
"nameLabel": "Name",
|
|
931
|
+
"connectionLabel": "Connection ID",
|
|
932
|
+
"documentLabel": "Scope document",
|
|
933
|
+
"documentHint": "Compiled against your schema when you save. Every column a caller can reach is listed here and nowhere else.",
|
|
934
|
+
"create": "Create scope",
|
|
935
|
+
"formLabel": "Create a scope"
|
|
936
|
+
},
|
|
937
|
+
"cancel": "Cancel",
|
|
938
|
+
"close": "Close",
|
|
939
|
+
"title": "Public API",
|
|
940
|
+
"subtitle": "Let your own customer- or staff-facing pages read this database, through a scope you define.",
|
|
941
|
+
"notRegistered": {
|
|
942
|
+
"title": "Not enabled on this server",
|
|
943
|
+
"body": "Set ADMINIUM_PUBLIC_API_ORIGINS to the exact origins allowed to call it, then restart. Until then these routes are not served at all."
|
|
944
|
+
},
|
|
945
|
+
"toggle": {
|
|
946
|
+
"label": "Serve the public API",
|
|
947
|
+
"hint": "Turning this off stops every public request immediately. Nothing is deleted — keys, scopes and data all survive."
|
|
948
|
+
},
|
|
949
|
+
"origins": {
|
|
950
|
+
"label": "Origins allowed to call it"
|
|
951
|
+
},
|
|
952
|
+
"keys": {
|
|
953
|
+
"title": "Keys",
|
|
954
|
+
"subtitle": "These go in your page’s JavaScript, so anyone can read them. That is expected — a key can only ever do what its scope allows.",
|
|
955
|
+
"emptyTitle": "No keys yet",
|
|
956
|
+
"emptyBody": "Create a scope first, then mint a key for it.",
|
|
957
|
+
"reveal": "Show key",
|
|
958
|
+
"rotate": "Rotate",
|
|
959
|
+
"revoke": "Revoke",
|
|
960
|
+
"nameLabel": "Name",
|
|
961
|
+
"scopeLabel": "Scope",
|
|
962
|
+
"scopePlaceholder": "Choose a scope",
|
|
963
|
+
"create": "Create key",
|
|
964
|
+
"formLabel": "Create a key",
|
|
965
|
+
"scopeIsAuthTitle": "The scope is the only permission",
|
|
966
|
+
"scopeIsAuthBody": "A key can reach exactly what its scope lists and nothing else. It does not use roles or table permissions, and it cannot read anything through the rest of the API.",
|
|
967
|
+
"appLabel": "Bind to a hosted app surface (optional)",
|
|
968
|
+
"appHint": "The app’s customer surface then serves this key itself — rotating it needs no rebuild.",
|
|
969
|
+
"appNone": "Not bound"
|
|
970
|
+
},
|
|
971
|
+
"status": {
|
|
972
|
+
"heading": "Status"
|
|
973
|
+
}
|
|
974
|
+
},
|
|
975
|
+
"hostedApps": {
|
|
976
|
+
"title": "Hosted apps",
|
|
977
|
+
"subtitle": "The app surfaces this instance serves — where each one appears, and the domains pointed at them.",
|
|
978
|
+
"error": "Something went wrong",
|
|
979
|
+
"emptyTitle": "No app surfaces are being served",
|
|
980
|
+
"emptyBody": "Point ADMINIUM_SURFACES_DIR at a directory of built surfaces — one folder per app and side, each with its index.html — and restart. They are then served under /apps/ and appear here.",
|
|
981
|
+
"surfaces": {
|
|
982
|
+
"title": "Surfaces",
|
|
983
|
+
"subtitle": "A staff surface can blend into this dashboard’s sidebar or stand on its own; a customer surface is public and reads through its bound key.",
|
|
984
|
+
"staff": "Staff",
|
|
985
|
+
"customer": "Customer",
|
|
986
|
+
"noNav": "Internal placement unavailable — rebuild this surface with the current toolkit so it emits surface.json.",
|
|
987
|
+
"noKey": "No key bound — this surface cannot read data until one is minted for it.",
|
|
988
|
+
"mintLink": "Mint one under Public API",
|
|
989
|
+
"boundKey": "Serves key",
|
|
990
|
+
"placementLabel": "Placement",
|
|
991
|
+
"placementInternal": "In the sidebar (blended)",
|
|
992
|
+
"placementExternal": "External (own URL only)",
|
|
993
|
+
"connectionLabel": "Reads",
|
|
994
|
+
"connectionUnset": "Whichever is serving"
|
|
995
|
+
},
|
|
996
|
+
"domains": {
|
|
997
|
+
"title": "Domains",
|
|
998
|
+
"subtitle": "Point a domain’s DNS at your proxy, pass the Host header through to Adminium, and attach it here — that host then serves the surface instead of this dashboard. Certificates stay on your proxy.",
|
|
999
|
+
"issuesTitle": "The domain map was refused",
|
|
1000
|
+
"savedTitle": "Saved",
|
|
1001
|
+
"savedBody": "Mappings take effect within a few seconds. A host only answers once its DNS and your proxy actually reach this instance.",
|
|
1002
|
+
"none": "No domains are attached.",
|
|
1003
|
+
"hostLabel": "Host",
|
|
1004
|
+
"surfaceLabel": "Surface",
|
|
1005
|
+
"remove": "Remove",
|
|
1006
|
+
"add": "Attach a domain",
|
|
1007
|
+
"save": "Save domains",
|
|
1008
|
+
"instanceLabel": "Instance",
|
|
1009
|
+
"instanceOwn": "The app's own"
|
|
1010
|
+
},
|
|
1011
|
+
"instances": {
|
|
1012
|
+
"title": "Instances",
|
|
1013
|
+
"body": "Serve the same app over more than one database. Each instance is reachable at /apps/<app>/<segment>/<side>/ and reads only the connection you give it.",
|
|
1014
|
+
"appLabel": "App",
|
|
1015
|
+
"slugLabel": "URL segment",
|
|
1016
|
+
"readsLabel": "Reads",
|
|
1017
|
+
"add": "Add an instance",
|
|
1018
|
+
"save": "Save instances",
|
|
1019
|
+
"remove": "Remove",
|
|
1020
|
+
"empty": "No extra instances.",
|
|
1021
|
+
"failed": "Instances were not saved"
|
|
1022
|
+
}
|
|
1023
|
+
},
|
|
1024
|
+
"addOns": {
|
|
1025
|
+
"plan": {
|
|
1026
|
+
"blocked": "This cannot be installed here",
|
|
1027
|
+
"needsColumns": "This add-on needs columns you do not have",
|
|
1028
|
+
"needsColumnsBody": "Adminium will not add columns to tables you already own. Add them yourself, then install.",
|
|
1029
|
+
"willCreate": "This will create tables in your database",
|
|
1030
|
+
"willCreateBody": "Installing creates these tables. Uninstalling later leaves them, and their data, alone.",
|
|
1031
|
+
"noData": "This add-on reads and writes no tables of its own.",
|
|
1032
|
+
"reuse": "This add-on will use tables you already have:"
|
|
1033
|
+
},
|
|
1034
|
+
"consent": {
|
|
1035
|
+
"title": "Install {name}",
|
|
1036
|
+
"subtitle": "What this add-on will do, before it can do it.",
|
|
1037
|
+
"close": "Close",
|
|
1038
|
+
"loading": "Working out what this would do…",
|
|
1039
|
+
"hosts": "Attach to",
|
|
1040
|
+
"cancel": "Cancel",
|
|
1041
|
+
"confirm": "Install"
|
|
1042
|
+
},
|
|
1043
|
+
"connect": {
|
|
1044
|
+
"apiKey": "API key",
|
|
1045
|
+
"submit": "Connect"
|
|
1046
|
+
},
|
|
1047
|
+
"title": "Add-ons",
|
|
1048
|
+
"subtitle": "Extra capabilities you can add to your apps — shipping, artwork, data. Each one says what it needs before you install it.",
|
|
1049
|
+
"error": "Something went wrong",
|
|
1050
|
+
"browse": {
|
|
1051
|
+
"title": "Available",
|
|
1052
|
+
"online": "Includes add-ons from the online catalogue. Checking for newer versions is a separate action.",
|
|
1053
|
+
"offline": "Showing the add-ons that came with this build. Browsing online is switched off, and nothing here has contacted the internet.",
|
|
1054
|
+
"refresh": "Check for newer",
|
|
1055
|
+
"emptyTitle": "No add-ons available",
|
|
1056
|
+
"emptyBody": "This build shipped none, and the online catalogue is off.",
|
|
1057
|
+
"bundled": "Included",
|
|
1058
|
+
"upgrade": "v{version} available",
|
|
1059
|
+
"download": "Download",
|
|
1060
|
+
"install": "Install",
|
|
1061
|
+
"discard": "Discard",
|
|
1062
|
+
"upgradeAction": "Upgrade",
|
|
1063
|
+
"toggle": "Browse the online catalogue"
|
|
1064
|
+
},
|
|
1065
|
+
"installed": {
|
|
1066
|
+
"title": "Installed",
|
|
1067
|
+
"emptyTitle": "Nothing installed yet",
|
|
1068
|
+
"emptyBody": "Install an add-on above and it will appear here with its hosts and connection.",
|
|
1069
|
+
"connected": "Connected",
|
|
1070
|
+
"notConnected": "Not connected",
|
|
1071
|
+
"egress": "May contact: {hosts}",
|
|
1072
|
+
"on": "on",
|
|
1073
|
+
"off": "off",
|
|
1074
|
+
"disconnect": "Disconnect",
|
|
1075
|
+
"uninstall": "Uninstall"
|
|
1076
|
+
},
|
|
1077
|
+
"confirm": {
|
|
1078
|
+
"close": "Close",
|
|
1079
|
+
"disconnectTitle": "Disconnect this add-on",
|
|
1080
|
+
"uninstallTitle": "Uninstall this add-on",
|
|
1081
|
+
"discardTitle": "Discard this download",
|
|
1082
|
+
"disconnectBody": "Its keys are deleted and it stops making calls. Every table and every row it created stays exactly as it is, and you can reconnect at any time.",
|
|
1083
|
+
"uninstallBody": "Its keys are deleted and its files are removed from this server. Every table and every row it created stays exactly as it is. You can install it again later.",
|
|
1084
|
+
"discardBody": "The downloaded files are deleted. Nothing was installed, so nothing else changes — you can download it again whenever you like.",
|
|
1085
|
+
"cancel": "Cancel",
|
|
1086
|
+
"disconnect": "Disconnect",
|
|
1087
|
+
"uninstall": "Uninstall",
|
|
1088
|
+
"discard": "Discard"
|
|
1089
|
+
},
|
|
1090
|
+
"upgradeNote": "Upgrading keeps the hosts an add-on is attached to and the connection it already has.",
|
|
1091
|
+
"job": {
|
|
1092
|
+
"title": "Downloading",
|
|
1093
|
+
"body": "Fetching and verifying. Nothing is installed until you say so.",
|
|
1094
|
+
"failed": "The download did not finish. Nothing was installed."
|
|
1095
|
+
},
|
|
1096
|
+
"veto": {
|
|
1097
|
+
"title": "This deployment cannot browse online",
|
|
1098
|
+
"body": "The setting is saved, but network features are off for this server and that wins. Downloaded add-ons still work, and you can still upload one yourself."
|
|
1099
|
+
},
|
|
1100
|
+
"sideload": {
|
|
1101
|
+
"title": "Upload a package",
|
|
1102
|
+
"hint": "For a server with no internet. It is checked exactly as a download would be, so it needs the hash that came with it.",
|
|
1103
|
+
"file": "Package file (.tgz)",
|
|
1104
|
+
"key": "Add-on key",
|
|
1105
|
+
"version": "Version",
|
|
1106
|
+
"sha": "Integrity (sha512-…)",
|
|
1107
|
+
"shaHint": "The `integrity` value `npm pack --json` printed. The upload is refused if the bytes do not match.",
|
|
1108
|
+
"submit": "Upload"
|
|
1109
|
+
}
|
|
1110
|
+
},
|
|
1111
|
+
"pages": {
|
|
1112
|
+
"title": "Pages",
|
|
1113
|
+
"subtitle": "Add, edit and organise the pages of your app, and the order they appear in the sidebar.",
|
|
1114
|
+
"createButton": "New page",
|
|
1115
|
+
"loadFailed": {
|
|
1116
|
+
"title": "Pages could not be loaded",
|
|
1117
|
+
"body": "Managing pages needs the “Manage pages” permission. Ask an administrator to grant it to one of your roles."
|
|
1118
|
+
},
|
|
1119
|
+
"tab": {
|
|
1120
|
+
"pages": "All pages",
|
|
1121
|
+
"sidebar": "Sidebar order"
|
|
1122
|
+
},
|
|
1123
|
+
"list": {
|
|
1124
|
+
"title": "Pages",
|
|
1125
|
+
"count": "{count, plural, one {# page} other {# pages}}"
|
|
1126
|
+
},
|
|
1127
|
+
"empty": {
|
|
1128
|
+
"title": "No pages yet",
|
|
1129
|
+
"body": "Connect a database to generate pages automatically, or create one by hand."
|
|
1130
|
+
},
|
|
1131
|
+
"status": {
|
|
1132
|
+
"live": "Live",
|
|
1133
|
+
"hidden": "Hidden"
|
|
1134
|
+
},
|
|
1135
|
+
"origin": {
|
|
1136
|
+
"generated": "Generated",
|
|
1137
|
+
"manifest": "Add-on",
|
|
1138
|
+
"llm": "Assistant",
|
|
1139
|
+
"system": "System",
|
|
1140
|
+
"user": "Custom"
|
|
1141
|
+
},
|
|
1142
|
+
"row": {
|
|
1143
|
+
"menu": "Actions for {title}"
|
|
1144
|
+
},
|
|
1145
|
+
"action": {
|
|
1146
|
+
"edit": "Edit page",
|
|
1147
|
+
"duplicate": "Duplicate",
|
|
1148
|
+
"hide": "Hide from sidebar",
|
|
1149
|
+
"show": "Show in sidebar",
|
|
1150
|
+
"delete": "Delete page"
|
|
1151
|
+
},
|
|
1152
|
+
"create": {
|
|
1153
|
+
"title": "New page",
|
|
1154
|
+
"failed": "The page could not be created",
|
|
1155
|
+
"submit": "Create page",
|
|
1156
|
+
"subtitle": "Pick what this page shows and how it looks."
|
|
1157
|
+
},
|
|
1158
|
+
"duplicate": {
|
|
1159
|
+
"title": "Duplicate page",
|
|
1160
|
+
"failed": "The page could not be duplicated",
|
|
1161
|
+
"submit": "Duplicate"
|
|
1162
|
+
},
|
|
1163
|
+
"delete": {
|
|
1164
|
+
"title": "Delete this page?",
|
|
1165
|
+
"body": "This cannot be undone. Saved views and personal layouts on this page are deleted for everyone.",
|
|
1166
|
+
"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.",
|
|
1167
|
+
"prompt": "Type {slug} to confirm",
|
|
1168
|
+
"confirm": "Delete page"
|
|
1169
|
+
},
|
|
1170
|
+
"field": {
|
|
1171
|
+
"title": "Title",
|
|
1172
|
+
"titleHint": "Shown in the sidebar and the page header.",
|
|
1173
|
+
"slug": "Page address",
|
|
1174
|
+
"slugHint": "Lowercase letters, numbers and dashes. Just the last part — the rest of the address is added for you.",
|
|
1175
|
+
"slugTaken": "Another page already uses this address.",
|
|
1176
|
+
"slugWarning": "Changing the address breaks existing links and bookmarks to this page.",
|
|
1177
|
+
"template": "Template",
|
|
1178
|
+
"templateHint": "Decides what the page can hold. You can change it later.",
|
|
1179
|
+
"group": "Sidebar group",
|
|
1180
|
+
"groupHint": "Which section of the sidebar it appears in.",
|
|
1181
|
+
"icon": "Icon",
|
|
1182
|
+
"iconHint": "Shown beside the page name in the sidebar.",
|
|
1183
|
+
"visible": "Show in sidebar",
|
|
1184
|
+
"visibleHint": "A hidden page stays reachable at its URL for anyone who has the link.",
|
|
1185
|
+
"table": "Table",
|
|
1186
|
+
"tableCreateHint": "The table this page reads. You can bind it later.",
|
|
1187
|
+
"tableNone": "Not bound",
|
|
1188
|
+
"tableNeedsConnection": "Pick a data source first.",
|
|
1189
|
+
"connection": "Data source",
|
|
1190
|
+
"connectionNone": "None",
|
|
1191
|
+
"iconPick": "Choose the page icon",
|
|
1192
|
+
"padding": "Page padding",
|
|
1193
|
+
"width": "Content width",
|
|
1194
|
+
"widthHint": "How wide the page’s content column may grow on a large screen."
|
|
1195
|
+
},
|
|
1196
|
+
"editor": {
|
|
1197
|
+
"title": "Edit page",
|
|
1198
|
+
"save": "Save changes",
|
|
1199
|
+
"saveFailed": "Changes could not be saved",
|
|
1200
|
+
"openPage": "Open page",
|
|
1201
|
+
"generated": {
|
|
1202
|
+
"title": "This page was generated from your schema",
|
|
1203
|
+
"body": "Your changes survive regeneration. Deleting only lasts until the next run recreates it."
|
|
1204
|
+
},
|
|
1205
|
+
"contentUnavailable": "Page contents could not be loaded",
|
|
1206
|
+
"contentUnavailableBody": "The details above can still be saved.",
|
|
1207
|
+
"contentInvalid": "This page’s configuration is not readable",
|
|
1208
|
+
"contentInvalidBody": "It was written by a newer version, or it is malformed. Regenerate the page or delete it.",
|
|
1209
|
+
"data": "Data",
|
|
1210
|
+
"schemaFailed": "Tables could not be listed",
|
|
1211
|
+
"schemaFailedBody": "This connection may not have been analysed yet. Run introspection from Studio → Data connections.",
|
|
1212
|
+
"notBindable": "This template is not bound to one table",
|
|
1213
|
+
"notBindableBody": "Its contents are built widget by widget instead. Open the page and use Edit to add them.",
|
|
1214
|
+
"recompose": "This page will be rebuilt",
|
|
1215
|
+
"recomposeBody": "Saving rebuilds the contents. Column and widget edits here are lost.",
|
|
1216
|
+
"missing": "That page no longer exists",
|
|
1217
|
+
"missingBody": "It may have been deleted, or removed by a regeneration run.",
|
|
1218
|
+
"details": "Details",
|
|
1219
|
+
"itemsPending": "Save the change above first — the contents are rebuilt from it.",
|
|
1220
|
+
"columns": "Columns",
|
|
1221
|
+
"appearance": "Appearance"
|
|
1222
|
+
},
|
|
1223
|
+
"sidebar": {
|
|
1224
|
+
"help": "Reorder pages within a group, or move one to another group. Changes apply to every user.",
|
|
1225
|
+
"discard": "Discard",
|
|
1226
|
+
"save": "Save order",
|
|
1227
|
+
"saveFailed": "The new order could not be saved",
|
|
1228
|
+
"emptyGroup": "No pages in this group.",
|
|
1229
|
+
"moveUp": "Move {title} up",
|
|
1230
|
+
"moveDown": "Move {title} down",
|
|
1231
|
+
"moveTo": "Move {title} to a group",
|
|
1232
|
+
"ungrouped": {
|
|
1233
|
+
"title": "Some pages are in no sidebar group",
|
|
1234
|
+
"body": "These pages work at their URL but appear nowhere in the sidebar. Open each one and pick a group."
|
|
1235
|
+
}
|
|
1236
|
+
},
|
|
1237
|
+
"columns": {
|
|
1238
|
+
"help": "Drag to reorder columns, rename their headers, and choose which are shown in the table.",
|
|
1239
|
+
"empty": "No columns yet — add them below.",
|
|
1240
|
+
"pk": "Key",
|
|
1241
|
+
"pii": "PII",
|
|
1242
|
+
"header": "Header for {name}",
|
|
1243
|
+
"shown": "Shown",
|
|
1244
|
+
"toggle": "Show {name} in the table",
|
|
1245
|
+
"dragHandle": "Reorder {name}",
|
|
1246
|
+
"remove": "Remove {name}",
|
|
1247
|
+
"addOpen": "Add column",
|
|
1248
|
+
"addTitle": "Add a column",
|
|
1249
|
+
"addSearch": "Search columns…",
|
|
1250
|
+
"addFromTable": "From {table}",
|
|
1251
|
+
"addFromLinked": "From linked tables",
|
|
1252
|
+
"addLinkedHelp": "Show a value from the table a link column points to.",
|
|
1253
|
+
"addVia": "via {column}",
|
|
1254
|
+
"addNoMatches": "No columns match “{query}”.",
|
|
1255
|
+
"followColumn": "Follow {name}",
|
|
1256
|
+
"addLinkedFrom": "Tables that link here",
|
|
1257
|
+
"addLinkedFromHelp": "Add a count of the rows that point at each record.",
|
|
1258
|
+
"countBadge": "Count",
|
|
1259
|
+
"lookupBadge": "Linked",
|
|
1260
|
+
"lookupBack": "Back",
|
|
1261
|
+
"lookupBrowse": "Pick what to show from {table}",
|
|
1262
|
+
"lookupBroken": "That link no longer resolves",
|
|
1263
|
+
"lookupBrokenBody": "The schema changed while you were browsing. Start the link again.",
|
|
1264
|
+
"schemaUnavailable": "Database columns could not be listed, so columns cannot be added back here.",
|
|
1265
|
+
"none": {
|
|
1266
|
+
"title": "This page has no columns yet",
|
|
1267
|
+
"body": "Columns are read from the table when the page is generated. Bind this page to a table and regenerate to fill them in."
|
|
1268
|
+
}
|
|
1269
|
+
},
|
|
1270
|
+
"icon": {
|
|
1271
|
+
"none": "Choose an icon",
|
|
1272
|
+
"search": "Search icons",
|
|
1273
|
+
"noMatches": "No icons match that search."
|
|
1274
|
+
},
|
|
1275
|
+
"preview": {
|
|
1276
|
+
"untitled": "Untitled page",
|
|
1277
|
+
"note": "An illustration of the layout, not your data."
|
|
1278
|
+
},
|
|
1279
|
+
"padding": {
|
|
1280
|
+
"default": "Default for this template",
|
|
1281
|
+
"none": "None",
|
|
1282
|
+
"standard": "Standard (28 × 24)",
|
|
1283
|
+
"custom": "Custom…",
|
|
1284
|
+
"x": "Sides (px)",
|
|
1285
|
+
"y": "Top and bottom (px)"
|
|
1286
|
+
},
|
|
1287
|
+
"width": {
|
|
1288
|
+
"default": "Default for this template",
|
|
1289
|
+
"narrow": "Narrow (720px)",
|
|
1290
|
+
"content": "Content (900px)",
|
|
1291
|
+
"page": "Page (1080px)",
|
|
1292
|
+
"dash": "Dashboard (1320px)",
|
|
1293
|
+
"wide": "Wide (1800px)",
|
|
1294
|
+
"full": "Full width (no limit)"
|
|
1295
|
+
}
|
|
16
1296
|
}
|
|
17
1297
|
};
|
|
18
1298
|
//# sourceMappingURL=studio.js.map
|