@object-ui/i18n 5.1.1 → 5.3.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,100 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 5.3.0
4
+
5
+ ## 5.2.1
6
+
7
+ ## 5.2.0
8
+
9
+ ### Minor Changes
10
+
11
+ - b2d1704: feat(cmdk): record search across objects in the Command Palette
12
+ - New `useRecordSearch` hook in `@object-ui/react` debounces a query, fans out
13
+ to `dataSource.find(name, { $search, $top })` across candidate objects, and
14
+ aggregates hits. Race-safe via a monotonic runId; per-object 404s are
15
+ silently dropped via `Promise.allSettled`.
16
+ - `CommandPalette` (`@object-ui/app-shell`) now accepts a `dataSource` prop;
17
+ when supplied, the palette renders a `Records` group at the top with hits
18
+ scoped to the active app's nav objects. Item `value` embeds the live query
19
+ so cmdk's client-side filter doesn't hide async results.
20
+ - Added `console.commandPalette.records` i18n key (`Records` / `记录`).
21
+
22
+ ### Patch Changes
23
+
24
+ - 321294c: Cmd-K now shows recently viewed records in its empty state, sourced
25
+ from the existing cloud-synced `sys_user_preference` adapter (already
26
+ wired by `RecentItemsProvider` + `useTrackRouteAsRecent` +
27
+ `RecordDetailView`). Multi-device by construction: open a record on
28
+ laptop, see it in `⌘K → Recently viewed` on phone.
29
+ - Group renders only when input is empty (no competition with search).
30
+ - Limited to the 5 most recent record-type entries.
31
+ - New i18n key `console.commandPalette.recentRecords` (en + zh seeded;
32
+ other locales fall back to `defaultValue: "Recently viewed"`).
33
+
34
+ - 0a644f0: feat(app-shell): CommandPalette searching indicator
35
+
36
+ When `useRecordSearch` is mid-flight (debounced fetch across objects
37
+ hasn't returned yet), the palette now surfaces a subtle visual:
38
+ - A small pulsing primary-coloured dot next to the **Records** group
39
+ heading, so the user sees that more results may still appear.
40
+ - A `Searching…` placeholder inside the empty state when the user has
41
+ typed something but no hits exist yet — replaces the static
42
+ "No results found." message until the request settles.
43
+
44
+ New i18n key `console.commandPalette.searching` (en + zh).
45
+
46
+ - a3cb88f: CRM UX polish batch:
47
+ - 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).
48
+ - 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.
49
+ - i18n: add `notifications.emptyUnread`, `notifications.filterUnread`, `notifications.filterAll` (en + zh) so the InboxPopover Unread/All sub-filter renders in the active locale.
50
+ - 5425608: CRM UX polish pass — calmer enterprise look across detail + kanban.
51
+ - **plugin-kanban**: column headers now use a 2px muted accent stripe with
52
+ neutral foreground titles + a quiet grey count pill instead of full
53
+ rainbow gradient + colored title + colored count. Pipeline boards
54
+ (Opportunity, Case, Task, Lead) look like Salesforce/Linear instead of
55
+ a toy. WIP-limit overflow remains destructive-red so urgency stays loud.
56
+ - **plugin-detail (`record:reference_rail`)**: new `hideEmpty` prop
57
+ (default true) collapses entries whose total === 0 into a single
58
+ `+ N empty (Quotes · Products …)` chip at the bottom of the rail.
59
+ Removes the 4–7 "No records" stack that dominated the aside.
60
+ - **plugin-detail (`record:path`)**: completed stages now render with an
61
+ emerald-tinted background + bold green check instead of low-contrast
62
+ `bg-muted text-muted-foreground` (which read as "light grey on white"
63
+ and was borderline unreadable).
64
+ - **app-shell (`RecordDetailView`)**: record-not-found short-circuit.
65
+ Previously a stale/missing recordId still rendered the page chrome
66
+ (rail, discussion, breadcrumb with the raw id), making invalid links
67
+ look like a partially broken page. Now renders a clean centered
68
+ `Empty` state with database icon + i18n'd "Record not found" copy.
69
+ - **i18n**: added `detail.showEmptyRelated_{one,other}` and
70
+ `empty.recordNotFound{,Description}` keys (en + zh).
71
+
72
+ - e919433: Stop silently assuming USD when a currency field has no `currency`
73
+ configured. For non-USD orgs (e.g. a CNY-based CRM seeded without an
74
+ explicit currency) the cells now render as plain locale-formatted
75
+ numbers (`150,000.00`) instead of `$150,000.00` — which was the #1
76
+ "why is my RMB showing as dollars?" bug.
77
+
78
+ Behavior change is opt-in via omission: when `currency` /
79
+ `defaultCurrency` is set on the field/column, formatting is unchanged.
80
+
81
+ Fixed call sites:
82
+ - `@object-ui/fields`: `formatCurrency`, `formatCompactCurrency`, and
83
+ `CurrencyCellRenderer` no longer default-param `'USD'`.
84
+ - `@object-ui/i18n`: `formatCurrency()` falls back to `formatNumber`
85
+ semantics when `currency` is omitted.
86
+ - `@object-ui/plugin-grid`: column-summary formatter (`Sum: 5,000,000`
87
+ instead of `Sum: $5,000,000.00`).
88
+ - `@object-ui/plugin-detail`: header-highlight currency formatter.
89
+ - `@object-ui/plugin-dashboard`: `ObjectMetricWidget` inferred
90
+ currency now resolves to `undefined` (not `'USD'`) for un-tagged
91
+ fields, so `MetricWidget`'s `isCurrency` heuristic falls through
92
+ to plain number formatting.
93
+
94
+ - d9c3bae: `RichTextField` now translates its inline hints (`Format: markdown`,
95
+ `Rich text editor (basic)`, `Enter text...`) instead of hardcoding
96
+ English. Adds `fields.richText.*` keys to the en / zh locale packs.
97
+
3
98
  ## 5.1.1
