@object-ui/i18n 16.1.0 → 17.1.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.
@@ -88,6 +88,10 @@ const zh = {
88
88
  package: '软件包',
89
89
  },
90
90
  actions: {
91
+ decisionOutput: {
92
+ help: '作为决策输出传递给流程。',
93
+ helpMultiValue: '作为决策输出传递给流程。多个值请用逗号分隔。',
94
+ },
91
95
  resultDialog: {
92
96
  defaultTitle: '请立即保存此值',
93
97
  acknowledge: '我已保存',
@@ -108,6 +112,8 @@ const zh = {
108
112
  type: '{{field}}必须是有效的{{type}}',
109
113
  },
110
114
  form: {
115
+ noPermissionToSave: '您没有权限保存这条记录。',
116
+ submitFailed: '保存失败,请重试。',
111
117
  addItem: '添加项目',
112
118
  removeItem: '移除项目',
113
119
  fieldRequired: '此字段为必填项',
@@ -119,11 +125,13 @@ const zh = {
119
125
  discardMessage: '您有未保存的更改。如果现在关闭此表单,您的编辑将会丢失。',
120
126
  keepEditing: '继续编辑',
121
127
  discard: '放弃',
128
+ conflictTitle: '保存冲突',
129
+ conflictMessage: '您编辑期间,这条记录已被其他人修改。覆盖保存将用您的内容替换对方的修改。',
130
+ conflictLatestVersion: '对方保存时间:{{time}}',
131
+ conflictOverwrite: '覆盖保存',
122
132
  stepOf: '第{{current}}步,共{{total}}步',
123
133
  createTitle: '新建{{object}}',
124
134
  editTitle: '编辑{{object}}',
125
- createDescription: '向数据库添加新的{{object}}。',
126
- editDescription: '更新{{object}}的详情',
127
135
  saveRecord: '保存',
128
136
  create: '创建',
129
137
  update: '更新',
@@ -135,11 +143,67 @@ const zh = {
135
143
  relativeDate: {
136
144
  overdue: '逾期 {{count}} 天',
137
145
  },
146
+ file: {
147
+ dragDropHere: '拖拽文件到此处',
148
+ dropFilesHere: '松开以上传',
149
+ browseHint: '或点击浏览',
150
+ browseHintCamera: '或点击浏览 • 使用下方相机按钮',
151
+ takePhoto: '拍照',
152
+ takeSelfie: '自拍',
153
+ cameraCapture: '拍摄',
154
+ uploading: '上传中…',
155
+ uploadingPct: '上传中…({{pct}}%)',
156
+ fileFallback: '文件',
157
+ upload: '上传',
158
+ remove: '移除 {{name}}',
159
+ exceedsMaxSize: '“{{name}}” 超过大小上限({{max}} MB)',
160
+ uploadFailed: '上传 “{{name}}” 失败:{{error}}',
161
+ },
162
+ image: {
163
+ upload: '上传图片',
164
+ addMore: '添加更多图片',
165
+ uploading: '上传中…',
166
+ imageAlt: '图片 {{index}}',
167
+ crop: '裁剪图片 {{index}}',
168
+ remove: '移除图片 {{index}}',
169
+ enlarge: '放大 {{name}}',
170
+ preview: '图片预览',
171
+ previous: '上一张',
172
+ next: '下一张',
173
+ counter: '{{current}} / {{total}}',
174
+ },
138
175
  richText: {
139
176
  format: '格式: {{format}}',
140
177
  basicEditorHint: '富文本编辑器(基础)',
141
178
  placeholder: '请输入文字...',
142
179
  },
180
+ objectRef: {
181
+ loading: '正在加载对象…',
182
+ placeholder: '请选择对象',
183
+ search: '搜索对象…',
184
+ empty: '未找到对象',
185
+ },
186
+ recipient: {
187
+ selectTypeFirst: '请先选择接收方类型。',
188
+ loading: '加载中…',
189
+ search: '搜索…',
190
+ empty: '无匹配项',
191
+ select: '请选择接收方',
192
+ selectUser: '请选择用户',
193
+ selectTeam: '请选择团队',
194
+ selectBusinessUnit: '请选择业务单元',
195
+ selectPosition: '请选择岗位',
196
+ selectUnitAndSubordinates: '请选择业务单元',
197
+ },
198
+ filterCondition: {
199
+ selectObjectFirst: '请先选择对象。',
200
+ noCriteria: '未设置条件 —— 该规则不共享任何记录',
201
+ criteriaRequired: '请至少添加一个条件。没有条件的规则会共享该对象的全部记录,因此无法保存。',
202
+ invalidJson: 'JSON 无效 —— 修正之前该规则不会匹配任何记录。',
203
+ jsonOnly: '该条件只能以 JSON 方式编辑',
204
+ editAsJson: '以 JSON 编辑',
205
+ useVisualBuilder: '使用可视化构建器',
206
+ },
143
207
  },
144
208
  table: {
145
209
  rowsPerPage: '每页行数',
@@ -206,6 +270,7 @@ const zh = {
206
270
  },
207
271
  import: {
208
272
  title: '导入{{object}}',
273
+ notAllowed: '该对象未开放导入。',
209
274
  stepUpload: '上传',
210
275
  stepMapping: '字段映射',
211
276
  stepPreview: '预览',
@@ -265,6 +330,10 @@ const zh = {
265
330
  importNRows: '导入 {{count}} 行',
266
331
  importingProgress: '导入中…',
267
332
  requiredMark: '*',
333
+ optTreatHistorical: '作为历史数据导入',
334
+ optTreatHistoricalHint: '(按原样导入已完结的记录——跳过状态机校验,保留原始时间戳与作者,而不是记为当前时间)',
335
+ missingRequiredHint: '无法继续——以下必填字段未映射:{{fields}}。请在文件中添加对应的列,或返回上一步重新上传包含该列的文件。',
336
+ legacyFallbackNotice: '已通过兼容模式导入:当前连接不支持服务端导入接口,因此所有值均以文本写入,未做服务端类型转换。请升级后端/客户端以获得完整的导入支持(类型转换与关联查找)。',
268
337
  required: '必填',
269
338
  invalidType: '{{type}} 格式无效',
270
339
  legacyReferenceBlocked: '导入已阻止:{{fields}} 是关联字段,需要服务端导入接口把名称解析为记录 ID,而当前连接不支持。按纯文本导入会写坏数据。请升级后端/客户端,或取消这些列的映射后再导入。',
@@ -291,6 +360,12 @@ const zh = {
291
360
  // 服务端结构化导入错误的友好文案
292
361
  referenceNotFound: '找不到匹配 "{{value}}" 的记录',
293
362
  referenceAmbiguous: '"{{value}}" 匹配到多条记录,请使用唯一值或记录 ID',
363
+ invalidBoolean: '"{{value}}" 不是有效的是/否值',
364
+ invalidNumber: '"{{value}}" 不是有效的数字',
365
+ invalidDate: '"{{value}}" 不是有效的日期',
366
+ invalidOption: '"{{value}}" 不在允许的选项范围内',
367
+ requiredValue: '此字段为必填项',
368
+ matchAmbiguous: '匹配到多条已有记录,请使用唯一值或记录 ID',
294
369
  // 导入选项 / 写入模式
295
370
  options: '导入选项',
296
371
  writeMode: '当某行匹配到已有记录时',
@@ -303,6 +378,7 @@ const zh = {
303
378
  matchFieldsPlaceholder: '选择匹配字段…',
304
379
  matchFieldsHint: '按这些字段将行匹配到已有记录。',
305
380
  needMatchFields: '请至少选择一个匹配字段。',
381
+ matchOnlyField: '(仅匹配)',
306
382
  optRunAutomations: '运行自动化与触发器',
307
383
  optCreateOptions: '保留未知选项值',
308
384
  optSkipBlankKey: '跳过匹配值为空的行',
@@ -350,6 +426,7 @@ const zh = {
350
426
  confirmDefault: '此操作将应用于 {{count}} 条记录。',
351
427
  overLimit: '所选记录({{count}})超过该动作的上限({{limit}})。请减少选择后再继续。',
352
428
  affectedRecords: '受影响的记录({{count}}):',
429
+ skippedIneligible: '{{count}} 条所选记录不符合该动作的条件,将被跳过。',
353
430
  rowFallback: '第 {{index}} 行',
354
431
  andMore: '……以及另外 {{count}} 条',
355
432
  processed: '已处理 {{count}} / {{total}}',
@@ -394,6 +471,8 @@ const zh = {
394
471
  filterRecords: '筛选记录',
395
472
  sort: '排序',
396
473
  sortRecords: '排序记录',
474
+ sortByIdSuffix: '(按 ID)',
475
+ sortRelationalHint: '指向其他记录的列未列出:它们只能按存储的 ID 排序,而不是单元格中显示的名称。若要按该名称排序,请添加一个存放该名称的公式字段。',
397
476
  group: '分组',
398
477
  groupBy: '分组依据',
399
478
  export: '导出',
@@ -412,6 +491,12 @@ const zh = {
412
491
  noMatchesMessage: '没有符合当前筛选或搜索条件的记录,试试调整或清除它们。',
413
492
  loadErrorTitle: '无法加载记录',
414
493
  loadErrorMessage: '加载数据时出错。请检查网络连接后重试。',
494
+ loadErrorForbiddenTitle: '无权访问',
495
+ loadErrorForbiddenMessage: '你没有查看这些记录的权限。如需访问,请联系管理员。',
496
+ loadErrorUnauthorizedTitle: '需要登录',
497
+ loadErrorUnauthorizedMessage: '登录状态已过期或已退出。请重新登录后查看这些记录。',
498
+ loadErrorRejectedTitle: '该视图的查询被拒绝',
499
+ loadErrorRejectedMessage: '服务器无法处理该视图的筛选条件或查询参数。清除筛选条件通常即可恢复;如果视图本身就是这样保存的,需要管理员修正。',
415
500
  retry: '重试',
416
501
  managedBy: {
417
502
  system: {
@@ -487,6 +572,7 @@ const zh = {
487
572
  deleteColumn: '删除列',
488
573
  noCards: '暂无卡片',
489
574
  cardTitlePlaceholder: '输入卡片标题...',
575
+ uncategorized: '未分类',
490
576
  },
491
577
  timeline: {
492
578
  bucket: {
@@ -642,9 +728,15 @@ const zh = {
642
728
  editInlineHint: '双击编辑',
643
729
  lockedByApproval: '审批中已锁定',
644
730
  lockedTooltip: '该记录有待审批的请求,编辑已被锁定',
731
+ writeStrippedTitle: '部分字段未保存',
732
+ writeStrippedReadonly: '以下字段为只读,未保存:{{fields}}',
733
+ writeStrippedByState: '以下字段在记录当前状态下不可编辑,未保存:{{fields}}',
734
+ approvalPendingEditable: '审批中 · 可编辑',
735
+ approvalPendingTooltip: '该记录有待审批的请求,但当前审批节点仍允许编辑',
645
736
  cancelApproval: '撤回审批',
646
737
  cancelApprovalInFlight: '撤回中…',
647
738
  cancelApprovalTooltip: '撤回当前的待审批请求以解除记录锁定',
739
+ cancelApprovalTooltipUnlocked: '撤回当前的待审批请求',
648
740
  cancelApprovalFailed: '撤回审批失败',
649
741
  cancelApprovalUnavailable: '当前数据源不支持撤回审批',
650
742
  linkCopied: '链接已复制到剪贴板',
@@ -731,6 +823,18 @@ const zh = {
731
823
  attachmentCount: '{{count}} 个附件',
732
824
  attachmentCountPlural: '{{count}} 个附件',
733
825
  removeAttachment: '移除附件',
826
+ // Record Attachments panel (enable.files, objectstack#4358)
827
+ attachments: '附件',
828
+ uploadAttachment: '上传',
829
+ loadingAttachments: '正在加载附件…',
830
+ noAttachments: '暂无附件。上传一个文件开始吧。',
831
+ downloadAttachment: '下载',
832
+ deleteAttachment: '删除附件',
833
+ attachmentDeleteDenied: '只有上传者或可编辑此记录的用户才能删除此附件。',
834
+ attachmentParentAccessDenied: '您无权为此记录添加附件。',
835
+ attachmentDownloadDenied: '您无权下载此附件。',
836
+ attachmentAuthRequired: '请登录后再下载此附件。',
837
+ attachmentPermissionDenied: '您没有执行此操作的权限。',
734
838
  // Diff
735
839
  unifiedDiff: '统一视图',
736
840
  sideBySideDiff: '并排视图',
@@ -1150,6 +1254,7 @@ const zh = {
1150
1254
  navTypeGroup: '分组',
1151
1255
  navTypeSeparator: '分隔线',
1152
1256
  navTypeAction: '操作',
1257
+ navTypeComponent: '组件',
1153
1258
  navEditIcon: '编辑图标',
1154
1259
  navToggleVisible: '切换可见性',
1155
1260
  navHidden: '已隐藏',
@@ -1266,6 +1371,23 @@ const zh = {
1266
1371
  dragToReorder: '拖动以重新排序',
1267
1372
  favorites: '收藏',
1268
1373
  },
1374
+ settingsHub: {
1375
+ title: '设置',
1376
+ subtitle: '配置工作区、集成与功能开关。',
1377
+ loadError: '加载设置失败',
1378
+ empty: '尚未注册任何设置。插件可通过 SettingsService 注册设置清单。',
1379
+ settingsCount: '{{n}} 项设置',
1380
+ beta: 'Beta',
1381
+ // 分类小标题,按 manifest 的 `category` 值取键;未知(插件自定义)分类回退到原始字符串。
1382
+ categories: {
1383
+ Workspace: '工作区',
1384
+ Communication: '通讯',
1385
+ Security: '安全',
1386
+ Infrastructure: '基础设施',
1387
+ Beta: 'Beta',
1388
+ Other: '其他',
1389
+ },
1390
+ },
1269
1391
  loadingSteps: {
1270
1392
  connecting: '正在连接数据源',
1271
1393
  loadingConfig: '正在加载配置',
@@ -1302,6 +1424,7 @@ const zh = {
1302
1424
  toggleDarkMode: '切换深色模式',
1303
1425
  },
1304
1426
  commandPalette: {
1427
+ title: '命令面板',
1305
1428
  placeholder: '输入命令或搜索...',
1306
1429
  noResults: '未找到结果。',
1307
1430
  searching: '搜索中…',
@@ -1428,6 +1551,21 @@ const zh = {
1428
1551
  planApproveMessage: '确认,开始搭建。',
1429
1552
  planApproveDefaultsMessage: '确认搭建,未决问题按你的合理假设和默认处理。',
1430
1553
  planAnswerMessage: '关于「{{question}}」,我选择「{{option}}」。',
1554
+ changesTitle: '确认改动',
1555
+ changesConfirmed: '已确认',
1556
+ changesConfirm: '确认修改',
1557
+ changesConfirmHint: '回复以确认或调整该改动。',
1558
+ changesConfirmMessage: '确认修改,应用你刚才提议的改动。',
1559
+ changeVerb: {
1560
+ createObject: '新建对象',
1561
+ addField: '新增字段',
1562
+ modifyField: '修改字段',
1563
+ deleteField: '删除字段',
1564
+ createMetadata: '新建',
1565
+ updateMetadata: '修改',
1566
+ createSeed: '生成示例数据',
1567
+ createPackage: '新建应用包',
1568
+ },
1431
1569
  justNow: '刚刚',
1432
1570
  minutesAgo: '{{count}} 分钟前',
1433
1571
  hoursAgo: '{{count}} 小时前',
@@ -1449,6 +1587,8 @@ const zh = {
1449
1587
  buildCrm: '帮我搭建一个 CRM:客户、联系人、商机,并建立它们之间的关系。',
1450
1588
  buildApp: '做一个项目管理应用:项目、任务、成员。',
1451
1589
  buildFlow: '设计一个工单系统:工单、优先级、状态流转。',
1590
+ buildInventory: '做一个库存管理应用:商品、库存量、供应商,以及低库存预警。',
1591
+ buildRecruiting: '做一个招聘跟踪应用:候选人、在招岗位、面试阶段和面试记录。',
1452
1592
  },
1453
1593
  generic: {
1454
1594
  help: '你可以帮我做什么?',
@@ -1878,6 +2018,40 @@ const zh = {
1878
2018
  shell: {
1879
2019
  tenantHostHint: '您正在登录此工作区',
1880
2020
  },
2021
+ layout: {
2022
+ headline: '更快地构建强大的业务应用。',
2023
+ subhead: '面向企业数据管理、工作流与分析的统一平台。',
2024
+ },
2025
+ remediation: {
2026
+ signOut: '改为退出登录',
2027
+ password: {
2028
+ title: '您的密码已过期',
2029
+ fallbackMessage: '请设置新密码后继续。',
2030
+ current: '当前密码',
2031
+ next: '新密码',
2032
+ confirm: '确认新密码',
2033
+ submit: '修改密码并继续',
2034
+ submitting: '正在更新…',
2035
+ mismatch: '两次输入的新密码不一致。',
2036
+ failed: '无法修改密码。',
2037
+ },
2038
+ mfa: {
2039
+ title: '设置双重验证',
2040
+ fallbackMessage: '您的组织要求使用身份验证器应用后方可继续。',
2041
+ confirmPassword: '确认您的密码',
2042
+ continue: '继续',
2043
+ preparing: '正在准备…',
2044
+ enrollFailed: '无法开始绑定。',
2045
+ scanTitle: '使用身份验证器扫码',
2046
+ scanBody: '使用 Google Authenticator、1Password、Authy 等应用扫描此二维码,然后输入 6 位验证码。',
2047
+ backupTitle: '保存您的备用码',
2048
+ backupBody: '请妥善保管——设备丢失时每个备用码可使用一次。',
2049
+ codeLabel: '6 位验证码',
2050
+ verify: '验证并继续',
2051
+ verifying: '正在验证…',
2052
+ invalidCode: '验证码无效,请重试。',
2053
+ },
2054
+ },
1881
2055
  },
1882
2056
  profile: {
1883
2057
  title: '个人资料',
@@ -1942,6 +2116,7 @@ const zh = {
1942
2116
  settings: '工作区设置',
1943
2117
  },
1944
2118
  help: {
2119
+ keyboardShortcuts: '键盘快捷键',
1945
2120
  onThisPage: '本页目录',
1946
2121
  appDocs: '本应用文档',
1947
2122
  allDocs: '全部文档',
@@ -1972,6 +2147,7 @@ const zh = {
1972
2147
  offline: '离线',
1973
2148
  usersOnline: '当前在线用户',
1974
2149
  switchView: '切换视图',
2150
+ switchObject: '切换对象',
1975
2151
  connection: {
1976
2152
  connected: '已连接',
1977
2153
  connecting: '连接中...',
@@ -1991,6 +2167,14 @@ const zh = {
1991
2167
  subtitle: '您的工作区仪表盘',
1992
2168
  nav: '首页',
1993
2169
  allApps: '全部应用',
2170
+ yourApps: '我的应用',
2171
+ showMoreApps: '更多',
2172
+ showLess: '收起',
2173
+ continueEmpty: '你打开过的内容会显示在这里。',
2174
+ actionCenter: {
2175
+ title: '待办事项',
2176
+ empty: '全部处理完毕',
2177
+ },
1994
2178
  greetingMorning: '早上好',
1995
2179
  greetingAfternoon: '下午好',
1996
2180
  greetingEvening: '晚上好',
@@ -2209,8 +2393,8 @@ const zh = {
2209
2393
  description: '请填写以下信息以继续操作。',
2210
2394
  selectPlaceholder: '请选择 {{label}}',
2211
2395
  requiredError: '{{label}} 为必填项',
2212
- lookupPlaceholder: '粘贴 {{label}} 的记录 ID(UUID)',
2213
- lookupHelpText: '请输入引用记录的 ID。可视化选择器即将上线。',
2396
+ lookupPlaceholder: '{{label}} 的记录 ID',
2397
+ lookupHelpText: '该参数未配置引用对象,无法使用记录选择器。请直接填写记录 ID,或联系管理员修正该动作参数。',
2214
2398
  cancel: '取消',
2215
2399
  confirm: '确认',
2216
2400
  uploading: '上传中…',
@@ -2297,6 +2481,10 @@ const zh = {
2297
2481
  filterAll: '全部',
2298
2482
  markAllRead: '全部标记为已读',
2299
2483
  viewAll: '查看全部通知',
2484
+ groupCount: '{{count}} 条通知',
2485
+ groupUnread: '{{count}} 条未读',
2486
+ groupMarkRead: '标记已读',
2487
+ groupMarkReadTitle: '将此类通知全部标记为已读',
2300
2488
  approvalsPending: '{{count}} 条待审批',
2301
2489
  viewApprovals: '查看审批',
2302
2490
  noPendingApprovals: '暂无待审批事项',
@@ -2409,6 +2597,93 @@ const zh = {
2409
2597
  done: '完成——隐藏',
2410
2598
  },
2411
2599
  },
2600
+ excelImport: {
2601
+ noImportableFields: '该对象没有可导入的字段。',
2602
+ schemaReadFailed: '无法读取对象结构。',
2603
+ imported: '已把 {{count}} 行真实数据导入「{{object}}」。',
2604
+ importFrom: '把真实数据导入自',
2605
+ into: '到',
2606
+ opening: '打开中…',
2607
+ importAction: '导入',
2608
+ dismiss: '忽略',
2609
+ },
2610
+ cloudOnboarding: {
2611
+ hintCreate: '创建你的第一个环境——一个独立的工作区,有自己的网址、数据库和套餐。应用的搭建在里面进行。',
2612
+ hintReady: '你的生产环境已就绪。打开它来搭建和运行应用——这些都在环境内部进行。',
2613
+ createEnvironment: '创建你的环境',
2614
+ openProduction: '打开生产环境',
2615
+ manageEnvironments: '管理环境',
2616
+ },
2617
+ aiModelStatus: {
2618
+ summary: '构建 / 提问使用 {{conversational}}({{conversationalSource}});结构化使用 {{structured}}({{structuredSource}})。',
2619
+ summaryRouting: '路由策略:免费方案 → {{free}},付费方案 → {{paid}}。',
2620
+ modelUnknown: '未知',
2621
+ sourceUnknown: '适配器未上报',
2622
+ rowConversational: 'Build / Ask 模型',
2623
+ rowStructured: '结构化(蓝图 / 种子)',
2624
+ rowReasoning: '推理强度',
2625
+ readFailed: '无法读取有效 AI 模型。该环境可能未运行 AI 服务,或你没有 ai:read 权限。',
2626
+ readFailedWithStatus: '无法读取有效 AI 模型(HTTP {{status}})。该环境可能未运行 AI 服务,或你没有 ai:read 权限。',
2627
+ overridesInEffect: '生效的 env 覆盖:',
2628
+ noOverrides: '无 —— 跑的是部署代码的默认值。',
2629
+ adapter: '适配器:',
2630
+ sourceCodeDefault: '代码默认(无 env 覆盖)',
2631
+ sourceInherits: '与 build/ask 相同',
2632
+ sourcePinned: '被 {{source}} 钉住',
2633
+ },
2634
+ chatbotError: {
2635
+ title: '响应失败',
2636
+ fallbackDetail: '出了点问题,请重试。',
2637
+ details: '详情',
2638
+ hide: '隐藏',
2639
+ retry: '重试',
2640
+ },
2641
+ chatbotQuota: {
2642
+ title: '需要升级',
2643
+ fallbackMessage: 'AI 额度已用完。',
2644
+ buyCredits: '购买额度包',
2645
+ upgradePlan: '升级方案',
2646
+ },
2647
+ environment: {
2648
+ addEnvironment: '新建环境',
2649
+ setUpProduction: '创建你的生产环境',
2650
+ addDevelopment: '新建开发环境',
2651
+ },
2652
+ cloudConnection: {
2653
+ checking: '正在检查连接…',
2654
+ retry: '重试',
2655
+ errors: {
2656
+ expired: '请求在获批前已过期,请重新开始。',
2657
+ bindFailed: '绑定失败。',
2658
+ deviceCodeFailed: '设备码请求失败。',
2659
+ },
2660
+ waiting: {
2661
+ popupOpened: '请在刚打开的窗口中批准此连接——本页面会自动更新。',
2662
+ polling: '正在等待云端控制台批准…',
2663
+ openApproval: '打开批准页面',
2664
+ copy: '复制',
2665
+ copied: '已复制',
2666
+ codePrefilled: '批准页面已自动填入该代码。',
2667
+ openItHere: '窗口没有出现?点此打开',
2668
+ cancel: '取消',
2669
+ },
2670
+ bound: {
2671
+ title: '已连接到 ObjectStack 云',
2672
+ runtime: '运行时',
2673
+ organization: '组织',
2674
+ approvedBy: '批准人',
2675
+ runtimeId: '运行时 ID',
2676
+ environment: '环境',
2677
+ since: '连接于',
2678
+ privatePackages: '组织的私有包现已显示在应用市场的「你的组织」分类下。',
2679
+ disconnect: '断开连接',
2680
+ },
2681
+ unbound: {
2682
+ title: '未连接',
2683
+ body: '将此运行时连接到 ObjectStack 控制平面,即可浏览并安装组织的私有包。只需在云账户中点击一次批准——无需在本页面输入任何 ID 或凭据。',
2684
+ connect: '连接',
2685
+ },
2686
+ },
2412
2687
  marketplace: {
2413
2688
  title: '应用市场',
2414
2689
  subtitle: '浏览已通过审核、发布到 ObjectStack 目录中的应用。点击应用查看详情并安装到你的某个环境中。',
@@ -2543,6 +2818,14 @@ const zh = {
2543
2818
  yearsAgo: '{{count}} 年前',
2544
2819
  },
2545
2820
  },
2821
+ approvals: {
2822
+ approve: '批准',
2823
+ reject: '驳回',
2824
+ comment: '审批意见(可选)',
2825
+ approveSuccess: '已批准',
2826
+ rejectSuccess: '已驳回',
2827
+ rejectConfirm: '确定驳回该审批请求吗?',
2828
+ },
2546
2829
  approvalsInbox: {
2547
2830
  loadMore: '加载更多',
2548
2831
  loadingMore: '加载中…',
@@ -2567,13 +2850,28 @@ const zh = {
2567
2850
  slaRemaining: 'SLA 剩余 {{dur}}',
2568
2851
  slaOverdue: 'SLA 已超期 {{dur}}',
2569
2852
  actReassign: '转签',
2853
+ reassignFromTo: '从 {{from}} 转给 {{to}}',
2570
2854
  actRemind: '催办',
2571
2855
  actRequestInfo: '要求补充材料',
2572
2856
  actComment: '评论',
2573
2857
  stepProgress: '审批步骤',
2574
2858
  prevRequest: '上一条',
2575
2859
  nextRequest: '下一条',
2576
- positionOf: '第 {{index}} / {{total}} 条',
2860
+ positionOf: '第 {{index}} / {{total}} 条请求',
2861
+ progressApprovals: '审批进度 — {{got}} / {{need}}',
2862
+ progressGroups: '会签进度 — {{got}} / {{need}} 组',
2863
+ progressEligible: '{{count}} 位可审批人',
2864
+ progressBar: '决策进度',
2865
+ declaredActions: '操作',
2866
+ attachmentChip: '附件',
2867
+ attachmentOpenFailed: '无法打开附件,请重试',
2868
+ approveOneTitle: '通过“{{title}}”?',
2869
+ approveOneBody: '将以你的身份通过该请求。如需填写审批意见或附件,请打开该请求处理。',
2870
+ flowOrigin: '流程发起',
2871
+ sortBy: '排序',
2872
+ sortRecent: '最新优先',
2873
+ sortOldest: '最早优先',
2874
+ sortAmount: '金额(从高到低)',
2577
2875
  quickPhrase1: '同意,符合要求。',
2578
2876
  quickPhrase2: '有条件同意,请关注执行情况。',
2579
2877
  quickPhrase3: '请补充相关材料后重新提交。',
@@ -181,19 +181,24 @@ export declare function useObjectLabel(): {
181
181
  sectionLabel: (objectName: string, sectionName: string, fallback: string) => string;
182
182
  /**
183
183
  * Resolve translated action label.
184
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.label`.
185
- * Falls back to `{ns}.globalActions.{actionName}.label` when objectName is omitted.
184
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.label`,
185
+ * falling back to `{ns}.globalActions.{actionName}.label` — both when
186
+ * objectName is omitted AND when the object-scoped key misses (so a
187
+ * globalAction surfaced on a record-detail action bar still resolves;
188
+ * objectui#3372).
186
189
  */
187
190
  actionLabel: (objectName: string | undefined, actionName: string, fallback: string) => string;
188
191
  /**
189
192
  * Resolve translated action confirmation prompt.
190
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.confirmText`.
193
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.confirmText`,
194
+ * falling back to `{ns}.globalActions.{actionName}.confirmText`.
191
195
  * Returns undefined when no translation and no fallback exist.
192
196
  */
193
197
  actionConfirm: (objectName: string | undefined, actionName: string, fallback?: string) => string | undefined;
194
198
  /**
195
199
  * Resolve translated action success message.
196
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.successMessage`.
200
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.successMessage`,
201
+ * falling back to `{ns}.globalActions.{actionName}.successMessage`.
197
202
  */
198
203
  actionSuccess: (objectName: string | undefined, actionName: string, fallback?: string) => string | undefined;
199
204
  /**
@@ -208,8 +213,9 @@ export declare function useObjectLabel(): {
208
213
  * Resolve a translated copy of an action's post-success RESULT DIALOG
209
214
  * (`title` / `description` / `acknowledge` + per-field labels).
210
215
  * Convention: `{ns}.objects.{objectName}._actions.{actionName}.resultDialog.*`,
211
- * falling back to `{ns}.globalActions.{actionName}.resultDialog.*` when
212
- * objectName is omitted, then to the metadata's literal strings.
216
+ * falling back to `{ns}.globalActions.{actionName}.resultDialog.*` (when
217
+ * objectName is omitted OR the object-scoped key misses), then to the
218
+ * metadata's literal strings.
213
219
  *
214
220
  * The `fields` translation node is keyed by the LITERAL result-field path
215
221
  * from the action metadata (may contain dots, e.g. `"user.email"`), so it
@@ -395,19 +401,24 @@ export declare function useSafeFieldLabel(): {
395
401
  sectionLabel: (objectName: string, sectionName: string, fallback: string) => string;
396
402
  /**
397
403
  * Resolve translated action label.
398
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.label`.
399
- * Falls back to `{ns}.globalActions.{actionName}.label` when objectName is omitted.
404
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.label`,
405
+ * falling back to `{ns}.globalActions.{actionName}.label` — both when
406
+ * objectName is omitted AND when the object-scoped key misses (so a
407
+ * globalAction surfaced on a record-detail action bar still resolves;
408
+ * objectui#3372).
400
409
  */
401
410
  actionLabel: (objectName: string | undefined, actionName: string, fallback: string) => string;
402
411
  /**
403
412
  * Resolve translated action confirmation prompt.
404
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.confirmText`.
413
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.confirmText`,
414
+ * falling back to `{ns}.globalActions.{actionName}.confirmText`.
405
415
  * Returns undefined when no translation and no fallback exist.
406
416
  */
407
417
  actionConfirm: (objectName: string | undefined, actionName: string, fallback?: string) => string | undefined;
408
418
  /**
409
419
  * Resolve translated action success message.
410
- * Convention: `{ns}.objects.{objectName}._actions.{actionName}.successMessage`.
420
+ * Convention: `{ns}.objects.{objectName}._actions.{actionName}.successMessage`,
421
+ * falling back to `{ns}.globalActions.{actionName}.successMessage`.
411
422
  */
412
423
  actionSuccess: (objectName: string | undefined, actionName: string, fallback?: string) => string | undefined;
413
424
  /**
@@ -422,8 +433,9 @@ export declare function useSafeFieldLabel(): {
422
433
  * Resolve a translated copy of an action's post-success RESULT DIALOG
423
434
  * (`title` / `description` / `acknowledge` + per-field labels).
424
435
  * Convention: `{ns}.objects.{objectName}._actions.{actionName}.resultDialog.*`,
425
- * falling back to `{ns}.globalActions.{actionName}.resultDialog.*` when
426
- * objectName is omitted, then to the metadata's literal strings.
436
+ * falling back to `{ns}.globalActions.{actionName}.resultDialog.*` (when
437
+ * objectName is omitted OR the object-scoped key misses), then to the
438
+ * metadata's literal strings.
427
439
  *
428
440
  * The `fields` translation node is keyed by the LITERAL result-field path
429
441
  * from the action metadata (may contain dots, e.g. `"user.email"`), so it