@object-ui/i18n 17.3.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 +1295 -1
  2. package/README.md +0 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +11 -1
  5. package/dist/locales/ar.d.ts +466 -107
  6. package/dist/locales/ar.js +559 -153
  7. package/dist/locales/de.d.ts +466 -107
  8. package/dist/locales/de.js +574 -175
  9. package/dist/locales/en.d.ts +502 -143
  10. package/dist/locales/en.js +678 -145
  11. package/dist/locales/es.d.ts +466 -107
  12. package/dist/locales/es.js +553 -155
  13. package/dist/locales/fr.d.ts +466 -107
  14. package/dist/locales/fr.js +553 -152
  15. package/dist/locales/index.d.ts +4734 -1144
  16. package/dist/locales/ja.d.ts +466 -107
  17. package/dist/locales/ja.js +545 -146
  18. package/dist/locales/ko.d.ts +466 -107
  19. package/dist/locales/ko.js +551 -153
  20. package/dist/locales/pt.d.ts +466 -107
  21. package/dist/locales/pt.js +552 -154
  22. package/dist/locales/ru.d.ts +466 -107
  23. package/dist/locales/ru.js +563 -153
  24. package/dist/locales/zh.d.ts +501 -142
  25. package/dist/locales/zh.js +542 -142
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +83 -1
  29. package/dist/provider.js +303 -29
  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 +50 -2
  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 +4 -3
