codexmate 0.0.27 → 0.0.28

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 (137) hide show
  1. package/README.md +421 -421
  2. package/README.zh.md +354 -354
  3. package/cli/agents-files.js +224 -224
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +375 -375
  6. package/cli/builtin-proxy.js +1620 -1299
  7. package/cli/claude-proxy.js +1022 -1022
  8. package/cli/config-bootstrap.js +384 -384
  9. package/cli/config-health.js +338 -338
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/openai-bridge.js +1489 -1091
  13. package/cli/openclaw-config.js +629 -629
  14. package/cli/session-convert-args.js +65 -65
  15. package/cli/session-convert-io.js +82 -82
  16. package/cli/session-convert.js +43 -43
  17. package/cli/session-usage.concurrent.js +28 -28
  18. package/cli/session-usage.js +118 -118
  19. package/cli/session-usage.models.js +176 -176
  20. package/cli/skills.js +1141 -1141
  21. package/cli/zip-commands.js +510 -510
  22. package/cli.js +15264 -15251
  23. package/lib/automation.js +404 -404
  24. package/lib/cli-file-utils.js +151 -151
  25. package/lib/cli-models-utils.js +440 -379
  26. package/lib/cli-network-utils.js +190 -190
  27. package/lib/cli-path-utils.js +85 -85
  28. package/lib/cli-session-utils.js +121 -121
  29. package/lib/cli-sessions.js +417 -417
  30. package/lib/cli-utils.js +155 -155
  31. package/lib/download-artifacts.js +92 -92
  32. package/lib/mcp-stdio.js +453 -453
  33. package/lib/task-orchestrator.js +869 -869
  34. package/lib/text-diff.js +303 -303
  35. package/lib/workflow-engine.js +340 -340
  36. package/package.json +3 -1
  37. package/plugins/README.md +20 -20
  38. package/plugins/README.zh-CN.md +20 -20
  39. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  40. package/plugins/prompt-templates/computed.mjs +253 -253
  41. package/plugins/prompt-templates/index.mjs +8 -8
  42. package/plugins/prompt-templates/manifest.mjs +15 -15
  43. package/plugins/prompt-templates/methods.mjs +553 -619
  44. package/plugins/prompt-templates/overview.mjs +91 -90
  45. package/plugins/prompt-templates/ownership.mjs +19 -19
  46. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  47. package/plugins/prompt-templates/storage.mjs +64 -64
  48. package/plugins/registry.mjs +16 -16
  49. package/web-ui/app.js +625 -634
  50. package/web-ui/index.html +35 -35
  51. package/web-ui/logic.agents-diff.mjs +386 -386
  52. package/web-ui/logic.claude.mjs +168 -168
  53. package/web-ui/logic.codex.mjs +56 -0
  54. package/web-ui/logic.mjs +5 -5
  55. package/web-ui/logic.runtime.mjs +128 -128
  56. package/web-ui/logic.session-convert.mjs +70 -70
  57. package/web-ui/logic.sessions.mjs +765 -765
  58. package/web-ui/modules/api.mjs +90 -90
  59. package/web-ui/modules/app.computed.dashboard.mjs +225 -171
  60. package/web-ui/modules/app.computed.index.mjs +17 -17
  61. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  62. package/web-ui/modules/app.computed.session.mjs +994 -994
  63. package/web-ui/modules/app.constants.mjs +15 -15
  64. package/web-ui/modules/app.methods.agents.mjs +632 -632
  65. package/web-ui/modules/app.methods.claude-config.mjs +190 -184
  66. package/web-ui/modules/app.methods.codex-config.mjs +892 -860
  67. package/web-ui/modules/app.methods.index.mjs +92 -92
  68. package/web-ui/modules/app.methods.install.mjs +205 -205
  69. package/web-ui/modules/app.methods.navigation.mjs +743 -743
  70. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  71. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  72. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  73. package/web-ui/modules/app.methods.providers.mjs +412 -404
  74. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  75. package/web-ui/modules/app.methods.session-actions.mjs +593 -596
  76. package/web-ui/modules/app.methods.session-browser.mjs +984 -989
  77. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  78. package/web-ui/modules/app.methods.session-trash.mjs +439 -439
  79. package/web-ui/modules/app.methods.startup-claude.mjs +533 -526
  80. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  81. package/web-ui/modules/config-mode.computed.mjs +124 -124
  82. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  83. package/web-ui/modules/i18n.dict.mjs +2109 -2131
  84. package/web-ui/modules/i18n.mjs +56 -56
  85. package/web-ui/modules/plugins.computed.mjs +3 -3
  86. package/web-ui/modules/plugins.methods.mjs +3 -3
  87. package/web-ui/modules/plugins.storage.mjs +11 -11
  88. package/web-ui/modules/provider-url-display.mjs +17 -0
  89. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  90. package/web-ui/modules/skills.computed.mjs +107 -107
  91. package/web-ui/modules/skills.methods.mjs +481 -481
  92. package/web-ui/partials/index/layout-footer.html +13 -13
  93. package/web-ui/partials/index/layout-header.html +475 -475
  94. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  95. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  96. package/web-ui/partials/index/modal-health-check.html +45 -45
  97. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  98. package/web-ui/partials/index/modal-skills.html +200 -200
  99. package/web-ui/partials/index/modals-basic.html +165 -165
  100. package/web-ui/partials/index/panel-config-claude.html +188 -187
  101. package/web-ui/partials/index/panel-config-codex.html +312 -283
  102. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  103. package/web-ui/partials/index/panel-dashboard.html +186 -186
  104. package/web-ui/partials/index/panel-docs.html +147 -147
  105. package/web-ui/partials/index/panel-market.html +177 -177
  106. package/web-ui/partials/index/panel-orchestration.html +391 -391
  107. package/web-ui/partials/index/panel-plugins.html +253 -279
  108. package/web-ui/partials/index/panel-sessions.html +316 -326
  109. package/web-ui/partials/index/panel-settings.html +253 -274
  110. package/web-ui/partials/index/panel-usage.html +371 -371
  111. package/web-ui/res/json5.min.js +1 -1
  112. package/web-ui/res/vue.global.prod.js +13 -13
  113. package/web-ui/session-helpers.mjs +576 -576
  114. package/web-ui/source-bundle.cjs +233 -233
  115. package/web-ui/styles/base-theme.css +281 -268
  116. package/web-ui/styles/controls-forms.css +422 -423
  117. package/web-ui/styles/dashboard.css +274 -274
  118. package/web-ui/styles/docs-panel.css +247 -247
  119. package/web-ui/styles/feedback.css +108 -108
  120. package/web-ui/styles/health-check-dialog.css +144 -144
  121. package/web-ui/styles/layout-shell.css +606 -603
  122. package/web-ui/styles/modals-core.css +466 -464
  123. package/web-ui/styles/navigation-panels.css +391 -390
  124. package/web-ui/styles/openclaw-structured.css +266 -266
  125. package/web-ui/styles/plugins-panel.css +523 -523
  126. package/web-ui/styles/responsive.css +454 -454
  127. package/web-ui/styles/sessions-list.css +419 -415
  128. package/web-ui/styles/sessions-preview.css +411 -411
  129. package/web-ui/styles/sessions-toolbar-trash.css +330 -330
  130. package/web-ui/styles/sessions-usage.css +1040 -1040
  131. package/web-ui/styles/settings-panel.css +185 -185
  132. package/web-ui/styles/skills-list.css +303 -303
  133. package/web-ui/styles/skills-market.css +406 -406
  134. package/web-ui/styles/task-orchestration.css +822 -822
  135. package/web-ui/styles/titles-cards.css +472 -408
  136. package/web-ui/styles.css +21 -21
  137. package/web-ui.html +17 -17
