@object-ui/i18n 16.0.0 → 16.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +137 -0
- package/dist/locales/ar.d.ts +2 -0
- package/dist/locales/ar.js +4 -2
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/de.js +4 -2
- package/dist/locales/en.d.ts +24 -11
- package/dist/locales/en.js +24 -11
- package/dist/locales/es.d.ts +2 -0
- package/dist/locales/es.js +4 -2
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/fr.js +4 -2
- package/dist/locales/index.d.ts +66 -24
- package/dist/locales/ja.d.ts +2 -0
- package/dist/locales/ja.js +4 -2
- package/dist/locales/ko.d.ts +2 -0
- package/dist/locales/ko.js +4 -2
- package/dist/locales/pt.d.ts +2 -0
- package/dist/locales/pt.js +4 -2
- package/dist/locales/ru.d.ts +2 -0
- package/dist/locales/ru.js +4 -2
- package/dist/locales/zh.d.ts +26 -13
- package/dist/locales/zh.js +26 -13
- package/dist/useObjectLabel.d.ts +224 -8
- package/dist/useObjectLabel.js +67 -11
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,142 @@
|
|
|
1
1
|
# @object-ui/i18n
|
|
2
2
|
|
|
3
|
+
## 16.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- af1b0db: feat(i18n): localize action result dialogs via the `_actions.<action>.resultDialog` convention
|
|
8
|
+
|
|
9
|
+
The post-success secret-reveal dialog (create-user temporary password, 2FA
|
|
10
|
+
backup codes, OAuth client secrets) always rendered the hardcoded English
|
|
11
|
+
metadata literals — the spec bundles now carry `resultDialog` translations
|
|
12
|
+
(objectstack `_actions.<action>.resultDialog.*`), but nothing resolved them
|
|
13
|
+
client-side.
|
|
14
|
+
|
|
15
|
+
- **@object-ui/i18n.** `useObjectLabel()` gains `actionResultDialog(objectName,
|
|
16
|
+
actionName, spec)`: overlays translated `title` / `description` /
|
|
17
|
+
`acknowledge` and per-field labels onto the metadata spec, falling back to
|
|
18
|
+
the literals. The `fields` node is keyed by the LITERAL result-field path
|
|
19
|
+
(may contain dots, e.g. `"user.email"`), so it is fetched whole with
|
|
20
|
+
`returnObjects` and indexed directly — never resolved through a dotted
|
|
21
|
+
i18next key. Built-in locale packs also translate the dialog's fallback
|
|
22
|
+
`defaultTitle` / `acknowledge` (previously English in all ten locales) and
|
|
23
|
+
add the new `actions.resultDialog.copyAll` key.
|
|
24
|
+
- **@object-ui/app-shell.** The result-dialog handlers in
|
|
25
|
+
`useConsoleActionRuntime` and `RecordDetailView` accept the action context
|
|
26
|
+
(already passed by `ActionRunner`) and localize the spec before opening the
|
|
27
|
+
dialog; `ActionResultDialog`'s hardcoded "Copy all" button now goes through
|
|
28
|
+
`actions.resultDialog.copyAll`.
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- 0318118: fix(app-shell): block ActionParamDialog submit while a file/image param is uploading; map spec `autonumber` (ADR-0059 follow-ups)
|
|
33
|
+
|
|
34
|
+
Two follow-ups to the shared-field-widget param rendering (ADR-0059):
|
|
35
|
+
|
|
36
|
+
- **Upload-in-progress guard.** A `file`/`image` param's value only becomes its
|
|
37
|
+
fileId once the presigned upload settles, so confirming mid-upload sent an
|
|
38
|
+
empty/stale value. `FileField`/`ImageField` now surface their upload state via
|
|
39
|
+
an optional `onUploadingChange` prop (shared `useUploadingSignal` hook,
|
|
40
|
+
ignored by other widgets); `ActionParamDialog` wires it for `file`/`image`
|
|
41
|
+
params and disables Confirm (label → "Uploading…", new `actionDialog.uploading`
|
|
42
|
+
i18n key across all locales) plus blocks submit while any upload is in flight.
|
|
43
|
+
- **`autonumber` spelling.** `mapFieldTypeToFormType` now maps the spec
|
|
44
|
+
`FieldType` spelling `autonumber` (in addition to the widget-map key
|
|
45
|
+
`auto_number`) to the AutoNumber widget, so a spec-typed `autonumber`
|
|
46
|
+
field/param no longer falls through to the plain text input — fixes the object
|
|
47
|
+
form path as well as action params.
|
|
48
|
+
|
|
49
|
+
- 1100a8b: feat(plugin-gantt)!: remove the 移动端二维码 (mobile QR share) context-menu item
|
|
50
|
+
|
|
51
|
+
The QR-share feature is removed outright: the context-menu item, the QR dialog,
|
|
52
|
+
the `taskUrl` prop on `GanttView`, the URL wiring in `ObjectGantt`, the
|
|
53
|
+
`gantt.menu.qrcode` / `gantt.qr.*` i18n keys (en/zh) and the `qrcode`
|
|
54
|
+
dependency are all deleted. It baked one consumer's app-specific requirement
|
|
55
|
+
(scan-to-open on mobile) into the generic gantt renderer, and what it encoded —
|
|
56
|
+
the desktop console record URL — was not even the right target for that
|
|
57
|
+
requirement. Apps that need scan-to-mobile flows should implement them
|
|
58
|
+
app-side against their own mobile surface.
|
|
59
|
+
|
|
60
|
+
- 7abe4cd: **Console user-import wizard defaults to the `auto` password policy (tracks framework#3236).** The "Sign-in setup for imported users" selector gains an **Automatic (recommended)** option and it is now the default (was "No password"). `auto` decides per row on the server: reachable users get an invitation (email / SMS), anyone who can't be reached gets a one-time password shown once on the result screen — so it works with or without an email/SMS service, and the one-time-password reveal now surfaces only the rows that actually fell back (instead of the whole batch under `temporary`).
|
|
61
|
+
|
|
62
|
+
The other three policies are unchanged and still selectable: `invite` (force invitations, unreachable rows fail), `temporary` (force one-time passwords for every row), `none` (identity only). New `console.identityImport.policy.auto` / `policyHint.auto` strings added for `en` and `zh`; the `none` label drops its "(recommended)" marker.
|
|
63
|
+
|
|
64
|
+
- ebe6494: chore(lint): clear the baseline lint errors in nine more packages (objectui#2713 Wave 2)
|
|
65
|
+
|
|
66
|
+
Second wave of the #2713 lint-gate restoration (after #2730). These nine package
|
|
67
|
+
lints were red at baseline on `main`, so their per-package `lint` gate could not
|
|
68
|
+
catch new violations. Cleared every **error** (no behavior change; warnings out
|
|
69
|
+
of scope):
|
|
70
|
+
|
|
71
|
+
- **`react-hooks/rules-of-hooks`** (`i18n`, `plugin-grid`, `plugin-view`,
|
|
72
|
+
`plugin-list`) — translation helpers (`useSafeFieldLabel`,
|
|
73
|
+
`useRowActionTranslation`, `useViewLabel`, `useViewTabLabel`, `useMoreLabel`)
|
|
74
|
+
wrapped a provider-safe hook (`useObjectTranslation`/`useObjectLabel`, which
|
|
75
|
+
never throw) in try/catch; removed the wrapper (the same fix #2709 applied in
|
|
76
|
+
fields). `plugin-kanban` `ObjectKanban` moved its `if (error)` early return
|
|
77
|
+
below the `useCallback` so hooks run unconditionally. `collaboration`
|
|
78
|
+
`__unsafe_usePresenceContext` keeps its deliberate danger-prefix name via a
|
|
79
|
+
justified scoped disable.
|
|
80
|
+
- **`react-hooks/static-components`** (`layout`, `plugin-list`, `plugin-report`)
|
|
81
|
+
— dynamic-icon / registry lookups (`resolveIcon`, `useRegistryComponent`) are
|
|
82
|
+
stable component references, not components created during render → scoped
|
|
83
|
+
disable with justification. `plugin-charts` `TreemapCell` was a _genuine_
|
|
84
|
+
inline component and is hoisted to module scope (it is purely props-driven).
|
|
85
|
+
- **`no-irregular-whitespace`** (`plugin-grid` `ImportWizard`) — the literal
|
|
86
|
+
U+FEFF BOM prepended to exported CSV/text blobs (so Excel detects UTF-8) is
|
|
87
|
+
now written as the `` escape: byte-identical at runtime, no literal
|
|
88
|
+
irregular-whitespace character in source.
|
|
89
|
+
- **`no-useless-assignment`** (`plugin-grid` `BulkActionDialog`) — dropped a
|
|
90
|
+
dead `= null` initializer that the exhaustive `switch` (incl. `default`)
|
|
91
|
+
overwrites before it is read.
|
|
92
|
+
- **`no-unsafe-function-type`** (`plugin-view` `ViewTabBar`) — the dnd-kit
|
|
93
|
+
render-prop `listeners` map is typed `Record<string, (...args: any[]) => void>`
|
|
94
|
+
instead of bare `Function`.
|
|
95
|
+
- **`no-require-imports`** (`plugin-kanban`, `plugin-view` tests) — hoisted
|
|
96
|
+
`vi.mock` factories use an `async` factory with `await import('react')`.
|
|
97
|
+
|
|
98
|
+
- f80aaf2: **Distinguish writable `system` objects from engine-owned ones in the Console (framework ADR-0103 / #3220).** The framework split the overloaded `managedBy: 'system'` bucket: engine-owned rows stay read-only, but several `system` objects are admin/user-writable _data_ (Notification Preferences/Subscriptions/Templates, delegated RBAC assignments, user preferences) and declare `userActions` opening their writes.
|
|
99
|
+
|
|
100
|
+
The Console already surfaced the New/Edit/Delete buttons correctly for these (all affordance mirrors honour `userActions`), but the badge and empty-state _copy_ still called every `system` object a "read-only monitoring surface". Now:
|
|
101
|
+
|
|
102
|
+
- **`ManagedByBadge`** takes the object's `userActions` and, when a `system` object opens any write, renders the "Platform schema — admin-writable" variant instead of the engine-owned copy.
|
|
103
|
+
- **`resolveManagedByEmptyState`** returns `undefined` for a `system` object whose `userActions.create` is set, so the generic empty state (with the New button) shows instead of "entries appear automatically".
|
|
104
|
+
- New `managedByBadge.systemWritable.*` strings (en + zh; other locales fall back to the English default).
|
|
105
|
+
|
|
106
|
+
Copy/UX only — no behavioural change to what a user can do.
|
|
107
|
+
|
|
108
|
+
- 29c6040: fix(app-shell): redo the record-list "Add View" create flow — empty-name 405, invisible drafts, canonical naming
|
|
109
|
+
|
|
110
|
+
Rebuilds the record-list "Add View" / "Save as view" create path so a
|
|
111
|
+
runtime-created view has one canonical identity and is actually verifiable
|
|
112
|
+
before publish (supersedes #2754; fixes #2767).
|
|
113
|
+
|
|
114
|
+
- **Unified identity (P1).** New `viewEnvelope(objectName, spec, { name, label })`
|
|
115
|
+
seam in `runtime-metadata-persistence.ts` emits the canonical ViewItem
|
|
116
|
+
(`{ name: '<object>.<key>', object, viewKind: 'list', label, config }` with
|
|
117
|
+
`config.data = { provider: 'object', object }`), mirroring the Studio
|
|
118
|
+
`anchors.ts:createBuildBody`. The **qualified** name is passed as BOTH the
|
|
119
|
+
`PUT /meta/view/:name` URL segment and `body.name`, so the `sys_metadata`
|
|
120
|
+
row key, the ViewTabBar tab id, and the body identity all agree and the
|
|
121
|
+
draft → read → publish loop resolves. `ObjectView` and `ObjectDataPage` both
|
|
122
|
+
call the single helper — the duplicated envelope block is gone (P6).
|
|
123
|
+
- **Empty-name guards (405).** `MetadataClient.save()` and
|
|
124
|
+
`createRuntimeMetadata()` throw a clear contextual error instead of emitting
|
|
125
|
+
`PUT /meta/view/` (empty `:name`, server 405).
|
|
126
|
+
- **Draft visibility (P2/P3/P4).** `DataSource.listViews(objectName, { previewDrafts })`:
|
|
127
|
+
in draft-preview mode the `ObjectStackAdapter` makes a **single**
|
|
128
|
+
`MetadataClient.withPreviewDrafts(true).list('view')` request and uses the
|
|
129
|
+
server's already-overlaid list (draft wins by name, `_draft` tagged) —
|
|
130
|
+
replacing, not appending, so a draft that edits a published view can't
|
|
131
|
+
double-tab. No hand-rolled `fetch` of metadata routes at the adapter layer.
|
|
132
|
+
After a create in normal mode the console navigates to the new view with
|
|
133
|
+
`?preview=draft`, so the DraftPreviewBar is visible and Publish is one click.
|
|
134
|
+
- **CJK-aware naming (P5).** `CreateViewDialog` gains an editable machine-name
|
|
135
|
+
field, prefilled via `slugify(label)` for Latin labels and required (submit
|
|
136
|
+
disabled) when slugify yields empty for non-Latin labels — no more silent
|
|
137
|
+
random `task_grid_mrsyt56j` names. New `console.objectView.viewName*` keys
|
|
138
|
+
(en/zh).
|
|
139
|
+
|
|
3
140
|
## 16.0.0
|
|
4
141
|
|
|
5
142
|
### Patch Changes
|
package/dist/locales/ar.d.ts
CHANGED
|
@@ -76,6 +76,7 @@ declare const ar: {
|
|
|
76
76
|
resultDialog: {
|
|
77
77
|
defaultTitle: string;
|
|
78
78
|
acknowledge: string;
|
|
79
|
+
copyAll: string;
|
|
79
80
|
};
|
|
80
81
|
};
|
|
81
82
|
validation: {
|
|
@@ -1490,6 +1491,7 @@ declare const ar: {
|
|
|
1490
1491
|
requiredError: string;
|
|
1491
1492
|
cancel: string;
|
|
1492
1493
|
confirm: string;
|
|
1494
|
+
uploading: string;
|
|
1493
1495
|
defaultActionTitle: string;
|
|
1494
1496
|
ok: string;
|
|
1495
1497
|
lookupPlaceholder: string;
|
package/dist/locales/ar.js
CHANGED
|
@@ -75,8 +75,9 @@ const ar = {
|
|
|
75
75
|
},
|
|
76
76
|
actions: {
|
|
77
77
|
resultDialog: {
|
|
78
|
-
defaultTitle: '
|
|
79
|
-
acknowledge: '
|
|
78
|
+
defaultTitle: 'احفظ هذه القيمة الآن',
|
|
79
|
+
acknowledge: 'لقد حفظتها',
|
|
80
|
+
copyAll: 'نسخ الكل',
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
validation: {
|
|
@@ -1491,6 +1492,7 @@ const ar = {
|
|
|
1491
1492
|
requiredError: "{{label}} مطلوب",
|
|
1492
1493
|
cancel: "إلغاء",
|
|
1493
1494
|
confirm: "تأكيد",
|
|
1495
|
+
uploading: "جارٍ الرفع…",
|
|
1494
1496
|
defaultActionTitle: "إجراء",
|
|
1495
1497
|
ok: "موافق",
|
|
1496
1498
|
lookupPlaceholder: "لصق معرف السجل (UUID) لـ {{label}}",
|
package/dist/locales/de.d.ts
CHANGED
|
@@ -76,6 +76,7 @@ declare const de: {
|
|
|
76
76
|
resultDialog: {
|
|
77
77
|
defaultTitle: string;
|
|
78
78
|
acknowledge: string;
|
|
79
|
+
copyAll: string;
|
|
79
80
|
};
|
|
80
81
|
};
|
|
81
82
|
validation: {
|
|
@@ -1492,6 +1493,7 @@ declare const de: {
|
|
|
1492
1493
|
requiredError: string;
|
|
1493
1494
|
cancel: string;
|
|
1494
1495
|
confirm: string;
|
|
1496
|
+
uploading: string;
|
|
1495
1497
|
defaultActionTitle: string;
|
|
1496
1498
|
ok: string;
|
|
1497
1499
|
lookupPlaceholder: string;
|
package/dist/locales/de.js
CHANGED
|
@@ -75,8 +75,9 @@ const de = {
|
|
|
75
75
|
},
|
|
76
76
|
actions: {
|
|
77
77
|
resultDialog: {
|
|
78
|
-
defaultTitle: '
|
|
79
|
-
acknowledge: '
|
|
78
|
+
defaultTitle: 'Diesen Wert jetzt speichern',
|
|
79
|
+
acknowledge: 'Ich habe ihn gespeichert',
|
|
80
|
+
copyAll: 'Alle kopieren',
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
validation: {
|
|
@@ -1493,6 +1494,7 @@ const de = {
|
|
|
1493
1494
|
requiredError: "{{label}} ist erforderlich",
|
|
1494
1495
|
cancel: "Abbrechen",
|
|
1495
1496
|
confirm: "Bestätigen",
|
|
1497
|
+
uploading: "Wird hochgeladen…",
|
|
1496
1498
|
defaultActionTitle: "Aktion",
|
|
1497
1499
|
ok: "OK",
|
|
1498
1500
|
lookupPlaceholder: "Datensatz-ID (UUID) für {{label}} einfügen",
|
package/dist/locales/en.d.ts
CHANGED
|
@@ -88,6 +88,7 @@ declare const en: {
|
|
|
88
88
|
readonly resultDialog: {
|
|
89
89
|
readonly defaultTitle: "Save this value now";
|
|
90
90
|
readonly acknowledge: "I have saved this";
|
|
91
|
+
readonly copyAll: "Copy all";
|
|
91
92
|
};
|
|
92
93
|
};
|
|
93
94
|
readonly validation: {
|
|
@@ -382,6 +383,11 @@ declare const en: {
|
|
|
382
383
|
readonly title: "Managed by the platform";
|
|
383
384
|
readonly body: "Rows here are created automatically when actions run on the source record. The list below is a read-only monitoring surface — row-level actions (Approve, Recall, Resend, …) live on each row.";
|
|
384
385
|
};
|
|
386
|
+
readonly systemWritable: {
|
|
387
|
+
readonly short: "Platform schema";
|
|
388
|
+
readonly title: "Platform-defined, admin-writable";
|
|
389
|
+
readonly body: "This object's schema is defined by the platform, but its rows are yours to create and edit here. Who may write is governed by delegated administration and record-level security, not by this badge.";
|
|
390
|
+
};
|
|
385
391
|
readonly appendOnly: {
|
|
386
392
|
readonly short: "Read-only · Audit log";
|
|
387
393
|
readonly title: "Read-only historical record";
|
|
@@ -469,14 +475,6 @@ declare const en: {
|
|
|
469
475
|
readonly removeDependency: "Remove dependency";
|
|
470
476
|
readonly noCandidates: "No available tasks";
|
|
471
477
|
readonly searchTasks: "Search tasks…";
|
|
472
|
-
readonly qrcode: "Mobile QR code";
|
|
473
|
-
};
|
|
474
|
-
readonly qr: {
|
|
475
|
-
readonly title: "Open on mobile";
|
|
476
|
-
readonly hint: "Scan with a phone to open the details";
|
|
477
|
-
readonly copy: "Copy link";
|
|
478
|
-
readonly copied: "Copied";
|
|
479
|
-
readonly close: "Close";
|
|
480
478
|
};
|
|
481
479
|
readonly delete: {
|
|
482
480
|
readonly title: "Delete this task?";
|
|
@@ -500,6 +498,14 @@ declare const en: {
|
|
|
500
498
|
readonly confirm: "Auto-reschedule";
|
|
501
499
|
readonly cancel: "Keep as is";
|
|
502
500
|
};
|
|
501
|
+
readonly autoScheduleDlg: {
|
|
502
|
+
readonly title: "Auto-schedule";
|
|
503
|
+
readonly body: "Shift {count} task(s) later to satisfy dependency links?";
|
|
504
|
+
readonly skipped: "{count} locked task(s) also violate links and were skipped.";
|
|
505
|
+
readonly confirm: "Apply";
|
|
506
|
+
readonly cancel: "Cancel";
|
|
507
|
+
readonly none: "All dependencies satisfied — nothing to reschedule.";
|
|
508
|
+
};
|
|
503
509
|
readonly resource: {
|
|
504
510
|
readonly header: "Resource";
|
|
505
511
|
readonly peak: "Peak";
|
|
@@ -1382,14 +1388,16 @@ declare const en: {
|
|
|
1382
1388
|
readonly identityImport: {
|
|
1383
1389
|
readonly policyTitle: "Sign-in setup for imported users";
|
|
1384
1390
|
readonly policy: {
|
|
1385
|
-
readonly
|
|
1391
|
+
readonly auto: "Automatic (recommended)";
|
|
1386
1392
|
readonly invite: "Send invitations";
|
|
1387
1393
|
readonly temporary: "Temporary passwords";
|
|
1394
|
+
readonly none: "No password (identity only)";
|
|
1388
1395
|
};
|
|
1389
1396
|
readonly policyHint: {
|
|
1397
|
+
readonly auto: "Reachable users get an invitation (email or SMS); anyone we can't reach gets a one-time password, shown ONCE on the result screen. Works with or without an email/SMS service.";
|
|
1398
|
+
readonly invite: "Every created user gets a set-your-password email (or an invitation SMS for phone-only rows). Requires a configured email/SMS service — unreachable rows fail.";
|
|
1399
|
+
readonly temporary: "For deployments without email/SMS: every created user gets a one-time password, shown ONCE on the result screen. First sign-in forces a change.";
|
|
1390
1400
|
readonly none: "Users first sign in with a phone OTP, magic link, or password-reset link, then set their own password.";
|
|
1391
|
-
readonly invite: "Each created user gets a set-your-password email (or an invitation SMS for phone-only rows). Requires a configured email/SMS service.";
|
|
1392
|
-
readonly temporary: "For deployments without email/SMS: each created user gets a one-time password, shown ONCE on the result screen. First sign-in forces a change.";
|
|
1393
1401
|
};
|
|
1394
1402
|
readonly passwordsNote: "Temporary passwords — shown once, never stored. Save them now; each user must change theirs at first sign-in.";
|
|
1395
1403
|
readonly passwordsMore: "More entries omitted — use the download.";
|
|
@@ -1492,6 +1500,10 @@ declare const en: {
|
|
|
1492
1500
|
readonly parentField: "Parent field";
|
|
1493
1501
|
readonly parentFieldHelp: "The field pointing to the parent record (same object) that defines the hierarchy. Only self-referencing fields qualify.";
|
|
1494
1502
|
readonly newView: "New View";
|
|
1503
|
+
readonly viewName: "Name";
|
|
1504
|
+
readonly viewNameHelp: "Machine key (snake_case). Auto-filled from the title — edit if you like.";
|
|
1505
|
+
readonly viewNameRequired: "Enter a key (lowercase letters, numbers, underscore). Not auto-filled for non-Latin titles.";
|
|
1506
|
+
readonly viewNameInvalid: "Use lowercase letters, numbers and underscores; start with a letter or underscore.";
|
|
1495
1507
|
readonly typeOptions: "Type Options";
|
|
1496
1508
|
readonly groupByField: "Group by field";
|
|
1497
1509
|
readonly groupByFieldHelp: "The kanban groups records into columns by this field's values.";
|
|
@@ -2085,6 +2097,7 @@ declare const en: {
|
|
|
2085
2097
|
readonly lookupHelpText: "Enter the record id of the referenced object. A picker is coming soon.";
|
|
2086
2098
|
readonly cancel: "Cancel";
|
|
2087
2099
|
readonly confirm: "Confirm";
|
|
2100
|
+
readonly uploading: "Uploading…";
|
|
2088
2101
|
readonly defaultActionTitle: "Action";
|
|
2089
2102
|
readonly ok: "OK";
|
|
2090
2103
|
};
|
package/dist/locales/en.js
CHANGED
|
@@ -92,6 +92,7 @@ const en = {
|
|
|
92
92
|
resultDialog: {
|
|
93
93
|
defaultTitle: 'Save this value now',
|
|
94
94
|
acknowledge: 'I have saved this',
|
|
95
|
+
copyAll: 'Copy all',
|
|
95
96
|
},
|
|
96
97
|
},
|
|
97
98
|
validation: {
|
|
@@ -386,6 +387,11 @@ const en = {
|
|
|
386
387
|
title: 'Managed by the platform',
|
|
387
388
|
body: 'Rows here are created automatically when actions run on the source record. The list below is a read-only monitoring surface — row-level actions (Approve, Recall, Resend, …) live on each row.',
|
|
388
389
|
},
|
|
390
|
+
systemWritable: {
|
|
391
|
+
short: 'Platform schema',
|
|
392
|
+
title: 'Platform-defined, admin-writable',
|
|
393
|
+
body: "This object's schema is defined by the platform, but its rows are yours to create and edit here. Who may write is governed by delegated administration and record-level security, not by this badge.",
|
|
394
|
+
},
|
|
389
395
|
appendOnly: {
|
|
390
396
|
short: 'Read-only · Audit log',
|
|
391
397
|
title: 'Read-only historical record',
|
|
@@ -473,14 +479,6 @@ const en = {
|
|
|
473
479
|
removeDependency: 'Remove dependency',
|
|
474
480
|
noCandidates: 'No available tasks',
|
|
475
481
|
searchTasks: 'Search tasks…',
|
|
476
|
-
qrcode: 'Mobile QR code',
|
|
477
|
-
},
|
|
478
|
-
qr: {
|
|
479
|
-
title: 'Open on mobile',
|
|
480
|
-
hint: 'Scan with a phone to open the details',
|
|
481
|
-
copy: 'Copy link',
|
|
482
|
-
copied: 'Copied',
|
|
483
|
-
close: 'Close',
|
|
484
482
|
},
|
|
485
483
|
delete: {
|
|
486
484
|
title: 'Delete this task?',
|
|
@@ -504,6 +502,14 @@ const en = {
|
|
|
504
502
|
confirm: 'Auto-reschedule',
|
|
505
503
|
cancel: 'Keep as is',
|
|
506
504
|
},
|
|
505
|
+
autoScheduleDlg: {
|
|
506
|
+
title: 'Auto-schedule',
|
|
507
|
+
body: 'Shift {count} task(s) later to satisfy dependency links?',
|
|
508
|
+
skipped: '{count} locked task(s) also violate links and were skipped.',
|
|
509
|
+
confirm: 'Apply',
|
|
510
|
+
cancel: 'Cancel',
|
|
511
|
+
none: 'All dependencies satisfied — nothing to reschedule.',
|
|
512
|
+
},
|
|
507
513
|
resource: {
|
|
508
514
|
header: 'Resource',
|
|
509
515
|
peak: 'Peak',
|
|
@@ -1404,14 +1410,16 @@ const en = {
|
|
|
1404
1410
|
identityImport: {
|
|
1405
1411
|
policyTitle: 'Sign-in setup for imported users',
|
|
1406
1412
|
policy: {
|
|
1407
|
-
|
|
1413
|
+
auto: 'Automatic (recommended)',
|
|
1408
1414
|
invite: 'Send invitations',
|
|
1409
1415
|
temporary: 'Temporary passwords',
|
|
1416
|
+
none: 'No password (identity only)',
|
|
1410
1417
|
},
|
|
1411
1418
|
policyHint: {
|
|
1419
|
+
auto: 'Reachable users get an invitation (email or SMS); anyone we can\'t reach gets a one-time password, shown ONCE on the result screen. Works with or without an email/SMS service.',
|
|
1420
|
+
invite: 'Every created user gets a set-your-password email (or an invitation SMS for phone-only rows). Requires a configured email/SMS service — unreachable rows fail.',
|
|
1421
|
+
temporary: 'For deployments without email/SMS: every created user gets a one-time password, shown ONCE on the result screen. First sign-in forces a change.',
|
|
1412
1422
|
none: 'Users first sign in with a phone OTP, magic link, or password-reset link, then set their own password.',
|
|
1413
|
-
invite: 'Each created user gets a set-your-password email (or an invitation SMS for phone-only rows). Requires a configured email/SMS service.',
|
|
1414
|
-
temporary: 'For deployments without email/SMS: each created user gets a one-time password, shown ONCE on the result screen. First sign-in forces a change.',
|
|
1415
1423
|
},
|
|
1416
1424
|
passwordsNote: 'Temporary passwords — shown once, never stored. Save them now; each user must change theirs at first sign-in.',
|
|
1417
1425
|
passwordsMore: 'More entries omitted — use the download.',
|
|
@@ -1514,6 +1522,10 @@ const en = {
|
|
|
1514
1522
|
parentField: 'Parent field',
|
|
1515
1523
|
parentFieldHelp: 'The field pointing to the parent record (same object) that defines the hierarchy. Only self-referencing fields qualify.',
|
|
1516
1524
|
newView: 'New View',
|
|
1525
|
+
viewName: 'Name',
|
|
1526
|
+
viewNameHelp: 'Machine key (snake_case). Auto-filled from the title — edit if you like.',
|
|
1527
|
+
viewNameRequired: 'Enter a key (lowercase letters, numbers, underscore). Not auto-filled for non-Latin titles.',
|
|
1528
|
+
viewNameInvalid: 'Use lowercase letters, numbers and underscores; start with a letter or underscore.',
|
|
1517
1529
|
typeOptions: 'Type Options',
|
|
1518
1530
|
groupByField: 'Group by field',
|
|
1519
1531
|
groupByFieldHelp: 'The kanban groups records into columns by this field\'s values.',
|
|
@@ -2111,6 +2123,7 @@ const en = {
|
|
|
2111
2123
|
lookupHelpText: 'Enter the record id of the referenced object. A picker is coming soon.',
|
|
2112
2124
|
cancel: 'Cancel',
|
|
2113
2125
|
confirm: 'Confirm',
|
|
2126
|
+
uploading: 'Uploading…',
|
|
2114
2127
|
defaultActionTitle: 'Action',
|
|
2115
2128
|
ok: 'OK',
|
|
2116
2129
|
},
|
package/dist/locales/es.d.ts
CHANGED
|
@@ -76,6 +76,7 @@ declare const es: {
|
|
|
76
76
|
resultDialog: {
|
|
77
77
|
defaultTitle: string;
|
|
78
78
|
acknowledge: string;
|
|
79
|
+
copyAll: string;
|
|
79
80
|
};
|
|
80
81
|
};
|
|
81
82
|
validation: {
|
|
@@ -1492,6 +1493,7 @@ declare const es: {
|
|
|
1492
1493
|
requiredError: string;
|
|
1493
1494
|
cancel: string;
|
|
1494
1495
|
confirm: string;
|
|
1496
|
+
uploading: string;
|
|
1495
1497
|
defaultActionTitle: string;
|
|
1496
1498
|
ok: string;
|
|
1497
1499
|
lookupPlaceholder: string;
|
package/dist/locales/es.js
CHANGED
|
@@ -75,8 +75,9 @@ const es = {
|
|
|
75
75
|
},
|
|
76
76
|
actions: {
|
|
77
77
|
resultDialog: {
|
|
78
|
-
defaultTitle: '
|
|
79
|
-
acknowledge: '
|
|
78
|
+
defaultTitle: 'Guarda este valor ahora',
|
|
79
|
+
acknowledge: 'Lo he guardado',
|
|
80
|
+
copyAll: 'Copiar todo',
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
validation: {
|
|
@@ -1493,6 +1494,7 @@ const es = {
|
|
|
1493
1494
|
requiredError: "{{label}} es obligatorio",
|
|
1494
1495
|
cancel: "Cancelar",
|
|
1495
1496
|
confirm: "Confirmar",
|
|
1497
|
+
uploading: "Subiendo…",
|
|
1496
1498
|
defaultActionTitle: "Acción",
|
|
1497
1499
|
ok: "Aceptar",
|
|
1498
1500
|
lookupPlaceholder: "Pegar ID de registro (UUID) para {{label}}",
|
package/dist/locales/fr.d.ts
CHANGED
|
@@ -76,6 +76,7 @@ declare const fr: {
|
|
|
76
76
|
resultDialog: {
|
|
77
77
|
defaultTitle: string;
|
|
78
78
|
acknowledge: string;
|
|
79
|
+
copyAll: string;
|
|
79
80
|
};
|
|
80
81
|
};
|
|
81
82
|
validation: {
|
|
@@ -1490,6 +1491,7 @@ declare const fr: {
|
|
|
1490
1491
|
requiredError: string;
|
|
1491
1492
|
cancel: string;
|
|
1492
1493
|
confirm: string;
|
|
1494
|
+
uploading: string;
|
|
1493
1495
|
defaultActionTitle: string;
|
|
1494
1496
|
ok: string;
|
|
1495
1497
|
lookupPlaceholder: string;
|
package/dist/locales/fr.js
CHANGED
|
@@ -75,8 +75,9 @@ const fr = {
|
|
|
75
75
|
},
|
|
76
76
|
actions: {
|
|
77
77
|
resultDialog: {
|
|
78
|
-
defaultTitle: '
|
|
79
|
-
acknowledge: '
|
|
78
|
+
defaultTitle: 'Enregistrez cette valeur maintenant',
|
|
79
|
+
acknowledge: 'Je l\'ai enregistrée',
|
|
80
|
+
copyAll: 'Tout copier',
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
validation: {
|
|
@@ -1491,6 +1492,7 @@ const fr = {
|
|
|
1491
1492
|
requiredError: "{{label}} est obligatoire",
|
|
1492
1493
|
cancel: "Annuler",
|
|
1493
1494
|
confirm: "Confirmer",
|
|
1495
|
+
uploading: "Téléversement…",
|
|
1494
1496
|
defaultActionTitle: "Action",
|
|
1495
1497
|
ok: "OK",
|
|
1496
1498
|
lookupPlaceholder: "Coller l'ID d'enregistrement (UUID) pour {{label}}",
|