@object-ui/i18n 11.2.0 → 11.4.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,70 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 11.4.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 9cd9be1: fix(plugin-grid): make the import wizard's preview step readable — wider columns + friendlier validation errors
8
+
9
+ Two problems on the import wizard's 预览 (preview) step:
10
+
11
+ - **Cramped preview table.** With many mapped columns crammed into the fixed
12
+ dialog width, each header collapsed to one character per line (`关联排班计划`
13
+ stacked vertically) and became unreadable. Columns now get a `min-width` and
14
+ headers no longer wrap, so the preview area scrolls horizontally instead of
15
+ crushing every column.
16
+
17
+ - **Unreadable dry-run error messages.** A reference cell that couldn't resolve
18
+ rendered as `第 1 行: product: product: no os_tianshun_ehr_product matches "导管架"`
19
+ — the field named twice, an internal object api-name leaking through, all in
20
+ English. The server already tags each failure with a structured `code`, so we
21
+ now drive the message off that code (localized, with the offending value),
22
+ resolve the field's api-name to its label, and only fall back to the raw
23
+ server text — minus the duplicated prefix — for unrecognized codes. The same
24
+ row now reads `第 1 行: 产品:找不到匹配 "导管架" 的记录`.
25
+
26
+ - 790558b: fix(studio): make the Automations and Interfaces pillars authorable in a fresh package
27
+
28
+ Dogfooding a brand-new package end-to-end (design objects → automations →
29
+ interfaces → publish → use) surfaced two blocking dead-ends in the pillar
30
+ Studio, both now fixed:
31
+
32
+ - **Automations pillar had no way to create a flow.** For a package with zero
33
+ flows the rail rendered an endless "加载中…" (loading conflated with empty)
34
+ and offered no create affordance, so automations could never be authored.
35
+ It now tracks the list-loaded state (real empty state "还没有自动化 — 点「新建」开始")
36
+ and has a "+ 新建" inline creator that saves a minimal, valid `start → end`
37
+ autolaunched flow skeleton as a draft and opens it in the flow designer.
38
+
39
+ - **Interfaces nav items could not be bound to a target — and silently failed
40
+ to save.** Selecting a nav item showed no inspector, and the item shape the
41
+ editor produced (`{ label, object }`, no `id`/`type`) failed the app spec's
42
+ navigation union ("navigation.N: Invalid input"), so the draft never
43
+ persisted and the published app navigation stayed empty. The right panel now
44
+ renders a `StudioNavItemInspector` with a business-friendly object picker
45
+ (populated from the package's published ∪ draft objects) that emits a
46
+ spec-valid `ObjectNavItem` (`{ id, type:'object', objectName, label }`), and
47
+ the nav save drops still-unbound placeholders + backfills a snake_case id so
48
+ one blank item can't fail the whole save.
49
+
50
+ Also fills in the Home builder-cover i18n keys (`home.build.*`,
51
+ `home.template.*`) in `en`/`zh` so the "Build an app" / "Start with a template"
52
+ cards resolve real strings instead of falling back to defaults.
53
+
54
+ ## 11.3.0
55
+
56
+ ### Patch Changes
57
+
58
+ - d88c8ec: fix(data-table): surface inline-edit save failures instead of swallowing them
59
+
60
+ A rejected inline-edit save (e.g. a 400 validation failure like an invalid
61
+ status transition) was caught with only `console.error` — the toolbar stayed
62
+ stuck, the cell kept the unsaved value, and the author got no feedback. Now the
63
+ data-table shows the server's reason in the toolbar (with an alert icon) and
64
+ tints the affected row(s) destructive so it's clear which rows didn't persist.
65
+ The pending edit is kept for retry; the error clears on a successful save or on
66
+ cancel. Adds the `table.saveFailed` string across all locales.
67
+
3
68
  ## 11.2.0
4
69
 
5
70
  ## 11.1.0
@@ -137,6 +137,7 @@ declare const ar: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const ar = {
137
137
  open: "فتح",
138
138
  search: "بحث...",
139
139
  modified: "{{count}} صف(صفوف) معدّل(ة)",
140
+ saveFailed: 'فشل الحفظ',
140
141
  selected: "{{count}} محدد(ة)",
141
142
  edit: "تعديل",
142
143
  delete: "حذف",
@@ -137,6 +137,7 @@ declare const de: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const de = {
137
137
  open: "Öffnen",
138
138
  search: "Suchen...",
139
139
  modified: "{{count}} Zeile geändert",
140
+ saveFailed: 'Speichern fehlgeschlagen',
140
141
  selected: "{{count}} ausgewählt",
141
142
  edit: "Bearbeiten",
142
143
  delete: "Löschen",
@@ -144,6 +144,7 @@ declare const en: {
144
144
  readonly open: "Open";
145
145
  readonly search: "Search...";
146
146
  readonly modified: "{{count}} row modified";
147
+ readonly saveFailed: "Save failed";
147
148
  readonly selected: "{{count}} selected";
148
149
  readonly edit: "Edit";
149
150
  readonly delete: "Delete";
@@ -160,6 +161,12 @@ declare const en: {
160
161
  readonly refreshing: "Refreshing…";
161
162
  readonly openRecord: "Open record";
162
163
  readonly openMenu: "Open menu";
164
+ readonly bulkSelected: "{{count}} selected";
165
+ readonly bulkSelectedAllMatches: "{{count}} selected (all matches)";
166
+ readonly bulkClear: "Clear";
167
+ readonly bulkAllOnPage: "All {{count}} on this page are selected.";
168
+ readonly bulkSelectAllMatching: "Select all {{count}} matching";
169
+ readonly bulkAllMatchingSelected: "All {{count}} matching records are selected.";
163
170
  readonly rowHeight: "Row height: {{mode}}";
164
171
  readonly empty: "Empty";
165
172
  readonly yes: "Yes";
@@ -230,6 +237,31 @@ declare const en: {
230
237
  readonly requiredMark: "*";
231
238
  readonly required: "Required";
232
239
  readonly invalidType: "Invalid {{type}}";
240
+ readonly legacyReferenceBlocked: "Import blocked: {{fields}} are relation fields that need the server import route to resolve names into record IDs, and this connection doesn’t support it. Importing them as plain text would corrupt the data. Upgrade the backend/client, or unmap these columns and import them separately.";
241
+ };
242
+ readonly bulk: {
243
+ readonly confirmDefault: "This will apply to {{count}} record(s).";
244
+ readonly overLimit: "Selection ({{count}}) exceeds the action limit ({{limit}}). Reduce the selection to proceed.";
245
+ readonly affectedRecords: "Affected records ({{count}}):";
246
+ readonly rowFallback: "Row {{index}}";
247
+ readonly andMore: "… and {{count}} more";
248
+ readonly processed: "{{count}} / {{total}} processed";
249
+ readonly processedFailed: " · {{count}} failed";
250
+ readonly undonePrefix: "Undone — ";
251
+ readonly succeeded: "Succeeded {{count}} / {{total}}";
252
+ readonly resultFailed: " · Failed {{count}}";
253
+ readonly retry: "Retry";
254
+ readonly downloadErrorCsv: "Download error CSV";
255
+ readonly cancel: "Cancel";
256
+ readonly back: "Back";
257
+ readonly next: "Next";
258
+ readonly run: "Run";
259
+ readonly running: "Running…";
260
+ readonly undo: "Undo";
261
+ readonly undoing: "Undoing…";
262
+ readonly done: "Done";
263
+ readonly selectPlaceholder: "Select…";
264
+ readonly loading: "Loading…";
233
265
  };
234
266
  };
235
267
  readonly calendar: {
@@ -304,6 +336,9 @@ declare const en: {
304
336
  readonly addGroup: "Add group field";
305
337
  readonly collapsedByDefault: "Collapsed by default";
306
338
  readonly removeGroup: "Remove";
339
+ readonly inlineEditShort: "Edit inline";
340
+ readonly inlineEditLabel: "Edit records inline (click a cell to edit)";
341
+ readonly recordEditingTitle: "Record editing";
307
342
  };
308
343
  readonly kanban: {
309
344
  readonly addCard: "Add card";
@@ -1633,6 +1668,14 @@ declare const en: {
1633
1668
  readonly greetingEvening: "Good evening";
1634
1669
  readonly greetingNight: "Working late";
1635
1670
  readonly heroTagline: "Pick up where you left off, or explore something new.";
1671
+ readonly build: {
1672
+ readonly title: "Build an app";
1673
+ readonly subtitle: "Start from scratch — design objects, forms, automations and interfaces.";
1674
+ };
1675
+ readonly template: {
1676
+ readonly title: "Start with a template";
1677
+ readonly subtitle: "Install a template app from the marketplace and customize it.";
1678
+ };
1636
1679
  readonly open: "Open";
1637
1680
  readonly stats: {
1638
1681
  readonly apps: "Applications";
@@ -144,6 +144,7 @@ const en = {
144
144
  open: 'Open',
145
145
  search: 'Search...',
146
146
  modified: '{{count}} row modified',
147
+ saveFailed: 'Save failed',
147
148
  selected: '{{count}} selected',
148
149
  edit: 'Edit',
149
150
  delete: 'Delete',
@@ -160,6 +161,12 @@ const en = {
160
161
  refreshing: 'Refreshing…',
161
162
  openRecord: 'Open record',
162
163
  openMenu: 'Open menu',
164
+ bulkSelected: '{{count}} selected',
165
+ bulkSelectedAllMatches: '{{count}} selected (all matches)',
166
+ bulkClear: 'Clear',
167
+ bulkAllOnPage: 'All {{count}} on this page are selected.',
168
+ bulkSelectAllMatching: 'Select all {{count}} matching',
169
+ bulkAllMatchingSelected: 'All {{count}} matching records are selected.',
163
170
  rowHeight: 'Row height: {{mode}}',
164
171
  empty: 'Empty',
165
172
  yes: 'Yes',
@@ -230,6 +237,31 @@ const en = {
230
237
  requiredMark: '*',
231
238
  required: 'Required',
232
239
  invalidType: 'Invalid {{type}}',
240
+ legacyReferenceBlocked: 'Import blocked: {{fields}} are relation fields that need the server import route to resolve names into record IDs, and this connection doesn\u2019t support it. Importing them as plain text would corrupt the data. Upgrade the backend/client, or unmap these columns and import them separately.',
241
+ },
242
+ bulk: {
243
+ confirmDefault: 'This will apply to {{count}} record(s).',
244
+ overLimit: 'Selection ({{count}}) exceeds the action limit ({{limit}}). Reduce the selection to proceed.',
245
+ affectedRecords: 'Affected records ({{count}}):',
246
+ rowFallback: 'Row {{index}}',
247
+ andMore: '\u2026 and {{count}} more',
248
+ processed: '{{count}} / {{total}} processed',
249
+ processedFailed: ' \u00b7 {{count}} failed',
250
+ undonePrefix: 'Undone \u2014 ',
251
+ succeeded: 'Succeeded {{count}} / {{total}}',
252
+ resultFailed: ' \u00b7 Failed {{count}}',
253
+ retry: 'Retry',
254
+ downloadErrorCsv: 'Download error CSV',
255
+ cancel: 'Cancel',
256
+ back: 'Back',
257
+ next: 'Next',
258
+ run: 'Run',
259
+ running: 'Running\u2026',
260
+ undo: 'Undo',
261
+ undoing: 'Undoing\u2026',
262
+ done: 'Done',
263
+ selectPlaceholder: 'Select\u2026',
264
+ loading: 'Loading\u2026',
233
265
  },
234
266
  },
235
267
  calendar: {
@@ -304,6 +336,9 @@ const en = {
304
336
  addGroup: 'Add group field',
305
337
  collapsedByDefault: 'Collapsed by default',
306
338
  removeGroup: 'Remove',
339
+ inlineEditShort: 'Edit inline',
340
+ inlineEditLabel: 'Edit records inline (click a cell to edit)',
341
+ recordEditingTitle: 'Record editing',
307
342
  },
308
343
  kanban: {
309
344
  addCard: 'Add card',
@@ -1649,6 +1684,14 @@ const en = {
1649
1684
  greetingEvening: 'Good evening',
1650
1685
  greetingNight: 'Working late',
1651
1686
  heroTagline: 'Pick up where you left off, or explore something new.',
1687
+ build: {
1688
+ title: 'Build an app',
1689
+ subtitle: 'Start from scratch — design objects, forms, automations and interfaces.',
1690
+ },
1691
+ template: {
1692
+ title: 'Start with a template',
1693
+ subtitle: 'Install a template app from the marketplace and customize it.',
1694
+ },
1652
1695
  open: 'Open',
1653
1696
  stats: {
1654
1697
  apps: 'Applications',
@@ -137,6 +137,7 @@ declare const es: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const es = {
137
137
  open: "Abrir",
138
138
  search: "Buscar...",
139
139
  modified: "{{count}} filas modificadas",
140
+ saveFailed: 'Error al guardar',
140
141
  selected: "{{count}} seleccionados",
141
142
  edit: "Editar",
142
143
  delete: "Eliminar",
@@ -137,6 +137,7 @@ declare const fr: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const fr = {
137
137
  open: "Ouvrir",
138
138
  search: "Rechercher...",
139
139
  modified: "{{count}} ligne(s) modifiée(s)",
140
+ saveFailed: 'Échec de l’enregistrement',
140
141
  selected: "{{count}} sélectionné(s)",
141
142
  edit: "Modifier",
142
143
  delete: "Supprimer",
@@ -156,6 +156,7 @@ export declare const builtInLocales: {
156
156
  readonly open: "Open";
157
157
  readonly search: "Search...";
158
158
  readonly modified: "{{count}} row modified";
159
+ readonly saveFailed: "Save failed";
159
160
  readonly selected: "{{count}} selected";
160
161
  readonly edit: "Edit";
161
162
  readonly delete: "Delete";
@@ -172,6 +173,12 @@ export declare const builtInLocales: {
172
173
  readonly refreshing: "Refreshing…";
173
174
  readonly openRecord: "Open record";
174
175
  readonly openMenu: "Open menu";
176
+ readonly bulkSelected: "{{count}} selected";
177
+ readonly bulkSelectedAllMatches: "{{count}} selected (all matches)";
178
+ readonly bulkClear: "Clear";
179
+ readonly bulkAllOnPage: "All {{count}} on this page are selected.";
180
+ readonly bulkSelectAllMatching: "Select all {{count}} matching";
181
+ readonly bulkAllMatchingSelected: "All {{count}} matching records are selected.";
175
182
  readonly rowHeight: "Row height: {{mode}}";
176
183
  readonly empty: "Empty";
177
184
  readonly yes: "Yes";
@@ -242,6 +249,31 @@ export declare const builtInLocales: {
242
249
  readonly requiredMark: "*";
243
250
  readonly required: "Required";
244
251
  readonly invalidType: "Invalid {{type}}";
252
+ readonly legacyReferenceBlocked: "Import blocked: {{fields}} are relation fields that need the server import route to resolve names into record IDs, and this connection doesn’t support it. Importing them as plain text would corrupt the data. Upgrade the backend/client, or unmap these columns and import them separately.";
253
+ };
254
+ readonly bulk: {
255
+ readonly confirmDefault: "This will apply to {{count}} record(s).";
256
+ readonly overLimit: "Selection ({{count}}) exceeds the action limit ({{limit}}). Reduce the selection to proceed.";
257
+ readonly affectedRecords: "Affected records ({{count}}):";
258
+ readonly rowFallback: "Row {{index}}";
259
+ readonly andMore: "… and {{count}} more";
260
+ readonly processed: "{{count}} / {{total}} processed";
261
+ readonly processedFailed: " · {{count}} failed";
262
+ readonly undonePrefix: "Undone — ";
263
+ readonly succeeded: "Succeeded {{count}} / {{total}}";
264
+ readonly resultFailed: " · Failed {{count}}";
265
+ readonly retry: "Retry";
266
+ readonly downloadErrorCsv: "Download error CSV";
267
+ readonly cancel: "Cancel";
268
+ readonly back: "Back";
269
+ readonly next: "Next";
270
+ readonly run: "Run";
271
+ readonly running: "Running…";
272
+ readonly undo: "Undo";
273
+ readonly undoing: "Undoing…";
274
+ readonly done: "Done";
275
+ readonly selectPlaceholder: "Select…";
276
+ readonly loading: "Loading…";
245
277
  };
246
278
  };
247
279
  readonly calendar: {
@@ -316,6 +348,9 @@ export declare const builtInLocales: {
316
348
  readonly addGroup: "Add group field";
317
349
  readonly collapsedByDefault: "Collapsed by default";
318
350
  readonly removeGroup: "Remove";
351
+ readonly inlineEditShort: "Edit inline";
352
+ readonly inlineEditLabel: "Edit records inline (click a cell to edit)";
353
+ readonly recordEditingTitle: "Record editing";
319
354
  };
320
355
  readonly kanban: {
321
356
  readonly addCard: "Add card";
@@ -1645,6 +1680,14 @@ export declare const builtInLocales: {
1645
1680
  readonly greetingEvening: "Good evening";
1646
1681
  readonly greetingNight: "Working late";
1647
1682
  readonly heroTagline: "Pick up where you left off, or explore something new.";
1683
+ readonly build: {
1684
+ readonly title: "Build an app";
1685
+ readonly subtitle: "Start from scratch — design objects, forms, automations and interfaces.";
1686
+ };
1687
+ readonly template: {
1688
+ readonly title: "Start with a template";
1689
+ readonly subtitle: "Install a template app from the marketplace and customize it.";
1690
+ };
1648
1691
  readonly open: "Open";
1649
1692
  readonly stats: {
1650
1693
  readonly apps: "Applications";
@@ -2457,6 +2500,7 @@ export declare const builtInLocales: {
2457
2500
  readonly open: "打开";
2458
2501
  readonly search: "搜索...";
2459
2502
  readonly modified: "{{count}} 行已修改";
2503
+ readonly saveFailed: "保存失败";
2460
2504
  readonly selected: "已选择 {{count}} 项";
2461
2505
  readonly edit: "编辑";
2462
2506
  readonly delete: "删除";
@@ -2473,6 +2517,12 @@ export declare const builtInLocales: {
2473
2517
  readonly refreshing: "刷新中…";
2474
2518
  readonly openRecord: "打开记录";
2475
2519
  readonly openMenu: "更多操作";
2520
+ readonly bulkSelected: "已选择 {{count}} 项";
2521
+ readonly bulkSelectedAllMatches: "已选择全部 {{count}} 项(全部匹配)";
2522
+ readonly bulkClear: "清除";
2523
+ readonly bulkAllOnPage: "本页 {{count}} 项已全选。";
2524
+ readonly bulkSelectAllMatching: "选择全部 {{count}} 项匹配记录";
2525
+ readonly bulkAllMatchingSelected: "已选择全部 {{count}} 项匹配记录。";
2476
2526
  readonly rowHeight: "行高: {{mode}}";
2477
2527
  readonly empty: "空";
2478
2528
  readonly yes: "是";
@@ -2543,6 +2593,98 @@ export declare const builtInLocales: {
2543
2593
  readonly requiredMark: "*";
2544
2594
  readonly required: "必填";
2545
2595
  readonly invalidType: "{{type}} 格式无效";
2596
+ readonly legacyReferenceBlocked: "导入已阻止:{{fields}} 是关联字段,需要服务端导入接口把名称解析为记录 ID,而当前连接不支持。按纯文本导入会写坏数据。请升级后端/客户端,或取消这些列的映射后再导入。";
2597
+ readonly autoMatched: "自动匹配";
2598
+ readonly autoMatchedSummary: "已自动匹配 {{count}} 列 — 请在下方检查并调整。";
2599
+ readonly confidence: {
2600
+ readonly high: "高置信度";
2601
+ readonly medium: "中置信度";
2602
+ readonly low: "低置信度";
2603
+ };
2604
+ readonly downloadTemplate: "下载模板";
2605
+ readonly downloadTemplateHint: "获取带正确列的 CSV(必填字段标 *)。";
2606
+ readonly validate: "校验数据";
2607
+ readonly validateHint: "导入前在服务端逐行校验。";
2608
+ readonly validating: "校验中…";
2609
+ readonly validatePassed: "全部 {{ok}} 行均有效。";
2610
+ readonly validateFailed: "{{ok}} 条有效,{{errors}} 条有错误。";
2611
+ readonly errorCount: "{{count}} 个错误";
2612
+ readonly errorRowPrefix: "第 {{row}} 行:";
2613
+ readonly referenceNotFound: "找不到匹配 \"{{value}}\" 的记录";
2614
+ readonly referenceAmbiguous: "\"{{value}}\" 匹配到多条记录,请使用唯一值或记录 ID";
2615
+ readonly options: "导入选项";
2616
+ readonly writeMode: "当某行匹配到已有记录时";
2617
+ readonly writeModeOpt: {
2618
+ readonly insert: "始终新建";
2619
+ readonly update: "更新已有(无匹配则跳过)";
2620
+ readonly upsert: "匹配则更新,否则新建";
2621
+ };
2622
+ readonly matchFields: "匹配字段";
2623
+ readonly matchFieldsPlaceholder: "选择匹配字段…";
2624
+ readonly matchFieldsHint: "按这些字段将行匹配到已有记录。";
2625
+ readonly needMatchFields: "请至少选择一个匹配字段。";
2626
+ readonly optRunAutomations: "运行自动化与触发器";
2627
+ readonly optCreateOptions: "保留未知选项值";
2628
+ readonly optSkipBlankKey: "跳过匹配值为空的行";
2629
+ readonly optBackground: "后台导入";
2630
+ readonly optBackgroundHint: "(作为可撤销任务运行)";
2631
+ readonly createdCount: "新建 {{count}} 条";
2632
+ readonly updatedCount: "更新 {{count}} 条";
2633
+ readonly resultsTruncated: "显示前 {{count}} 行结果(共 {{total}} 行)。";
2634
+ readonly downloadFailed: "下载失败行";
2635
+ readonly cancelImport: "取消导入";
2636
+ readonly importCancelled: "导入已取消";
2637
+ readonly largeSampleNotice: "正在预览前 {{shown}}/{{total}} 行。";
2638
+ readonly asyncLargeHint: "文件较大,将在后台导入。";
2639
+ readonly asyncQueued: "已排队 — 正在准备导入…";
2640
+ readonly asyncProcessing: "正在导入第 {{processed}}/{{total}} 行… {{progress}}%";
2641
+ readonly history: "历史";
2642
+ readonly historyBack: "返回导入";
2643
+ readonly historyDescription: "此对象的近期导入记录。";
2644
+ readonly historyHint: "后台导入任务,最新在前。";
2645
+ readonly historyRefresh: "刷新";
2646
+ readonly historyLoading: "加载中…";
2647
+ readonly historyEmpty: "暂无导入记录。";
2648
+ readonly historyUnsupported: "此数据源不支持导入历史。";
2649
+ readonly historyColStatus: "状态";
2650
+ readonly historyColRows: "行数";
2651
+ readonly historyColResult: "结果";
2652
+ readonly historyColTime: "时间";
2653
+ readonly jobStatus: {
2654
+ readonly pending: "等待中";
2655
+ readonly running: "进行中";
2656
+ readonly succeeded: "成功";
2657
+ readonly failed: "失败";
2658
+ readonly cancelled: "已取消";
2659
+ };
2660
+ readonly undoImport: "撤销导入";
2661
+ readonly undoing: "撤销中…";
2662
+ readonly reverted: "已撤销";
2663
+ readonly undoConfirm: "撤销此次导入?它新建的记录将被删除,它更新的记录将恢复为之前的值。";
2664
+ };
2665
+ readonly bulk: {
2666
+ readonly confirmDefault: "此操作将应用于 {{count}} 条记录。";
2667
+ readonly overLimit: "所选记录({{count}})超过该动作的上限({{limit}})。请减少选择后再继续。";
2668
+ readonly affectedRecords: "受影响的记录({{count}}):";
2669
+ readonly rowFallback: "第 {{index}} 行";
2670
+ readonly andMore: "……以及另外 {{count}} 条";
2671
+ readonly processed: "已处理 {{count}} / {{total}}";
2672
+ readonly processedFailed: " · {{count}} 条失败";
2673
+ readonly undonePrefix: "已撤销 — ";
2674
+ readonly succeeded: "成功 {{count}} / {{total}}";
2675
+ readonly resultFailed: " · 失败 {{count}}";
2676
+ readonly retry: "重试";
2677
+ readonly downloadErrorCsv: "下载错误 CSV";
2678
+ readonly cancel: "取消";
2679
+ readonly back: "上一步";
2680
+ readonly next: "下一步";
2681
+ readonly run: "执行";
2682
+ readonly running: "执行中…";
2683
+ readonly undo: "撤销";
2684
+ readonly undoing: "撤销中…";
2685
+ readonly done: "完成";
2686
+ readonly selectPlaceholder: "请选择…";
2687
+ readonly loading: "加载中…";
2546
2688
  };
2547
2689
  };
2548
2690
  readonly calendar: {
@@ -2617,6 +2759,9 @@ export declare const builtInLocales: {
2617
2759
  readonly addGroup: "添加分组字段";
2618
2760
  readonly collapsedByDefault: "默认折叠";
2619
2761
  readonly removeGroup: "删除";
2762
+ readonly inlineEditShort: "行内编辑";
2763
+ readonly inlineEditLabel: "行内编辑记录(点击单元格进行编辑)";
2764
+ readonly recordEditingTitle: "记录编辑";
2620
2765
  };
2621
2766
  readonly kanban: {
2622
2767
  readonly addCard: "添加卡片";
@@ -3956,6 +4101,14 @@ export declare const builtInLocales: {
3956
4101
  readonly greetingEvening: "晚上好";
3957
4102
  readonly greetingNight: "夜深了";
3958
4103
  readonly heroTagline: "从上次离开的地方继续,或者探索新的内容。";
4104
+ readonly build: {
4105
+ readonly title: "构建应用";
4106
+ readonly subtitle: "从零开始 — 设计对象、表单、自动化与界面。";
4107
+ };
4108
+ readonly template: {
4109
+ readonly title: "从模板开始";
4110
+ readonly subtitle: "从应用市场安装模板应用并按需定制。";
4111
+ };
3959
4112
  readonly open: "打开";
3960
4113
  readonly stats: {
3961
4114
  readonly apps: "应用";
@@ -4764,6 +4917,7 @@ export declare const builtInLocales: {
4764
4917
  open: string;
4765
4918
  search: string;
4766
4919
  modified: string;
4920
+ saveFailed: string;
4767
4921
  selected: string;
4768
4922
  edit: string;
4769
4923
  delete: string;
@@ -6799,6 +6953,7 @@ export declare const builtInLocales: {
6799
6953
  open: string;
6800
6954
  search: string;
6801
6955
  modified: string;
6956
+ saveFailed: string;
6802
6957
  selected: string;
6803
6958
  edit: string;
6804
6959
  delete: string;
@@ -8834,6 +8989,7 @@ export declare const builtInLocales: {
8834
8989
  open: string;
8835
8990
  search: string;
8836
8991
  modified: string;
8992
+ saveFailed: string;
8837
8993
  selected: string;
8838
8994
  edit: string;
8839
8995
  delete: string;
@@ -10869,6 +11025,7 @@ export declare const builtInLocales: {
10869
11025
  open: string;
10870
11026
  search: string;
10871
11027
  modified: string;
11028
+ saveFailed: string;
10872
11029
  selected: string;
10873
11030
  edit: string;
10874
11031
  delete: string;
@@ -12904,6 +13061,7 @@ export declare const builtInLocales: {
12904
13061
  open: string;
12905
13062
  search: string;
12906
13063
  modified: string;
13064
+ saveFailed: string;
12907
13065
  selected: string;
12908
13066
  edit: string;
12909
13067
  delete: string;
@@ -14939,6 +15097,7 @@ export declare const builtInLocales: {
14939
15097
  open: string;
14940
15098
  search: string;
14941
15099
  modified: string;
15100
+ saveFailed: string;
14942
15101
  selected: string;
14943
15102
  edit: string;
14944
15103
  delete: string;
@@ -16974,6 +17133,7 @@ export declare const builtInLocales: {
16974
17133
  open: string;
16975
17134
  search: string;
16976
17135
  modified: string;
17136
+ saveFailed: string;
16977
17137
  selected: string;
16978
17138
  edit: string;
16979
17139
  delete: string;
@@ -19009,6 +19169,7 @@ export declare const builtInLocales: {
19009
19169
  open: string;
19010
19170
  search: string;
19011
19171
  modified: string;
19172
+ saveFailed: string;
19012
19173
  selected: string;
19013
19174
  edit: string;
19014
19175
  delete: string;
@@ -137,6 +137,7 @@ declare const ja: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const ja = {
137
137
  open: "開く",
138
138
  search: "検索...",
139
139
  modified: "{{count}} 行が変更されました",
140
+ saveFailed: '保存に失敗しました',
140
141
  selected: "{{count}} 件選択中",
141
142
  edit: "編集",
142
143
  delete: "削除",
@@ -137,6 +137,7 @@ declare const ko: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const ko = {
137
137
  open: "열기",
138
138
  search: "검색...",
139
139
  modified: "{{count}}개 행 수정됨",
140
+ saveFailed: '저장 실패',
140
141
  selected: "{{count}}개 선택됨",
141
142
  edit: "편집",
142
143
  delete: "삭제",
@@ -137,6 +137,7 @@ declare const pt: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const pt = {
137
137
  open: "Abrir",
138
138
  search: "Pesquisar...",
139
139
  modified: "{{count}} linha(s) modificada(s)",
140
+ saveFailed: 'Falha ao salvar',
140
141
  selected: "{{count}} selecionado(s)",
141
142
  edit: "Editar",
142
143
  delete: "Excluir",
@@ -137,6 +137,7 @@ declare const ru: {
137
137
  open: string;
138
138
  search: string;
139
139
  modified: string;
140
+ saveFailed: string;
140
141
  selected: string;
141
142
  edit: string;
142
143
  delete: string;
@@ -137,6 +137,7 @@ const ru = {
137
137
  open: "Открыть",
138
138
  search: "Поиск...",
139
139
  modified: "{{count}} строк изменено",
140
+ saveFailed: 'Не удалось сохранить',
140
141
  selected: "{{count}} выбрано",
141
142
  edit: "Редактировать",
142
143
  delete: "Удалить",
@@ -144,6 +144,7 @@ declare const zh: {
144
144
  readonly open: "打开";
145
145
  readonly search: "搜索...";
146
146
  readonly modified: "{{count}} 行已修改";
147
+ readonly saveFailed: "保存失败";
147
148
  readonly selected: "已选择 {{count}} 项";
148
149
  readonly edit: "编辑";
149
150
  readonly delete: "删除";
@@ -160,6 +161,12 @@ declare const zh: {
160
161
  readonly refreshing: "刷新中…";
161
162
  readonly openRecord: "打开记录";
162
163
  readonly openMenu: "更多操作";
164
+ readonly bulkSelected: "已选择 {{count}} 项";
165
+ readonly bulkSelectedAllMatches: "已选择全部 {{count}} 项(全部匹配)";
166
+ readonly bulkClear: "清除";
167
+ readonly bulkAllOnPage: "本页 {{count}} 项已全选。";
168
+ readonly bulkSelectAllMatching: "选择全部 {{count}} 项匹配记录";
169
+ readonly bulkAllMatchingSelected: "已选择全部 {{count}} 项匹配记录。";
163
170
  readonly rowHeight: "行高: {{mode}}";
164
171
  readonly empty: "空";
165
172
  readonly yes: "是";
@@ -230,6 +237,98 @@ declare const zh: {
230
237
  readonly requiredMark: "*";
231
238
  readonly required: "必填";
232
239
  readonly invalidType: "{{type}} 格式无效";
240
+ readonly legacyReferenceBlocked: "导入已阻止:{{fields}} 是关联字段,需要服务端导入接口把名称解析为记录 ID,而当前连接不支持。按纯文本导入会写坏数据。请升级后端/客户端,或取消这些列的映射后再导入。";
241
+ readonly autoMatched: "自动匹配";
242
+ readonly autoMatchedSummary: "已自动匹配 {{count}} 列 — 请在下方检查并调整。";
243
+ readonly confidence: {
244
+ readonly high: "高置信度";
245
+ readonly medium: "中置信度";
246
+ readonly low: "低置信度";
247
+ };
248
+ readonly downloadTemplate: "下载模板";
249
+ readonly downloadTemplateHint: "获取带正确列的 CSV(必填字段标 *)。";
250
+ readonly validate: "校验数据";
251
+ readonly validateHint: "导入前在服务端逐行校验。";
252
+ readonly validating: "校验中…";
253
+ readonly validatePassed: "全部 {{ok}} 行均有效。";
254
+ readonly validateFailed: "{{ok}} 条有效,{{errors}} 条有错误。";
255
+ readonly errorCount: "{{count}} 个错误";
256
+ readonly errorRowPrefix: "第 {{row}} 行:";
257
+ readonly referenceNotFound: "找不到匹配 \"{{value}}\" 的记录";
258
+ readonly referenceAmbiguous: "\"{{value}}\" 匹配到多条记录,请使用唯一值或记录 ID";
259
+ readonly options: "导入选项";
260
+ readonly writeMode: "当某行匹配到已有记录时";
261
+ readonly writeModeOpt: {
262
+ readonly insert: "始终新建";
263
+ readonly update: "更新已有(无匹配则跳过)";
264
+ readonly upsert: "匹配则更新,否则新建";
265
+ };
266
+ readonly matchFields: "匹配字段";
267
+ readonly matchFieldsPlaceholder: "选择匹配字段…";
268
+ readonly matchFieldsHint: "按这些字段将行匹配到已有记录。";
269
+ readonly needMatchFields: "请至少选择一个匹配字段。";
270
+ readonly optRunAutomations: "运行自动化与触发器";
271
+ readonly optCreateOptions: "保留未知选项值";
272
+ readonly optSkipBlankKey: "跳过匹配值为空的行";
273
+ readonly optBackground: "后台导入";
274
+ readonly optBackgroundHint: "(作为可撤销任务运行)";
275
+ readonly createdCount: "新建 {{count}} 条";
276
+ readonly updatedCount: "更新 {{count}} 条";
277
+ readonly resultsTruncated: "显示前 {{count}} 行结果(共 {{total}} 行)。";
278
+ readonly downloadFailed: "下载失败行";
279
+ readonly cancelImport: "取消导入";
280
+ readonly importCancelled: "导入已取消";
281
+ readonly largeSampleNotice: "正在预览前 {{shown}}/{{total}} 行。";
282
+ readonly asyncLargeHint: "文件较大,将在后台导入。";
283
+ readonly asyncQueued: "已排队 — 正在准备导入…";
284
+ readonly asyncProcessing: "正在导入第 {{processed}}/{{total}} 行… {{progress}}%";
285
+ readonly history: "历史";
286
+ readonly historyBack: "返回导入";
287
+ readonly historyDescription: "此对象的近期导入记录。";
288
+ readonly historyHint: "后台导入任务,最新在前。";
289
+ readonly historyRefresh: "刷新";
290
+ readonly historyLoading: "加载中…";
291
+ readonly historyEmpty: "暂无导入记录。";
292
+ readonly historyUnsupported: "此数据源不支持导入历史。";
293
+ readonly historyColStatus: "状态";
294
+ readonly historyColRows: "行数";
295
+ readonly historyColResult: "结果";
296
+ readonly historyColTime: "时间";
297
+ readonly jobStatus: {
298
+ readonly pending: "等待中";
299
+ readonly running: "进行中";
300
+ readonly succeeded: "成功";
301
+ readonly failed: "失败";
302
+ readonly cancelled: "已取消";
303
+ };
304
+ readonly undoImport: "撤销导入";
305
+ readonly undoing: "撤销中…";
306
+ readonly reverted: "已撤销";
307
+ readonly undoConfirm: "撤销此次导入?它新建的记录将被删除,它更新的记录将恢复为之前的值。";
308
+ };
309
+ readonly bulk: {
310
+ readonly confirmDefault: "此操作将应用于 {{count}} 条记录。";
311
+ readonly overLimit: "所选记录({{count}})超过该动作的上限({{limit}})。请减少选择后再继续。";
312
+ readonly affectedRecords: "受影响的记录({{count}}):";
313
+ readonly rowFallback: "第 {{index}} 行";
314
+ readonly andMore: "……以及另外 {{count}} 条";
315
+ readonly processed: "已处理 {{count}} / {{total}}";
316
+ readonly processedFailed: " · {{count}} 条失败";
317
+ readonly undonePrefix: "已撤销 — ";
318
+ readonly succeeded: "成功 {{count}} / {{total}}";
319
+ readonly resultFailed: " · 失败 {{count}}";
320
+ readonly retry: "重试";
321
+ readonly downloadErrorCsv: "下载错误 CSV";
322
+ readonly cancel: "取消";
323
+ readonly back: "上一步";
324
+ readonly next: "下一步";
325
+ readonly run: "执行";
326
+ readonly running: "执行中…";
327
+ readonly undo: "撤销";
328
+ readonly undoing: "撤销中…";
329
+ readonly done: "完成";
330
+ readonly selectPlaceholder: "请选择…";
331
+ readonly loading: "加载中…";
233
332
  };
234
333
  };
235
334
  readonly calendar: {
@@ -304,6 +403,9 @@ declare const zh: {
304
403
  readonly addGroup: "添加分组字段";
305
404
  readonly collapsedByDefault: "默认折叠";
306
405
  readonly removeGroup: "删除";
406
+ readonly inlineEditShort: "行内编辑";
407
+ readonly inlineEditLabel: "行内编辑记录(点击单元格进行编辑)";
408
+ readonly recordEditingTitle: "记录编辑";
307
409
  };
308
410
  readonly kanban: {
309
411
  readonly addCard: "添加卡片";
@@ -1643,6 +1745,14 @@ declare const zh: {
1643
1745
  readonly greetingEvening: "晚上好";
1644
1746
  readonly greetingNight: "夜深了";
1645
1747
  readonly heroTagline: "从上次离开的地方继续,或者探索新的内容。";
1748
+ readonly build: {
1749
+ readonly title: "构建应用";
1750
+ readonly subtitle: "从零开始 — 设计对象、表单、自动化与界面。";
1751
+ };
1752
+ readonly template: {
1753
+ readonly title: "从模板开始";
1754
+ readonly subtitle: "从应用市场安装模板应用并按需定制。";
1755
+ };
1646
1756
  readonly open: "打开";
1647
1757
  readonly stats: {
1648
1758
  readonly apps: "应用";
@@ -144,6 +144,7 @@ const zh = {
144
144
  open: '打开',
145
145
  search: '搜索...',
146
146
  modified: '{{count}} 行已修改',
147
+ saveFailed: '保存失败',
147
148
  selected: '已选择 {{count}} 项',
148
149
  edit: '编辑',
149
150
  delete: '删除',
@@ -160,6 +161,12 @@ const zh = {
160
161
  refreshing: '刷新中…',
161
162
  openRecord: '打开记录',
162
163
  openMenu: '更多操作',
164
+ bulkSelected: '已选择 {{count}} 项',
165
+ bulkSelectedAllMatches: '已选择全部 {{count}} 项(全部匹配)',
166
+ bulkClear: '清除',
167
+ bulkAllOnPage: '本页 {{count}} 项已全选。',
168
+ bulkSelectAllMatching: '选择全部 {{count}} 项匹配记录',
169
+ bulkAllMatchingSelected: '已选择全部 {{count}} 项匹配记录。',
163
170
  rowHeight: '行高: {{mode}}',
164
171
  empty: '空',
165
172
  yes: '是',
@@ -230,6 +237,107 @@ const zh = {
230
237
  requiredMark: '*',
231
238
  required: '必填',
232
239
  invalidType: '{{type}} 格式无效',
240
+ legacyReferenceBlocked: '导入已阻止:{{fields}} 是关联字段,需要服务端导入接口把名称解析为记录 ID,而当前连接不支持。按纯文本导入会写坏数据。请升级后端/客户端,或取消这些列的映射后再导入。',
241
+ // 自动匹配(Airtable 风格)
242
+ autoMatched: '自动匹配',
243
+ autoMatchedSummary: '已自动匹配 {{count}} 列 — 请在下方检查并调整。',
244
+ confidence: {
245
+ high: '高置信度',
246
+ medium: '中置信度',
247
+ low: '低置信度',
248
+ },
249
+ // 下载模板
250
+ downloadTemplate: '下载模板',
251
+ downloadTemplateHint: '获取带正确列的 CSV(必填字段标 *)。',
252
+ // 校验(服务端 dryRun 预检)
253
+ validate: '校验数据',
254
+ validateHint: '导入前在服务端逐行校验。',
255
+ validating: '校验中…',
256
+ validatePassed: '全部 {{ok}} 行均有效。',
257
+ validateFailed: '{{ok}} 条有效,{{errors}} 条有错误。',
258
+ errorCount: '{{count}} 个错误',
259
+ errorRowPrefix: '第 {{row}} 行:',
260
+ // 服务端结构化导入错误的友好文案
261
+ referenceNotFound: '找不到匹配 "{{value}}" 的记录',
262
+ referenceAmbiguous: '"{{value}}" 匹配到多条记录,请使用唯一值或记录 ID',
263
+ // 导入选项 / 写入模式
264
+ options: '导入选项',
265
+ writeMode: '当某行匹配到已有记录时',
266
+ writeModeOpt: {
267
+ insert: '始终新建',
268
+ update: '更新已有(无匹配则跳过)',
269
+ upsert: '匹配则更新,否则新建',
270
+ },
271
+ matchFields: '匹配字段',
272
+ matchFieldsPlaceholder: '选择匹配字段…',
273
+ matchFieldsHint: '按这些字段将行匹配到已有记录。',
274
+ needMatchFields: '请至少选择一个匹配字段。',
275
+ optRunAutomations: '运行自动化与触发器',
276
+ optCreateOptions: '保留未知选项值',
277
+ optSkipBlankKey: '跳过匹配值为空的行',
278
+ optBackground: '后台导入',
279
+ optBackgroundHint: '(作为可撤销任务运行)',
280
+ // 结果
281
+ createdCount: '新建 {{count}} 条',
282
+ updatedCount: '更新 {{count}} 条',
283
+ resultsTruncated: '显示前 {{count}} 行结果(共 {{total}} 行)。',
284
+ downloadFailed: '下载失败行',
285
+ cancelImport: '取消导入',
286
+ importCancelled: '导入已取消',
287
+ // 大文件 / 异步导入
288
+ largeSampleNotice: '正在预览前 {{shown}}/{{total}} 行。',
289
+ asyncLargeHint: '文件较大,将在后台导入。',
290
+ asyncQueued: '已排队 — 正在准备导入…',
291
+ asyncProcessing: '正在导入第 {{processed}}/{{total}} 行… {{progress}}%',
292
+ // 导入历史
293
+ history: '历史',
294
+ historyBack: '返回导入',
295
+ historyDescription: '此对象的近期导入记录。',
296
+ historyHint: '后台导入任务,最新在前。',
297
+ historyRefresh: '刷新',
298
+ historyLoading: '加载中…',
299
+ historyEmpty: '暂无导入记录。',
300
+ historyUnsupported: '此数据源不支持导入历史。',
301
+ historyColStatus: '状态',
302
+ historyColRows: '行数',
303
+ historyColResult: '结果',
304
+ historyColTime: '时间',
305
+ jobStatus: {
306
+ pending: '等待中',
307
+ running: '进行中',
308
+ succeeded: '成功',
309
+ failed: '失败',
310
+ cancelled: '已取消',
311
+ },
312
+ // 撤销 / 逻辑回滚
313
+ undoImport: '撤销导入',
314
+ undoing: '撤销中…',
315
+ reverted: '已撤销',
316
+ undoConfirm: '撤销此次导入?它新建的记录将被删除,它更新的记录将恢复为之前的值。',
317
+ },
318
+ bulk: {
319
+ confirmDefault: '此操作将应用于 {{count}} 条记录。',
320
+ overLimit: '所选记录({{count}})超过该动作的上限({{limit}})。请减少选择后再继续。',
321
+ affectedRecords: '受影响的记录({{count}}):',
322
+ rowFallback: '第 {{index}} 行',
323
+ andMore: '……以及另外 {{count}} 条',
324
+ processed: '已处理 {{count}} / {{total}}',
325
+ processedFailed: ' · {{count}} 条失败',
326
+ undonePrefix: '已撤销 — ',
327
+ succeeded: '成功 {{count}} / {{total}}',
328
+ resultFailed: ' · 失败 {{count}}',
329
+ retry: '重试',
330
+ downloadErrorCsv: '下载错误 CSV',
331
+ cancel: '取消',
332
+ back: '上一步',
333
+ next: '下一步',
334
+ run: '执行',
335
+ running: '执行中…',
336
+ undo: '撤销',
337
+ undoing: '撤销中…',
338
+ done: '完成',
339
+ selectPlaceholder: '请选择…',
340
+ loading: '加载中…',
233
341
  },
234
342
  },
235
343
  calendar: {
@@ -304,6 +412,9 @@ const zh = {
304
412
  addGroup: '添加分组字段',
305
413
  collapsedByDefault: '默认折叠',
306
414
  removeGroup: '删除',
415
+ inlineEditShort: '行内编辑',
416
+ inlineEditLabel: '行内编辑记录(点击单元格进行编辑)',
417
+ recordEditingTitle: '记录编辑',
307
418
  },
308
419
  kanban: {
309
420
  addCard: '添加卡片',
@@ -1664,6 +1775,14 @@ const zh = {
1664
1775
  greetingEvening: '晚上好',
1665
1776
  greetingNight: '夜深了',
1666
1777
  heroTagline: '从上次离开的地方继续,或者探索新的内容。',
1778
+ build: {
1779
+ title: '构建应用',
1780
+ subtitle: '从零开始 — 设计对象、表单、自动化与界面。',
1781
+ },
1782
+ template: {
1783
+ title: '从模板开始',
1784
+ subtitle: '从应用市场安装模板应用并按需定制。',
1785
+ },
1667
1786
  open: '打开',
1668
1787
  stats: {
1669
1788
  apps: '应用',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/i18n",
3
- "version": "11.2.0",
3
+ "version": "11.4.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",
@@ -30,7 +30,7 @@
30
30
  }
31
31
  },
32
32
  "dependencies": {
33
- "i18next": "^26.3.1",
33
+ "i18next": "^26.3.3",
34
34
  "react-i18next": "^17.0.8"
35
35
  },
36
36
  "peerDependencies": {