@@ -1,2131 +1,2109 @@
1
- const DICT = Object.freeze({
2
- zh: {
3
- // Global
4
- 'lang.zh': '中文',
5
- 'lang.en': 'English',
6
- 'lang.label': '语言',
7
- 'nav.topTabs.aria': '导航',
8
-
9
- // Common
10
- 'common.all': '全部',
11
- 'common.copy': '复制',
12
- 'common.edit': '编辑',
13
- 'common.install': '安装',
14
- 'common.update': '升级',
15
- 'common.uninstall': '卸载',
16
- 'common.official': '官方',
17
- 'common.custom': '自定义',
18
- 'common.rules': '规则',
19
- 'common.troubleshooting': '排障提示',
20
- 'common.command': '命令',
21
- 'common.mirror': '镜像源',
22
- 'common.packageManager': '包管理器',
23
- 'common.action': '操作',
24
- 'common.targets': '目标数',
25
- 'common.currentPm': '当前包管理器',
26
- 'common.currentAction': '当前操作',
27
- 'common.mirrorActive': '镜像',
28
- 'common.defaultOfficial': '官方默认',
29
- 'common.cancel': '取消',
30
- 'common.confirm': '确认',
31
- 'common.add': '添加',
32
- 'common.save': '保存',
33
- 'common.saveApply': '保存并应用',
34
- 'common.close': '关闭',
35
- 'common.delete': '删除',
36
- 'common.clear': '清空',
37
- 'common.show': '显示',
38
- 'common.hide': '隐藏',
39
- 'common.detail': '详情',
40
- 'common.refresh': '刷新',
41
- 'common.refreshing': '刷新中...',
42
- 'common.loading': '加载中...',
43
- 'common.saving': '保存中...',
44
- 'common.sending': '发送中...',
45
- 'common.scanning': '扫描中...',
46
- 'common.export': '导出',
47
- 'common.import': '导入',
48
- 'common.apply': '应用',
49
- 'common.applying': '应用中...',
50
- 'common.confirming': '确认中...',
51
- 'common.writeToEditor': '写入编辑器',
52
- 'common.refreshFromText': '从文本刷新',
53
- 'common.backToEdit': '返回编辑',
54
- 'common.selectAll': '全选',
55
- 'common.unselectAll': '取消全选',
56
- 'common.resetFilters': '重置筛选',
57
- 'common.notEditable': '不可编辑',
58
- 'common.notDeletable': '不可删除',
59
- 'common.notLoaded': '未加载',
60
- 'common.exists': '已存在',
61
- 'common.notExistsWillCreateOnApply': '不存在,将在应用时创建',
62
- 'common.notExistsWillCreateOnSave': '不存在,将在保存时创建',
63
- 'common.none': '暂无',
64
- 'cli.missing.title': '{name} CLI 未安装',
65
- 'cli.missing.subtitle': '请先安装 {name} CLI 后再继续使用此页面。',
66
- 'cli.missing.openDocs': '打开安装指南',
67
- 'cli.missing.commandAria': '{name} CLI 安装命令',
68
-
69
- // Brand
70
- 'brand.kicker.workspace': '工作区',
71
- 'brand.subtitle.localConfigSessionsWorkspace': '本地配置与会话工作区',
72
-
73
- // Confirm dialog
74
- 'confirm.aria': '确认操作',
75
- 'confirm.title.default': '请确认操作',
76
- 'confirm.ok': '确认',
77
- 'confirm.cancel': '取消',
78
-
79
- // Shared fields
80
- 'field.name': '名称',
81
- 'field.configName': '配置名称',
82
- 'field.apiEndpoint': 'API 端点',
83
- 'field.apiKey': '认证密钥',
84
- 'field.baseUrl': 'Base URL',
85
- 'field.provider': '提供商',
86
- 'field.providerName': 'Provider 名称',
87
- 'field.modelName': '模型名称',
88
- 'field.model': '模型',
89
- 'field.message': '消息',
90
- 'field.varName': '变量名',
91
- 'field.targetFile': '目标文件',
92
- 'field.modelId': '模型 ID',
93
- 'field.displayName': '展示名称',
94
- 'field.contextAndMaxOutput': '上下文与最大输出',
95
- 'field.apiType': 'API 类型',
96
- 'field.env': '环境变量',
97
- 'field.allow': 'Allow',
98
- 'field.deny': 'Deny',
99
-
100
- // Shared placeholders/hints
101
- 'placeholder.providerNameExample': '例如: myapi',
102
- 'placeholder.apiEndpointExample': 'https://api.example.com/v1',
103
- 'placeholder.providerName': '提供商名称',
104
- 'placeholder.keepUnchanged': '留空则保持不变',
105
- 'hint.keepKeyUnchanged': '留空表示不修改密钥',
106
- 'placeholder.modelExample': '例如: gpt-5',
107
- 'placeholder.configNameExample': '例如: 智谱GLM',
108
- 'placeholder.apiKeyExampleClaude': 'sk-ant-...',
109
- 'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
110
- 'placeholder.selectProvider': '请选择提供商',
111
- 'placeholder.varNameExample': '例如: code',
112
- 'hint.varNameRules': '仅支持字母/数字/下划线/中划线/点,将插入为 {{var}}。',
113
-
114
- // Roles / labels
115
- 'role.you': '',
116
- 'role.provider': '提供商',
117
- 'label.model': '模型:',
118
-
119
- // Top tabs
120
- 'tab.dashboard': '概览',
121
- 'tab.docs': '文档',
122
- 'tab.config': '配置',
123
- 'tab.config.codex': 'Codex',
124
- 'tab.config.claude': 'Claude',
125
- 'tab.config.openclaw': 'OpenClaw',
126
- 'tab.sessions': '会话',
127
- 'tab.usage': '用量',
128
- 'tab.orchestration': '任务',
129
- 'tab.market': 'Skills',
130
- 'tab.plugins': '插件',
131
- 'tab.settings': '设置',
132
-
133
- // Side rail section titles
134
- 'side.overview': '概览',
135
- 'side.docs': '文档',
136
- 'side.config': '配置',
137
- 'side.sessions': '会话',
138
- 'side.plugins': '插件',
139
- 'side.system': '系统',
140
- 'side.orchestration': '任务',
141
- 'side.skills': 'Skills',
142
-
143
- // Side rail items
144
- 'side.overview.doctor': 'Doctor 面板',
145
- 'side.overview.doctor.meta': '总览 / 诊断 / 跳转',
146
- 'side.docs.cliInstall': 'CLI 安装',
147
- 'side.docs.cliInstall.meta': '安装 / 升级 / 卸载',
148
- 'side.config.codex': 'Codex',
149
- 'side.config.codex.meta': 'Provider / Model',
150
- 'side.config.claude': 'Claude Code',
151
- 'side.config.claude.meta': 'Claude Settings',
152
- 'side.config.openclaw': 'OpenClaw',
153
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
154
- 'side.sessions.browser': '会话浏览',
155
- 'side.sessions.browser.meta': '浏览 / 导出 / 清理',
156
- 'side.plugins.tools': '提示词工具',
157
- 'side.plugins.tools.meta': '模板 / 变量',
158
- 'side.system.settings': '运行设置',
159
- 'side.system.settings.meta': '数据 / 备份',
160
-
161
- // Header titles
162
- 'kicker.dashboard': 'Doctor',
163
- 'kicker.config': 'Configuration',
164
- 'kicker.sessions': 'Sessions',
165
- 'kicker.usage': 'Usage',
166
- 'kicker.orchestration': 'Tasks',
167
- 'kicker.market': 'Skills',
168
- 'kicker.plugins': 'Plugins',
169
- 'kicker.docs': 'Docs',
170
- 'kicker.settings': 'Settings',
171
-
172
- 'title.dashboard': 'Dashboard / Doctor',
173
- 'title.config': '本地配置控制台',
174
- 'title.sessions': '会话与导出',
175
- 'title.usage': '本地用量与趋势',
176
- 'title.orchestration': '任务编排',
177
- 'title.market': 'Skills 安装与同步',
178
- 'title.plugins': '插件与模板',
179
- 'title.docs': 'CLI 安装与文档',
180
- 'title.settings': '系统与数据设置',
181
-
182
- 'subtitle.dashboard': '聚合状态与诊断入口。',
183
- 'subtitle.config': '管理本地配置与模型。',
184
- 'subtitle.sessions': '浏览与导出会话。',
185
- 'subtitle.usage': '查看近 7 / 30 天用量。',
186
- 'subtitle.orchestration': '规划、排队、执行与回看本地任务。',
187
- 'subtitle.market': '管理本地 Skills。',
188
- 'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
189
- 'subtitle.docs': '查看 CLI 安装命令与排障。',
190
- 'subtitle.settings': '管理下载、目录与回收站。'
191
- ,
192
- 'dashboard.doctor.title': 'Doctor',
193
- 'dashboard.doctor.runChecks': '运行检查',
194
- 'dashboard.doctor.checking': '检查中...',
195
- 'dashboard.doctor.export': '导出报告',
196
- 'dashboard.doctor.export.json': '导出 JSON',
197
- 'dashboard.doctor.export.md': '导出 Markdown',
198
- 'dashboard.doctor.open': '打开',
199
- 'doctor.action.openConfig': '打开 Config',
200
- 'doctor.action.checkProvider': '检查 Provider 配置',
201
- 'doctor.action.openUsage': '打开 Usage',
202
- 'doctor.action.openSessions': '打开 Sessions',
203
- 'doctor.action.openTasks': '打开 Tasks',
204
- 'doctor.action.viewTaskLogs': '查看 Tasks / Logs',
205
- 'doctor.action.openSkills': '打开 Skills',
206
- 'doctor.issue.configNotReady.problem': '配置文件未就绪',
207
- 'doctor.issue.configNotReady.impact': '可能导致 provider/model 无法读取,模型列表与请求将不可用。',
208
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider 不可达',
209
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider 鉴权失败',
210
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider 返回 404',
211
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider 返回 HTTP 错误',
212
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider 探测失败',
213
- 'doctor.issue.providerUnreachable.problem.unknown': 'Provider 不可用',
214
- 'doctor.issue.providerUnreachable.impactAuth': '鉴权失败会导致模型列表/对话请求返回 401/403。',
215
- 'doctor.issue.providerUnreachable.impactNetwork': '远端不可达会导致模型列表/对话请求失败或超时。',
216
- 'doctor.issue.configHealthFailed.problem': '配置健康检查未通过',
217
- 'doctor.issue.configHealthFailed.impact': '可能导致部分功能不可用或行为不符合预期。',
218
- 'doctor.issue.usageError.problem': 'Usage 统计异常',
219
- 'doctor.issue.usageError.impact': 'Usage 页面可能无法展示趋势/汇总,Doctor 的用量诊断也会缺失。',
220
- 'doctor.issue.usageMissingModel.problem': '部分会话缺少模型信息',
221
- 'doctor.issue.usageMissingModel.impact': '会导致用量归因与成本估算不准确。',
222
- 'doctor.issue.tasksError.problem': 'Tasks 状态读取失败',
223
- 'doctor.issue.tasksError.impact': '可能导致编排队列/运行记录无法展示。',
224
- 'doctor.issue.tasksFailed.problem': '存在失败的任务运行',
225
- 'doctor.issue.tasksFailed.impact': '可能导致自动化流水线中断,需要查看日志并重试或修复输入。',
226
- 'doctor.issue.skillsError.problem': 'Skills 列表读取失败',
227
- 'doctor.issue.skillsError.impact': '会导致 Skills 页面无法正常展示或安装。',
228
- 'doctor.issue.skillsRootMissing.problem': 'Skills 目录不存在',
229
- 'doctor.issue.skillsRootMissing.impact': '会导致 Skills 安装/扫描为空;可在 Settings/Docs 按指引初始化目录。',
230
- 'doctor.issue.skillsMissingFiles.problem': '存在缺失 skill.json 的技能',
231
- 'doctor.issue.skillsMissingFiles.impact': '会导致部分技能无法被运行或同步。',
232
- 'dashboard.card.config': '配置',
233
- 'dashboard.card.sessions': '会话',
234
- 'dashboard.card.usage': '用量',
235
- 'dashboard.card.tasks': '任务',
236
- 'dashboard.card.skills': 'Skills',
237
- 'dashboard.kv.model': '模型',
238
- 'dashboard.kv.issue': '异常',
239
- 'dashboard.kv.active': '当前',
240
- 'dashboard.kv.sessions': '会话数',
241
- 'dashboard.kv.missingModel': '缺失模型',
242
- 'dashboard.kv.blockers': '阻塞',
243
- 'dashboard.kv.runs': '运行',
244
- 'dashboard.kv.target': '目标',
245
- 'dashboard.kv.root': '目录',
246
- 'dashboard.status.health': '健康',
247
- 'dashboard.status.busy': '忙闲',
248
- 'dashboard.status.models': '模型',
249
- 'dashboard.busy.init': '初始化',
250
- 'dashboard.busy.sessions': '会话加载',
251
- 'dashboard.busy.models': '模型加载',
252
- 'dashboard.busy.configApply': '配置应用',
253
- 'dashboard.busy.agents': 'AGENTS 保存',
254
- 'dashboard.busy.skills': 'Skills 管理',
255
- 'dashboard.busy.tasks': '任务编排',
256
- 'dashboard.busy.idle': '空闲',
257
- 'dashboard.message.none': '暂无提示',
258
- 'dashboard.sessionSource.codex': 'Codex',
259
- 'dashboard.sessionSource.claude': 'Claude Code',
260
- 'dashboard.sessionSource.gemini': 'Gemini CLI',
261
- 'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
262
- 'dashboard.sessionSource.all': '全部',
263
- 'dashboard.sessionPath.all': '全部路径',
264
- 'dashboard.sessionQuery.unsupported': '当前来源不支持',
265
- 'dashboard.sessionQuery.unset': '未设置',
266
- 'dashboard.healthStatus.failRead': '读取失败',
267
- 'dashboard.healthStatus.initializing': '初始化中',
268
- 'dashboard.healthStatus.ok': '正常',
269
- 'dashboard.modelStatus.loading': '加载中',
270
- 'dashboard.modelStatus.error': '加载异常',
271
- 'dashboard.modelStatus.ok': '正常',
272
- 'dashboard.health.ok': '检查通过',
273
- 'dashboard.health.fail': '检查失败',
274
- 'dashboard.health.issues': '{count} 条问题',
275
- 'dashboard.issues.title': '发现 {count} 条可操作问题',
276
- 'dashboard.state.loading': '加载中',
277
- 'dashboard.state.ready': '就绪',
278
- 'dashboard.state.idle': '未加载',
279
- 'dashboard.none': '',
280
- 'dashboard.sessions.count': '{count} 条会话',
281
- 'dashboard.usage.range': '范围 {value}',
282
- 'dashboard.tasks.queue': 'run {running} / queue {queued}',
283
- 'dashboard.skills.count': 'installed {installed} / import {importable}',
284
-
285
- // Plugins panel
286
- 'plugins.sidebar.title': 'Plugins',
287
- 'plugins.sidebar.note': '可复用的标准化工具。未来自定义插件应遵循相同结构。',
288
- 'plugins.sidebar.ariaList': '插件列表',
289
- 'plugins.main.ariaWorkspace': '插件工作区',
290
- 'plugins.refresh': '刷新',
291
- 'plugins.refreshing': '刷新中...',
292
- 'plugins.promptTemplates.title': '提示词模板',
293
- 'plugins.promptTemplates.subtitle': '内置:代码注释润色({{code}})。复制后直接粘贴到输入框即可。',
294
- 'plugins.promptTemplates.mode.aria': '提示词模板模式',
295
- 'plugins.promptTemplates.mode.compose': '生成',
296
- 'plugins.promptTemplates.mode.manage': '管理',
297
- 'plugins.promptTemplates.compose.selectTemplate': '选择模板',
298
- 'plugins.promptTemplates.compose.chooseTemplate': '选择模板',
299
- 'plugins.promptTemplates.compose.chooseTemplateHint': '请选择一个模板开始生成。',
300
- 'plugins.promptTemplates.compose.builtinSuffix': '(内置)',
301
- 'plugins.promptTemplates.compose.empty': '暂无可用模板。',
302
- 'plugins.promptTemplates.compose.varsHint': '变量填写与新增请在「管理」中进行。',
303
- 'plugins.promptTemplates.compose.missingCount': '未填 {count} 项',
304
- 'plugins.promptTemplates.compose.jumpToMissing': '跳到未填',
305
- 'plugins.promptTemplates.compose.goManage': '去管理填写变量',
306
- 'plugins.promptTemplates.compose.outputTitle': '生成结果',
307
- 'plugins.promptTemplates.compose.outputHint': '点“复制”后直接粘贴到 Codex/Claude 输入框。',
308
- 'plugins.promptTemplates.compose.outputAria': '生成结果(提示词)',
309
- 'plugins.promptTemplates.compose.copy': '复制',
310
- 'plugins.promptTemplates.manage.searchAria': '搜索模板',
311
- 'plugins.promptTemplates.manage.searchPlaceholder': '搜索模板',
312
- 'plugins.promptTemplates.manage.create': '新建',
313
- 'plugins.promptTemplates.manage.export': '导出',
314
- 'plugins.promptTemplates.manage.import': '导入',
315
- 'plugins.promptTemplates.manage.loading': '正在加载模板...',
316
- 'plugins.promptTemplates.manage.empty': '暂无模板。',
317
- 'plugins.promptTemplates.manage.vars': '{count} vars',
318
- 'plugins.promptTemplates.manage.builtin': 'built-in',
319
- 'plugins.promptTemplates.manage.custom': 'custom',
320
- 'plugins.promptTemplates.manage.newTemplateName': '新模板',
321
- 'plugins.promptTemplates.editor.selectHint': '请选择一个模板进行编辑。',
322
- 'plugins.promptTemplates.editor.namePlaceholder': '模板名称',
323
- 'plugins.promptTemplates.editor.nameAria': '模板名称',
324
- 'plugins.promptTemplates.editor.duplicate': '复制',
325
- 'plugins.promptTemplates.editor.delete': '删除',
326
- 'plugins.promptTemplates.editor.save': '保存',
327
- 'plugins.promptTemplates.editor.builtinReadOnly': '内置模板为只读,不支持编辑/保存/删除/复制。',
328
- 'plugins.promptTemplates.editor.descPlaceholder': '描述(可选)',
329
- 'plugins.promptTemplates.editor.descAria': '模板描述',
330
- 'plugins.promptTemplates.editor.templateLabel': '模板',
331
- 'plugins.promptTemplates.editor.templateAria': '模板内容',
332
- 'plugins.promptTemplates.editor.templatePlaceholder': '在这里编写模板。使用 {{var}} 占位符。',
333
- 'plugins.promptTemplates.vars.title': '变量',
334
- 'plugins.promptTemplates.vars.hint': '从模板中检测。填写后可渲染最终提示词。',
335
- 'plugins.promptTemplates.vars.add': '新增变量',
336
- 'plugins.promptTemplates.vars.reset': '重置',
337
- 'plugins.promptTemplates.vars.empty': '未检测到变量。',
338
- 'plugins.promptTemplates.vars.valuePlaceholder': '变量值:{name}',
339
- 'plugins.promptTemplates.preview.title': '预览',
340
- 'plugins.promptTemplates.preview.hint': '渲染结果(缺失变量会替换为空)。',
341
- 'plugins.promptTemplates.preview.copy': '复制',
342
- 'plugins.promptTemplates.preview.outputAria': '渲染结果(提示词)',
343
- 'plugins.promptTemplates.noPluginSelected': '请先从左侧选择一个插件。',
344
- 'plugins.promptTemplates.varModal.title': '新增变量',
345
- 'plugins.promptTemplates.varModal.nameLabel': '变量名',
346
- 'plugins.promptTemplates.varModal.cancel': '取消',
347
- 'plugins.promptTemplates.varModal.add': '添加',
348
-
349
- 'plugins.meta.attribution': '创建者:{createdBy} · 维护者:{maintainers}',
350
- 'plugins.meta.createdBy': '创建者:{createdBy}',
351
- 'plugins.meta.maintainedBy': '维护者:{maintainers}',
352
-
353
- // Built-in prompt templates
354
- 'plugins.builtin.commentPolish.name': '代码注释润色',
355
- 'plugins.builtin.commentPolish.desc': '轻微收敛以下代码注释 {{code}}',
356
- 'plugins.builtin.commentPolish.line1': '轻微收敛以下代码注释',
357
- 'plugins.builtin.ruleAck.name': '规则确认回复',
358
- 'plugins.builtin.ruleAck.desc': '请根据【{{rule}}】,收到请回复',
359
- 'plugins.builtin.ruleAck.line1': '请根据【{{rule}}】,收到请回复',
360
-
361
- // Toasts
362
- 'toast.copy.empty': '没有可复制内容',
363
- 'toast.copy.ok': '已复制',
364
- 'toast.copy.fail': '复制失败',
365
- 'toast.save.ok': '已保存',
366
- 'toast.save.fail': '保存失败',
367
- 'toast.delete.ok': '已删除',
368
- 'toast.delete.fail': '删除失败',
369
- 'toast.export.empty': '没有可导出内容',
370
- 'toast.export.ok': '已导出',
371
- 'toast.export.fail': '导出失败',
372
- 'toast.import.ok': '导入成功',
373
- 'toast.import.fail': '导入失败',
374
- 'toast.import.notAvailable': '导入不可用',
375
- 'toast.import.readFileFail': '读取文件失败',
376
- 'toast.import.invalidJson': 'JSON 无效',
377
- 'toast.import.expectedArray': 'JSON 必须为数组',
378
- 'toast.export.notSupported': '当前不支持导出',
379
- 'toast.plugins.loadFail': '加载 Plugins 失败',
380
- 'toast.templates.builtinNotEditable': '内置模板不可编辑',
381
- 'toast.templates.varAdded': '已添加变量',
382
- 'toast.templates.builtinNotModifiable': '内置模板不可修改,请先复制再编辑',
383
- 'toast.templates.nameRequired': '模板名称不能为空',
384
- 'toast.templates.varNameRequired': '请输入变量名',
385
- 'toast.templates.varNameInvalid': '变量名仅支持字母/数字/下划线/中划线/点',
386
- 'toast.templates.varExists': '变量已存在',
387
- 'toast.templates.builtinNotDuplicable': '内置模板不可复制',
388
- 'toast.templates.builtinNotDeletable': '内置模板不可删除',
389
- 'toast.templates.deleteTitle': '删除模板',
390
- 'toast.templates.deleteMessage': '删除“{name}”?此操作无法撤销。',
391
- 'toast.templates.deleteConfirm': '删除',
392
- 'toast.templates.deleteCancel': '取消',
393
-
394
- // Basic modals
395
- 'modal.providerAdd.title': '添加提供商',
396
- 'modal.providerEdit.title': '编辑提供商',
397
- 'modal.modelAdd.title': '添加模型',
398
- 'modal.modelManage.title': '管理模型',
399
- 'modal.claudeConfigAdd.title': '添加 Claude Code 配置',
400
- 'modal.claudeConfigEdit.title': '编辑 Claude Code 配置',
401
- 'field.useBuiltinTransform': '使用内建转换(兼容 OpenAI 格式)',
402
- 'hint.useBuiltinTransform': '开启后:写入的 base_url 会指向 codexmate 内建转换服务;Codex 使用的令牌固定为 codexmate。',
403
-
404
- // Config template / agents modals
405
- 'modal.configTemplate.title': 'Config 模板编辑器(手动确认应用)',
406
- 'modal.configTemplate.label': 'config.toml 模板',
407
- 'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
408
- 'modal.configTemplate.mode.twoStep': '两步确认:先预览差异,再应用写入。',
409
- 'modal.configTemplate.mode.oneStep': '一步应用:点击“应用”直接写入。',
410
- 'diff.title.configTemplate': '差异预览(config.toml)',
411
- 'diff.generating': '生成中...',
412
- 'diff.failed': '生成失败',
413
- 'diff.noChanges': '未检测到改动',
414
- 'diff.hint.busy': '正在生成差异或应用中,操作暂不可用。',
415
- 'diff.hint.failedBack': '差异预览失败,请返回编辑后重试。',
416
- 'diff.hint.noChangesBack': '未检测到改动,可返回编辑继续修改或取消退出。',
417
- 'diff.hint.previewMode': '当前为预览模式,可点击“应用”写入或“返回编辑”继续修改。',
418
-
419
- 'modal.agents.export': '导出',
420
- 'modal.agents.copy': '复制',
421
- 'modal.agents.title': 'AGENTS.md 编辑器',
422
- 'modal.agents.hint': '保存后会写入目标 AGENTS.md(与 config.toml 同级)。',
423
- 'modal.agents.targetFile': '目标文件',
424
- 'modal.agents.contentLabel': 'AGENTS.md 内容',
425
- 'modal.agents.placeholder': '在这里编辑 AGENTS.md 内容',
426
- 'modal.agents.unsaved.previewModeHint': '预览模式:当前改动尚未保存,只有点击“应用”后才会写入文件。',
427
- 'modal.agents.unsaved.detectedHint': '检测到未保存改动:关闭页面或应用前请先保存。',
428
- 'modal.agents.hint.shortcuts': '快捷键:Esc(差异预览时返回编辑,编辑时关闭窗口)。',
429
- 'modal.agents.hint.twoStepSave': '保存需两步:先点击“确认”预览差异,再点击“应用”保存。',
430
- 'diff.tooLargeSkip': '内容过大,已跳过逐行差异预览',
431
- 'diff.viewHint.preview': '当前为预览模式,可点击“应用”保存或“返回编辑”继续修改。',
432
- 'diff.viewHint.truncated': '内容过大,已跳过预览,可点击“应用”保存或“返回编辑”继续修改。',
433
-
434
- // Skills modal
435
- 'modal.skills.title': 'Skills 管理',
436
- 'modal.skills.subtitle': '管理当前宿主的本地 Skills。',
437
- 'modal.skills.target.aria': '选择 Skills 管理目标',
438
- 'modal.skills.rootDir': 'Skills 目录({label})',
439
- 'modal.skills.summary.target': '安装目标',
440
- 'modal.skills.summary.total': '本地总数',
441
- 'modal.skills.summary.withSkill': ' SKILL.md',
442
- 'modal.skills.summary.missingSkill': '缺少 SKILL.md',
443
- 'modal.skills.summary.importable': '可导入',
444
- 'modal.skills.panel.aria': 'Skills 管理面板',
445
- 'modal.skills.local.title': '本地 Skills',
446
- 'modal.skills.local.note': '可检索、筛选与批量删除。',
447
- 'modal.skills.filter.keywordAria': '按名称或描述筛选 skill',
448
- 'modal.skills.filter.keywordPlaceholder': '按目录名/显示名/描述检索',
449
- 'modal.skills.filter.statusAria': '按 SKILL.md 状态筛选 skill',
450
- 'modal.skills.filter.status.all': '全部状态',
451
- 'modal.skills.filter.status.withSkill': '仅含 SKILL.md',
452
- 'modal.skills.filter.status.missingSkill': '仅缺少 SKILL.md',
453
- 'modal.skills.selection.stats': '已选 {selected}(筛选命中 {filtered} / {total},筛选内已选 {visibleSelected})',
454
- 'modal.skills.empty.local': '暂无可管理的 skill。',
455
- 'modal.skills.empty.filtered': '当前筛选条件下没有匹配的 skill。',
456
- 'modal.skills.pill.hasSkillFile': ' SKILL.md',
457
- 'modal.skills.pill.missingSkillFile': '缺少 SKILL.md',
458
- 'modal.skills.pill.symlink': '符号链接',
459
- 'modal.skills.pill.dir': '目录',
460
- 'modal.skills.import.title': '跨应用导入',
461
- 'modal.skills.import.note': '扫描并导入到当前 {label}。',
462
- 'modal.skills.import.scan': '扫描可导入',
463
- 'modal.skills.import.stats': '已选 {selected} / {total},含 SKILL.md {configured},缺失 {missing}',
464
- 'modal.skills.import.emptyHint': '暂无可导入 skill,点击“扫描可导入”。',
465
- 'modal.skills.bulk.title': '批量操作',
466
- 'modal.skills.bulk.note': '右侧为导入操作,左侧为本地选择。',
467
- 'modal.skills.actions.zipImport': '导入 ZIP',
468
- 'modal.skills.actions.zipImporting': 'ZIP 导入中...',
469
- 'modal.skills.actions.exportSelected': '导出选中',
470
- 'modal.skills.actions.exporting': '导出中...',
471
- 'modal.skills.actions.importSelected': '导入选中',
472
- 'modal.skills.actions.importing': '导入中...',
473
- 'modal.skills.actions.deleteSelected': '删除选中',
474
- 'modal.skills.actions.deleting': '删除中...',
475
-
476
- // OpenClaw config modal (quick)
477
- 'placeholder.openclawConfigNameExample': '例如: 默认配置',
478
- 'modal.openclaw.loadCurrent': '加载当前配置',
479
- 'modal.openclaw.quick.title': '新手快速配置',
480
- 'modal.openclaw.quick.subtitle': ' 3 步完成:填 Provider 和模型,写入编辑器,保存并应用。',
481
- 'modal.openclaw.quick.readFromEditor': '从编辑器读取',
482
- 'modal.openclaw.quick.step1': '填写 Provider 与模型',
483
- 'modal.openclaw.quick.step2': '点击写入编辑器',
484
- 'modal.openclaw.quick.step3': '保存并应用',
485
- 'modal.openclaw.quick.providerHint': '会拼成 provider/model 作为主模型标识。',
486
- 'modal.openclaw.quick.baseUrlHintDefault': '已按 OpenClaw 内建 provider 默认值回填,可直接修改。',
487
- 'modal.openclaw.quick.baseUrlHintReadonly': '检测到外部引用,快速表单中只读显示;如需修改请使用原文编辑。',
488
- 'modal.openclaw.quick.apiKeyHintFromAuth': '当前值来自 OpenClaw 外部认证配置;修改后在“保存并应用”时会回写对应 auth profile。',
489
- 'modal.openclaw.quick.apiKeyHintReadonly': '检测到外部认证或引用,快速表单中只读显示;如需修改请使用原文编辑或对应认证配置。',
490
- 'modal.openclaw.quick.apiKeyHintKeep': '留空表示不覆盖现有 key。',
491
- 'placeholder.apiTypeExample': '例如: openai-responses',
492
- 'modal.openclaw.quick.modelTitle': '模型',
493
- 'placeholder.modelIdExample': '例如: gpt-4.1',
494
- 'placeholder.modelNameOptional': '留空则使用模型 ID',
495
- 'field.contextWindow': '上下文长度',
496
- 'field.maxOutput': '最大输出',
497
- 'hint.emptyNoChange': '留空表示不改动已有配置。',
498
- 'modal.openclaw.quick.optionsTitle': '选项',
499
- 'modal.openclaw.quick.setPrimary': '设为主模型',
500
- 'modal.openclaw.quick.overrideProvider': '覆盖同名 Provider 基础信息',
501
- 'modal.openclaw.quick.overrideModels': '覆盖同名模型列表',
502
- 'modal.openclaw.quick.optionsHint': '关闭覆盖会只补空缺字段。',
503
- 'modal.openclaw.quick.writeToEditor': '写入编辑器',
504
-
505
- // Docs panel
506
- 'docs.title': 'CLI 安装文档',
507
- 'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI 命令。',
508
- 'docs.section.commands': '安装命令',
509
- 'docs.section.commandsNote': '命令可直接复制。',
510
- 'docs.section.faq': '常见问题',
511
- 'docs.section.faqNote': '常见问题见下。',
512
- 'docs.command.aria': '{name} 命令',
513
- 'docs.registryHintPrefix': '命令将附加:',
514
- 'docs.registryHintCustom': '请输入完整 URL(含 http/https),将自动附加到命令。',
515
- 'docs.registry.tencent': '腾讯云',
516
- 'docs.meta.bin': 'bin: {bin}',
517
- 'docs.termuxLabel': 'Termux',
518
- 'docs.termuxAria': 'Termux Codex CLI command',
519
- 'docs.rule.1': '命令按当前包管理器、镜像与操作生成。',
520
- 'docs.rule.2': '自定义镜像仅用于安装与升级。'
521
- ,
522
- 'docs.tip.win.1': 'PowerShell 报权限不足(EACCES/EPERM)时,请以管理员身份执行安装命令。',
523
- 'docs.tip.win.2': '安装后若仍提示找不到命令,重开终端并执行:where codex / where claude / where gemini / where codebuddy。',
524
- 'docs.tip.win.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。',
525
- 'docs.tip.unix.1': '出现 EACCES 权限错误时,优先修复 Node 全局目录权限,不建议直接 sudo npm。',
526
- 'docs.tip.unix.2': '安装后若命令未生效,重开终端并执行:which codex / which claude / which gemini / which codebuddy。',
527
- 'docs.tip.unix.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。'
528
- ,
529
-
530
- // Sessions panel
531
- 'sessions.loading': '加载中...',
532
- 'sessions.sourceTitle': '会话来源',
533
- 'sessions.refresh': '刷新会话',
534
- 'sessions.refreshing': '刷新中...',
535
- 'sessions.allPaths': '全部路径',
536
- 'sessions.source.codex': 'Codex',
537
- 'sessions.source.claudeCode': 'Claude Code',
538
- 'sessions.source.gemini': 'Gemini CLI',
539
- 'sessions.source.codebuddy': 'CodeBuddy Code',
540
- 'sessions.loadingList': '会话加载中...',
541
- 'sessions.empty': '暂无可用会话记录',
542
- 'sessions.unknownTime': '未知时间',
543
- 'sessions.query.placeholder.enabled': '关键词检索(支持 Codex/Claude/Gemini/CodeBuddy,例:claude code)',
544
- 'sessions.query.placeholder.disabled': '当前来源暂不支持关键词检索',
545
- 'sessions.pin': '置顶',
546
- 'sessions.unpin': '取消置顶',
547
- 'sessions.copyResume': '复制恢复命令',
548
- 'sessions.resumeYolo': '复制恢复命令附带 --yolo',
549
- 'sessions.preview.refresh': '刷新内容',
550
- 'sessions.preview.loading': '加载中...',
551
- 'sessions.preview.deleteHard': '直接删除',
552
- 'sessions.preview.moveToTrash': '移入回收站',
553
- 'sessions.preview.deleting': '删除中...',
554
- 'sessions.preview.moving': '移入中...',
555
- 'sessions.preview.export': '导出记录',
556
- 'sessions.preview.exporting': '导出中...',
557
- 'sessions.preview.convert': '生成派生会话',
558
- 'sessions.preview.converting': '生成中...',
559
- 'sessions.preview.convert.loadedOnly': '仅转换已加载消息',
560
- 'sessions.preview.openStandalone': '新页查看',
561
- 'sessions.preview.loadingBody': '正在加载会话内容...',
562
- 'sessions.preview.emptyMsgs': '当前会话暂无可展示消息',
563
- 'sessions.preview.rendering': '正在渲染会话内容...',
564
- 'sessions.preview.rerender': '重新渲染',
565
- 'sessions.preview.preparing': '正在准备会话内容...',
566
- 'sessions.preview.clipped': '仅展示最近 {count} 条消息。',
567
- 'sessions.preview.shownCount': '已显示 {shown} / {total} 条',
568
- 'sessions.preview.loadMore': '加载更多(剩余 {remain})',
569
- 'sessions.preview.loadingMore': '正在加载更早消息...'
570
- ,
571
- 'sessions.timeline.aria': '会话时间轴',
572
- 'sessions.selectHint': '请先在左侧选择一个会话',
573
- 'sessions.role.all': '全部角色',
574
- 'sessions.role.user': '仅 User',
575
- 'sessions.role.assistant': '仅 Assistant',
576
- 'sessions.role.system': '仅 System',
577
- 'sessions.time.all': '全部时间',
578
- 'sessions.time.7d': '近 7 天',
579
- 'sessions.time.30d': '近 30 天',
580
- 'sessions.time.90d': '近 90 天'
581
- ,
582
- 'sessions.sort.time': '按时间',
583
- 'sessions.sort.hot': '按热度',
584
- 'sessions.sort.hotBadge': '热'
585
- ,
586
- 'sessions.filters.copyLink': '复制筛选链接',
587
- 'sessions.filters.urlBuildFail': '无法生成链接',
588
- 'sessions.filters.source': '来源',
589
- 'sessions.filters.path': '路径',
590
- 'sessions.filters.keyword': '关键词',
591
- 'sessions.filters.role': '角色',
592
- 'sessions.filters.time': '时间',
593
- 'sessions.roleLabel.user': 'User',
594
- 'sessions.roleLabel.system': 'System',
595
- 'sessions.roleLabel.assistant': 'Assistant'
596
- ,
597
-
598
- // Usage panel
599
- 'usage.overview': 'Usage 概览',
600
- 'usage.range.aria': 'Usage 时间范围',
601
- 'usage.range.7d': '近 7 天',
602
- 'usage.range.30d': '近 30 天',
603
- 'usage.range.all': '全部',
604
- 'usage.compare.toggle': '对比上周期',
605
- 'usage.compare.prev': '上周期',
606
- 'usage.compare.delta': '变化',
607
- 'usage.refresh': '刷新统计',
608
- 'usage.refreshing': '刷新中...',
609
- 'usage.loading': '正在加载 Usage 统计...',
610
- 'usage.empty': '暂无可用于统计的会话数据',
611
- 'usage.refreshOverlay': '正在刷新…',
612
- 'usage.copyTitle': '点击复制:{value}',
613
- 'usage.copySuccess': '已复制:{label}',
614
- 'usage.copyFail': '复制失败',
615
- 'usage.copyNone': '没有可复制内容',
616
- 'usage.daily.title': '每天消耗',
617
- 'usage.daily.subtitle': '按天汇总 token 与预估费用(费用各自按最大值归一显示)。',
618
- 'usage.daily.note': '说明:预估费用默认不含 Claude;仅在可匹配模型单价且会话记录 input/output token 时计算。',
619
- 'usage.heatmap.title': '活动热力图',
620
- 'usage.heatmap.subtitle': '按每天会话数聚合,支持 hover 查看详细数据。',
621
- 'usage.heatmap.legend.less': '',
622
- 'usage.heatmap.legend.more': '',
623
- 'usage.heatmap.tooltip': '{date} · {sessions} 会话 · {messages} 消息 · {tokens} token',
624
- 'usage.heatmap.aria': '{date},{sessions} 会话',
625
- 'usage.hourlyHeatmap.title': '7×24 活跃热力图',
626
- 'usage.hourlyHeatmap.subtitle': '按星期 × 小时聚合会话分布,深色 = 高活跃。',
627
- 'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} 会话 · {messages} 消息 · {tokens} token',
628
- 'usage.hourlyHeatmap.legend.less': '',
629
- 'usage.hourlyHeatmap.legend.more': '',
630
- 'usage.legend.tokens': 'Token',
631
- 'usage.legend.cost': '预估费用',
632
- 'usage.table.date': '日期',
633
- 'usage.table.sessions': '会话',
634
- 'usage.table.messages': '消息',
635
- 'usage.table.tokens': 'Token',
636
- 'usage.table.cost': '预估费用',
637
- 'usage.trend.sessions': '会话趋势',
638
- 'usage.trend.messages': '消息趋势',
639
- 'usage.trend.activeHours': '活跃时段',
640
- 'usage.trend.sources': '来源洞察',
641
- 'usage.legend.codex': 'Codex',
642
- 'usage.legend.claude': 'Claude',
643
- 'usage.trend.sessions.codexTitle': 'Codex {count}',
644
- 'usage.trend.sessions.claudeTitle': 'Claude {count}',
645
- 'usage.trend.messages.barTitle': '{count} 条消息',
646
- 'usage.hour.title': '{hour}:00 · {count} 次会话',
647
- 'usage.source.row': '{sessions} 会话 · {messages} 消息 · 均值 {avg}',
648
- 'usage.summary.sessions': '总会话数',
649
- 'usage.summary.messages': '总消息数',
650
- 'usage.summary.tokens': ' Token 数',
651
- 'usage.summary.contextWindow': '总上下文数',
652
- 'usage.summary.estimatedCost': '预估费用 · {range}',
653
- 'usage.estimatedCost.note.excludesClaudePrefix': '暂不含 Claude,',
654
- 'usage.estimatedCost.method.configured': '按已配置单价估算',
655
- 'usage.estimatedCost.method.catalog': '按公开模型目录估算',
656
- 'usage.estimatedCost.method.configuredAndCatalog': '按已配置单价 + 公开模型目录估算',
657
- 'usage.estimatedCost.detail.estimate': '{prefix}{method},估算 {estimate},覆盖 {covered}/{total} 个会话,约 {percent}% token',
658
- 'usage.estimatedCost.detail.missing': '{prefix}缺少可匹配的模型单价或 token 拆分。请先补 models.cost,或确认会话已记录 input/output token。',
659
- 'usage.summary.activeDuration': '活跃时长',
660
- 'usage.summary.activeDuration.title': '累计会话跨度 {value}',
661
- 'usage.summary.totalDuration': '总时长',
662
- 'usage.summary.totalDuration.title': '整体时间跨度 {value}',
663
- 'usage.summary.activeDays': '活跃天数',
664
- 'usage.summary.avgMessagesPerSession': '平均每会话消息',
665
- 'usage.summary.busiestDay': '最忙日',
666
- 'usage.summary.busiestHour': '高峰时段',
667
- 'usage.currentSession.title': '当前会话',
668
- 'usage.currentSession.apiDuration': 'API时长',
669
- 'usage.currentSession.totalDuration': '总时长',
670
- 'usage.currentSession.tokens': 'Token',
671
- 'usage.range.kicker.all': '全部',
672
- 'usage.range.kicker.30d': '近 30 天',
673
- 'usage.range.kicker.7d': '近 7 天',
674
- 'usage.copyTokenDay': '已复制:Token({day})',
675
- 'usage.copyCostDay': '已复制:预估费用({day}'
676
- ,
677
- 'usage.dayDetail.title': '{day} 详情',
678
- 'usage.dayDetail.subtitle': '选择日期可快速查看当天构成。',
679
- 'usage.dayDetail.pick': '选择日期',
680
- 'usage.dayDetail.empty': '请选择一个日期以查看当天构成。',
681
- 'usage.dayDetail.clear': '清除',
682
- 'usage.dayDetail.topSessions': 'Top 会话',
683
- 'usage.dayDetail.topModels': 'Top 模型'
684
- ,
685
- 'usage.models.title': '使用模型',
686
- 'usage.models.subtitle': '只列真实落盘的 model 名。',
687
- 'usage.models.kicker': '已识别 {modeled}/{total}',
688
- 'usage.models.count': '模型数',
689
- 'usage.models.coverage': '会话覆盖率',
690
- 'usage.models.missing': ' model',
691
- 'usage.models.noneTitle': '当前范围没读到模型名',
692
- 'usage.models.noneBody': '已扫描 {total} 个会话,但原始记录里没有可识别的 model 字段。',
693
- 'usage.models.providerOnly': '其中 {count} 个旧会话只写了 provider。',
694
- 'usage.models.missingNote.providerOnly': '另有 {count} 个会话没写模型名,未计入列表。',
695
- 'usage.models.missingNote': '另有 {count} 个会话缺少 model,未计入列表。',
696
- 'usage.models.missingListTitle': '仍缺模型名的会话',
697
- 'usage.models.chipTitle': '{model} · {sessions} 会话 · {messages} 消息{tokens}',
698
- 'usage.models.meta': '{sessions} 会话 · {messages} 消息{tokens}',
699
- 'usage.weekday.title': '工作日分布',
700
- 'usage.paths.title': '高频路径',
701
- 'usage.paths.empty': '暂无路径数据',
702
- 'usage.paths.count': '{count} 次',
703
- 'usage.paths.meta': '{messages} 消息{recent}',
704
- 'usage.paths.recent': ' · 最近 {label}',
705
- 'usage.recent.title': '近期活跃会话',
706
- 'usage.sessions.empty': '暂无会话数据',
707
- 'usage.sessions.messages': '{count} 消息',
708
- 'usage.sessions.topDensity': '消息密度最高'
709
- ,
710
-
711
- // Config panel (Codex)
712
- 'config.addProvider': '新增提供商',
713
- 'config.models': '模型',
714
- 'config.modelLoading': '加载中...',
715
- 'config.models.unlimited': '当前无模型列表,可手填。',
716
- 'config.models.error': '模型列表获取失败,可手填。',
717
- 'config.models.notInList.codex': '当前模型不在列表,可手填或改模板。',
718
- 'config.models.notInList.other': '当前模型不在列表,可手填。',
719
- 'config.template.editFirst': '先改模板,再应用。',
720
- 'config.template.bridgeCodexOnly': '{hint} 模板仅限 Codex 编辑。',
721
- 'config.template.openEditor': '打开模板编辑器',
722
- 'modal.configTemplate.title': 'Config 模板编辑器(手动确认应用)',
723
- 'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
724
- 'config.serviceTier': '服务档',
725
- 'config.serviceTier.fast': 'fast(默认)',
726
- 'config.serviceTier.standard': 'standard',
727
- 'config.serviceTier.hint': ' fast 写入 {field}。',
728
- 'config.reasoningEffort': '推理强度',
729
- 'config.reasoningEffort.medium': 'medium(默认)',
730
- 'config.reasoningEffort.hint': '控制推理深度;high 更深。',
731
- 'config.contextBudget': '压缩阈值',
732
- 'config.reset': '重置',
733
- 'config.example': '例如: {value}',
734
- 'config.contextWindow.hint': '上下文上限,默认 190000。',
735
- 'config.autoCompact.hint': '自动压缩阈值,默认 185000。',
736
- 'config.agents.open': '打开 AGENTS.md',
737
- 'modal.agents.title.default': 'AGENTS.md 编辑器',
738
- 'modal.agents.title.claudeMd': 'CLAUDE.md 编辑器',
739
- 'modal.agents.title.openclaw': 'OpenClaw AGENTS.md 编辑器',
740
- 'modal.agents.hint.default': '保存后会写入目标 AGENTS.md(与 config.toml 同级)。',
741
- 'modal.agents.hint.claudeMd': '保存后会写入 ~/.claude/CLAUDE.md。',
742
- 'modal.agents.contentLabel.claudeMd': 'CLAUDE.md 内容',
743
- 'modal.agents.placeholder.claudeMd': '在这里编辑 CLAUDE.md 内容',
744
- 'modal.agents.hint.openclaw': '保存后会写入 OpenClaw Workspace 下的 AGENTS.md。',
745
- 'modal.agents.title.openclawWorkspaceFile': 'OpenClaw 工作区文件: {fileName}',
746
- 'modal.agents.hint.openclawWorkspaceFile': '保存后会写入 OpenClaw Workspace 下的 {fileName}。',
747
- 'config.url.unset': '未设 URL',
748
- 'config.badge.system': '系统',
749
- 'config.availabilityTest': '可用性测试',
750
- 'config.availabilityTestAria': '测试 {name} 可用性',
751
- 'config.health.title': '配置健康检查',
752
- 'config.health.run': '运行检查',
753
- 'config.health.running': '检查中...',
754
- 'config.health.hint': '会批量探测所有提供商可用性,并刷新延迟显示。',
755
- 'config.health.progress': '已完成 {done}/{total} · 失败 {failed}',
756
- 'config.health.ok': '检查通过',
757
- 'config.health.fail': '检查未通过',
758
- 'config.health.issues': '{count} 项问题',
759
- 'config.shareCommand': '分享命令',
760
- 'config.shareDisabled': '不可分享'
761
- ,
762
- 'config.shareCommand.aria': '分享导入命令',
763
- 'config.provider.edit.aria': '编辑提供商:{name}',
764
- 'config.provider.delete.aria': '删除提供商:{name}',
765
- 'app.loadingConfig': '加载配置中...'
766
- ,
767
- 'common.current': '当前 {value}',
768
- 'common.notSelected': '未选择',
769
- 'common.readFromEditor': '从编辑器读取',
770
- 'common.writeToEditor': '写入编辑器',
771
- 'sessions.sourceLabel': '来源:{value}',
772
- 'usage.rangeLabel': '范围:{value}',
773
- 'sessions.source.all': '全部',
774
- 'usage.range.all': '全部',
775
- 'usage.range.7d.short': '近 7 天',
776
- 'usage.range.30d.short': '近 30 天',
777
- 'orchestration.queueStats': '队列 {running} 运行中 · {queued} 等待中',
778
- 'orchestration.hero.kicker': '任务编排',
779
- 'orchestration.hero.title': '把需求拆成可执行步骤',
780
- 'orchestration.hero.subtitle': '先写目标,再预览计划,再执行。',
781
- 'orchestration.draft.reset': '重置草稿',
782
- 'orchestration.summary.aria': '任务编排概览',
783
- 'orchestration.summary.running': '运行中',
784
- 'orchestration.summary.queued': '排队中',
785
- 'orchestration.summary.runs': '运行记录',
786
- 'orchestration.step1.title': '先把结果写清楚',
787
- 'orchestration.step1.subtitle': '只写会影响执行的内容。',
788
- 'orchestration.templates.title': '快捷示例',
789
- 'orchestration.templates.reviewFix.label': '修 review + 回归',
790
- 'orchestration.templates.reviewFix.target': '修复当前 PR review 评论,并补对应回归测试',
791
- 'orchestration.templates.reviewFix.notes': '不要改动无关模块;需要给出验证结果',
792
- 'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
793
- 'orchestration.templates.planOnly.label': '只做排查规划',
794
- 'orchestration.templates.planOnly.target': '先排查问题根因并给出执行计划,不直接修改代码',
795
- 'orchestration.templates.planOnly.notes': '优先定位根因、影响范围和风险点',
796
- 'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
797
- 'orchestration.templates.workflowBatch.target': '用 Workflow 跑一组固定检查并整理结果',
798
- 'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
799
- 'orchestration.templates.workflowBatch.notes': '输出统一结论,避免重复描述',
800
- 'orchestration.fields.target': '目标',
801
- 'orchestration.fields.target.placeholder': '例如:修复当前 PR review 评论,并补对应回归测试;不要改无关模块',
802
- 'orchestration.fields.target.hint': '一句话写清结果、边界和验收标准就够了。',
803
- 'orchestration.engine.codex': 'Codex',
804
- 'orchestration.engine.workflow': 'Workflow',
805
- 'orchestration.runMode.write': '写入',
806
- 'orchestration.runMode.readOnly': '只读',
807
- 'orchestration.runMode.dryRun': '仅预演',
808
- 'orchestration.pills.hasTitle': '标题已设',
809
- 'orchestration.pills.workflowCount': 'Workflow {count}',
810
- 'orchestration.pills.planNodes': '计划 {count} 节点',
811
- 'orchestration.step2.title': '选择执行方式',
812
- 'orchestration.step2.subtitle': '常用项默认展开,其余放高级设置。',
813
- 'orchestration.fields.engine': '引擎',
814
- 'orchestration.fields.runMode': '运行模式',
815
- 'orchestration.advanced.title': '高级设置',
816
- 'orchestration.fields.title': '标题',
817
- 'orchestration.fields.title.placeholder': '可选,默认从目标自动提取',
818
- 'orchestration.fields.notes': '说明',
819
- 'orchestration.fields.notes.placeholder': '例如:不要重写现有架构,只做增量实现',
820
- 'orchestration.fields.notes.hint': '补边界、禁区、风格要求或验证要求。',
821
- 'orchestration.fields.followUps': '后续动作(每行一条)',
822
- 'orchestration.fields.followUps.placeholder': '例如:\n继续处理 review 评论\n最后补回归测试',
823
- 'orchestration.fields.concurrency': '并发',
824
- 'orchestration.fields.concurrency.hint': '复杂任务先从 1~2 开始更稳。',
825
- 'orchestration.fields.autoFixRounds': '自动修复',
826
- 'orchestration.fields.autoFixRounds.hint': '失败后自动再试几轮。',
827
- 'orchestration.fields.workflowIds': 'Workflow ID(每行一条)',
828
- 'orchestration.fields.workflowIds.placeholder': '例如:\ndiagnose-config\nsafe-provider-switch',
829
- 'orchestration.fields.workflowIds.hint': '仅 Workflow 模式需要。当前本地可用 {count} 个。',
830
- 'orchestration.workflow.stepCount': '{count} 步',
831
- 'orchestration.step3.title': '先预览,再执行',
832
- 'orchestration.step3.subtitle': '先确认计划,再决定立即执行还是入队。',
833
- 'orchestration.actions.planning': '规划中...',
834
- 'orchestration.actions.previewOnly': '仅预览',
835
- 'orchestration.actions.preparing': '准备中...',
836
- 'orchestration.actions.generatePlan': '生成计划',
837
- 'orchestration.actions.planAndRun': '计划并执行',
838
- 'orchestration.actions.processing': '处理中...',
839
- 'orchestration.actions.queueAndStart': '入队并开始',
840
- 'orchestration.actions.caption': '“计划并执行”会在必要时自动刷新计划;批量任务用“入队并开始”。',
841
- 'orchestration.stage.title': '有内容时再展开工作区',
842
- 'orchestration.stage.subtitle': '先写目标,再预览计划。',
843
- 'orchestration.stage.pill.target': '写目标',
844
- 'orchestration.stage.pill.preview': '预览',
845
- 'orchestration.stage.pill.run': '执行或入队',
846
- 'orchestration.plan.title': '计划预览',
847
- 'orchestration.plan.subtitle': '先确认节点、波次和依赖。',
848
- 'orchestration.plan.summary.nodes': '节点数',
849
- 'orchestration.plan.summary.waves': '波次',
850
- 'orchestration.plan.summary.engine': '引擎',
851
- 'orchestration.plan.node.write': 'write',
852
- 'orchestration.plan.node.readOnly': 'read-only',
853
- 'orchestration.labels.dependencies': '依赖:',
854
- 'orchestration.labels.error': '错误:',
855
- 'orchestration.workbench.title': '执行工作台',
856
- 'orchestration.workbench.subtitle': '有内容时才展开。',
857
- 'orchestration.queue.start': '开始队列',
858
- 'orchestration.queue.starting': '启动中...',
859
- 'orchestration.workbench.tabs.aria': '任务编排工作台视图',
860
- 'orchestration.workbench.tabs.queue': '队列 {count}',
861
- 'orchestration.workbench.tabs.runs': '运行记录 {count}',
862
- 'orchestration.workbench.tabs.detail': '运行详情',
863
- 'orchestration.queue.empty.title': '当前没有排队任务',
864
- 'orchestration.queue.empty.subtitle': '批量任务可先入队,再启动队列。',
865
- 'orchestration.runs.empty.title': '还没有运行记录',
866
- 'orchestration.runs.empty.subtitle': '执行后会显示最近运行记录。',
867
- 'orchestration.detail.refresh': '刷新详情',
868
- 'orchestration.detail.retry': '重试',
869
- 'orchestration.detail.retrying': '重试中...',
870
- 'orchestration.detail.empty.title': '选择一条运行记录查看详情',
871
- 'orchestration.detail.empty.subtitle': '这里会显示节点状态、摘要和日志。',
872
- 'orchestration.detail.summary.status': '状态',
873
- 'orchestration.detail.summary.duration': '耗时',
874
- 'orchestration.detail.summary.nodes': '节点数',
875
- 'orchestration.detail.summary.summary': '摘要',
876
- 'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
877
- 'skills.localLabel': '{target} / 本地 Skills',
878
- 'skills.counts': '已装 {installed} · 可导入 {importable}',
879
-
880
- // Sidebar status labels (compact)
881
- 'status.currentSource': '当前来源',
882
- 'status.sessionCount': '会话数',
883
- 'status.range': '统计范围',
884
- 'status.totalSessions': '总会话数',
885
- 'status.totalMessages': '总消息数',
886
- 'status.engine': '引擎',
887
- 'status.concurrency': '并发度',
888
- 'status.running': '运行中',
889
- 'status.queued': '排队中',
890
- 'status.runs': '历史 Runs',
891
- 'status.currentTarget': '当前目标',
892
- 'status.localSkills': '本地 Skills',
893
- 'status.importable': '可导入',
894
- 'status.importableDirect': '可直接导入',
895
- 'status.pm': '包管理器',
896
- 'status.action': '当前操作',
897
- 'status.registry': '镜像',
898
- 'status.claudeConfig': 'Claude 配置',
899
- 'status.claudeModel': 'Claude 模型',
900
- 'status.openclawConfig': 'OpenClaw 配置',
901
- 'status.workspaceFile': '工作区文件',
902
- 'status.configMode': '配置模式',
903
- 'status.currentProvider': '当前 Provider',
904
- 'status.currentModel': '当前模型',
905
- 'status.quickSwitchProvider': '快速切换提供商'
906
- ,
907
- 'side.usage.meta': '本地统计 / 趋势',
908
- 'side.orchestration.meta': '计划 / 队列 / Runs'
909
- ,
910
-
911
- // Settings panel
912
- 'settings.tab.backup': '备份与导入',
913
- 'settings.tab.trash': '回收站',
914
- 'settings.tab.device': '设备',
915
- 'settings.tabs.aria': '设置标签页',
916
- 'settings.sharePrefix.title': '分享命令前缀',
917
- 'settings.sharePrefix.meta': '影响 Web UI 里“复制分享命令”的前缀',
918
- 'settings.sharePrefix.label': '前缀',
919
- 'settings.sharePrefix.hint': '默认走项目内 npm start,也可切到全局 codexmate。该设置会缓存到浏览器本地。',
920
- 'settings.claude.title': 'Claude 配置',
921
- 'settings.claude.meta': '备份 / 导入 ~/.claude',
922
- 'settings.codex.title': 'Codex 配置',
923
- 'settings.codex.meta': '备份 / 导入 ~/.codex',
924
- 'settings.backup.progress': '备份中 {percent}%',
925
- 'settings.backup.oneClickClaude': '一键备份 ~/.claude',
926
- 'settings.backup.importClaude': '导入 ~/.claude 备份',
927
- 'settings.backup.oneClickCodex': '一键备份 ~/.codex',
928
- 'settings.backup.importCodex': '导入 ~/.codex 备份',
929
- 'settings.importing': '导入中...',
930
-
931
- 'settings.deleteBehavior.title': '会话删除行为',
932
- 'settings.deleteBehavior.meta': '决定“删除”是否先进入回收站',
933
- 'settings.deleteBehavior.toggle': '删除会话时先移入回收站',
934
- 'settings.deleteBehavior.hint': '默认开启。关闭后,会话浏览里的删除会直接永久删除,不再进入回收站。',
935
-
936
- 'settings.trash.title': '回收站',
937
- 'settings.trash.meta': '已删除会话(可恢复/彻底删除)',
938
- 'settings.trash.refresh': '刷新列表',
939
- 'settings.trash.refreshing': '刷新中...',
940
- 'settings.trash.clear': '清空回收站',
941
- 'settings.trash.clearing': '清空中...',
942
- 'settings.trash.loading': '正在加载回收站...',
943
- 'settings.trash.empty': '回收站为空',
944
- 'settings.trash.retry': '回收站列表加载失败,请刷新重试',
945
- 'settings.trash.restore': '恢复',
946
- 'settings.trash.restoring': '恢复中...',
947
- 'settings.trash.purge': '彻底删除',
948
- 'settings.trash.purging': '删除中...',
949
- 'settings.trash.workspace': '工作区',
950
- 'settings.trash.originalFile': '原文件',
951
- 'settings.trash.loadMore': '加载更多(剩余 {count} 项)',
952
- 'settings.trash.retention': '自动清理',
953
- 'settings.trash.retentionMeta': '超过保留天数的回收站记录将自动清除',
954
- 'settings.trash.retentionLabel': '保留天数',
955
- 'settings.trash.retentionHint': '范围 1-365 天,默认 30 天。每次加载回收站时自动清理过期记录。',
956
-
957
- 'settings.templateConfirm.title': '配置模板二次确认',
958
- 'settings.templateConfirm.meta': '降低误写入风险',
959
- 'settings.templateConfirm.toggle': '应用模板前先预览差异(两步:确认 → 应用)',
960
- 'settings.templateConfirm.hint': '开启后:先展示差异预览,再确认写入。',
961
-
962
- 'settings.reset.title': '配置重置',
963
- 'settings.reset.meta': '谨慎操作',
964
- 'settings.reset.hint': '会先备份 config.toml,再写入默认配置。',
965
- 'settings.reset.button': '重装配置',
966
- 'settings.reset.loading': '重装中...'
967
- ,
968
-
969
- // Market (Skills)
970
- 'market.title': 'Skills 概览',
971
- 'market.subtitle': '切换目标并查看本地 Skills。',
972
- 'market.refresh': '刷新概览',
973
- 'market.refreshing': '刷新中...',
974
- 'market.openManager': '打开 Skills 管理',
975
- 'market.target.aria': '选择 Skills 安装目标',
976
- 'market.summary.target': '安装目标',
977
- 'market.summary.total': '本地总数',
978
- 'market.summary.configured': ' SKILL.md',
979
- 'market.summary.missing': '缺少 SKILL.md',
980
- 'market.summary.importable': '可导入',
981
- 'market.summary.importableDirect': '可直接导入',
982
- 'market.root.fallback': '默认目录',
983
-
984
- 'market.installed.title': '已安装 Skills',
985
- 'market.installed.note': '仅显示前 6 项。',
986
- 'market.local.refresh': '刷新本地',
987
- 'market.local.refreshing': '刷新中...',
988
- 'market.local.loading': '正在加载本地 Skills...',
989
- 'market.local.empty': '当前暂无已安装 skill。',
990
- 'market.pill.verified': '已验证',
991
- 'market.pill.missingSkill': '待补 SKILL.md',
992
-
993
- 'market.import.title': '可导入来源',
994
- 'market.import.note': '扫描并导入到当前 {target}',
995
- 'market.import.scan': '扫描来源',
996
- 'market.import.scanning': '扫描中...',
997
- 'market.import.loading': '正在扫描可导入 skill...',
998
- 'market.import.empty': '暂未扫描到可导入 skill。',
999
- 'market.pill.importableDirect': '可直接导入',
1000
- 'market.pill.importMissing': '缺少 SKILL.md',
1001
-
1002
- 'market.actions.title': '分发入口',
1003
- 'market.actions.note': '操作均作用于当前安装目标。',
1004
- 'market.action.manage.title': '本地 Skills 管理',
1005
- 'market.action.manage.copy': '管理当前 {target} 的已装 skills',
1006
- 'market.action.crossImport.title': '跨应用导入',
1007
- 'market.action.crossImport.copy': '导入到当前 {target}',
1008
- 'market.action.zipImport.title': 'ZIP 导入',
1009
- 'market.action.zipImport.copy': '从 ZIP 导入到当前目标',
1010
-
1011
- 'market.help.title': '操作说明',
1012
- 'market.help.target.title': '目标切换',
1013
- 'market.help.target.copy': '当前操作写入 {target} 目录。',
1014
- 'market.help.crossImport.title': '跨应用导入',
1015
- 'market.help.crossImport.copy': '从其他宿主导入未托管 skill。',
1016
- 'market.help.zipImport.title': 'ZIP 导入',
1017
- 'market.help.zipImport.copy': '从 ZIP 导入本地 skill。'
1018
- ,
1019
-
1020
- // Claude config panel
1021
- 'claude.addProvider': '添加提供商',
1022
- 'claude.applyDefault': '默认应用到 ~/.claude/settings.json。',
1023
- 'claude.presetProviders': '预设供应商',
1024
- 'claude.customConfig': '自定义配置',
1025
- 'claude.model': '模型',
1026
- 'claude.model.placeholder': '例如: claude-3-7-sonnet',
1027
- 'claude.model.hint': '模型修改后会自动保存并应用到当前配置。',
1028
- 'claude.health.title': '配置健康检查',
1029
- 'claude.health.run': '运行检查',
1030
- 'claude.health.running': '检查中...',
1031
- 'claude.health.hint': '会批量探测所有 Claude 配置可用性,并刷新延迟显示。',
1032
- 'claude.health.progress': '已完成 {done}/{total} · 失败 {failed}',
1033
- 'claude.md.title': 'CLAUDE.md',
1034
- 'claude.md.open': '打开 CLAUDE.md',
1035
- 'claude.md.hint': '读写 ~/.claude/CLAUDE.md。',
1036
- 'claude.model.unset': '未设置模型',
1037
- 'claude.configured': '已配置',
1038
- 'claude.notConfigured': '未配置',
1039
- 'claude.action.edit': '编辑',
1040
- 'claude.action.delete': '删除',
1041
- 'claude.action.shareDisabled': '分享导入命令(暂时禁用)'
1042
- ,
1043
- 'claude.action.editAria': '编辑 Claude 配置:{name}',
1044
- 'claude.action.deleteAria': '删除 Claude 配置:{name}',
1045
-
1046
- // OpenClaw config panel
1047
- 'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json,支持 JSON5。',
1048
- 'openclaw.agents.hint': '读写 Workspace 的 AGENTS.md,默认路径 ~/.openclaw/workspace/AGENTS.md。',
1049
- 'openclaw.agents.open': '打开 AGENTS.md',
1050
- 'openclaw.workspaceFile': '工作区文件',
1051
- 'openclaw.workspace.placeholder': '例如: SOUL.md',
1052
- 'openclaw.workspace.hint': '仅限 Workspace 内的 .md 文件。',
1053
- 'openclaw.workspace.open': '打开工作区文件',
1054
- 'openclaw.configured': '已配置',
1055
- 'openclaw.notConfigured': '未配置',
1056
- 'openclaw.action.edit': '编辑',
1057
- 'openclaw.action.delete': '删除',
1058
- 'modal.openclaw.quick.subtitle': '按 3 步完成:填 Provider 和模型,写入编辑器,保存并应用。',
1059
- 'modal.openclaw.quick.step2': '点击写入编辑器',
1060
- 'modal.openclaw.structured.writeHint': '写入编辑器会重排 JSON,注释可能丢失。'
1061
- ,
1062
- 'openclaw.action.editAria': '编辑 OpenClaw 配置:{name}',
1063
- 'openclaw.action.deleteAria': '删除 OpenClaw 配置:{name}'
1064
- },
1065
- en: {
1066
- // Global
1067
- 'lang.zh': '中文',
1068
- 'lang.en': 'English',
1069
- 'lang.label': 'Language',
1070
- 'nav.topTabs.aria': 'Navigation',
1071
-
1072
- // Common
1073
- 'common.all': 'All',
1074
- 'common.copy': 'Copy',
1075
- 'common.edit': 'Edit',
1076
- 'common.install': 'Install',
1077
- 'common.update': 'Update',
1078
- 'common.uninstall': 'Uninstall',
1079
- 'common.official': 'Official',
1080
- 'common.custom': 'Custom',
1081
- 'common.rules': 'Rules',
1082
- 'common.troubleshooting': 'Troubleshooting',
1083
- 'common.command': 'Command',
1084
- 'common.mirror': 'Registry',
1085
- 'common.packageManager': 'Package manager',
1086
- 'common.action': 'Action',
1087
- 'common.targets': 'Targets',
1088
- 'common.currentPm': 'Package manager',
1089
- 'common.currentAction': 'Action',
1090
- 'common.mirrorActive': 'Registry',
1091
- 'common.defaultOfficial': 'Default',
1092
- 'common.cancel': 'Cancel',
1093
- 'common.confirm': 'Confirm',
1094
- 'common.add': 'Add',
1095
- 'common.save': 'Save',
1096
- 'common.saveApply': 'Save & apply',
1097
- 'common.close': 'Close',
1098
- 'common.delete': 'Delete',
1099
- 'common.clear': 'Clear',
1100
- 'common.show': 'Show',
1101
- 'common.hide': 'Hide',
1102
- 'common.detail': 'Details',
1103
- 'common.refresh': 'Refresh',
1104
- 'common.refreshing': 'Refreshing...',
1105
- 'common.loading': 'Loading...',
1106
- 'common.saving': 'Saving...',
1107
- 'common.sending': 'Sending...',
1108
- 'common.scanning': 'Scanning...',
1109
- 'common.export': 'Export',
1110
- 'common.import': 'Import',
1111
- 'common.apply': 'Apply',
1112
- 'common.applying': 'Applying...',
1113
- 'common.confirming': 'Confirming...',
1114
- 'common.writeToEditor': 'Write to editor',
1115
- 'common.refreshFromText': 'Refresh from text',
1116
- 'common.backToEdit': 'Back to edit',
1117
- 'common.selectAll': 'Select all',
1118
- 'common.unselectAll': 'Unselect all',
1119
- 'common.resetFilters': 'Reset filters',
1120
- 'common.notEditable': 'Not editable',
1121
- 'common.notDeletable': 'Not deletable',
1122
- 'common.notLoaded': 'Not loaded',
1123
- 'common.exists': 'Exists',
1124
- 'common.notExistsWillCreateOnApply': 'Not found. Will be created on apply.',
1125
- 'common.notExistsWillCreateOnSave': 'Not found. Will be created on save.',
1126
- 'common.none': 'None',
1127
- 'cli.missing.title': '{name} CLI not installed',
1128
- 'cli.missing.subtitle': 'Install {name} CLI before using this page.',
1129
- 'cli.missing.openDocs': 'Open install guide',
1130
- 'cli.missing.commandAria': '{name} CLI install command',
1131
-
1132
- // Brand
1133
- 'brand.kicker.workspace': 'Workspace',
1134
- 'brand.subtitle.localConfigSessionsWorkspace': 'Local config & sessions workspace',
1135
-
1136
- // Confirm dialog
1137
- 'confirm.aria': 'Confirm action',
1138
- 'confirm.title.default': 'Please confirm',
1139
- 'confirm.ok': 'Confirm',
1140
- 'confirm.cancel': 'Cancel',
1141
-
1142
- // Shared fields
1143
- 'field.name': 'Name',
1144
- 'field.configName': 'Config name',
1145
- 'field.apiEndpoint': 'API endpoint',
1146
- 'field.apiKey': 'API key',
1147
- 'field.baseUrl': 'Base URL',
1148
- 'field.provider': 'Provider',
1149
- 'field.providerName': 'Provider name',
1150
- 'field.modelName': 'Model name',
1151
- 'field.model': 'Model',
1152
- 'field.message': 'Message',
1153
- 'field.varName': 'Variable name',
1154
- 'field.targetFile': 'Target file',
1155
- 'field.modelId': 'Model ID',
1156
- 'field.displayName': 'Display name',
1157
- 'field.contextAndMaxOutput': 'Context and max output',
1158
- 'field.apiType': 'API type',
1159
- 'field.env': 'Environment variables',
1160
- 'field.allow': 'Allow',
1161
- 'field.deny': 'Deny',
1162
-
1163
- // Shared placeholders/hints
1164
- 'placeholder.providerNameExample': 'e.g. myapi',
1165
- 'placeholder.apiEndpointExample': 'https://api.example.com/v1',
1166
- 'placeholder.providerName': 'Provider name',
1167
- 'placeholder.keepUnchanged': 'Leave blank to keep unchanged',
1168
- 'hint.keepKeyUnchanged': 'Leave blank to keep current key',
1169
- 'placeholder.modelExample': 'e.g. gpt-5',
1170
- 'placeholder.configNameExample': 'e.g. My Claude Setup',
1171
- 'placeholder.apiKeyExampleClaude': 'sk-ant-...',
1172
- 'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
1173
- 'placeholder.selectProvider': 'Select a provider',
1174
- 'placeholder.varNameExample': 'e.g. code',
1175
- 'hint.varNameRules': 'Allowed: letters/numbers/underscore/dash/dot. Will be inserted as {{var}}.',
1176
-
1177
- // Roles / labels
1178
- 'role.you': 'You',
1179
- 'role.provider': 'Provider',
1180
- 'label.model': 'Model:',
1181
-
1182
- // Top tabs
1183
- 'tab.dashboard': 'Dashboard',
1184
- 'tab.docs': 'Docs',
1185
- 'tab.config': 'Config',
1186
- 'tab.config.codex': 'Codex',
1187
- 'tab.config.claude': 'Claude',
1188
- 'tab.config.openclaw': 'OpenClaw',
1189
- 'tab.sessions': 'Sessions',
1190
- 'tab.usage': 'Usage',
1191
- 'tab.orchestration': 'Tasks',
1192
- 'tab.market': 'Skills',
1193
- 'tab.plugins': 'Plugins',
1194
- 'tab.settings': 'Settings',
1195
-
1196
- // Side rail section titles
1197
- 'side.overview': 'Overview',
1198
- 'side.docs': 'Docs',
1199
- 'side.config': 'Config',
1200
- 'side.sessions': 'Sessions',
1201
- 'side.plugins': 'Plugins',
1202
- 'side.system': 'System',
1203
- 'side.orchestration': 'Tasks',
1204
- 'side.skills': 'Skills',
1205
-
1206
- // Side rail items
1207
- 'side.overview.doctor': 'Doctor',
1208
- 'side.overview.doctor.meta': 'Overview / Diagnostics',
1209
- 'side.docs.cliInstall': 'CLI Install',
1210
- 'side.docs.cliInstall.meta': 'Install / Update / Uninstall',
1211
- 'side.config.codex': 'Codex',
1212
- 'side.config.codex.meta': 'Provider / Model',
1213
- 'side.config.claude': 'Claude Code',
1214
- 'side.config.claude.meta': 'Claude Settings',
1215
- 'side.config.openclaw': 'OpenClaw',
1216
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
1217
- 'side.sessions.browser': 'Session Browser',
1218
- 'side.sessions.browser.meta': 'Browse / Export / Cleanup',
1219
- 'side.plugins.tools': 'Prompt Tools',
1220
- 'side.plugins.tools.meta': 'Templates / Variables',
1221
- 'side.system.settings': 'Runtime Settings',
1222
- 'side.system.settings.meta': 'Data / Backup',
1223
-
1224
- // Header titles
1225
- 'kicker.dashboard': 'Doctor',
1226
- 'kicker.config': 'Configuration',
1227
- 'kicker.sessions': 'Sessions',
1228
- 'kicker.usage': 'Usage',
1229
- 'kicker.orchestration': 'Tasks',
1230
- 'kicker.market': 'Skills',
1231
- 'kicker.plugins': 'Plugins',
1232
- 'kicker.docs': 'Docs',
1233
- 'kicker.settings': 'Settings',
1234
-
1235
- 'title.dashboard': 'Dashboard / Doctor',
1236
- 'title.config': 'Local Configuration Console',
1237
- 'title.sessions': 'Sessions & Export',
1238
- 'title.usage': 'Local Usage & Trends',
1239
- 'title.orchestration': 'Task Orchestration',
1240
- 'title.market': 'Skills Install & Sync',
1241
- 'title.plugins': 'Plugins & Templates',
1242
- 'title.docs': 'CLI Install & Docs',
1243
- 'title.settings': 'System & Data Settings',
1244
-
1245
- 'subtitle.dashboard': 'Aggregate status and diagnostics.',
1246
- 'subtitle.config': 'Manage local configs and models.',
1247
- 'subtitle.sessions': 'Browse and export sessions.',
1248
- 'subtitle.usage': 'View usage for the last 7/30 days.',
1249
- 'subtitle.orchestration': 'Plan, queue, run, and review local tasks.',
1250
- 'subtitle.market': 'Manage local skills.',
1251
- 'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
1252
- 'subtitle.docs': 'CLI install commands and troubleshooting.',
1253
- 'subtitle.settings': 'Manage downloads, directories, and trash.'
1254
- ,
1255
- 'dashboard.doctor.title': 'Doctor',
1256
- 'dashboard.doctor.runChecks': 'Run checks',
1257
- 'dashboard.doctor.checking': 'Checking...',
1258
- 'dashboard.doctor.export': 'Export report',
1259
- 'dashboard.doctor.export.json': 'Export JSON',
1260
- 'dashboard.doctor.export.md': 'Export Markdown',
1261
- 'dashboard.doctor.open': 'Open',
1262
- 'doctor.action.openConfig': 'Open Config',
1263
- 'doctor.action.checkProvider': 'Check provider config',
1264
- 'doctor.action.openUsage': 'Open Usage',
1265
- 'doctor.action.openSessions': 'Open Sessions',
1266
- 'doctor.action.openTasks': 'Open Tasks',
1267
- 'doctor.action.viewTaskLogs': 'View Tasks / Logs',
1268
- 'doctor.action.openSkills': 'Open Skills',
1269
- 'doctor.issue.configNotReady.problem': 'Config is not ready',
1270
- 'doctor.issue.configNotReady.impact': 'Provider/model cannot be read; model listing and requests may fail.',
1271
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider unreachable',
1272
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider auth failed',
1273
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider endpoint returned 404',
1274
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider returned HTTP error',
1275
- 'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider probe failed',
1276
- 'doctor.issue.providerUnreachable.problem.unknown': 'Provider unreachable',
1277
- 'doctor.issue.providerUnreachable.impactAuth': 'Auth failure will cause model listing and chat requests to return 401/403.',
1278
- 'doctor.issue.providerUnreachable.impactNetwork': 'Unreachable provider will cause model listing and chat requests to fail or timeout.',
1279
- 'doctor.issue.configHealthFailed.problem': 'Config health check failed',
1280
- 'doctor.issue.configHealthFailed.impact': 'Some features may be unavailable or behave unexpectedly.',
1281
- 'doctor.issue.usageError.problem': 'Usage aggregation failed',
1282
- 'doctor.issue.usageError.impact': 'Usage charts and summaries may be unavailable; Doctor usage diagnostics will be incomplete.',
1283
- 'doctor.issue.usageMissingModel.problem': 'Some sessions miss model metadata',
1284
- 'doctor.issue.usageMissingModel.impact': 'Usage attribution and cost estimates may be inaccurate.',
1285
- 'doctor.issue.tasksError.problem': 'Task overview failed',
1286
- 'doctor.issue.tasksError.impact': 'Task queue and run history may be unavailable.',
1287
- 'doctor.issue.tasksFailed.problem': 'Failed task runs detected',
1288
- 'doctor.issue.tasksFailed.impact': 'Automation pipelines may be blocked; inspect logs and retry after fixing inputs.',
1289
- 'doctor.issue.skillsError.problem': 'Skills listing failed',
1290
- 'doctor.issue.skillsError.impact': 'Skills marketplace may be unavailable.',
1291
- 'doctor.issue.skillsRootMissing.problem': 'Skills directory is missing',
1292
- 'doctor.issue.skillsRootMissing.impact': 'Skills install/scan will be empty; create the directory via Settings/Docs.',
1293
- 'doctor.issue.skillsMissingFiles.problem': 'Some skills are missing skill.json',
1294
- 'doctor.issue.skillsMissingFiles.impact': 'Those skills may not run or sync properly.',
1295
- 'dashboard.card.config': 'Config',
1296
- 'dashboard.card.sessions': 'Sessions',
1297
- 'dashboard.card.usage': 'Usage',
1298
- 'dashboard.card.tasks': 'Tasks',
1299
- 'dashboard.card.skills': 'Skills',
1300
- 'dashboard.kv.model': 'Model',
1301
- 'dashboard.kv.issue': 'Issue',
1302
- 'dashboard.kv.active': 'Active',
1303
- 'dashboard.kv.sessions': 'Sessions',
1304
- 'dashboard.kv.missingModel': 'Missing model',
1305
- 'dashboard.kv.blockers': 'Blockers',
1306
- 'dashboard.kv.runs': 'Runs',
1307
- 'dashboard.kv.target': 'Target',
1308
- 'dashboard.kv.root': 'Root',
1309
- 'dashboard.status.health': 'Health',
1310
- 'dashboard.status.busy': 'Busy',
1311
- 'dashboard.status.models': 'Models',
1312
- 'dashboard.busy.init': 'Init',
1313
- 'dashboard.busy.sessions': 'Sessions',
1314
- 'dashboard.busy.models': 'Models',
1315
- 'dashboard.busy.configApply': 'Apply config',
1316
- 'dashboard.busy.agents': 'Saving agents',
1317
- 'dashboard.busy.skills': 'Skills',
1318
- 'dashboard.busy.tasks': 'Tasks',
1319
- 'dashboard.busy.idle': 'Idle',
1320
- 'dashboard.message.none': 'No messages',
1321
- 'dashboard.sessionSource.codex': 'Codex',
1322
- 'dashboard.sessionSource.claude': 'Claude Code',
1323
- 'dashboard.sessionSource.gemini': 'Gemini CLI',
1324
- 'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
1325
- 'dashboard.sessionSource.all': 'All',
1326
- 'dashboard.sessionPath.all': 'All paths',
1327
- 'dashboard.sessionQuery.unsupported': 'Unsupported source',
1328
- 'dashboard.sessionQuery.unset': 'Not set',
1329
- 'dashboard.healthStatus.failRead': 'Failed',
1330
- 'dashboard.healthStatus.initializing': 'Initializing',
1331
- 'dashboard.healthStatus.ok': 'OK',
1332
- 'dashboard.modelStatus.loading': 'Loading',
1333
- 'dashboard.modelStatus.error': 'Error',
1334
- 'dashboard.modelStatus.ok': 'OK',
1335
- 'dashboard.health.ok': 'Checks passed',
1336
- 'dashboard.health.fail': 'Checks failed',
1337
- 'dashboard.health.issues': '{count} issues',
1338
- 'dashboard.issues.title': '{count} actionable issues',
1339
- 'dashboard.state.loading': 'Loading',
1340
- 'dashboard.state.ready': 'Ready',
1341
- 'dashboard.state.idle': 'Idle',
1342
- 'dashboard.none': 'None',
1343
- 'dashboard.sessions.count': '{count} sessions',
1344
- 'dashboard.usage.range': 'Range {value}',
1345
- 'dashboard.tasks.queue': 'run {running} / queue {queued}',
1346
- 'dashboard.skills.count': 'installed {installed} / import {importable}',
1347
-
1348
- // Plugins panel
1349
- 'plugins.sidebar.title': 'Plugins',
1350
- 'plugins.sidebar.note': 'Reusable, standardized utilities. Future custom plugins should follow the same structure.',
1351
- 'plugins.sidebar.ariaList': 'Plugin list',
1352
- 'plugins.main.ariaWorkspace': 'Plugin workspace',
1353
- 'plugins.refresh': 'Refresh',
1354
- 'plugins.refreshing': 'Refreshing...',
1355
- 'plugins.promptTemplates.title': 'Prompt templates',
1356
- 'plugins.promptTemplates.subtitle': 'Built-in: comment polish ({{code}}). Copy and paste into Codex/Claude.',
1357
- 'plugins.promptTemplates.mode.aria': 'Prompt templates mode',
1358
- 'plugins.promptTemplates.mode.compose': 'Compose',
1359
- 'plugins.promptTemplates.mode.manage': 'Manage',
1360
- 'plugins.promptTemplates.compose.selectTemplate': 'Select template',
1361
- 'plugins.promptTemplates.compose.chooseTemplate': 'Choose a template',
1362
- 'plugins.promptTemplates.compose.chooseTemplateHint': 'Select a template to start composing.',
1363
- 'plugins.promptTemplates.compose.builtinSuffix': ' (built-in)',
1364
- 'plugins.promptTemplates.compose.empty': 'No templates available.',
1365
- 'plugins.promptTemplates.compose.varsHint': 'Fill and add variables in “Manage”.',
1366
- 'plugins.promptTemplates.compose.missingCount': '{count} missing',
1367
- 'plugins.promptTemplates.compose.jumpToMissing': 'Jump to missing',
1368
- 'plugins.promptTemplates.compose.goManage': 'Manage variables',
1369
- 'plugins.promptTemplates.compose.outputTitle': 'Output',
1370
- 'plugins.promptTemplates.compose.outputHint': 'Click “Copy” and paste into Codex/Claude.',
1371
- 'plugins.promptTemplates.compose.outputAria': 'Rendered prompt',
1372
- 'plugins.promptTemplates.compose.copy': 'Copy',
1373
- 'plugins.promptTemplates.manage.searchAria': 'Search templates',
1374
- 'plugins.promptTemplates.manage.searchPlaceholder': 'Search templates',
1375
- 'plugins.promptTemplates.manage.create': 'New',
1376
- 'plugins.promptTemplates.manage.export': 'Export',
1377
- 'plugins.promptTemplates.manage.import': 'Import',
1378
- 'plugins.promptTemplates.manage.loading': 'Loading templates...',
1379
- 'plugins.promptTemplates.manage.empty': 'No templates.',
1380
- 'plugins.promptTemplates.manage.vars': '{count} vars',
1381
- 'plugins.promptTemplates.manage.builtin': 'built-in',
1382
- 'plugins.promptTemplates.manage.custom': 'custom',
1383
- 'plugins.promptTemplates.manage.newTemplateName': 'New template',
1384
- 'plugins.promptTemplates.editor.selectHint': 'Select a template to edit.',
1385
- 'plugins.promptTemplates.editor.namePlaceholder': 'Template name',
1386
- 'plugins.promptTemplates.editor.nameAria': 'Template name',
1387
- 'plugins.promptTemplates.editor.duplicate': 'Duplicate',
1388
- 'plugins.promptTemplates.editor.delete': 'Delete',
1389
- 'plugins.promptTemplates.editor.save': 'Save',
1390
- 'plugins.promptTemplates.editor.builtinReadOnly': 'Built-in templates are read-only (no edit/save/delete/duplicate).',
1391
- 'plugins.promptTemplates.editor.descPlaceholder': 'Description (optional)',
1392
- 'plugins.promptTemplates.editor.descAria': 'Template description',
1393
- 'plugins.promptTemplates.editor.templateLabel': 'Template',
1394
- 'plugins.promptTemplates.editor.templateAria': 'Template body',
1395
- 'plugins.promptTemplates.editor.templatePlaceholder': 'Write your template here. Use {{var}} placeholders.',
1396
- 'plugins.promptTemplates.vars.title': 'Variables',
1397
- 'plugins.promptTemplates.vars.hint': 'Detected from the template. Fill them to render the final prompt.',
1398
- 'plugins.promptTemplates.vars.add': 'Add variable',
1399
- 'plugins.promptTemplates.vars.reset': 'Reset',
1400
- 'plugins.promptTemplates.vars.empty': 'No variables detected.',
1401
- 'plugins.promptTemplates.vars.valuePlaceholder': 'Value for {name}',
1402
- 'plugins.promptTemplates.preview.title': 'Preview',
1403
- 'plugins.promptTemplates.preview.hint': 'Rendered output (missing vars become empty).',
1404
- 'plugins.promptTemplates.preview.copy': 'Copy',
1405
- 'plugins.promptTemplates.preview.outputAria': 'Rendered prompt',
1406
- 'plugins.promptTemplates.noPluginSelected': 'Select a plugin from the left panel first.',
1407
- 'plugins.promptTemplates.varModal.title': 'Add variable',
1408
- 'plugins.promptTemplates.varModal.nameLabel': 'Variable name',
1409
- 'plugins.promptTemplates.varModal.cancel': 'Cancel',
1410
- 'plugins.promptTemplates.varModal.add': 'Add',
1411
-
1412
- 'plugins.meta.attribution': 'Created by {createdBy} · Maintained by {maintainers}',
1413
- 'plugins.meta.createdBy': 'Created by {createdBy}',
1414
- 'plugins.meta.maintainedBy': 'Maintained by {maintainers}',
1415
-
1416
- // Built-in prompt templates
1417
- 'plugins.builtin.commentPolish.name': 'Comment polish',
1418
- 'plugins.builtin.commentPolish.desc': 'Polish the following code comments {{code}}',
1419
- 'plugins.builtin.commentPolish.line1': 'Polish the following code comments',
1420
- 'plugins.builtin.ruleAck.name': 'Rule acknowledgement',
1421
- 'plugins.builtin.ruleAck.desc': 'Please follow 【{{rule}}】, reply when received',
1422
- 'plugins.builtin.ruleAck.line1': 'Please follow 【{{rule}}】, reply when received',
1423
-
1424
- // Toasts
1425
- 'toast.copy.empty': 'Nothing to copy',
1426
- 'toast.copy.ok': 'Copied',
1427
- 'toast.copy.fail': 'Copy failed',
1428
- 'toast.save.ok': 'Saved',
1429
- 'toast.save.fail': 'Save failed',
1430
- 'toast.delete.ok': 'Deleted',
1431
- 'toast.delete.fail': 'Delete failed',
1432
- 'toast.export.empty': 'Nothing to export',
1433
- 'toast.export.ok': 'Exported',
1434
- 'toast.export.fail': 'Export failed',
1435
- 'toast.import.ok': 'Imported',
1436
- 'toast.import.fail': 'Import failed',
1437
- 'toast.import.notAvailable': 'Import is not available',
1438
- 'toast.import.readFileFail': 'Failed to read file',
1439
- 'toast.import.invalidJson': 'Invalid JSON',
1440
- 'toast.import.expectedArray': 'Expected an array',
1441
- 'toast.export.notSupported': 'Export not supported',
1442
- 'toast.plugins.loadFail': 'Failed to load plugins',
1443
- 'toast.templates.builtinNotEditable': 'Built-in templates are not editable',
1444
- 'toast.templates.varAdded': 'Variable added',
1445
- 'toast.templates.builtinNotModifiable': 'Built-in templates are read-only. Duplicate first.',
1446
- 'toast.templates.nameRequired': 'Template name is required',
1447
- 'toast.templates.varNameRequired': 'Variable name is required',
1448
- 'toast.templates.varNameInvalid': 'Variable name may only contain letters, numbers, underscore, dash, dot',
1449
- 'toast.templates.varExists': 'Variable already exists',
1450
- 'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
1451
- 'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
1452
- 'toast.templates.deleteTitle': 'Delete template',
1453
- 'toast.templates.deleteMessage': 'Delete “{name}”? This action cannot be undone.',
1454
- 'toast.templates.deleteConfirm': 'Delete',
1455
- 'toast.templates.deleteCancel': 'Cancel',
1456
-
1457
- // Basic modals
1458
- 'modal.providerAdd.title': 'Add provider',
1459
- 'modal.providerEdit.title': 'Edit provider',
1460
- 'modal.modelAdd.title': 'Add model',
1461
- 'modal.modelManage.title': 'Manage models',
1462
- 'modal.claudeConfigAdd.title': 'Add Claude Code config',
1463
- 'modal.claudeConfigEdit.title': 'Edit Claude Code config',
1464
- 'field.useBuiltinTransform': 'Use built-in transform (OpenAI compatible)',
1465
- 'hint.useBuiltinTransform': 'When enabled, base_url points to codexmate built-in transform service; Codex token is fixed to codexmate.',
1466
-
1467
- // Config template / agents modals
1468
- 'modal.configTemplate.title': 'Config template editor (manual confirm)',
1469
- 'modal.configTemplate.label': 'config.toml template',
1470
- 'modal.configTemplate.placeholder': 'Edit config.toml template here',
1471
- 'modal.configTemplate.mode.twoStep': 'Two-step confirm: preview diff, then apply.',
1472
- 'modal.configTemplate.mode.oneStep': 'One-step apply: write immediately.',
1473
- 'diff.title.configTemplate': 'Diff preview (config.toml)',
1474
- 'diff.generating': 'Generating...',
1475
- 'diff.failed': 'Failed',
1476
- 'diff.noChanges': 'No changes detected',
1477
- 'diff.hint.busy': 'Generating diff or applying. Actions are temporarily disabled.',
1478
- 'diff.hint.failedBack': 'Diff preview failed. Go back to edit and retry.',
1479
- 'diff.hint.noChangesBack': 'No changes detected. Go back to edit or cancel.',
1480
- 'diff.hint.previewMode': 'Preview mode. Click “Apply” to write or “Back to edit” to continue.',
1481
-
1482
- 'modal.agents.export': 'Export',
1483
- 'modal.agents.copy': 'Copy',
1484
- 'modal.agents.title': 'AGENTS.md editor',
1485
- 'modal.agents.hint': 'Saved content will be written to the target AGENTS.md (next to config.toml).',
1486
- 'modal.agents.targetFile': 'Target file',
1487
- 'modal.agents.contentLabel': 'AGENTS.md content',
1488
- 'modal.agents.placeholder': 'Edit AGENTS.md here',
1489
- 'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “Apply”.',
1490
- 'modal.agents.unsaved.detectedHint': 'Unsaved changes detected: save before closing or applying.',
1491
- 'modal.agents.hint.shortcuts': 'Shortcut: Esc (back to edit in preview, close in edit).',
1492
- 'modal.agents.hint.twoStepSave': 'Two-step save: “Confirm” to preview diff, then “Apply” to save.',
1493
- 'diff.tooLargeSkip': 'Content too large. Line diff preview skipped.',
1494
- 'diff.viewHint.preview': 'Preview mode. Click “Apply” to save or “Back to edit” to continue.',
1495
- 'diff.viewHint.truncated': 'Preview skipped due to size. Click “Apply” to save or “Back to edit” to continue.',
1496
-
1497
- // Skills modal
1498
- 'modal.skills.title': 'Skills manager',
1499
- 'modal.skills.subtitle': 'Manage local skills for the current host.',
1500
- 'modal.skills.target.aria': 'Select skills target',
1501
- 'modal.skills.rootDir': 'Skills directory ({label})',
1502
- 'modal.skills.summary.target': 'Target',
1503
- 'modal.skills.summary.total': 'Total',
1504
- 'modal.skills.summary.withSkill': 'With SKILL.md',
1505
- 'modal.skills.summary.missingSkill': 'Missing SKILL.md',
1506
- 'modal.skills.summary.importable': 'Importable',
1507
- 'modal.skills.panel.aria': 'Skills manager',
1508
- 'modal.skills.local.title': 'Local skills',
1509
- 'modal.skills.local.note': 'Search, filter, and bulk delete.',
1510
- 'modal.skills.filter.keywordAria': 'Filter by name or description',
1511
- 'modal.skills.filter.keywordPlaceholder': 'Search by dir name / display name / description',
1512
- 'modal.skills.filter.statusAria': 'Filter by SKILL.md status',
1513
- 'modal.skills.filter.status.all': 'All',
1514
- 'modal.skills.filter.status.withSkill': 'With SKILL.md',
1515
- 'modal.skills.filter.status.missingSkill': 'Missing SKILL.md',
1516
- 'modal.skills.selection.stats': '{selected} selected (filtered {filtered} / {total}, selected in filtered {visibleSelected})',
1517
- 'modal.skills.empty.local': 'No skills to manage.',
1518
- 'modal.skills.empty.filtered': 'No skills match the current filters.',
1519
- 'modal.skills.pill.hasSkillFile': 'Has SKILL.md',
1520
- 'modal.skills.pill.missingSkillFile': 'Missing SKILL.md',
1521
- 'modal.skills.pill.symlink': 'Symlink',
1522
- 'modal.skills.pill.dir': 'Directory',
1523
- 'modal.skills.import.title': 'Cross-app import',
1524
- 'modal.skills.import.note': 'Scan and import into {label}.',
1525
- 'modal.skills.import.scan': 'Scan importable',
1526
- 'modal.skills.import.stats': '{selected} selected / {total}. With SKILL.md {configured}, missing {missing}.',
1527
- 'modal.skills.import.emptyHint': 'No importable skills. Click “Scan importable”.',
1528
- 'modal.skills.bulk.title': 'Bulk actions',
1529
- 'modal.skills.bulk.note': 'Right side is import selection; left side is local selection.',
1530
- 'modal.skills.actions.zipImport': 'Import ZIP',
1531
- 'modal.skills.actions.zipImporting': 'Importing ZIP...',
1532
- 'modal.skills.actions.exportSelected': 'Export selected',
1533
- 'modal.skills.actions.exporting': 'Exporting...',
1534
- 'modal.skills.actions.importSelected': 'Import selected',
1535
- 'modal.skills.actions.importing': 'Importing...',
1536
- 'modal.skills.actions.deleteSelected': 'Delete selected',
1537
- 'modal.skills.actions.deleting': 'Deleting...',
1538
-
1539
- // OpenClaw config modal (quick)
1540
- 'placeholder.openclawConfigNameExample': 'e.g. Default',
1541
- 'modal.openclaw.loadCurrent': 'Load current config',
1542
- 'modal.openclaw.quick.title': 'Quick setup',
1543
- 'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
1544
- 'modal.openclaw.quick.readFromEditor': 'Read from editor',
1545
- 'modal.openclaw.quick.step1': 'Fill provider and model',
1546
- 'modal.openclaw.quick.step2': 'Write to editor',
1547
- 'modal.openclaw.quick.step3': 'Save & apply',
1548
- 'modal.openclaw.quick.providerHint': 'Will be combined as provider/model for the primary model identifier.',
1549
- 'modal.openclaw.quick.baseUrlHintDefault': 'Pre-filled from OpenClaw built-in provider defaults. You can edit it directly.',
1550
- 'modal.openclaw.quick.baseUrlHintReadonly': 'Detected an external reference. Read-only in quick form; edit in raw editor.',
1551
- 'modal.openclaw.quick.apiKeyHintFromAuth': 'Value comes from external auth profile; changes will be written back on save & apply.',
1552
- 'modal.openclaw.quick.apiKeyHintReadonly': 'Detected external auth/reference. Read-only in quick form; edit in raw editor or auth config.',
1553
- 'modal.openclaw.quick.apiKeyHintKeep': 'Leave blank to keep existing key.',
1554
- 'placeholder.apiTypeExample': 'e.g. openai-responses',
1555
- 'modal.openclaw.quick.modelTitle': 'Model',
1556
- 'placeholder.modelIdExample': 'e.g. gpt-4.1',
1557
- 'placeholder.modelNameOptional': 'Leave blank to use model ID',
1558
- 'field.contextWindow': 'Context window',
1559
- 'field.maxOutput': 'Max output',
1560
- 'hint.emptyNoChange': 'Leave blank to keep existing values.',
1561
- 'modal.openclaw.quick.optionsTitle': 'Options',
1562
- 'modal.openclaw.quick.setPrimary': 'Set as primary model',
1563
- 'modal.openclaw.quick.overrideProvider': 'Override provider base settings',
1564
- 'modal.openclaw.quick.overrideModels': 'Override model list',
1565
- 'modal.openclaw.quick.optionsHint': 'When override is off, only missing fields will be filled.',
1566
- 'modal.openclaw.quick.writeToEditor': 'Write to editor',
1567
-
1568
- // Docs panel
1569
- 'docs.title': 'CLI Install',
1570
- 'docs.subtitle': 'Install commands for Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI.',
1571
- 'docs.section.commands': 'Commands',
1572
- 'docs.section.commandsNote': 'Copy and run directly.',
1573
- 'docs.section.faq': 'FAQ',
1574
- 'docs.section.faqNote': 'Common issues and tips.',
1575
- 'docs.command.aria': '{name} command',
1576
- 'docs.registryHintPrefix': 'Command will append:',
1577
- 'docs.registryHintCustom': 'Enter a full URL (http/https) to append as registry.',
1578
- 'docs.registry.tencent': 'Tencent Cloud',
1579
- 'docs.meta.bin': 'bin: {bin}',
1580
- 'docs.termuxLabel': 'Termux',
1581
- 'docs.termuxAria': 'Termux Codex CLI command',
1582
- 'docs.rule.1': 'Commands depend on package manager, registry and action.',
1583
- 'docs.rule.2': 'Custom registry is used for install/update only.'
1584
- ,
1585
- 'docs.tip.win.1': 'If PowerShell reports permission errors (EACCES/EPERM), run the install command as Administrator.',
1586
- 'docs.tip.win.2': 'If the command is still not found after install, reopen the terminal and run: where codex / where claude / where gemini / where codebuddy.',
1587
- 'docs.tip.win.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
1588
- 'docs.tip.unix.1': 'If you hit EACCES, fix your global Node directory permissions instead of using sudo npm.',
1589
- 'docs.tip.unix.2': 'If the command is not available after install, reopen the terminal and run: which codex / which claude / which gemini / which codebuddy.',
1590
- 'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).'
1591
- ,
1592
-
1593
- // Sessions panel
1594
- 'sessions.loading': 'Loading...',
1595
- 'sessions.sourceTitle': 'Session Source',
1596
- 'sessions.refresh': 'Refresh',
1597
- 'sessions.refreshing': 'Refreshing...',
1598
- 'sessions.allPaths': 'All paths',
1599
- 'sessions.source.codex': 'Codex',
1600
- 'sessions.source.claudeCode': 'Claude Code',
1601
- 'sessions.source.gemini': 'Gemini CLI',
1602
- 'sessions.source.codebuddy': 'CodeBuddy Code',
1603
- 'sessions.loadingList': 'Loading sessions...',
1604
- 'sessions.empty': 'No sessions found',
1605
- 'sessions.unknownTime': 'unknown time',
1606
- 'sessions.query.placeholder.enabled': 'Search keywords (Codex/Claude/Gemini/CodeBuddy, e.g. claude code)',
1607
- 'sessions.query.placeholder.disabled': 'Keyword search is not available for this source',
1608
- 'sessions.pin': 'Pin',
1609
- 'sessions.unpin': 'Unpin',
1610
- 'sessions.copyResume': 'Copy resume command',
1611
- 'sessions.resumeYolo': 'Append --yolo to resume command',
1612
- 'sessions.preview.refresh': 'Refresh content',
1613
- 'sessions.preview.loading': 'Loading...',
1614
- 'sessions.preview.deleteHard': 'Delete permanently',
1615
- 'sessions.preview.moveToTrash': 'Move to trash',
1616
- 'sessions.preview.deleting': 'Deleting...',
1617
- 'sessions.preview.moving': 'Moving...',
1618
- 'sessions.preview.export': 'Export',
1619
- 'sessions.preview.exporting': 'Exporting...',
1620
- 'sessions.preview.convert': 'Create derived',
1621
- 'sessions.preview.converting': 'Creating...',
1622
- 'sessions.preview.convert.loadedOnly': 'Converted loaded messages only',
1623
- 'sessions.preview.openStandalone': 'Open in new tab',
1624
- 'sessions.preview.loadingBody': 'Loading session content...',
1625
- 'sessions.preview.emptyMsgs': 'No messages to display',
1626
- 'sessions.preview.rendering': 'Rendering session content...',
1627
- 'sessions.preview.rerender': 'Re-render',
1628
- 'sessions.preview.preparing': 'Preparing session content...',
1629
- 'sessions.preview.clipped': 'Showing the latest {count} messages only.',
1630
- 'sessions.preview.shownCount': 'Shown {shown} / {total}',
1631
- 'sessions.preview.loadMore': 'Load more (remaining {remain})',
1632
- 'sessions.preview.loadingMore': 'Loading older messages...'
1633
- ,
1634
- 'sessions.timeline.aria': 'Session timeline',
1635
- 'sessions.selectHint': 'Select a session on the left first',
1636
- 'sessions.role.all': 'All roles',
1637
- 'sessions.role.user': 'User only',
1638
- 'sessions.role.assistant': 'Assistant only',
1639
- 'sessions.role.system': 'System only',
1640
- 'sessions.time.all': 'All time',
1641
- 'sessions.time.7d': 'Last 7 days',
1642
- 'sessions.time.30d': 'Last 30 days',
1643
- 'sessions.time.90d': 'Last 90 days'
1644
- ,
1645
- 'sessions.sort.time': 'Sort: time',
1646
- 'sessions.sort.hot': 'Sort: hot',
1647
- 'sessions.sort.hotBadge': 'Hot'
1648
- ,
1649
- 'sessions.filters.copyLink': 'Copy filter link',
1650
- 'sessions.filters.urlBuildFail': 'Failed to build link',
1651
- 'sessions.filters.source': 'Source',
1652
- 'sessions.filters.path': 'Path',
1653
- 'sessions.filters.keyword': 'Keyword',
1654
- 'sessions.filters.role': 'Role',
1655
- 'sessions.filters.time': 'Time',
1656
- 'sessions.roleLabel.user': 'User',
1657
- 'sessions.roleLabel.system': 'System',
1658
- 'sessions.roleLabel.assistant': 'Assistant'
1659
- ,
1660
-
1661
- // Usage panel
1662
- 'usage.overview': 'Usage Overview',
1663
- 'usage.range.aria': 'Usage time range',
1664
- 'usage.range.7d': 'Last 7 days',
1665
- 'usage.range.30d': 'Last 30 days',
1666
- 'usage.range.all': 'All',
1667
- 'usage.compare.toggle': 'Compare previous',
1668
- 'usage.compare.prev': 'Prev',
1669
- 'usage.compare.delta': 'Delta',
1670
- 'usage.refresh': 'Refresh stats',
1671
- 'usage.refreshing': 'Refreshing...',
1672
- 'usage.loading': 'Loading usage stats...',
1673
- 'usage.empty': 'No session data available for usage stats',
1674
- 'usage.refreshOverlay': 'Refreshing…',
1675
- 'usage.copyTitle': 'Click to copy: {value}',
1676
- 'usage.copySuccess': 'Copied: {label}',
1677
- 'usage.copyFail': 'Copy failed',
1678
- 'usage.copyNone': 'Nothing to copy',
1679
- 'usage.daily.title': 'Daily usage',
1680
- 'usage.daily.subtitle': 'Daily aggregated tokens and estimated cost (normalized by max values).',
1681
- 'usage.daily.note': 'Note: Estimated cost excludes Claude by default; only computed when model pricing and input/output tokens are available.',
1682
- 'usage.heatmap.title': 'Activity heatmap',
1683
- 'usage.heatmap.subtitle': 'Aggregated by sessions per day; hover to see details.',
1684
- 'usage.heatmap.legend.less': 'Less',
1685
- 'usage.heatmap.legend.more': 'More',
1686
- 'usage.heatmap.tooltip': '{date} · {sessions} sessions · {messages} messages · {tokens} tokens',
1687
- 'usage.heatmap.aria': '{date}, {sessions} sessions',
1688
- 'usage.hourlyHeatmap.title': '7×24 Activity Heatmap',
1689
- 'usage.hourlyHeatmap.subtitle': 'Session distribution by weekday × hour; darker = more active.',
1690
- 'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} sessions · {messages} messages · {tokens} tokens',
1691
- 'usage.hourlyHeatmap.legend.less': 'Less',
1692
- 'usage.hourlyHeatmap.legend.more': 'More',
1693
- 'usage.legend.tokens': 'Tokens',
1694
- 'usage.legend.cost': 'Estimated cost',
1695
- 'usage.table.date': 'Date',
1696
- 'usage.table.sessions': 'Sessions',
1697
- 'usage.table.messages': 'Messages',
1698
- 'usage.table.tokens': 'Tokens',
1699
- 'usage.table.cost': 'Estimated cost',
1700
- 'usage.trend.sessions': 'Session trend',
1701
- 'usage.trend.messages': 'Message trend',
1702
- 'usage.trend.activeHours': 'Active hours',
1703
- 'usage.trend.sources': 'Source insights',
1704
- 'usage.legend.codex': 'Codex',
1705
- 'usage.legend.claude': 'Claude',
1706
- 'usage.trend.sessions.codexTitle': 'Codex {count}',
1707
- 'usage.trend.sessions.claudeTitle': 'Claude {count}',
1708
- 'usage.trend.messages.barTitle': '{count} messages',
1709
- 'usage.hour.title': '{hour}:00 · {count} sessions',
1710
- 'usage.source.row': '{sessions} sessions · {messages} messages · avg {avg}',
1711
- 'usage.summary.sessions': 'Total sessions',
1712
- 'usage.summary.messages': 'Total messages',
1713
- 'usage.summary.tokens': 'Total tokens',
1714
- 'usage.summary.contextWindow': 'Total context',
1715
- 'usage.summary.estimatedCost': 'Estimated cost · {range}',
1716
- 'usage.estimatedCost.note.excludesClaudePrefix': 'Excludes Claude. ',
1717
- 'usage.estimatedCost.method.configured': 'Estimated using configured pricing',
1718
- 'usage.estimatedCost.method.catalog': 'Estimated using public catalog pricing',
1719
- 'usage.estimatedCost.method.configuredAndCatalog': 'Estimated using configured + public catalog pricing',
1720
- 'usage.estimatedCost.detail.estimate': '{prefix}{method}. Estimate {estimate}. Coverage {covered}/{total} sessions (~{percent}% tokens).',
1721
- 'usage.estimatedCost.detail.missing': '{prefix}Missing matching model pricing or token breakdown. Add models.cost or ensure sessions record input/output tokens.',
1722
- 'usage.summary.activeDuration': 'Active duration',
1723
- 'usage.summary.activeDuration.title': 'Active span {value}',
1724
- 'usage.summary.totalDuration': 'Total duration',
1725
- 'usage.summary.totalDuration.title': 'Overall span {value}',
1726
- 'usage.summary.activeDays': 'Active days',
1727
- 'usage.summary.avgMessagesPerSession': 'Avg messages/session',
1728
- 'usage.summary.busiestDay': 'Busiest day',
1729
- 'usage.summary.busiestHour': 'Peak hour',
1730
- 'usage.currentSession.title': 'Current session',
1731
- 'usage.currentSession.apiDuration': 'API duration',
1732
- 'usage.currentSession.totalDuration': 'Total duration',
1733
- 'usage.currentSession.tokens': 'Tokens',
1734
- 'usage.range.kicker.all': 'All',
1735
- 'usage.range.kicker.30d': 'Last 30 days',
1736
- 'usage.range.kicker.7d': 'Last 7 days',
1737
- 'usage.copyTokenDay': 'Copied: Tokens ({day})',
1738
- 'usage.copyCostDay': 'Copied: Estimated cost ({day})'
1739
- ,
1740
- 'usage.dayDetail.title': '{day} detail',
1741
- 'usage.dayDetail.subtitle': 'Pick a day to inspect its breakdown.',
1742
- 'usage.dayDetail.pick': 'Pick a day',
1743
- 'usage.dayDetail.empty': 'Pick a day to inspect its breakdown.',
1744
- 'usage.dayDetail.clear': 'Clear',
1745
- 'usage.dayDetail.topSessions': 'Top sessions',
1746
- 'usage.dayDetail.topModels': 'Top models'
1747
- ,
1748
- 'usage.models.title': 'Models used',
1749
- 'usage.models.subtitle': 'Only includes model names present in saved records.',
1750
- 'usage.models.kicker': 'Identified {modeled}/{total}',
1751
- 'usage.models.count': 'Models',
1752
- 'usage.models.coverage': 'Coverage',
1753
- 'usage.models.missing': 'Missing model',
1754
- 'usage.models.noneTitle': 'No model names found in this range',
1755
- 'usage.models.noneBody': 'Scanned {total} sessions, but no recognizable model field was found in raw records.',
1756
- 'usage.models.providerOnly': '{count} older sessions only recorded provider.',
1757
- 'usage.models.missingNote.providerOnly': '{count} sessions did not record model names and are excluded.',
1758
- 'usage.models.missingNote': '{count} sessions are missing model and are excluded.',
1759
- 'usage.models.missingListTitle': 'Sessions still missing model',
1760
- 'usage.models.chipTitle': '{model} · {sessions} sessions · {messages} messages{tokens}',
1761
- 'usage.models.meta': '{sessions} sessions · {messages} messages{tokens}',
1762
- 'usage.weekday.title': 'Weekday distribution',
1763
- 'usage.paths.title': 'Top paths',
1764
- 'usage.paths.empty': 'No path data',
1765
- 'usage.paths.count': '{count} hits',
1766
- 'usage.paths.meta': '{messages} messages{recent}',
1767
- 'usage.paths.recent': ' · last {label}',
1768
- 'usage.recent.title': 'Recently active sessions',
1769
- 'usage.sessions.empty': 'No session data',
1770
- 'usage.sessions.messages': '{count} messages',
1771
- 'usage.sessions.topDensity': 'Most messages'
1772
- ,
1773
-
1774
- // Config panel (Codex)
1775
- 'config.addProvider': 'Add provider',
1776
- 'config.models': 'Model',
1777
- 'config.modelLoading': 'Loading...',
1778
- 'config.models.unlimited': 'No model list available. Enter manually.',
1779
- 'config.models.error': 'Failed to fetch model list. Enter manually.',
1780
- 'config.models.notInList.codex': 'Current model is not in the list. Enter manually or edit the template.',
1781
- 'config.models.notInList.other': 'Current model is not in the list. Enter manually.',
1782
- 'config.template.editFirst': 'Edit template first, then apply.',
1783
- 'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
1784
- 'config.template.openEditor': 'Open template editor',
1785
- 'modal.configTemplate.title': 'Config template editor (manual confirm)',
1786
- 'modal.configTemplate.placeholder': 'Edit config.toml template here',
1787
- 'config.serviceTier': 'Service tier',
1788
- 'config.serviceTier.fast': 'fast (default)',
1789
- 'config.serviceTier.standard': 'standard',
1790
- 'config.serviceTier.hint': 'Only fast writes {field}.',
1791
- 'config.reasoningEffort': 'Reasoning effort',
1792
- 'config.reasoningEffort.medium': 'medium (default)',
1793
- 'config.reasoningEffort.hint': 'Controls reasoning depth; high is deeper.',
1794
- 'config.contextBudget': 'Compaction thresholds',
1795
- 'config.reset': 'Reset',
1796
- 'config.example': 'e.g. {value}',
1797
- 'config.contextWindow.hint': 'Context window limit (default 190000).',
1798
- 'config.autoCompact.hint': 'Auto-compaction threshold (default 185000).',
1799
- 'config.agents.open': 'Open AGENTS.md',
1800
- 'modal.agents.title.default': 'AGENTS.md editor',
1801
- 'modal.agents.title.claudeMd': 'CLAUDE.md editor',
1802
- 'modal.agents.title.openclaw': 'OpenClaw AGENTS.md editor',
1803
- 'modal.agents.hint.default': 'Saved content will be written to AGENTS.md (next to config.toml).',
1804
- 'modal.agents.hint.claudeMd': 'Saved content will be written to ~/.claude/CLAUDE.md.',
1805
- 'modal.agents.contentLabel.claudeMd': 'CLAUDE.md content',
1806
- 'modal.agents.placeholder.claudeMd': 'Edit CLAUDE.md here',
1807
- 'modal.agents.hint.openclaw': 'Saved content will be written to OpenClaw workspace AGENTS.md.',
1808
- 'modal.agents.title.openclawWorkspaceFile': 'OpenClaw workspace file: {fileName}',
1809
- 'modal.agents.hint.openclawWorkspaceFile': 'Saved content will be written to OpenClaw workspace {fileName}.',
1810
- 'config.url.unset': 'URL not set',
1811
- 'config.badge.system': 'System',
1812
- 'config.availabilityTest': 'Availability test',
1813
- 'config.availabilityTestAria': 'Test availability for {name}',
1814
- 'config.health.title': 'Config health check',
1815
- 'config.health.run': 'Run check',
1816
- 'config.health.running': 'Checking...',
1817
- 'config.health.hint': 'Runs availability probes across all providers and refreshes latency badges.',
1818
- 'config.health.progress': '{done}/{total} done · {failed} failed',
1819
- 'config.health.ok': 'Passed',
1820
- 'config.health.fail': 'Failed',
1821
- 'config.health.issues': '{count} issues',
1822
- 'config.shareCommand': 'Share command',
1823
- 'config.shareDisabled': 'Not shareable'
1824
- ,
1825
- 'config.shareCommand.aria': 'Share import command',
1826
- 'config.provider.edit.aria': 'Edit provider: {name}',
1827
- 'config.provider.delete.aria': 'Delete provider: {name}',
1828
- 'app.loadingConfig': 'Loading configuration...'
1829
- ,
1830
- 'common.current': 'Current {value}',
1831
- 'common.notSelected': 'Not selected',
1832
- 'common.readFromEditor': 'Read from editor',
1833
- 'common.writeToEditor': 'Write to editor',
1834
- 'sessions.sourceLabel': 'Source: {value}',
1835
- 'usage.rangeLabel': 'Range: {value}',
1836
- 'sessions.source.all': 'All',
1837
- 'usage.range.all': 'All',
1838
- 'usage.range.7d.short': 'Last 7 days',
1839
- 'usage.range.30d.short': 'Last 30 days',
1840
- 'orchestration.queueStats': 'Queue: {running} running · {queued} queued',
1841
- 'orchestration.hero.kicker': 'Task orchestration',
1842
- 'orchestration.hero.title': 'Turn goals into executable steps',
1843
- 'orchestration.hero.subtitle': 'Write a target, preview a plan, then run.',
1844
- 'orchestration.draft.reset': 'Reset draft',
1845
- 'orchestration.summary.aria': 'Task orchestration summary',
1846
- 'orchestration.summary.running': 'Running',
1847
- 'orchestration.summary.queued': 'Queued',
1848
- 'orchestration.summary.runs': 'Runs',
1849
- 'orchestration.step1.title': 'Start with the outcome',
1850
- 'orchestration.step1.subtitle': 'Only include what affects execution.',
1851
- 'orchestration.templates.title': 'Quick examples',
1852
- 'orchestration.templates.reviewFix.label': 'Review fixes + regression',
1853
- 'orchestration.templates.reviewFix.target': 'Address current PR review comments and add regression tests',
1854
- 'orchestration.templates.reviewFix.notes': 'Avoid unrelated refactors; provide verification results',
1855
- 'orchestration.templates.reviewFix.followUps': 'Handle newly added review comments\nUpdate the PR summary',
1856
- 'orchestration.templates.planOnly.label': 'Plan only',
1857
- 'orchestration.templates.planOnly.target': 'Investigate root cause and propose an execution plan without changing code',
1858
- 'orchestration.templates.planOnly.notes': 'Focus on root cause, blast radius, and risk areas',
1859
- 'orchestration.templates.workflowBatch.label': 'Workflow batch',
1860
- 'orchestration.templates.workflowBatch.target': 'Run a fixed set of checks using workflows and summarize results',
1861
- 'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
1862
- 'orchestration.templates.workflowBatch.notes': 'Produce a unified conclusion; avoid repetitive narration',
1863
- 'orchestration.fields.target': 'Target',
1864
- 'orchestration.fields.target.placeholder': 'e.g. Address PR review comments and add regression tests; avoid unrelated modules',
1865
- 'orchestration.fields.target.hint': 'One sentence is enough: outcome, constraints, and acceptance criteria.',
1866
- 'orchestration.engine.codex': 'Codex',
1867
- 'orchestration.engine.workflow': 'Workflow',
1868
- 'orchestration.runMode.write': 'Write',
1869
- 'orchestration.runMode.readOnly': 'Read-only',
1870
- 'orchestration.runMode.dryRun': 'Dry run',
1871
- 'orchestration.pills.hasTitle': 'Title set',
1872
- 'orchestration.pills.workflowCount': 'Workflows {count}',
1873
- 'orchestration.pills.planNodes': 'Plan {count} nodes',
1874
- 'orchestration.step2.title': 'Choose how to run',
1875
- 'orchestration.step2.subtitle': 'Common options are visible; the rest lives under Advanced.',
1876
- 'orchestration.fields.engine': 'Engine',
1877
- 'orchestration.fields.runMode': 'Run mode',
1878
- 'orchestration.advanced.title': 'Advanced',
1879
- 'orchestration.fields.title': 'Title',
1880
- 'orchestration.fields.title.placeholder': 'Optional. Defaults to an inferred title from target.',
1881
- 'orchestration.fields.notes': 'Notes',
1882
- 'orchestration.fields.notes.placeholder': 'e.g. Do incremental changes only; do not rewrite architecture',
1883
- 'orchestration.fields.notes.hint': 'Add boundaries, constraints, style rules, or verification requirements.',
1884
- 'orchestration.fields.followUps': 'Follow-ups (one per line)',
1885
- 'orchestration.fields.followUps.placeholder': 'e.g.\nAddress new review comments\nAdd regression tests',
1886
- 'orchestration.fields.concurrency': 'Concurrency',
1887
- 'orchestration.fields.concurrency.hint': 'Start with 1–2 for complex tasks.',
1888
- 'orchestration.fields.autoFixRounds': 'Auto-fix',
1889
- 'orchestration.fields.autoFixRounds.hint': 'Retry a few rounds after failures.',
1890
- 'orchestration.fields.workflowIds': 'Workflow IDs (one per line)',
1891
- 'orchestration.fields.workflowIds.placeholder': 'e.g.\ndiagnose-config\nsafe-provider-switch',
1892
- 'orchestration.fields.workflowIds.hint': 'Required in Workflow mode. {count} available locally.',
1893
- 'orchestration.workflow.stepCount': '{count} steps',
1894
- 'orchestration.step3.title': 'Preview, then execute',
1895
- 'orchestration.step3.subtitle': 'Confirm the plan, then decide to run now or queue.',
1896
- 'orchestration.actions.planning': 'Planning...',
1897
- 'orchestration.actions.previewOnly': 'Preview only',
1898
- 'orchestration.actions.preparing': 'Preparing...',
1899
- 'orchestration.actions.generatePlan': 'Generate plan',
1900
- 'orchestration.actions.planAndRun': 'Plan & run',
1901
- 'orchestration.actions.processing': 'Working...',
1902
- 'orchestration.actions.queueAndStart': 'Queue & start',
1903
- 'orchestration.actions.caption': '“Plan & run” refreshes the plan when needed; use “Queue & start” for batch runs.',
1904
- 'orchestration.stage.title': 'Workspace opens when there is data',
1905
- 'orchestration.stage.subtitle': 'Write the target first, then preview the plan.',
1906
- 'orchestration.stage.pill.target': 'Write target',
1907
- 'orchestration.stage.pill.preview': 'Preview',
1908
- 'orchestration.stage.pill.run': 'Run or queue',
1909
- 'orchestration.plan.title': 'Plan preview',
1910
- 'orchestration.plan.subtitle': 'Confirm nodes, waves, and dependencies.',
1911
- 'orchestration.plan.summary.nodes': 'Nodes',
1912
- 'orchestration.plan.summary.waves': 'Waves',
1913
- 'orchestration.plan.summary.engine': 'Engine',
1914
- 'orchestration.plan.node.write': 'write',
1915
- 'orchestration.plan.node.readOnly': 'read-only',
1916
- 'orchestration.labels.dependencies': 'Dependencies: ',
1917
- 'orchestration.labels.error': 'Error: ',
1918
- 'orchestration.workbench.title': 'Workbench',
1919
- 'orchestration.workbench.subtitle': 'Only expands when there is data.',
1920
- 'orchestration.queue.start': 'Start queue',
1921
- 'orchestration.queue.starting': 'Starting...',
1922
- 'orchestration.workbench.tabs.aria': 'Workbench views',
1923
- 'orchestration.workbench.tabs.queue': 'Queue {count}',
1924
- 'orchestration.workbench.tabs.runs': 'Runs {count}',
1925
- 'orchestration.workbench.tabs.detail': 'Run detail',
1926
- 'orchestration.queue.empty.title': 'No queued tasks',
1927
- 'orchestration.queue.empty.subtitle': 'Queue batch tasks first, then start the runner.',
1928
- 'orchestration.runs.empty.title': 'No runs yet',
1929
- 'orchestration.runs.empty.subtitle': 'Recent runs will appear after execution.',
1930
- 'orchestration.detail.refresh': 'Refresh detail',
1931
- 'orchestration.detail.retry': 'Retry',
1932
- 'orchestration.detail.retrying': 'Retrying...',
1933
- 'orchestration.detail.empty.title': 'Select a run to view details',
1934
- 'orchestration.detail.empty.subtitle': 'This view shows node statuses, summaries, and logs.',
1935
- 'orchestration.detail.summary.status': 'Status',
1936
- 'orchestration.detail.summary.duration': 'Duration',
1937
- 'orchestration.detail.summary.nodes': 'Nodes',
1938
- 'orchestration.detail.summary.summary': 'Summary',
1939
- 'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
1940
- 'skills.localLabel': '{target} / Local skills',
1941
- 'skills.counts': '{installed} installed · {importable} importable',
1942
-
1943
- // Sidebar status labels (compact)
1944
- 'status.currentSource': 'Current source',
1945
- 'status.sessionCount': 'Sessions',
1946
- 'status.range': 'Range',
1947
- 'status.totalSessions': 'Total sessions',
1948
- 'status.totalMessages': 'Total messages',
1949
- 'status.engine': 'Engine',
1950
- 'status.concurrency': 'Concurrency',
1951
- 'status.running': 'Running',
1952
- 'status.queued': 'Queued',
1953
- 'status.runs': 'Runs',
1954
- 'status.currentTarget': 'Current target',
1955
- 'status.localSkills': 'Local skills',
1956
- 'status.importable': 'Importable',
1957
- 'status.importableDirect': 'Direct importable',
1958
- 'status.pm': 'Package manager',
1959
- 'status.action': 'Action',
1960
- 'status.registry': 'Registry',
1961
- 'status.claudeConfig': 'Claude config',
1962
- 'status.claudeModel': 'Claude model',
1963
- 'status.openclawConfig': 'OpenClaw config',
1964
- 'status.workspaceFile': 'Workspace file',
1965
- 'status.configMode': 'Config mode',
1966
- 'status.currentProvider': 'Current provider',
1967
- 'status.currentModel': 'Current model',
1968
- 'status.quickSwitchProvider': 'Quick switch provider'
1969
- ,
1970
- 'side.usage.meta': 'Local stats / Trends',
1971
- 'side.orchestration.meta': 'Plan / Queue / Runs'
1972
- ,
1973
-
1974
- // Settings panel
1975
- 'settings.tab.backup': 'Backup & Import',
1976
- 'settings.tab.trash': 'Trash',
1977
- 'settings.tab.device': 'Device',
1978
- 'settings.tabs.aria': 'Settings tabs',
1979
- 'settings.sharePrefix.title': 'Share command prefix',
1980
- 'settings.sharePrefix.meta': 'Used as the prefix for “Copy share command” in the Web UI',
1981
- 'settings.sharePrefix.label': 'Prefix',
1982
- 'settings.sharePrefix.hint': 'Defaults to npm start (project-local). You can switch to global codexmate. This setting is stored in the browser.',
1983
- 'settings.claude.title': 'Claude config',
1984
- 'settings.claude.meta': 'Backup / import ~/.claude',
1985
- 'settings.codex.title': 'Codex config',
1986
- 'settings.codex.meta': 'Backup / import ~/.codex',
1987
- 'settings.backup.progress': 'Backing up {percent}%',
1988
- 'settings.backup.oneClickClaude': 'Backup ~/.claude',
1989
- 'settings.backup.importClaude': 'Import ~/.claude backup',
1990
- 'settings.backup.oneClickCodex': 'Backup ~/.codex',
1991
- 'settings.backup.importCodex': 'Import ~/.codex backup',
1992
- 'settings.importing': 'Importing...',
1993
-
1994
- 'settings.deleteBehavior.title': 'Session deletion behavior',
1995
- 'settings.deleteBehavior.meta': 'Whether “Delete” moves to trash first',
1996
- 'settings.deleteBehavior.toggle': 'Move deleted sessions to trash first',
1997
- 'settings.deleteBehavior.hint': 'Enabled by default. If disabled, deleting a session will permanently delete it.',
1998
-
1999
- 'settings.trash.title': 'Trash',
2000
- 'settings.trash.meta': 'Deleted sessions (restore / purge)',
2001
- 'settings.trash.refresh': 'Refresh',
2002
- 'settings.trash.refreshing': 'Refreshing...',
2003
- 'settings.trash.clear': 'Empty trash',
2004
- 'settings.trash.clearing': 'Clearing...',
2005
- 'settings.trash.loading': 'Loading trash...',
2006
- 'settings.trash.empty': 'Trash is empty',
2007
- 'settings.trash.retry': 'Failed to load trash. Refresh to retry.',
2008
- 'settings.trash.restore': 'Restore',
2009
- 'settings.trash.restoring': 'Restoring...',
2010
- 'settings.trash.purge': 'Purge',
2011
- 'settings.trash.purging': 'Deleting...',
2012
- 'settings.trash.workspace': 'Workspace',
2013
- 'settings.trash.originalFile': 'Original file',
2014
- 'settings.trash.loadMore': 'Load more (remaining {count})',
2015
- 'settings.trash.retention': 'Auto-purge',
2016
- 'settings.trash.retentionMeta': 'Trash entries older than retention days are auto-purged',
2017
- 'settings.trash.retentionLabel': 'Retention days',
2018
- 'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',
2019
-
2020
- 'settings.templateConfirm.title': 'Template apply confirmation',
2021
- 'settings.templateConfirm.meta': 'Reduce accidental writes',
2022
- 'settings.templateConfirm.toggle': 'Preview diffs before apply (Confirm → Apply)',
2023
- 'settings.templateConfirm.hint': 'When enabled: show a diff preview first, then confirm writing.',
2024
-
2025
- 'settings.reset.title': 'Config reset',
2026
- 'settings.reset.meta': 'Proceed with caution',
2027
- 'settings.reset.hint': 'Backs up config.toml, then writes default config.',
2028
- 'settings.reset.button': 'Reset config',
2029
- 'settings.reset.loading': 'Resetting...'
2030
- ,
2031
-
2032
- // Market (Skills)
2033
- 'market.title': 'Skills Overview',
2034
- 'market.subtitle': 'Switch target and inspect local skills.',
2035
- 'market.refresh': 'Refresh overview',
2036
- 'market.refreshing': 'Refreshing...',
2037
- 'market.openManager': 'Open Skills manager',
2038
- 'market.target.aria': 'Select skills target',
2039
- 'market.summary.target': 'Target',
2040
- 'market.summary.total': 'Local total',
2041
- 'market.summary.configured': 'With SKILL.md',
2042
- 'market.summary.missing': 'Missing SKILL.md',
2043
- 'market.summary.importable': 'Importable',
2044
- 'market.summary.importableDirect': 'Direct importable',
2045
- 'market.root.fallback': 'Default path',
2046
-
2047
- 'market.installed.title': 'Installed skills',
2048
- 'market.installed.note': 'Showing top 6 only.',
2049
- 'market.local.refresh': 'Refresh local',
2050
- 'market.local.refreshing': 'Refreshing...',
2051
- 'market.local.loading': 'Loading local skills...',
2052
- 'market.local.empty': 'No installed skills found.',
2053
- 'market.pill.verified': 'Verified',
2054
- 'market.pill.missingSkill': 'Missing SKILL.md',
2055
-
2056
- 'market.import.title': 'Import sources',
2057
- 'market.import.note': 'Scan and import into {target}.',
2058
- 'market.import.scan': 'Scan sources',
2059
- 'market.import.scanning': 'Scanning...',
2060
- 'market.import.loading': 'Scanning importable skills...',
2061
- 'market.import.empty': 'No importable skills found yet.',
2062
- 'market.pill.importableDirect': 'Direct import',
2063
- 'market.pill.importMissing': 'Missing SKILL.md',
2064
-
2065
- 'market.actions.title': 'Distribution',
2066
- 'market.actions.note': 'Actions apply to the current target.',
2067
- 'market.action.manage.title': 'Manage local skills',
2068
- 'market.action.manage.copy': 'Manage installed skills for {target}',
2069
- 'market.action.crossImport.title': 'Cross-app import',
2070
- 'market.action.crossImport.copy': 'Import into {target}',
2071
- 'market.action.zipImport.title': 'ZIP import',
2072
- 'market.action.zipImport.copy': 'Import from ZIP into target',
2073
-
2074
- 'market.help.title': 'How it works',
2075
- 'market.help.target.title': 'Target switch',
2076
- 'market.help.target.copy': 'Actions write into the {target} directory.',
2077
- 'market.help.crossImport.title': 'Cross-app import',
2078
- 'market.help.crossImport.copy': 'Import unmanaged skills from other hosts.',
2079
- 'market.help.zipImport.title': 'ZIP import',
2080
- 'market.help.zipImport.copy': 'Import local skills from a ZIP file.'
2081
- ,
2082
-
2083
- // Claude config panel
2084
- 'claude.addProvider': 'Add provider',
2085
- 'claude.applyDefault': 'Applies to ~/.claude/settings.json by default.',
2086
- 'claude.presetProviders': 'Provider presets',
2087
- 'claude.customConfig': 'Custom config',
2088
- 'claude.model': 'Model',
2089
- 'claude.model.placeholder': 'e.g. claude-3-7-sonnet',
2090
- 'claude.model.hint': 'Model changes are saved and applied to the current config automatically.',
2091
- 'claude.health.title': 'Config health check',
2092
- 'claude.health.run': 'Run check',
2093
- 'claude.health.running': 'Checking...',
2094
- 'claude.health.hint': 'Runs availability probes for all Claude configs and refreshes the latency badges.',
2095
- 'claude.health.progress': '{done}/{total} done · {failed} failed',
2096
- 'claude.md.title': 'CLAUDE.md',
2097
- 'claude.md.open': 'Open CLAUDE.md',
2098
- 'claude.md.hint': 'Read/write ~/.claude/CLAUDE.md.',
2099
- 'claude.model.unset': 'Model not set',
2100
- 'claude.configured': 'Configured',
2101
- 'claude.notConfigured': 'Not configured',
2102
- 'claude.action.edit': 'Edit',
2103
- 'claude.action.delete': 'Delete',
2104
- 'claude.action.shareDisabled': 'Share import command (disabled)'
2105
- ,
2106
- 'claude.action.editAria': 'Edit Claude config: {name}',
2107
- 'claude.action.deleteAria': 'Delete Claude config: {name}',
2108
-
2109
- // OpenClaw config panel
2110
- 'openclaw.applyHint': 'Writes to ~/.openclaw/openclaw.json (JSON5 supported).',
2111
- 'openclaw.agents.hint': 'Read/write Workspace AGENTS.md. Default: ~/.openclaw/workspace/AGENTS.md.',
2112
- 'openclaw.agents.open': 'Open AGENTS.md',
2113
- 'openclaw.workspaceFile': 'Workspace file',
2114
- 'openclaw.workspace.placeholder': 'e.g. SOUL.md',
2115
- 'openclaw.workspace.hint': 'Only .md files inside the Workspace are supported.',
2116
- 'openclaw.workspace.open': 'Open workspace file',
2117
- 'openclaw.configured': 'Configured',
2118
- 'openclaw.notConfigured': 'Not configured',
2119
- 'openclaw.action.edit': 'Edit',
2120
- 'openclaw.action.delete': 'Delete',
2121
- 'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
2122
- 'modal.openclaw.quick.step2': 'Write to editor',
2123
- 'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.'
2124
- ,
2125
- 'openclaw.action.editAria': 'Edit OpenClaw config: {name}',
2126
- 'openclaw.action.deleteAria': 'Delete OpenClaw config: {name}'
2127
- }
2128
- });
2129
-
2130
- export { DICT };
2131
- export default DICT;
1
+ const DICT = Object.freeze({
2
+ zh: {
3
+ // Global
4
+ 'lang.zh': '中文',
5
+ 'lang.en': 'English',
6
+ 'lang.label': '语言',
7
+ 'nav.topTabs.aria': '导航',
8
+
9
+ // Common
10
+ 'common.all': '全部',
11
+ 'common.copy': '复制',
12
+ 'common.edit': '编辑',
13
+ 'common.install': '安装',
14
+ 'common.update': '升级',
15
+ 'common.uninstall': '卸载',
16
+ 'common.official': '官方',
17
+ 'common.custom': '自定义',
18
+ 'common.rules': '规则',
19
+ 'common.troubleshooting': '排障提示',
20
+ 'common.command': '命令',
21
+ 'common.mirror': '镜像源',
22
+ 'common.packageManager': '包管理器',
23
+ 'common.action': '操作',
24
+ 'common.targets': '目标数',
25
+ 'common.currentPm': '当前包管理器',
26
+ 'common.currentAction': '当前操作',
27
+ 'common.mirrorActive': '镜像',
28
+ 'common.defaultOfficial': '官方默认',
29
+ 'common.cancel': '取消',
30
+ 'common.confirm': '确认',
31
+ 'common.add': '添加',
32
+ 'common.save': '保存',
33
+ 'common.saveApply': '保存并应用',
34
+ 'common.close': '关闭',
35
+ 'common.delete': '删除',
36
+ 'common.clear': '清空',
37
+ 'common.show': '显示',
38
+ 'common.hide': '隐藏',
39
+ 'common.detail': '详情',
40
+ 'common.refresh': '刷新',
41
+ 'common.refreshing': '刷新中...',
42
+ 'common.loading': '加载中...',
43
+ 'common.saving': '保存中...',
44
+ 'common.sending': '发送中...',
45
+ 'common.scanning': '扫描中...',
46
+ 'common.export': '导出',
47
+ 'common.import': '导入',
48
+ 'common.apply': '应用',
49
+ 'common.applying': '应用中...',
50
+ 'common.confirming': '确认中...',
51
+ 'common.writeToEditor': '写入编辑器',
52
+ 'common.refreshFromText': '从文本刷新',
53
+ 'common.backToEdit': '返回编辑',
54
+ 'common.selectAll': '全选',
55
+ 'common.unselectAll': '取消全选',
56
+ 'common.resetFilters': '重置筛选',
57
+ 'common.notEditable': '不可编辑',
58
+ 'common.notDeletable': '不可删除',
59
+ 'common.notLoaded': '未加载',
60
+ 'common.exists': '已存在',
61
+ 'common.notExistsWillCreateOnApply': '不存在,将在应用时创建',
62
+ 'common.notExistsWillCreateOnSave': '不存在,将在保存时创建',
63
+ 'common.none': '暂无',
64
+ 'cli.missing.title': '{name} CLI 未安装',
65
+ 'cli.missing.subtitle': '请先安装 {name} CLI 后再继续使用此页面。',
66
+ 'cli.missing.openDocs': '打开安装指南',
67
+ 'cli.missing.commandAria': '{name} CLI 安装命令',
68
+
69
+ // Brand
70
+ 'brand.kicker.workspace': '工作区',
71
+ 'brand.subtitle.localConfigSessionsWorkspace': '本地配置与会话工作区',
72
+
73
+ // Confirm dialog
74
+ 'confirm.aria': '确认操作',
75
+ 'confirm.title.default': '请确认操作',
76
+ 'confirm.ok': '确认',
77
+ 'confirm.cancel': '取消',
78
+
79
+ // Shared fields
80
+ 'field.name': '名称',
81
+ 'field.configName': '配置名称',
82
+ 'field.apiEndpoint': 'API 端点',
83
+ 'field.apiKey': '认证密钥',
84
+ 'field.baseUrl': 'Base URL',
85
+ 'field.provider': '提供商',
86
+ 'field.providerName': 'Provider 名称',
87
+ 'field.modelName': '模型名称',
88
+ 'field.model': '模型',
89
+ 'field.message': '消息',
90
+ 'field.varName': '变量名',
91
+ 'field.targetFile': '目标文件',
92
+ 'field.modelId': '模型 ID',
93
+ 'field.displayName': '展示名称',
94
+ 'field.contextAndMaxOutput': '上下文与最大输出',
95
+ 'field.apiType': 'API 类型',
96
+ 'field.env': '环境变量',
97
+ 'field.allow': 'Allow',
98
+ 'field.deny': 'Deny',
99
+
100
+ // Shared placeholders/hints
101
+ 'placeholder.providerNameExample': '例如: myapi',
102
+ 'placeholder.apiEndpointExample': 'https://api.example.com/v1',
103
+ 'placeholder.providerName': '提供商名称',
104
+ 'placeholder.keepUnchanged': '留空则保持不变',
105
+ 'hint.keepKeyUnchanged': '留空表示不修改密钥',
106
+ 'placeholder.modelExample': '例如: gpt-5',
107
+ 'placeholder.configNameExample': '例如: 智谱GLM',
108
+ 'placeholder.apiKeyExampleClaude': 'sk-ant-...',
109
+ 'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
110
+ 'placeholder.selectProvider': '请选择提供商',
111
+
112
+ // Roles / labels
113
+ 'role.you': '你',
114
+ 'role.provider': '提供商',
115
+ 'label.model': '模型:',
116
+
117
+ // Top tabs
118
+ 'tab.dashboard': '概览',
119
+ 'tab.docs': '文档',
120
+ 'tab.config': '配置',
121
+ 'tab.config.codex': 'Codex',
122
+ 'tab.config.claude': 'Claude',
123
+ 'tab.config.openclaw': 'OpenClaw',
124
+ 'tab.sessions': '会话',
125
+ 'tab.usage': '用量',
126
+ 'tab.orchestration': '任务',
127
+ 'tab.market': 'Skills',
128
+ 'tab.plugins': '插件',
129
+ 'tab.settings': '设置',
130
+
131
+ // Side rail section titles
132
+ 'side.overview': '概览',
133
+ 'side.docs': '文档',
134
+ 'side.config': '配置',
135
+ 'side.sessions': '会话',
136
+ 'side.plugins': '插件',
137
+ 'side.system': '系统',
138
+ 'side.orchestration': '任务',
139
+ 'side.skills': 'Skills',
140
+
141
+ // Side rail items
142
+ 'side.overview.doctor': 'Doctor 面板',
143
+ 'side.overview.doctor.meta': '总览 / 诊断 / 跳转',
144
+ 'side.docs.cliInstall': 'CLI 安装',
145
+ 'side.docs.cliInstall.meta': '安装 / 升级 / 卸载',
146
+ 'side.config.codex': 'Codex',
147
+ 'side.config.codex.meta': 'Provider / Model',
148
+ 'side.config.claude': 'Claude Code',
149
+ 'side.config.claude.meta': 'Claude Settings',
150
+ 'side.config.openclaw': 'OpenClaw',
151
+ 'side.config.openclaw.meta': 'JSON5 / AGENTS',
152
+ 'side.sessions.browser': '会话浏览',
153
+ 'side.sessions.browser.meta': '浏览 / 导出 / 清理',
154
+ 'side.plugins.tools': '提示词工具',
155
+ 'side.plugins.tools.meta': '模板 / 变量',
156
+ 'side.system.settings': '运行设置',
157
+ 'side.system.settings.meta': '数据 / 备份',
158
+
159
+ // Header titles
160
+ 'kicker.dashboard': 'Doctor',
161
+ 'kicker.config': 'Configuration',
162
+ 'kicker.sessions': 'Sessions',
163
+ 'kicker.usage': 'Usage',
164
+ 'kicker.orchestration': 'Tasks',
165
+ 'kicker.market': 'Skills',
166
+ 'kicker.plugins': 'Plugins',
167
+ 'kicker.docs': 'Docs',
168
+ 'kicker.settings': 'Settings',
169
+
170
+ 'title.dashboard': 'Dashboard / Doctor',
171
+ 'title.config': '本地配置控制台',
172
+ 'title.sessions': '会话与导出',
173
+ 'title.usage': '本地用量与趋势',
174
+ 'title.orchestration': '任务编排',
175
+ 'title.market': 'Skills 安装与同步',
176
+ 'title.plugins': '插件与模板',
177
+ 'title.docs': 'CLI 安装与文档',
178
+ 'title.settings': '系统与数据设置',
179
+
180
+ 'subtitle.dashboard': '聚合状态与诊断入口。',
181
+ 'subtitle.config': '管理本地配置与模型。',
182
+ 'subtitle.sessions': '浏览与导出会话。',
183
+ 'subtitle.usage': '查看近 7 / 30 天用量。',
184
+ 'subtitle.orchestration': '规划、排队、执行与回看本地任务。',
185
+ 'subtitle.market': '管理本地 Skills。',
186
+ 'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
187
+ 'subtitle.docs': '查看 CLI 安装命令与排障。',
188
+ 'subtitle.settings': '管理下载、目录与回收站。'
189
+ ,
190
+ 'dashboard.doctor.title': 'Doctor',
191
+ 'dashboard.doctor.runChecks': '运行检查',
192
+ 'dashboard.doctor.checking': '检查中...',
193
+ 'dashboard.doctor.export': '导出报告',
194
+ 'dashboard.doctor.export.json': '导出 JSON',
195
+ 'dashboard.doctor.export.md': '导出 Markdown',
196
+ 'dashboard.doctor.open': '打开',
197
+ 'doctor.action.openConfig': '打开 Config',
198
+ 'doctor.action.checkProvider': '检查 Provider 配置',
199
+ 'doctor.action.openUsage': '打开 Usage',
200
+ 'doctor.action.openSessions': '打开 Sessions',
201
+ 'doctor.action.openTasks': '打开 Tasks',
202
+ 'doctor.action.viewTaskLogs': '查看 Tasks / Logs',
203
+ 'doctor.action.openSkills': '打开 Skills',
204
+ 'doctor.issue.configNotReady.problem': '配置文件未就绪',
205
+ 'doctor.issue.configNotReady.impact': '可能导致 provider/model 无法读取,模型列表与请求将不可用。',
206
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider 不可达',
207
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider 鉴权失败',
208
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider 返回 404',
209
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider 返回 HTTP 错误',
210
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider 探测失败',
211
+ 'doctor.issue.providerUnreachable.problem.unknown': 'Provider 不可用',
212
+ 'doctor.issue.providerUnreachable.impactAuth': '鉴权失败会导致模型列表/对话请求返回 401/403。',
213
+ 'doctor.issue.providerUnreachable.impactNetwork': '远端不可达会导致模型列表/对话请求失败或超时。',
214
+ 'doctor.issue.configHealthFailed.problem': '配置健康检查未通过',
215
+ 'doctor.issue.configHealthFailed.impact': '可能导致部分功能不可用或行为不符合预期。',
216
+ 'doctor.issue.usageError.problem': 'Usage 统计异常',
217
+ 'doctor.issue.usageError.impact': 'Usage 页面可能无法展示趋势/汇总,Doctor 的用量诊断也会缺失。',
218
+ 'doctor.issue.usageMissingModel.problem': '部分会话缺少模型信息',
219
+ 'doctor.issue.usageMissingModel.impact': '会导致用量归因与成本估算不准确。',
220
+ 'doctor.issue.tasksError.problem': 'Tasks 状态读取失败',
221
+ 'doctor.issue.tasksError.impact': '可能导致编排队列/运行记录无法展示。',
222
+ 'doctor.issue.tasksFailed.problem': '存在失败的任务运行',
223
+ 'doctor.issue.tasksFailed.impact': '可能导致自动化流水线中断,需要查看日志并重试或修复输入。',
224
+ 'doctor.issue.skillsError.problem': 'Skills 列表读取失败',
225
+ 'doctor.issue.skillsError.impact': '会导致 Skills 页面无法正常展示或安装。',
226
+ 'doctor.issue.skillsRootMissing.problem': 'Skills 目录不存在',
227
+ 'doctor.issue.skillsRootMissing.impact': '会导致 Skills 安装/扫描为空;可在 Settings/Docs 按指引初始化目录。',
228
+ 'doctor.issue.skillsMissingFiles.problem': '存在缺失 skill.json 的技能',
229
+ 'doctor.issue.skillsMissingFiles.impact': '会导致部分技能无法被运行或同步。',
230
+ 'dashboard.card.config': '配置',
231
+ 'dashboard.card.sessions': '会话',
232
+ 'dashboard.card.usage': '用量',
233
+ 'dashboard.card.tasks': '任务',
234
+ 'dashboard.card.skills': 'Skills',
235
+ 'dashboard.kv.model': '模型',
236
+ 'dashboard.kv.issue': '异常',
237
+ 'dashboard.kv.active': '当前',
238
+ 'dashboard.kv.sessions': '会话数',
239
+ 'dashboard.kv.missingModel': '缺失模型',
240
+ 'dashboard.kv.blockers': '阻塞',
241
+ 'dashboard.kv.runs': '运行',
242
+ 'dashboard.kv.target': '目标',
243
+ 'dashboard.kv.root': '目录',
244
+ 'dashboard.status.health': '健康',
245
+ 'dashboard.status.busy': '忙闲',
246
+ 'dashboard.status.models': '模型',
247
+ 'dashboard.busy.init': '初始化',
248
+ 'dashboard.busy.sessions': '会话加载',
249
+ 'dashboard.busy.models': '模型加载',
250
+ 'dashboard.busy.configApply': '配置应用',
251
+ 'dashboard.busy.agents': 'AGENTS 保存',
252
+ 'dashboard.busy.skills': 'Skills 管理',
253
+ 'dashboard.busy.tasks': '任务编排',
254
+ 'dashboard.busy.idle': '空闲',
255
+ 'dashboard.message.none': '暂无提示',
256
+ 'dashboard.sessionSource.codex': 'Codex',
257
+ 'dashboard.sessionSource.claude': 'Claude Code',
258
+ 'dashboard.sessionSource.gemini': 'Gemini CLI',
259
+ 'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
260
+ 'dashboard.sessionSource.all': '全部',
261
+ 'dashboard.sessionPath.all': '全部路径',
262
+ 'dashboard.sessionQuery.unsupported': '当前来源不支持',
263
+ 'dashboard.sessionQuery.unset': '未设置',
264
+ 'dashboard.healthStatus.failRead': '读取失败',
265
+ 'dashboard.healthStatus.initializing': '初始化中',
266
+ 'dashboard.healthStatus.ok': '正常',
267
+ 'dashboard.modelStatus.loading': '加载中',
268
+ 'dashboard.modelStatus.error': '加载异常',
269
+ 'dashboard.modelStatus.ok': '正常',
270
+ 'dashboard.health.ok': '检查通过',
271
+ 'dashboard.health.fail': '检查失败',
272
+ 'dashboard.health.issues': '{count} 条问题',
273
+ 'dashboard.issues.title': '发现 {count} 条可操作问题',
274
+ 'dashboard.state.loading': '加载中',
275
+ 'dashboard.state.ready': '就绪',
276
+ 'dashboard.state.idle': '未加载',
277
+ 'dashboard.none': '',
278
+ 'dashboard.sessions.count': '{count} 条会话',
279
+ 'dashboard.usage.range': '范围 {value}',
280
+ 'dashboard.tasks.queue': 'run {running} / queue {queued}',
281
+ 'dashboard.skills.count': 'installed {installed} / import {importable}',
282
+
283
+ // Plugins panel
284
+ 'plugins.sidebar.title': 'Plugins',
285
+ 'plugins.sidebar.note': '可复用的标准化工具。未来自定义插件应遵循相同结构。',
286
+ 'plugins.sidebar.ariaList': '插件列表',
287
+ 'plugins.main.ariaWorkspace': '插件工作区',
288
+ 'plugins.refresh': '刷新',
289
+ 'plugins.refreshing': '刷新中...',
290
+ 'plugins.promptTemplates.title': '提示词模板',
291
+ 'plugins.promptTemplates.subtitle': '内置:代码注释润色({{code}})。复制后直接粘贴到输入框即可。',
292
+ 'plugins.promptTemplates.mode.aria': '提示词模板模式',
293
+ 'plugins.promptTemplates.mode.compose': '生成',
294
+ 'plugins.promptTemplates.mode.manage': '管理',
295
+ 'plugins.promptTemplates.compose.selectTemplate': '选择模板',
296
+ 'plugins.promptTemplates.compose.chooseTemplate': '选择模板',
297
+ 'plugins.promptTemplates.compose.chooseTemplateHint': '请选择一个模板开始生成。',
298
+ 'plugins.promptTemplates.compose.builtinSuffix': '(内置)',
299
+ 'plugins.promptTemplates.compose.empty': '暂无可用模板。',
300
+ 'plugins.promptTemplates.compose.varsHint': '变量填写与新增请在「管理」中进行。',
301
+ 'plugins.promptTemplates.compose.missingCount': '未填 {count} 项',
302
+ 'plugins.promptTemplates.compose.jumpToMissing': '跳到未填',
303
+ 'plugins.promptTemplates.compose.goManage': '去管理填写变量',
304
+ 'plugins.promptTemplates.compose.outputTitle': '生成结果',
305
+ 'plugins.promptTemplates.compose.outputHint': '点“复制”后直接粘贴到 Codex/Claude 输入框。',
306
+ 'plugins.promptTemplates.compose.outputAria': '生成结果(提示词)',
307
+ 'plugins.promptTemplates.compose.copy': '复制',
308
+ 'plugins.promptTemplates.manage.searchAria': '搜索模板',
309
+ 'plugins.promptTemplates.manage.searchPlaceholder': '搜索模板',
310
+ 'plugins.promptTemplates.manage.create': '新建',
311
+ 'plugins.promptTemplates.manage.export': '导出',
312
+ 'plugins.promptTemplates.manage.import': '导入',
313
+ 'plugins.promptTemplates.manage.loading': '正在加载模板...',
314
+ 'plugins.promptTemplates.manage.empty': '暂无模板。',
315
+ 'plugins.promptTemplates.manage.vars': '{count} vars',
316
+ 'plugins.promptTemplates.manage.builtin': 'built-in',
317
+ 'plugins.promptTemplates.manage.custom': 'custom',
318
+ 'plugins.promptTemplates.manage.newTemplateName': '新模板',
319
+ 'plugins.promptTemplates.editor.selectHint': '请选择一个模板进行编辑。',
320
+ 'plugins.promptTemplates.editor.namePlaceholder': '模板名称',
321
+ 'plugins.promptTemplates.editor.nameAria': '模板名称',
322
+ 'plugins.promptTemplates.editor.duplicate': '复制',
323
+ 'plugins.promptTemplates.editor.delete': '删除',
324
+ 'plugins.promptTemplates.editor.save': '保存',
325
+ 'plugins.promptTemplates.editor.builtinReadOnly': '内置模板为只读,不支持编辑/保存/删除/复制。',
326
+ 'plugins.promptTemplates.editor.descPlaceholder': '描述(可选)',
327
+ 'plugins.promptTemplates.editor.descAria': '模板描述',
328
+ 'plugins.promptTemplates.editor.templateLabel': '模板',
329
+ 'plugins.promptTemplates.editor.templateAria': '模板内容',
330
+ 'plugins.promptTemplates.editor.templatePlaceholder': '在这里编写模板。使用 {{var}} 占位符。',
331
+ 'plugins.promptTemplates.vars.title': '变量',
332
+ 'plugins.promptTemplates.vars.hint': '从模板中检测。填写后可渲染最终提示词。',
333
+ 'plugins.promptTemplates.vars.reset': '重置',
334
+ 'plugins.promptTemplates.vars.empty': '未检测到变量。',
335
+ 'plugins.promptTemplates.vars.valuePlaceholder': '变量值:{name}',
336
+ 'plugins.promptTemplates.preview.title': '预览',
337
+ 'plugins.promptTemplates.preview.hint': '渲染结果(缺失变量会替换为空)。',
338
+ 'plugins.promptTemplates.preview.copy': '复制',
339
+ 'plugins.promptTemplates.preview.outputAria': '渲染结果(提示词)',
340
+ 'plugins.promptTemplates.noPluginSelected': '请先从左侧选择一个插件。',
341
+
342
+ 'plugins.meta.attribution': '创建者:{createdBy} · 维护者:{maintainers}',
343
+ 'plugins.meta.createdBy': '创建者:{createdBy}',
344
+ 'plugins.meta.maintainedBy': '维护者:{maintainers}',
345
+
346
+ // Built-in prompt templates
347
+ 'plugins.builtin.commentPolish.name': '代码注释润色',
348
+ 'plugins.builtin.commentPolish.desc': '轻微收敛以下代码注释 {{code}}',
349
+ 'plugins.builtin.commentPolish.line1': '轻微收敛以下代码注释',
350
+ 'plugins.builtin.ruleAck.name': '规则确认回复',
351
+ 'plugins.builtin.ruleAck.desc': '请根据【{{rule}}】,收到请回复',
352
+ 'plugins.builtin.ruleAck.line1': '请根据【{{rule}}】,收到请回复',
353
+
354
+ // Toasts
355
+ 'toast.copy.empty': '没有可复制内容',
356
+ 'toast.copy.ok': '已复制',
357
+ 'toast.copy.fail': '复制失败',
358
+ 'toast.save.ok': '已保存',
359
+ 'toast.save.fail': '保存失败',
360
+ 'toast.delete.ok': '已删除',
361
+ 'toast.delete.fail': '删除失败',
362
+ 'toast.export.empty': '没有可导出内容',
363
+ 'toast.export.ok': '已导出',
364
+ 'toast.export.fail': '导出失败',
365
+ 'toast.import.ok': '导入成功',
366
+ 'toast.import.fail': '导入失败',
367
+ 'toast.import.notAvailable': '导入不可用',
368
+ 'toast.import.readFileFail': '读取文件失败',
369
+ 'toast.import.invalidJson': 'JSON 无效',
370
+ 'toast.import.expectedArray': 'JSON 必须为数组',
371
+ 'toast.export.notSupported': '当前不支持导出',
372
+ 'toast.plugins.loadFail': '加载 Plugins 失败',
373
+ 'toast.templates.builtinNotEditable': '内置模板不可编辑',
374
+ 'toast.templates.builtinNotModifiable': '内置模板不可修改,请先复制再编辑',
375
+ 'toast.templates.nameRequired': '模板名称不能为空',
376
+ 'toast.templates.builtinNotDuplicable': '内置模板不可复制',
377
+ 'toast.templates.builtinNotDeletable': '内置模板不可删除',
378
+ 'toast.templates.deleteTitle': '删除模板',
379
+ 'toast.templates.deleteMessage': '删除“{name}”?此操作无法撤销。',
380
+ 'toast.templates.deleteConfirm': '删除',
381
+ 'toast.templates.deleteCancel': '取消',
382
+
383
+ // Basic modals
384
+ 'modal.providerAdd.title': '添加提供商',
385
+ 'modal.providerEdit.title': '编辑提供商',
386
+ 'modal.modelAdd.title': '添加模型',
387
+ 'modal.modelManage.title': '管理模型',
388
+ 'modal.claudeConfigAdd.title': '添加 Claude Code 配置',
389
+ 'modal.claudeConfigEdit.title': '编辑 Claude Code 配置',
390
+ 'field.useBuiltinTransform': '使用内建转换(兼容 OpenAI 格式)',
391
+ 'hint.useBuiltinTransform': '开启后:写入的 base_url 会指向 codexmate 内建转换服务;Codex 使用的令牌固定为 codexmate。',
392
+
393
+ // Config template / agents modals
394
+ 'modal.configTemplate.title': 'Config 模板编辑器(手动确认应用)',
395
+ 'modal.configTemplate.label': 'config.toml 模板',
396
+ 'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
397
+ 'modal.configTemplate.mode.twoStep': '两步确认:先预览差异,再应用写入。',
398
+ 'modal.configTemplate.mode.oneStep': '一步应用:点击“应用”直接写入。',
399
+ 'diff.title.configTemplate': '差异预览(config.toml)',
400
+ 'diff.generating': '生成中...',
401
+ 'diff.failed': '生成失败',
402
+ 'diff.noChanges': '未检测到改动',
403
+ 'diff.hint.busy': '正在生成差异或应用中,操作暂不可用。',
404
+ 'diff.hint.failedBack': '差异预览失败,请返回编辑后重试。',
405
+ 'diff.hint.noChangesBack': '未检测到改动,可返回编辑继续修改或取消退出。',
406
+ 'diff.hint.previewMode': '当前为预览模式,可点击“应用”写入或“返回编辑”继续修改。',
407
+
408
+ 'modal.agents.export': '导出',
409
+ 'modal.agents.copy': '复制',
410
+ 'modal.agents.title': 'AGENTS.md 编辑器',
411
+ 'modal.agents.hint': '保存后会写入目标 AGENTS.md(与 config.toml 同级)。',
412
+ 'modal.agents.targetFile': '目标文件',
413
+ 'modal.agents.contentLabel': 'AGENTS.md 内容',
414
+ 'modal.agents.placeholder': '在这里编辑 AGENTS.md 内容',
415
+ 'modal.agents.unsaved.previewModeHint': '预览模式:当前改动尚未保存,只有点击“应用”后才会写入文件。',
416
+ 'modal.agents.unsaved.detectedHint': '检测到未保存改动:关闭页面或应用前请先保存。',
417
+ 'modal.agents.hint.shortcuts': '快捷键:Esc(差异预览时返回编辑,编辑时关闭窗口)。',
418
+ 'modal.agents.hint.twoStepSave': '保存需两步:先点击“确认”预览差异,再点击“应用”保存。',
419
+ 'diff.tooLargeSkip': '内容过大,已跳过逐行差异预览',
420
+ 'diff.viewHint.preview': '当前为预览模式,可点击“应用”保存或“返回编辑”继续修改。',
421
+ 'diff.viewHint.truncated': '内容过大,已跳过预览,可点击“应用”保存或“返回编辑”继续修改。',
422
+
423
+ // Skills modal
424
+ 'modal.skills.title': 'Skills 管理',
425
+ 'modal.skills.subtitle': '管理当前宿主的本地 Skills。',
426
+ 'modal.skills.target.aria': '选择 Skills 管理目标',
427
+ 'modal.skills.rootDir': 'Skills 目录({label})',
428
+ 'modal.skills.summary.target': '安装目标',
429
+ 'modal.skills.summary.total': '本地总数',
430
+ 'modal.skills.summary.withSkill': '含 SKILL.md',
431
+ 'modal.skills.summary.missingSkill': '缺少 SKILL.md',
432
+ 'modal.skills.summary.importable': '可导入',
433
+ 'modal.skills.panel.aria': 'Skills 管理面板',
434
+ 'modal.skills.local.title': '本地 Skills',
435
+ 'modal.skills.local.note': '可检索、筛选与批量删除。',
436
+ 'modal.skills.filter.keywordAria': '按名称或描述筛选 skill',
437
+ 'modal.skills.filter.keywordPlaceholder': '按目录名/显示名/描述检索',
438
+ 'modal.skills.filter.statusAria': ' SKILL.md 状态筛选 skill',
439
+ 'modal.skills.filter.status.all': '全部状态',
440
+ 'modal.skills.filter.status.withSkill': '仅含 SKILL.md',
441
+ 'modal.skills.filter.status.missingSkill': '仅缺少 SKILL.md',
442
+ 'modal.skills.selection.stats': '已选 {selected}(筛选命中 {filtered} / {total},筛选内已选 {visibleSelected})',
443
+ 'modal.skills.empty.local': '暂无可管理的 skill。',
444
+ 'modal.skills.empty.filtered': '当前筛选条件下没有匹配的 skill。',
445
+ 'modal.skills.pill.hasSkillFile': ' SKILL.md',
446
+ 'modal.skills.pill.missingSkillFile': '缺少 SKILL.md',
447
+ 'modal.skills.pill.symlink': '符号链接',
448
+ 'modal.skills.pill.dir': '目录',
449
+ 'modal.skills.import.title': '跨应用导入',
450
+ 'modal.skills.import.note': '扫描并导入到当前 {label}。',
451
+ 'modal.skills.import.scan': '扫描可导入',
452
+ 'modal.skills.import.stats': '已选 {selected} / {total},含 SKILL.md {configured},缺失 {missing}',
453
+ 'modal.skills.import.emptyHint': '暂无可导入 skill,点击“扫描可导入”。',
454
+ 'modal.skills.bulk.title': '批量操作',
455
+ 'modal.skills.bulk.note': '右侧为导入操作,左侧为本地选择。',
456
+ 'modal.skills.actions.zipImport': '导入 ZIP',
457
+ 'modal.skills.actions.zipImporting': 'ZIP 导入中...',
458
+ 'modal.skills.actions.exportSelected': '导出选中',
459
+ 'modal.skills.actions.exporting': '导出中...',
460
+ 'modal.skills.actions.importSelected': '导入选中',
461
+ 'modal.skills.actions.importing': '导入中...',
462
+ 'modal.skills.actions.deleteSelected': '删除选中',
463
+ 'modal.skills.actions.deleting': '删除中...',
464
+
465
+ // OpenClaw config modal (quick)
466
+ 'placeholder.openclawConfigNameExample': '例如: 默认配置',
467
+ 'modal.openclaw.loadCurrent': '加载当前配置',
468
+ 'modal.openclaw.quick.title': '新手快速配置',
469
+ 'modal.openclaw.quick.subtitle': '按 3 步完成:填 Provider 和模型,写入编辑器,保存并应用。',
470
+ 'modal.openclaw.quick.readFromEditor': '从编辑器读取',
471
+ 'modal.openclaw.quick.step1': '填写 Provider 与模型',
472
+ 'modal.openclaw.quick.step2': '点击写入编辑器',
473
+ 'modal.openclaw.quick.step3': '保存并应用',
474
+ 'modal.openclaw.quick.providerHint': '会拼成 provider/model 作为主模型标识。',
475
+ 'modal.openclaw.quick.baseUrlHintDefault': '已按 OpenClaw 内建 provider 默认值回填,可直接修改。',
476
+ 'modal.openclaw.quick.baseUrlHintReadonly': '检测到外部引用,快速表单中只读显示;如需修改请使用原文编辑。',
477
+ 'modal.openclaw.quick.apiKeyHintFromAuth': '当前值来自 OpenClaw 外部认证配置;修改后在“保存并应用”时会回写对应 auth profile。',
478
+ 'modal.openclaw.quick.apiKeyHintReadonly': '检测到外部认证或引用,快速表单中只读显示;如需修改请使用原文编辑或对应认证配置。',
479
+ 'modal.openclaw.quick.apiKeyHintKeep': '留空表示不覆盖现有 key。',
480
+ 'placeholder.apiTypeExample': '例如: openai-responses',
481
+ 'modal.openclaw.quick.modelTitle': '模型',
482
+ 'placeholder.modelIdExample': '例如: gpt-4.1',
483
+ 'placeholder.modelNameOptional': '留空则使用模型 ID',
484
+ 'field.contextWindow': '上下文长度',
485
+ 'field.maxOutput': '最大输出',
486
+ 'hint.emptyNoChange': '留空表示不改动已有配置。',
487
+ 'modal.openclaw.quick.optionsTitle': '选项',
488
+ 'modal.openclaw.quick.setPrimary': '设为主模型',
489
+ 'modal.openclaw.quick.overrideProvider': '覆盖同名 Provider 基础信息',
490
+ 'modal.openclaw.quick.overrideModels': '覆盖同名模型列表',
491
+ 'modal.openclaw.quick.optionsHint': '关闭覆盖会只补空缺字段。',
492
+ 'modal.openclaw.quick.writeToEditor': '写入编辑器',
493
+
494
+ // Docs panel
495
+ 'docs.title': 'CLI 安装文档',
496
+ 'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI 命令。',
497
+ 'docs.section.commands': '安装命令',
498
+ 'docs.section.commandsNote': '命令可直接复制。',
499
+ 'docs.section.faq': '常见问题',
500
+ 'docs.section.faqNote': '常见问题见下。',
501
+ 'docs.command.aria': '{name} 命令',
502
+ 'docs.registryHintPrefix': '命令将附加:',
503
+ 'docs.registryHintCustom': '请输入完整 URL(含 http/https),将自动附加到命令。',
504
+ 'docs.registry.tencent': '腾讯云',
505
+ 'docs.meta.bin': 'bin: {bin}',
506
+ 'docs.termuxLabel': 'Termux',
507
+ 'docs.termuxAria': 'Termux Codex CLI command',
508
+ 'docs.rule.1': '命令按当前包管理器、镜像与操作生成。',
509
+ 'docs.rule.2': '自定义镜像仅用于安装与升级。'
510
+ ,
511
+ 'docs.tip.win.1': 'PowerShell 报权限不足(EACCES/EPERM)时,请以管理员身份执行安装命令。',
512
+ 'docs.tip.win.2': '安装后若仍提示找不到命令,重开终端并执行:where codex / where claude / where gemini / where codebuddy。',
513
+ 'docs.tip.win.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。',
514
+ 'docs.tip.unix.1': '出现 EACCES 权限错误时,优先修复 Node 全局目录权限,不建议直接 sudo npm。',
515
+ 'docs.tip.unix.2': '安装后若命令未生效,重开终端并执行:which codex / which claude / which gemini / which codebuddy。',
516
+ 'docs.tip.unix.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。'
517
+ ,
518
+
519
+ // Sessions panel
520
+ 'sessions.loading': '加载中...',
521
+ 'sessions.sourceTitle': '会话来源',
522
+ 'sessions.refresh': '刷新会话',
523
+ 'sessions.refreshing': '刷新中...',
524
+ 'sessions.allPaths': '全部路径',
525
+ 'sessions.source.codex': 'Codex',
526
+ 'sessions.source.claudeCode': 'Claude Code',
527
+ 'sessions.source.gemini': 'Gemini CLI',
528
+ 'sessions.source.codebuddy': 'CodeBuddy Code',
529
+ 'sessions.loadingList': '会话加载中...',
530
+ 'sessions.empty': '暂无可用会话记录',
531
+ 'sessions.unknownTime': '未知时间',
532
+ 'sessions.query.placeholder.enabled': '关键词检索(支持 Codex/Claude/Gemini/CodeBuddy,例:claude code)',
533
+ 'sessions.query.placeholder.disabled': '当前来源暂不支持关键词检索',
534
+ 'sessions.pin': '置顶',
535
+ 'sessions.unpin': '取消置顶',
536
+ 'sessions.copyResume': '复制恢复命令',
537
+ 'sessions.preview.refresh': '刷新内容',
538
+ 'sessions.preview.loading': '加载中...',
539
+ 'sessions.preview.deleteHard': '直接删除',
540
+ 'sessions.preview.moveToTrash': '移入回收站',
541
+ 'sessions.preview.deleting': '删除中...',
542
+ 'sessions.preview.moving': '移入中...',
543
+ 'sessions.preview.export': '导出记录',
544
+ 'sessions.preview.exporting': '导出中...',
545
+ 'sessions.preview.convert': '生成派生会话',
546
+ 'sessions.preview.converting': '生成中...',
547
+ 'sessions.preview.convert.loadedOnly': '仅转换已加载消息',
548
+ 'sessions.preview.openStandalone': '新页查看',
549
+ 'sessions.preview.loadingBody': '正在加载会话内容...',
550
+ 'sessions.preview.emptyMsgs': '当前会话暂无可展示消息',
551
+ 'sessions.preview.rendering': '正在渲染会话内容...',
552
+ 'sessions.preview.rerender': '重新渲染',
553
+ 'sessions.preview.preparing': '正在准备会话内容...',
554
+ 'sessions.preview.clipped': '仅展示最近 {count} 条消息。',
555
+ 'sessions.preview.shownCount': '已显示 {shown} / {total} 条',
556
+ 'sessions.preview.loadMore': '加载更多(剩余 {remain})',
557
+ 'sessions.preview.loadingMore': '正在加载更早消息...'
558
+ ,
559
+ 'sessions.timeline.aria': '会话时间轴',
560
+ 'sessions.selectHint': '请先在左侧选择一个会话',
561
+ 'sessions.role.all': '全部角色',
562
+ 'sessions.role.user': '仅 User',
563
+ 'sessions.role.assistant': '仅 Assistant',
564
+ 'sessions.role.system': '仅 System',
565
+ 'sessions.time.all': '全部时间',
566
+ 'sessions.time.7d': ' 7 ',
567
+ 'sessions.time.30d': ' 30 ',
568
+ 'sessions.time.90d': ' 90 天'
569
+ ,
570
+ 'sessions.sort.time': '按时间',
571
+ 'sessions.sort.hot': '按热度',
572
+ 'sessions.sort.hotBadge': ''
573
+ ,
574
+ 'sessions.filters.copyLink': '复制筛选链接',
575
+ 'sessions.filters.urlBuildFail': '无法生成链接',
576
+ 'sessions.filters.source': '来源',
577
+ 'sessions.filters.path': '路径',
578
+ 'sessions.filters.keyword': '关键词',
579
+ 'sessions.filters.role': '角色',
580
+ 'sessions.filters.time': '时间',
581
+ 'sessions.roleLabel.user': 'User',
582
+ 'sessions.roleLabel.system': 'System',
583
+ 'sessions.roleLabel.assistant': 'Assistant'
584
+ ,
585
+
586
+ // Usage panel
587
+ 'usage.overview': 'Usage 概览',
588
+ 'usage.range.aria': 'Usage 时间范围',
589
+ 'usage.range.7d': '近 7 天',
590
+ 'usage.range.30d': '近 30 天',
591
+ 'usage.range.all': '全部',
592
+ 'usage.compare.toggle': '对比上周期',
593
+ 'usage.compare.prev': '上周期',
594
+ 'usage.compare.delta': '变化',
595
+ 'usage.refresh': '刷新统计',
596
+ 'usage.refreshing': '刷新中...',
597
+ 'usage.loading': '正在加载 Usage 统计...',
598
+ 'usage.empty': '暂无可用于统计的会话数据',
599
+ 'usage.refreshOverlay': '正在刷新…',
600
+ 'usage.copyTitle': '点击复制:{value}',
601
+ 'usage.copySuccess': '已复制:{label}',
602
+ 'usage.copyFail': '复制失败',
603
+ 'usage.copyNone': '没有可复制内容',
604
+ 'usage.daily.title': '每天消耗',
605
+ 'usage.daily.subtitle': '按天汇总 token 与预估费用(费用各自按最大值归一显示)。',
606
+ 'usage.daily.note': '说明:预估费用默认不含 Claude;仅在可匹配模型单价且会话记录 input/output token 时计算。',
607
+ 'usage.heatmap.title': '活动热力图',
608
+ 'usage.heatmap.subtitle': '按每天会话数聚合,支持 hover 查看详细数据。',
609
+ 'usage.heatmap.legend.less': '',
610
+ 'usage.heatmap.legend.more': '',
611
+ 'usage.heatmap.tooltip': '{date} · {sessions} 会话 · {messages} 消息 · {tokens} token',
612
+ 'usage.heatmap.aria': '{date},{sessions} 会话',
613
+ 'usage.hourlyHeatmap.title': '7×24 活跃热力图',
614
+ 'usage.hourlyHeatmap.subtitle': '按星期 × 小时聚合会话分布,深色 = 高活跃。',
615
+ 'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} 会话 · {messages} 消息 · {tokens} token',
616
+ 'usage.hourlyHeatmap.legend.less': '',
617
+ 'usage.hourlyHeatmap.legend.more': '',
618
+ 'usage.legend.tokens': 'Token',
619
+ 'usage.legend.cost': '预估费用',
620
+ 'usage.table.date': '日期',
621
+ 'usage.table.sessions': '会话',
622
+ 'usage.table.messages': '消息',
623
+ 'usage.table.tokens': 'Token',
624
+ 'usage.table.cost': '预估费用',
625
+ 'usage.trend.sessions': '会话趋势',
626
+ 'usage.trend.messages': '消息趋势',
627
+ 'usage.trend.activeHours': '活跃时段',
628
+ 'usage.trend.sources': '来源洞察',
629
+ 'usage.legend.codex': 'Codex',
630
+ 'usage.legend.claude': 'Claude',
631
+ 'usage.trend.sessions.codexTitle': 'Codex {count}',
632
+ 'usage.trend.sessions.claudeTitle': 'Claude {count}',
633
+ 'usage.trend.messages.barTitle': '{count} 条消息',
634
+ 'usage.hour.title': '{hour}:00 · {count} 次会话',
635
+ 'usage.source.row': '{sessions} 会话 · {messages} 消息 · 均值 {avg}',
636
+ 'usage.summary.sessions': '总会话数',
637
+ 'usage.summary.messages': '总消息数',
638
+ 'usage.summary.tokens': '总 Token 数',
639
+ 'usage.summary.contextWindow': '总上下文数',
640
+ 'usage.summary.estimatedCost': '预估费用 · {range}',
641
+ 'usage.estimatedCost.note.excludesClaudePrefix': '暂不含 Claude,',
642
+ 'usage.estimatedCost.method.configured': '按已配置单价估算',
643
+ 'usage.estimatedCost.method.catalog': '按公开模型目录估算',
644
+ 'usage.estimatedCost.method.configuredAndCatalog': '按已配置单价 + 公开模型目录估算',
645
+ 'usage.estimatedCost.detail.estimate': '{prefix}{method},估算 {estimate},覆盖 {covered}/{total} 个会话,约 {percent}% token',
646
+ 'usage.estimatedCost.detail.missing': '{prefix}缺少可匹配的模型单价或 token 拆分。请先补 models.cost,或确认会话已记录 input/output token。',
647
+ 'usage.summary.activeDuration': '活跃时长',
648
+ 'usage.summary.activeDuration.title': '累计会话跨度 {value}',
649
+ 'usage.summary.totalDuration': '总时长',
650
+ 'usage.summary.totalDuration.title': '整体时间跨度 {value}',
651
+ 'usage.summary.activeDays': '活跃天数',
652
+ 'usage.summary.avgMessagesPerSession': '平均每会话消息',
653
+ 'usage.summary.busiestDay': '最忙日',
654
+ 'usage.summary.busiestHour': '高峰时段',
655
+ 'usage.currentSession.title': '当前会话',
656
+ 'usage.currentSession.apiDuration': 'API时长',
657
+ 'usage.currentSession.totalDuration': '总时长',
658
+ 'usage.currentSession.tokens': 'Token',
659
+ 'usage.range.kicker.all': '全部',
660
+ 'usage.range.kicker.30d': ' 30 天',
661
+ 'usage.range.kicker.7d': '近 7 天',
662
+ 'usage.copyTokenDay': '已复制:Token({day}',
663
+ 'usage.copyCostDay': '已复制:预估费用({day})'
664
+ ,
665
+ 'usage.dayDetail.title': '{day} 详情',
666
+ 'usage.dayDetail.subtitle': '选择日期可快速查看当天构成。',
667
+ 'usage.dayDetail.pick': '选择日期',
668
+ 'usage.dayDetail.empty': '请选择一个日期以查看当天构成。',
669
+ 'usage.dayDetail.clear': '清除',
670
+ 'usage.dayDetail.topSessions': 'Top 会话',
671
+ 'usage.dayDetail.topModels': 'Top 模型'
672
+ ,
673
+ 'usage.models.title': '使用模型',
674
+ 'usage.models.subtitle': '只列真实落盘的 model 名。',
675
+ 'usage.models.kicker': '已识别 {modeled}/{total}',
676
+ 'usage.models.count': '模型数',
677
+ 'usage.models.coverage': '会话覆盖率',
678
+ 'usage.models.missing': '缺 model',
679
+ 'usage.models.noneTitle': '当前范围没读到模型名',
680
+ 'usage.models.noneBody': '已扫描 {total} 个会话,但原始记录里没有可识别的 model 字段。',
681
+ 'usage.models.providerOnly': '其中 {count} 个旧会话只写了 provider。',
682
+ 'usage.models.missingNote.providerOnly': '另有 {count} 个会话没写模型名,未计入列表。',
683
+ 'usage.models.missingNote': '另有 {count} 个会话缺少 model,未计入列表。',
684
+ 'usage.models.missingListTitle': '仍缺模型名的会话',
685
+ 'usage.models.chipTitle': '{model} · {sessions} 会话 · {messages} 消息{tokens}',
686
+ 'usage.models.meta': '{sessions} 会话 · {messages} 消息{tokens}',
687
+ 'usage.weekday.title': '工作日分布',
688
+ 'usage.paths.title': '高频路径',
689
+ 'usage.paths.empty': '暂无路径数据',
690
+ 'usage.paths.count': '{count} ',
691
+ 'usage.paths.meta': '{messages} 消息{recent}',
692
+ 'usage.paths.recent': ' · 最近 {label}',
693
+ 'usage.recent.title': '近期活跃会话',
694
+ 'usage.sessions.empty': '暂无会话数据',
695
+ 'usage.sessions.messages': '{count} 消息',
696
+ 'usage.sessions.topDensity': '消息密度最高'
697
+ ,
698
+
699
+ // Config panel (Codex)
700
+ 'config.addProvider': '新增提供商',
701
+ 'config.providerTemplate.title': '预设供应商',
702
+ 'config.models': '模型',
703
+ 'config.modelLoading': '加载中...',
704
+ 'config.models.unlimited': '当前无模型列表,可手填。',
705
+ 'config.models.error': '模型列表获取失败,可手填。',
706
+ 'config.models.notInList.codex': '当前模型不在列表,可手填或改模板。',
707
+ 'config.models.notInList.other': '当前模型不在列表,可手填。',
708
+ 'config.template.editFirst': '先改模板,再应用。',
709
+ 'config.template.bridgeCodexOnly': '{hint} 模板仅限 Codex 编辑。',
710
+ 'config.template.openEditor': '打开模板编辑器',
711
+ 'modal.configTemplate.title': 'Config 模板编辑器(手动确认应用)',
712
+ 'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
713
+ 'config.serviceTier': '服务档',
714
+ 'config.serviceTier.fast': 'fast(默认)',
715
+ 'config.serviceTier.standard': 'standard',
716
+ 'config.serviceTier.hint': '仅 fast 写入 {field}。',
717
+ 'config.reasoningEffort': '推理强度',
718
+ 'config.reasoningEffort.medium': 'medium(默认)',
719
+ 'config.reasoningEffort.hint': '控制推理深度;high 更深。',
720
+ 'config.contextBudget': '压缩阈值',
721
+ 'config.reset': '重置',
722
+ 'config.example': '例如: {value}',
723
+ 'config.contextWindow.hint': '上下文上限,默认 190000。',
724
+ 'config.autoCompact.hint': '自动压缩阈值,默认 185000。',
725
+ 'config.agents.open': '打开 AGENTS.md',
726
+ 'modal.agents.title.default': 'AGENTS.md 编辑器',
727
+ 'modal.agents.title.claudeMd': 'CLAUDE.md 编辑器',
728
+ 'modal.agents.title.openclaw': 'OpenClaw AGENTS.md 编辑器',
729
+ 'modal.agents.hint.default': '保存后会写入目标 AGENTS.md(与 config.toml 同级)。',
730
+ 'modal.agents.hint.claudeMd': '保存后会写入 ~/.claude/CLAUDE.md。',
731
+ 'modal.agents.contentLabel.claudeMd': 'CLAUDE.md 内容',
732
+ 'modal.agents.placeholder.claudeMd': '在这里编辑 CLAUDE.md 内容',
733
+ 'modal.agents.hint.openclaw': '保存后会写入 OpenClaw Workspace 下的 AGENTS.md。',
734
+ 'modal.agents.title.openclawWorkspaceFile': 'OpenClaw 工作区文件: {fileName}',
735
+ 'modal.agents.hint.openclawWorkspaceFile': '保存后会写入 OpenClaw Workspace 下的 {fileName}。',
736
+ 'config.url.unset': '未设 URL',
737
+ 'config.model.unset': '未设置模型',
738
+ 'config.badge.system': '系统',
739
+ 'config.availabilityTest': '可用性测试',
740
+ 'config.availabilityTestAria': '测试 {name} 可用性',
741
+ 'config.health.title': '配置健康检查',
742
+ 'config.health.run': '运行检查',
743
+ 'config.health.running': '检查中...',
744
+ 'config.health.hint': '会批量探测所有提供商可用性,并刷新延迟显示。',
745
+ 'config.health.progress': '已完成 {done}/{total} · 失败 {failed}',
746
+ 'config.health.ok': '检查通过',
747
+ 'config.health.fail': '检查未通过',
748
+ 'config.health.issues': '{count} 项问题',
749
+ 'config.shareCommand': '分享命令',
750
+ 'config.shareDisabled': '不可分享'
751
+ ,
752
+ 'config.shareCommand.aria': '分享导入命令',
753
+ 'config.provider.edit.aria': '编辑提供商:{name}',
754
+ 'config.provider.delete.aria': '删除提供商:{name}',
755
+ 'app.loadingConfig': '加载配置中...'
756
+ ,
757
+ 'common.current': '当前 {value}',
758
+ 'common.notSelected': '未选择',
759
+ 'common.readFromEditor': '从编辑器读取',
760
+ 'common.writeToEditor': '写入编辑器',
761
+ 'sessions.sourceLabel': '来源:{value}',
762
+ 'usage.rangeLabel': '范围:{value}',
763
+ 'sessions.source.all': '全部',
764
+ 'usage.range.all': '全部',
765
+ 'usage.range.7d.short': '近 7 天',
766
+ 'usage.range.30d.short': '近 30 天',
767
+ 'orchestration.queueStats': '队列 {running} 运行中 · {queued} 等待中',
768
+ 'orchestration.hero.kicker': '任务编排',
769
+ 'orchestration.hero.title': '把需求拆成可执行步骤',
770
+ 'orchestration.hero.subtitle': '先写目标,再预览计划,再执行。',
771
+ 'orchestration.draft.reset': '重置草稿',
772
+ 'orchestration.summary.aria': '任务编排概览',
773
+ 'orchestration.summary.running': '运行中',
774
+ 'orchestration.summary.queued': '排队中',
775
+ 'orchestration.summary.runs': '运行记录',
776
+ 'orchestration.step1.title': '先把结果写清楚',
777
+ 'orchestration.step1.subtitle': '只写会影响执行的内容。',
778
+ 'orchestration.templates.title': '快捷示例',
779
+ 'orchestration.templates.reviewFix.label': '修 review + 回归',
780
+ 'orchestration.templates.reviewFix.target': '修复当前 PR review 评论,并补对应回归测试',
781
+ 'orchestration.templates.reviewFix.notes': '不要改动无关模块;需要给出验证结果',
782
+ 'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
783
+ 'orchestration.templates.planOnly.label': '只做排查规划',
784
+ 'orchestration.templates.planOnly.target': '先排查问题根因并给出执行计划,不直接修改代码',
785
+ 'orchestration.templates.planOnly.notes': '优先定位根因、影响范围和风险点',
786
+ 'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
787
+ 'orchestration.templates.workflowBatch.target': '用 Workflow 跑一组固定检查并整理结果',
788
+ 'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
789
+ 'orchestration.templates.workflowBatch.notes': '输出统一结论,避免重复描述',
790
+ 'orchestration.fields.target': '目标',
791
+ 'orchestration.fields.target.placeholder': '例如:修复当前 PR review 评论,并补对应回归测试;不要改无关模块',
792
+ 'orchestration.fields.target.hint': '一句话写清结果、边界和验收标准就够了。',
793
+ 'orchestration.engine.codex': 'Codex',
794
+ 'orchestration.engine.workflow': 'Workflow',
795
+ 'orchestration.runMode.write': '写入',
796
+ 'orchestration.runMode.readOnly': '只读',
797
+ 'orchestration.runMode.dryRun': '仅预演',
798
+ 'orchestration.pills.hasTitle': '标题已设',
799
+ 'orchestration.pills.workflowCount': 'Workflow {count}',
800
+ 'orchestration.pills.planNodes': '计划 {count} 节点',
801
+ 'orchestration.step2.title': '选择执行方式',
802
+ 'orchestration.step2.subtitle': '常用项默认展开,其余放高级设置。',
803
+ 'orchestration.fields.engine': '引擎',
804
+ 'orchestration.fields.runMode': '运行模式',
805
+ 'orchestration.advanced.title': '高级设置',
806
+ 'orchestration.fields.title': '标题',
807
+ 'orchestration.fields.title.placeholder': '可选,默认从目标自动提取',
808
+ 'orchestration.fields.notes': '说明',
809
+ 'orchestration.fields.notes.placeholder': '例如:不要重写现有架构,只做增量实现',
810
+ 'orchestration.fields.notes.hint': '补边界、禁区、风格要求或验证要求。',
811
+ 'orchestration.fields.followUps': '后续动作(每行一条)',
812
+ 'orchestration.fields.followUps.placeholder': '例如:\n继续处理 review 评论\n最后补回归测试',
813
+ 'orchestration.fields.concurrency': '并发',
814
+ 'orchestration.fields.concurrency.hint': '复杂任务先从 1~2 开始更稳。',
815
+ 'orchestration.fields.autoFixRounds': '自动修复',
816
+ 'orchestration.fields.autoFixRounds.hint': '失败后自动再试几轮。',
817
+ 'orchestration.fields.workflowIds': 'Workflow ID(每行一条)',
818
+ 'orchestration.fields.workflowIds.placeholder': '例如:\ndiagnose-config\nsafe-provider-switch',
819
+ 'orchestration.fields.workflowIds.hint': '仅 Workflow 模式需要。当前本地可用 {count} 个。',
820
+ 'orchestration.workflow.stepCount': '{count} 步',
821
+ 'orchestration.step3.title': '先预览,再执行',
822
+ 'orchestration.step3.subtitle': '先确认计划,再决定立即执行还是入队。',
823
+ 'orchestration.actions.planning': '规划中...',
824
+ 'orchestration.actions.previewOnly': '仅预览',
825
+ 'orchestration.actions.preparing': '准备中...',
826
+ 'orchestration.actions.generatePlan': '生成计划',
827
+ 'orchestration.actions.planAndRun': '计划并执行',
828
+ 'orchestration.actions.processing': '处理中...',
829
+ 'orchestration.actions.queueAndStart': '入队并开始',
830
+ 'orchestration.actions.caption': '“计划并执行”会在必要时自动刷新计划;批量任务用“入队并开始”。',
831
+ 'orchestration.stage.title': '有内容时再展开工作区',
832
+ 'orchestration.stage.subtitle': '先写目标,再预览计划。',
833
+ 'orchestration.stage.pill.target': '写目标',
834
+ 'orchestration.stage.pill.preview': '预览',
835
+ 'orchestration.stage.pill.run': '执行或入队',
836
+ 'orchestration.plan.title': '计划预览',
837
+ 'orchestration.plan.subtitle': '先确认节点、波次和依赖。',
838
+ 'orchestration.plan.summary.nodes': '节点数',
839
+ 'orchestration.plan.summary.waves': '波次',
840
+ 'orchestration.plan.summary.engine': '引擎',
841
+ 'orchestration.plan.node.write': 'write',
842
+ 'orchestration.plan.node.readOnly': 'read-only',
843
+ 'orchestration.labels.dependencies': '依赖:',
844
+ 'orchestration.labels.error': '错误:',
845
+ 'orchestration.workbench.title': '执行工作台',
846
+ 'orchestration.workbench.subtitle': '有内容时才展开。',
847
+ 'orchestration.queue.start': '开始队列',
848
+ 'orchestration.queue.starting': '启动中...',
849
+ 'orchestration.workbench.tabs.aria': '任务编排工作台视图',
850
+ 'orchestration.workbench.tabs.queue': '队列 {count}',
851
+ 'orchestration.workbench.tabs.runs': '运行记录 {count}',
852
+ 'orchestration.workbench.tabs.detail': '运行详情',
853
+ 'orchestration.queue.empty.title': '当前没有排队任务',
854
+ 'orchestration.queue.empty.subtitle': '批量任务可先入队,再启动队列。',
855
+ 'orchestration.runs.empty.title': '还没有运行记录',
856
+ 'orchestration.runs.empty.subtitle': '执行后会显示最近运行记录。',
857
+ 'orchestration.detail.refresh': '刷新详情',
858
+ 'orchestration.detail.retry': '重试',
859
+ 'orchestration.detail.retrying': '重试中...',
860
+ 'orchestration.detail.empty.title': '选择一条运行记录查看详情',
861
+ 'orchestration.detail.empty.subtitle': '这里会显示节点状态、摘要和日志。',
862
+ 'orchestration.detail.summary.status': '状态',
863
+ 'orchestration.detail.summary.duration': '耗时',
864
+ 'orchestration.detail.summary.nodes': '节点数',
865
+ 'orchestration.detail.summary.summary': '摘要',
866
+ 'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
867
+ 'skills.localLabel': '{target} / 本地 Skills',
868
+ 'skills.counts': '已装 {installed} · 可导入 {importable}',
869
+
870
+ // Sidebar status labels (compact)
871
+ 'status.currentSource': '当前来源',
872
+ 'status.sessionCount': '会话数',
873
+ 'status.range': '统计范围',
874
+ 'status.totalSessions': '总会话数',
875
+ 'status.totalMessages': '总消息数',
876
+ 'status.engine': '引擎',
877
+ 'status.concurrency': '并发度',
878
+ 'status.running': '运行中',
879
+ 'status.queued': '排队中',
880
+ 'status.runs': '历史 Runs',
881
+ 'status.currentTarget': '当前目标',
882
+ 'status.localSkills': '本地 Skills',
883
+ 'status.importable': '可导入',
884
+ 'status.importableDirect': '可直接导入',
885
+ 'status.pm': '包管理器',
886
+ 'status.action': '当前操作',
887
+ 'status.registry': '镜像',
888
+ 'status.claudeConfig': 'Claude 配置',
889
+ 'status.claudeModel': 'Claude 模型',
890
+ 'status.openclawConfig': 'OpenClaw 配置',
891
+ 'status.workspaceFile': '工作区文件',
892
+ 'status.configMode': '配置模式',
893
+ 'status.currentProvider': '当前 Provider',
894
+ 'status.currentModel': '当前模型',
895
+ 'status.quickSwitchProvider': '快速切换提供商'
896
+ ,
897
+ 'side.usage.meta': '本地统计 / 趋势',
898
+ 'side.orchestration.meta': '计划 / 队列 / Runs'
899
+ ,
900
+
901
+ // Settings panel
902
+ 'settings.tab.general': '通用',
903
+ 'settings.tab.data': '数据',
904
+ 'settings.tabs.aria': '设置分类',
905
+ 'settings.sharePrefix.title': '分享命令前缀',
906
+ 'settings.sharePrefix.meta': '影响 Web UI 里“复制分享命令”的前缀',
907
+ 'settings.sharePrefix.label': '前缀',
908
+ 'settings.sharePrefix.hint': '默认走项目内 npm start,也可切到全局 codexmate。该设置会缓存到浏览器本地。',
909
+ 'settings.claude.title': 'Claude 配置',
910
+ 'settings.claude.meta': '备份 / 导入 ~/.claude',
911
+ 'settings.codex.title': 'Codex 配置',
912
+ 'settings.codex.meta': '备份 / 导入 ~/.codex',
913
+ 'settings.backup.progress': '备份中 {percent}%',
914
+ 'settings.backup.oneClickClaude': '一键备份 ~/.claude',
915
+ 'settings.backup.importClaude': '导入 ~/.claude 备份',
916
+ 'settings.backup.oneClickCodex': '一键备份 ~/.codex',
917
+ 'settings.backup.importCodex': '导入 ~/.codex 备份',
918
+ 'settings.importing': '导入中...',
919
+
920
+ 'settings.deleteBehavior.title': '会话删除行为',
921
+ 'settings.deleteBehavior.meta': '决定“删除”是否先进入回收站',
922
+ 'settings.deleteBehavior.toggle': '删除会话时先移入回收站',
923
+ 'settings.deleteBehavior.hint': '默认开启。关闭后,会话浏览里的删除会直接永久删除,不再进入回收站。',
924
+
925
+ 'settings.trash.title': '回收站',
926
+ 'settings.trash.meta': '已删除会话(可恢复/彻底删除)',
927
+ 'settings.trash.refresh': '刷新列表',
928
+ 'settings.trash.refreshing': '刷新中...',
929
+ 'settings.trash.clear': '清空回收站',
930
+ 'settings.trash.clearing': '清空中...',
931
+ 'settings.trash.loading': '正在加载回收站...',
932
+ 'settings.trash.empty': '回收站为空',
933
+ 'settings.trash.retry': '回收站列表加载失败,请刷新重试',
934
+ 'settings.trash.restore': '恢复',
935
+ 'settings.trash.restoring': '恢复中...',
936
+ 'settings.trash.purge': '彻底删除',
937
+ 'settings.trash.purging': '删除中...',
938
+ 'settings.trash.workspace': '工作区',
939
+ 'settings.trash.originalFile': '原文件',
940
+ 'settings.trash.loadMore': '加载更多(剩余 {count} 项)',
941
+ 'settings.trash.retention': '自动清理',
942
+ 'settings.trash.retentionMeta': '超过保留天数的回收站记录将自动清除',
943
+ 'settings.trash.retentionLabel': '保留天数',
944
+ 'settings.trash.retentionHint': '范围 1-365 天,默认 30 天。每次加载回收站时自动清理过期记录。',
945
+
946
+ 'settings.templateConfirm.title': '配置模板二次确认',
947
+ 'settings.templateConfirm.meta': '降低误写入风险',
948
+ 'settings.templateConfirm.toggle': '应用模板前先预览差异(两步:确认 → 应用)',
949
+ 'settings.templateConfirm.hint': '开启后:先展示差异预览,再确认写入。',
950
+
951
+ 'settings.reset.title': '配置重置',
952
+ 'settings.reset.meta': '谨慎操作',
953
+ 'settings.reset.hint': '会先备份 config.toml,再写入默认配置。',
954
+ 'settings.reset.button': '重装配置',
955
+ 'settings.reset.loading': '重装中...'
956
+ ,
957
+
958
+ // Market (Skills)
959
+ 'market.title': 'Skills 概览',
960
+ 'market.subtitle': '切换目标并查看本地 Skills。',
961
+ 'market.refresh': '刷新概览',
962
+ 'market.refreshing': '刷新中...',
963
+ 'market.openManager': '打开 Skills 管理',
964
+ 'market.target.aria': '选择 Skills 安装目标',
965
+ 'market.summary.target': '安装目标',
966
+ 'market.summary.total': '本地总数',
967
+ 'market.summary.configured': '含 SKILL.md',
968
+ 'market.summary.missing': '缺少 SKILL.md',
969
+ 'market.summary.importable': '可导入',
970
+ 'market.summary.importableDirect': '可直接导入',
971
+ 'market.root.fallback': '默认目录',
972
+
973
+ 'market.installed.title': '已安装 Skills',
974
+ 'market.installed.note': '仅显示前 6 项。',
975
+ 'market.local.refresh': '刷新本地',
976
+ 'market.local.refreshing': '刷新中...',
977
+ 'market.local.loading': '正在加载本地 Skills...',
978
+ 'market.local.empty': '当前暂无已安装 skill。',
979
+ 'market.pill.verified': '已验证',
980
+ 'market.pill.missingSkill': '待补 SKILL.md',
981
+
982
+ 'market.import.title': '可导入来源',
983
+ 'market.import.note': '扫描并导入到当前 {target}。',
984
+ 'market.import.scan': '扫描来源',
985
+ 'market.import.scanning': '扫描中...',
986
+ 'market.import.loading': '正在扫描可导入 skill...',
987
+ 'market.import.empty': '暂未扫描到可导入 skill。',
988
+ 'market.pill.importableDirect': '可直接导入',
989
+ 'market.pill.importMissing': '缺少 SKILL.md',
990
+
991
+ 'market.actions.title': '分发入口',
992
+ 'market.actions.note': '操作均作用于当前安装目标。',
993
+ 'market.action.manage.title': '本地 Skills 管理',
994
+ 'market.action.manage.copy': '管理当前 {target} 的已装 skills',
995
+ 'market.action.crossImport.title': '跨应用导入',
996
+ 'market.action.crossImport.copy': '导入到当前 {target}',
997
+ 'market.action.zipImport.title': 'ZIP 导入',
998
+ 'market.action.zipImport.copy': ' ZIP 导入到当前目标',
999
+
1000
+ 'market.help.title': '操作说明',
1001
+ 'market.help.target.title': '目标切换',
1002
+ 'market.help.target.copy': '当前操作写入 {target} 目录。',
1003
+ 'market.help.crossImport.title': '跨应用导入',
1004
+ 'market.help.crossImport.copy': '从其他宿主导入未托管 skill。',
1005
+ 'market.help.zipImport.title': 'ZIP 导入',
1006
+ 'market.help.zipImport.copy': '从 ZIP 导入本地 skill。'
1007
+ ,
1008
+
1009
+ // Claude config panel
1010
+ 'claude.addProvider': '添加提供商',
1011
+ 'claude.applyDefault': '默认应用到 ~/.claude/settings.json。',
1012
+ 'claude.presetProviders': '预设供应商',
1013
+ 'claude.customConfig': '自定义配置',
1014
+ 'claude.model': '模型',
1015
+ 'claude.model.placeholder': '例如: claude-3-7-sonnet',
1016
+ 'claude.model.hint': '模型修改后会自动保存并应用到当前配置。',
1017
+ 'claude.health.title': '配置健康检查',
1018
+ 'claude.health.run': '运行检查',
1019
+ 'claude.health.running': '检查中...',
1020
+ 'claude.health.hint': '会批量探测所有 Claude 配置可用性,并刷新延迟显示。',
1021
+ 'claude.health.progress': '已完成 {done}/{total} · 失败 {failed}',
1022
+ 'claude.md.title': 'CLAUDE.md',
1023
+ 'claude.md.open': '打开 CLAUDE.md',
1024
+ 'claude.md.hint': '读写 ~/.claude/CLAUDE.md。',
1025
+ 'claude.model.unset': '未设置模型',
1026
+ 'claude.configured': '已配置',
1027
+ 'claude.notConfigured': '未配置',
1028
+ 'claude.action.edit': '编辑',
1029
+ 'claude.action.delete': '删除',
1030
+ 'claude.action.shareDisabled': '分享导入命令(暂时禁用)'
1031
+ ,
1032
+ 'claude.action.editAria': '编辑 Claude 配置:{name}',
1033
+ 'claude.action.deleteAria': '删除 Claude 配置:{name}',
1034
+
1035
+ // OpenClaw config panel
1036
+ 'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json,支持 JSON5。',
1037
+ 'openclaw.agents.hint': '读写 Workspace 的 AGENTS.md,默认路径 ~/.openclaw/workspace/AGENTS.md。',
1038
+ 'openclaw.agents.open': '打开 AGENTS.md',
1039
+ 'openclaw.workspaceFile': '工作区文件',
1040
+ 'openclaw.workspace.placeholder': '例如: SOUL.md',
1041
+ 'openclaw.workspace.hint': '仅限 Workspace 内的 .md 文件。',
1042
+ 'openclaw.workspace.open': '打开工作区文件',
1043
+ 'openclaw.configured': '已配置',
1044
+ 'openclaw.notConfigured': '未配置',
1045
+ 'openclaw.action.edit': '编辑',
1046
+ 'openclaw.action.delete': '删除',
1047
+ 'modal.openclaw.quick.subtitle': ' 3 步完成:填 Provider 和模型,写入编辑器,保存并应用。',
1048
+ 'modal.openclaw.quick.step2': '点击写入编辑器',
1049
+ 'modal.openclaw.structured.writeHint': '写入编辑器会重排 JSON,注释可能丢失。'
1050
+ ,
1051
+ 'openclaw.action.editAria': '编辑 OpenClaw 配置:{name}',
1052
+ 'openclaw.action.deleteAria': '删除 OpenClaw 配置:{name}'
1053
+ },
1054
+ en: {
1055
+ // Global
1056
+ 'lang.zh': '中文',
1057
+ 'lang.en': 'English',
1058
+ 'lang.label': 'Language',
1059
+ 'nav.topTabs.aria': 'Navigation',
1060
+
1061
+ // Common
1062
+ 'common.all': 'All',
1063
+ 'common.copy': 'Copy',
1064
+ 'common.edit': 'Edit',
1065
+ 'common.install': 'Install',
1066
+ 'common.update': 'Update',
1067
+ 'common.uninstall': 'Uninstall',
1068
+ 'common.official': 'Official',
1069
+ 'common.custom': 'Custom',
1070
+ 'common.rules': 'Rules',
1071
+ 'common.troubleshooting': 'Troubleshooting',
1072
+ 'common.command': 'Command',
1073
+ 'common.mirror': 'Registry',
1074
+ 'common.packageManager': 'Package manager',
1075
+ 'common.action': 'Action',
1076
+ 'common.targets': 'Targets',
1077
+ 'common.currentPm': 'Package manager',
1078
+ 'common.currentAction': 'Action',
1079
+ 'common.mirrorActive': 'Registry',
1080
+ 'common.defaultOfficial': 'Default',
1081
+ 'common.cancel': 'Cancel',
1082
+ 'common.confirm': 'Confirm',
1083
+ 'common.add': 'Add',
1084
+ 'common.save': 'Save',
1085
+ 'common.saveApply': 'Save & apply',
1086
+ 'common.close': 'Close',
1087
+ 'common.delete': 'Delete',
1088
+ 'common.clear': 'Clear',
1089
+ 'common.show': 'Show',
1090
+ 'common.hide': 'Hide',
1091
+ 'common.detail': 'Details',
1092
+ 'common.refresh': 'Refresh',
1093
+ 'common.refreshing': 'Refreshing...',
1094
+ 'common.loading': 'Loading...',
1095
+ 'common.saving': 'Saving...',
1096
+ 'common.sending': 'Sending...',
1097
+ 'common.scanning': 'Scanning...',
1098
+ 'common.export': 'Export',
1099
+ 'common.import': 'Import',
1100
+ 'common.apply': 'Apply',
1101
+ 'common.applying': 'Applying...',
1102
+ 'common.confirming': 'Confirming...',
1103
+ 'common.writeToEditor': 'Write to editor',
1104
+ 'common.refreshFromText': 'Refresh from text',
1105
+ 'common.backToEdit': 'Back to edit',
1106
+ 'common.selectAll': 'Select all',
1107
+ 'common.unselectAll': 'Unselect all',
1108
+ 'common.resetFilters': 'Reset filters',
1109
+ 'common.notEditable': 'Not editable',
1110
+ 'common.notDeletable': 'Not deletable',
1111
+ 'common.notLoaded': 'Not loaded',
1112
+ 'common.exists': 'Exists',
1113
+ 'common.notExistsWillCreateOnApply': 'Not found. Will be created on apply.',
1114
+ 'common.notExistsWillCreateOnSave': 'Not found. Will be created on save.',
1115
+ 'common.none': 'None',
1116
+ 'cli.missing.title': '{name} CLI not installed',
1117
+ 'cli.missing.subtitle': 'Install {name} CLI before using this page.',
1118
+ 'cli.missing.openDocs': 'Open install guide',
1119
+ 'cli.missing.commandAria': '{name} CLI install command',
1120
+
1121
+ // Brand
1122
+ 'brand.kicker.workspace': 'Workspace',
1123
+ 'brand.subtitle.localConfigSessionsWorkspace': 'Local config & sessions workspace',
1124
+
1125
+ // Confirm dialog
1126
+ 'confirm.aria': 'Confirm action',
1127
+ 'confirm.title.default': 'Please confirm',
1128
+ 'confirm.ok': 'Confirm',
1129
+ 'confirm.cancel': 'Cancel',
1130
+
1131
+ // Shared fields
1132
+ 'field.name': 'Name',
1133
+ 'field.configName': 'Config name',
1134
+ 'field.apiEndpoint': 'API endpoint',
1135
+ 'field.apiKey': 'API key',
1136
+ 'field.baseUrl': 'Base URL',
1137
+ 'field.provider': 'Provider',
1138
+ 'field.providerName': 'Provider name',
1139
+ 'field.modelName': 'Model name',
1140
+ 'field.model': 'Model',
1141
+ 'field.message': 'Message',
1142
+ 'field.varName': 'Variable name',
1143
+ 'field.targetFile': 'Target file',
1144
+ 'field.modelId': 'Model ID',
1145
+ 'field.displayName': 'Display name',
1146
+ 'field.contextAndMaxOutput': 'Context and max output',
1147
+ 'field.apiType': 'API type',
1148
+ 'field.env': 'Environment variables',
1149
+ 'field.allow': 'Allow',
1150
+ 'field.deny': 'Deny',
1151
+
1152
+ // Shared placeholders/hints
1153
+ 'placeholder.providerNameExample': 'e.g. myapi',
1154
+ 'placeholder.apiEndpointExample': 'https://api.example.com/v1',
1155
+ 'placeholder.providerName': 'Provider name',
1156
+ 'placeholder.keepUnchanged': 'Leave blank to keep unchanged',
1157
+ 'hint.keepKeyUnchanged': 'Leave blank to keep current key',
1158
+ 'placeholder.modelExample': 'e.g. gpt-5',
1159
+ 'placeholder.configNameExample': 'e.g. My Claude Setup',
1160
+ 'placeholder.apiKeyExampleClaude': 'sk-ant-...',
1161
+ 'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
1162
+ 'placeholder.selectProvider': 'Select a provider',
1163
+
1164
+ // Roles / labels
1165
+ 'role.you': 'You',
1166
+ 'role.provider': 'Provider',
1167
+ 'label.model': 'Model:',
1168
+
1169
+ // Top tabs
1170
+ 'tab.dashboard': 'Dashboard',
1171
+ 'tab.docs': 'Docs',
1172
+ 'tab.config': 'Config',
1173
+ 'tab.config.codex': 'Codex',
1174
+ 'tab.config.claude': 'Claude',
1175
+ 'tab.config.openclaw': 'OpenClaw',
1176
+ 'tab.sessions': 'Sessions',
1177
+ 'tab.usage': 'Usage',
1178
+ 'tab.orchestration': 'Tasks',
1179
+ 'tab.market': 'Skills',
1180
+ 'tab.plugins': 'Plugins',
1181
+ 'tab.settings': 'Settings',
1182
+
1183
+ // Side rail section titles
1184
+ 'side.overview': 'Overview',
1185
+ 'side.docs': 'Docs',
1186
+ 'side.config': 'Config',
1187
+ 'side.sessions': 'Sessions',
1188
+ 'side.plugins': 'Plugins',
1189
+ 'side.system': 'System',
1190
+ 'side.orchestration': 'Tasks',
1191
+ 'side.skills': 'Skills',
1192
+
1193
+ // Side rail items
1194
+ 'side.overview.doctor': 'Doctor',
1195
+ 'side.overview.doctor.meta': 'Overview / Diagnostics',
1196
+ 'side.docs.cliInstall': 'CLI Install',
1197
+ 'side.docs.cliInstall.meta': 'Install / Update / Uninstall',
1198
+ 'side.config.codex': 'Codex',
1199
+ 'side.config.codex.meta': 'Provider / Model',
1200
+ 'side.config.claude': 'Claude Code',
1201
+ 'side.config.claude.meta': 'Claude Settings',
1202
+ 'side.config.openclaw': 'OpenClaw',
1203
+ 'side.config.openclaw.meta': 'JSON5 / AGENTS',
1204
+ 'side.sessions.browser': 'Session Browser',
1205
+ 'side.sessions.browser.meta': 'Browse / Export / Cleanup',
1206
+ 'side.plugins.tools': 'Prompt Tools',
1207
+ 'side.plugins.tools.meta': 'Templates / Variables',
1208
+ 'side.system.settings': 'Runtime Settings',
1209
+ 'side.system.settings.meta': 'Data / Backup',
1210
+
1211
+ // Header titles
1212
+ 'kicker.dashboard': 'Doctor',
1213
+ 'kicker.config': 'Configuration',
1214
+ 'kicker.sessions': 'Sessions',
1215
+ 'kicker.usage': 'Usage',
1216
+ 'kicker.orchestration': 'Tasks',
1217
+ 'kicker.market': 'Skills',
1218
+ 'kicker.plugins': 'Plugins',
1219
+ 'kicker.docs': 'Docs',
1220
+ 'kicker.settings': 'Settings',
1221
+
1222
+ 'title.dashboard': 'Dashboard / Doctor',
1223
+ 'title.config': 'Local Configuration Console',
1224
+ 'title.sessions': 'Sessions & Export',
1225
+ 'title.usage': 'Local Usage & Trends',
1226
+ 'title.orchestration': 'Task Orchestration',
1227
+ 'title.market': 'Skills Install & Sync',
1228
+ 'title.plugins': 'Plugins & Templates',
1229
+ 'title.docs': 'CLI Install & Docs',
1230
+ 'title.settings': 'System & Data Settings',
1231
+
1232
+ 'subtitle.dashboard': 'Aggregate status and diagnostics.',
1233
+ 'subtitle.config': 'Manage local configs and models.',
1234
+ 'subtitle.sessions': 'Browse and export sessions.',
1235
+ 'subtitle.usage': 'View usage for the last 7/30 days.',
1236
+ 'subtitle.orchestration': 'Plan, queue, run, and review local tasks.',
1237
+ 'subtitle.market': 'Manage local skills.',
1238
+ 'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
1239
+ 'subtitle.docs': 'CLI install commands and troubleshooting.',
1240
+ 'subtitle.settings': 'Manage downloads, directories, and trash.'
1241
+ ,
1242
+ 'dashboard.doctor.title': 'Doctor',
1243
+ 'dashboard.doctor.runChecks': 'Run checks',
1244
+ 'dashboard.doctor.checking': 'Checking...',
1245
+ 'dashboard.doctor.export': 'Export report',
1246
+ 'dashboard.doctor.export.json': 'Export JSON',
1247
+ 'dashboard.doctor.export.md': 'Export Markdown',
1248
+ 'dashboard.doctor.open': 'Open',
1249
+ 'doctor.action.openConfig': 'Open Config',
1250
+ 'doctor.action.checkProvider': 'Check provider config',
1251
+ 'doctor.action.openUsage': 'Open Usage',
1252
+ 'doctor.action.openSessions': 'Open Sessions',
1253
+ 'doctor.action.openTasks': 'Open Tasks',
1254
+ 'doctor.action.viewTaskLogs': 'View Tasks / Logs',
1255
+ 'doctor.action.openSkills': 'Open Skills',
1256
+ 'doctor.issue.configNotReady.problem': 'Config is not ready',
1257
+ 'doctor.issue.configNotReady.impact': 'Provider/model cannot be read; model listing and requests may fail.',
1258
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider unreachable',
1259
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider auth failed',
1260
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider endpoint returned 404',
1261
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider returned HTTP error',
1262
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider probe failed',
1263
+ 'doctor.issue.providerUnreachable.problem.unknown': 'Provider unreachable',
1264
+ 'doctor.issue.providerUnreachable.impactAuth': 'Auth failure will cause model listing and chat requests to return 401/403.',
1265
+ 'doctor.issue.providerUnreachable.impactNetwork': 'Unreachable provider will cause model listing and chat requests to fail or timeout.',
1266
+ 'doctor.issue.configHealthFailed.problem': 'Config health check failed',
1267
+ 'doctor.issue.configHealthFailed.impact': 'Some features may be unavailable or behave unexpectedly.',
1268
+ 'doctor.issue.usageError.problem': 'Usage aggregation failed',
1269
+ 'doctor.issue.usageError.impact': 'Usage charts and summaries may be unavailable; Doctor usage diagnostics will be incomplete.',
1270
+ 'doctor.issue.usageMissingModel.problem': 'Some sessions miss model metadata',
1271
+ 'doctor.issue.usageMissingModel.impact': 'Usage attribution and cost estimates may be inaccurate.',
1272
+ 'doctor.issue.tasksError.problem': 'Task overview failed',
1273
+ 'doctor.issue.tasksError.impact': 'Task queue and run history may be unavailable.',
1274
+ 'doctor.issue.tasksFailed.problem': 'Failed task runs detected',
1275
+ 'doctor.issue.tasksFailed.impact': 'Automation pipelines may be blocked; inspect logs and retry after fixing inputs.',
1276
+ 'doctor.issue.skillsError.problem': 'Skills listing failed',
1277
+ 'doctor.issue.skillsError.impact': 'Skills marketplace may be unavailable.',
1278
+ 'doctor.issue.skillsRootMissing.problem': 'Skills directory is missing',
1279
+ 'doctor.issue.skillsRootMissing.impact': 'Skills install/scan will be empty; create the directory via Settings/Docs.',
1280
+ 'doctor.issue.skillsMissingFiles.problem': 'Some skills are missing skill.json',
1281
+ 'doctor.issue.skillsMissingFiles.impact': 'Those skills may not run or sync properly.',
1282
+ 'dashboard.card.config': 'Config',
1283
+ 'dashboard.card.sessions': 'Sessions',
1284
+ 'dashboard.card.usage': 'Usage',
1285
+ 'dashboard.card.tasks': 'Tasks',
1286
+ 'dashboard.card.skills': 'Skills',
1287
+ 'dashboard.kv.model': 'Model',
1288
+ 'dashboard.kv.issue': 'Issue',
1289
+ 'dashboard.kv.active': 'Active',
1290
+ 'dashboard.kv.sessions': 'Sessions',
1291
+ 'dashboard.kv.missingModel': 'Missing model',
1292
+ 'dashboard.kv.blockers': 'Blockers',
1293
+ 'dashboard.kv.runs': 'Runs',
1294
+ 'dashboard.kv.target': 'Target',
1295
+ 'dashboard.kv.root': 'Root',
1296
+ 'dashboard.status.health': 'Health',
1297
+ 'dashboard.status.busy': 'Busy',
1298
+ 'dashboard.status.models': 'Models',
1299
+ 'dashboard.busy.init': 'Init',
1300
+ 'dashboard.busy.sessions': 'Sessions',
1301
+ 'dashboard.busy.models': 'Models',
1302
+ 'dashboard.busy.configApply': 'Apply config',
1303
+ 'dashboard.busy.agents': 'Saving agents',
1304
+ 'dashboard.busy.skills': 'Skills',
1305
+ 'dashboard.busy.tasks': 'Tasks',
1306
+ 'dashboard.busy.idle': 'Idle',
1307
+ 'dashboard.message.none': 'No messages',
1308
+ 'dashboard.sessionSource.codex': 'Codex',
1309
+ 'dashboard.sessionSource.claude': 'Claude Code',
1310
+ 'dashboard.sessionSource.gemini': 'Gemini CLI',
1311
+ 'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
1312
+ 'dashboard.sessionSource.all': 'All',
1313
+ 'dashboard.sessionPath.all': 'All paths',
1314
+ 'dashboard.sessionQuery.unsupported': 'Unsupported source',
1315
+ 'dashboard.sessionQuery.unset': 'Not set',
1316
+ 'dashboard.healthStatus.failRead': 'Failed',
1317
+ 'dashboard.healthStatus.initializing': 'Initializing',
1318
+ 'dashboard.healthStatus.ok': 'OK',
1319
+ 'dashboard.modelStatus.loading': 'Loading',
1320
+ 'dashboard.modelStatus.error': 'Error',
1321
+ 'dashboard.modelStatus.ok': 'OK',
1322
+ 'dashboard.health.ok': 'Checks passed',
1323
+ 'dashboard.health.fail': 'Checks failed',
1324
+ 'dashboard.health.issues': '{count} issues',
1325
+ 'dashboard.issues.title': '{count} actionable issues',
1326
+ 'dashboard.state.loading': 'Loading',
1327
+ 'dashboard.state.ready': 'Ready',
1328
+ 'dashboard.state.idle': 'Idle',
1329
+ 'dashboard.none': 'None',
1330
+ 'dashboard.sessions.count': '{count} sessions',
1331
+ 'dashboard.usage.range': 'Range {value}',
1332
+ 'dashboard.tasks.queue': 'run {running} / queue {queued}',
1333
+ 'dashboard.skills.count': 'installed {installed} / import {importable}',
1334
+
1335
+ // Plugins panel
1336
+ 'plugins.sidebar.title': 'Plugins',
1337
+ 'plugins.sidebar.note': 'Reusable, standardized utilities. Future custom plugins should follow the same structure.',
1338
+ 'plugins.sidebar.ariaList': 'Plugin list',
1339
+ 'plugins.main.ariaWorkspace': 'Plugin workspace',
1340
+ 'plugins.refresh': 'Refresh',
1341
+ 'plugins.refreshing': 'Refreshing...',
1342
+ 'plugins.promptTemplates.title': 'Prompt templates',
1343
+ 'plugins.promptTemplates.subtitle': 'Built-in: comment polish ({{code}}). Copy and paste into Codex/Claude.',
1344
+ 'plugins.promptTemplates.mode.aria': 'Prompt templates mode',
1345
+ 'plugins.promptTemplates.mode.compose': 'Compose',
1346
+ 'plugins.promptTemplates.mode.manage': 'Manage',
1347
+ 'plugins.promptTemplates.compose.selectTemplate': 'Select template',
1348
+ 'plugins.promptTemplates.compose.chooseTemplate': 'Choose a template',
1349
+ 'plugins.promptTemplates.compose.chooseTemplateHint': 'Select a template to start composing.',
1350
+ 'plugins.promptTemplates.compose.builtinSuffix': ' (built-in)',
1351
+ 'plugins.promptTemplates.compose.empty': 'No templates available.',
1352
+ 'plugins.promptTemplates.compose.varsHint': 'Fill and add variables in “Manage”.',
1353
+ 'plugins.promptTemplates.compose.missingCount': '{count} missing',
1354
+ 'plugins.promptTemplates.compose.jumpToMissing': 'Jump to missing',
1355
+ 'plugins.promptTemplates.compose.goManage': 'Manage variables',
1356
+ 'plugins.promptTemplates.compose.outputTitle': 'Output',
1357
+ 'plugins.promptTemplates.compose.outputHint': 'Click “Copy” and paste into Codex/Claude.',
1358
+ 'plugins.promptTemplates.compose.outputAria': 'Rendered prompt',
1359
+ 'plugins.promptTemplates.compose.copy': 'Copy',
1360
+ 'plugins.promptTemplates.manage.searchAria': 'Search templates',
1361
+ 'plugins.promptTemplates.manage.searchPlaceholder': 'Search templates',
1362
+ 'plugins.promptTemplates.manage.create': 'New',
1363
+ 'plugins.promptTemplates.manage.export': 'Export',
1364
+ 'plugins.promptTemplates.manage.import': 'Import',
1365
+ 'plugins.promptTemplates.manage.loading': 'Loading templates...',
1366
+ 'plugins.promptTemplates.manage.empty': 'No templates.',
1367
+ 'plugins.promptTemplates.manage.vars': '{count} vars',
1368
+ 'plugins.promptTemplates.manage.builtin': 'built-in',
1369
+ 'plugins.promptTemplates.manage.custom': 'custom',
1370
+ 'plugins.promptTemplates.manage.newTemplateName': 'New template',
1371
+ 'plugins.promptTemplates.editor.selectHint': 'Select a template to edit.',
1372
+ 'plugins.promptTemplates.editor.namePlaceholder': 'Template name',
1373
+ 'plugins.promptTemplates.editor.nameAria': 'Template name',
1374
+ 'plugins.promptTemplates.editor.duplicate': 'Duplicate',
1375
+ 'plugins.promptTemplates.editor.delete': 'Delete',
1376
+ 'plugins.promptTemplates.editor.save': 'Save',
1377
+ 'plugins.promptTemplates.editor.builtinReadOnly': 'Built-in templates are read-only (no edit/save/delete/duplicate).',
1378
+ 'plugins.promptTemplates.editor.descPlaceholder': 'Description (optional)',
1379
+ 'plugins.promptTemplates.editor.descAria': 'Template description',
1380
+ 'plugins.promptTemplates.editor.templateLabel': 'Template',
1381
+ 'plugins.promptTemplates.editor.templateAria': 'Template body',
1382
+ 'plugins.promptTemplates.editor.templatePlaceholder': 'Write your template here. Use {{var}} placeholders.',
1383
+ 'plugins.promptTemplates.vars.title': 'Variables',
1384
+ 'plugins.promptTemplates.vars.hint': 'Detected from the template. Fill them to render the final prompt.',
1385
+ 'plugins.promptTemplates.vars.reset': 'Reset',
1386
+ 'plugins.promptTemplates.vars.empty': 'No variables detected.',
1387
+ 'plugins.promptTemplates.vars.valuePlaceholder': 'Value for {name}',
1388
+ 'plugins.promptTemplates.preview.title': 'Preview',
1389
+ 'plugins.promptTemplates.preview.hint': 'Rendered output (missing vars become empty).',
1390
+ 'plugins.promptTemplates.preview.copy': 'Copy',
1391
+ 'plugins.promptTemplates.preview.outputAria': 'Rendered prompt',
1392
+ 'plugins.promptTemplates.noPluginSelected': 'Select a plugin from the left panel first.',
1393
+
1394
+ 'plugins.meta.attribution': 'Created by {createdBy} · Maintained by {maintainers}',
1395
+ 'plugins.meta.createdBy': 'Created by {createdBy}',
1396
+ 'plugins.meta.maintainedBy': 'Maintained by {maintainers}',
1397
+
1398
+ // Built-in prompt templates
1399
+ 'plugins.builtin.commentPolish.name': 'Comment polish',
1400
+ 'plugins.builtin.commentPolish.desc': 'Polish the following code comments {{code}}',
1401
+ 'plugins.builtin.commentPolish.line1': 'Polish the following code comments',
1402
+ 'plugins.builtin.ruleAck.name': 'Rule acknowledgement',
1403
+ 'plugins.builtin.ruleAck.desc': 'Please follow 【{{rule}}】, reply when received',
1404
+ 'plugins.builtin.ruleAck.line1': 'Please follow 【{{rule}}】, reply when received',
1405
+
1406
+ // Toasts
1407
+ 'toast.copy.empty': 'Nothing to copy',
1408
+ 'toast.copy.ok': 'Copied',
1409
+ 'toast.copy.fail': 'Copy failed',
1410
+ 'toast.save.ok': 'Saved',
1411
+ 'toast.save.fail': 'Save failed',
1412
+ 'toast.delete.ok': 'Deleted',
1413
+ 'toast.delete.fail': 'Delete failed',
1414
+ 'toast.export.empty': 'Nothing to export',
1415
+ 'toast.export.ok': 'Exported',
1416
+ 'toast.export.fail': 'Export failed',
1417
+ 'toast.import.ok': 'Imported',
1418
+ 'toast.import.fail': 'Import failed',
1419
+ 'toast.import.notAvailable': 'Import is not available',
1420
+ 'toast.import.readFileFail': 'Failed to read file',
1421
+ 'toast.import.invalidJson': 'Invalid JSON',
1422
+ 'toast.import.expectedArray': 'Expected an array',
1423
+ 'toast.export.notSupported': 'Export not supported',
1424
+ 'toast.plugins.loadFail': 'Failed to load plugins',
1425
+ 'toast.templates.builtinNotEditable': 'Built-in templates are not editable',
1426
+ 'toast.templates.builtinNotModifiable': 'Built-in templates are read-only. Duplicate first.',
1427
+ 'toast.templates.nameRequired': 'Template name is required',
1428
+ 'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
1429
+ 'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
1430
+ 'toast.templates.deleteTitle': 'Delete template',
1431
+ 'toast.templates.deleteMessage': 'Delete “{name}”? This action cannot be undone.',
1432
+ 'toast.templates.deleteConfirm': 'Delete',
1433
+ 'toast.templates.deleteCancel': 'Cancel',
1434
+
1435
+ // Basic modals
1436
+ 'modal.providerAdd.title': 'Add provider',
1437
+ 'modal.providerEdit.title': 'Edit provider',
1438
+ 'modal.modelAdd.title': 'Add model',
1439
+ 'modal.modelManage.title': 'Manage models',
1440
+ 'modal.claudeConfigAdd.title': 'Add Claude Code config',
1441
+ 'modal.claudeConfigEdit.title': 'Edit Claude Code config',
1442
+ 'field.useBuiltinTransform': 'Use built-in transform (OpenAI compatible)',
1443
+ 'hint.useBuiltinTransform': 'When enabled, base_url points to codexmate built-in transform service; Codex token is fixed to codexmate.',
1444
+
1445
+ // Config template / agents modals
1446
+ 'modal.configTemplate.title': 'Config template editor (manual confirm)',
1447
+ 'modal.configTemplate.label': 'config.toml template',
1448
+ 'modal.configTemplate.placeholder': 'Edit config.toml template here',
1449
+ 'modal.configTemplate.mode.twoStep': 'Two-step confirm: preview diff, then apply.',
1450
+ 'modal.configTemplate.mode.oneStep': 'One-step apply: write immediately.',
1451
+ 'diff.title.configTemplate': 'Diff preview (config.toml)',
1452
+ 'diff.generating': 'Generating...',
1453
+ 'diff.failed': 'Failed',
1454
+ 'diff.noChanges': 'No changes detected',
1455
+ 'diff.hint.busy': 'Generating diff or applying. Actions are temporarily disabled.',
1456
+ 'diff.hint.failedBack': 'Diff preview failed. Go back to edit and retry.',
1457
+ 'diff.hint.noChangesBack': 'No changes detected. Go back to edit or cancel.',
1458
+ 'diff.hint.previewMode': 'Preview mode. Click “Apply” to write or “Back to edit” to continue.',
1459
+
1460
+ 'modal.agents.export': 'Export',
1461
+ 'modal.agents.copy': 'Copy',
1462
+ 'modal.agents.title': 'AGENTS.md editor',
1463
+ 'modal.agents.hint': 'Saved content will be written to the target AGENTS.md (next to config.toml).',
1464
+ 'modal.agents.targetFile': 'Target file',
1465
+ 'modal.agents.contentLabel': 'AGENTS.md content',
1466
+ 'modal.agents.placeholder': 'Edit AGENTS.md here',
1467
+ 'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “Apply”.',
1468
+ 'modal.agents.unsaved.detectedHint': 'Unsaved changes detected: save before closing or applying.',
1469
+ 'modal.agents.hint.shortcuts': 'Shortcut: Esc (back to edit in preview, close in edit).',
1470
+ 'modal.agents.hint.twoStepSave': 'Two-step save: “Confirm” to preview diff, then “Apply” to save.',
1471
+ 'diff.tooLargeSkip': 'Content too large. Line diff preview skipped.',
1472
+ 'diff.viewHint.preview': 'Preview mode. Click “Apply” to save or “Back to edit” to continue.',
1473
+ 'diff.viewHint.truncated': 'Preview skipped due to size. Click “Apply” to save or “Back to edit” to continue.',
1474
+
1475
+ // Skills modal
1476
+ 'modal.skills.title': 'Skills manager',
1477
+ 'modal.skills.subtitle': 'Manage local skills for the current host.',
1478
+ 'modal.skills.target.aria': 'Select skills target',
1479
+ 'modal.skills.rootDir': 'Skills directory ({label})',
1480
+ 'modal.skills.summary.target': 'Target',
1481
+ 'modal.skills.summary.total': 'Total',
1482
+ 'modal.skills.summary.withSkill': 'With SKILL.md',
1483
+ 'modal.skills.summary.missingSkill': 'Missing SKILL.md',
1484
+ 'modal.skills.summary.importable': 'Importable',
1485
+ 'modal.skills.panel.aria': 'Skills manager',
1486
+ 'modal.skills.local.title': 'Local skills',
1487
+ 'modal.skills.local.note': 'Search, filter, and bulk delete.',
1488
+ 'modal.skills.filter.keywordAria': 'Filter by name or description',
1489
+ 'modal.skills.filter.keywordPlaceholder': 'Search by dir name / display name / description',
1490
+ 'modal.skills.filter.statusAria': 'Filter by SKILL.md status',
1491
+ 'modal.skills.filter.status.all': 'All',
1492
+ 'modal.skills.filter.status.withSkill': 'With SKILL.md',
1493
+ 'modal.skills.filter.status.missingSkill': 'Missing SKILL.md',
1494
+ 'modal.skills.selection.stats': '{selected} selected (filtered {filtered} / {total}, selected in filtered {visibleSelected})',
1495
+ 'modal.skills.empty.local': 'No skills to manage.',
1496
+ 'modal.skills.empty.filtered': 'No skills match the current filters.',
1497
+ 'modal.skills.pill.hasSkillFile': 'Has SKILL.md',
1498
+ 'modal.skills.pill.missingSkillFile': 'Missing SKILL.md',
1499
+ 'modal.skills.pill.symlink': 'Symlink',
1500
+ 'modal.skills.pill.dir': 'Directory',
1501
+ 'modal.skills.import.title': 'Cross-app import',
1502
+ 'modal.skills.import.note': 'Scan and import into {label}.',
1503
+ 'modal.skills.import.scan': 'Scan importable',
1504
+ 'modal.skills.import.stats': '{selected} selected / {total}. With SKILL.md {configured}, missing {missing}.',
1505
+ 'modal.skills.import.emptyHint': 'No importable skills. Click “Scan importable”.',
1506
+ 'modal.skills.bulk.title': 'Bulk actions',
1507
+ 'modal.skills.bulk.note': 'Right side is import selection; left side is local selection.',
1508
+ 'modal.skills.actions.zipImport': 'Import ZIP',
1509
+ 'modal.skills.actions.zipImporting': 'Importing ZIP...',
1510
+ 'modal.skills.actions.exportSelected': 'Export selected',
1511
+ 'modal.skills.actions.exporting': 'Exporting...',
1512
+ 'modal.skills.actions.importSelected': 'Import selected',
1513
+ 'modal.skills.actions.importing': 'Importing...',
1514
+ 'modal.skills.actions.deleteSelected': 'Delete selected',
1515
+ 'modal.skills.actions.deleting': 'Deleting...',
1516
+
1517
+ // OpenClaw config modal (quick)
1518
+ 'placeholder.openclawConfigNameExample': 'e.g. Default',
1519
+ 'modal.openclaw.loadCurrent': 'Load current config',
1520
+ 'modal.openclaw.quick.title': 'Quick setup',
1521
+ 'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
1522
+ 'modal.openclaw.quick.readFromEditor': 'Read from editor',
1523
+ 'modal.openclaw.quick.step1': 'Fill provider and model',
1524
+ 'modal.openclaw.quick.step2': 'Write to editor',
1525
+ 'modal.openclaw.quick.step3': 'Save & apply',
1526
+ 'modal.openclaw.quick.providerHint': 'Will be combined as provider/model for the primary model identifier.',
1527
+ 'modal.openclaw.quick.baseUrlHintDefault': 'Pre-filled from OpenClaw built-in provider defaults. You can edit it directly.',
1528
+ 'modal.openclaw.quick.baseUrlHintReadonly': 'Detected an external reference. Read-only in quick form; edit in raw editor.',
1529
+ 'modal.openclaw.quick.apiKeyHintFromAuth': 'Value comes from external auth profile; changes will be written back on save & apply.',
1530
+ 'modal.openclaw.quick.apiKeyHintReadonly': 'Detected external auth/reference. Read-only in quick form; edit in raw editor or auth config.',
1531
+ 'modal.openclaw.quick.apiKeyHintKeep': 'Leave blank to keep existing key.',
1532
+ 'placeholder.apiTypeExample': 'e.g. openai-responses',
1533
+ 'modal.openclaw.quick.modelTitle': 'Model',
1534
+ 'placeholder.modelIdExample': 'e.g. gpt-4.1',
1535
+ 'placeholder.modelNameOptional': 'Leave blank to use model ID',
1536
+ 'field.contextWindow': 'Context window',
1537
+ 'field.maxOutput': 'Max output',
1538
+ 'hint.emptyNoChange': 'Leave blank to keep existing values.',
1539
+ 'modal.openclaw.quick.optionsTitle': 'Options',
1540
+ 'modal.openclaw.quick.setPrimary': 'Set as primary model',
1541
+ 'modal.openclaw.quick.overrideProvider': 'Override provider base settings',
1542
+ 'modal.openclaw.quick.overrideModels': 'Override model list',
1543
+ 'modal.openclaw.quick.optionsHint': 'When override is off, only missing fields will be filled.',
1544
+ 'modal.openclaw.quick.writeToEditor': 'Write to editor',
1545
+
1546
+ // Docs panel
1547
+ 'docs.title': 'CLI Install',
1548
+ 'docs.subtitle': 'Install commands for Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI.',
1549
+ 'docs.section.commands': 'Commands',
1550
+ 'docs.section.commandsNote': 'Copy and run directly.',
1551
+ 'docs.section.faq': 'FAQ',
1552
+ 'docs.section.faqNote': 'Common issues and tips.',
1553
+ 'docs.command.aria': '{name} command',
1554
+ 'docs.registryHintPrefix': 'Command will append:',
1555
+ 'docs.registryHintCustom': 'Enter a full URL (http/https) to append as registry.',
1556
+ 'docs.registry.tencent': 'Tencent Cloud',
1557
+ 'docs.meta.bin': 'bin: {bin}',
1558
+ 'docs.termuxLabel': 'Termux',
1559
+ 'docs.termuxAria': 'Termux Codex CLI command',
1560
+ 'docs.rule.1': 'Commands depend on package manager, registry and action.',
1561
+ 'docs.rule.2': 'Custom registry is used for install/update only.'
1562
+ ,
1563
+ 'docs.tip.win.1': 'If PowerShell reports permission errors (EACCES/EPERM), run the install command as Administrator.',
1564
+ 'docs.tip.win.2': 'If the command is still not found after install, reopen the terminal and run: where codex / where claude / where gemini / where codebuddy.',
1565
+ 'docs.tip.win.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
1566
+ 'docs.tip.unix.1': 'If you hit EACCES, fix your global Node directory permissions instead of using sudo npm.',
1567
+ 'docs.tip.unix.2': 'If the command is not available after install, reopen the terminal and run: which codex / which claude / which gemini / which codebuddy.',
1568
+ 'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).'
1569
+ ,
1570
+
1571
+ // Sessions panel
1572
+ 'sessions.loading': 'Loading...',
1573
+ 'sessions.sourceTitle': 'Session Source',
1574
+ 'sessions.refresh': 'Refresh',
1575
+ 'sessions.refreshing': 'Refreshing...',
1576
+ 'sessions.allPaths': 'All paths',
1577
+ 'sessions.source.codex': 'Codex',
1578
+ 'sessions.source.claudeCode': 'Claude Code',
1579
+ 'sessions.source.gemini': 'Gemini CLI',
1580
+ 'sessions.source.codebuddy': 'CodeBuddy Code',
1581
+ 'sessions.loadingList': 'Loading sessions...',
1582
+ 'sessions.empty': 'No sessions found',
1583
+ 'sessions.unknownTime': 'unknown time',
1584
+ 'sessions.query.placeholder.enabled': 'Search keywords (Codex/Claude/Gemini/CodeBuddy, e.g. claude code)',
1585
+ 'sessions.query.placeholder.disabled': 'Keyword search is not available for this source',
1586
+ 'sessions.pin': 'Pin',
1587
+ 'sessions.unpin': 'Unpin',
1588
+ 'sessions.copyResume': 'Copy resume command',
1589
+ 'sessions.preview.refresh': 'Refresh content',
1590
+ 'sessions.preview.loading': 'Loading...',
1591
+ 'sessions.preview.deleteHard': 'Delete permanently',
1592
+ 'sessions.preview.moveToTrash': 'Move to trash',
1593
+ 'sessions.preview.deleting': 'Deleting...',
1594
+ 'sessions.preview.moving': 'Moving...',
1595
+ 'sessions.preview.export': 'Export',
1596
+ 'sessions.preview.exporting': 'Exporting...',
1597
+ 'sessions.preview.convert': 'Create derived',
1598
+ 'sessions.preview.converting': 'Creating...',
1599
+ 'sessions.preview.convert.loadedOnly': 'Converted loaded messages only',
1600
+ 'sessions.preview.openStandalone': 'Open in new tab',
1601
+ 'sessions.preview.loadingBody': 'Loading session content...',
1602
+ 'sessions.preview.emptyMsgs': 'No messages to display',
1603
+ 'sessions.preview.rendering': 'Rendering session content...',
1604
+ 'sessions.preview.rerender': 'Re-render',
1605
+ 'sessions.preview.preparing': 'Preparing session content...',
1606
+ 'sessions.preview.clipped': 'Showing the latest {count} messages only.',
1607
+ 'sessions.preview.shownCount': 'Shown {shown} / {total}',
1608
+ 'sessions.preview.loadMore': 'Load more (remaining {remain})',
1609
+ 'sessions.preview.loadingMore': 'Loading older messages...'
1610
+ ,
1611
+ 'sessions.timeline.aria': 'Session timeline',
1612
+ 'sessions.selectHint': 'Select a session on the left first',
1613
+ 'sessions.role.all': 'All roles',
1614
+ 'sessions.role.user': 'User only',
1615
+ 'sessions.role.assistant': 'Assistant only',
1616
+ 'sessions.role.system': 'System only',
1617
+ 'sessions.time.all': 'All time',
1618
+ 'sessions.time.7d': 'Last 7 days',
1619
+ 'sessions.time.30d': 'Last 30 days',
1620
+ 'sessions.time.90d': 'Last 90 days'
1621
+ ,
1622
+ 'sessions.sort.time': 'Sort: time',
1623
+ 'sessions.sort.hot': 'Sort: hot',
1624
+ 'sessions.sort.hotBadge': 'Hot'
1625
+ ,
1626
+ 'sessions.filters.copyLink': 'Copy filter link',
1627
+ 'sessions.filters.urlBuildFail': 'Failed to build link',
1628
+ 'sessions.filters.source': 'Source',
1629
+ 'sessions.filters.path': 'Path',
1630
+ 'sessions.filters.keyword': 'Keyword',
1631
+ 'sessions.filters.role': 'Role',
1632
+ 'sessions.filters.time': 'Time',
1633
+ 'sessions.roleLabel.user': 'User',
1634
+ 'sessions.roleLabel.system': 'System',
1635
+ 'sessions.roleLabel.assistant': 'Assistant'
1636
+ ,
1637
+
1638
+ // Usage panel
1639
+ 'usage.overview': 'Usage Overview',
1640
+ 'usage.range.aria': 'Usage time range',
1641
+ 'usage.range.7d': 'Last 7 days',
1642
+ 'usage.range.30d': 'Last 30 days',
1643
+ 'usage.range.all': 'All',
1644
+ 'usage.compare.toggle': 'Compare previous',
1645
+ 'usage.compare.prev': 'Prev',
1646
+ 'usage.compare.delta': 'Delta',
1647
+ 'usage.refresh': 'Refresh stats',
1648
+ 'usage.refreshing': 'Refreshing...',
1649
+ 'usage.loading': 'Loading usage stats...',
1650
+ 'usage.empty': 'No session data available for usage stats',
1651
+ 'usage.refreshOverlay': 'Refreshing…',
1652
+ 'usage.copyTitle': 'Click to copy: {value}',
1653
+ 'usage.copySuccess': 'Copied: {label}',
1654
+ 'usage.copyFail': 'Copy failed',
1655
+ 'usage.copyNone': 'Nothing to copy',
1656
+ 'usage.daily.title': 'Daily usage',
1657
+ 'usage.daily.subtitle': 'Daily aggregated tokens and estimated cost (normalized by max values).',
1658
+ 'usage.daily.note': 'Note: Estimated cost excludes Claude by default; only computed when model pricing and input/output tokens are available.',
1659
+ 'usage.heatmap.title': 'Activity heatmap',
1660
+ 'usage.heatmap.subtitle': 'Aggregated by sessions per day; hover to see details.',
1661
+ 'usage.heatmap.legend.less': 'Less',
1662
+ 'usage.heatmap.legend.more': 'More',
1663
+ 'usage.heatmap.tooltip': '{date} · {sessions} sessions · {messages} messages · {tokens} tokens',
1664
+ 'usage.heatmap.aria': '{date}, {sessions} sessions',
1665
+ 'usage.hourlyHeatmap.title': '7×24 Activity Heatmap',
1666
+ 'usage.hourlyHeatmap.subtitle': 'Session distribution by weekday × hour; darker = more active.',
1667
+ 'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} sessions · {messages} messages · {tokens} tokens',
1668
+ 'usage.hourlyHeatmap.legend.less': 'Less',
1669
+ 'usage.hourlyHeatmap.legend.more': 'More',
1670
+ 'usage.legend.tokens': 'Tokens',
1671
+ 'usage.legend.cost': 'Estimated cost',
1672
+ 'usage.table.date': 'Date',
1673
+ 'usage.table.sessions': 'Sessions',
1674
+ 'usage.table.messages': 'Messages',
1675
+ 'usage.table.tokens': 'Tokens',
1676
+ 'usage.table.cost': 'Estimated cost',
1677
+ 'usage.trend.sessions': 'Session trend',
1678
+ 'usage.trend.messages': 'Message trend',
1679
+ 'usage.trend.activeHours': 'Active hours',
1680
+ 'usage.trend.sources': 'Source insights',
1681
+ 'usage.legend.codex': 'Codex',
1682
+ 'usage.legend.claude': 'Claude',
1683
+ 'usage.trend.sessions.codexTitle': 'Codex {count}',
1684
+ 'usage.trend.sessions.claudeTitle': 'Claude {count}',
1685
+ 'usage.trend.messages.barTitle': '{count} messages',
1686
+ 'usage.hour.title': '{hour}:00 · {count} sessions',
1687
+ 'usage.source.row': '{sessions} sessions · {messages} messages · avg {avg}',
1688
+ 'usage.summary.sessions': 'Total sessions',
1689
+ 'usage.summary.messages': 'Total messages',
1690
+ 'usage.summary.tokens': 'Total tokens',
1691
+ 'usage.summary.contextWindow': 'Total context',
1692
+ 'usage.summary.estimatedCost': 'Estimated cost · {range}',
1693
+ 'usage.estimatedCost.note.excludesClaudePrefix': 'Excludes Claude. ',
1694
+ 'usage.estimatedCost.method.configured': 'Estimated using configured pricing',
1695
+ 'usage.estimatedCost.method.catalog': 'Estimated using public catalog pricing',
1696
+ 'usage.estimatedCost.method.configuredAndCatalog': 'Estimated using configured + public catalog pricing',
1697
+ 'usage.estimatedCost.detail.estimate': '{prefix}{method}. Estimate {estimate}. Coverage {covered}/{total} sessions (~{percent}% tokens).',
1698
+ 'usage.estimatedCost.detail.missing': '{prefix}Missing matching model pricing or token breakdown. Add models.cost or ensure sessions record input/output tokens.',
1699
+ 'usage.summary.activeDuration': 'Active duration',
1700
+ 'usage.summary.activeDuration.title': 'Active span {value}',
1701
+ 'usage.summary.totalDuration': 'Total duration',
1702
+ 'usage.summary.totalDuration.title': 'Overall span {value}',
1703
+ 'usage.summary.activeDays': 'Active days',
1704
+ 'usage.summary.avgMessagesPerSession': 'Avg messages/session',
1705
+ 'usage.summary.busiestDay': 'Busiest day',
1706
+ 'usage.summary.busiestHour': 'Peak hour',
1707
+ 'usage.currentSession.title': 'Current session',
1708
+ 'usage.currentSession.apiDuration': 'API duration',
1709
+ 'usage.currentSession.totalDuration': 'Total duration',
1710
+ 'usage.currentSession.tokens': 'Tokens',
1711
+ 'usage.range.kicker.all': 'All',
1712
+ 'usage.range.kicker.30d': 'Last 30 days',
1713
+ 'usage.range.kicker.7d': 'Last 7 days',
1714
+ 'usage.copyTokenDay': 'Copied: Tokens ({day})',
1715
+ 'usage.copyCostDay': 'Copied: Estimated cost ({day})'
1716
+ ,
1717
+ 'usage.dayDetail.title': '{day} detail',
1718
+ 'usage.dayDetail.subtitle': 'Pick a day to inspect its breakdown.',
1719
+ 'usage.dayDetail.pick': 'Pick a day',
1720
+ 'usage.dayDetail.empty': 'Pick a day to inspect its breakdown.',
1721
+ 'usage.dayDetail.clear': 'Clear',
1722
+ 'usage.dayDetail.topSessions': 'Top sessions',
1723
+ 'usage.dayDetail.topModels': 'Top models'
1724
+ ,
1725
+ 'usage.models.title': 'Models used',
1726
+ 'usage.models.subtitle': 'Only includes model names present in saved records.',
1727
+ 'usage.models.kicker': 'Identified {modeled}/{total}',
1728
+ 'usage.models.count': 'Models',
1729
+ 'usage.models.coverage': 'Coverage',
1730
+ 'usage.models.missing': 'Missing model',
1731
+ 'usage.models.noneTitle': 'No model names found in this range',
1732
+ 'usage.models.noneBody': 'Scanned {total} sessions, but no recognizable model field was found in raw records.',
1733
+ 'usage.models.providerOnly': '{count} older sessions only recorded provider.',
1734
+ 'usage.models.missingNote.providerOnly': '{count} sessions did not record model names and are excluded.',
1735
+ 'usage.models.missingNote': '{count} sessions are missing model and are excluded.',
1736
+ 'usage.models.missingListTitle': 'Sessions still missing model',
1737
+ 'usage.models.chipTitle': '{model} · {sessions} sessions · {messages} messages{tokens}',
1738
+ 'usage.models.meta': '{sessions} sessions · {messages} messages{tokens}',
1739
+ 'usage.weekday.title': 'Weekday distribution',
1740
+ 'usage.paths.title': 'Top paths',
1741
+ 'usage.paths.empty': 'No path data',
1742
+ 'usage.paths.count': '{count} hits',
1743
+ 'usage.paths.meta': '{messages} messages{recent}',
1744
+ 'usage.paths.recent': ' · last {label}',
1745
+ 'usage.recent.title': 'Recently active sessions',
1746
+ 'usage.sessions.empty': 'No session data',
1747
+ 'usage.sessions.messages': '{count} messages',
1748
+ 'usage.sessions.topDensity': 'Most messages'
1749
+ ,
1750
+
1751
+ // Config panel (Codex)
1752
+ 'config.addProvider': 'Add provider',
1753
+ 'config.providerTemplate.title': 'Provider presets',
1754
+ 'config.models': 'Model',
1755
+ 'config.modelLoading': 'Loading...',
1756
+ 'config.models.unlimited': 'No model list available. Enter manually.',
1757
+ 'config.models.error': 'Failed to fetch model list. Enter manually.',
1758
+ 'config.models.notInList.codex': 'Current model is not in the list. Enter manually or edit the template.',
1759
+ 'config.models.notInList.other': 'Current model is not in the list. Enter manually.',
1760
+ 'config.template.editFirst': 'Edit template first, then apply.',
1761
+ 'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
1762
+ 'config.template.openEditor': 'Open template editor',
1763
+ 'modal.configTemplate.title': 'Config template editor (manual confirm)',
1764
+ 'modal.configTemplate.placeholder': 'Edit config.toml template here',
1765
+ 'config.serviceTier': 'Service tier',
1766
+ 'config.serviceTier.fast': 'fast (default)',
1767
+ 'config.serviceTier.standard': 'standard',
1768
+ 'config.serviceTier.hint': 'Only fast writes {field}.',
1769
+ 'config.reasoningEffort': 'Reasoning effort',
1770
+ 'config.reasoningEffort.medium': 'medium (default)',
1771
+ 'config.reasoningEffort.hint': 'Controls reasoning depth; high is deeper.',
1772
+ 'config.contextBudget': 'Compaction thresholds',
1773
+ 'config.reset': 'Reset',
1774
+ 'config.example': 'e.g. {value}',
1775
+ 'config.contextWindow.hint': 'Context window limit (default 190000).',
1776
+ 'config.autoCompact.hint': 'Auto-compaction threshold (default 185000).',
1777
+ 'config.agents.open': 'Open AGENTS.md',
1778
+ 'modal.agents.title.default': 'AGENTS.md editor',
1779
+ 'modal.agents.title.claudeMd': 'CLAUDE.md editor',
1780
+ 'modal.agents.title.openclaw': 'OpenClaw AGENTS.md editor',
1781
+ 'modal.agents.hint.default': 'Saved content will be written to AGENTS.md (next to config.toml).',
1782
+ 'modal.agents.hint.claudeMd': 'Saved content will be written to ~/.claude/CLAUDE.md.',
1783
+ 'modal.agents.contentLabel.claudeMd': 'CLAUDE.md content',
1784
+ 'modal.agents.placeholder.claudeMd': 'Edit CLAUDE.md here',
1785
+ 'modal.agents.hint.openclaw': 'Saved content will be written to OpenClaw workspace AGENTS.md.',
1786
+ 'modal.agents.title.openclawWorkspaceFile': 'OpenClaw workspace file: {fileName}',
1787
+ 'modal.agents.hint.openclawWorkspaceFile': 'Saved content will be written to OpenClaw workspace {fileName}.',
1788
+ 'config.url.unset': 'URL not set',
1789
+ 'config.model.unset': 'Model not set',
1790
+ 'config.badge.system': 'System',
1791
+ 'config.availabilityTest': 'Availability test',
1792
+ 'config.availabilityTestAria': 'Test availability for {name}',
1793
+ 'config.health.title': 'Config health check',
1794
+ 'config.health.run': 'Run check',
1795
+ 'config.health.running': 'Checking...',
1796
+ 'config.health.hint': 'Runs availability probes across all providers and refreshes latency badges.',
1797
+ 'config.health.progress': '{done}/{total} done · {failed} failed',
1798
+ 'config.health.ok': 'Passed',
1799
+ 'config.health.fail': 'Failed',
1800
+ 'config.health.issues': '{count} issues',
1801
+ 'config.shareCommand': 'Share command',
1802
+ 'config.shareDisabled': 'Not shareable'
1803
+ ,
1804
+ 'config.shareCommand.aria': 'Share import command',
1805
+ 'config.provider.edit.aria': 'Edit provider: {name}',
1806
+ 'config.provider.delete.aria': 'Delete provider: {name}',
1807
+ 'app.loadingConfig': 'Loading configuration...'
1808
+ ,
1809
+ 'common.current': 'Current {value}',
1810
+ 'common.notSelected': 'Not selected',
1811
+ 'common.readFromEditor': 'Read from editor',
1812
+ 'common.writeToEditor': 'Write to editor',
1813
+ 'sessions.sourceLabel': 'Source: {value}',
1814
+ 'usage.rangeLabel': 'Range: {value}',
1815
+ 'sessions.source.all': 'All',
1816
+ 'usage.range.all': 'All',
1817
+ 'usage.range.7d.short': 'Last 7 days',
1818
+ 'usage.range.30d.short': 'Last 30 days',
1819
+ 'orchestration.queueStats': 'Queue: {running} running · {queued} queued',
1820
+ 'orchestration.hero.kicker': 'Task orchestration',
1821
+ 'orchestration.hero.title': 'Turn goals into executable steps',
1822
+ 'orchestration.hero.subtitle': 'Write a target, preview a plan, then run.',
1823
+ 'orchestration.draft.reset': 'Reset draft',
1824
+ 'orchestration.summary.aria': 'Task orchestration summary',
1825
+ 'orchestration.summary.running': 'Running',
1826
+ 'orchestration.summary.queued': 'Queued',
1827
+ 'orchestration.summary.runs': 'Runs',
1828
+ 'orchestration.step1.title': 'Start with the outcome',
1829
+ 'orchestration.step1.subtitle': 'Only include what affects execution.',
1830
+ 'orchestration.templates.title': 'Quick examples',
1831
+ 'orchestration.templates.reviewFix.label': 'Review fixes + regression',
1832
+ 'orchestration.templates.reviewFix.target': 'Address current PR review comments and add regression tests',
1833
+ 'orchestration.templates.reviewFix.notes': 'Avoid unrelated refactors; provide verification results',
1834
+ 'orchestration.templates.reviewFix.followUps': 'Handle newly added review comments\nUpdate the PR summary',
1835
+ 'orchestration.templates.planOnly.label': 'Plan only',
1836
+ 'orchestration.templates.planOnly.target': 'Investigate root cause and propose an execution plan without changing code',
1837
+ 'orchestration.templates.planOnly.notes': 'Focus on root cause, blast radius, and risk areas',
1838
+ 'orchestration.templates.workflowBatch.label': 'Workflow batch',
1839
+ 'orchestration.templates.workflowBatch.target': 'Run a fixed set of checks using workflows and summarize results',
1840
+ 'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
1841
+ 'orchestration.templates.workflowBatch.notes': 'Produce a unified conclusion; avoid repetitive narration',
1842
+ 'orchestration.fields.target': 'Target',
1843
+ 'orchestration.fields.target.placeholder': 'e.g. Address PR review comments and add regression tests; avoid unrelated modules',
1844
+ 'orchestration.fields.target.hint': 'One sentence is enough: outcome, constraints, and acceptance criteria.',
1845
+ 'orchestration.engine.codex': 'Codex',
1846
+ 'orchestration.engine.workflow': 'Workflow',
1847
+ 'orchestration.runMode.write': 'Write',
1848
+ 'orchestration.runMode.readOnly': 'Read-only',
1849
+ 'orchestration.runMode.dryRun': 'Dry run',
1850
+ 'orchestration.pills.hasTitle': 'Title set',
1851
+ 'orchestration.pills.workflowCount': 'Workflows {count}',
1852
+ 'orchestration.pills.planNodes': 'Plan {count} nodes',
1853
+ 'orchestration.step2.title': 'Choose how to run',
1854
+ 'orchestration.step2.subtitle': 'Common options are visible; the rest lives under Advanced.',
1855
+ 'orchestration.fields.engine': 'Engine',
1856
+ 'orchestration.fields.runMode': 'Run mode',
1857
+ 'orchestration.advanced.title': 'Advanced',
1858
+ 'orchestration.fields.title': 'Title',
1859
+ 'orchestration.fields.title.placeholder': 'Optional. Defaults to an inferred title from target.',
1860
+ 'orchestration.fields.notes': 'Notes',
1861
+ 'orchestration.fields.notes.placeholder': 'e.g. Do incremental changes only; do not rewrite architecture',
1862
+ 'orchestration.fields.notes.hint': 'Add boundaries, constraints, style rules, or verification requirements.',
1863
+ 'orchestration.fields.followUps': 'Follow-ups (one per line)',
1864
+ 'orchestration.fields.followUps.placeholder': 'e.g.\nAddress new review comments\nAdd regression tests',
1865
+ 'orchestration.fields.concurrency': 'Concurrency',
1866
+ 'orchestration.fields.concurrency.hint': 'Start with 1–2 for complex tasks.',
1867
+ 'orchestration.fields.autoFixRounds': 'Auto-fix',
1868
+ 'orchestration.fields.autoFixRounds.hint': 'Retry a few rounds after failures.',
1869
+ 'orchestration.fields.workflowIds': 'Workflow IDs (one per line)',
1870
+ 'orchestration.fields.workflowIds.placeholder': 'e.g.\ndiagnose-config\nsafe-provider-switch',
1871
+ 'orchestration.fields.workflowIds.hint': 'Required in Workflow mode. {count} available locally.',
1872
+ 'orchestration.workflow.stepCount': '{count} steps',
1873
+ 'orchestration.step3.title': 'Preview, then execute',
1874
+ 'orchestration.step3.subtitle': 'Confirm the plan, then decide to run now or queue.',
1875
+ 'orchestration.actions.planning': 'Planning...',
1876
+ 'orchestration.actions.previewOnly': 'Preview only',
1877
+ 'orchestration.actions.preparing': 'Preparing...',
1878
+ 'orchestration.actions.generatePlan': 'Generate plan',
1879
+ 'orchestration.actions.planAndRun': 'Plan & run',
1880
+ 'orchestration.actions.processing': 'Working...',
1881
+ 'orchestration.actions.queueAndStart': 'Queue & start',
1882
+ 'orchestration.actions.caption': '“Plan & run” refreshes the plan when needed; use “Queue & start” for batch runs.',
1883
+ 'orchestration.stage.title': 'Workspace opens when there is data',
1884
+ 'orchestration.stage.subtitle': 'Write the target first, then preview the plan.',
1885
+ 'orchestration.stage.pill.target': 'Write target',
1886
+ 'orchestration.stage.pill.preview': 'Preview',
1887
+ 'orchestration.stage.pill.run': 'Run or queue',
1888
+ 'orchestration.plan.title': 'Plan preview',
1889
+ 'orchestration.plan.subtitle': 'Confirm nodes, waves, and dependencies.',
1890
+ 'orchestration.plan.summary.nodes': 'Nodes',
1891
+ 'orchestration.plan.summary.waves': 'Waves',
1892
+ 'orchestration.plan.summary.engine': 'Engine',
1893
+ 'orchestration.plan.node.write': 'write',
1894
+ 'orchestration.plan.node.readOnly': 'read-only',
1895
+ 'orchestration.labels.dependencies': 'Dependencies: ',
1896
+ 'orchestration.labels.error': 'Error: ',
1897
+ 'orchestration.workbench.title': 'Workbench',
1898
+ 'orchestration.workbench.subtitle': 'Only expands when there is data.',
1899
+ 'orchestration.queue.start': 'Start queue',
1900
+ 'orchestration.queue.starting': 'Starting...',
1901
+ 'orchestration.workbench.tabs.aria': 'Workbench views',
1902
+ 'orchestration.workbench.tabs.queue': 'Queue {count}',
1903
+ 'orchestration.workbench.tabs.runs': 'Runs {count}',
1904
+ 'orchestration.workbench.tabs.detail': 'Run detail',
1905
+ 'orchestration.queue.empty.title': 'No queued tasks',
1906
+ 'orchestration.queue.empty.subtitle': 'Queue batch tasks first, then start the runner.',
1907
+ 'orchestration.runs.empty.title': 'No runs yet',
1908
+ 'orchestration.runs.empty.subtitle': 'Recent runs will appear after execution.',
1909
+ 'orchestration.detail.refresh': 'Refresh detail',
1910
+ 'orchestration.detail.retry': 'Retry',
1911
+ 'orchestration.detail.retrying': 'Retrying...',
1912
+ 'orchestration.detail.empty.title': 'Select a run to view details',
1913
+ 'orchestration.detail.empty.subtitle': 'This view shows node statuses, summaries, and logs.',
1914
+ 'orchestration.detail.summary.status': 'Status',
1915
+ 'orchestration.detail.summary.duration': 'Duration',
1916
+ 'orchestration.detail.summary.nodes': 'Nodes',
1917
+ 'orchestration.detail.summary.summary': 'Summary',
1918
+ 'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
1919
+ 'skills.localLabel': '{target} / Local skills',
1920
+ 'skills.counts': '{installed} installed · {importable} importable',
1921
+
1922
+ // Sidebar status labels (compact)
1923
+ 'status.currentSource': 'Current source',
1924
+ 'status.sessionCount': 'Sessions',
1925
+ 'status.range': 'Range',
1926
+ 'status.totalSessions': 'Total sessions',
1927
+ 'status.totalMessages': 'Total messages',
1928
+ 'status.engine': 'Engine',
1929
+ 'status.concurrency': 'Concurrency',
1930
+ 'status.running': 'Running',
1931
+ 'status.queued': 'Queued',
1932
+ 'status.runs': 'Runs',
1933
+ 'status.currentTarget': 'Current target',
1934
+ 'status.localSkills': 'Local skills',
1935
+ 'status.importable': 'Importable',
1936
+ 'status.importableDirect': 'Direct importable',
1937
+ 'status.pm': 'Package manager',
1938
+ 'status.action': 'Action',
1939
+ 'status.registry': 'Registry',
1940
+ 'status.claudeConfig': 'Claude config',
1941
+ 'status.claudeModel': 'Claude model',
1942
+ 'status.openclawConfig': 'OpenClaw config',
1943
+ 'status.workspaceFile': 'Workspace file',
1944
+ 'status.configMode': 'Config mode',
1945
+ 'status.currentProvider': 'Current provider',
1946
+ 'status.currentModel': 'Current model',
1947
+ 'status.quickSwitchProvider': 'Quick switch provider'
1948
+ ,
1949
+ 'side.usage.meta': 'Local stats / Trends',
1950
+ 'side.orchestration.meta': 'Plan / Queue / Runs'
1951
+ ,
1952
+
1953
+ // Settings panel
1954
+ 'settings.tab.general': 'General',
1955
+ 'settings.tab.data': 'Data',
1956
+ 'settings.tabs.aria': 'Settings categories',
1957
+ 'settings.sharePrefix.title': 'Share command prefix',
1958
+ 'settings.sharePrefix.meta': 'Used as the prefix for “Copy share command” in the Web UI',
1959
+ 'settings.sharePrefix.label': 'Prefix',
1960
+ 'settings.sharePrefix.hint': 'Defaults to npm start (project-local). You can switch to global codexmate. This setting is stored in the browser.',
1961
+ 'settings.claude.title': 'Claude config',
1962
+ 'settings.claude.meta': 'Backup / import ~/.claude',
1963
+ 'settings.codex.title': 'Codex config',
1964
+ 'settings.codex.meta': 'Backup / import ~/.codex',
1965
+ 'settings.backup.progress': 'Backing up {percent}%',
1966
+ 'settings.backup.oneClickClaude': 'Backup ~/.claude',
1967
+ 'settings.backup.importClaude': 'Import ~/.claude backup',
1968
+ 'settings.backup.oneClickCodex': 'Backup ~/.codex',
1969
+ 'settings.backup.importCodex': 'Import ~/.codex backup',
1970
+ 'settings.importing': 'Importing...',
1971
+
1972
+ 'settings.deleteBehavior.title': 'Session deletion behavior',
1973
+ 'settings.deleteBehavior.meta': 'Whether “Delete” moves to trash first',
1974
+ 'settings.deleteBehavior.toggle': 'Move deleted sessions to trash first',
1975
+ 'settings.deleteBehavior.hint': 'Enabled by default. If disabled, deleting a session will permanently delete it.',
1976
+
1977
+ 'settings.trash.title': 'Trash',
1978
+ 'settings.trash.meta': 'Deleted sessions (restore / purge)',
1979
+ 'settings.trash.refresh': 'Refresh',
1980
+ 'settings.trash.refreshing': 'Refreshing...',
1981
+ 'settings.trash.clear': 'Empty trash',
1982
+ 'settings.trash.clearing': 'Clearing...',
1983
+ 'settings.trash.loading': 'Loading trash...',
1984
+ 'settings.trash.empty': 'Trash is empty',
1985
+ 'settings.trash.retry': 'Failed to load trash. Refresh to retry.',
1986
+ 'settings.trash.restore': 'Restore',
1987
+ 'settings.trash.restoring': 'Restoring...',
1988
+ 'settings.trash.purge': 'Purge',
1989
+ 'settings.trash.purging': 'Deleting...',
1990
+ 'settings.trash.workspace': 'Workspace',
1991
+ 'settings.trash.originalFile': 'Original file',
1992
+ 'settings.trash.loadMore': 'Load more (remaining {count})',
1993
+ 'settings.trash.retention': 'Auto-purge',
1994
+ 'settings.trash.retentionMeta': 'Trash entries older than retention days are auto-purged',
1995
+ 'settings.trash.retentionLabel': 'Retention days',
1996
+ 'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',
1997
+
1998
+ 'settings.templateConfirm.title': 'Template apply confirmation',
1999
+ 'settings.templateConfirm.meta': 'Reduce accidental writes',
2000
+ 'settings.templateConfirm.toggle': 'Preview diffs before apply (Confirm Apply)',
2001
+ 'settings.templateConfirm.hint': 'When enabled: show a diff preview first, then confirm writing.',
2002
+
2003
+ 'settings.reset.title': 'Config reset',
2004
+ 'settings.reset.meta': 'Proceed with caution',
2005
+ 'settings.reset.hint': 'Backs up config.toml, then writes default config.',
2006
+ 'settings.reset.button': 'Reset config',
2007
+ 'settings.reset.loading': 'Resetting...'
2008
+ ,
2009
+
2010
+ // Market (Skills)
2011
+ 'market.title': 'Skills Overview',
2012
+ 'market.subtitle': 'Switch target and inspect local skills.',
2013
+ 'market.refresh': 'Refresh overview',
2014
+ 'market.refreshing': 'Refreshing...',
2015
+ 'market.openManager': 'Open Skills manager',
2016
+ 'market.target.aria': 'Select skills target',
2017
+ 'market.summary.target': 'Target',
2018
+ 'market.summary.total': 'Local total',
2019
+ 'market.summary.configured': 'With SKILL.md',
2020
+ 'market.summary.missing': 'Missing SKILL.md',
2021
+ 'market.summary.importable': 'Importable',
2022
+ 'market.summary.importableDirect': 'Direct importable',
2023
+ 'market.root.fallback': 'Default path',
2024
+
2025
+ 'market.installed.title': 'Installed skills',
2026
+ 'market.installed.note': 'Showing top 6 only.',
2027
+ 'market.local.refresh': 'Refresh local',
2028
+ 'market.local.refreshing': 'Refreshing...',
2029
+ 'market.local.loading': 'Loading local skills...',
2030
+ 'market.local.empty': 'No installed skills found.',
2031
+ 'market.pill.verified': 'Verified',
2032
+ 'market.pill.missingSkill': 'Missing SKILL.md',
2033
+
2034
+ 'market.import.title': 'Import sources',
2035
+ 'market.import.note': 'Scan and import into {target}.',
2036
+ 'market.import.scan': 'Scan sources',
2037
+ 'market.import.scanning': 'Scanning...',
2038
+ 'market.import.loading': 'Scanning importable skills...',
2039
+ 'market.import.empty': 'No importable skills found yet.',
2040
+ 'market.pill.importableDirect': 'Direct import',
2041
+ 'market.pill.importMissing': 'Missing SKILL.md',
2042
+
2043
+ 'market.actions.title': 'Distribution',
2044
+ 'market.actions.note': 'Actions apply to the current target.',
2045
+ 'market.action.manage.title': 'Manage local skills',
2046
+ 'market.action.manage.copy': 'Manage installed skills for {target}',
2047
+ 'market.action.crossImport.title': 'Cross-app import',
2048
+ 'market.action.crossImport.copy': 'Import into {target}',
2049
+ 'market.action.zipImport.title': 'ZIP import',
2050
+ 'market.action.zipImport.copy': 'Import from ZIP into target',
2051
+
2052
+ 'market.help.title': 'How it works',
2053
+ 'market.help.target.title': 'Target switch',
2054
+ 'market.help.target.copy': 'Actions write into the {target} directory.',
2055
+ 'market.help.crossImport.title': 'Cross-app import',
2056
+ 'market.help.crossImport.copy': 'Import unmanaged skills from other hosts.',
2057
+ 'market.help.zipImport.title': 'ZIP import',
2058
+ 'market.help.zipImport.copy': 'Import local skills from a ZIP file.'
2059
+ ,
2060
+
2061
+ // Claude config panel
2062
+ 'claude.addProvider': 'Add provider',
2063
+ 'claude.applyDefault': 'Applies to ~/.claude/settings.json by default.',
2064
+ 'claude.presetProviders': 'Provider presets',
2065
+ 'claude.customConfig': 'Custom config',
2066
+ 'claude.model': 'Model',
2067
+ 'claude.model.placeholder': 'e.g. claude-3-7-sonnet',
2068
+ 'claude.model.hint': 'Model changes are saved and applied to the current config automatically.',
2069
+ 'claude.health.title': 'Config health check',
2070
+ 'claude.health.run': 'Run check',
2071
+ 'claude.health.running': 'Checking...',
2072
+ 'claude.health.hint': 'Runs availability probes for all Claude configs and refreshes the latency badges.',
2073
+ 'claude.health.progress': '{done}/{total} done · {failed} failed',
2074
+ 'claude.md.title': 'CLAUDE.md',
2075
+ 'claude.md.open': 'Open CLAUDE.md',
2076
+ 'claude.md.hint': 'Read/write ~/.claude/CLAUDE.md.',
2077
+ 'claude.model.unset': 'Model not set',
2078
+ 'claude.configured': 'Configured',
2079
+ 'claude.notConfigured': 'Not configured',
2080
+ 'claude.action.edit': 'Edit',
2081
+ 'claude.action.delete': 'Delete',
2082
+ 'claude.action.shareDisabled': 'Share import command (disabled)'
2083
+ ,
2084
+ 'claude.action.editAria': 'Edit Claude config: {name}',
2085
+ 'claude.action.deleteAria': 'Delete Claude config: {name}',
2086
+
2087
+ // OpenClaw config panel
2088
+ 'openclaw.applyHint': 'Writes to ~/.openclaw/openclaw.json (JSON5 supported).',
2089
+ 'openclaw.agents.hint': 'Read/write Workspace AGENTS.md. Default: ~/.openclaw/workspace/AGENTS.md.',
2090
+ 'openclaw.agents.open': 'Open AGENTS.md',
2091
+ 'openclaw.workspaceFile': 'Workspace file',
2092
+ 'openclaw.workspace.placeholder': 'e.g. SOUL.md',
2093
+ 'openclaw.workspace.hint': 'Only .md files inside the Workspace are supported.',
2094
+ 'openclaw.workspace.open': 'Open workspace file',
2095
+ 'openclaw.configured': 'Configured',
2096
+ 'openclaw.notConfigured': 'Not configured',
2097
+ 'openclaw.action.edit': 'Edit',
2098
+ 'openclaw.action.delete': 'Delete',
2099
+ 'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
2100
+ 'modal.openclaw.quick.step2': 'Write to editor',
2101
+ 'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.'
2102
+ ,
2103
+ 'openclaw.action.editAria': 'Edit OpenClaw config: {name}',
2104
+ 'openclaw.action.deleteAria': 'Delete OpenClaw config: {name}'
2105
+ }
2106
+ });
2107
+
2108
+ export { DICT };
2109
+ export default DICT;