@foxian/esl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api-error.d.ts +13 -0
  3. package/dist/api-error.js +31 -0
  4. package/dist/bin/esl.d.ts +35 -0
  5. package/dist/bin/esl.js +1033 -0
  6. package/dist/builtin/builtin-packages.json +11 -0
  7. package/dist/builtin/esl-operator/SKILL.md +65 -0
  8. package/dist/builtin/esl-operator/references/agent-interaction.md +110 -0
  9. package/dist/builtin/esl-operator/references/author.md +98 -0
  10. package/dist/builtin/esl-operator/references/consumer.md +109 -0
  11. package/dist/builtin/esl-operator/references/setup.md +41 -0
  12. package/dist/builtin/esl-operator/skill.json +7 -0
  13. package/dist/builtin-dir.d.ts +1 -0
  14. package/dist/builtin-dir.js +11 -0
  15. package/dist/commands/adapt.d.ts +8 -0
  16. package/dist/commands/adapt.js +27 -0
  17. package/dist/commands/admin.d.ts +11 -0
  18. package/dist/commands/admin.js +96 -0
  19. package/dist/commands/clone.d.ts +10 -0
  20. package/dist/commands/clone.js +21 -0
  21. package/dist/commands/config.d.ts +8 -0
  22. package/dist/commands/config.js +19 -0
  23. package/dist/commands/delete.d.ts +13 -0
  24. package/dist/commands/delete.js +51 -0
  25. package/dist/commands/deprecate.d.ts +16 -0
  26. package/dist/commands/deprecate.js +29 -0
  27. package/dist/commands/import.d.ts +14 -0
  28. package/dist/commands/import.js +21 -0
  29. package/dist/commands/info.d.ts +28 -0
  30. package/dist/commands/info.js +69 -0
  31. package/dist/commands/init.d.ts +28 -0
  32. package/dist/commands/init.js +252 -0
  33. package/dist/commands/install.d.ts +17 -0
  34. package/dist/commands/install.js +435 -0
  35. package/dist/commands/link.d.ts +11 -0
  36. package/dist/commands/link.js +170 -0
  37. package/dist/commands/list.d.ts +6 -0
  38. package/dist/commands/list.js +7 -0
  39. package/dist/commands/login.d.ts +20 -0
  40. package/dist/commands/login.js +132 -0
  41. package/dist/commands/logout.d.ts +6 -0
  42. package/dist/commands/logout.js +18 -0
  43. package/dist/commands/network-options.d.ts +27 -0
  44. package/dist/commands/network-options.js +133 -0
  45. package/dist/commands/notes.d.ts +10 -0
  46. package/dist/commands/notes.js +24 -0
  47. package/dist/commands/publish.d.ts +19 -0
  48. package/dist/commands/publish.js +271 -0
  49. package/dist/commands/release-delete.d.ts +21 -0
  50. package/dist/commands/release-delete.js +34 -0
  51. package/dist/commands/release-manifest.d.ts +5 -0
  52. package/dist/commands/release-manifest.js +23 -0
  53. package/dist/commands/rename.d.ts +5 -0
  54. package/dist/commands/rename.js +25 -0
  55. package/dist/commands/repair-tag.d.ts +5 -0
  56. package/dist/commands/repair-tag.js +14 -0
  57. package/dist/commands/reset-source.d.ts +16 -0
  58. package/dist/commands/reset-source.js +71 -0
  59. package/dist/commands/resolve-unlink-identity.d.ts +14 -0
  60. package/dist/commands/resolve-unlink-identity.js +47 -0
  61. package/dist/commands/search.d.ts +19 -0
  62. package/dist/commands/search.js +33 -0
  63. package/dist/commands/share.d.ts +17 -0
  64. package/dist/commands/share.js +56 -0
  65. package/dist/commands/source.d.ts +10 -0
  66. package/dist/commands/source.js +34 -0
  67. package/dist/commands/status.d.ts +16 -0
  68. package/dist/commands/status.js +77 -0
  69. package/dist/commands/sync-builtin.d.ts +10 -0
  70. package/dist/commands/sync-builtin.js +68 -0
  71. package/dist/commands/tools.d.ts +19 -0
  72. package/dist/commands/tools.js +73 -0
  73. package/dist/commands/uninstall.d.ts +19 -0
  74. package/dist/commands/uninstall.js +75 -0
  75. package/dist/commands/unlink.d.ts +14 -0
  76. package/dist/commands/unlink.js +108 -0
  77. package/dist/commands/update.d.ts +18 -0
  78. package/dist/commands/update.js +176 -0
  79. package/dist/commands/upload.d.ts +27 -0
  80. package/dist/commands/upload.js +446 -0
  81. package/dist/commands/use.d.ts +9 -0
  82. package/dist/commands/use.js +51 -0
  83. package/dist/commands/validate.d.ts +4 -0
  84. package/dist/commands/validate.js +8 -0
  85. package/dist/commands/version.d.ts +16 -0
  86. package/dist/commands/version.js +147 -0
  87. package/dist/commands/whoami.d.ts +14 -0
  88. package/dist/commands/whoami.js +54 -0
  89. package/dist/index.d.ts +24 -0
  90. package/dist/index.js +24 -0
  91. package/dist/output.d.ts +1 -0
  92. package/dist/output.js +3 -0
  93. package/dist/postinstall.d.ts +1 -0
  94. package/dist/postinstall.js +8 -0
  95. package/dist/prompt.d.ts +9 -0
  96. package/dist/prompt.js +24 -0
  97. package/dist/vendor/core/adapt/adapt-engine.d.ts +24 -0
  98. package/dist/vendor/core/adapt/adapt-engine.js +99 -0
  99. package/dist/vendor/core/adapt/adapted-skill-copy.d.ts +2 -0
  100. package/dist/vendor/core/adapt/adapted-skill-copy.js +17 -0
  101. package/dist/vendor/core/adapt/claude-adapter.d.ts +8 -0
  102. package/dist/vendor/core/adapt/claude-adapter.js +19 -0
  103. package/dist/vendor/core/adapt/codex-adapter.d.ts +8 -0
  104. package/dist/vendor/core/adapt/codex-adapter.js +19 -0
  105. package/dist/vendor/core/adapt/index.d.ts +2 -0
  106. package/dist/vendor/core/adapt/index.js +2 -0
  107. package/dist/vendor/core/adapt/tool-adapter.d.ts +12 -0
  108. package/dist/vendor/core/adapt/tool-adapter.js +1 -0
  109. package/dist/vendor/core/adapt/trae-adapter.d.ts +8 -0
  110. package/dist/vendor/core/adapt/trae-adapter.js +19 -0
  111. package/dist/vendor/core/adapt/trae-cn-adapter.d.ts +8 -0
  112. package/dist/vendor/core/adapt/trae-cn-adapter.js +19 -0
  113. package/dist/vendor/core/agent-interaction.d.ts +58 -0
  114. package/dist/vendor/core/agent-interaction.js +58 -0
  115. package/dist/vendor/core/command-params.d.ts +5 -0
  116. package/dist/vendor/core/command-params.js +46 -0
  117. package/dist/vendor/core/index.d.ts +22 -0
  118. package/dist/vendor/core/index.js +22 -0
  119. package/dist/vendor/core/link/skill-links.d.ts +38 -0
  120. package/dist/vendor/core/link/skill-links.js +245 -0
  121. package/dist/vendor/core/link/tool-links.d.ts +83 -0
  122. package/dist/vendor/core/link/tool-links.js +376 -0
  123. package/dist/vendor/core/org/account-policy.d.ts +8 -0
  124. package/dist/vendor/core/org/account-policy.js +57 -0
  125. package/dist/vendor/core/org/org-name.d.ts +2 -0
  126. package/dist/vendor/core/org/org-name.js +22 -0
  127. package/dist/vendor/core/org/standing-teams.d.ts +10 -0
  128. package/dist/vendor/core/org/standing-teams.js +27 -0
  129. package/dist/vendor/core/schema/compatibility.d.ts +17 -0
  130. package/dist/vendor/core/schema/compatibility.js +45 -0
  131. package/dist/vendor/core/schema/release-manifest.d.ts +88 -0
  132. package/dist/vendor/core/schema/release-manifest.js +161 -0
  133. package/dist/vendor/core/schema/skill-json.d.ts +61 -0
  134. package/dist/vendor/core/schema/skill-json.js +47 -0
  135. package/dist/vendor/core/schema/validation-result.d.ts +7 -0
  136. package/dist/vendor/core/schema/validation-result.js +1 -0
  137. package/dist/vendor/core/skill/builtin-package.d.ts +32 -0
  138. package/dist/vendor/core/skill/builtin-package.js +143 -0
  139. package/dist/vendor/core/skill/directory-validator.d.ts +9 -0
  140. package/dist/vendor/core/skill/directory-validator.js +72 -0
  141. package/dist/vendor/core/skill/import-skill.d.ts +10 -0
  142. package/dist/vendor/core/skill/import-skill.js +68 -0
  143. package/dist/vendor/core/skill/published-package.d.ts +1 -0
  144. package/dist/vendor/core/skill/published-package.js +9 -0
  145. package/dist/vendor/core/skill/skill-md.d.ts +15 -0
  146. package/dist/vendor/core/skill/skill-md.js +32 -0
  147. package/dist/vendor/core/store/file-copy.d.ts +3 -0
  148. package/dist/vendor/core/store/file-copy.js +102 -0
  149. package/dist/vendor/core/store/local-store.d.ts +43 -0
  150. package/dist/vendor/core/store/local-store.js +104 -0
  151. package/dist/vendor/core/store/skill-store.d.ts +24 -0
  152. package/dist/vendor/core/store/skill-store.js +41 -0
  153. package/dist/vendor/core/store/skills-json.d.ts +34 -0
  154. package/dist/vendor/core/store/skills-json.js +146 -0
  155. package/dist/vendor/core/version/select-version.d.ts +16 -0
  156. package/dist/vendor/core/version/select-version.js +34 -0
  157. package/dist/vendor/core/version/version.d.ts +2 -0
  158. package/dist/vendor/core/version/version.js +25 -0
  159. package/dist/vendor/i18n/api-errors.d.ts +121 -0
  160. package/dist/vendor/i18n/api-errors.js +240 -0
  161. package/dist/vendor/i18n/i18n-runtime.d.ts +4 -0
  162. package/dist/vendor/i18n/i18n-runtime.js +16 -0
  163. package/dist/vendor/i18n/index.d.ts +5 -0
  164. package/dist/vendor/i18n/index.js +5 -0
  165. package/dist/vendor/i18n/locales.d.ts +9 -0
  166. package/dist/vendor/i18n/locales.js +33 -0
  167. package/dist/vendor/i18n/resources.d.ts +11 -0
  168. package/dist/vendor/i18n/resources.js +925 -0
  169. package/dist/vendor/i18n/translate-api-error.d.ts +8 -0
  170. package/dist/vendor/i18n/translate-api-error.js +12 -0
  171. package/dist/version.d.ts +1 -0
  172. package/dist/version.js +24 -0
  173. package/package.json +46 -0
