@object-ui/i18n 5.0.2 → 5.2.1

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,130 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 5.2.1
4
+
5
+ ## 5.2.0
6
+
7
+ ### Minor Changes
8
+
9
+ - b2d1704: feat(cmdk): record search across objects in the Command Palette
10
+ - New `useRecordSearch` hook in `@object-ui/react` debounces a query, fans out
11
+ to `dataSource.find(name, { $search, $top })` across candidate objects, and
12
+ aggregates hits. Race-safe via a monotonic runId; per-object 404s are
13
+ silently dropped via `Promise.allSettled`.
14
+ - `CommandPalette` (`@object-ui/app-shell`) now accepts a `dataSource` prop;
15
+ when supplied, the palette renders a `Records` group at the top with hits
16
+ scoped to the active app's nav objects. Item `value` embeds the live query
17
+ so cmdk's client-side filter doesn't hide async results.
18
+ - Added `console.commandPalette.records` i18n key (`Records` / `记录`).
19
+
20
+ ### Patch Changes
21
+
22
+ - 321294c: Cmd-K now shows recently viewed records in its empty state, sourced
23
+ from the existing cloud-synced `sys_user_preference` adapter (already
24
+ wired by `RecentItemsProvider` + `useTrackRouteAsRecent` +
25
+ `RecordDetailView`). Multi-device by construction: open a record on
26
+ laptop, see it in `⌘K → Recently viewed` on phone.
27
+ - Group renders only when input is empty (no competition with search).
28
+ - Limited to the 5 most recent record-type entries.
29
+ - New i18n key `console.commandPalette.recentRecords` (en + zh seeded;
30
+ other locales fall back to `defaultValue: "Recently viewed"`).
31
+
32
+ - 0a644f0: feat(app-shell): CommandPalette searching indicator
33
+
34
+ When `useRecordSearch` is mid-flight (debounced fetch across objects
35
+ hasn't returned yet), the palette now surfaces a subtle visual:
36
+ - A small pulsing primary-coloured dot next to the **Records** group
37
+ heading, so the user sees that more results may still appear.
38
+ - A `Searching…` placeholder inside the empty state when the user has
39
+ typed something but no hits exist yet — replaces the static
40
+ "No results found." message until the request settles.
41
+
42
+ New i18n key `console.commandPalette.searching` (en + zh).
43
+
44
+ - a3cb88f: CRM UX polish batch:
45
+ - Kanban columns: drop the per-column rainbow top stripe. Lane border + header divider are sufficient; cards are now the loudest thing on screen (Linear / HubSpot pattern).
46
+ - Stage chevron (`record:path`): bump completed-stage contrast (emerald-800 text on emerald-500/15, was 700 on /10) and future-stage text from `foreground/70` to `foreground/85` for legibility.
47
+ - i18n: add `notifications.emptyUnread`, `notifications.filterUnread`, `notifications.filterAll` (en + zh) so the InboxPopover Unread/All sub-filter renders in the active locale.
48
+ - 5425608: CRM UX polish pass — calmer enterprise look across detail + kanban.
49
+ - **plugin-kanban**: column headers now use a 2px muted accent stripe with
50
+ neutral foreground titles + a quiet grey count pill instead of full
51
+ rainbow gradient + colored title + colored count. Pipeline boards
52
+ (Opportunity, Case, Task, Lead) look like Salesforce/Linear instead of
53
+ a toy. WIP-limit overflow remains destructive-red so urgency stays loud.
54
+ - **plugin-detail (`record:reference_rail`)**: new `hideEmpty` prop
55
+ (default true) collapses entries whose total === 0 into a single
56
+ `+ N empty (Quotes · Products …)` chip at the bottom of the rail.
57
+ Removes the 4–7 "No records" stack that dominated the aside.
58
+ - **plugin-detail (`record:path`)**: completed stages now render with an
59
+ emerald-tinted background + bold green check instead of low-contrast
60
+ `bg-muted text-muted-foreground` (which read as "light grey on white"
61
+ and was borderline unreadable).
62
+ - **app-shell (`RecordDetailView`)**: record-not-found short-circuit.
63
+ Previously a stale/missing recordId still rendered the page chrome
64
+ (rail, discussion, breadcrumb with the raw id), making invalid links
65
+ look like a partially broken page. Now renders a clean centered
66
+ `Empty` state with database icon + i18n'd "Record not found" copy.
67
+ - **i18n**: added `detail.showEmptyRelated_{one,other}` and
68
+ `empty.recordNotFound{,Description}` keys (en + zh).
69
+
70
+ - e919433: Stop silently assuming USD when a currency field has no `currency`
71
+ configured. For non-USD orgs (e.g. a CNY-based CRM seeded without an
72
+ explicit currency) the cells now render as plain locale-formatted
73
+ numbers (`150,000.00`) instead of `$150,000.00` — which was the #1
74
+ "why is my RMB showing as dollars?" bug.
75
+
76
+ Behavior change is opt-in via omission: when `currency` /
77
+ `defaultCurrency` is set on the field/column, formatting is unchanged.
78
+
79
+ Fixed call sites:
80
+ - `@object-ui/fields`: `formatCurrency`, `formatCompactCurrency`, and
81
+ `CurrencyCellRenderer` no longer default-param `'USD'`.
82
+ - `@object-ui/i18n`: `formatCurrency()` falls back to `formatNumber`
83
+ semantics when `currency` is omitted.
84
+ - `@object-ui/plugin-grid`: column-summary formatter (`Sum: 5,000,000`
85
+ instead of `Sum: $5,000,000.00`).
86
+ - `@object-ui/plugin-detail`: header-highlight currency formatter.
87
+ - `@object-ui/plugin-dashboard`: `ObjectMetricWidget` inferred
88
+ currency now resolves to `undefined` (not `'USD'`) for un-tagged
89
+ fields, so `MetricWidget`'s `isCurrency` heuristic falls through
90
+ to plain number formatting.
91
+
92
+ - d9c3bae: `RichTextField` now translates its inline hints (`Format: markdown`,
93
+ `Rich text editor (basic)`, `Enter text...`) instead of hardcoding
94
+ English. Adds `fields.richText.*` keys to the en / zh locale packs.
95
+
96
+ ## 5.1.1
97
+
98
+ ## 5.1.0
99
+
100
+ ### Minor Changes
101
+
102
+ - 49b1760: Polish the ConcurrentUpdateDialog and add i18n.
103
+ - Internationalise all dialog strings (title, body, button labels, "your edit" / "current value" headings, audit-trail line) through `useDetailTranslation`. Locale strings added to `@object-ui/i18n` for English and Chinese.
104
+ - Replace the plain dialog header with an amber warning badge + `AlertTriangle` icon to communicate that this is a conflict, not a routine confirmation.
105
+ - Visually differentiate the two value blocks: amber tint for the user's pending edit, sky tint for the server's current value. Both wrap long values cleanly.
106
+ - Surface audit provenance for the racer's write (`updated_at`, plus `updated_by_name`/`updated_by_label` when supplied). Opaque ID-looking `updated_by` tokens are suppressed.
107
+ - Re-prioritise the action buttons: **Reload latest** is now the primary/recommended action (autofocused), **Overwrite anyway** is rendered as a destructive-outline button so the dangerous path requires deliberate intent, and **Cancel** falls back to a ghost variant.
108
+
109
+ - c0b236f: Platform detail/form polish:
110
+ - **Auto-section grouping**: When an object has no authored `views.form.sections`, the detail page now splits fields into a primary section and a collapsible "More details" section based on a field-type/name heuristic (textarea / markdown / description / notes / remarks). Eliminates the wall-of-fields layout on objects without explicit detail metadata.
111
+ - **FormSection card chrome**: `FormSection` now accepts `showBorder`. Defaults to `true` for titled sections (Card wrapper) and `false` for untitled sections (flat). Same auto-default already applied to `DetailSection`.
112
+ - **Origin breadcrumb**: Navigating from a list/kanban into a record now records the source view; the detail page shows a `← <view label>` back-link above the page header.
113
+ - New i18n key `detail.sectionMoreDetails` (en + zh-CN).
114
+
115
+ ### Patch Changes
116
+
117
+ - 1976691: Fix the drawer "Open as full page" (maximize) button on the record drawer
118
+ which threw `TypeError: name.indexOf is not a function` and prevented
119
+ navigation to the dedicated detail page.
120
+ - `@object-ui/app-shell` `ObjectView`: pass `objectDef.name` (string) — not
121
+ the whole `objectDef` — into `viewLabel(...)` when computing the
122
+ `originState.from.label` for both drawer-navigate and list-navigate
123
+ flows. Two call sites fixed.
124
+ - `@object-ui/i18n` `useObjectLabel`: harden `stripNamespace` so it
125
+ tolerates non-string inputs and returns an empty string instead of
126
+ throwing, providing a safety net for similar future regressions.
127
+
3
128
  ## 5.0.2
4
129
 
5
130
  ### Patch Changes
@@ -68,6 +68,13 @@ declare const ar: {
68
68
  readonly editDescription: "تحديث تفاصيل {{object}}";
69
69
  readonly saveRecord: "حفظ السجل";
70
70
  };
71
+ readonly fields: {
72
+ readonly richText: {
73
+ readonly format: "Format: {{format}}";
74
+ readonly basicEditorHint: "Rich text editor (basic)";
75
+ readonly placeholder: "Enter text...";
76
+ };
77
+ };
71
78
  readonly table: {
72
79
  readonly rowsPerPage: "صفوف في الصفحة";
73
80
  readonly showing: "عرض {{from}} إلى {{to}} من {{total}}";
@@ -68,6 +68,13 @@ const ar = {
68
68
  editDescription: 'تحديث تفاصيل {{object}}',
69
69
  saveRecord: 'حفظ السجل',
70
70
  },
71
+ fields: {
72
+ richText: {
73
+ format: 'Format: {{format}}',
74
+ basicEditorHint: 'Rich text editor (basic)',
75
+ placeholder: 'Enter text...',
76
+ },
77
+ },
71
78
  table: {
72
79
  rowsPerPage: 'صفوف في الصفحة',
73
80
  showing: 'عرض {{from}} إلى {{to}} من {{total}}',
@@ -67,6 +67,13 @@ declare const de: {
67
67
  readonly editDescription: "Details für {{object}} aktualisieren";
68
68
  readonly saveRecord: "Datensatz speichern";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "Zeilen pro Seite";
72
79
  readonly showing: "{{from}} bis {{to}} von {{total}} angezeigt";
@@ -67,6 +67,13 @@ const de = {
67
67
  editDescription: 'Details für {{object}} aktualisieren',
68
68
  saveRecord: 'Datensatz speichern',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: 'Zeilen pro Seite',
72
79
  showing: '{{from}} bis {{to}} von {{total}} angezeigt',
@@ -72,6 +72,13 @@ declare const en: {
72
72
  readonly updateSuccess: "{{object}} updated successfully";
73
73
  readonly deleteSuccess: "{{object}} deleted successfully";
74
74
  };
75
+ readonly fields: {
76
+ readonly richText: {
77
+ readonly format: "Format: {{format}}";
78
+ readonly basicEditorHint: "Rich text editor (basic)";
79
+ readonly placeholder: "Enter text...";
80
+ };
81
+ };
75
82
  readonly table: {
76
83
  readonly rowsPerPage: "Rows per page";
77
84
  readonly showing: "Showing {{from}} to {{to}} of {{total}}";
@@ -306,6 +313,16 @@ declare const en: {
306
313
  readonly linkCopyFailed: "Failed to copy link";
307
314
  readonly cancel: "Cancel";
308
315
  readonly cancelEdit: "Discard changes";
316
+ readonly sectionMoreDetails: "More details";
317
+ readonly concurrentUpdateTitle: "This record was modified by someone else";
318
+ readonly concurrentUpdateDescription: "Another user saved a newer version of {{field}} while you were editing. To prevent silently overwriting their change, please choose how to resolve the conflict.";
319
+ readonly concurrentUpdateYourEdit: "Your edit";
320
+ readonly concurrentUpdateCurrentValue: "Current value";
321
+ readonly concurrentUpdateUpdatedBy: "Updated by {{name}}";
322
+ readonly concurrentUpdateUpdatedAt: "Updated at {{when}}";
323
+ readonly concurrentUpdateReload: "Reload latest";
324
+ readonly concurrentUpdateOverwrite: "Overwrite anyway";
325
+ readonly concurrentUpdateCancel: "Cancel";
309
326
  readonly openInNewTab: "Open in new tab";
310
327
  readonly share: "Share";
311
328
  readonly duplicate: "Duplicate";
@@ -389,6 +406,8 @@ declare const en: {
389
406
  readonly nextRecordKey: "Next record (→)";
390
407
  readonly lastRecord: "Last record (End)";
391
408
  readonly noRecords: "No records";
409
+ readonly showEmptyRelated_one: "+ {{count}} empty";
410
+ readonly showEmptyRelated_other: "+ {{count}} empty";
392
411
  readonly searchWhileNavigating: "Search while navigating";
393
412
  readonly searchRecords: "Search records…";
394
413
  readonly allActivity: "All Activity";
@@ -897,6 +916,9 @@ declare const en: {
897
916
  readonly commandPalette: {
898
917
  readonly placeholder: "Type a command or search...";
899
918
  readonly noResults: "No results found.";
919
+ readonly searching: "Searching…";
920
+ readonly records: "Records";
921
+ readonly recentRecords: "Recently viewed";
900
922
  readonly objects: "Objects";
901
923
  readonly dashboards: "Dashboards";
902
924
  readonly pages: "Pages";
@@ -1323,6 +1345,8 @@ declare const en: {
1323
1345
  readonly empty: {
1324
1346
  readonly objectNotFound: "Object Not Found";
1325
1347
  readonly objectNotFoundDescription: "Object \"{{name}}\" definition missing. Check your configuration or navigate back to select a valid object.";
1348
+ readonly recordNotFound: "Record not found";
1349
+ readonly recordNotFoundDescription: "The record you are looking for does not exist or may have been deleted.";
1326
1350
  readonly pageNotFound: "Page Not Found";
1327
1351
  readonly pageNotFoundDescription: "The page \"{{name}}\" could not be found. It may have been removed or renamed.";
1328
1352
  readonly dashboardNotFound: "Dashboard Not Found";
@@ -1428,6 +1452,9 @@ declare const en: {
1428
1452
  };
1429
1453
  readonly notifications: {
1430
1454
  readonly empty: "No notifications";
1455
+ readonly emptyUnread: "You're all caught up";
1456
+ readonly filterUnread: "Unread";
1457
+ readonly filterAll: "All";
1431
1458
  readonly markAllRead: "Mark all read";
1432
1459
  readonly viewAll: "View all notifications";
1433
1460
  readonly approvalsPending: "{{count}} pending approvals";
@@ -72,6 +72,13 @@ const en = {
72
72
  updateSuccess: '{{object}} updated successfully',
73
73
  deleteSuccess: '{{object}} deleted successfully',
74
74
  },
75
+ fields: {
76
+ richText: {
77
+ format: 'Format: {{format}}',
78
+ basicEditorHint: 'Rich text editor (basic)',
79
+ placeholder: 'Enter text...',
80
+ },
81
+ },
75
82
  table: {
76
83
  rowsPerPage: 'Rows per page',
77
84
  showing: 'Showing {{from}} to {{to}} of {{total}}',
@@ -306,6 +313,17 @@ const en = {
306
313
  linkCopyFailed: 'Failed to copy link',
307
314
  cancel: 'Cancel',
308
315
  cancelEdit: 'Discard changes',
316
+ sectionMoreDetails: 'More details',
317
+ // Concurrent update (OCC) dialog
318
+ concurrentUpdateTitle: 'This record was modified by someone else',
319
+ concurrentUpdateDescription: 'Another user saved a newer version of {{field}} while you were editing. To prevent silently overwriting their change, please choose how to resolve the conflict.',
320
+ concurrentUpdateYourEdit: 'Your edit',
321
+ concurrentUpdateCurrentValue: 'Current value',
322
+ concurrentUpdateUpdatedBy: 'Updated by {{name}}',
323
+ concurrentUpdateUpdatedAt: 'Updated at {{when}}',
324
+ concurrentUpdateReload: 'Reload latest',
325
+ concurrentUpdateOverwrite: 'Overwrite anyway',
326
+ concurrentUpdateCancel: 'Cancel',
309
327
  openInNewTab: 'Open in new tab',
310
328
  share: 'Share',
311
329
  duplicate: 'Duplicate',
@@ -397,6 +415,8 @@ const en = {
397
415
  nextRecordKey: 'Next record (→)',
398
416
  lastRecord: 'Last record (End)',
399
417
  noRecords: 'No records',
418
+ showEmptyRelated_one: '+ {{count}} empty',
419
+ showEmptyRelated_other: '+ {{count}} empty',
400
420
  searchWhileNavigating: 'Search while navigating',
401
421
  searchRecords: 'Search records…',
402
422
  // Activity timeline
@@ -908,6 +928,9 @@ const en = {
908
928
  commandPalette: {
909
929
  placeholder: 'Type a command or search...',
910
930
  noResults: 'No results found.',
931
+ searching: 'Searching…',
932
+ records: 'Records',
933
+ recentRecords: 'Recently viewed',
911
934
  objects: 'Objects',
912
935
  dashboards: 'Dashboards',
913
936
  pages: 'Pages',
@@ -1334,6 +1357,8 @@ const en = {
1334
1357
  empty: {
1335
1358
  objectNotFound: 'Object Not Found',
1336
1359
  objectNotFoundDescription: 'Object "{{name}}" definition missing. Check your configuration or navigate back to select a valid object.',
1360
+ recordNotFound: 'Record not found',
1361
+ recordNotFoundDescription: 'The record you are looking for does not exist or may have been deleted.',
1337
1362
  pageNotFound: 'Page Not Found',
1338
1363
  pageNotFoundDescription: 'The page "{{name}}" could not be found. It may have been removed or renamed.',
1339
1364
  dashboardNotFound: 'Dashboard Not Found',
@@ -1439,6 +1464,9 @@ const en = {
1439
1464
  },
1440
1465
  notifications: {
1441
1466
  empty: 'No notifications',
1467
+ emptyUnread: "You're all caught up",
1468
+ filterUnread: 'Unread',
1469
+ filterAll: 'All',
1442
1470
  markAllRead: 'Mark all read',
1443
1471
  viewAll: 'View all notifications',
1444
1472
  approvalsPending: '{{count}} pending approvals',
@@ -67,6 +67,13 @@ declare const es: {
67
67
  readonly editDescription: "Actualizar detalles de {{object}}";
68
68
  readonly saveRecord: "Guardar registro";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "Filas por página";
72
79
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -67,6 +67,13 @@ const es = {
67
67
  editDescription: 'Actualizar detalles de {{object}}',
68
68
  saveRecord: 'Guardar registro',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: 'Filas por página',
72
79
  showing: 'Mostrando {{from}} a {{to}} de {{total}}',
@@ -67,6 +67,13 @@ declare const fr: {
67
67
  readonly editDescription: "Mettre à jour les détails de {{object}}";
68
68
  readonly saveRecord: "Enregistrer";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "Lignes par page";
72
79
  readonly showing: "Affichage de {{from}} à {{to}} sur {{total}}";
@@ -67,6 +67,13 @@ const fr = {
67
67
  editDescription: 'Mettre à jour les détails de {{object}}',
68
68
  saveRecord: 'Enregistrer',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: 'Lignes par page',
72
79
  showing: 'Affichage de {{from}} à {{to}} sur {{total}}',
@@ -84,6 +84,13 @@ export declare const builtInLocales: {
84
84
  readonly updateSuccess: "{{object}} updated successfully";
85
85
  readonly deleteSuccess: "{{object}} deleted successfully";
86
86
  };
87
+ readonly fields: {
88
+ readonly richText: {
89
+ readonly format: "Format: {{format}}";
90
+ readonly basicEditorHint: "Rich text editor (basic)";
91
+ readonly placeholder: "Enter text...";
92
+ };
93
+ };
87
94
  readonly table: {
88
95
  readonly rowsPerPage: "Rows per page";
89
96
  readonly showing: "Showing {{from}} to {{to}} of {{total}}";
@@ -318,6 +325,16 @@ export declare const builtInLocales: {
318
325
  readonly linkCopyFailed: "Failed to copy link";
319
326
  readonly cancel: "Cancel";
320
327
  readonly cancelEdit: "Discard changes";
328
+ readonly sectionMoreDetails: "More details";
329
+ readonly concurrentUpdateTitle: "This record was modified by someone else";
330
+ readonly concurrentUpdateDescription: "Another user saved a newer version of {{field}} while you were editing. To prevent silently overwriting their change, please choose how to resolve the conflict.";
331
+ readonly concurrentUpdateYourEdit: "Your edit";
332
+ readonly concurrentUpdateCurrentValue: "Current value";
333
+ readonly concurrentUpdateUpdatedBy: "Updated by {{name}}";
334
+ readonly concurrentUpdateUpdatedAt: "Updated at {{when}}";
335
+ readonly concurrentUpdateReload: "Reload latest";
336
+ readonly concurrentUpdateOverwrite: "Overwrite anyway";
337
+ readonly concurrentUpdateCancel: "Cancel";
321
338
  readonly openInNewTab: "Open in new tab";
322
339
  readonly share: "Share";
323
340
  readonly duplicate: "Duplicate";
@@ -401,6 +418,8 @@ export declare const builtInLocales: {
401
418
  readonly nextRecordKey: "Next record (→)";
402
419
  readonly lastRecord: "Last record (End)";
403
420
  readonly noRecords: "No records";
421
+ readonly showEmptyRelated_one: "+ {{count}} empty";
422
+ readonly showEmptyRelated_other: "+ {{count}} empty";
404
423
  readonly searchWhileNavigating: "Search while navigating";
405
424
  readonly searchRecords: "Search records…";
406
425
  readonly allActivity: "All Activity";
@@ -909,6 +928,9 @@ export declare const builtInLocales: {
909
928
  readonly commandPalette: {
910
929
  readonly placeholder: "Type a command or search...";
911
930
  readonly noResults: "No results found.";
931
+ readonly searching: "Searching…";
932
+ readonly records: "Records";
933
+ readonly recentRecords: "Recently viewed";
912
934
  readonly objects: "Objects";
913
935
  readonly dashboards: "Dashboards";
914
936
  readonly pages: "Pages";
@@ -1335,6 +1357,8 @@ export declare const builtInLocales: {
1335
1357
  readonly empty: {
1336
1358
  readonly objectNotFound: "Object Not Found";
1337
1359
  readonly objectNotFoundDescription: "Object \"{{name}}\" definition missing. Check your configuration or navigate back to select a valid object.";
1360
+ readonly recordNotFound: "Record not found";
1361
+ readonly recordNotFoundDescription: "The record you are looking for does not exist or may have been deleted.";
1338
1362
  readonly pageNotFound: "Page Not Found";
1339
1363
  readonly pageNotFoundDescription: "The page \"{{name}}\" could not be found. It may have been removed or renamed.";
1340
1364
  readonly dashboardNotFound: "Dashboard Not Found";
@@ -1440,6 +1464,9 @@ export declare const builtInLocales: {
1440
1464
  };
1441
1465
  readonly notifications: {
1442
1466
  readonly empty: "No notifications";
1467
+ readonly emptyUnread: "You're all caught up";
1468
+ readonly filterUnread: "Unread";
1469
+ readonly filterAll: "All";
1443
1470
  readonly markAllRead: "Mark all read";
1444
1471
  readonly viewAll: "View all notifications";
1445
1472
  readonly approvalsPending: "{{count}} pending approvals";
@@ -1586,6 +1613,13 @@ export declare const builtInLocales: {
1586
1613
  readonly updateSuccess: "{{object}}更新成功";
1587
1614
  readonly deleteSuccess: "{{object}}删除成功";
1588
1615
  };
1616
+ readonly fields: {
1617
+ readonly richText: {
1618
+ readonly format: "格式: {{format}}";
1619
+ readonly basicEditorHint: "富文本编辑器(基础)";
1620
+ readonly placeholder: "请输入文字...";
1621
+ };
1622
+ };
1589
1623
  readonly table: {
1590
1624
  readonly rowsPerPage: "每页行数";
1591
1625
  readonly showing: "显示第{{from}}到{{to}}条,共{{total}}条";
@@ -1820,6 +1854,16 @@ export declare const builtInLocales: {
1820
1854
  readonly linkCopyFailed: "复制链接失败";
1821
1855
  readonly cancel: "取消";
1822
1856
  readonly cancelEdit: "放弃更改";
1857
+ readonly sectionMoreDetails: "更多详情";
1858
+ readonly concurrentUpdateTitle: "该记录已被他人修改";
1859
+ readonly concurrentUpdateDescription: "在你编辑期间,另一位用户保存了 {{field}} 的新版本。为避免无声覆盖对方的改动,请选择如何处理该冲突。";
1860
+ readonly concurrentUpdateYourEdit: "你的修改";
1861
+ readonly concurrentUpdateCurrentValue: "当前值";
1862
+ readonly concurrentUpdateUpdatedBy: "由 {{name}} 更新";
1863
+ readonly concurrentUpdateUpdatedAt: "更新于 {{when}}";
1864
+ readonly concurrentUpdateReload: "加载最新";
1865
+ readonly concurrentUpdateOverwrite: "仍然覆盖";
1866
+ readonly concurrentUpdateCancel: "取消";
1823
1867
  readonly openInNewTab: "在新标签页打开";
1824
1868
  readonly share: "分享";
1825
1869
  readonly duplicate: "复制";
@@ -1903,6 +1947,8 @@ export declare const builtInLocales: {
1903
1947
  readonly nextRecordKey: "下一条记录 (→)";
1904
1948
  readonly lastRecord: "最后一条记录 (End)";
1905
1949
  readonly noRecords: "无记录";
1950
+ readonly showEmptyRelated_one: "+ {{count}} 个为空";
1951
+ readonly showEmptyRelated_other: "+ {{count}} 个为空";
1906
1952
  readonly searchWhileNavigating: "导航时搜索";
1907
1953
  readonly searchRecords: "搜索记录…";
1908
1954
  readonly allActivity: "全部动态";
@@ -2411,6 +2457,9 @@ export declare const builtInLocales: {
2411
2457
  readonly commandPalette: {
2412
2458
  readonly placeholder: "输入命令或搜索...";
2413
2459
  readonly noResults: "未找到结果。";
2460
+ readonly searching: "搜索中…";
2461
+ readonly records: "记录";
2462
+ readonly recentRecords: "最近访问";
2414
2463
  readonly objects: "对象";
2415
2464
  readonly dashboards: "仪表盘";
2416
2465
  readonly pages: "页面";
@@ -2837,6 +2886,8 @@ export declare const builtInLocales: {
2837
2886
  readonly empty: {
2838
2887
  readonly objectNotFound: "未找到对象";
2839
2888
  readonly objectNotFoundDescription: "对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。";
2889
+ readonly recordNotFound: "未找到记录";
2890
+ readonly recordNotFoundDescription: "您查找的记录不存在或已被删除。";
2840
2891
  readonly pageNotFound: "未找到页面";
2841
2892
  readonly pageNotFoundDescription: "未找到页面 “{{name}}”,可能已被删除或重命名。";
2842
2893
  readonly dashboardNotFound: "未找到仪表板";
@@ -2942,6 +2993,9 @@ export declare const builtInLocales: {
2942
2993
  };
2943
2994
  readonly notifications: {
2944
2995
  readonly empty: "暂无通知";
2996
+ readonly emptyUnread: "已读完所有通知";
2997
+ readonly filterUnread: "未读";
2998
+ readonly filterAll: "全部";
2945
2999
  readonly markAllRead: "全部标记为已读";
2946
3000
  readonly viewAll: "查看全部通知";
2947
3001
  readonly approvalsPending: "{{count}} 条待审批";
@@ -3083,6 +3137,13 @@ export declare const builtInLocales: {
3083
3137
  readonly editDescription: "{{object}}の詳細を更新";
3084
3138
  readonly saveRecord: "レコードを保存";
3085
3139
  };
3140
+ readonly fields: {
3141
+ readonly richText: {
3142
+ readonly format: "Format: {{format}}";
3143
+ readonly basicEditorHint: "Rich text editor (basic)";
3144
+ readonly placeholder: "Enter text...";
3145
+ };
3146
+ };
3086
3147
  readonly table: {
3087
3148
  readonly rowsPerPage: "1ページの行数";
3088
3149
  readonly showing: "{{total}}件中{{from}}〜{{to}}件を表示";
@@ -4272,6 +4333,13 @@ export declare const builtInLocales: {
4272
4333
  readonly editDescription: "{{object}} 세부 정보 업데이트";
4273
4334
  readonly saveRecord: "레코드 저장";
4274
4335
  };
4336
+ readonly fields: {
4337
+ readonly richText: {
4338
+ readonly format: "Format: {{format}}";
4339
+ readonly basicEditorHint: "Rich text editor (basic)";
4340
+ readonly placeholder: "Enter text...";
4341
+ };
4342
+ };
4275
4343
  readonly table: {
4276
4344
  readonly rowsPerPage: "페이지당 행 수";
4277
4345
  readonly showing: "{{total}}개 중 {{from}}~{{to}} 표시";
@@ -5450,6 +5518,13 @@ export declare const builtInLocales: {
5450
5518
  readonly editDescription: "Details für {{object}} aktualisieren";
5451
5519
  readonly saveRecord: "Datensatz speichern";
5452
5520
  };
5521
+ readonly fields: {
5522
+ readonly richText: {
5523
+ readonly format: "Format: {{format}}";
5524
+ readonly basicEditorHint: "Rich text editor (basic)";
5525
+ readonly placeholder: "Enter text...";
5526
+ };
5527
+ };
5453
5528
  readonly table: {
5454
5529
  readonly rowsPerPage: "Zeilen pro Seite";
5455
5530
  readonly showing: "{{from}} bis {{to}} von {{total}} angezeigt";
@@ -6628,6 +6703,13 @@ export declare const builtInLocales: {
6628
6703
  readonly editDescription: "Mettre à jour les détails de {{object}}";
6629
6704
  readonly saveRecord: "Enregistrer";
6630
6705
  };
6706
+ readonly fields: {
6707
+ readonly richText: {
6708
+ readonly format: "Format: {{format}}";
6709
+ readonly basicEditorHint: "Rich text editor (basic)";
6710
+ readonly placeholder: "Enter text...";
6711
+ };
6712
+ };
6631
6713
  readonly table: {
6632
6714
  readonly rowsPerPage: "Lignes par page";
6633
6715
  readonly showing: "Affichage de {{from}} à {{to}} sur {{total}}";
@@ -7806,6 +7888,13 @@ export declare const builtInLocales: {
7806
7888
  readonly editDescription: "Actualizar detalles de {{object}}";
7807
7889
  readonly saveRecord: "Guardar registro";
7808
7890
  };
7891
+ readonly fields: {
7892
+ readonly richText: {
7893
+ readonly format: "Format: {{format}}";
7894
+ readonly basicEditorHint: "Rich text editor (basic)";
7895
+ readonly placeholder: "Enter text...";
7896
+ };
7897
+ };
7809
7898
  readonly table: {
7810
7899
  readonly rowsPerPage: "Filas por página";
7811
7900
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -8984,6 +9073,13 @@ export declare const builtInLocales: {
8984
9073
  readonly editDescription: "Atualizar detalhes de {{object}}";
8985
9074
  readonly saveRecord: "Salvar registro";
8986
9075
  };
9076
+ readonly fields: {
9077
+ readonly richText: {
9078
+ readonly format: "Format: {{format}}";
9079
+ readonly basicEditorHint: "Rich text editor (basic)";
9080
+ readonly placeholder: "Enter text...";
9081
+ };
9082
+ };
8987
9083
  readonly table: {
8988
9084
  readonly rowsPerPage: "Linhas por página";
8989
9085
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -10162,6 +10258,13 @@ export declare const builtInLocales: {
10162
10258
  readonly editDescription: "Обновить данные {{object}}";
10163
10259
  readonly saveRecord: "Сохранить запись";
10164
10260
  };
10261
+ readonly fields: {
10262
+ readonly richText: {
10263
+ readonly format: "Format: {{format}}";
10264
+ readonly basicEditorHint: "Rich text editor (basic)";
10265
+ readonly placeholder: "Enter text...";
10266
+ };
10267
+ };
10165
10268
  readonly table: {
10166
10269
  readonly rowsPerPage: "Строк на странице";
10167
10270
  readonly showing: "Показано с {{from}} по {{to}} из {{total}}";
@@ -11351,6 +11454,13 @@ export declare const builtInLocales: {
11351
11454
  readonly editDescription: "تحديث تفاصيل {{object}}";
11352
11455
  readonly saveRecord: "حفظ السجل";
11353
11456
  };
11457
+ readonly fields: {
11458
+ readonly richText: {
11459
+ readonly format: "Format: {{format}}";
11460
+ readonly basicEditorHint: "Rich text editor (basic)";
11461
+ readonly placeholder: "Enter text...";
11462
+ };
11463
+ };
11354
11464
  readonly table: {
11355
11465
  readonly rowsPerPage: "صفوف في الصفحة";
11356
11466
  readonly showing: "عرض {{from}} إلى {{to}} من {{total}}";
@@ -67,6 +67,13 @@ declare const ja: {
67
67
  readonly editDescription: "{{object}}の詳細を更新";
68
68
  readonly saveRecord: "レコードを保存";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "1ページの行数";
72
79
  readonly showing: "{{total}}件中{{from}}〜{{to}}件を表示";
@@ -67,6 +67,13 @@ const ja = {
67
67
  editDescription: '{{object}}の詳細を更新',
68
68
  saveRecord: 'レコードを保存',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: '1ページの行数',
72
79
  showing: '{{total}}件中{{from}}〜{{to}}件を表示',
@@ -67,6 +67,13 @@ declare const ko: {
67
67
  readonly editDescription: "{{object}} 세부 정보 업데이트";
68
68
  readonly saveRecord: "레코드 저장";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "페이지당 행 수";
72
79
  readonly showing: "{{total}}개 중 {{from}}~{{to}} 표시";
@@ -67,6 +67,13 @@ const ko = {
67
67
  editDescription: '{{object}} 세부 정보 업데이트',
68
68
  saveRecord: '레코드 저장',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: '페이지당 행 수',
72
79
  showing: '{{total}}개 중 {{from}}~{{to}} 표시',
@@ -67,6 +67,13 @@ declare const pt: {
67
67
  readonly editDescription: "Atualizar detalhes de {{object}}";
68
68
  readonly saveRecord: "Salvar registro";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "Linhas por página";
72
79
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -67,6 +67,13 @@ const pt = {
67
67
  editDescription: 'Atualizar detalhes de {{object}}',
68
68
  saveRecord: 'Salvar registro',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: 'Linhas por página',
72
79
  showing: 'Mostrando {{from}} a {{to}} de {{total}}',
@@ -67,6 +67,13 @@ declare const ru: {
67
67
  readonly editDescription: "Обновить данные {{object}}";
68
68
  readonly saveRecord: "Сохранить запись";
69
69
  };
70
+ readonly fields: {
71
+ readonly richText: {
72
+ readonly format: "Format: {{format}}";
73
+ readonly basicEditorHint: "Rich text editor (basic)";
74
+ readonly placeholder: "Enter text...";
75
+ };
76
+ };
70
77
  readonly table: {
71
78
  readonly rowsPerPage: "Строк на странице";
72
79
  readonly showing: "Показано с {{from}} по {{to}} из {{total}}";
@@ -67,6 +67,13 @@ const ru = {
67
67
  editDescription: 'Обновить данные {{object}}',
68
68
  saveRecord: 'Сохранить запись',
69
69
  },
70
+ fields: {
71
+ richText: {
72
+ format: 'Format: {{format}}',
73
+ basicEditorHint: 'Rich text editor (basic)',
74
+ placeholder: 'Enter text...',
75
+ },
76
+ },
70
77
  table: {
71
78
  rowsPerPage: 'Строк на странице',
72
79
  showing: 'Показано с {{from}} по {{to}} из {{total}}',
@@ -72,6 +72,13 @@ declare const zh: {
72
72
  readonly updateSuccess: "{{object}}更新成功";
73
73
  readonly deleteSuccess: "{{object}}删除成功";
74
74
  };
75
+ readonly fields: {
76
+ readonly richText: {
77
+ readonly format: "格式: {{format}}";
78
+ readonly basicEditorHint: "富文本编辑器(基础)";
79
+ readonly placeholder: "请输入文字...";
80
+ };
81
+ };
75
82
  readonly table: {
76
83
  readonly rowsPerPage: "每页行数";
77
84
  readonly showing: "显示第{{from}}到{{to}}条,共{{total}}条";
@@ -306,6 +313,16 @@ declare const zh: {
306
313
  readonly linkCopyFailed: "复制链接失败";
307
314
  readonly cancel: "取消";
308
315
  readonly cancelEdit: "放弃更改";
316
+ readonly sectionMoreDetails: "更多详情";
317
+ readonly concurrentUpdateTitle: "该记录已被他人修改";
318
+ readonly concurrentUpdateDescription: "在你编辑期间,另一位用户保存了 {{field}} 的新版本。为避免无声覆盖对方的改动,请选择如何处理该冲突。";
319
+ readonly concurrentUpdateYourEdit: "你的修改";
320
+ readonly concurrentUpdateCurrentValue: "当前值";
321
+ readonly concurrentUpdateUpdatedBy: "由 {{name}} 更新";
322
+ readonly concurrentUpdateUpdatedAt: "更新于 {{when}}";
323
+ readonly concurrentUpdateReload: "加载最新";
324
+ readonly concurrentUpdateOverwrite: "仍然覆盖";
325
+ readonly concurrentUpdateCancel: "取消";
309
326
  readonly openInNewTab: "在新标签页打开";
310
327
  readonly share: "分享";
311
328
  readonly duplicate: "复制";
@@ -389,6 +406,8 @@ declare const zh: {
389
406
  readonly nextRecordKey: "下一条记录 (→)";
390
407
  readonly lastRecord: "最后一条记录 (End)";
391
408
  readonly noRecords: "无记录";
409
+ readonly showEmptyRelated_one: "+ {{count}} 个为空";
410
+ readonly showEmptyRelated_other: "+ {{count}} 个为空";
392
411
  readonly searchWhileNavigating: "导航时搜索";
393
412
  readonly searchRecords: "搜索记录…";
394
413
  readonly allActivity: "全部动态";
@@ -897,6 +916,9 @@ declare const zh: {
897
916
  readonly commandPalette: {
898
917
  readonly placeholder: "输入命令或搜索...";
899
918
  readonly noResults: "未找到结果。";
919
+ readonly searching: "搜索中…";
920
+ readonly records: "记录";
921
+ readonly recentRecords: "最近访问";
900
922
  readonly objects: "对象";
901
923
  readonly dashboards: "仪表盘";
902
924
  readonly pages: "页面";
@@ -1323,6 +1345,8 @@ declare const zh: {
1323
1345
  readonly empty: {
1324
1346
  readonly objectNotFound: "未找到对象";
1325
1347
  readonly objectNotFoundDescription: "对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。";
1348
+ readonly recordNotFound: "未找到记录";
1349
+ readonly recordNotFoundDescription: "您查找的记录不存在或已被删除。";
1326
1350
  readonly pageNotFound: "未找到页面";
1327
1351
  readonly pageNotFoundDescription: "未找到页面 “{{name}}”,可能已被删除或重命名。";
1328
1352
  readonly dashboardNotFound: "未找到仪表板";
@@ -1428,6 +1452,9 @@ declare const zh: {
1428
1452
  };
1429
1453
  readonly notifications: {
1430
1454
  readonly empty: "暂无通知";
1455
+ readonly emptyUnread: "已读完所有通知";
1456
+ readonly filterUnread: "未读";
1457
+ readonly filterAll: "全部";
1431
1458
  readonly markAllRead: "全部标记为已读";
1432
1459
  readonly viewAll: "查看全部通知";
1433
1460
  readonly approvalsPending: "{{count}} 条待审批";
@@ -72,6 +72,13 @@ const zh = {
72
72
  updateSuccess: '{{object}}更新成功',
73
73
  deleteSuccess: '{{object}}删除成功',
74
74
  },
75
+ fields: {
76
+ richText: {
77
+ format: '格式: {{format}}',
78
+ basicEditorHint: '富文本编辑器(基础)',
79
+ placeholder: '请输入文字...',
80
+ },
81
+ },
75
82
  table: {
76
83
  rowsPerPage: '每页行数',
77
84
  showing: '显示第{{from}}到{{to}}条,共{{total}}条',
@@ -306,6 +313,17 @@ const zh = {
306
313
  linkCopyFailed: '复制链接失败',
307
314
  cancel: '取消',
308
315
  cancelEdit: '放弃更改',
316
+ sectionMoreDetails: '更多详情',
317
+ // Concurrent update (OCC) dialog
318
+ concurrentUpdateTitle: '该记录已被他人修改',
319
+ concurrentUpdateDescription: '在你编辑期间,另一位用户保存了 {{field}} 的新版本。为避免无声覆盖对方的改动,请选择如何处理该冲突。',
320
+ concurrentUpdateYourEdit: '你的修改',
321
+ concurrentUpdateCurrentValue: '当前值',
322
+ concurrentUpdateUpdatedBy: '由 {{name}} 更新',
323
+ concurrentUpdateUpdatedAt: '更新于 {{when}}',
324
+ concurrentUpdateReload: '加载最新',
325
+ concurrentUpdateOverwrite: '仍然覆盖',
326
+ concurrentUpdateCancel: '取消',
309
327
  openInNewTab: '在新标签页打开',
310
328
  share: '分享',
311
329
  duplicate: '复制',
@@ -397,6 +415,8 @@ const zh = {
397
415
  nextRecordKey: '下一条记录 (→)',
398
416
  lastRecord: '最后一条记录 (End)',
399
417
  noRecords: '无记录',
418
+ showEmptyRelated_one: '+ {{count}} 个为空',
419
+ showEmptyRelated_other: '+ {{count}} 个为空',
400
420
  searchWhileNavigating: '导航时搜索',
401
421
  searchRecords: '搜索记录…',
402
422
  // Activity timeline
@@ -908,6 +928,9 @@ const zh = {
908
928
  commandPalette: {
909
929
  placeholder: '输入命令或搜索...',
910
930
  noResults: '未找到结果。',
931
+ searching: '搜索中…',
932
+ records: '记录',
933
+ recentRecords: '最近访问',
911
934
  objects: '对象',
912
935
  dashboards: '仪表盘',
913
936
  pages: '页面',
@@ -1334,6 +1357,8 @@ const zh = {
1334
1357
  empty: {
1335
1358
  objectNotFound: '未找到对象',
1336
1359
  objectNotFoundDescription: '对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。',
1360
+ recordNotFound: '未找到记录',
1361
+ recordNotFoundDescription: '您查找的记录不存在或已被删除。',
1337
1362
  pageNotFound: '未找到页面',
1338
1363
  pageNotFoundDescription: '未找到页面 “{{name}}”,可能已被删除或重命名。',
1339
1364
  dashboardNotFound: '未找到仪表板',
@@ -1439,6 +1464,9 @@ const zh = {
1439
1464
  },
1440
1465
  notifications: {
1441
1466
  empty: '暂无通知',
1467
+ emptyUnread: '已读完所有通知',
1468
+ filterUnread: '未读',
1469
+ filterAll: '全部',
1442
1470
  markAllRead: '全部标记为已读',
1443
1471
  viewAll: '查看全部通知',
1444
1472
  approvalsPending: '{{count}} 条待审批',
@@ -75,6 +75,8 @@ export function useObjectLabel() {
75
75
  * package namespace from the base name; everything after is preserved.
76
76
  */
77
77
  const stripNamespace = (name) => {
78
+ if (typeof name !== 'string')
79
+ return '';
78
80
  const idx = name.indexOf('__');
79
81
  return idx > 0 ? name.slice(idx + 2) : name;
80
82
  };
@@ -36,7 +36,9 @@ export declare function formatDateTime(date: Date | string | number, options?: D
36
36
  */
37
37
  export declare function formatRelativeTime(date: Date | string | number, locale?: string): string;
38
38
  /**
39
- * Format a currency value according to locale conventions
39
+ * Format a currency value according to locale conventions. When `currency`
40
+ * is omitted, falls back to a plain locale-formatted number (no symbol)
41
+ * rather than silently assuming USD.
40
42
  */
41
43
  export declare function formatCurrency(value: number, options?: CurrencyFormatOptions): string;
42
44
  /**
@@ -66,10 +66,18 @@ export function formatRelativeTime(date, locale = 'en') {
66
66
  return rtf.format(Math.round(diffDay / 365), 'year');
67
67
  }
68
68
  /**
69
- * Format a currency value according to locale conventions
69
+ * Format a currency value according to locale conventions. When `currency`
70
+ * is omitted, falls back to a plain locale-formatted number (no symbol)
71
+ * rather than silently assuming USD.
70
72
  */
71
73
  export function formatCurrency(value, options = {}) {
72
- const { locale = 'en', currency = 'USD', minimumFractionDigits, maximumFractionDigits } = options;
74
+ const { locale = 'en', currency, minimumFractionDigits, maximumFractionDigits } = options;
75
+ if (!currency) {
76
+ return new Intl.NumberFormat(locale, {
77
+ minimumFractionDigits,
78
+ maximumFractionDigits,
79
+ }).format(value);
80
+ }
73
81
  return new Intl.NumberFormat(locale, {
74
82
  style: 'currency',
75
83
  currency,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/i18n",
3
- "version": "5.0.2",
3
+ "version": "5.2.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",