@object-ui/i18n 11.3.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,56 @@
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
+
3
54
  ## 11.3.0
4
55
 
5
56
  ### Patch Changes
@@ -161,6 +161,12 @@ declare const en: {
161
161
  readonly refreshing: "Refreshing…";
162
162
  readonly openRecord: "Open record";
163
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.";
164
170
  readonly rowHeight: "Row height: {{mode}}";
165
171
  readonly empty: "Empty";
166
172
  readonly yes: "Yes";
@@ -231,6 +237,31 @@ declare const en: {
231
237
  readonly requiredMark: "*";
232
238
  readonly required: "Required";
233
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…";
234
265
  };
235
266
  };
236
267
  readonly calendar: {
@@ -305,6 +336,9 @@ declare const en: {
305
336
  readonly addGroup: "Add group field";
306
337
  readonly collapsedByDefault: "Collapsed by default";
307
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";
308
342
  };
309
343
  readonly kanban: {
310
344
  readonly addCard: "Add card";
@@ -1634,6 +1668,14 @@ declare const en: {
1634
1668
  readonly greetingEvening: "Good evening";
1635
1669
  readonly greetingNight: "Working late";
1636
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
+ };
1637
1679
  readonly open: "Open";
1638
1680
  readonly stats: {
1639
1681
  readonly apps: "Applications";
@@ -161,6 +161,12 @@ const en = {
161
161
  refreshing: 'Refreshing…',
162
162
  openRecord: 'Open record',
163
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.',
164
170
  rowHeight: 'Row height: {{mode}}',
165
171
  empty: 'Empty',
166
172
  yes: 'Yes',
@@ -231,6 +237,31 @@ const en = {
231
237
  requiredMark: '*',
232
238
  required: 'Required',
233
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',
234
265
  },
235
266
  },
236
267
  calendar: {
@@ -305,6 +336,9 @@ const en = {
305
336
  addGroup: 'Add group field',
306
337
  collapsedByDefault: 'Collapsed by default',
307
338
  removeGroup: 'Remove',
339
+ inlineEditShort: 'Edit inline',
340
+ inlineEditLabel: 'Edit records inline (click a cell to edit)',
341
+ recordEditingTitle: 'Record editing',
308
342
  },
309
343
  kanban: {
310
344
  addCard: 'Add card',
@@ -1650,6 +1684,14 @@ const en = {
1650
1684
  greetingEvening: 'Good evening',
1651
1685
  greetingNight: 'Working late',
1652
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
+ },
1653
1695
  open: 'Open',
1654
1696
  stats: {
1655
1697
  apps: 'Applications',
@@ -173,6 +173,12 @@ export declare const builtInLocales: {
173
173
  readonly refreshing: "Refreshing…";
174
174
  readonly openRecord: "Open record";
175
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.";
176
182
  readonly rowHeight: "Row height: {{mode}}";
177
183
  readonly empty: "Empty";
178
184
  readonly yes: "Yes";
@@ -243,6 +249,31 @@ export declare const builtInLocales: {
243
249
  readonly requiredMark: "*";
244
250
  readonly required: "Required";
245
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…";
246
277
  };
247
278
  };
248
279
  readonly calendar: {
@@ -317,6 +348,9 @@ export declare const builtInLocales: {
317
348
  readonly addGroup: "Add group field";
318
349
  readonly collapsedByDefault: "Collapsed by default";
319
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";
320
354
  };
321
355
  readonly kanban: {
322
356
  readonly addCard: "Add card";
@@ -1646,6 +1680,14 @@ export declare const builtInLocales: {
1646
1680
  readonly greetingEvening: "Good evening";
1647
1681
  readonly greetingNight: "Working late";
1648
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
+ };
1649
1691
  readonly open: "Open";
1650
1692
  readonly stats: {
1651
1693
  readonly apps: "Applications";
@@ -2475,6 +2517,12 @@ export declare const builtInLocales: {
2475
2517
  readonly refreshing: "刷新中…";
2476
2518
  readonly openRecord: "打开记录";
2477
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}} 项匹配记录。";
2478
2526
  readonly rowHeight: "行高: {{mode}}";
2479
2527
  readonly empty: "空";
2480
2528
  readonly yes: "是";
@@ -2545,6 +2593,98 @@ export declare const builtInLocales: {
2545
2593
  readonly requiredMark: "*";
2546
2594
  readonly required: "必填";
2547
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: "加载中…";
2548
2688
  };
2549
2689
  };
2550
2690
  readonly calendar: {
@@ -2619,6 +2759,9 @@ export declare const builtInLocales: {
2619
2759
  readonly addGroup: "添加分组字段";
2620
2760
  readonly collapsedByDefault: "默认折叠";
2621
2761
  readonly removeGroup: "删除";
2762
+ readonly inlineEditShort: "行内编辑";
2763
+ readonly inlineEditLabel: "行内编辑记录(点击单元格进行编辑)";
2764
+ readonly recordEditingTitle: "记录编辑";
2622
2765
  };
2623
2766
  readonly kanban: {
2624
2767
  readonly addCard: "添加卡片";
@@ -3958,6 +4101,14 @@ export declare const builtInLocales: {
3958
4101
  readonly greetingEvening: "晚上好";
3959
4102
  readonly greetingNight: "夜深了";
3960
4103
  readonly heroTagline: "从上次离开的地方继续,或者探索新的内容。";
4104
+ readonly build: {
4105
+ readonly title: "构建应用";
4106
+ readonly subtitle: "从零开始 — 设计对象、表单、自动化与界面。";
4107
+ };
4108
+ readonly template: {
4109
+ readonly title: "从模板开始";
4110
+ readonly subtitle: "从应用市场安装模板应用并按需定制。";
4111
+ };
3961
4112
  readonly open: "打开";
3962
4113
  readonly stats: {
3963
4114
  readonly apps: "应用";
@@ -161,6 +161,12 @@ declare const zh: {
161
161
  readonly refreshing: "刷新中…";
162
162
  readonly openRecord: "打开记录";
163
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}} 项匹配记录。";
164
170
  readonly rowHeight: "行高: {{mode}}";
165
171
  readonly empty: "空";
166
172
  readonly yes: "是";
@@ -231,6 +237,98 @@ declare const zh: {
231
237
  readonly requiredMark: "*";
232
238
  readonly required: "必填";
233
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: "加载中…";
234
332
  };
235
333
  };
236
334
  readonly calendar: {
@@ -305,6 +403,9 @@ declare const zh: {
305
403
  readonly addGroup: "添加分组字段";
306
404
  readonly collapsedByDefault: "默认折叠";
307
405
  readonly removeGroup: "删除";
406
+ readonly inlineEditShort: "行内编辑";
407
+ readonly inlineEditLabel: "行内编辑记录(点击单元格进行编辑)";
408
+ readonly recordEditingTitle: "记录编辑";
308
409
  };
309
410
  readonly kanban: {
310
411
  readonly addCard: "添加卡片";
@@ -1644,6 +1745,14 @@ declare const zh: {
1644
1745
  readonly greetingEvening: "晚上好";
1645
1746
  readonly greetingNight: "夜深了";
1646
1747
  readonly heroTagline: "从上次离开的地方继续,或者探索新的内容。";
1748
+ readonly build: {
1749
+ readonly title: "构建应用";
1750
+ readonly subtitle: "从零开始 — 设计对象、表单、自动化与界面。";
1751
+ };
1752
+ readonly template: {
1753
+ readonly title: "从模板开始";
1754
+ readonly subtitle: "从应用市场安装模板应用并按需定制。";
1755
+ };
1647
1756
  readonly open: "打开";
1648
1757
  readonly stats: {
1649
1758
  readonly apps: "应用";
@@ -161,6 +161,12 @@ const zh = {
161
161
  refreshing: '刷新中…',
162
162
  openRecord: '打开记录',
163
163
  openMenu: '更多操作',
164
+ bulkSelected: '已选择 {{count}} 项',
165
+ bulkSelectedAllMatches: '已选择全部 {{count}} 项(全部匹配)',
166
+ bulkClear: '清除',
167
+ bulkAllOnPage: '本页 {{count}} 项已全选。',
168
+ bulkSelectAllMatching: '选择全部 {{count}} 项匹配记录',
169
+ bulkAllMatchingSelected: '已选择全部 {{count}} 项匹配记录。',
164
170
  rowHeight: '行高: {{mode}}',
165
171
  empty: '空',
166
172
  yes: '是',
@@ -231,6 +237,107 @@ const zh = {
231
237
  requiredMark: '*',
232
238
  required: '必填',
233
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: '加载中…',
234
341
  },
235
342
  },
236
343
  calendar: {
@@ -305,6 +412,9 @@ const zh = {
305
412
  addGroup: '添加分组字段',
306
413
  collapsedByDefault: '默认折叠',
307
414
  removeGroup: '删除',
415
+ inlineEditShort: '行内编辑',
416
+ inlineEditLabel: '行内编辑记录(点击单元格进行编辑)',
417
+ recordEditingTitle: '记录编辑',
308
418
  },
309
419
  kanban: {
310
420
  addCard: '添加卡片',
@@ -1665,6 +1775,14 @@ const zh = {
1665
1775
  greetingEvening: '晚上好',
1666
1776
  greetingNight: '夜深了',
1667
1777
  heroTagline: '从上次离开的地方继续,或者探索新的内容。',
1778
+ build: {
1779
+ title: '构建应用',
1780
+ subtitle: '从零开始 — 设计对象、表单、自动化与界面。',
1781
+ },
1782
+ template: {
1783
+ title: '从模板开始',
1784
+ subtitle: '从应用市场安装模板应用并按需定制。',
1785
+ },
1668
1786
  open: '打开',
1669
1787
  stats: {
1670
1788
  apps: '应用',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/i18n",
3
- "version": "11.3.0",
3
+ "version": "11.4.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",