4
99
 
5
100
  ## 5.1.0
@@ -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}}";
@@ -399,6 +406,8 @@ declare const en: {
399
406
  readonly nextRecordKey: "Next record (→)";
400
407
  readonly lastRecord: "Last record (End)";
401
408
  readonly noRecords: "No records";
409
+ readonly showEmptyRelated_one: "+ {{count}} empty";
410
+ readonly showEmptyRelated_other: "+ {{count}} empty";
402
411
  readonly searchWhileNavigating: "Search while navigating";
403
412
  readonly searchRecords: "Search records…";
404
413
  readonly allActivity: "All Activity";
@@ -907,6 +916,9 @@ declare const en: {
907
916
  readonly commandPalette: {
908
917
  readonly placeholder: "Type a command or search...";
909
918
  readonly noResults: "No results found.";
919
+ readonly searching: "Searching…";
920
+ readonly records: "Records";
921
+ readonly recentRecords: "Recently viewed";
910
922
  readonly objects: "Objects";
911
923
  readonly dashboards: "Dashboards";
912
924
  readonly pages: "Pages";
@@ -1333,6 +1345,8 @@ declare const en: {
1333
1345
  readonly empty: {
1334
1346
  readonly objectNotFound: "Object Not Found";
1335
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.";
1336
1350
  readonly pageNotFound: "Page Not Found";
1337
1351
  readonly pageNotFoundDescription: "The page \"{{name}}\" could not be found. It may have been removed or renamed.";
1338
1352
  readonly dashboardNotFound: "Dashboard Not Found";
@@ -1438,6 +1452,9 @@ declare const en: {
1438
1452
  };
1439
1453
  readonly notifications: {
1440
1454
  readonly empty: "No notifications";
1455
+ readonly emptyUnread: "You're all caught up";
1456
+ readonly filterUnread: "Unread";
1457
+ readonly filterAll: "All";
1441
1458
  readonly markAllRead: "Mark all read";
1442
1459
  readonly viewAll: "View all notifications";
1443
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}}',
@@ -408,6 +415,8 @@ const en = {
408
415
  nextRecordKey: 'Next record (→)',
409
416
  lastRecord: 'Last record (End)',
410
417
  noRecords: 'No records',
418
+ showEmptyRelated_one: '+ {{count}} empty',
419
+ showEmptyRelated_other: '+ {{count}} empty',
411
420
  searchWhileNavigating: 'Search while navigating',
412
421
  searchRecords: 'Search records…',
413
422
  // Activity timeline
@@ -919,6 +928,9 @@ const en = {
919
928
  commandPalette: {
920
929
  placeholder: 'Type a command or search...',
921
930
  noResults: 'No results found.',
931
+ searching: 'Searching…',
932
+ records: 'Records',
933
+ recentRecords: 'Recently viewed',
922
934
  objects: 'Objects',
923
935
  dashboards: 'Dashboards',
924
936
  pages: 'Pages',
@@ -1345,6 +1357,8 @@ const en = {
1345
1357
  empty: {
1346
1358
  objectNotFound: 'Object Not Found',
1347
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.',
1348
1362
  pageNotFound: 'Page Not Found',
1349
1363
  pageNotFoundDescription: 'The page "{{name}}" could not be found. It may have been removed or renamed.',
1350
1364
  dashboardNotFound: 'Dashboard Not Found',
@@ -1450,6 +1464,9 @@ const en = {
1450
1464
  },
1451
1465
  notifications: {
1452
1466
  empty: 'No notifications',
1467
+ emptyUnread: "You're all caught up",
1468
+ filterUnread: 'Unread',
1469
+ filterAll: 'All',
1453
1470
  markAllRead: 'Mark all read',
1454
1471
  viewAll: 'View all notifications',
1455
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}}";
@@ -411,6 +418,8 @@ export declare const builtInLocales: {
411
418
  readonly nextRecordKey: "Next record (→)";
412
419
  readonly lastRecord: "Last record (End)";
413
420
  readonly noRecords: "No records";
421
+ readonly showEmptyRelated_one: "+ {{count}} empty";
422
+ readonly showEmptyRelated_other: "+ {{count}} empty";
414
423
  readonly searchWhileNavigating: "Search while navigating";
415
424
  readonly searchRecords: "Search records…";
416
425
  readonly allActivity: "All Activity";
@@ -919,6 +928,9 @@ export declare const builtInLocales: {
919
928
  readonly commandPalette: {
920
929
  readonly placeholder: "Type a command or search...";
921
930
  readonly noResults: "No results found.";
931
+ readonly searching: "Searching…";
932
+ readonly records: "Records";
933
+ readonly recentRecords: "Recently viewed";
922
934
  readonly objects: "Objects";
923
935
  readonly dashboards: "Dashboards";
924
936
  readonly pages: "Pages";
@@ -1345,6 +1357,8 @@ export declare const builtInLocales: {
1345
1357
  readonly empty: {
1346
1358
  readonly objectNotFound: "Object Not Found";
1347
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.";
1348
1362
  readonly pageNotFound: "Page Not Found";
1349
1363
  readonly pageNotFoundDescription: "The page \"{{name}}\" could not be found. It may have been removed or renamed.";
1350
1364
  readonly dashboardNotFound: "Dashboard Not Found";
@@ -1450,6 +1464,9 @@ export declare const builtInLocales: {
1450
1464
  };
1451
1465
  readonly notifications: {
1452
1466
  readonly empty: "No notifications";
1467
+ readonly emptyUnread: "You're all caught up";
1468
+ readonly filterUnread: "Unread";
1469
+ readonly filterAll: "All";
1453
1470
  readonly markAllRead: "Mark all read";
1454
1471
  readonly viewAll: "View all notifications";
1455
1472
  readonly approvalsPending: "{{count}} pending approvals";
@@ -1596,6 +1613,13 @@ export declare const builtInLocales: {
1596
1613
  readonly updateSuccess: "{{object}}更新成功";
1597
1614
  readonly deleteSuccess: "{{object}}删除成功";
1598
1615
  };
1616
+ readonly fields: {
1617
+ readonly richText: {
1618
+ readonly format: "格式: {{format}}";
1619
+ readonly basicEditorHint: "富文本编辑器(基础)";
1620
+ readonly placeholder: "请输入文字...";
1621
+ };
1622
+ };
1599
1623
  readonly table: {
1600
1624
  readonly rowsPerPage: "每页行数";
1601
1625
  readonly showing: "显示第{{from}}到{{to}}条,共{{total}}条";
@@ -1923,6 +1947,8 @@ export declare const builtInLocales: {
1923
1947
  readonly nextRecordKey: "下一条记录 (→)";
1924
1948
  readonly lastRecord: "最后一条记录 (End)";
1925
1949
  readonly noRecords: "无记录";
1950
+ readonly showEmptyRelated_one: "+ {{count}} 个为空";
1951
+ readonly showEmptyRelated_other: "+ {{count}} 个为空";
1926
1952
  readonly searchWhileNavigating: "导航时搜索";
1927
1953
  readonly searchRecords: "搜索记录…";
1928
1954
  readonly allActivity: "全部动态";
@@ -2431,6 +2457,9 @@ export declare const builtInLocales: {
2431
2457
  readonly commandPalette: {
2432
2458
  readonly placeholder: "输入命令或搜索...";
2433
2459
  readonly noResults: "未找到结果。";
2460
+ readonly searching: "搜索中…";
2461
+ readonly records: "记录";
2462
+ readonly recentRecords: "最近访问";
2434
2463
  readonly objects: "对象";
2435
2464
  readonly dashboards: "仪表盘";
2436
2465
  readonly pages: "页面";
@@ -2857,6 +2886,8 @@ export declare const builtInLocales: {
2857
2886
  readonly empty: {
2858
2887
  readonly objectNotFound: "未找到对象";
2859
2888
  readonly objectNotFoundDescription: "对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。";
2889
+ readonly recordNotFound: "未找到记录";
2890
+ readonly recordNotFoundDescription: "您查找的记录不存在或已被删除。";
2860
2891
  readonly pageNotFound: "未找到页面";
2861
2892
  readonly pageNotFoundDescription: "未找到页面 “{{name}}”,可能已被删除或重命名。";
2862
2893
  readonly dashboardNotFound: "未找到仪表板";
@@ -2962,6 +2993,9 @@ export declare const builtInLocales: {
2962
2993
  };
2963
2994
  readonly notifications: {
2964
2995
  readonly empty: "暂无通知";
2996
+ readonly emptyUnread: "已读完所有通知";
2997
+ readonly filterUnread: "未读";
2998
+ readonly filterAll: "全部";
2965
2999
  readonly markAllRead: "全部标记为已读";
2966
3000
  readonly viewAll: "查看全部通知";
2967
3001
  readonly approvalsPending: "{{count}} 条待审批";
@@ -3103,6 +3137,13 @@ export declare const builtInLocales: {
3103
3137
  readonly editDescription: "{{object}}の詳細を更新";
3104
3138
  readonly saveRecord: "レコードを保存";
3105
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
+ };
3106
3147
  readonly table: {
3107
3148
  readonly rowsPerPage: "1ページの行数";
3108
3149
  readonly showing: "{{total}}件中{{from}}〜{{to}}件を表示";
@@ -4292,6 +4333,13 @@ export declare const builtInLocales: {
4292
4333
  readonly editDescription: "{{object}} 세부 정보 업데이트";
4293
4334
  readonly saveRecord: "레코드 저장";
4294
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
+ };
4295
4343
  readonly table: {
4296
4344
  readonly rowsPerPage: "페이지당 행 수";
4297
4345
  readonly showing: "{{total}}개 중 {{from}}~{{to}} 표시";
@@ -5470,6 +5518,13 @@ export declare const builtInLocales: {
5470
5518
  readonly editDescription: "Details für {{object}} aktualisieren";
5471
5519
  readonly saveRecord: "Datensatz speichern";
5472
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
+ };
5473
5528
  readonly table: {
5474
5529
  readonly rowsPerPage: "Zeilen pro Seite";
5475
5530
  readonly showing: "{{from}} bis {{to}} von {{total}} angezeigt";
@@ -6648,6 +6703,13 @@ export declare const builtInLocales: {
6648
6703
  readonly editDescription: "Mettre à jour les détails de {{object}}";
6649
6704
  readonly saveRecord: "Enregistrer";
6650
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
+ };
6651
6713
  readonly table: {
6652
6714
  readonly rowsPerPage: "Lignes par page";
6653
6715
  readonly showing: "Affichage de {{from}} à {{to}} sur {{total}}";
@@ -7826,6 +7888,13 @@ export declare const builtInLocales: {
7826
7888
  readonly editDescription: "Actualizar detalles de {{object}}";
7827
7889
  readonly saveRecord: "Guardar registro";
7828
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
+ };
7829
7898
  readonly table: {
7830
7899
  readonly rowsPerPage: "Filas por página";
7831
7900
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -9004,6 +9073,13 @@ export declare const builtInLocales: {
9004
9073
  readonly editDescription: "Atualizar detalhes de {{object}}";
9005
9074
  readonly saveRecord: "Salvar registro";
9006
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
+ };
9007
9083
  readonly table: {
9008
9084
  readonly rowsPerPage: "Linhas por página";
9009
9085
  readonly showing: "Mostrando {{from}} a {{to}} de {{total}}";
@@ -10182,6 +10258,13 @@ export declare const builtInLocales: {
10182
10258
  readonly editDescription: "Обновить данные {{object}}";
10183
10259
  readonly saveRecord: "Сохранить запись";
10184
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
+ };
10185
10268
  readonly table: {
10186
10269
  readonly rowsPerPage: "Строк на странице";
10187
10270
  readonly showing: "Показано с {{from}} по {{to}} из {{total}}";
@@ -11371,6 +11454,13 @@ export declare const builtInLocales: {
11371
11454
  readonly editDescription: "تحديث تفاصيل {{object}}";
11372
11455
  readonly saveRecord: "حفظ السجل";
11373
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
+ };
11374
11464
  readonly table: {
11375
11465
  readonly rowsPerPage: "صفوف في الصفحة";
11376
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}}条";
@@ -399,6 +406,8 @@ declare const zh: {
399
406
  readonly nextRecordKey: "下一条记录 (→)";
400
407
  readonly lastRecord: "最后一条记录 (End)";
401
408
  readonly noRecords: "无记录";
409
+ readonly showEmptyRelated_one: "+ {{count}} 个为空";
410
+ readonly showEmptyRelated_other: "+ {{count}} 个为空";
402
411
  readonly searchWhileNavigating: "导航时搜索";
403
412
  readonly searchRecords: "搜索记录…";
404
413
  readonly allActivity: "全部动态";
@@ -907,6 +916,9 @@ declare const zh: {
907
916
  readonly commandPalette: {
908
917
  readonly placeholder: "输入命令或搜索...";
909
918
  readonly noResults: "未找到结果。";
919
+ readonly searching: "搜索中…";
920
+ readonly records: "记录";
921
+ readonly recentRecords: "最近访问";
910
922
  readonly objects: "对象";
911
923
  readonly dashboards: "仪表盘";
912
924
  readonly pages: "页面";
@@ -1333,6 +1345,8 @@ declare const zh: {
1333
1345
  readonly empty: {
1334
1346
  readonly objectNotFound: "未找到对象";
1335
1347
  readonly objectNotFoundDescription: "对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。";
1348
+ readonly recordNotFound: "未找到记录";
1349
+ readonly recordNotFoundDescription: "您查找的记录不存在或已被删除。";
1336
1350
  readonly pageNotFound: "未找到页面";
1337
1351
  readonly pageNotFoundDescription: "未找到页面 “{{name}}”,可能已被删除或重命名。";
1338
1352
  readonly dashboardNotFound: "未找到仪表板";
@@ -1438,6 +1452,9 @@ declare const zh: {
1438
1452
  };
1439
1453
  readonly notifications: {
1440
1454
  readonly empty: "暂无通知";
1455
+ readonly emptyUnread: "已读完所有通知";
1456
+ readonly filterUnread: "未读";
1457
+ readonly filterAll: "全部";
1441
1458
  readonly markAllRead: "全部标记为已读";
1442
1459
  readonly viewAll: "查看全部通知";
1443
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}}条',
@@ -408,6 +415,8 @@ const zh = {
408
415
  nextRecordKey: '下一条记录 (→)',
409
416
  lastRecord: '最后一条记录 (End)',
410
417
  noRecords: '无记录',
418
+ showEmptyRelated_one: '+ {{count}} 个为空',
419
+ showEmptyRelated_other: '+ {{count}} 个为空',
411
420
  searchWhileNavigating: '导航时搜索',
412
421
  searchRecords: '搜索记录…',
413
422
  // Activity timeline
@@ -919,6 +928,9 @@ const zh = {
919
928
  commandPalette: {
920
929
  placeholder: '输入命令或搜索...',
921
930
  noResults: '未找到结果。',
931
+ searching: '搜索中…',
932
+ records: '记录',
933
+ recentRecords: '最近访问',
922
934
  objects: '对象',
923
935
  dashboards: '仪表盘',
924
936
  pages: '页面',
@@ -1345,6 +1357,8 @@ const zh = {
1345
1357
  empty: {
1346
1358
  objectNotFound: '未找到对象',
1347
1359
  objectNotFoundDescription: '对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。',
1360
+ recordNotFound: '未找到记录',
1361
+ recordNotFoundDescription: '您查找的记录不存在或已被删除。',
1348
1362
  pageNotFound: '未找到页面',
1349
1363
  pageNotFoundDescription: '未找到页面 “{{name}}”,可能已被删除或重命名。',
1350
1364
  dashboardNotFound: '未找到仪表板',
@@ -1450,6 +1464,9 @@ const zh = {
1450
1464
  },
1451
1465
  notifications: {
1452
1466
  empty: '暂无通知',
1467
+ emptyUnread: '已读完所有通知',
1468
+ filterUnread: '未读',
1469
+ filterAll: '全部',
1453
1470
  markAllRead: '全部标记为已读',
1454
1471
  viewAll: '查看全部通知',
1455
1472
  approvalsPending: '{{count}} 条待审批',
@@ -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.1.1",
3
+ "version": "5.3.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",