@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 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
@@ -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;
@@ -75,8 +75,9 @@ const ar = {
75
75
  },
76
76
  actions: {
77
77
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
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}}",
@@ -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;
@@ -75,8 +75,9 @@ const de = {
75
75
  },
76
76
  actions: {
77
77
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
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",
@@ -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 none: "No password (recommended)";
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
  };
@@ -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
- none: 'No password (recommended)',
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
  },
@@ -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;
@@ -75,8 +75,9 @@ const es = {
75
75
  },
76
76
  actions: {
77
77
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
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}}",
@@ -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;
@@ -75,8 +75,9 @@ const fr = {
75
75
  },
76
76
  actions: {
77
77
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
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}}",