@object-ui/i18n 17.2.0 → 17.5.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +1817 -1
  2. package/README.md +26 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +14 -1
  5. package/dist/locales/ar.d.ts +550 -107
  6. package/dist/locales/ar.js +646 -156
  7. package/dist/locales/de.d.ts +550 -107
  8. package/dist/locales/de.js +661 -178
  9. package/dist/locales/en.d.ts +586 -143
  10. package/dist/locales/en.js +851 -143
  11. package/dist/locales/es.d.ts +550 -107
  12. package/dist/locales/es.js +647 -160
  13. package/dist/locales/fr.d.ts +550 -107
  14. package/dist/locales/fr.js +640 -155
  15. package/dist/locales/index.d.ts +5587 -1157
  16. package/dist/locales/ja.d.ts +550 -107
  17. package/dist/locales/ja.js +632 -149
  18. package/dist/locales/ko.d.ts +550 -107
  19. package/dist/locales/ko.js +638 -156
  20. package/dist/locales/pt.d.ts +550 -107
  21. package/dist/locales/pt.js +639 -157
  22. package/dist/locales/ru.d.ts +550 -107
  23. package/dist/locales/ru.js +650 -156
  24. package/dist/locales/zh.d.ts +588 -145
  25. package/dist/locales/zh.js +629 -145
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +125 -1
  29. package/dist/provider.js +380 -4
  30. package/dist/useDisplayLocale.d.ts +49 -0
  31. package/dist/useDisplayLocale.js +55 -0
  32. package/dist/useObjectLabel.d.ts +8 -2
  33. package/dist/useObjectLabel.js +28 -8
  34. package/dist/useSafeTranslation.js +67 -3
  35. package/dist/utils/index.d.ts +1 -0
  36. package/dist/utils/index.js +1 -0
  37. package/dist/utils/number-display.d.ts +32 -0
  38. package/dist/utils/number-display.js +32 -0
  39. package/dist/utils/spec-formatters.d.ts +39 -13
  40. package/dist/utils/spec-formatters.js +3 -3
  41. package/package.json +5 -4
@@ -2,6 +2,20 @@
2
2
  * 中文 (zh) - Chinese language pack for Object UI
3
3
  */