@@ -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,7 +116,7 @@ const zh = {
81
116
  required: '必填',
82
117
  optional: '选填',
83
118
  selectOption: '请选择',
84
- select: '选择...',
119
+ select: '选择…',
85
120
  openChat: '打开聊天',
86
121
  closeChat: '关闭聊天',
87
122
  closePanel: '关闭面板',
@@ -90,6 +125,11 @@ const zh = {
90
125
  itemCountOne: '{{count}} 项',
91
126
  toggleSidebar: '切换侧边栏',
92
127
  package: '软件包',
128
+ done: '完成',
129
+ editInStudio: '在 Studio 中编辑',
130
+ record: '记录',
131
+ retry: '重试',
132
+ printDialogHint: '打开浏览器打印对话框(不是导出 PDF)',
93
133
  },
94
134
  actions: {
95
135
  decisionOutput: {
@@ -128,6 +168,9 @@ const zh = {
128
168
  unsavedChanges: '您有未保存的更改,确定要离开吗?',
129
169
  discardTitle: '放弃更改?',
130
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: '填写表单字段,然后提交或取消。',
131
174
  keepEditing: '继续编辑',
132
175
  discard: '放弃',
133
176
  conflictTitle: '保存冲突',
@@ -189,7 +232,7 @@ const zh = {
189
232
  richText: {
190
233
  format: '格式: {{format}}',
191
234
  basicEditorHint: '富文本编辑器(基础)',
192
- placeholder: '请输入文字...',
235
+ placeholder: '请输入文字…',
193
236
  },
194
237
  options: {
195
238
  empty: '暂无可选项',
@@ -255,7 +298,7 @@ const zh = {
255
298
  saveAll: '全部保存 ({{count}})',
256
299
  addRecord: '添加记录',
257
300
  open: '打开',
258
- search: '搜索...',
301
+ search: '搜索…',
259
302
  modified: '{{count}} 行已修改',
260
303
  saveFailed: '保存失败',
261
304
  selected: '已选择 {{count}} 项',
@@ -268,7 +311,7 @@ const zh = {
268
311
  delete: '删除',
269
312
  export: '导出',
270
313
  exportAs: '导出为 {{format}}',
271
- loading: '加载数据中...',
314
+ loading: '加载数据中…',
272
315
  errorLoading: '数据加载失败',
273
316
  pullToRefresh: '下拉刷新',
274
317
  refreshing: '刷新中…',
@@ -285,6 +328,22 @@ const zh = {
285
328
  yes: '是',
286
329
  no: '否',
287
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
+ },
288
347
  toolbar: {
289
348
  densityMode: '密度',
290
349
  densityCompact: '紧凑',
@@ -485,7 +544,7 @@ const zh = {
485
544
  moreEvents: '+{{count}} 更多',
486
545
  },
487
546
  list: {
488
- loading: '正在加载记录...',
547
+ loading: '正在加载记录…',
489
548
  recordCount: '{{count}} 条记录',
490
549
  recordCountOne: '{{count}} 条记录',
491
550
  addRecord: '添加记录',
@@ -497,7 +556,8 @@ const zh = {
497
556
  sort: '排序',
498
557
  sortRecords: '排序记录',
499
558
  sortByIdSuffix: '(按 ID)',
500
- sortRelationalHint: '指向其他记录的列未列出:它们只能按存储的 ID 排序,而不是单元格中显示的名称。若要按该名称排序,请添加一个存放该名称的公式字段。',
559
+ sortRelationalHint: '指向其他记录的列未列出:它们只能按存储的 ID 排序,而不是单元格中显示的名称。若要按该名称排序,请把该名称反规范化到本对象上,做成一个在来源变更时写入的存储字段,再按它排序。不要用公式字段:公式字段是虚拟的,不会为它存储任何列,服务端会拒绝按它排序。',
560
+ resetSortToDefault: '恢复视图默认排序',
501
561
  group: '分组',
502
562
  groupBy: '分组依据',
503
563
  export: '导出',
@@ -522,6 +582,8 @@ const zh = {
522
582
  loadErrorUnauthorizedMessage: '登录状态已过期或已退出。请重新登录后查看这些记录。',
523
583
  loadErrorRejectedTitle: '该视图的查询被拒绝',
524
584
  loadErrorRejectedMessage: '服务器无法处理该视图的筛选条件或查询参数。清除筛选条件通常即可恢复;如果视图本身就是这样保存的,需要管理员修正。',
585
+ loadErrorApiDisabledTitle: '该对象未开放 API 访问',
586
+ loadErrorApiDisabledMessage: '此页面无法加载记录,因为该对象未通过 API 开放。这是对象自身的设置,而不是权限问题 —— 需要管理员为其启用 API 访问,此页面才能正常工作。',
525
587
  retry: '重试',
526
588
  managedBy: {
527
589
  system: {
@@ -596,8 +658,11 @@ const zh = {
596
658
  deleteCard: '删除卡片',
597
659
  deleteColumn: '删除列',
598
660
  noCards: '暂无卡片',
599
- cardTitlePlaceholder: '输入卡片标题...',
661
+ cardTitlePlaceholder: '输入卡片标题…',
600
662
  uncategorized: '未分类',
663
+ columns: '列',
664
+ requiredFieldsTitle: '填写必填字段',
665
+ requiredFieldsDescription: '此次移动会使以下字段成为必填项。填写后即可继续。',
601
666
  },
602
667
  timeline: {
603
668
  bucket: {
@@ -610,6 +675,13 @@ const zh = {
610
675
  noDate: '无日期',
611
676
  unassigned: '未分配',
612
677
  },
678
+ scale: {
679
+ week: '第 {{n}} 周',
680
+ quarter: '{{year}}年第{{quarter}}季度',
681
+ },
682
+ gantt: {
683
+ rowLabel: '条目',
684
+ },
613
685
  },
614
686
  gantt: {
615
687
  column: {
@@ -636,6 +708,7 @@ const zh = {
636
708
  exportPng: '导出 PNG',
637
709
  exportPdf: '导出 PDF',
638
710
  saveLayout: '保存布局',
711
+ refresh: '刷新',
639
712
  undo: '撤销',
640
713
  redo: '重做',
641
714
  },
@@ -683,6 +756,18 @@ const zh = {
683
756
  ff: '完成 → 完成',
684
757
  sf: '开始 → 完成',
685
758
  },
759
+ linkEnd: {
760
+ start: '开始',
761
+ end: '结束',
762
+ },
763
+ link: {
764
+ rejected: {
765
+ self: "任务不能依赖自身。",
766
+ locked: "该行已锁定,无法新增依赖。",
767
+ group: "汇总行不能作为依赖目标,请改为连接其下的具体任务。",
768
+ cycle: "该连接会形成循环依赖。",
769
+ },
770
+ },
686
771
  conflict: {
687
772
  title: '排程冲突',
688
773
  body: '此次移动与依赖约束冲突。是否自动重新排程 {{count}} 个受影响的任务?',
@@ -691,8 +776,8 @@ const zh = {
691
776
  },
692
777
  autoScheduleDlg: {
693
778
  title: '自动排程',
694
- body: '将顺延 {count} 个任务以满足依赖约束,是否执行?',
695
- skipped: '另有 {count} 项因锁定/无权限跳过。',
779
+ body: '将顺延 {{count}} 个任务以满足依赖约束,是否执行?',
780
+ skipped: '另有 {{count}} 项因锁定/无权限跳过。',
696
781
  confirm: '执行',
697
782
  cancel: '取消',
698
783
  none: '依赖均满足,无需排程',
@@ -745,8 +830,8 @@ const zh = {
745
830
  readonlyTooltip: '系统视图 — 由代码定义,只读。',
746
831
  },
747
832
  designer: {
748
- undo: 'Undo',
749
- redo: 'Redo',
833
+ undo: '撤销',
834
+ redo: '重做',
750
835
  },
751
836
  detail: {
752
837
  back: '返回',
@@ -789,6 +874,7 @@ const zh = {
789
874
  concurrentUpdateReload: '加载最新',
790
875
  concurrentUpdateOverwrite: '仍然覆盖',
791
876
  concurrentUpdateCancel: '取消',
877
+ concurrentUpdateRecordLabel: '此记录',
792
878
  openInNewTab: '在新标签页打开',
793
879
  share: '分享',
794
880
  duplicate: '复制',
@@ -818,16 +904,19 @@ const zh = {
818
904
  relatedRecords: '{{count}} 条记录',
819
905
  relatedRecordOne: '{{count}} 条记录',
820
906
  noRelatedRecords: '暂无相关记录',
821
- loading: '加载中...',
907
+ loading: '加载中…',
822
908
  copyToClipboard: '复制到剪贴板',
823
909
  copied: '已复制!',
824
910
  deleteConfirmation: '确定要删除此记录吗?',
911
+ deleted: '记录已删除',
825
912
  editRecord: '编辑记录',
826
913
  viewAll: '查看全部',
827
914
  new: '新建',
915
+ add: '添加',
828
916
  emptyValue: '—',
829
917
  activity: '活动',
830
918
  history: '历史',
919
+ historyEmpty: '暂无历史记录',
831
920
  editRow: '编辑',
832
921
  deleteRow: '删除',
833
922
  deleteRowConfirmation: '确定要删除此记录吗?',
@@ -837,7 +926,7 @@ const zh = {
837
926
  nextPage: '下一页',
838
927
  pageOf: '第 {{current}} 页,共 {{total}} 页',
839
928
  sortBy: '排序',
840
- filterPlaceholder: '筛选...',
929
+ filterPlaceholder: '筛选…',
841
930
  highlightFields: '关键字段',
842
931
  // Comments
843
932
  comments: '评论',
@@ -908,6 +997,9 @@ const zh = {
908
997
  nextRecordKey: '下一条记录 (→)',
909
998
  lastRecord: '最后一条记录 (End)',
910
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}} 个为空',
911
1003
  showEmptyRelated_one: '+ {{count}} 个为空',
912
1004
  showEmptyRelated_other: '+ {{count}} 个为空',
913
1005
  searchWhileNavigating: '导航时搜索',
@@ -922,6 +1014,7 @@ const zh = {
922
1014
  loadMore: '加载更多',
923
1015
  edited: '(已编辑)',
924
1016
  via: '通过 {{source}}',
1017
+ viewSource: '查看来源',
925
1018
  // Replies
926
1019
  replyCount: '{{count}} 条回复',
927
1020
  replyCountPlural: '{{count}} 条回复',
@@ -942,7 +1035,8 @@ const zh = {
942
1035
  },
943
1036
  chart: {
944
1037
  noData: '暂无图表数据',
945
- loading: '图表加载中...',
1038
+ loading: '图表加载中…',
1039
+ nullCategory: '(未指定)',
946
1040
  },
947
1041
  report: {
948
1042
  total: '总计',
@@ -967,111 +1061,7 @@ const zh = {
967
1061
  first: '首个',
968
1062
  },
969
1063
  editor: {
970
- breadcrumb: '配置',
971
- basic: '基础',
972
- title: '标题',
973
- titlePlaceholder: '例如:按季度的销售管道',
974
- description: '描述',
975
- descriptionPlaceholder: '此报表展示什么?',
976
- type: '报表类型',
977
- typeTabular: '表格 — 平铺列表',
978
- typeSummary: '汇总 — 分组带合计',
979
- typeMatrix: '矩阵 — 行列透视',
980
- typeJoined: '拼接 — 多块组合',
981
- typeHelp: '选择最贴合需求的布局方式。',
982
- data: '数据',
983
- objectName: '数据源',
984
- objectNamePlaceholder: '例如:opportunity',
985
- objectNameHelp: '此报表应查询哪个对象?',
986
- limit: '行数上限',
987
- limitPlaceholder: '例如:100',
988
- columns: '列',
989
- columnsHint: '选择要展示的字段。汇总或矩阵报表可添加聚合(求和、计数…)。',
990
- filters: '筛选',
991
- filtersHint: '限定参与报表的数据行。',
992
- filtersComplex: '此报表使用了高级筛选条件,此处无法编辑。保存时将原样保留。',
993
- groupBy: '分组',
994
- groupByHint: '按字段分组并计算小计。',
995
- rows: '行',
996
- rowsHint: '按这些字段对行分组。',
997
- columnsAxis: '列',
998
- columnsAxisHint: '将这些字段透视到顶部。',
999
- values: '度量',
1000
- valuesHint: '每个单元格里展示的数字。选择一个或多个字段并设置聚合方式(求和、计数…)。',
1001
- grouping: '分组',
1002
- addGrouping: '添加分组',
1003
- dateGranularity: '日期粒度',
1004
- dateGranularityNone: '(使用原始值)',
1005
- day: '日',
1006
- week: '周',
1007
- month: '月',
1008
- quarter: '季度',
1009
- year: '年',
1010
- sortAsc: '升序',
1011
- sortDesc: '降序',
1012
- chart: '图表',
1013
- chartHint: '在表格旁可选展示的可视化。',
1014
- chartType: '图表类型',
1015
- chartTitle: '图表标题',
1016
- chartTitlePlaceholder: '默认使用报表标题',
1017
- chartXAxis: 'X 轴(类别)',
1018
- chartYAxis: 'Y 轴(数值)',
1019
- chartShowLegend: '显示图例',
1020
- chartShowDataLabels: '显示数据标签',
1021
- chartNone: '(无图表)',
1022
- chartBar: '柱状图',
1023
- chartLine: '折线图',
1024
- chartArea: '面积图',
1025
- chartPie: '饼图',
1026
- chartDonut: '环形图',
1027
- chartFunnel: '漏斗图',
1028
- validationNeedsObject: '请先选择数据源,再添加列。',
1029
- validationMatrixNeedsRowsCols: '矩阵报表至少需要一个行字段和一个列字段。',
1030
- validationSummaryNeedsRows: '汇总报表至少需要一个分组字段。',
1031
- blocks: '区块',
1032
- blocksHint: '每个区块都是独立的表格或图表。区块筛选会与报表筛选合并(AND)。',
1033
- addBlock: '添加区块',
1034
- removeBlock: '删除区块',
1035
- blockName: '区块名称',
1036
- blockNamePlaceholder: '唯一的区块名',
1037
- blockLabel: '显示标题',
1038
- blockLabelPlaceholder: '显示在区块上方',
1039
- blockDescription: '说明',
1040
- blockDescriptionPlaceholder: '该区块的可选说明',
1041
- validationJoinedNeedsBlocks: '组合报表至少需要一个区块。',
1042
- validationBlockNameRequired: '每个区块都必须有非空的名称。',
1043
- validationBlockNameDuplicate: '区块名称在报表内必须唯一。',
1044
- validationBlockNeedsColumns: '每个区块至少需要一列。',
1045
- noneOption: '(无)',
1046
- addCondition: '添加条件',
1047
- combineLogic: '组合方式',
1048
- opContains: '包含',
1049
- opIsEmpty: '为空',
1050
- opIsNotEmpty: '不为空',
1051
- formatAuto: '自动',
1052
- formatCurrency: '货币',
1053
- formatPercent: '百分比',
1054
- formatInteger: '整数',
1055
- formatDate: '日期',
1056
- formatDatetime: '日期 + 时间',
1057
- columnLabelPlaceholder: '自定义标签',
1058
- aggregateColumn: '聚合',
1059
- formatColumn: '格式',
1060
- addColumns: '添加字段',
1061
- searchFields: '搜索字段…',
1062
- noMatchingFields: '没有匹配的字段。',
1063
- noFieldsAvailable: '暂无可用字段。',
1064
- columnsCount: '已选择 {n} 个列',
1065
- columnsEmpty: '尚未选择任何列。',
1066
- fieldPickerTitle: '选择字段',
1067
- fieldPickerDescription: '可选择一个或多个字段添加到报表,输入关键字可快速筛选。',
1068
- fieldPickerChangeTitle: '更换字段',
1069
- fieldPickerAddGroupingTitle: '添加分组',
1070
- fieldPickerEmpty: '(请选择字段)',
1071
- fieldPickerSelected: '已选 {n} 个',
1072
- fieldPickerClear: '清空选择',
1073
- fieldPickerAdd: '添加',
1074
- fieldPickerAddN: '添加 {n} 个',
1064
+ panelTitle: '编辑报表',
1075
1065
  },
1076
1066
  },
1077
1067
  map: {
@@ -1094,8 +1084,8 @@ const zh = {
1094
1084
  properties: '属性',
1095
1085
  connections: '连接',
1096
1086
  quickConnect: '快速连接',
1097
- fromPlaceholder: '从...',
1098
- toPlaceholder: '到...',
1087
+ fromPlaceholder: '从…',
1088
+ toPlaceholder: '到…',
1099
1089
  connect: '连接',
1100
1090
  label: '标签',
1101
1091
  type: '类型',
@@ -1151,6 +1141,7 @@ const zh = {
1151
1141
  noDataAvailable: '暂无数据',
1152
1142
  noDataSourceFor: '没有可用的数据源:',
1153
1143
  noRows: '暂无数据行',
1144
+ loading: '加载中…',
1154
1145
  pickMeasures: '请为该数据集组件选择度量(值)。',
1155
1146
  datasetUnsupported: '当前数据源不支持数据集查询。',
1156
1147
  details: '明细',
@@ -1400,8 +1391,9 @@ const zh = {
1400
1391
  },
1401
1392
  },
1402
1393
  console: {
1394
+ saveAdvisoryTitle: '已保存 — 编辑检查提出了 {{count}} 条建议',
1403
1395
  title: 'ObjectStack 控制台',
1404
- initializing: '正在初始化应用程序...',
1396
+ initializing: '正在初始化应用程序…',
1405
1397
  search: '搜索…',
1406
1398
  breadcrumb: {
1407
1399
  dashboards: '仪表盘',
@@ -1432,6 +1424,31 @@ const zh = {
1432
1424
  Other: '其他',
1433
1425
  },
1434
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
+ },
1435
1452
  loadingSteps: {
1436
1453
  connecting: '正在连接数据源',
1437
1454
  loadingConfig: '正在加载配置',
@@ -1462,6 +1479,7 @@ const zh = {
1462
1479
  general: '通用',
1463
1480
  navigation: '导航',
1464
1481
  dataViews: '数据视图',
1482
+ aiChat: 'AI 助手',
1465
1483
  preferences: '偏好设置',
1466
1484
  },
1467
1485
  openCommandPalette: '打开命令面板',
@@ -1472,11 +1490,13 @@ const zh = {
1472
1490
  createRecord: '新建记录',
1473
1491
  refreshData: '刷新数据',
1474
1492
  editRecord: '编辑选中记录',
1493
+ newChat: '新建对话',
1494
+ toggleChatsList: '切换对话列表',
1475
1495
  toggleDarkMode: '切换深色模式',
1476
1496
  },
1477
1497
  commandPalette: {
1478
1498
  title: '命令面板',
1479
- placeholder: '输入命令或搜索...',
1499
+ placeholder: '输入命令或搜索…',
1480
1500
  noResults: '未找到结果。',
1481
1501
  searching: '搜索中…',
1482
1502
  records: '记录',
@@ -1518,7 +1538,7 @@ const zh = {
1518
1538
  shareTitle: '分享此对话',
1519
1539
  shareDisabledTitle: '开始对话后即可分享',
1520
1540
  newChat: '新对话',
1521
- searchChats: '搜索对话...',
1541
+ searchChats: '搜索对话…',
1522
1542
  noChatsYet: '暂无对话',
1523
1543
  noChatsDescription: '开始新的对话后会显示在这里。',
1524
1544
  noMatchingChats: '没有匹配的对话。',
@@ -1527,18 +1547,18 @@ const zh = {
1527
1547
  deleteConversation: '删除对话',
1528
1548
  saveRename: '保存重命名',
1529
1549
  cancelRename: '取消重命名',
1530
- loadingHistory: '正在加载对话历史...',
1550
+ loadingHistory: '正在加载对话历史…',
1531
1551
  conversationReady: '对话已就绪',
1532
1552
  preparingConversation: '正在准备新对话',
1533
1553
  offlineDemoMode: '离线演示模式 — 无法获取助手列表',
1534
1554
  sendFailedRateLimited: '发送过于频繁,请稍候再试。你的消息已保留在输入框中。',
1535
1555
  sendFailedGeneric: '消息发送失败,请重试。你的消息已保留在输入框中。',
1536
- askAgent: '向 {{agent}} 提问...',
1556
+ askAgent: '向 {{agent}} 提问…',
1537
1557
  assistant: '助手',
1538
1558
  liveCanvas: '草稿预览 · {{app}}',
1539
1559
  liveCanvasUnlisted: '运行预览 · {{app}}(未发布 · 仅自己可见)',
1540
- loadingAgents: '正在加载助手...',
1541
- askAnything: '输入你的问题...',
1560
+ loadingAgents: '正在加载助手…',
1561
+ askAnything: '输入你的问题…',
1542
1562
  emptyTitle: '开始对话',
1543
1563
  emptyDescription: '可以直接提问,助手会结合当前应用上下文提供帮助。',
1544
1564
  switchAssistant: '切换助手',
@@ -1653,6 +1673,57 @@ const zh = {
1653
1673
  addAutomation: '加一个自动化 —— 审批、状态流转或通知。',
1654
1674
  },
1655
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
+ },
1656
1727
  },
1657
1728
  errors: {
1658
1729
  somethingWentWrong: '出错了',
@@ -1661,6 +1732,12 @@ const zh = {
1661
1732
  goHome: '返回首页',
1662
1733
  errorDetails: '错误详情(仅开发模式)',
1663
1734
  },
1735
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1736
+ notFound: {
1737
+ title: '页面不存在',
1738
+ description: '你访问的链接与该应用中的任何视图都不匹配。',
1739
+ back: '返回',
1740
+ },
1664
1741
  theme: {
1665
1742
  toggle: '切换主题',
1666
1743
  light: '浅色',
@@ -1696,6 +1773,8 @@ const zh = {
1696
1773
  },
1697
1774
  objectView: {
1698
1775
  systemViewReadonly: '系统视图由代码定义,只读。',
1776
+ cannotEditMetaView: '该视图为内置视图,由代码定义,无法修改。',
1777
+ cannotDeleteMetaView: '该视图为内置视图,由代码定义,无法删除。',
1699
1778
  expandToPage: '以完整页面打开',
1700
1779
  objectNotFound: '未找到对象',
1701
1780
  objectNotFoundDescription: '对象"{{objectName}}"在当前配置中不存在。',
@@ -1734,7 +1813,7 @@ const zh = {
1734
1813
  exportPrintHint: '导出格式、打印和记录数显示',
1735
1814
  showAllFields: '全部显示',
1736
1815
  hideAllFields: '全部隐藏',
1737
- searchFields: '搜索字段...',
1816
+ searchFields: '搜索字段…',
1738
1817
  title: '标题',
1739
1818
  description: '描述',
1740
1819
  data: '数据',
@@ -1813,8 +1892,8 @@ const zh = {
1813
1892
  imageField: '图片字段',
1814
1893
  imageFieldHelp: '画廊封面来自该图片或附件字段。',
1815
1894
  dateField: '日期字段',
1816
- selectField: '选择字段...',
1817
- selectOption: '选择...',
1895
+ selectField: '选择字段…',
1896
+ selectOption: '选择…',
1818
1897
  noEligibleFieldForType: '没有符合条件的字段。请先在对象上添加该类型字段。',
1819
1898
  viewTypeUnavailable: '该对象缺少所需的“{{field}}”字段。',
1820
1899
  viewTypeUnavailableShort: '当前对象不支持。',
@@ -1888,7 +1967,7 @@ const zh = {
1888
1967
  ufDropdown: '下拉菜单',
1889
1968
  ufTabs: '标签页',
1890
1969
  ufToggle: '开关',
1891
- ufAddField: '+ 添加筛选字段...',
1970
+ ufAddField: '+ 添加筛选字段…',
1892
1971
  ufNoFields: '无可用字段',
1893
1972
  ufAddTab: '+ 添加标签页',
1894
1973
  ufTabLabel: '标签',
@@ -1920,7 +1999,7 @@ const zh = {
1920
1999
  passwordPlaceholder: '输入您的密码',
1921
2000
  forgotPasswordText: '忘记密码?',
1922
2001
  submitButton: '登录',
1923
- submittingButton: '登录中...',
2002
+ submittingButton: '登录中…',
1924
2003
  noAccountText: '还没有账户?',
1925
2004
  signUpText: '注册',
1926
2005
  signingIn: '正在登录…',
@@ -1935,6 +2014,18 @@ const zh = {
1935
2014
  emailNotVerified: '请先验证您的邮箱后再登录。',
1936
2015
  oauthCallbackFailed: '单点登录未能完成——登录链接已过期或已被使用,请重新发起登录。',
1937
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: '改用密码登录',
1938
2029
  },
1939
2030
  register: {
1940
2031
  title: '创建账户',
@@ -1950,7 +2041,7 @@ const zh = {
1950
2041
  passwordMismatchError: '两次输入的密码不一致',
1951
2042
  passwordTooShortError: '密码至少需要8个字符',
1952
2043
  submitButton: '创建账户',
1953
- submittingButton: '创建中...',
2044
+ submittingButton: '创建中…',
1954
2045
  hasAccountText: '已有账户?',
1955
2046
  signInText: '登录',
1956
2047
  errors: {
@@ -1971,12 +2062,26 @@ const zh = {
1971
2062
  emailLabel: '邮箱',
1972
2063
  emailPlaceholder: 'name@example.com',
1973
2064
  submitButton: '发送重置链接',
1974
- submittingButton: '发送中...',
2065
+ submittingButton: '发送中…',
1975
2066
  successTitle: '请查看您的邮箱',
1976
2067
  successDescription: '我们已将密码重置链接发送至 {{email}},请检查您的收件箱。',
1977
2068
  backToSignInText: '返回登录',
1978
2069
  rememberPasswordText: '记住密码了?',
1979
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: '您的密码已重置,现在可以使用新密码登录了。',
1980
2085
  },
1981
2086
  setPassword: {
1982
2087
  title: '设置一个备用密码',
@@ -2029,6 +2134,8 @@ const zh = {
2029
2134
  backToLogin: '返回登录',
2030
2135
  checkSpam: '没有收到邮件?请检查垃圾邮件文件夹或联系支持。',
2031
2136
  or: '或',
2137
+ // objectui#3546 slice three.
2138
+ resendUnavailable: '此环境可能未配置邮件发送服务。如果问题持续存在,请联系支持。',
2032
2139
  },
2033
2140
  setup: {
2034
2141
  welcomeTitle: '欢迎使用 ObjectStack',
@@ -2067,6 +2174,9 @@ const zh = {
2067
2174
  invalidDescription: 'URL 中未提供设备代码。',
2068
2175
  loading: '加载中…',
2069
2176
  cancel: '取消',
2177
+ // objectui#3546 slice three — device-authorization plugin switched off.
2178
+ disabledTitle: '未启用设备授权',
2179
+ disabledDescription: '此部署未启用设备授权,因此无法在此批准该设备。',
2070
2180
  },
2071
2181
  shell: {
2072
2182
  tenantHostHint: '您正在登录此工作区',
@@ -2106,6 +2216,29 @@ const zh = {
2106
2216
  },
2107
2217
  },
2108
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
+ },
2109
2242
  profile: {
2110
2243
  title: '个人资料',
2111
2244
  subtitle: '管理您的账户设置',
@@ -2167,6 +2300,8 @@ const zh = {
2167
2300
  invite: '邀请成员',
2168
2301
  members: '成员',
2169
2302
  settings: '工作区设置',
2303
+ multiOrgDisabled: '此实例已禁用创建新组织。',
2304
+ createFailed: '创建工作区失败',
2170
2305
  },
2171
2306
  help: {
2172
2307
  keyboardShortcuts: '键盘快捷键',
@@ -2187,7 +2322,7 @@ const zh = {
2187
2322
  area: '区域',
2188
2323
  scope: '范围',
2189
2324
  packageManagement: '软件包管理',
2190
- searchNavigation: '搜索导航...',
2325
+ searchNavigation: '搜索导航…',
2191
2326
  recent: '最近使用',
2192
2327
  favorites: '收藏',
2193
2328
  starred: '已收藏',
@@ -2203,8 +2338,8 @@ const zh = {
2203
2338
  switchObject: '切换对象',
2204
2339
  connection: {
2205
2340
  connected: '已连接',
2206
- connecting: '连接中...',
2207
- reconnecting: '正在重新连接...',
2341
+ connecting: '连接中…',
2342
+ reconnecting: '正在重新连接…',
2208
2343
  disconnected: '已断开连接',
2209
2344
  error: '连接错误',
2210
2345
  },
@@ -2247,7 +2382,7 @@ const zh = {
2247
2382
  starred: '收藏',
2248
2383
  recent: '最近访问',
2249
2384
  },
2250
- loading: '正在加载工作区...',
2385
+ loading: '正在加载工作区…',
2251
2386
  recent: '最近使用',
2252
2387
  starred: '收藏',
2253
2388
  welcome: '用 AI 搭建你的业务系统',
@@ -2270,6 +2405,13 @@ const zh = {
2270
2405
  publishing: '发布中…',
2271
2406
  published: '已发布!更改已生效。',
2272
2407
  publishFailed: '发布失败',
2408
+ // objectui#3546 切片六 —— usePublishAllDrafts 其余几条 toast。
2409
+ // seedWarn 与 console.ai.seedWarn 同串,直接沿用该键既有译文。
2410
+ nothing: '没有需要发布的内容。',
2411
+ probeWarn: '已发布,但验证发现了问题。',
2412
+ seedWarn: '已发布,但部分示例数据未能载入。',
2413
+ publishedVerified: '已发布并验证 —— {{count}} 行示例数据已生效。',
2414
+ capabilityWarn: '编写检查:{{count}} 个能力引用无法解析。',
2273
2415
  },
2274
2416
  createFirstApp: '手动创建应用',
2275
2417
  systemSettings: '系统设置',
@@ -2327,6 +2469,9 @@ const zh = {
2327
2469
  roles: '角色',
2328
2470
  configuration: '配置',
2329
2471
  createApp: '创建应用',
2472
+ administration: '管理',
2473
+ datasources: '数据源',
2474
+ documentation: '文档',
2330
2475
  },
2331
2476
  activityFeed: {
2332
2477
  title: '最近动态',
@@ -2374,6 +2519,7 @@ const zh = {
2374
2519
  empty: {
2375
2520
  objectNotFound: '未找到对象',
2376
2521
  objectNotFoundDescription: '对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。',
2522
+ interfacePageSourceMissing: '此界面页引用了 “{{name}}”,但该来源不可用。',
2377
2523
  recordNotFound: '未找到记录',
2378
2524
  recordNotFoundDescription: '您查找的记录不存在或已被删除。',
2379
2525
  pageNotFound: '未找到页面',
@@ -2384,6 +2530,11 @@ const zh = {
2384
2530
  reportNotFoundDescription: '未找到报表 “{{name}}”,可能已被删除或重命名。',
2385
2531
  noAppsConfigured: '尚未配置应用',
2386
2532
  noAppsConfiguredDescription: '当前没有任何已注册的应用。请创建您的第一个应用,或前往系统设置进行配置。',
2533
+ appNotAvailable: '应用不可用',
2534
+ appNotAvailableDescription: '此应用尚不可用 —— 可能仍在发布中。请稍后重试。',
2535
+ appAccessDenied: '你没有访问此应用的权限',
2536
+ appAccessDeniedDescription: '此应用存在,但你的账号未获授权打开它。请联系管理员为你开通访问权限。',
2537
+ appAccessDeniedHome: '返回首页',
2387
2538
  createFirstApp: '创建您的第一个应用',
2388
2539
  systemSettings: '系统设置',
2389
2540
  back: '返回',
@@ -2425,6 +2576,34 @@ const zh = {
2425
2576
  confirmNote: '发布将一次性(原子地)发布此包全部 {{count}} 个待发布草稿。',
2426
2577
  publishConfirm: '全部发布',
2427
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
+ },
2428
2607
  },
2429
2608
  renderer: {
2430
2609
  noPageSchema: '未提供页面 schema',
@@ -2491,7 +2670,7 @@ const zh = {
2491
2670
  deleteFailed: '删除视图失败',
2492
2671
  },
2493
2672
  dashboardActions: {
2494
- pdfPreparing: '正在准备 PDF 导出…',
2673
+ printDialogOpening: '正在打开浏览器打印对话框(不是导出 PDF)',
2495
2674
  exportFailed: '导出失败:{{message}}',
2496
2675
  forecastSoon: '预测视图即将上线',
2497
2676
  },
@@ -2526,6 +2705,140 @@ const zh = {
2526
2705
  emptyDescription: '创建您的第一个工作区以开始使用。',
2527
2706
  noMatches: '没有匹配的工作区。',
2528
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
+ },
2529
2842
  notifications: {
2530
2843
  regionLabel: '通知',
2531
2844
  empty: '暂无通知',
@@ -2542,6 +2855,9 @@ const zh = {
2542
2855
  viewApprovals: '查看审批',
2543
2856
  noPendingApprovals: '暂无待审批事项',
2544
2857
  openApprovalsInbox: '打开审批中心',
2858
+ badgeTotal: '共 {{total}} 项',
2859
+ badgeNotifications: '{{unread}} 条通知',
2860
+ badgeApprovals: '{{approvals}} 条待审批',
2545
2861
  },
2546
2862
  publicForm: {
2547
2863
  submit: '提交',
@@ -2815,6 +3131,7 @@ const zh = {
2815
3131
  dismiss: '关闭',
2816
3132
  openOnCloud: '在云端打开',
2817
3133
  backHome: '返回首页',
3134
+ updateTo: '更新',
2818
3135
  },
2819
3136
  install: {
2820
3137
  dialogTitle: '安装 {{name}}',
@@ -2831,6 +3148,37 @@ const zh = {
2831
3148
  localManifestConflict: '{{message}}\n提示:本地已有应用占用此 manifest_id,请先从 objectstack.config.ts 中移除。',
2832
3149
  localUnauthorized: '请先登录本运行时再试。',
2833
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
+ },
2834
3182
  },
2835
3183
  // ADR-0090 D5/D9 — 安装时建议:包声明 isDefault 的权限集建议绑定到
2836
3184
  // everyone/guest 岗位,由管理员在此确认,服务端绝不自动绑定。
@@ -3133,5 +3481,57 @@ const zh = {
3133
3481
  statusIdle: '空闲',
3134
3482
  statusAway: '离开',
3135
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
+ },
3136
3536
  };
3137
3537
  export default zh;