@@ -0,0 +1,925 @@
1
+ import { apiErrorMessages, apiErrorMessagesZhCN } from './api-errors.js';
2
+ const zhCN = {
3
+ common: {
4
+ cancel: '取消',
5
+ confirm: '确认',
6
+ save: '保存',
7
+ loading: '加载中...',
8
+ workspace: 'ESL工作台',
9
+ platformAdministrator: '超级管理员',
10
+ user: '用户',
11
+ organizationManagement: '组织管理:{{orgs}}',
12
+ changePassword: '修改密码',
13
+ signOut: '退出登录'
14
+ },
15
+ auth: {
16
+ login: '登录',
17
+ brand: 'ESL 技能库',
18
+ adminSignIn: '管理后台登录',
19
+ username: '用户名',
20
+ password: '密码',
21
+ credentialsRequired: '请输入用户名与密码',
22
+ usernameRequired: '请输入用户名',
23
+ forgotPassword: '忘记密码?',
24
+ registerLink: '没有账号?注册个人账号'
25
+ },
26
+ registration: {
27
+ title: '注册 ESL 账号',
28
+ subtitle: '注册即拥有个人命名空间 @用户名',
29
+ username: '用户名',
30
+ usernamePlaceholder: '小写字母、数字、连字符',
31
+ email: '用户邮箱',
32
+ emailPlaceholder: '联系邮箱,同时用于 Git 提交匹配',
33
+ password: '密码',
34
+ confirmPassword: '确认密码',
35
+ submit: '注册',
36
+ credentialsRequired: '请输入用户名、用户邮箱与密码',
37
+ passwordsDoNotMatch: '两次输入的密码不一致',
38
+ pendingTitle: '注册已提交,等待管理员审批',
39
+ pendingSubtitle: '账号 {{username}} 创建后需平台管理员批准后方可登录。',
40
+ emailVerificationPendingTitle: '请查收验证邮件',
41
+ emailVerificationPendingSubtitle: '验证邮件已发送到 {{email}},完成验证后账号 {{username}} 才能激活。',
42
+ resendVerification: '重新发送验证邮件',
43
+ successTitle: '注册成功',
44
+ successSubtitle: '账号 {{username}} 已可登录,个人命名空间 @{{username}} 已就绪。',
45
+ goToLogin: '前往登录',
46
+ existingAccount: '已有账号?去登录'
47
+ },
48
+ nav: {
49
+ platformOverview: '平台概览',
50
+ orgManagement: '组织管理',
51
+ orgApplications: '组织申请审批',
52
+ userRegistrations: '用户注册审批',
53
+ userManagement: '用户管理',
54
+ skillOverview: '技能总览',
55
+ platformSettings: '平台设置',
56
+ overview: '概览',
57
+ myOrganizations: '我的组织',
58
+ skills: '技能',
59
+ invitations: '邀请',
60
+ orgMembers: '成员管理',
61
+ orgTeams: '团队管理'
62
+ },
63
+ password: {
64
+ title: '修改密码',
65
+ current: '当前密码',
66
+ new: '新密码',
67
+ confirm: '确认新密码',
68
+ confirmPlaceholder: '再次输入新密码',
69
+ submit: '确认修改',
70
+ required: '请填写当前密码,并确保两次新密码一致',
71
+ changed: '密码已修改'
72
+ },
73
+ routes: {
74
+ platformOverview: '平台概览',
75
+ platformOverviewDescription: '组织、审批与技能资源的实时汇总',
76
+ orgManagement: '组织管理',
77
+ orgManagementDescription: '查看平台内全部组织的生命周期与资源概况',
78
+ orgDetail: '组织详情',
79
+ orgApplications: '组织申请审批',
80
+ orgApplicationsDescription: '处理组织注册申请,批准即同步开通组织资源',
81
+ userRegistrations: '用户注册审批',
82
+ userRegistrationsDescription: '审批待激活的平台账号(approval 注册模式)',
83
+ userManagement: '用户管理',
84
+ userManagementDescription: '管理机构账号的邮箱、启用状态与建号生命周期',
85
+ skillOverview: '技能总览',
86
+ skillOverviewDescription: '跨组织查看全部技能(含未发布)并代管权限',
87
+ skillManagement: '技能管理',
88
+ skillManagementDescription: '本组织命名空间下的技能与它们的共享范围',
89
+ platformSettings: '平台设置',
90
+ platformSettingsDescription: '配置组织注册的审批模式与平台级策略',
91
+ overview: '概览',
92
+ overviewDescription: '待办、我的组织与我管理的技能',
93
+ myOrganizations: '我的组织',
94
+ myOrganizationsDescription: '创建组织、查看我在每个组织中的身份',
95
+ orgMembers: '成员管理',
96
+ orgMembersDescription: '管理本组织成员,移出即自动离开全部技能授权团队',
97
+ orgTeams: '团队管理',
98
+ orgTeamsDescription: '自定义团队按技能授权;常设团队由平台维护',
99
+ skills: '技能',
100
+ skillsDescription: '跨命名空间聚合:个人与所有所在组织的技能',
101
+ invitations: '邀请',
102
+ invitationsDescription: '待你回应的组织邀请'
103
+ },
104
+ columns: {
105
+ organizationName: '组织名',
106
+ organization: '组织',
107
+ applicant: '申请人',
108
+ appliedAt: '申请时间',
109
+ submittedAt: '提交时间',
110
+ status: '状态',
111
+ actions: '操作',
112
+ namespace: '命名空间',
113
+ identity: '身份',
114
+ myIdentity: '我的身份',
115
+ lifecycle: '生命周期',
116
+ memberCount: '成员数',
117
+ skillCount: '技能数',
118
+ createdAt: '创建时间',
119
+ member: '成员',
120
+ invitedUser: '被邀请人',
121
+ inviter: '邀请人',
122
+ identifier: '标识名',
123
+ displayName: '显示名',
124
+ type: '类型',
125
+ permission: '权限',
126
+ version: '版本',
127
+ releasedAt: '发布时间',
128
+ notes: '发布说明',
129
+ sourceCommit: '来源 commit',
130
+ publisher: '发布人',
131
+ ownerRelation: '归属关系',
132
+ shareStatus: '共享状态',
133
+ myPermission: '我的权限'
134
+ },
135
+ actions: {
136
+ approve: '批准',
137
+ reject: '拒绝',
138
+ cancel: '取消',
139
+ all: '全部',
140
+ manage: '管理',
141
+ details: '详情',
142
+ remove: '移除',
143
+ delete: '删除',
144
+ edit: '编辑',
145
+ create: '创建',
146
+ submit: '提交申请',
147
+ assign: '指派',
148
+ close: '知道了',
149
+ accept: '接受',
150
+ revoke: '撤销',
151
+ add: '添加',
152
+ addMember: '添加成员',
153
+ addAuthorization: '添加授权',
154
+ sendInvite: '发送邀请',
155
+ viewSkills: '查看技能',
156
+ viewProgress: '查看进度',
157
+ retryDelete: '重试删除',
158
+ leaveOrganization: '退出组织',
159
+ confirmLeave: '确认退出',
160
+ confirmRemove: '确认移出',
161
+ confirmDelete: '确认删除',
162
+ expandReleases: '展开全部 Skill Release'
163
+ },
164
+ status: {
165
+ notManaged: '未纳管',
166
+ pending: '待审批',
167
+ active: '已激活',
168
+ failed: '开通失败',
169
+ rejected: '已拒绝',
170
+ cancelled: '已取消',
171
+ expired: '已过期',
172
+ deleting: '删除中',
173
+ deleteFailed: '删除失败',
174
+ deleted: '已删除',
175
+ approved: '已批准',
176
+ published: '已发布',
177
+ unpublished: '未发布',
178
+ archived: '已归档',
179
+ yes: '是',
180
+ no: '否',
181
+ none: '无',
182
+ bootstrapReady: 'Bootstrap 就绪',
183
+ bootstrapNotReady: 'Bootstrap 未就绪'
184
+ },
185
+ orgIdentity: {
186
+ ordinary: '普通成员',
187
+ managing: '管理成员',
188
+ owner: '所有者成员',
189
+ promoteManaging: '提为管理成员',
190
+ promoteOwner: '提为所有者成员'
191
+ },
192
+ organization: {
193
+ myOrganizations: '我所在的组织',
194
+ createOrganization: '创建组织',
195
+ applyCreateOrganization: '申请创建组织',
196
+ noOrganizations: '你还没有加入任何组织',
197
+ orgName: '组织名',
198
+ orgNamePlaceholder: '小写字母、数字与连字符',
199
+ enterOrgNameToConfirm: '请输入组织名以确认删除',
200
+ enterOrgName: '请输入组织名',
201
+ total: '共 {{count}} 个组织',
202
+ dangerTitle: '危险操作',
203
+ deleteWarning: '删除组织将移除其全部技能仓库与关联数据(成员是全局账号,不受影响),操作不可恢复。',
204
+ deleteRetryHint: '删除失败时可再次点击删除重试。',
205
+ deleteReleasedNameHint: '组织名会在删除完成后回到名字池,可被重新占用。',
206
+ permanentlyDelete: '彻底删除组织',
207
+ confirmTitle: '二次确认',
208
+ confirmDeleteWarning: '即将删除组织 {{org}} 及其全部数据,该操作不可恢复。确认继续?',
209
+ orgDeleted: '组织 {{org}} 已删除',
210
+ failedReason: '失败原因:{{reason}}',
211
+ lastDeleteFailedRetry: '上次删除失败,可以重试',
212
+ membersTitle: '成员',
213
+ noMembers: '组织暂无成员',
214
+ lastOwnerDisabled: '组织必须至少保留一名所有者成员',
215
+ ownerAirdropTitle: '指派所有者成员',
216
+ ownerAirdropHint: '用于组织里没有可用管理者时:把任何已注册账号设为该组织的所有者成员。',
217
+ ownerAirdropDetail: '对方若还不在组织内,会同时被加入组织并进入三个技能授权团队与 org-managers。',
218
+ globalUsernamePlaceholder: '对方的全局账号用户名',
219
+ demoteToOrdinary: '收回为普通成员',
220
+ promoteToManaging: '提为管理成员',
221
+ promoteToOwner: '提为所有者成员',
222
+ identityChanged: '{{username}} 现在是{{identity}}',
223
+ approvalCreationHint: '当前平台为审批制:提交申请后由平台管理员审批,通过即开通,你自动成为所有者成员。',
224
+ manualCreationHint: '组织创建后即时开通,你自动成为所有者成员。',
225
+ applicationSubmitted: '组织申请 {{org}} 已提交,等待平台管理员审批',
226
+ orgCreated: '组织 {{org}} 已创建',
227
+ ownerAssigned: '{{username}} 已成为所有者成员',
228
+ memberRemoved: '成员 {{username}} 已移出组织',
229
+ usernameRequired: '请输入用户名'
230
+ },
231
+ orgApproval: {
232
+ filterByStatus: '按状态筛选申请',
233
+ provisionedTitle: '组织开通',
234
+ provisionedDetail: '组织 {{org}} 已同步开通,申请人已加入该组织并成为所有者成员(无需初始密码:成员是全局账号,用自己的凭据登录)。',
235
+ applicationRejected: '已拒绝 {{org}} 的注册申请',
236
+ applicationCancelled: '已取消 {{org}} 的注册申请',
237
+ registrationApproved: '已批准 {{username}} 的注册',
238
+ registrationRejected: '已拒绝 {{username}} 的注册'
239
+ },
240
+ settings: {
241
+ userRegistrationMode: '用户注册模式',
242
+ openRegistration: '开放注册(注册即可用)',
243
+ approvalRegistration: '需要审批(批准后激活)',
244
+ approvalRegistrationHint: '审批模式下账号注册后处于待审批状态,在「注册审批」中批准或拒绝。',
245
+ adminProvisionedPasswordChangePolicy: '建号首登改密策略',
246
+ forceAdminPasswordChange: '强制首次登录修改密码(推荐)',
247
+ allowAdminInitialPassword: '允许持续使用初始密码',
248
+ adminProvisionedPasswordChangePolicyHint: '策略只影响之后新建的用户;既有用户保留建号时的快照。',
249
+ orgRegistrationMode: '组织注册审批模式',
250
+ autoOrgRegistration: '免审批(即时创建)',
251
+ manualOrgRegistration: '需要审批',
252
+ autoOrgRegistrationHint: '免审批时任何注册用户可即时创建组织;需要审批时走组织注册申请。',
253
+ memberAdditionMode: '拉人方式',
254
+ directAddition: '直接添加(即时入组)',
255
+ invitationMode: '邀请制(对方接受后入组)',
256
+ emailVerification: '注册邮箱验证',
257
+ emailVerificationOff: '关闭',
258
+ emailVerificationOn: '开启',
259
+ emailVerificationHint: '仅开放注册模式生效;开启后用户点击邮件链接后才会创建并激活账号。',
260
+ smtpSectionTitle: '出站邮件(SMTP)',
261
+ smtpSectionHint: '开启注册邮箱验证后可配置;用于验证邮件与找回密码。163 邮箱请用端口 465。',
262
+ smtpHost: 'SMTP 主机',
263
+ smtpPort: 'SMTP 端口',
264
+ smtpUsername: 'SMTP 用户名',
265
+ smtpPassword: 'SMTP 密码或授权码',
266
+ smtpPasswordUnchanged: '已配置,留空表示保持不变',
267
+ smtpFrom: '发件人地址',
268
+ saved: '平台设置已保存'
269
+ },
270
+ userManagement: {
271
+ search: '查询',
272
+ searchPlaceholder: '按用户名或用户邮箱查询',
273
+ allStatuses: '全部状态',
274
+ enabled: '已启用',
275
+ disabled: '已禁用',
276
+ email: '用户邮箱',
277
+ emailPendingCompletion: '邮箱待补全',
278
+ provisionUser: '用户建号',
279
+ initialPassword: '初始密码',
280
+ disable: '禁用',
281
+ enable: '启用',
282
+ editEmail: '修改邮箱',
283
+ provisioned: '用户已建号并立即激活',
284
+ disabledMessage: '用户 {{username}} 已禁用,既有登录态已失效',
285
+ enabledMessage: '用户 {{username}} 已启用,请重新登录',
286
+ emailChanged: '用户邮箱已修改'
287
+ },
288
+ profile: {
289
+ emailTitle: '用户邮箱',
290
+ emailPendingHint: '当前仍是历史合成邮箱,请补全真实且唯一的用户邮箱;这不会阻断平台使用。',
291
+ newEmail: '新用户邮箱',
292
+ currentPassword: '当前密码',
293
+ saveEmail: '更新邮箱',
294
+ emailChanged: '用户邮箱已更新',
295
+ emailPendingVerification: '新邮箱待验证',
296
+ emailVerificationSent: '验证邮件已发送,请查收新邮箱'
297
+ },
298
+ verification: {
299
+ failedTitle: '邮箱验证失败',
300
+ successTitle: '邮箱验证成功',
301
+ successSubtitle: '账号 {{username}} 已激活,可以登录。'
302
+ },
303
+ passwordReset: {
304
+ requestSubtitle: '输入用户名,我们会向已绑定邮箱发送重置链接。',
305
+ requestSubmit: '发送重置邮件',
306
+ requestSentTitle: '请求已受理',
307
+ requestSentSubtitle: '如果账号符合条件,重置链接将发送到绑定邮箱,请查收邮件。',
308
+ backToLogin: '返回登录',
309
+ submit: '重置密码',
310
+ successTitle: '密码已重置',
311
+ passwordMismatch: '请填写新密码,并确保两次输入一致'
312
+ },
313
+ dashboard: {
314
+ totalOrganizations: '组织总数',
315
+ pendingApplications: '待审批申请',
316
+ totalSkills: '平台技能总数',
317
+ platformStatus: '平台状态',
318
+ adminToken: '管理员 Token',
319
+ platformRepository: '平台仓库'
320
+ },
321
+ skill: {
322
+ manageTitlePrefix: '技能管理:',
323
+ manageTitle: '技能管理:{{identity}}',
324
+ info: '技能信息',
325
+ name: '技能名',
326
+ mySkills: '我的技能(跨命名空间聚合)',
327
+ namespaceSkills: '@{{namespace}} 的技能',
328
+ createdBy: '创建者',
329
+ managedTab: '我管理的',
330
+ sharedTab: '共享给我的',
331
+ namespacePlaceholder: '全部命名空间',
332
+ access: {
333
+ read: '只读',
334
+ write: '读写',
335
+ manage: '管理'
336
+ },
337
+ state: {
338
+ published: '已发布',
339
+ archived: '已归档',
340
+ deleting: '删除中',
341
+ deleteFailed: '删除失败',
342
+ unpublished: '未发布'
343
+ },
344
+ share: {
345
+ allManage: '全员管理',
346
+ allWrite: '全员读写',
347
+ allRead: '全员只读',
348
+ custom: '自定义',
349
+ private: '仅创建者'
350
+ },
351
+ noDescription: '暂无描述',
352
+ latestRelease: '最新发布',
353
+ noReleases: '尚未发布任何 Skill Release',
354
+ createdByUser: '创建者:{{name}}',
355
+ currentShare: '当前共享状态',
356
+ allManage: '技能管理团队可管理',
357
+ allWrite: '读写团队可读写',
358
+ allRead: '只读团队可读',
359
+ teamWithPermission: '团队 {{team}}({{permission}})',
360
+ memberWithPermission: '{{member}}({{permission}})',
361
+ releaseHistory: '发布历史({{count}})',
362
+ manageRequired: '需要该技能的管理权',
363
+ releaseDeleteWarning: '删除 v{{version}} 会移除该版本的发布包、版本记录与 Release Tag(源码 Git 历史与其他版本保留),且该版本号不可再发布。请输入 {{version}} 确认:',
364
+ releaseDeleteTitle: '删除 Skill Release',
365
+ releaseDeleted: '已删除 v{{version}}',
366
+ confirmReleaseVersion: '确认失败:请输入完整版本号 {{version}}',
367
+ lifecycle: '生命周期',
368
+ archive: '归档',
369
+ restore: '恢复',
370
+ deleteSkill: '彻底删除',
371
+ archiveFailed: '归档失败',
372
+ deleteDisabled: '彻底删除不可恢复',
373
+ deleteDialog: '彻底删除技能',
374
+ releasesToRemove: '将被删除的 Skill Release 数量:{{count}}',
375
+ everPublished: '曾经发布:{{value}}',
376
+ dependents: '依赖方:',
377
+ deleteReasonPlaceholder: '删除原因(必填,将写入审计)',
378
+ deleteConfirmPlaceholder: '输入 {{identity}} 确认',
379
+ reasonRequired: '请填写删除原因',
380
+ confirmIdentity: '确认失败:请输入完整技能身份 {{identity}}',
381
+ skillDeleted: '技能已彻底删除',
382
+ visibilityPublic: 'public(平台全员可搜可装)',
383
+ visibilityPrivate: 'private(仅被授权者)',
384
+ publicVisibilityOn: '技能已设为 public',
385
+ privateVisibilityOn: '技能已设为 private',
386
+ private: '不共享(私有)',
387
+ teamSelectPlaceholder: '选择团队',
388
+ teamNamePlaceholder: '团队名',
389
+ memberUsernamePlaceholder: '成员用户名',
390
+ memberUsernameWithOrgPlaceholder: '成员用户名(含组织前缀)',
391
+ teamAuthorizationTitle: '团队授权',
392
+ memberAuthorizationTitle: '成员授权',
393
+ teamNameRequired: '请选择或输入团队名',
394
+ memberUsernameRequired: '请选择或输入成员用户名',
395
+ teamAuthorizationUpdated: '团队授权已更新',
396
+ memberAuthorizationUpdated: '成员授权已更新',
397
+ skillArchived: '技能已归档',
398
+ skillRestored: '技能已恢复'
399
+ },
400
+ team: {
401
+ title: '团队成员',
402
+ count: '团队 {{count}} 个',
403
+ createTitle: '新建团队',
404
+ deleteTitle: '删除团队',
405
+ editTitle: '编辑团队',
406
+ custom: '自定义',
407
+ identifierPlaceholder: '小写字母、数字与连字符',
408
+ displayNamePlaceholder: '中文显示名,可留空',
409
+ displayNameClearPlaceholder: '中文显示名,留空则清除',
410
+ deleteWarning: '确认删除团队 {{team}}?成员将失去该团队的权限。',
411
+ created: '团队已创建',
412
+ updated: '团队已更新',
413
+ deleted: '团队 {{team}} 已删除',
414
+ memberJoined: '成员已加入团队',
415
+ memberRemoved: '已移除 {{member}}'
416
+ },
417
+ member: {
418
+ count: '成员 {{count}} 人',
419
+ addTitle: '添加成员',
420
+ invitationModeHint: '当前平台为邀请制:对方接受邀请后才会加入组织。',
421
+ usernameLabel: '用户名',
422
+ usernamePlaceholder: '对方的全局账号用户名',
423
+ usernameRequired: '请输入用户名',
424
+ leaveTitle: '退出组织',
425
+ removeTitle: '移出成员',
426
+ leaveWarning: '退出后你将离开 @{{org}} 并从全部团队移出;你在平台上的账号不受影响。',
427
+ removeWarning: '移出后 {{member}} 将离开组织并从全部团队移出。确认继续?',
428
+ inviteSent: '已向 {{member}} 发送入组邀请',
429
+ memberAdded: '成员 {{member}} 已加入组织',
430
+ selfLeft: '你已退出 @{{org}}',
431
+ memberRemoved: '成员 {{member}} 已移出组织',
432
+ inviteRevoked: '已撤销对 {{member}} 的邀请',
433
+ pendingInvitationsTitle: '待接受的邀请',
434
+ noPendingInvitations: '没有待接受的邀请'
435
+ },
436
+ invitation: {
437
+ title: '我的邀请',
438
+ empty: '没有待处理的邀请',
439
+ accepted: '已加入组织',
440
+ declined: '已拒绝邀请'
441
+ },
442
+ overview: {
443
+ todos: '待办',
444
+ noTodos: '没有待处理的事项',
445
+ orgInvitation: '组织 @{{org}} 邀请你加入',
446
+ orgApplication: '组织申请 @{{org}} 待平台管理员审批',
447
+ handle: '去处理',
448
+ allOrganizations: '全部组织',
449
+ managedSkills: '我管理的技能',
450
+ allSkills: '全部技能',
451
+ noManagedSkills: '你还没有管理任何技能'
452
+ },
453
+ apiError: apiErrorMessagesZhCN
454
+ };
455
+ const enUS = {
456
+ common: {
457
+ cancel: 'Cancel',
458
+ confirm: 'Confirm',
459
+ save: 'Save',
460
+ loading: 'Loading...',
461
+ workspace: 'ESL Workspace',
462
+ platformAdministrator: 'Platform administrator',
463
+ user: 'User',
464
+ organizationManagement: 'Organization management: {{orgs}}',
465
+ changePassword: 'Change password',
466
+ signOut: 'Sign out'
467
+ },
468
+ auth: {
469
+ login: 'Sign in',
470
+ brand: 'ESL Skill Library',
471
+ adminSignIn: 'Admin console sign in',
472
+ username: 'Username',
473
+ password: 'Password',
474
+ credentialsRequired: 'Enter a username and password',
475
+ usernameRequired: 'Enter a username',
476
+ forgotPassword: 'Forgot password?',
477
+ registerLink: 'No account? Register a personal account'
478
+ },
479
+ registration: {
480
+ title: 'Register an ESL account',
481
+ subtitle: 'Registration creates a personal namespace @username',
482
+ username: 'Username',
483
+ usernamePlaceholder: 'Lowercase letters, digits, hyphens',
484
+ email: 'Skill User Email',
485
+ emailPlaceholder: 'Contact email also used for Git commit matching',
486
+ password: 'Password',
487
+ confirmPassword: 'Confirm password',
488
+ submit: 'Register',
489
+ credentialsRequired: 'Enter a username, Skill User Email, and password',
490
+ passwordsDoNotMatch: 'The two passwords do not match',
491
+ pendingTitle: 'Registration submitted and awaiting approval',
492
+ pendingSubtitle: 'Account {{username}} was created and requires approval before sign-in.',
493
+ emailVerificationPendingTitle: 'Check your email to verify the account',
494
+ emailVerificationPendingSubtitle: 'A verification link was sent to {{email}}. Account {{username}} will activate after verification.',
495
+ resendVerification: 'Resend verification email',
496
+ successTitle: 'Registration succeeded',
497
+ successSubtitle: 'Account {{username}} can sign in; personal namespace @{{username}} is ready.',
498
+ goToLogin: 'Go to sign in',
499
+ existingAccount: 'Already have an account? Sign in'
500
+ },
501
+ nav: {
502
+ platformOverview: 'Platform overview',
503
+ orgManagement: 'Organization management',
504
+ orgApplications: 'Organization applications',
505
+ userRegistrations: 'User registrations',
506
+ userManagement: 'User management',
507
+ skillOverview: 'Skill overview',
508
+ platformSettings: 'Platform settings',
509
+ overview: 'Overview',
510
+ myOrganizations: 'My organizations',
511
+ skills: 'Skills',
512
+ invitations: 'Invitations',
513
+ orgMembers: 'Members',
514
+ orgTeams: 'Teams'
515
+ },
516
+ password: {
517
+ title: 'Change password',
518
+ current: 'Current password',
519
+ new: 'New password',
520
+ confirm: 'Confirm new password',
521
+ confirmPlaceholder: 'Enter the new password again',
522
+ submit: 'Update password',
523
+ required: 'Enter the current password and make both new passwords match',
524
+ changed: 'Password updated'
525
+ },
526
+ routes: {
527
+ platformOverview: 'Platform overview',
528
+ platformOverviewDescription: 'Realtime summary of organizations, approvals, and skills',
529
+ orgManagement: 'Organization management',
530
+ orgManagementDescription: 'Lifecycle and resource summary for every organization',
531
+ orgDetail: 'Organization detail',
532
+ orgApplications: 'Organization applications',
533
+ orgApplicationsDescription: 'Review organization applications; approval provisions resources',
534
+ userRegistrations: 'User registrations',
535
+ userRegistrationsDescription: 'Approve accounts awaiting activation in approval registration mode',
536
+ userManagement: 'User management',
537
+ userManagementDescription: 'Govern account emails, enablement, and provisioning lifecycle',
538
+ skillOverview: 'Skill overview',
539
+ skillOverviewDescription: 'View and administer all platform skills, including unpublished skills',
540
+ skillManagement: 'Skill management',
541
+ skillManagementDescription: 'Skills in this organization namespace and their share scope',
542
+ platformSettings: 'Platform settings',
543
+ platformSettingsDescription: 'Configure organization approval mode and platform policies',
544
+ overview: 'Overview',
545
+ overviewDescription: 'Todos, organizations, and managed skills',
546
+ myOrganizations: 'My organizations',
547
+ myOrganizationsDescription: 'Create organizations and view your identity in each',
548
+ orgMembers: 'Members',
549
+ orgMembersDescription: 'Manage members; removal also leaves every skill authorization team',
550
+ orgTeams: 'Teams',
551
+ orgTeamsDescription: 'Custom teams grant skill access; standing teams are platform maintained',
552
+ skills: 'Skills',
553
+ skillsDescription: 'Aggregated across personal and every joined organization namespace',
554
+ invitations: 'Invitations',
555
+ invitationsDescription: 'Organization invitations awaiting your response'
556
+ },
557
+ columns: {
558
+ organizationName: 'Organization name',
559
+ organization: 'Organization',
560
+ applicant: 'Applicant',
561
+ appliedAt: 'Applied at',
562
+ submittedAt: 'Submitted at',
563
+ status: 'Status',
564
+ actions: 'Actions',
565
+ namespace: 'Namespace',
566
+ identity: 'Identity',
567
+ myIdentity: 'My identity',
568
+ lifecycle: 'Lifecycle',
569
+ memberCount: 'Members',
570
+ skillCount: 'Skills',
571
+ createdAt: 'Created at',
572
+ member: 'Member',
573
+ invitedUser: 'Invited user',
574
+ inviter: 'Invited by',
575
+ identifier: 'Identifier',
576
+ displayName: 'Display name',
577
+ type: 'Type',
578
+ permission: 'Permission',
579
+ version: 'Version',
580
+ releasedAt: 'Released at',
581
+ notes: 'Release notes',
582
+ sourceCommit: 'Source commit',
583
+ publisher: 'Publisher',
584
+ ownerRelation: 'Relationship',
585
+ shareStatus: 'Share status',
586
+ myPermission: 'My permission'
587
+ },
588
+ actions: {
589
+ approve: 'Approve',
590
+ reject: 'Reject',
591
+ cancel: 'Cancel',
592
+ all: 'All',
593
+ manage: 'Manage',
594
+ details: 'Details',
595
+ remove: 'Remove',
596
+ delete: 'Delete',
597
+ edit: 'Edit',
598
+ create: 'Create',
599
+ submit: 'Submit application',
600
+ assign: 'Assign',
601
+ close: 'Got it',
602
+ accept: 'Accept',
603
+ revoke: 'Revoke',
604
+ add: 'Add',
605
+ addMember: 'Add member',
606
+ addAuthorization: 'Grant access',
607
+ sendInvite: 'Send invitation',
608
+ viewSkills: 'View skills',
609
+ viewProgress: 'View progress',
610
+ retryDelete: 'Retry deletion',
611
+ leaveOrganization: 'Leave organization',
612
+ confirmLeave: 'Confirm leave',
613
+ confirmRemove: 'Confirm removal',
614
+ confirmDelete: 'Delete',
615
+ expandReleases: 'Show all Skill Releases'
616
+ },
617
+ status: {
618
+ notManaged: 'Not onboarded',
619
+ pending: 'Pending',
620
+ active: 'Active',
621
+ failed: 'Provisioning failed',
622
+ rejected: 'Rejected',
623
+ cancelled: 'Cancelled',
624
+ expired: 'Expired',
625
+ deleting: 'Deleting',
626
+ deleteFailed: 'Deletion failed',
627
+ deleted: 'Deleted',
628
+ approved: 'Approved',
629
+ published: 'Published',
630
+ unpublished: 'Unpublished',
631
+ archived: 'Archived',
632
+ yes: 'Yes',
633
+ no: 'No',
634
+ none: 'None',
635
+ bootstrapReady: 'Bootstrap ready',
636
+ bootstrapNotReady: 'Bootstrap not ready'
637
+ },
638
+ orgIdentity: {
639
+ ordinary: 'Ordinary member',
640
+ managing: 'Managing member',
641
+ owner: 'Owner member',
642
+ promoteManaging: 'Promote to managing member',
643
+ promoteOwner: 'Promote to owner member'
644
+ },
645
+ organization: {
646
+ myOrganizations: 'My organizations',
647
+ createOrganization: 'Create organization',
648
+ applyCreateOrganization: 'Apply to create organization',
649
+ noOrganizations: 'You have not joined any organizations',
650
+ orgName: 'Organization name',
651
+ orgNamePlaceholder: 'Lowercase letters, digits, and hyphens',
652
+ enterOrgNameToConfirm: 'Enter the organization name to confirm deletion',
653
+ enterOrgName: 'Enter an organization name',
654
+ total: '{{count}} organizations',
655
+ dangerTitle: 'Dangerous operation',
656
+ deleteWarning: 'Deleting the organization removes all skill repositories and related data (members are global accounts and are unaffected); this cannot be undone.',
657
+ deleteRetryHint: 'If deletion failed, click delete again to retry.',
658
+ deleteReleasedNameHint: 'The organization name returns to the name pool and can be reused after deletion.',
659
+ permanentlyDelete: 'Permanently delete organization',
660
+ confirmTitle: 'Confirm again',
661
+ confirmDeleteWarning: 'Organization {{org}} and all of its data will be deleted. This cannot be undone. Continue?',
662
+ orgDeleted: 'Organization {{org}} was deleted',
663
+ failedReason: 'Failure reason: {{reason}}',
664
+ lastDeleteFailedRetry: 'The previous deletion failed; retry is available',
665
+ membersTitle: 'Members',
666
+ noMembers: 'No organization members',
667
+ lastOwnerDisabled: 'An organization must retain at least one owner member',
668
+ ownerAirdropTitle: 'Assign owner member',
669
+ ownerAirdropHint: 'For organizations without an available manager: make any registered account an owner member.',
670
+ ownerAirdropDetail: 'If the account is not yet in the organization, it is added and joined to the three skill authorization teams and org-managers.',
671
+ globalUsernamePlaceholder: 'The account global username',
672
+ demoteToOrdinary: 'Demote to ordinary member',
673
+ promoteToManaging: 'Promote to managing member',
674
+ promoteToOwner: 'Promote to owner member',
675
+ identityChanged: '{{username}} is now {{identity}}',
676
+ approvalCreationHint: 'This platform requires approval: submit an application and, once approved, the organization is provisioned and you become an owner member.',
677
+ manualCreationHint: 'Organization creation provisions immediately; you become an owner member.',
678
+ applicationSubmitted: 'Submitted the {{org}} organization application; awaiting administrator approval',
679
+ orgCreated: 'Organization {{org}} was created',
680
+ ownerAssigned: '{{username}} is now an owner member',
681
+ memberRemoved: 'Member {{username}} was removed from the organization',
682
+ usernameRequired: 'Enter a username'
683
+ },
684
+ orgApproval: {
685
+ filterByStatus: 'Filter applications by status',
686
+ provisionedTitle: 'Organization provisioning',
687
+ provisionedDetail: 'Organization {{org}} was provisioned. The applicant joined it as an owner member (no initial password is issued: members are global accounts and sign in with their own credentials).',
688
+ applicationRejected: 'Rejected the {{org}} registration application',
689
+ applicationCancelled: 'Cancelled the {{org}} registration application',
690
+ registrationApproved: 'Approved {{username}} registration',
691
+ registrationRejected: 'Rejected {{username}} registration'
692
+ },
693
+ settings: {
694
+ userRegistrationMode: 'User registration mode',
695
+ openRegistration: 'Open registration (immediately usable)',
696
+ approvalRegistration: 'Approval required (activate after approval)',
697
+ approvalRegistrationHint: 'In approval mode, registered accounts remain pending until approved or rejected in Registration approvals.',
698
+ adminProvisionedPasswordChangePolicy: 'Admin-provisioned password change policy',
699
+ forceAdminPasswordChange: 'Require a password change on first sign-in (recommended)',
700
+ allowAdminInitialPassword: 'Allow the initial password to remain',
701
+ adminProvisionedPasswordChangePolicyHint: 'Applies only to users provisioned afterward; existing users keep their provisioning-time snapshot.',
702
+ orgRegistrationMode: 'Organization registration approval mode',
703
+ autoOrgRegistration: 'No approval (create immediately)',
704
+ manualOrgRegistration: 'Approval required',
705
+ autoOrgRegistrationHint: 'With no approval, any registered user can create an organization immediately; otherwise use organization applications.',
706
+ memberAdditionMode: 'Member addition mode',
707
+ directAddition: 'Direct addition (join immediately)',
708
+ invitationMode: 'Invitation required (join after acceptance)',
709
+ emailVerification: 'Registration email verification',
710
+ emailVerificationOff: 'Off',
711
+ emailVerificationOn: 'On',
712
+ emailVerificationHint: 'Applies only to open registration; the account is created and activated after the email link is opened.',
713
+ smtpSectionTitle: 'Outbound email (SMTP)',
714
+ smtpSectionHint: 'Configurable when registration email verification is on; used for verification and password reset. Use port 465 for 163 Mail.',
715
+ smtpHost: 'SMTP host',
716
+ smtpPort: 'SMTP port',
717
+ smtpUsername: 'SMTP username',
718
+ smtpPassword: 'SMTP password or authorization code',
719
+ smtpPasswordUnchanged: 'Configured; leave blank to keep it',
720
+ smtpFrom: 'From address',
721
+ saved: 'Platform settings saved'
722
+ },
723
+ userManagement: {
724
+ search: 'Search',
725
+ searchPlaceholder: 'Search by username or Skill User Email',
726
+ allStatuses: 'All statuses',
727
+ enabled: 'Enabled',
728
+ disabled: 'Disabled',
729
+ email: 'Skill User Email',
730
+ emailPendingCompletion: 'Email pending completion',
731
+ provisionUser: 'Provision user',
732
+ initialPassword: 'Initial password',
733
+ disable: 'Disable',
734
+ enable: 'Enable',
735
+ editEmail: 'Change email',
736
+ provisioned: 'User provisioned and activated immediately',
737
+ disabledMessage: 'User {{username}} was disabled and existing sessions were invalidated',
738
+ enabledMessage: 'User {{username}} was enabled; sign in again',
739
+ emailChanged: 'Skill User Email changed'
740
+ },
741
+ profile: {
742
+ emailTitle: 'Skill User Email',
743
+ emailPendingHint: 'This account still uses a legacy synthetic email. Add a real, unique Skill User Email; this reminder does not block platform use.',
744
+ newEmail: 'New Skill User Email',
745
+ currentPassword: 'Current password',
746
+ saveEmail: 'Update email',
747
+ emailChanged: 'Skill User Email updated',
748
+ emailPendingVerification: 'New email pending verification',
749
+ emailVerificationSent: 'Verification email sent; check the new mailbox'
750
+ },
751
+ verification: {
752
+ failedTitle: 'Email verification failed',
753
+ successTitle: 'Email verified',
754
+ successSubtitle: 'Account {{username}} is active and ready to sign in.'
755
+ },
756
+ passwordReset: {
757
+ requestSubtitle: 'Enter your username and we will send a reset link to the account email.',
758
+ requestSubmit: 'Send reset email',
759
+ requestSentTitle: 'Request accepted',
760
+ requestSentSubtitle: 'If the account is eligible, a reset link will be sent to its email address.',
761
+ backToLogin: 'Back to sign in',
762
+ submit: 'Reset password',
763
+ successTitle: 'Password reset',
764
+ passwordMismatch: 'Enter a new password and make both entries match'
765
+ },
766
+ dashboard: {
767
+ totalOrganizations: 'Total organizations',
768
+ pendingApplications: 'Pending applications',
769
+ totalSkills: 'Total platform skills',
770
+ platformStatus: 'Platform status',
771
+ adminToken: 'Administrator token',
772
+ platformRepository: 'Platform repository'
773
+ },
774
+ skill: {
775
+ manageTitlePrefix: 'Skill management: ',
776
+ manageTitle: 'Skill management: {{identity}}',
777
+ info: 'Skill information',
778
+ name: 'Skill name',
779
+ mySkills: 'My skills (across namespaces)',
780
+ namespaceSkills: 'Skills in @{{namespace}}',
781
+ createdBy: 'Created by',
782
+ managedTab: 'Managed by me',
783
+ sharedTab: 'Shared with me',
784
+ namespacePlaceholder: 'All namespaces',
785
+ access: {
786
+ read: 'Read',
787
+ write: 'Read/write',
788
+ manage: 'Manage'
789
+ },
790
+ state: {
791
+ published: 'Published',
792
+ archived: 'Archived',
793
+ deleting: 'Deleting',
794
+ deleteFailed: 'Deletion failed',
795
+ unpublished: 'Unpublished'
796
+ },
797
+ share: {
798
+ allManage: 'Everyone manages',
799
+ allWrite: 'Everyone reads and writes',
800
+ allRead: 'Everyone reads',
801
+ custom: 'Custom',
802
+ private: 'Creator only'
803
+ },
804
+ noDescription: 'No description',
805
+ latestRelease: 'Latest release',
806
+ noReleases: 'No Skill Release has been published',
807
+ createdByUser: 'Created by {{name}}',
808
+ currentShare: 'Current sharing',
809
+ allManage: 'Manage teams can manage',
810
+ allWrite: 'Read-write teams can read and write',
811
+ allRead: 'Read-only teams can read',
812
+ teamWithPermission: 'Team {{team}} ({{permission}})',
813
+ memberWithPermission: '{{member}} ({{permission}})',
814
+ releaseHistory: 'Release history ({{count}})',
815
+ manageRequired: 'Management permission for this skill is required',
816
+ releaseDeleteWarning: 'Deleting v{{version}} removes its release artifact, version record, and Release Tag (Git history and other versions remain); the version cannot be published again. Enter {{version}} to confirm:',
817
+ releaseDeleteTitle: 'Delete Skill Release',
818
+ releaseDeleted: 'Deleted v{{version}}',
819
+ confirmReleaseVersion: 'Confirmation failed: enter the full version {{version}}',
820
+ lifecycle: 'Lifecycle',
821
+ archive: 'Archive',
822
+ restore: 'Restore',
823
+ deleteSkill: 'Delete permanently',
824
+ archiveFailed: 'Archiving failed',
825
+ deleteDisabled: 'Permanent deletion cannot be undone',
826
+ deleteDialog: 'Permanently delete skill',
827
+ releasesToRemove: 'Skill Releases to delete: {{count}}',
828
+ everPublished: 'Ever published: {{value}}',
829
+ dependents: 'Dependents:',
830
+ deleteReasonPlaceholder: 'Deletion reason (required, recorded for audit)',
831
+ deleteConfirmPlaceholder: 'Enter {{identity}} to confirm',
832
+ reasonRequired: 'Enter a deletion reason',
833
+ confirmIdentity: 'Confirmation failed: enter the full skill identity {{identity}}',
834
+ skillDeleted: 'Skill permanently deleted',
835
+ visibilityPublic: 'public (searchable and installable by everyone)',
836
+ visibilityPrivate: 'private (authorized viewers only)',
837
+ publicVisibilityOn: 'Skill visibility set to public',
838
+ privateVisibilityOn: 'Skill visibility set to private',
839
+ private: 'Private (not shared)',
840
+ teamSelectPlaceholder: 'Select a team',
841
+ teamNamePlaceholder: 'Team name',
842
+ memberUsernamePlaceholder: 'Member username',
843
+ memberUsernameWithOrgPlaceholder: 'Member username (including organization prefix)',
844
+ teamAuthorizationTitle: 'Team authorization',
845
+ memberAuthorizationTitle: 'Member authorization',
846
+ teamNameRequired: 'Select or enter a team name',
847
+ memberUsernameRequired: 'Select or enter a member username',
848
+ teamAuthorizationUpdated: 'Team authorization updated',
849
+ memberAuthorizationUpdated: 'Member authorization updated',
850
+ skillArchived: 'Skill archived',
851
+ skillRestored: 'Skill restored'
852
+ },
853
+ team: {
854
+ title: 'Team members',
855
+ count: '{{count}} teams',
856
+ createTitle: 'Create team',
857
+ deleteTitle: 'Delete team',
858
+ editTitle: 'Edit team',
859
+ custom: 'Custom',
860
+ identifierPlaceholder: 'Lowercase letters, digits, and hyphens',
861
+ displayNamePlaceholder: 'Display name (optional)',
862
+ displayNameClearPlaceholder: 'Display name; leave blank to clear',
863
+ deleteWarning: 'Delete team {{team}}? Members will lose the permissions granted by it.',
864
+ created: 'Team created',
865
+ updated: 'Team updated',
866
+ deleted: 'Team {{team}} was deleted',
867
+ memberJoined: 'Member joined the team',
868
+ memberRemoved: 'Removed {{member}}'
869
+ },
870
+ member: {
871
+ count: '{{count}} members',
872
+ addTitle: 'Add member',
873
+ invitationModeHint: 'This platform uses invitations: the member joins after accepting.',
874
+ usernameLabel: 'Username',
875
+ usernamePlaceholder: 'The account global username',
876
+ usernameRequired: 'Enter a username',
877
+ leaveTitle: 'Leave organization',
878
+ removeTitle: 'Remove member',
879
+ leaveWarning: 'After leaving, you will leave @{{org}} and every team; your platform account is unaffected.',
880
+ removeWarning: 'After removal, {{member}} will leave the organization and every team. Continue?',
881
+ inviteSent: 'Sent an organization invitation to {{member}}',
882
+ memberAdded: 'Member {{member}} joined the organization',
883
+ selfLeft: 'You left @{{org}}',
884
+ memberRemoved: 'Member {{member}} was removed from the organization',
885
+ inviteRevoked: 'Revoked the invitation for {{member}}',
886
+ pendingInvitationsTitle: 'Invitations awaiting acceptance',
887
+ noPendingInvitations: 'No invitations awaiting acceptance'
888
+ },
889
+ invitation: {
890
+ title: 'My invitations',
891
+ empty: 'No invitations awaiting action',
892
+ accepted: 'Joined the organization',
893
+ declined: 'Invitation declined'
894
+ },
895
+ overview: {
896
+ todos: 'Todos',
897
+ noTodos: 'No items awaiting action',
898
+ orgInvitation: 'Organization @{{org}} invites you to join',
899
+ orgApplication: 'Organization application @{{org}} is awaiting administrator approval',
900
+ handle: 'Take action',
901
+ allOrganizations: 'All organizations',
902
+ managedSkills: 'Skills I manage',
903
+ allSkills: 'All skills',
904
+ noManagedSkills: 'You do not manage any skills'
905
+ },
906
+ apiError: apiErrorMessages
907
+ };
908
+ export const translationResources = {
909
+ 'zh-CN': zhCN,
910
+ 'en-US': enUS
911
+ };
912
+ function flattenKeys(tree, prefix = '') {
913
+ return Object.entries(tree).flatMap(([key, value]) => {
914
+ const path = prefix ? `${prefix}.${key}` : key;
915
+ return typeof value === 'string' ? [path] : flattenKeys(value, path);
916
+ });
917
+ }
918
+ export function validateTranslationParity() {
919
+ const zhKeys = new Set(flattenKeys(zhCN));
920
+ const enKeys = new Set(flattenKeys(enUS));
921
+ return {
922
+ missingInZhCN: [...enKeys].filter((key) => !zhKeys.has(key)),
923
+ missingInEnUS: [...zhKeys].filter((key) => !enKeys.has(key))
924
+ };
925
+ }