4
4
  const zh = {
5
+ // objectui#4467 — the impersonation banner (app-shell ImpersonationBanner).
6
+ // Raised by `session.impersonatedBy`, so it survives SPA reboots; it names
7
+ // BOTH parties because the audit trail attributes the work to the impersonated
8
+ // user, and the exit states its own failure rather than appearing to succeed.
9
+ impersonation: {
10
+ banner: {
11
+ message: '您正在以 {{user}} 的身份操作 —— 所有操作都会记录为该用户。',
12
+ startedBy: '由管理员 {{admin}} 发起。',
13
+ stop: '结束模拟登录',
14
+ stopping: '正在结束…',
15
+ stopFailed: '无法结束模拟登录:{{reason}}',
16
+ notRestored: '服务器接受了请求,但没有恢复您的管理员会话 —— 您仍在以 {{user}} 的身份操作。请退出登录后重新登录以结束。',
17
+ },
18
+ },
5
19
  // objectui#2600 B5 — 能力选择器的作用域分组标题(能力标签本身来自
6
20
  // sys_capability 注册表,这里只本地化分组标题这类 UI 字符串)。
7
21
  capability: {
@@ -21,6 +35,28 @@ const zh = {
21
35
  studio_access: '访问 Studio',
22
36
  },
23
37
  },
38
+ // objectui#3546 切片六 —— 权限集记录上六个授权面的只读摘要与 Studio 深链
39
+ // (ADR-0056 P1,plugin-detail 的 PermissionFacetLink)。
40
+ // 用词取自本仓权限集设计器(metadata-admin i18n 表):个对象 / 行级策略 /
41
+ // 标签页 / 委派管理范围 —— 与点进去的那个界面一致。
42
+ // 中文无单复数,四个计数 key 的 `_one` 与基础 key 同值(设计如此,不是漏改)。
43
+ perm: {
44
+ facet: {
45
+ none: '无',
46
+ more: '+{{count}} 更多',
47
+ objects: '{{count}} 个对象',
48
+ objects_one: '{{count}} 个对象',
49
+ fields: '{{count}} 条字段规则',
50
+ fields_one: '{{count}} 条字段规则',
51
+ rls: '{{count}} 条 RLS 策略',
52
+ rls_one: '{{count}} 条 RLS 策略',
53
+ tabs: '{{count}} 条标签页规则',
54
+ tabs_one: '{{count}} 条标签页规则',
55
+ adminScope: '已配置委派管理范围',
56
+ designInStudio: '在 Studio 中设计 →',
57
+ designInStudioHint: '在 Studio 中设计',
58
+ },
59
+ },
24
60
  lookup: {
25
61
  recentlyUsed: '最近使用',
26
62
  allResults: '全部结果',
@@ -49,13 +85,12 @@ const zh = {
49
85
  retry: '重试',
50
86
  },
51
87
  common: {
52
- loading: '加载中...',
88
+ loading: '加载中…',
53
89
  save: '保存',
54
90
  cancel: '取消',
55
91
  delete: '删除',
56
92
  edit: '编辑',
57
93
  create: '新建',
58
- search: '搜索',
59
94
  filter: '筛选',
60
95
  reset: '重置',
61
96
  confirm: '确认',
@@ -81,11 +116,20 @@ const zh = {
81
116
  required: '必填',
82
117
  optional: '选填',
83
118
  selectOption: '请选择',
84
- select: '选择...',
119
+ select: '选择…',
85
120
  openChat: '打开聊天',
86
121
  closeChat: '关闭聊天',
122
+ closePanel: '关闭面板',
123
+ resizeDrawer: '调整面板宽度',
124
+ itemCount: '{{count}} 项',
125
+ itemCountOne: '{{count}} 项',
87
126
  toggleSidebar: '切换侧边栏',
88
127
  package: '软件包',
128
+ done: '完成',
129
+ editInStudio: '在 Studio 中编辑',
130
+ record: '记录',
131
+ retry: '重试',
132
+ printDialogHint: '打开浏览器打印对话框(不是导出 PDF)',
89
133
  },
90
134
  actions: {
91
135
  decisionOutput: {
@@ -108,6 +152,7 @@ const zh = {
108
152
  url: '请输入有效的URL',
109
153
  pattern: '{{field}}格式不正确',
110
154
  formInvalid: '请检查表单中标记的字段:{{fields}}',
155
+ formInvalidJoiner: '、',
111
156
  unique: '{{field}}必须唯一',
112
157
  type: '{{field}}必须是有效的{{type}}',
113
158
  },
@@ -123,6 +168,9 @@ const zh = {
123
168
  unsavedChanges: '您有未保存的更改,确定要离开吗?',
124
169
  discardTitle: '放弃更改?',
125
170
  discardMessage: '您有未保存的更改。如果现在关闭此表单,您的编辑将会丢失。',
171
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
172
+ // description, used when the form declares no `description` of its own.
173
+ dialogDescriptionFallback: '填写表单字段,然后提交或取消。',
126
174
  keepEditing: '继续编辑',
127
175
  discard: '放弃',
128
176
  conflictTitle: '保存冲突',
@@ -132,12 +180,21 @@ const zh = {
132
180
  stepOf: '第{{current}}步,共{{total}}步',
133
181
  createTitle: '新建{{object}}',
134
182
  editTitle: '编辑{{object}}',
183
+ viewTitle: '查看{{object}}',
184
+ createTargetOrg: '创建到{{org}}',
135
185
  saveRecord: '保存',
136
186
  create: '创建',
137
187
  update: '更新',
138
188
  createSuccess: '{{object}}创建成功',
139
189
  updateSuccess: '{{object}}更新成功',
140
190
  deleteSuccess: '{{object}}删除成功',
191
+ fullscreen: {
192
+ title: '编辑文本',
193
+ description: '编辑完整的文本内容,然后保存或取消更改。',
194
+ done: '完成',
195
+ toggle: '全屏编辑{{label}}',
196
+ textFallback: '文本',
197
+ },
141
198
  },
142
199
  fields: {
143
200
  relativeDate: {
@@ -175,7 +232,11 @@ const zh = {
175
232
  richText: {
176
233
  format: '格式: {{format}}',
177
234
  basicEditorHint: '富文本编辑器(基础)',
178
- placeholder: '请输入文字...',
235
+ placeholder: '请输入文字…',
236
+ },
237
+ options: {
238
+ empty: '暂无可选项',
239
+ selectFirst: '请先选择{{fields}}',
179
240
  },
180
241
  objectRef: {
181
242
  loading: '正在加载对象…',
@@ -204,6 +265,13 @@ const zh = {
204
265
  editAsJson: '以 JSON 编辑',
205
266
  useVisualBuilder: '使用可视化构建器',
206
267
  },
268
+ tags: {
269
+ placeholder: '输入后回车添加…',
270
+ },
271
+ textarea: {
272
+ characterCount: '已输入 {{count}} 个字符,最多 {{max}} 个',
273
+ charactersRemaining: '还可输入 {{count}} 个字符',
274
+ },
207
275
  },
208
276
  table: {
209
277
  rowsPerPage: '每页行数',
@@ -230,7 +298,7 @@ const zh = {
230
298
  saveAll: '全部保存 ({{count}})',
231
299
  addRecord: '添加记录',
232
300
  open: '打开',
233
- search: '搜索...',
301
+ search: '搜索…',
234
302
  modified: '{{count}} 行已修改',
235
303
  saveFailed: '保存失败',
236
304
  selected: '已选择 {{count}} 项',
@@ -243,7 +311,7 @@ const zh = {
243
311
  delete: '删除',
244
312
  export: '导出',
245
313
  exportAs: '导出为 {{format}}',
246
- loading: '加载数据中...',
314
+ loading: '加载数据中…',
247
315
  errorLoading: '数据加载失败',
248
316
  pullToRefresh: '下拉刷新',
249
317
  refreshing: '刷新中…',
@@ -260,6 +328,22 @@ const zh = {
260
328
  yes: '是',
261
329
  no: '否',
262
330
  systemFields: '系统字段',
331
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
332
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
333
+ // pack controls its own separator and word order.
334
+ summary: {
335
+ pattern: '{{label}}:{{value}}',
336
+ count: '计数',
337
+ countEmpty: '空值',
338
+ countFilled: '非空',
339
+ countUnique: '去重',
340
+ percentEmpty: '空值',
341
+ percentFilled: '非空',
342
+ sum: '合计',
343
+ avg: '平均值',
344
+ min: '最小值',
345
+ max: '最大值',
346
+ },
263
347
  toolbar: {
264
348
  densityMode: '密度',
265
349
  densityCompact: '紧凑',
@@ -460,7 +544,7 @@ const zh = {
460
544
  moreEvents: '+{{count}} 更多',
461
545
  },
462
546
  list: {
463
- loading: '正在加载记录...',
547
+ loading: '正在加载记录…',
464
548
  recordCount: '{{count}} 条记录',
465
549
  recordCountOne: '{{count}} 条记录',
466
550
  addRecord: '添加记录',
@@ -472,7 +556,8 @@ const zh = {
472
556
  sort: '排序',
473
557
  sortRecords: '排序记录',
474
558
  sortByIdSuffix: '(按 ID)',
475
- sortRelationalHint: '指向其他记录的列未列出:它们只能按存储的 ID 排序,而不是单元格中显示的名称。若要按该名称排序,请添加一个存放该名称的公式字段。',
559
+ sortRelationalHint: '指向其他记录的列未列出:它们只能按存储的 ID 排序,而不是单元格中显示的名称。若要按该名称排序,请把该名称反规范化到本对象上,做成一个在来源变更时写入的存储字段,再按它排序。不要用公式字段:公式字段是虚拟的,不会为它存储任何列,服务端会拒绝按它排序。',
560
+ resetSortToDefault: '恢复视图默认排序',
476
561
  group: '分组',
477
562
  groupBy: '分组依据',
478
563
  export: '导出',
@@ -497,6 +582,8 @@ const zh = {
497
582
  loadErrorUnauthorizedMessage: '登录状态已过期或已退出。请重新登录后查看这些记录。',
498
583
  loadErrorRejectedTitle: '该视图的查询被拒绝',
499
584
  loadErrorRejectedMessage: '服务器无法处理该视图的筛选条件或查询参数。清除筛选条件通常即可恢复;如果视图本身就是这样保存的,需要管理员修正。',
585
+ loadErrorApiDisabledTitle: '该对象未开放 API 访问',
586
+ loadErrorApiDisabledMessage: '此页面无法加载记录,因为该对象未通过 API 开放。这是对象自身的设置,而不是权限问题 —— 需要管理员为其启用 API 访问,此页面才能正常工作。',
500
587
  retry: '重试',
501
588
  managedBy: {
502
589
  system: {
@@ -571,8 +658,11 @@ const zh = {
571
658
  deleteCard: '删除卡片',
572
659
  deleteColumn: '删除列',
573
660
  noCards: '暂无卡片',
574
- cardTitlePlaceholder: '输入卡片标题...',
661
+ cardTitlePlaceholder: '输入卡片标题…',
575
662
  uncategorized: '未分类',
663
+ columns: '列',
664
+ requiredFieldsTitle: '填写必填字段',
665
+ requiredFieldsDescription: '此次移动会使以下字段成为必填项。填写后即可继续。',
576
666
  },
577
667
  timeline: {
578
668
  bucket: {
@@ -585,6 +675,13 @@ const zh = {
585
675
  noDate: '无日期',
586
676
  unassigned: '未分配',
587
677
  },
678
+ scale: {
679
+ week: '第 {{n}} 周',
680
+ quarter: '{{year}}年第{{quarter}}季度',
681
+ },
682
+ gantt: {
683
+ rowLabel: '条目',
684
+ },
588
685
  },
589
686
  gantt: {
590
687
  column: {
@@ -611,6 +708,7 @@ const zh = {
611
708
  exportPng: '导出 PNG',
612
709
  exportPdf: '导出 PDF',
613
710
  saveLayout: '保存布局',
711
+ refresh: '刷新',
614
712
  undo: '撤销',
615
713
  redo: '重做',
616
714
  },
@@ -658,6 +756,18 @@ const zh = {
658
756
  ff: '完成 → 完成',
659
757
  sf: '开始 → 完成',
660
758
  },
759
+ linkEnd: {
760
+ start: '开始',
761
+ end: '结束',
762
+ },
763
+ link: {
764
+ rejected: {
765
+ self: "任务不能依赖自身。",
766
+ locked: "该行已锁定,无法新增依赖。",
767
+ group: "汇总行不能作为依赖目标,请改为连接其下的具体任务。",
768
+ cycle: "该连接会形成循环依赖。",
769
+ },
770
+ },
661
771
  conflict: {
662
772
  title: '排程冲突',
663
773
  body: '此次移动与依赖约束冲突。是否自动重新排程 {{count}} 个受影响的任务?',
@@ -666,8 +776,8 @@ const zh = {
666
776
  },
667
777
  autoScheduleDlg: {
668
778
  title: '自动排程',
669
- body: '将顺延 {count} 个任务以满足依赖约束,是否执行?',
670
- skipped: '另有 {count} 项因锁定/无权限跳过。',
779
+ body: '将顺延 {{count}} 个任务以满足依赖约束,是否执行?',
780
+ skipped: '另有 {{count}} 项因锁定/无权限跳过。',
671
781
  confirm: '执行',
672
782
  cancel: '取消',
673
783
  none: '依赖均满足,无需排程',
@@ -678,6 +788,12 @@ const zh = {
678
788
  over: '超载',
679
789
  empty: '没有可分配的任务。',
680
790
  },
791
+ quickFilter: {
792
+ all: '全部',
793
+ clear: '清除筛选',
794
+ empty: '无可选项',
795
+ resultSummary: '显示 {shown} / {total} 项任务',
796
+ },
681
797
  readOnly: '只读',
682
798
  readOnlyHint: '此视图已禁用编辑。',
683
799
  lockedHint: '无编辑权限',
@@ -714,8 +830,8 @@ const zh = {
714
830
  readonlyTooltip: '系统视图 — 由代码定义,只读。',
715
831
  },
716
832
  designer: {
717
- undo: 'Undo',
718
- redo: 'Redo',
833
+ undo: '撤销',
834
+ redo: '重做',
719
835
  },
720
836
  detail: {
721
837
  back: '返回',
@@ -728,14 +844,15 @@ const zh = {
728
844
  editInlineHint: '双击编辑',
729
845
  lockedByApproval: '审批中已锁定',
730
846
  lockedTooltip: '该记录有待审批的请求,编辑已被锁定',
731
- writeStrippedTitle: '部分字段未保存',
732
- writeStrippedReadonly: '以下字段为只读,未保存:{{fields}}',
733
- writeStrippedByState: '以下字段在记录当前状态下不可编辑,未保存:{{fields}}',
847
+ writeStrippedTitle: '已保存,但部分字段未生效',
848
+ writeStrippedReadonly: '以下字段为只读,未生效:{{fields}}',
849
+ writeStrippedByState: '以下字段在记录当前状态下不可编辑,未生效:{{fields}}',
734
850
  approvalPendingEditable: '审批中 · 可编辑',
735
851
  approvalPendingTooltip: '该记录有待审批的请求,但当前审批节点仍允许编辑',
736
852
  approvalProgress: '审批 — 已通过 {{got}} / 共需 {{need}}',
737
853
  approvalProgressGroups: '会签 — 已完成 {{got}} / 共 {{need}} 个组',
738
854
  approvalProgressLabel: '审批进度',
855
+ approvalsPanelTitle: '审批',
739
856
  cancelApproval: '撤回审批',
740
857
  cancelApprovalInFlight: '撤回中…',
741
858
  cancelApprovalTooltip: '撤回当前的待审批请求以解除记录锁定',
@@ -757,6 +874,7 @@ const zh = {
757
874
  concurrentUpdateReload: '加载最新',
758
875
  concurrentUpdateOverwrite: '仍然覆盖',
759
876
  concurrentUpdateCancel: '取消',
877
+ concurrentUpdateRecordLabel: '此记录',
760
878
  openInNewTab: '在新标签页打开',
761
879
  share: '分享',
762
880
  duplicate: '复制',
@@ -764,6 +882,15 @@ const zh = {
764
882
  viewHistory: '查看历史',
765
883
  delete: '删除',
766
884
  moreActions: '更多操作',
885
+ addReaction: '添加表情回应',
886
+ pageHeaderActions: '页面标题栏操作',
887
+ emojiPicker: '表情选择器',
888
+ reactionCount: '{{emoji}} {{count}} 个回应',
889
+ reactionCountOne: '{{emoji}} {{count}} 个回应',
890
+ recordDetail: '记录详情',
891
+ recordDetailWithLabel: '{{label}}详情',
892
+ openAsFullPage: '以完整页面打开',
893
+ recordDetailOverlay: '{{title}} 的记录详情浮层。',
767
894
  addToFavorites: '添加到收藏',
768
895
  removeFromFavorites: '从收藏中移除',
769
896
  previousRecord: '上一条记录',
@@ -777,16 +904,19 @@ const zh = {
777
904
  relatedRecords: '{{count}} 条记录',
778
905
  relatedRecordOne: '{{count}} 条记录',
779
906
  noRelatedRecords: '暂无相关记录',
780
- loading: '加载中...',
907
+ loading: '加载中…',
781
908
  copyToClipboard: '复制到剪贴板',
782
909
  copied: '已复制!',
783
910
  deleteConfirmation: '确定要删除此记录吗?',
911
+ deleted: '记录已删除',
784
912
  editRecord: '编辑记录',
785
913
  viewAll: '查看全部',
786
914
  new: '新建',
915
+ add: '添加',
787
916
  emptyValue: '—',
788
917
  activity: '活动',
789
918
  history: '历史',
919
+ historyEmpty: '暂无历史记录',
790
920
  editRow: '编辑',
791
921
  deleteRow: '删除',
792
922
  deleteRowConfirmation: '确定要删除此记录吗?',
@@ -796,7 +926,7 @@ const zh = {
796
926
  nextPage: '下一页',
797
927
  pageOf: '第 {{current}} 页,共 {{total}} 页',
798
928
  sortBy: '排序',
799
- filterPlaceholder: '筛选...',
929
+ filterPlaceholder: '筛选…',
800
930
  highlightFields: '关键字段',
801
931
  // Comments
802
932
  comments: '评论',
@@ -867,6 +997,9 @@ const zh = {
867
997
  nextRecordKey: '下一条记录 (→)',
868
998
  lastRecord: '最后一条记录 (End)',
869
999
  noRecords: '无记录',
1000
+ // objectui#3863 — base key. zh has a single plural category (`other`), so this
1001
+ // slot is unreachable here and equals `_other` for key-set parity.
1002
+ showEmptyRelated: '+ {{count}} 个为空',
870
1003
  showEmptyRelated_one: '+ {{count}} 个为空',
871
1004
  showEmptyRelated_other: '+ {{count}} 个为空',
872
1005
  searchWhileNavigating: '导航时搜索',
@@ -881,6 +1014,7 @@ const zh = {
881
1014
  loadMore: '加载更多',
882
1015
  edited: '(已编辑)',
883
1016
  via: '通过 {{source}}',
1017
+ viewSource: '查看来源',
884
1018
  // Replies
885
1019
  replyCount: '{{count}} 条回复',
886
1020
  replyCountPlural: '{{count}} 条回复',
@@ -901,7 +1035,8 @@ const zh = {
901
1035
  },
902
1036
  chart: {
903
1037
  noData: '暂无图表数据',
904
- loading: '图表加载中...',
1038
+ loading: '图表加载中…',
1039
+ nullCategory: '(未指定)',
905
1040
  },
906
1041
  report: {
907
1042
  total: '总计',
@@ -926,111 +1061,7 @@ const zh = {
926
1061
  first: '首个',
927
1062
  },
928
1063
  editor: {
929
- breadcrumb: '配置',
930
- basic: '基础',
931
- title: '标题',
932
- titlePlaceholder: '例如:按季度的销售管道',
933
- description: '描述',
934
- descriptionPlaceholder: '此报表展示什么?',
935
- type: '报表类型',
936
- typeTabular: '表格 — 平铺列表',
937
- typeSummary: '汇总 — 分组带合计',
938
- typeMatrix: '矩阵 — 行列透视',
939
- typeJoined: '拼接 — 多块组合',
940
- typeHelp: '选择最贴合需求的布局方式。',
941
- data: '数据',
942
- objectName: '数据源',
943
- objectNamePlaceholder: '例如:opportunity',
944
- objectNameHelp: '此报表应查询哪个对象?',
945
- limit: '行数上限',
946
- limitPlaceholder: '例如:100',
947
- columns: '列',
948
- columnsHint: '选择要展示的字段。汇总或矩阵报表可添加聚合(求和、计数…)。',
949
- filters: '筛选',
950
- filtersHint: '限定参与报表的数据行。',
951
- filtersComplex: '此报表使用了高级筛选条件,此处无法编辑。保存时将原样保留。',
952
- groupBy: '分组',
953
- groupByHint: '按字段分组并计算小计。',
954
- rows: '行',
955
- rowsHint: '按这些字段对行分组。',
956
- columnsAxis: '列',
957
- columnsAxisHint: '将这些字段透视到顶部。',
958
- values: '度量',
959
- valuesHint: '每个单元格里展示的数字。选择一个或多个字段并设置聚合方式(求和、计数…)。',
960
- grouping: '分组',
961
- addGrouping: '添加分组',
962
- dateGranularity: '日期粒度',
963
- dateGranularityNone: '(使用原始值)',
964
- day: '日',
965
- week: '周',
966
- month: '月',
967
- quarter: '季度',
968
- year: '年',
969
- sortAsc: '升序',
970
- sortDesc: '降序',
971
- chart: '图表',
972
- chartHint: '在表格旁可选展示的可视化。',
973
- chartType: '图表类型',
974
- chartTitle: '图表标题',
975
- chartTitlePlaceholder: '默认使用报表标题',
976
- chartXAxis: 'X 轴(类别)',
977
- chartYAxis: 'Y 轴(数值)',
978
- chartShowLegend: '显示图例',
979
- chartShowDataLabels: '显示数据标签',
980
- chartNone: '(无图表)',
981
- chartBar: '柱状图',
982
- chartLine: '折线图',
983
- chartArea: '面积图',
984
- chartPie: '饼图',
985
- chartDonut: '环形图',
986
- chartFunnel: '漏斗图',
987
- validationNeedsObject: '请先选择数据源,再添加列。',
988
- validationMatrixNeedsRowsCols: '矩阵报表至少需要一个行字段和一个列字段。',
989
- validationSummaryNeedsRows: '汇总报表至少需要一个分组字段。',
990
- blocks: '区块',
991
- blocksHint: '每个区块都是独立的表格或图表。区块筛选会与报表筛选合并(AND)。',
992
- addBlock: '添加区块',
993
- removeBlock: '删除区块',
994
- blockName: '区块名称',
995
- blockNamePlaceholder: '唯一的区块名',
996
- blockLabel: '显示标题',
997
- blockLabelPlaceholder: '显示在区块上方',
998
- blockDescription: '说明',
999
- blockDescriptionPlaceholder: '该区块的可选说明',
1000
- validationJoinedNeedsBlocks: '组合报表至少需要一个区块。',
1001
- validationBlockNameRequired: '每个区块都必须有非空的名称。',
1002
- validationBlockNameDuplicate: '区块名称在报表内必须唯一。',
1003
- validationBlockNeedsColumns: '每个区块至少需要一列。',
1004
- noneOption: '(无)',
1005
- addCondition: '添加条件',
1006
- combineLogic: '组合方式',
1007
- opContains: '包含',
1008
- opIsEmpty: '为空',
1009
- opIsNotEmpty: '不为空',
1010
- formatAuto: '自动',
1011
- formatCurrency: '货币',
1012
- formatPercent: '百分比',
1013
- formatInteger: '整数',
1014
- formatDate: '日期',
1015
- formatDatetime: '日期 + 时间',
1016
- columnLabelPlaceholder: '自定义标签',
1017
- aggregateColumn: '聚合',
1018
- formatColumn: '格式',
1019
- addColumns: '添加字段',
1020
- searchFields: '搜索字段…',
1021
- noMatchingFields: '没有匹配的字段。',
1022
- noFieldsAvailable: '暂无可用字段。',
1023
- columnsCount: '已选择 {n} 个列',
1024
- columnsEmpty: '尚未选择任何列。',
1025
- fieldPickerTitle: '选择字段',
1026
- fieldPickerDescription: '可选择一个或多个字段添加到报表,输入关键字可快速筛选。',
1027
- fieldPickerChangeTitle: '更换字段',
1028
- fieldPickerAddGroupingTitle: '添加分组',
1029
- fieldPickerEmpty: '(请选择字段)',
1030
- fieldPickerSelected: '已选 {n} 个',
1031
- fieldPickerClear: '清空选择',
1032
- fieldPickerAdd: '添加',
1033
- fieldPickerAddN: '添加 {n} 个',
1064
+ panelTitle: '编辑报表',
1034
1065
  },
1035
1066
  },
1036
1067
  map: {
@@ -1053,8 +1084,8 @@ const zh = {
1053
1084
  properties: '属性',
1054
1085
  connections: '连接',
1055
1086
  quickConnect: '快速连接',
1056
- fromPlaceholder: '从...',
1057
- toPlaceholder: '到...',
1087
+ fromPlaceholder: '从…',
1088
+ toPlaceholder: '到…',
1058
1089
  connect: '连接',
1059
1090
  label: '标签',
1060
1091
  type: '类型',
@@ -1110,6 +1141,7 @@ const zh = {
1110
1141
  noDataAvailable: '暂无数据',
1111
1142
  noDataSourceFor: '没有可用的数据源:',
1112
1143
  noRows: '暂无数据行',
1144
+ loading: '加载中…',
1113
1145
  pickMeasures: '请为该数据集组件选择度量(值)。',
1114
1146
  datasetUnsupported: '当前数据源不支持数据集查询。',
1115
1147
  details: '明细',
@@ -1359,8 +1391,9 @@ const zh = {
1359
1391
  },
1360
1392
  },
1361
1393
  console: {
1394
+ saveAdvisoryTitle: '已保存 — 编辑检查提出了 {{count}} 条建议',
1362
1395
  title: 'ObjectStack 控制台',
1363
- initializing: '正在初始化应用程序...',
1396
+ initializing: '正在初始化应用程序…',
1364
1397
  search: '搜索…',
1365
1398
  breadcrumb: {
1366
1399
  dashboards: '仪表盘',
@@ -1391,6 +1424,31 @@ const zh = {
1391
1424
  Other: '其他',
1392
1425
  },
1393
1426
  },
1427
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1428
+ // `settingsHub` above already resolved through this pack; the view was the
1429
+ // one file still carrying English literals.
1430
+ settingsView: {
1431
+ backToHub: '全部设置',
1432
+ back: '返回',
1433
+ noNamespace: '未选择命名空间。',
1434
+ loadError: '加载设置失败',
1435
+ saved: '设置已保存',
1436
+ saveFailed: '保存失败',
1437
+ lockedByEnv: '已被环境变量锁定:{{key}}',
1438
+ lockedByEnvNoKey: '已被环境变量锁定',
1439
+ actionSucceeded: '操作成功',
1440
+ actionFailed: '操作失败',
1441
+ discard: '放弃',
1442
+ saveChanges: '保存更改',
1443
+ unsavedCount: '{{count}} 项未保存的更改',
1444
+ unsavedCount_one: '{{count}} 项未保存的更改',
1445
+ unsavedCount_other: '{{count}} 项未保存的更改',
1446
+ cryptoRefusalTitle: '此部署无法加密机密信息',
1447
+ cryptoRefusalSubjectSuffix: '被声明为加密字段,因此未写入任何内容。',
1448
+ cryptoRefusalNoSubject: '声明为加密的值被拒绝,因此未写入任何内容。',
1449
+ cryptoRefusalToast: '无法加密机密信息:{{subject}}',
1450
+ cryptoRefusalToastNoSubject: '无法加密机密信息',
1451
+ },
1394
1452
  loadingSteps: {
1395
1453
  connecting: '正在连接数据源',
1396
1454
  loadingConfig: '正在加载配置',
@@ -1407,6 +1465,13 @@ const zh = {
1407
1465
  retry: '重试',
1408
1466
  retrying: '正在重试…',
1409
1467
  },
1468
+ serverAction: {
1469
+ openingTitle: '正在打开…',
1470
+ openingBody: '正在打开…可能需要一点时间。',
1471
+ popupBlockedTitle: '浏览器拦截了弹窗',
1472
+ popupBlockedDescription: '浏览器阻止了新标签页的打开。',
1473
+ popupBlockedAction: '在新标签页打开',
1474
+ },
1410
1475
  shortcuts: {
1411
1476
  title: '键盘快捷键',
1412
1477
  description: '所有可用键盘快捷键的快速参考。',
@@ -1414,6 +1479,7 @@ const zh = {
1414
1479
  general: '通用',
1415
1480
  navigation: '导航',
1416
1481
  dataViews: '数据视图',
1482
+ aiChat: 'AI 助手',
1417
1483
  preferences: '偏好设置',
1418
1484
  },
1419
1485
  openCommandPalette: '打开命令面板',
@@ -1424,11 +1490,13 @@ const zh = {
1424
1490
  createRecord: '新建记录',
1425
1491
  refreshData: '刷新数据',
1426
1492
  editRecord: '编辑选中记录',
1493
+ newChat: '新建对话',
1494
+ toggleChatsList: '切换对话列表',
1427
1495
  toggleDarkMode: '切换深色模式',
1428
1496
  },
1429
1497
  commandPalette: {
1430
1498
  title: '命令面板',
1431
- placeholder: '输入命令或搜索...',
1499
+ placeholder: '输入命令或搜索…',
1432
1500
  noResults: '未找到结果。',
1433
1501
  searching: '搜索中…',
1434
1502
  records: '记录',
@@ -1470,7 +1538,7 @@ const zh = {
1470
1538
  shareTitle: '分享此对话',
1471
1539
  shareDisabledTitle: '开始对话后即可分享',
1472
1540
  newChat: '新对话',
1473
- searchChats: '搜索对话...',
1541
+ searchChats: '搜索对话…',
1474
1542
  noChatsYet: '暂无对话',
1475
1543
  noChatsDescription: '开始新的对话后会显示在这里。',
1476
1544
  noMatchingChats: '没有匹配的对话。',
@@ -1479,18 +1547,18 @@ const zh = {
1479
1547
  deleteConversation: '删除对话',
1480
1548
  saveRename: '保存重命名',
1481
1549
  cancelRename: '取消重命名',
1482
- loadingHistory: '正在加载对话历史...',
1550
+ loadingHistory: '正在加载对话历史…',
1483
1551
  conversationReady: '对话已就绪',
1484
1552
  preparingConversation: '正在准备新对话',
1485
1553
  offlineDemoMode: '离线演示模式 — 无法获取助手列表',
1486
1554
  sendFailedRateLimited: '发送过于频繁,请稍候再试。你的消息已保留在输入框中。',
1487
1555
  sendFailedGeneric: '消息发送失败,请重试。你的消息已保留在输入框中。',
1488
- askAgent: '向 {{agent}} 提问...',
1556
+ askAgent: '向 {{agent}} 提问…',
1489
1557
  assistant: '助手',
1490
1558
  liveCanvas: '草稿预览 · {{app}}',
1491
1559
  liveCanvasUnlisted: '运行预览 · {{app}}(未发布 · 仅自己可见)',
1492
- loadingAgents: '正在加载助手...',
1493
- askAnything: '输入你的问题...',
1560
+ loadingAgents: '正在加载助手…',
1561
+ askAnything: '输入你的问题…',
1494
1562
  emptyTitle: '开始对话',
1495
1563
  emptyDescription: '可以直接提问,助手会结合当前应用上下文提供帮助。',
1496
1564
  switchAssistant: '切换助手',
@@ -1605,6 +1673,57 @@ const zh = {
1605
1673
  addAutomation: '加一个自动化 —— 审批、状态流转或通知。',
1606
1674
  },
1607
1675
  },
1676
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1677
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1678
+ // conversation-list date buckets. `group.*` is the template-key family
1679
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1680
+ // ConversationGroupKey union — all five members, no wildcard.
1681
+ collapseToDock: '收起到侧边栏',
1682
+ switchApp: '切换应用',
1683
+ switchAppLabel: '按应用查看搭建对话',
1684
+ newApp: '新建应用',
1685
+ connectionWaiting: '正在等待服务器…',
1686
+ connectionStalled: '仍在处理…',
1687
+ connectionOffline: '连接已断开 — 正在重新连接…',
1688
+ designingPlan: '正在设计你的应用…',
1689
+ designingPlanHint: {
1690
+ data: '正在梳理你要跟踪的数据…',
1691
+ objects: '正在设计对象及其字段…',
1692
+ relations: '正在关联相关记录…',
1693
+ lookups: '正在设置关系与关联查找…',
1694
+ views: '正在规划界面与视图…',
1695
+ forms: '正在排布表单与列表…',
1696
+ defaults: '正在添加合理的默认值与校验…',
1697
+ dashboard: '正在勾画用于跟踪的仪表盘…',
1698
+ review: '正在复核整体结构是否自洽…',
1699
+ finalize: '正在汇总方案…',
1700
+ },
1701
+ planBuilding: '正在搭建…',
1702
+ planBuilt: '已搭建',
1703
+ planDeferred: '尚未搭建',
1704
+ planReady: '方案已就绪。现在就开始搭建,或者告诉我需要调整什么。',
1705
+ published: '已发布',
1706
+ publishFailed: '发布失败',
1707
+ unavailableTitle: 'AI 助手不可用',
1708
+ unavailableDescription: '当前部署未启用 AI 助手。其他功能一切正常。',
1709
+ unavailableError: '无法连接 AI 服务。它可能暂时离线 — 请重试,或返回首页。',
1710
+ unavailableRetry: '重试',
1711
+ unavailableHome: '返回首页',
1712
+ dock: {
1713
+ title: '助手',
1714
+ description: 'AI 助手对话',
1715
+ resize: '调整对话宽度',
1716
+ collapse: '收起对话',
1717
+ maximize: '以完整页面打开',
1718
+ open: '打开助手',
1719
+ },
1720
+ group: {
1721
+ today: '今天',
1722
+ yesterday: '昨天',
1723
+ previous7Days: '过去 7 天',
1724
+ previous30Days: '过去 30 天',
1725
+ older: '更早',
1726
+ },
1608
1727
  },
1609
1728
  errors: {
1610
1729
  somethingWentWrong: '出错了',
@@ -1613,6 +1732,12 @@ const zh = {
1613
1732
  goHome: '返回首页',
1614
1733
  errorDetails: '错误详情(仅开发模式)',
1615
1734
  },
1735
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1736
+ notFound: {
1737
+ title: '页面不存在',
1738
+ description: '你访问的链接与该应用中的任何视图都不匹配。',
1739
+ back: '返回',
1740
+ },
1616
1741
  theme: {
1617
1742
  toggle: '切换主题',
1618
1743
  light: '浅色',
@@ -1648,10 +1773,14 @@ const zh = {
1648
1773
  },
1649
1774
  objectView: {
1650
1775
  systemViewReadonly: '系统视图由代码定义,只读。',
1776
+ cannotEditMetaView: '该视图为内置视图,由代码定义,无法修改。',
1777
+ cannotDeleteMetaView: '该视图为内置视图,由代码定义,无法删除。',
1651
1778
  expandToPage: '以完整页面打开',
1652
1779
  objectNotFound: '未找到对象',
1653
1780
  objectNotFoundDescription: '对象"{{objectName}}"在当前配置中不存在。',
1654
1781
  objectNotFoundHint: '请检查您的应用导航设置或从侧边栏选择其他对象。',
1782
+ filterOrNotSavable: '该筛选条件之间使用「或」,保存到视图暂不支持这种结构。它仍会作用于当前列表 —— 取消「或」分组后才能保存到视图。',
1783
+ filterNestedNotSavable: '该筛选使用了嵌套条件分组,保存到视图不支持这种结构。请改为单层条件列表后再保存到视图。',
1655
1784
  allRecords: '所有记录',
1656
1785
  exitDesignMode: '退出设计模式',
1657
1786
  enterDesignMode: '进入设计模式',
@@ -1684,7 +1813,7 @@ const zh = {
1684
1813
  exportPrintHint: '导出格式、打印和记录数显示',
1685
1814
  showAllFields: '全部显示',
1686
1815
  hideAllFields: '全部隐藏',
1687
- searchFields: '搜索字段...',
1816
+ searchFields: '搜索字段…',
1688
1817
  title: '标题',
1689
1818
  description: '描述',
1690
1819
  data: '数据',
@@ -1763,8 +1892,8 @@ const zh = {
1763
1892
  imageField: '图片字段',
1764
1893
  imageFieldHelp: '画廊封面来自该图片或附件字段。',
1765
1894
  dateField: '日期字段',
1766
- selectField: '选择字段...',
1767
- selectOption: '选择...',
1895
+ selectField: '选择字段…',
1896
+ selectOption: '选择…',
1768
1897
  noEligibleFieldForType: '没有符合条件的字段。请先在对象上添加该类型字段。',
1769
1898
  viewTypeUnavailable: '该对象缺少所需的“{{field}}”字段。',
1770
1899
  viewTypeUnavailableShort: '当前对象不支持。',
@@ -1838,7 +1967,7 @@ const zh = {
1838
1967
  ufDropdown: '下拉菜单',
1839
1968
  ufTabs: '标签页',
1840
1969
  ufToggle: '开关',
1841
- ufAddField: '+ 添加筛选字段...',
1970
+ ufAddField: '+ 添加筛选字段…',
1842
1971
  ufNoFields: '无可用字段',
1843
1972
  ufAddTab: '+ 添加标签页',
1844
1973
  ufTabLabel: '标签',
@@ -1870,7 +1999,7 @@ const zh = {
1870
1999
  passwordPlaceholder: '输入您的密码',
1871
2000
  forgotPasswordText: '忘记密码?',
1872
2001
  submitButton: '登录',
1873
- submittingButton: '登录中...',
2002
+ submittingButton: '登录中…',
1874
2003
  noAccountText: '还没有账户?',
1875
2004
  signUpText: '注册',
1876
2005
  signingIn: '正在登录…',
@@ -1885,6 +2014,18 @@ const zh = {
1885
2014
  emailNotVerified: '请先验证您的邮箱后再登录。',
1886
2015
  oauthCallbackFailed: '单点登录未能完成——登录链接已过期或已被使用,请重新发起登录。',
1887
2016
  },
2017
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
2018
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
2019
+ emailOrPhoneLabel: '邮箱或手机号',
2020
+ emailOrPhonePlaceholder: 'name@example.com 或 +1 555 000 0000',
2021
+ phoneLabel: '手机号',
2022
+ phonePlaceholder: '+1 555 000 0000',
2023
+ otpCodeLabel: '验证码',
2024
+ otpCodePlaceholder: '6 位验证码',
2025
+ sendOtpButton: '获取验证码',
2026
+ resendOtpCountdownText: '{seconds} 秒后可重新发送',
2027
+ usePhoneOtpText: '使用验证码登录',
2028
+ usePasswordSignInText: '改用密码登录',
1888
2029
  },
1889
2030
  register: {
1890
2031
  title: '创建账户',
@@ -1900,7 +2041,7 @@ const zh = {
1900
2041
  passwordMismatchError: '两次输入的密码不一致',
1901
2042
  passwordTooShortError: '密码至少需要8个字符',
1902
2043
  submitButton: '创建账户',
1903
- submittingButton: '创建中...',
2044
+ submittingButton: '创建中…',
1904
2045
  hasAccountText: '已有账户?',
1905
2046
  signInText: '登录',
1906
2047
  errors: {
@@ -1921,12 +2062,26 @@ const zh = {
1921
2062
  emailLabel: '邮箱',
1922
2063
  emailPlaceholder: 'name@example.com',
1923
2064
  submitButton: '发送重置链接',
1924
- submittingButton: '发送中...',
2065
+ submittingButton: '发送中…',
1925
2066
  successTitle: '请查看您的邮箱',
1926
2067
  successDescription: '我们已将密码重置链接发送至 {{email}},请检查您的收件箱。',
1927
2068
  backToSignInText: '返回登录',
1928
2069
  rememberPasswordText: '记住密码了?',
1929
2070
  signInText: '登录',
2071
+ // objectui#3546 slice three — the SMS reset branch of the same form.
2072
+ phoneLabel: '手机号',
2073
+ phonePlaceholder: '+1 555 000 0000',
2074
+ otpCodeLabel: '验证码',
2075
+ otpCodePlaceholder: '6 位验证码',
2076
+ sendOtpButton: '获取验证码',
2077
+ resendOtpCountdownText: '{seconds} 秒后可重新发送',
2078
+ newPasswordLabel: '新密码',
2079
+ newPasswordPlaceholder: '输入新密码',
2080
+ resetButton: '重置密码',
2081
+ usePhoneResetText: '通过短信验证码重置',
2082
+ useEmailResetText: '改用邮箱重置',
2083
+ phoneSuccessTitle: '密码已重置',
2084
+ phoneSuccessDescription: '您的密码已重置,现在可以使用新密码登录了。',
1930
2085
  },
1931
2086
  setPassword: {
1932
2087
  title: '设置一个备用密码',
@@ -1979,6 +2134,8 @@ const zh = {
1979
2134
  backToLogin: '返回登录',
1980
2135
  checkSpam: '没有收到邮件?请检查垃圾邮件文件夹或联系支持。',
1981
2136
  or: '或',
2137
+ // objectui#3546 slice three.
2138
+ resendUnavailable: '此环境可能未配置邮件发送服务。如果问题持续存在,请联系支持。',
1982
2139
  },
1983
2140
  setup: {
1984
2141
  welcomeTitle: '欢迎使用 ObjectStack',
@@ -2017,6 +2174,9 @@ const zh = {
2017
2174
  invalidDescription: 'URL 中未提供设备代码。',
2018
2175
  loading: '加载中…',
2019
2176
  cancel: '取消',
2177
+ // objectui#3546 slice three — device-authorization plugin switched off.
2178
+ disabledTitle: '未启用设备授权',
2179
+ disabledDescription: '此部署未启用设备授权,因此无法在此批准该设备。',
2020
2180
  },
2021
2181
  shell: {
2022
2182
  tenantHostHint: '您正在登录此工作区',
@@ -2056,6 +2216,29 @@ const zh = {
2056
2216
  },
2057
2217
  },
2058
2218
  },
2219
+ // objectui#3546 slice three — the /oauth/consent screen.
2220
+ oauth: {
2221
+ consent: {
2222
+ title: '{{appName}} 请求访问您的账户',
2223
+ request: '{{appName}} 正在请求授权{{suffix}}。',
2224
+ unknownApp: '某个应用',
2225
+ willAllow: '此应用将能够:',
2226
+ scope: {
2227
+ openid: '确认您的身份',
2228
+ profile: '读取您的基本资料(姓名、头像)',
2229
+ email: '读取您的邮箱地址',
2230
+ offlineAccess: '保持登录状态(刷新访问权限)',
2231
+ },
2232
+ deny: '拒绝',
2233
+ authorize: '授权',
2234
+ submitting: '授权中…',
2235
+ granted: '已授予访问权限',
2236
+ denied: '访问被拒绝',
2237
+ noRedirect: '服务器未返回跳转地址。',
2238
+ failed: '授权失败',
2239
+ footer: '您可以随时在账户设置中撤销访问权限。',
2240
+ },
2241
+ },
2059
2242
  profile: {
2060
2243
  title: '个人资料',
2061
2244
  subtitle: '管理您的账户设置',
@@ -2117,6 +2300,8 @@ const zh = {
2117
2300
  invite: '邀请成员',
2118
2301
  members: '成员',
2119
2302
  settings: '工作区设置',
2303
+ multiOrgDisabled: '此实例已禁用创建新组织。',
2304
+ createFailed: '创建工作区失败',
2120
2305
  },
2121
2306
  help: {
2122
2307
  keyboardShortcuts: '键盘快捷键',
@@ -2137,7 +2322,7 @@ const zh = {
2137
2322
  area: '区域',
2138
2323
  scope: '范围',
2139
2324
  packageManagement: '软件包管理',
2140
- searchNavigation: '搜索导航...',
2325
+ searchNavigation: '搜索导航…',
2141
2326
  recent: '最近使用',
2142
2327
  favorites: '收藏',
2143
2328
  starred: '已收藏',
@@ -2153,8 +2338,8 @@ const zh = {
2153
2338
  switchObject: '切换对象',
2154
2339
  connection: {
2155
2340
  connected: '已连接',
2156
- connecting: '连接中...',
2157
- reconnecting: '正在重新连接...',
2341
+ connecting: '连接中…',
2342
+ reconnecting: '正在重新连接…',
2158
2343
  disconnected: '已断开连接',
2159
2344
  error: '连接错误',
2160
2345
  },
@@ -2197,7 +2382,7 @@ const zh = {
2197
2382
  starred: '收藏',
2198
2383
  recent: '最近访问',
2199
2384
  },
2200
- loading: '正在加载工作区...',
2385
+ loading: '正在加载工作区…',
2201
2386
  recent: '最近使用',
2202
2387
  starred: '收藏',
2203
2388
  welcome: '用 AI 搭建你的业务系统',
@@ -2220,6 +2405,13 @@ const zh = {
2220
2405
  publishing: '发布中…',
2221
2406
  published: '已发布!更改已生效。',
2222
2407
  publishFailed: '发布失败',
2408
+ // objectui#3546 切片六 —— usePublishAllDrafts 其余几条 toast。
2409
+ // seedWarn 与 console.ai.seedWarn 同串,直接沿用该键既有译文。
2410
+ nothing: '没有需要发布的内容。',
2411
+ probeWarn: '已发布,但验证发现了问题。',
2412
+ seedWarn: '已发布,但部分示例数据未能载入。',
2413
+ publishedVerified: '已发布并验证 —— {{count}} 行示例数据已生效。',
2414
+ capabilityWarn: '编写检查:{{count}} 个能力引用无法解析。',
2223
2415
  },
2224
2416
  createFirstApp: '手动创建应用',
2225
2417
  systemSettings: '系统设置',
@@ -2277,6 +2469,9 @@ const zh = {
2277
2469
  roles: '角色',
2278
2470
  configuration: '配置',
2279
2471
  createApp: '创建应用',
2472
+ administration: '管理',
2473
+ datasources: '数据源',
2474
+ documentation: '文档',
2280
2475
  },
2281
2476
  activityFeed: {
2282
2477
  title: '最近动态',
@@ -2324,6 +2519,7 @@ const zh = {
2324
2519
  empty: {
2325
2520
  objectNotFound: '未找到对象',
2326
2521
  objectNotFoundDescription: '对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。',
2522
+ interfacePageSourceMissing: '此界面页引用了 “{{name}}”,但该来源不可用。',
2327
2523
  recordNotFound: '未找到记录',
2328
2524
  recordNotFoundDescription: '您查找的记录不存在或已被删除。',
2329
2525
  pageNotFound: '未找到页面',
@@ -2334,6 +2530,11 @@ const zh = {
2334
2530
  reportNotFoundDescription: '未找到报表 “{{name}}”,可能已被删除或重命名。',
2335
2531
  noAppsConfigured: '尚未配置应用',
2336
2532
  noAppsConfiguredDescription: '当前没有任何已注册的应用。请创建您的第一个应用,或前往系统设置进行配置。',
2533
+ appNotAvailable: '应用不可用',
2534
+ appNotAvailableDescription: '此应用尚不可用 —— 可能仍在发布中。请稍后重试。',
2535
+ appAccessDenied: '你没有访问此应用的权限',
2536
+ appAccessDeniedDescription: '此应用存在,但你的账号未获授权打开它。请联系管理员为你开通访问权限。',
2537
+ appAccessDeniedHome: '返回首页',
2337
2538
  createFirstApp: '创建您的第一个应用',
2338
2539
  systemSettings: '系统设置',
2339
2540
  back: '返回',
@@ -2375,6 +2576,34 @@ const zh = {
2375
2576
  confirmNote: '发布将一次性(原子地)发布此包全部 {{count}} 个待发布草稿。',
2376
2577
  publishConfirm: '全部发布',
2377
2578
  },
2579
+ // ADR-0045 — the materialized-but-unlisted app banner
2580
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
2581
+ unpublishedBar: {
2582
+ message: '未发布的应用 —— 功能完整,但只有构建者能看到。发布后即可让您的用户看到。',
2583
+ publish: '发布',
2584
+ publishing: '发布中…',
2585
+ published: '已发布!应用现在对您的用户可见。',
2586
+ publishFailed: '发布失败',
2587
+ },
2588
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
2589
+ // `button` is the banner's entry point into it.
2590
+ history: {
2591
+ button: '历史',
2592
+ title: '构建历史',
2593
+ description: '此应用的每一次变更,最新的在最前。撤销任一步骤即可回退 —— 无需确认发布。',
2594
+ loadFailed: '无法加载历史记录:',
2595
+ loadFailedUnavailable: '提交存储暂时不可达 —— 本次读取并未发生,因此不显示任何历史记录。请稍后重试。',
2596
+ loading: '正在加载历史记录…',
2597
+ empty: '此应用暂无历史记录。',
2598
+ revertLabel: '已撤销一处变更',
2599
+ applyLabel: '构建变更',
2600
+ revert: '撤销',
2601
+ items: '项',
2602
+ revertAction: '撤销',
2603
+ reverted: '已撤销 —— 该变更已还原。',
2604
+ revertFailed: '撤销失败',
2605
+ revertUnavailable: '提交存储暂时不可达 —— 此次撤销可能尚未生效。请重新打开历史记录确认后再重试。',
2606
+ },
2378
2607
  },
2379
2608
  renderer: {
2380
2609
  noPageSchema: '未提供页面 schema',
@@ -2441,7 +2670,7 @@ const zh = {
2441
2670
  deleteFailed: '删除视图失败',
2442
2671
  },
2443
2672
  dashboardActions: {
2444
- pdfPreparing: '正在准备 PDF 导出…',
2673
+ printDialogOpening: '正在打开浏览器打印对话框(不是导出 PDF)',
2445
2674
  exportFailed: '导出失败:{{message}}',
2446
2675
  forecastSoon: '预测视图即将上线',
2447
2676
  },
@@ -2476,6 +2705,140 @@ const zh = {
2476
2705
  emptyDescription: '创建您的第一个工作区以开始使用。',
2477
2706
  noMatches: '没有匹配的工作区。',
2478
2707
  },
2708
+ organization: {
2709
+ roles: {
2710
+ owner: '所有者',
2711
+ admin: '管理员',
2712
+ delegatedAdmin: '受托管理员',
2713
+ member: '成员',
2714
+ },
2715
+ errors: {
2716
+ notAllowedToInvite: '您无权邀请用户加入该组织。',
2717
+ notAllowedToInviteWithRole: '您无权以该角色邀请用户。',
2718
+ alreadyInvited: '该用户已被邀请加入本组织。',
2719
+ organizationExists: '该组织已存在。',
2720
+ slugTaken: '该标识已被占用。',
2721
+ notAllowedToCreate: '您无权创建新组织。',
2722
+ notTheRecipient: '您不是该邀请的收件人。',
2723
+ invitationNotFound: '该邀请已失效或已过期。',
2724
+ unknown: '出了点问题,请重试。',
2725
+ },
2726
+ backToList: '返回组织列表',
2727
+ notFound: '未找到组织',
2728
+ notFoundDescription: '该组织不存在,或您没有访问权限。',
2729
+ tabs: {
2730
+ members: '成员',
2731
+ invitations: '邀请',
2732
+ settings: '设置',
2733
+ },
2734
+ members: {
2735
+ title: '成员',
2736
+ inviteMember: '邀请成员',
2737
+ inviteRestrictedNote: '只有组织管理员可以邀请成员。',
2738
+ removeMember: '移除成员',
2739
+ removeConfirmTitle: '移除成员?',
2740
+ removeConfirmDescription: '将把 {{name}} 从该组织中移除,其访问权限会立即失效。',
2741
+ removeConfirmAction: '移除',
2742
+ memberRemoved: '成员已移除',
2743
+ removeFailed: '移除成员失败',
2744
+ roleUpdated: '角色已更新',
2745
+ roleUpdateFailed: '更新角色失败',
2746
+ memberActions: '成员操作',
2747
+ loadFailed: '加载成员失败',
2748
+ },
2749
+ invitations: {
2750
+ title: '邀请',
2751
+ empty: '暂无邀请。',
2752
+ expiresAt: '过期时间',
2753
+ linkCopied: '邀请链接已复制',
2754
+ copyFailed: '复制链接失败',
2755
+ canceled: '邀请已取消',
2756
+ cancelFailed: '取消邀请失败',
2757
+ cancelTitle: '取消邀请?',
2758
+ cancelDescription: '将撤销发给 {{email}} 的邀请。',
2759
+ cancelAction: '取消邀请',
2760
+ inviteTitle: '邀请成员',
2761
+ inviteDescription: '对方将收到加入该组织的邀请。',
2762
+ emailLabel: '邮箱',
2763
+ roleLabel: '角色',
2764
+ placementLabel: '任职安排(可选)',
2765
+ placementDescription: '在邀请被接受时生效。仅列出您有权分派的业务单元和岗位。',
2766
+ businessUnitLabel: '业务单元',
2767
+ businessUnitPlaceholder: '不指定任职',
2768
+ positionsLabel: '岗位',
2769
+ sendInvite: '发送邀请',
2770
+ sentTitle: '邀请已创建',
2771
+ sentDescription: '请将下方链接发送给受邀人。对方需要登录后才能接受。',
2772
+ linkLabel: '接受链接',
2773
+ invitedAs: '{{email}} 已以 {{role}} 身份受邀',
2774
+ copyLinkLabel: '复制邀请链接',
2775
+ loadFailed: '加载邀请失败',
2776
+ inviteFailed: '邀请成员失败',
2777
+ status: {
2778
+ all: '全部',
2779
+ pending: '等待中',
2780
+ accepted: '已接受',
2781
+ rejected: '已拒绝',
2782
+ canceled: '已取消',
2783
+ },
2784
+ },
2785
+ settings: {
2786
+ generalTitle: '常规',
2787
+ generalDescription: '更新组织信息。',
2788
+ readOnlyNote: '只有所有者可以修改设置。',
2789
+ nameLabel: '组织名称',
2790
+ slugLabel: '标识',
2791
+ logoLabel: 'Logo',
2792
+ logoUpload: '上传',
2793
+ logoReplace: '更换',
2794
+ logoClear: '移除',
2795
+ logoUploaded: 'Logo 已上传,保存后生效',
2796
+ logoUploadFailed: '上传 Logo 失败',
2797
+ save: '保存更改',
2798
+ saved: '设置已保存',
2799
+ saveFailed: '保存设置失败',
2800
+ leaveTitle: '退出组织',
2801
+ leaveDescription: '退出后您将失去对该组织的访问权限。',
2802
+ leaveAction: '退出',
2803
+ leaveConfirmTitle: '退出组织?',
2804
+ leaveConfirmDescription: '确定要退出 {{name}} 吗?您的访问权限会立即失效。',
2805
+ leaveConfirmAction: '退出',
2806
+ leftOrg: '您已退出该组织',
2807
+ leaveFailed: '退出组织失败',
2808
+ dangerZone: '危险操作',
2809
+ deleteTitle: '删除组织',
2810
+ deleteDescription: '永久删除该组织及其全部数据。',
2811
+ deleteAction: '删除',
2812
+ deleteConfirmTitle: '删除组织?',
2813
+ deleteConfirmDescription: '此操作不可撤销,所有数据将被永久删除。请输入组织标识以确认。',
2814
+ deleteConfirmSlugLabel: '输入“{{slug}}”以确认',
2815
+ deleteConfirmAction: '删除组织',
2816
+ deleted: '组织已删除',
2817
+ deleteFailed: '删除组织失败',
2818
+ },
2819
+ accept: {
2820
+ title: '您收到一份邀请',
2821
+ description: '您受邀以 {{role}} 身份加入 {{orgName}}。',
2822
+ errorTitle: '邀请不可用',
2823
+ goToOrgs: '前往组织列表',
2824
+ loading: '正在加载邀请…',
2825
+ organization: '组织',
2826
+ role: '角色',
2827
+ expiresAt: '过期时间',
2828
+ accept: '接受邀请',
2829
+ accepted: '邀请已接受',
2830
+ acceptFailed: '接受邀请失败',
2831
+ decline: '拒绝',
2832
+ declined: '邀请已拒绝',
2833
+ declineFailed: '拒绝邀请失败',
2834
+ },
2835
+ switcher: {
2836
+ label: '切换组织',
2837
+ groupLabel: '当前工作组织',
2838
+ groupHint: '新建记录将归属该组织。视图会显示您所有组织的数据。',
2839
+ manageMembers: '管理成员',
2840
+ },
2841
+ },
2479
2842
  notifications: {
2480
2843
  regionLabel: '通知',
2481
2844
  empty: '暂无通知',
@@ -2492,6 +2855,9 @@ const zh = {
2492
2855
  viewApprovals: '查看审批',
2493
2856
  noPendingApprovals: '暂无待审批事项',
2494
2857
  openApprovalsInbox: '打开审批中心',
2858
+ badgeTotal: '共 {{total}} 项',
2859
+ badgeNotifications: '{{unread}} 条通知',
2860
+ badgeApprovals: '{{approvals}} 条待审批',
2495
2861
  },
2496
2862
  publicForm: {
2497
2863
  submit: '提交',
@@ -2765,6 +3131,7 @@ const zh = {
2765
3131
  dismiss: '关闭',
2766
3132
  openOnCloud: '在云端打开',
2767
3133
  backHome: '返回首页',
3134
+ updateTo: '更新',
2768
3135
  },
2769
3136
  install: {
2770
3137
  dialogTitle: '安装 {{name}}',
@@ -2781,6 +3148,37 @@ const zh = {
2781
3148
  localManifestConflict: '{{message}}\n提示:本地已有应用占用此 manifest_id,请先从 objectstack.config.ts 中移除。',
2782
3149
  localUnauthorized: '请先登录本运行时再试。',
2783
3150
  localMarketplaceUnavailable: '本运行时未配置 OS_CLOUD_URL,无法访问应用市场目录。',
3151
+ updateTo: '更新 → v{{version}}',
3152
+ installedVersion: '已安装 v{{version}}',
3153
+ },
3154
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
3155
+ org: {
3156
+ heading: '你的组织',
3157
+ install: '安装',
3158
+ installed: '已安装 {{name}}',
3159
+ installedBadge: '已安装',
3160
+ installing: '安装中…',
3161
+ },
3162
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
3163
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
3164
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
3165
+ disclosure: {
3166
+ containsCode: '此软件包包含代码',
3167
+ reviewed: '已审核并批准',
3168
+ unreviewed: '尚未审核',
3169
+ signed: '已签名',
3170
+ grantsIntro: '安装后,此软件包将获得以下权限:',
3171
+ services: '平台服务',
3172
+ hooks: '生命周期钩子',
3173
+ network: '网络访问',
3174
+ fs: '文件系统访问',
3175
+ noPermissions: '不请求任何特殊权限。',
3176
+ acknowledge: '我了解此软件包会运行代码,并将获得上述权限。',
3177
+ runtime: {
3178
+ node: '进程内 · 完全信任',
3179
+ sandbox: '沙箱隔离',
3180
+ worker: '进程外',
3181
+ },
2784
3182
  },
2785
3183
  // ADR-0090 D5/D9 — 安装时建议:包声明 isDefault 的权限集建议绑定到
2786
3184
  // everyone/guest 岗位,由管理员在此确认,服务端绝不自动绑定。
@@ -3049,5 +3447,91 @@ const zh = {
3049
3447
  addSort: '添加排序',
3050
3448
  removeSort: '删除排序',
3051
3449
  },
3450
+ collaboration: {
3451
+ commentCount: '{{count}} 条评论',
3452
+ commentCountOne: '{{count}} 条评论',
3453
+ resolvedSuffix: ' · 已解决',
3454
+ sortComments: '评论排序',
3455
+ sortOldest: '最早优先',
3456
+ sortNewest: '最新优先',
3457
+ resolve: '标记已解决',
3458
+ reopen: '重新打开',
3459
+ justNow: '刚刚',
3460
+ minutesAgo: '{{count}} 分钟前',
3461
+ hoursAgo: '{{count}} 小时前',
3462
+ daysAgo: '{{count}} 天前',
3463
+ edited: '(已编辑)',
3464
+ reactionCount: '{{count}} 个回应',
3465
+ reactionCountOne: '{{count}} 个回应',
3466
+ addThumbsUp: '点赞',
3467
+ reply: '回复',
3468
+ reactThumbsUp: '以点赞回应',
3469
+ reactHeart: '以爱心回应',
3470
+ cancelReply: '取消回复',
3471
+ replyingTo: '正在回复 {{name}}…',
3472
+ replyingToComment: '正在回复该评论…',
3473
+ commentPlaceholder: '添加评论…(输入 @ 提及他人)',
3474
+ send: '发送',
3475
+ presentUserCount: '{{count}} 人在线',
3476
+ presentUserCountOne: '{{count}} 人在线',
3477
+ moreUserCount: '另有 {{count}} 人',
3478
+ moreUserCountOne: '另有 {{count}} 人',
3479
+ userStatusTitle: '{{name}}({{status}})',
3480
+ statusActive: '活跃',
3481
+ statusIdle: '空闲',
3482
+ statusAway: '离开',
3483
+ },
3484
+ wizard: {
3485
+ missingRequired: '请填写以下必填字段:{{fields}}',
3486
+ },
3487
+ appManagement: {
3488
+ title: '应用',
3489
+ subtitle: '管理所有已配置的应用',
3490
+ newApp: '新建应用',
3491
+ searchLabel: '搜索应用',
3492
+ searchPlaceholder: '搜索应用…',
3493
+ selectedCount: '已选择 {{n}} 个',
3494
+ bulkEnable: '启用',
3495
+ bulkDisable: '停用',
3496
+ selectAll: '全选({{n}})',
3497
+ empty: '未找到应用。',
3498
+ defaultBadge: '默认',
3499
+ active: '已启用',
3500
+ inactive: '已停用',
3501
+ selectApp: '选择 {{name}}',
3502
+ openApp: '打开应用',
3503
+ openAppNamed: '打开 {{name}}',
3504
+ editApp: '编辑应用',
3505
+ editAppNamed: '编辑 {{name}}',
3506
+ editWithAi: '用 AI 编辑',
3507
+ editWithAiNamed: '用 AI 编辑 {{name}}',
3508
+ enableApp: '启用应用',
3509
+ disableApp: '停用应用',
3510
+ enableAppNamed: '启用 {{name}}',
3511
+ disableAppNamed: '停用 {{name}}',
3512
+ setDefault: '设为默认',
3513
+ setDefaultNamed: '将 {{name}} 设为默认',
3514
+ deleteApp: '删除应用',
3515
+ deleteAppNamed: '删除 {{name}}',
3516
+ confirmDelete: '再次点击以确认删除',
3517
+ confirmDeleteNamed: '确认删除 {{name}}',
3518
+ toast: {
3519
+ noClient: '无法连接到元数据服务',
3520
+ unknownError: '未知错误',
3521
+ appEnabled: '{{name}} 已启用',
3522
+ appDisabled: '{{name}} 已停用',
3523
+ toggleFailed: '切换应用状态失败:{{reason}}',
3524
+ setDefaultDone: '{{name}} 已设为默认',
3525
+ setDefaultFailed: '设置默认应用失败:{{reason}}',
3526
+ appDeleted: '{{name}} 已删除',
3527
+ deleteFailed: '删除应用失败:{{reason}}',
3528
+ bulkEnabled: '已启用 {{n}} 个应用',
3529
+ bulkDisabled: '已停用 {{n}} 个应用',
3530
+ bulkFailed: '{{n}} 个失败:{{details}}',
3531
+ bulkFailureEntry: '{{name}}({{reason}})',
3532
+ bulkFailureJoiner: ';',
3533
+ bulkOperationFailed: '批量操作失败:{{reason}}',
3534
+ },
3535
+ },
3052
3536
  };
3053
3537
  export default zh;