@maudecode/kanvil 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/apps/server/.env.example +5 -0
  2. package/apps/server/dist/{auth-B-Tz8SF4.mjs → auth-Cs_whzgk.mjs} +300 -119
  3. package/apps/server/dist/client.mjs +1 -1
  4. package/apps/server/dist/{config-CRADzIvL.mjs → config-DKuNQY5b.mjs} +15 -7
  5. package/apps/server/dist/index.mjs +98 -30
  6. package/apps/server/dist/migrate.mjs +2 -2
  7. package/apps/server/dist/recover.mjs +4 -4
  8. package/apps/server/dist/{src-BCtZ3wbK.mjs → src-DptOUNRd.mjs} +53 -18
  9. package/apps/web/dist/assets/{CompositeItem-DvEBmVYM.js → CompositeItem-CXqewtEL.js} +1 -1
  10. package/apps/web/dist/assets/{Trans-NwgJNiLl.js → Trans-B1rRlWca.js} +1 -1
  11. package/apps/web/dist/assets/{admin-settings-BVWOe67Z.js → admin-settings-DE3MfBFE.js} +1 -1
  12. package/apps/web/dist/assets/{archive-restore-j20QLQCl.js → archive-restore-76sStk8K.js} +1 -1
  13. package/apps/web/dist/assets/az-AZ-bFxpMMZN.js +1 -0
  14. package/apps/web/dist/assets/{az-Dj0LhQ5O.js → az-B7OgHoaE.js} +1 -1
  15. package/apps/web/dist/assets/{corner-left-up-BAGDaT_1.js → corner-left-up-PD-73Nae.js} +1 -1
  16. package/apps/web/dist/assets/{de-BWVFKRmU.js → de-B-bv38Q0.js} +1 -1
  17. package/apps/web/dist/assets/de-DE-BeXI30Ll.js +1 -0
  18. package/apps/web/dist/assets/default-bQFGTwIp.js +56 -0
  19. package/apps/web/dist/assets/{delivery-settings-B26dRk_O.js → delivery-settings-BvMeOsCS.js} +1 -1
  20. package/apps/web/dist/assets/{el-IYSYQmsa.js → el-BQHQHQgX.js} +1 -1
  21. package/apps/web/dist/assets/el-GR-SgRHlWhY.js +1 -0
  22. package/apps/web/dist/assets/{ellipsis-Cx1SIn8a.js → ellipsis-GF1HwTDb.js} +1 -1
  23. package/apps/web/dist/assets/es-ES-BF1J5vap.js +1 -0
  24. package/apps/web/dist/assets/{es-C3DJP0aS.js → es-f5Xr8ldr.js} +1 -1
  25. package/apps/web/dist/assets/{forms-BwtRqvGj.js → forms-BlEL8C_P.js} +1 -1
  26. package/apps/web/dist/assets/{fr-BlVUPa15.js → fr-DSR0htnl.js} +1 -1
  27. package/apps/web/dist/assets/fr-FR-D_sldwf6.js +1 -0
  28. package/apps/web/dist/assets/{hi-CINzKB6O.js → hi-BaAJEWuW.js} +1 -1
  29. package/apps/web/dist/assets/hi-IN-CfOw4TWf.js +1 -0
  30. package/apps/web/dist/assets/{highlight-XHbOOx7A.js → highlight-DXT2xgt8.js} +1 -1
  31. package/apps/web/dist/assets/id-ID-CLKtHO7Q.js +1 -0
  32. package/apps/web/dist/assets/{id-CpyQwNyO.js → id-kxogWcip.js} +1 -1
  33. package/apps/web/dist/assets/{index-MTE_naHG.js → index-CYVrs22O.js} +5 -5
  34. package/apps/web/dist/assets/{invitations-Ch02KEAB.js → invitations-BPik3J_G.js} +1 -1
  35. package/apps/web/dist/assets/{it-CxMkGyiF.js → it-C_qk40U6.js} +1 -1
  36. package/apps/web/dist/assets/it-IT-eVZNW5qX.js +1 -0
  37. package/apps/web/dist/assets/{item-CRS9Ai9p.js → item-TCHuZNK6.js} +1 -1
  38. package/apps/web/dist/assets/{ja-D72d7qkv.js → ja-Dn5h64V9.js} +1 -1
  39. package/apps/web/dist/assets/ja-JP-D96njn-P.js +1 -0
  40. package/apps/web/dist/assets/{ko-BHuNjRQ3.js → ko-CjaoEPuG.js} +1 -1
  41. package/apps/web/dist/assets/ko-KR-Bash_ieA.js +1 -0
  42. package/apps/web/dist/assets/{label-settings-tE57CalJ.js → label-settings-DZTorNDm.js} +1 -1
  43. package/apps/web/dist/assets/{markdown-blocks-CN-hJdJS.js → markdown-blocks-BQLO-H_7.js} +1 -1
  44. package/apps/web/dist/assets/{member-directory-CoLB-2Oc.js → member-directory-Dx_jQYfI.js} +1 -1
  45. package/apps/web/dist/assets/mk-MK-BWQWGIRx.js +1 -0
  46. package/apps/web/dist/assets/{mk-D3TPH_Mz.js → mk-jLeGD50T.js} +1 -1
  47. package/apps/web/dist/assets/{nl-BHJbk-Wr.js → nl-AVtC5ygT.js} +1 -1
  48. package/apps/web/dist/assets/nl-NL-D1tvo0Gd.js +1 -0
  49. package/apps/web/dist/assets/{pl-JW_P_Gb9.js → pl-Dup1h_Y1.js} +1 -1
  50. package/apps/web/dist/assets/pl-PL-DNgGUEcQ.js +1 -0
  51. package/apps/web/dist/assets/{project-lifecycle-DuV33mlL.js → project-lifecycle-n1ZZbYfu.js} +1 -1
  52. package/apps/web/dist/assets/{project-settings-9yJbfZRu.js → project-settings-B_Ih5kiz.js} +1 -1
  53. package/apps/web/dist/assets/pt-BR-CZsUZQ6P.js +1 -0
  54. package/apps/web/dist/assets/{pt-BR-DWL_sEp3.js → pt-BR-Cm04EWM-.js} +1 -1
  55. package/apps/web/dist/assets/{public-project-M93Zpx_e.js → public-project-BivDjU_a.js} +1 -1
  56. package/apps/web/dist/assets/{rotate-ccw-DcHaluuA.js → rotate-ccw-CSaKhZYt.js} +1 -1
  57. package/apps/web/dist/assets/{ru-DQNby7hW.js → ru-IeycXsyE.js} +1 -1
  58. package/apps/web/dist/assets/ru-RU-4ew92YE_.js +1 -0
  59. package/apps/web/dist/assets/{search-DQtwggUH.js → search-Ble6WSEU.js} +3 -3
  60. package/apps/web/dist/assets/{send-gpGpxsCa.js → send-BLMZ8gQ0.js} +1 -1
  61. package/apps/web/dist/assets/settings-CH48qQK2.js +1 -0
  62. package/apps/web/dist/assets/{sliders-horizontal-BxgR4pFt.js → sliders-horizontal-Db6kRvuw.js} +1 -1
  63. package/apps/web/dist/assets/{switch-UPVGS5kv.js → switch-BeX-0Fwq.js} +1 -1
  64. package/apps/web/dist/assets/{table-D8iAxhJH.js → table-UJp5S9yy.js} +1 -1
  65. package/apps/web/dist/assets/ticket-detail-C24opfNW.js +2 -0
  66. package/apps/web/dist/assets/{ticket-editor-B5eOWIj4.js → ticket-editor--d_bG9C1.js} +2 -2
  67. package/apps/web/dist/assets/{ticket-list-C965rmmf.js → ticket-list-DRbZWYHf.js} +1 -1
  68. package/apps/web/dist/assets/{ticket-list-controls-ua3m0uRB.js → ticket-list-controls-fYBottFC.js} +1 -1
  69. package/apps/web/dist/assets/{tr-BNZEkwqd.js → tr-DtT_dKUK.js} +1 -1
  70. package/apps/web/dist/assets/tr-TR-CM381XCw.js +1 -0
  71. package/apps/web/dist/assets/{uk-Dmlqvk63.js → uk-CsbeHSS6.js} +1 -1
  72. package/apps/web/dist/assets/uk-UA-AeOiWCVo.js +1 -0
  73. package/apps/web/dist/assets/{upload-Cu0J8ZFJ.js → upload-DUEg04Nj.js} +1 -1
  74. package/apps/web/dist/assets/{useQueries-BEzeS0hU.js → useQueries-5lW2C5Sb.js} +1 -1
  75. package/apps/web/dist/assets/vi-VN-td08xXv9.js +1 -0
  76. package/apps/web/dist/assets/{vi-KALEc3bk.js → vi-rkf1BOLx.js} +1 -1
  77. package/apps/web/dist/assets/{visual-editor-DyhI5fa5.js → visual-editor-DkFLjouD.js} +1 -1
  78. package/apps/web/dist/assets/{workspace-settings-DGr-Lwnz.js → workspace-settings-Bcsp-VoJ.js} +1 -1
  79. package/apps/web/dist/assets/zh-CN-D3dhEYLS.js +1 -0
  80. package/apps/web/dist/assets/{zh-CN-DfruhRl9.js → zh-CN-Xo-QId5w.js} +1 -1
  81. package/apps/web/dist/assets/zh-TW-CfhOEFo8.js +1 -0
  82. package/apps/web/dist/assets/{zh-TW-C4keUYMa.js → zh-TW-DEnTqjbn.js} +1 -1
  83. package/apps/web/dist/index.html +7 -7
  84. package/docs/api.md +16 -6
  85. package/docs/releasing.md +16 -2
  86. package/docs/self-hosting.md +8 -0
  87. package/package.json +1 -1
  88. package/apps/web/dist/assets/az-AZ-DlsPlUZi.js +0 -1
  89. package/apps/web/dist/assets/de-DE-DLCaqUUe.js +0 -1
  90. package/apps/web/dist/assets/default-D6I-Xfqm.js +0 -56
  91. package/apps/web/dist/assets/el-GR-P2XcwrSU.js +0 -1
  92. package/apps/web/dist/assets/es-ES-CJoX8f3w.js +0 -1
  93. package/apps/web/dist/assets/fr-FR-yLkQdy6a.js +0 -1
  94. package/apps/web/dist/assets/hi-IN-y8dqej7z.js +0 -1
  95. package/apps/web/dist/assets/id-ID-DSvh8mGH.js +0 -1
  96. package/apps/web/dist/assets/it-IT-BUcfUqNo.js +0 -1
  97. package/apps/web/dist/assets/ja-JP-C-jLP_Ay.js +0 -1
  98. package/apps/web/dist/assets/ko-KR-C5Ozdm2E.js +0 -1
  99. package/apps/web/dist/assets/mk-MK-BdM_SsE8.js +0 -1
  100. package/apps/web/dist/assets/nl-NL-CwjB5sva.js +0 -1
  101. package/apps/web/dist/assets/pl-PL-6-PMhTBd.js +0 -1
  102. package/apps/web/dist/assets/pt-BR-TD_wt6Hr.js +0 -1
  103. package/apps/web/dist/assets/ru-RU-Bk1a6Oln.js +0 -1
  104. package/apps/web/dist/assets/settings-Co61IE04.js +0 -1
  105. package/apps/web/dist/assets/ticket-detail-BKilKtg_.js +0 -2
  106. package/apps/web/dist/assets/tr-TR-CUfBb7K9.js +0 -1
  107. package/apps/web/dist/assets/uk-UA-BDaXBsDP.js +0 -1
  108. package/apps/web/dist/assets/vi-VN-Bgb-L6mE.js +0 -1
  109. package/apps/web/dist/assets/zh-CN-BypkvBe6.js +0 -1
  110. package/apps/web/dist/assets/zh-TW-CgMsT_XS.js +0 -1
@@ -0,0 +1 @@
1
+ var e={common:{status:{backlog:`待规划`,todo:`待处理`,in_progress:`进行中`,in_review:`审核中`,done:`已完成`,cancelled:`已取消`},priority:{urgent:`紧急`,high:`高`,medium:`中`,low:`低`,none:`无优先级`},kind:{feature:`功能`,bug:`缺陷`,chore:`杂项`,research:`调研`,documentation:`文档`},difficulty:{low:`低`,med:`中`,high:`高`,none:`无难度`},role:{reader:`只读`,writer:`可编辑`,admin:`管理员`},permission:{ticket:{write:{label:`编辑工单`,description:`创建、编辑、移动、认领和评论工单;创建项目`},delete:{label:`删除工单`,description:`永久删除工单`}},project:{manage:{label:`管理项目`,description:`项目详情、工作流、标签、字段、集成和生命周期`}},member:{manage:{label:`管理成员`,description:`添加、更改和移除成员`}},invitation:{manage:{label:`管理邀请`,description:`通过邮箱邀请成员`}},sharing:{manage:{label:`管理共享`,description:`公开只读链接和日历订阅源`}},workspace:{manage:{label:`管理工作区`,description:`工作区详情、共享标签和角色`}}},customFieldType:{text:`文本`,number:`数字`,date:`日期`,checkbox:`复选框`,select:`单选`,multiselect:`多选`},customField:{removedOption:`已移除的选项`,checked:`是`},filterField:{status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,label:`标签`,assigneeId:`负责人`,customField:`字段`},sort:{priority:`优先级`,updated:`最近更新`,created:`最近创建`,title:`标题`,labels:`标签`,due:`截止日期`,start:`开始日期`,number:`工单编号`,status:`状态`,difficulty:`难度`,kind:`类型`,assignee:`负责人`,manual:`手动`},due:{overdue:`已逾期`,today:`今天截止`,week:`本周截止`,scheduled:`有截止日期`,none:`无截止日期`},relation:{blocks:{outgoing:`阻塞`,incoming:`被阻塞于`},related:{outgoing:`相关`,incoming:`相关`},duplicate:{outgoing:`重复于`,incoming:`被重复于`},causes:{outgoing:`导致`,incoming:`由其导致`},clones:{outgoing:`克隆自`,incoming:`被克隆为`},implements:{outgoing:`实现`,incoming:`由其实现`},reviews:{outgoing:`审核`,incoming:`由其审核`}},remoteKind:{branch:`分支`,pull_request:`拉取请求`,issue:`议题`},notificationCategory:{assignment:`分配`,status:`状态变更`,comment:`评论`,mention:`提及`,update:`其他更新`,due_soon:`即将截止`,overdue:`已逾期`},destinationEvent:{created:`新工单`},deliveryKind:{email:`电子邮件`,webhook:`Webhook`},change:{pull_request:{name:`拉取请求`,opened:`拉取请求已打开`,draft:`草稿拉取请求`,merged:`拉取请求已合并`,closed:`拉取请求未合并即关闭`},merge_request:{name:`合并请求`,opened:`合并请求已打开`,draft:`草稿合并请求`,merged:`合并请求已合并`,closed:`合并请求未合并即关闭`},branchCreated:`分支已创建`},issueLinkState:{active:`同步中`,paused:`已暂停`,review:`需要审核`,creating:`正在创建议题`,unknown:`创建未确认`},importStatus:{previewed:`可以导入`,running:`导入中`,completed:`已导入`,failed:`失败`,cancelled:`已取消`},importProvider:{linear:{project:`团队`,setup:`在 Linear 的 Settings › Security & access 中创建个人 API 密钥,只读权限即可。`},jira:{project:`项目`,setup:`Jira Cloud 使用账户邮箱和在 id.atlassian.com 创建的 API 令牌登录;Data Center 和 Server 使用个人访问令牌。拥有项目的浏览权限即可。`},trello:{project:`看板`,setup:`使用你在 trello.com/power-ups/admin 管理的 Power-Up 的 API 密钥及为其生成的令牌,只读权限即可。`},plane:{project:`项目`,setup:`在 Plane 的 Profile settings › Personal access tokens 中创建个人访问令牌。Plane Cloud 的 API 地址为 https://api.plane.so;工作区 URL 标识是其网址的第一部分。`},planka:{project:`看板`,setup:`使用可以打开该看板的 PLANKA 账户登录;Kanvil 打开的会话在读取结束后即关闭。PLANKA 2 管理员也可以改为签发 API 密钥。`},kaneo:{project:`项目`,setup:`在 Kaneo 的 Settings › Account › Developer 中创建 API 密钥。`}},plankaSignIn:{password:`用户名和密码`,api_key:`API 密钥`},jiraEdition:{cloud:`Cloud`,data_center:`Data Center 或 Server`},event:{time_entry:{created:`已创建时间记录`,updated:`已更新时间记录`,deleted:`已删除时间记录`},label:{created:`标签已创建`,updated:`标签已更新`,deleted:`标签已删除`},workflow:{created:`工作流状态已添加`,updated:`工作流状态已更改`,deleted:`工作流状态已移除`},custom_field:{created:`字段已创建`,updated:`字段已更新`,deleted:`字段已删除`},ticket:{created:`工单已创建`,updated:`工单已更新`,deleted:`工单已删除`,moved:`从其他项目移入`,moved_away:`已移至其他项目`,due_soon:`即将截止`,overdue:`已逾期`,claimed:`工作已认领`},claim:{renewed:`认领已续期`,released:`认领已释放`,recovered:`认领已收回`},comment:{created:`已添加评论`,updated:`评论已编辑`,deleted:`评论已删除`},relation:{added:`已添加关联`,removed:`已移除关联`},attachment:{created:`已附加文件`,deleted:`已移除文件`},evidence:{added:`已附加证据`},resource:{added:`已添加链接`,updated:`链接已编辑`,removed:`已移除链接`},calendar_feed:{created:`日历订阅源已创建`,revoked:`日历订阅源已撤销`},project:{created:`项目已创建`,updated:`项目已更新`,archived:`项目已归档`,restored:`项目已恢复`,transferred:`项目已移至其他工作区`,deleted:`项目已删除`},membership:{updated:`项目访问权限已更改`},workspace:{owner_changed:`工作区所有者已更改`},role:{created:`角色已创建`,updated:`角色已更改`,deleted:`角色已删除`},invitation:{updated:`邀请已更改`},destination:{created:`已添加目标`,updated:`目标已更改`,deleted:`已移除目标`},repository:{connected:`仓库已连接`,updated:`仓库连接已更改`,disconnected:`仓库已断开连接`,received:`已收到仓库 Webhook`},issue_link:{updated:`议题同步已更改`}},error:{network:`无法连接到 Kanvil。请检查网络连接后重试。`,fallback:`无法完成请求`,input:`输入`,code:{unauthorized:`请登录以继续。`,session_required:`此操作需要使用已登录的账户。`,account_disabled:`此账户已停用。`,forbidden:`你没有执行此操作的权限。`,insufficient_scope:`此凭据不允许执行此操作。`,workspace_scope_required:`此操作需要使用拥有工作区访问权限的账户。`,invalid_origin:`不允许此来源。`,not_found:`未找到此项,或你无权查看。`,version_conflict:`加载后此内容已被更改。请重新加载后重试。`,time_entry_conflict:`此用户在该工单上已有进行中的时间记录。`,claim_conflict:`另一个执行者已认领此工单。`,idempotency_conflict:`此请求已用于另一项更改。`,project_archived:`请先恢复已归档的项目再进行更改。`,rate_limited:`短时间内更改过多。请稍后重试。`,snapshot_required:`实时数据流已落后。请重新加载以继续。`,request_failed:`无法完成请求`}},action:{add:`添加`,apply:`应用`,back:`返回`,cancel:`取消`,clear:`清除`,close:`关闭`,confirm:`确认`,continue:`继续`,copy:`复制`,create:`创建`,delete:`删除`,done:`完成`,edit:`编辑`,open:`打开`,remove:`移除`,rename:`重命名`,reset:`重置`,retry:`重试`,save:`保存`,search:`搜索`},state:{copied:`已复制`,loading:`加载中…`,saved:`已保存`,saving:`保存中…`,none:`无`,unassigned:`未分配`},evidenceKind:{pull_request:`拉取请求`,test:`测试`,review:`审核`,deployment:`部署`,device:`设备`,other:`其他`},evidenceOutcome:{reported:`已报告`,pending:`待定`,passed:`通过`,failed:`失败`},readinessReason:{project_archived:`项目已归档`,not_open:`工单必须处于待处理状态且未归档`,not_enabled:`尚未启用智能体工作`,missing_description:`添加描述`,missing_acceptance_criteria:`添加验收标准`,missing_difficulty:`选择难度`,duplicate:`此工单已标记为重复`,claim_recovery_required:`收回所有权前,请确认之前的执行者已停止`,claimed:`已被 {{worker}} 认领`,dependency:`{{key}} 尚未完成`},person:{deleted:`已删除的账户`,former:`前成员`},signIn:{codeTitle:`使用验证码登录`,resetTitle:`重置密码`,codeSent:`如果 {{email}} 有账户,验证码已在发送途中。验证码 10 分钟后过期。`,code:`验证码`,newPassword:`新密码`,sendCode:`通过邮件发送验证码`,back:`返回登录`,resend:`重新发送验证码`,resent:`已重新发送验证码`,emailCode:`通过邮件发送登录验证码`,forgot:`忘记密码?`,resetDone:`密码已重置。请使用新密码登录。`,resetDoneTitle:`密码已重置`,resetDoneBody:`请使用新密码登录。`,invalidCode:`该验证码错误、已使用或已过期。请重新发送以获取有效的验证码。`,localPassword:`本地密码`},language:{label:`语言`,system:`系统默认`}},shell:{ui:{showValue:`显示{{label}}`,hideValue:`隐藏{{label}}`,previousPage:`上一页{{noun}}`,nextPage:`下一页{{noun}}`,pageRange:`第 {{from}}–{{to}} 项,共 {{total}} 项`,priority:`{{label}}优先级`,working:`处理中…`,searchPlaceholder:`搜索…`,clearValue:`清除{{label}}`,copyValue:`复制{{label}}`,copied:`已复制{{value}}`},documentTitle:`{{name}} · Kanvil`,openKanvil:`打开 Kanvil`,page:{home:`首页`,myWork:`我的工作`,inbox:`收件箱`,search:`搜索`,settings:`设置`,planning:`规划`,ticket:`工单`,tickets:`工单`,projects:`项目`},connection:{restored:`连接已恢复`,lost:`连接已断开`,reconnecting:`正在重新连接…`,reload:`重新加载`,signIn:`登录以重新连接`},app:{skipToContent:`跳到内容`,assigned:`分配给你的`,openCount_other:`{{count, number}} 个未完成`,noAssigned:`没有分配给你的未完成工单`,allInMyWork_other:`在“我的工作”中查看全部 {{count, number}} 个`,openMyWork:`打开“我的工作”`,recentActivity:`最近动态`,noActivity:`暂无动态`,searchProjects:`搜索项目`,projectCount_other:`{{count, number}} 个项目`,noMatchingProjects:`没有匹配的项目`,clearSearch:`清除搜索`,noWorkspaces:`暂无工作区`,noActiveProjects:`没有活跃的项目`,noProjects:`暂无项目`,archivedProjects:`已归档的项目`,archived:`已归档`,noOpenTickets:`没有未完成的工单`,overdueCount_other:`{{count, number}} 个已逾期`,percentDone:`已完成 {{percent}}`,nextDue:`下次截止 <time/>`,projectSettingsFor:`{{name}} 的项目设置`,pageNotFound:`页面不存在`,openHome:`打开首页`,tryAgain:`重试`,adminRequired:`需要实例管理员权限`,projectNotFound:`项目不存在`,noWorkspaceSelected:`未选择工作区`},auth:{signIn:`登录`,createOwner:`创建所有者账户`,ownerHint:`第一个账户负责管理此实例。`,invitedHint:`请使用受邀的邮箱地址登录以接受邀请。`,signInWith:`使用 {{provider}} 登录`,useEmail:`使用邮箱和密码`,or:`或`,name:`名称`,setupToken:`设置令牌`,setupTokenHint:`使用实例配置中的 KANVIL_SETUP_TOKEN。`,email:`邮箱`,password:`密码`,signingIn:`正在登录…`,createAccount:`创建账户`,consent:{expired:`授权请求已过期。请重新连接客户端。`,title:`授权 {{client}}`,titleUnnamed:`授权客户端`,subtitle:`此客户端请求以你的账户身份访问。项目权限依然适用。`,deny:`拒绝`,allow:`允许访问`},invitation:{unavailable:`邀请不可用`,join:`加入 {{workspace}}`,invited:`受邀账户`,from:`邀请人`,access:`访问权限`,removedProjects:`已移除的项目`,wholeWorkspace:`整个工作区`,expires:`过期时间`,expired:`此邀请已过期。请向工作区管理员索取新的邀请。`,revoked:`此邀请已被撤销。请向工作区管理员索取新的邀请。`,accepted:`此邀请已被接受。请向工作区管理员索取新的邀请。`,wrongAccount:`你当前以 <account>{{current}}</account> 的身份登录。请以 {{invited}} 的身份登录以接受邀请。`,signOut:`退出登录`,joined:`已加入 {{workspace}}`,accept:`接受邀请`},callback:{cancelled:`登录已取消。准备好后请重试。`,linkedElsewhere:`此身份已关联到另一个 Kanvil 账户。请使用其他身份或联系管理员。`,notLinked:`此身份未关联到 Kanvil 账户。请使用本地账户登录,并在设置中关联。`,expired:`登录请求已过期或无法验证。请在此页面重试。`,emailMismatch:`无法关联身份提供方的邮箱。请联系管理员。`,failed:`无法完成登录。请重试或联系管理员。`}},you:`你`,inbox:{markAllRead:`全部标记为已读`,clearRead:`清除已读`,cleared_other:`已清除 {{count, number}} 条已读通知`,unread:`未读`,mentions:`提及`,all:`全部通知`,noUnread:`没有未读通知`,noMentions:`没有提及`,noNotifications:`没有通知`,markUnread:`标记为未读`,markRead:`标记为已读`,dismiss:`移除`},search:{field:`搜索工作区`,placeholder:`搜索工单、项目、评论、动态…`,tab:{all:`全部`,project:`项目`,ticket:`工单`,comment:`评论`,activity:`动态`},indexing:`外部搜索正在同步,工单结果暂时来自 PostgreSQL。`,empty:`搜索工单、项目、评论和动态`,noResults:`没有“{{query}}”的结果`,results:`搜索结果`,pages:`搜索结果分页`,previous:`上一页`,next:`下一页`,type:{project:`项目`,ticket:`工单`,comment:`评论`,activity:`动态`}},column:{key:`工单`,labels:`标签`,scopes:`范围`,status:`状态`,priority:`优先级`,difficulty:`难度`,kind:`类型`,assigneeId:`负责人`,startAt:`开始`,dueAt:`截止`,createdAt:`创建时间`,updatedAt:`更新时间`},public:{notShared:`此项目未共享`,notSharedHint:`该链接已关闭或从未存在。成员可登录后查看。`,noTickets:`没有工单`,ticketUnavailable:`工单不可用`,backToTickets:`返回工单`,description:`描述`,noDescription:`_暂无描述_`,acceptanceCriteria:`验收标准`,noAcceptanceCriteria:`_暂无验收标准_`,ticketProperties:`工单属性`,properties:`属性`,status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,startDate:`开始日期`,dueDate:`截止日期`,labels:`标签`,scopes:`范围`,created:`创建时间`,updated:`更新时间`,relationships:`关联`,parent:`父工单`,child:`子工单`},sidebar:{workspace:`工作区`,unread_other:`{{count, number}} 条未读`,userSettings:`用户设置`,administration:`管理`,signOut:`退出登录`,projectSettings:`项目设置`},workspace:{new:`新建工作区`,name:`工作区名称`,key:`工作区标识`,create:`创建工作区`,workspaces:`工作区`,switch:`切换工作区`,settings:`工作区设置`},palette:{open:`前往…`,title:`前往`,description:`查找项目、工单、页面或操作`,placeholder:`搜索工单、项目、页面、操作…`,searching:`搜索中…`,noResults:`没有结果`,jumpTo:`跳转到`,openKey:`在 {{project}} 中打开 {{key}}`,resultsIn:`{{workspace}} 中的结果`,results:`结果`,seeAll_other:`查看全部 {{count, number}} 个结果`,actions:`操作`,pages:`页面`,newTicketIn:`在 {{project}} 中新建工单`,myTicketsIn:`我在 {{project}} 中的工单`,lightMode:`切换到浅色模式`,darkMode:`切换到深色模式`,keywords:{jump:`{{query}} 跳转 打开`,allResults:`全部结果 {{query}}`,newTicket:`新建工单 创建`,myTickets:`我的工单 分配给我`,lightMode:`切换 浅色模式 主题 外观`,darkMode:`切换 深色模式 主题 外观`,help:`键盘快捷键 帮助`,home:`首页 概览 全部项目`,myWork:`我的工作 分配的工单`,search:`搜索 评论 动态 项目 工单`,inbox:`收件箱 通知`,settings:`设置 {{scope}} {{label}}`}},actionCategory:{general:`通用`,ticketList:`工单列表`,inbox:`收件箱`,ticket:`工单`,search:`搜索`,markdown:`Markdown`},action:{palette:`前往任意位置`,help:`键盘快捷键`,sidebar:`切换侧边栏`,newTicket:`新建工单`,search:`搜索工单`,highlight:`高亮下一个或上一个工单`,open:`打开高亮的工单`,preview:`在列表旁预览高亮的工单`,select:`选择高亮的工单`,properties:`设置高亮工单的状态、优先级或负责人`,inboxHighlight:`高亮下一条或上一条通知`,inboxOpen:`在收件箱旁查看高亮通知的工单`,inboxRead:`将高亮的通知标记为已读或未读`,inboxDismiss:`移除高亮的通知`,step:`打开下一个或上一个工单`,edit:`编辑工单`,save:`保存工单或评论`,results:`在搜索结果间移动`,insertBlock:`在可视化编辑器中插入表格、图表、文件或其他块`},move:{top:{label:`将高亮的工单移到顶部`,menu:`移到顶部`},up:{label:`将高亮的工单上移`,menu:`上移`},down:{label:`将高亮的工单下移`,menu:`下移`},bottom:{label:`将高亮的工单移到底部`,menu:`移到底部`},previous:{label:`将高亮的工单移到上一个状态`,menu:`移到上一个状态`},next:{label:`将高亮的工单移到下一个状态`,menu:`移到下一个状态`}},copy:{link:{label:`复制链接`,copied:`工单链接`},keyAndTitle:{label:`复制编号和标题`,copied:`工单`},title:{label:`复制标题`,copied:`标题`},markdown:{label:`复制为 Markdown`,copied:`Markdown`},branch:{label:`复制分支名称`,copied:`分支名称`}},settingsNav:{account:`账户`,settings:`设置`,workspace:`工作区`,workspaceSettings:`工作区设置`,projects:`项目`,projectSettings:`项目设置`,administration:`管理`,section:{profile:`个人资料与安全`,appearance:`外观`,preferences:`偏好设置`,credentials:`API 密钥`,notifications:`通知`,general:`常规`,members:`成员`,roles:`角色`,labels:`标签`,workflow:`工作流`,fields:`字段`,integrations:`集成`,calendar:`日历订阅源`,storage:`文件存储`,search:`搜索`,events:`事件投递`,users:`用户`,workspaces:`工作区`,authentication:`身份验证`}},browser:{copyFailed:`复制失败。请选中文本后手动复制。`,readFailed:`无法读取文件`,encodeFailed:`无法编码文件`,imageTooBig:`请选择小于 10 MB 的图片。`,cannotResize:`此浏览器无法调整图片尺寸。`,prepareFailed:`无法处理图片。`,stillTooLarge:`调整尺寸后图片仍然过大。请选择更简单的图片。`},primitive:{close:`关闭`,more:`更多`,breadcrumb:`面包屑导航`,sidebar:`侧边栏`,sidebarDescription:`显示移动端侧边栏。`,toggleSidebar:`切换侧边栏`,resizeSidebar:`调整侧边栏宽度`,expandSidebar:`展开侧边栏`,commandTitle:`命令面板`,commandDescription:`搜索要运行的命令…`}},ticket:{list:{selectSection:`选择{{section}}工单`,expandSection:`展开{{section}}工单`,collapseSection:`收起{{section}}工单`,sectionTickets:`{{section}}工单`,later:`以后`,selectAll:`选择所有显示的工单`,selectTicket:`选择 {{key}}`,title:`标题`,all:`全部`,planned:`已规划`,archived:`已归档`,allTickets:`全部工单`,customView:`自定义视图`,sectionCount:`{{n, number}} 个{{section}}`,planning:`{{project}} 规划`,collection:`{{source}}({{sections}})`,moved:`{{key}} 已移动`,movedTo:`{{key}} 已移到{{status}}`,movedAbove:`{{key}} 已移到 {{neighbor}} 上方`,movedBelow:`{{key}} 已移到 {{neighbor}} 下方`,movedToAbove:`{{key}} 已移到{{status}},位于 {{neighbor}} 上方`,movedToBelow:`{{key}} 已移到{{status}},位于 {{neighbor}} 下方`,emptyFiltered:`没有匹配的工单`,emptyPlanning:`没有已规划或已归档的工单`,emptyProject:`暂无工单`,emptyWork:`没有分配给你的未完成工单`,createFirst:`创建第一个工单`,activeWork:`进行中的工作`,views:`工单视图`,saveCurrentView:`保存当前视图`,deleteView:`删除视图 {{name}}`,deleteViewConfirm:`要从已保存的视图中移除 {{name}} 吗?工单不受影响。`,planningLink:`规划`,newTicketShortcut:`新建工单({{shortcut}})`,saveView:`保存视图`,viewSaved:`视图已保存`,viewName:`视图名称`,retry:`重新加载工单`,board:`工单看板`,tickets:`工单`,resizeColumn:`调整“{{column}}”列宽`,count_other:`{{count, number}} 个工单`,scheduledCount_other:`{{count, number}} 个已排期工单`},move:{destination:`目标`,projectPlaceholder:`移到项目…`,blockers:`移动前请先解决`,submit:`移动工单`,pending:`移动中…`},picker:{placeholder:`选择工单`,loading:`正在加载工单…`,searchLabel:`搜索{{label}}`,searchPlaceholder:`按标题或编号搜索…`,noParent:`无父工单`,searching:`搜索中…`,empty:`未找到工单`},property:{status:`状态`,priority:`优先级`,kind:`类型`,difficulty:`难度`,assignee:`负责人`,you:`{{name}}(你)`,assignTo:`分配给…`,set:`设置{{label}}…`,search:`搜索{{label}}`,noMatches:`没有匹配项`},field:{mixed:`混合`,unchecked:`否`,noValue:`无值`},project:{label:`项目`,placeholder:`在项目中创建…`,search:`搜索项目`},tags:{labels:`标签`,scopes:`范围`,summary:`{{label}}:{{tags}}`,edit:`编辑{{label}}`,editValues:`编辑{{label}}:{{tags}}`,editMixed:`编辑{{label}}:混合`,mixed:`混合{{label}}`,none:`无{{label}}`,mixedNote:`所选工单的{{label}}各不相同。`,clear:`清除{{label}}`,replace:`替换{{label}}`},tagInput:{remove:`移除{{label}} {{tag}}`,addAnother:`再添加一个…`,add:`添加{{label}}…`,choose:`选择{{label}}`,chooseLabels:`选择标签`,searchPlaceholder:`搜索标签…`,searchLabel:`搜索项目标签`,empty:`没有匹配的标签`},link:{previewUnavailable:`无法预览`},userPicker:{label:`账户`,placeholder:`选择账户`,searchPlaceholder:`搜索名称或邮箱…`,searchLabel:`搜索账户`,useEmail:`使用 {{email}}`,emptyAnyAccount:`搜索成员,或输入现有账户的邮箱。`,empty:`没有匹配的成员`},date:{placeholder:`选择日期`,clear:`清除{{label}}`,start:`开始日期`,startShort:`开始`,noStart:`无开始日期`,due:`截止日期`,dueShort:`截止`,noDue:`无截止日期`},filter:{me:`我`,searchTickets:`搜索工单`,searchTicketsPlaceholder:`搜索工单…`,filters:`筛选`,filtersActive:`筛选({{active, number}})`,due:`截止`,anyDue:`任意截止日期`,archived:`已归档`,hideArchived:`隐藏已归档`,includeArchived:`包含已归档`,archivedOnly:`仅已归档`,includingArchived:`包含已归档`,reset:`重置筛选`,clear:`清除筛选`,active:`当前工单筛选`,searchChip:`搜索:{{query}}`,chipAny:`{{field}}:`,chipNone:`{{field}}不是:`,notValues:`不是 {{values}}`,match:`{{label}}匹配方式`,is:`是`,isNot:`不是`,searchPlaceholder:`{{search}}…`,anyValue:{status:`所有状态`,priority:`所有优先级`,kind:`所有类型`,difficulty:`所有难度`,label:`所有标签`,assigneeId:`任何人`,customField:`任意字段值`},searchValues:{status:`搜索状态`,priority:`搜索优先级`,kind:`搜索类型`,difficulty:`搜索难度`,label:`搜索标签`,assigneeId:`搜索人员`,customField:`搜索字段`}},display:{title:`显示`,orderBy:`排序方式`,direction:`方向`,ascending:`升序`,descending:`降序`,reset:`重置显示`,groupBy:`分组方式`,dueDate:`截止日期`,layout:`布局`,list:`列表`,board:`看板`,backgrounds:`项目背景`,show:`显示`,hide:`隐藏`,rowSpacing:`行间距`,compact:`紧凑`,comfortable:`宽松`,labelDisplay:`标签显示`,compactPreview:`紧凑预览`,allLabels:`全部标签`,properties:`属性`},selection:{region:`已选工单`,clear:`清除选择`,selected_other:`已选 {{count, number}} 个`,selectedOf_other:`{{count, number}} / {{total}}<wide> 已选</wide>`,applied_other:`已将{{label}}应用到 {{count, number}} 个工单`,partlyApplied_other:`已应用到 {{done, number}} / {{count, number}} 个工单`,mixedDue:`截止日期各不相同`,fields:`字段`,more:`更多操作`,moveTo:`移到{{status}}`,restoreChange:`恢复`,restore:`恢复所选`,archive:`归档所选`,delete:`删除所选`,deleteLimit:`一次最多删除 {{limit, number}} 个`,archiveConfirm_other:`要归档 {{collection}} 中的 {{count, number}} 个工单吗?`,deleteConfirm_other:`要永久删除 {{collection}} 中的 {{count, number}} 个工单及其评论、关联和附件吗?未选中的子工单将失去父工单。`,deleted_other:`已删除 {{count, number}} 个工单`},menu:{copied:`已复制{{label}}`,open:`打开工单`,preview:`预览`,newTab:`在新标签页中打开`,edit:`编辑工单`,editTitle:`编辑 {{key}}`,duplicate:`复制工单`,created:`已创建 {{key}}`,move:`移动`,moveToProject:`移到项目…`,moveTitle:`移动 {{key}}`,moved:`已移为 {{key}}`,follow:`关注工单`,unfollow:`取消关注工单`,archive:`归档工单`,unarchive:`取消归档工单`,delete:`删除工单`,deleteConfirm:`要永久删除 {{key}} 及其评论、关联和附件吗?`,openProject:`打开项目`,projectLink:`项目链接`,copyLink:`复制链接`,newTicket:`新建工单`,projectSettings:`项目设置`,manageAccount:`管理账户`,email:`邮箱`,copyEmail:`复制邮箱`},schedule:{range:`{{from}} – {{to}}`,calendar:`日历`,timeline:`时间线`,today:`今天`,previousMonth:`上个月`,nextMonth:`下个月`,previousWeeks:`前两周`,nextWeeks:`后两周`,emptyWeeks:`这几周没有排期`,monthTickets:`{{title}}的工单`,showDay_other:`显示 {{day}} 的全部 {{count, number}} 个工单`,more_other:`还有 {{count, number}} 个`,ticketColumn:`工单`,scheduledTickets:`已排期工单`},copy:{description:`描述`,acceptanceCriteria:`验收标准`}},detail:{field:{title:`标题`,description:`描述`,acceptanceCriteria:`验收标准`,parent:`父工单`,parentTicket:`父工单`,labels:`标签`,scopes:`范围`,holdReason:`搁置原因`,url:`URL`},page:{preview:`工单预览`,unavailable:`工单不可用`,noProject:`此链接未指明工单所属的项目。`,gone:`此工单已被删除,或你已无访问权限。`,closePreview:`关闭预览`,openFullPage:`在完整页面中打开`,backToTickets:`返回工单`,tickets:`工单`,previousTicket:`上一个工单`,previousTicketShortcut:`上一个工单(K)`,nextTicket:`下一个工单`,nextTicketShortcut:`下一个工单(J)`,position:`{{position, number}} / {{total, number}}`,subscribe:`订阅`,unsubscribe:`取消订阅`,subscribed:`已订阅更新`,unsubscribed:`已取消订阅`,archive:`归档工单`,unarchive:`取消归档工单`,archivedToast:`工单已归档`,unarchivedToast:`工单已取消归档`,archived:`已归档`,edit:`编辑工单`,editShortcut:`编辑工单(E)`,editTitle:`编辑 {{key}}`,actions:`工单操作`,copyKey:`复制工单编号`,keyCopied:`已复制 {{key}}`,noDescription:`_暂无描述_`,noAcceptanceCriteria:`_暂无验收标准_`,coordination:`工单协作`,properties:`属性`,created:`创建时间`,updated:`更新时间`},section:{discussion:`讨论`,evidence:`证据`,activity:`动态`},readiness:{heading:`智能体就绪状态`,ready:`可以认领`,notReady:`尚不可认领`,hold:`搁置:{{reason}}`,claimedUntil:`已被 <strong>{{worker}}</strong> 认领,直到 {{date}}。`},claim:{release:`释放我的认领`,releaseDescription:`确认执行者已停止写入后释放所有权?`,recover:`收回已过期的认领`,recoverHelp:`请先确认执行者已停止。`,reason:`收回原因`,confirmed:`我已确认执行者已停止`,submit:`收回所有权`},editor:{storageUnavailable:`此浏览器无法保存草稿。保存前请保持编辑器打开。`,saved:`{{key}} 已保存`,created:`{{key}} 已创建`,properties:`工单属性`,readyForAgents:`可供智能体处理`,readyForAgentsHelp:`在需求、阻塞项和所有权允许时,智能体可以认领此工单`,agents:`智能体`,notReady:`未就绪`,moreProperties:`更多属性`,holdPlaceholder:`为什么要暂缓工作?`,claimsNote:`认领仍取决于需求、阻塞项和当前所有权。`,restoreSize:`恢复编辑器大小`,expand:`展开编辑器`,staleTitle:`此工单已被更改。`,staleDescription:`你的草稿仍基于版本 {{version}};保存时需要使用当前版本。`,discardAndReload:`放弃草稿并重新加载`,titlePlaceholder:`工单标题`,descriptionPlaceholder:`添加背景、需求或复现步骤…`,criteriaPlaceholder:`- [ ] 如何确认已完成?`,removeCriteria:`移除验收标准`,addCriteria:`添加验收标准`,savedLocally:`草稿已保存在此设备上`,notSavedLocally:`无法保存草稿`,discardDraft:`放弃草稿`,createMore:`继续创建`,save:`保存工单`,create:`创建工单`},resource:{removeConfirm:`要移除 {{name}} 吗?`,uploading:`上传中…`},attachment:{heading:`附件`,tooLarge:`每个文件不能超过 10 MB。`,attached_other:`已附加 {{count, number}} 个文件`,attach:`附加文件`,emptyWritable:`暂无附件。将文件拖放到此处。`,empty:`暂无附件`,remove:`移除附件`,fileInput:`文件(最大 10 MB)`},evidence:{description:`处理此工单的人员和集成所报告的链接和结果。`,add:`添加证据`,empty:`暂无证据`,added:`证据已添加`,kindLabel:`类型`,outcomeLabel:`报告的结果`,commit:`提交(完整哈希)`,note:`备注`},link:{heading:`链接`,add:`添加链接`,edit:`编辑链接`,save:`保存链接`,remove:`移除链接`,empty:`暂无链接`,stateUnknown:`状态未知`,remote:`{{kind}} · {{state}}`,remoteState:{open:`打开`,closed:`已关闭`,merged:`已合并`,draft:`草稿`,active:`活跃`,deleted:`已删除`}},activity:{previous:`较早的动态`,next:`较新的动态`},relations:{heading:`关联`,add:`添加关联`,linkExisting:`关联现有工单`,newChild:`新建子工单`,newChildTitle:`{{key}} 的新子工单`,children:`子工单 <count>{{done, number}}/{{total, number}}</count>`,previousChildren:`上一组子工单`,nextChildren:`下一组子工单`,empty:`暂无关联`,type:`关联类型`,ticket:`工单`,statusOf:`{{key}} 的状态`,assigneeOf:`{{key}} 的负责人`,remove:{blocks:`移除阻塞关联`,related:`移除相关关联`,duplicate:`移除重复关联`,causes:`移除导致关联`,clones:`移除克隆关联`,implements:`移除实现关联`,reviews:`移除审核关联`}},discussion:{empty:`暂无评论`,previous:`较早的评论`,next:`较新的评论`,comment:`评论`,placeholder:`撰写评论…`,posting:`发布中…`,edited:`已编辑`,edit:`编辑评论`,delete:`删除评论`,deleteConfirm:`要永久删除此评论吗?`},markdown:{format:{heading:`标题`,bold:`粗体`,italic:`斜体`,link:`链接`,linkHelp:`为所选文本添加链接`,bullets:`无序列表`,numbers:`有序列表`,tasks:`任务列表`,code:`代码块`},formatting:`{{label}}格式`,editor:`{{label}}编辑器`,insertFile:`插入文件`,insertFileInto:`将文件插入{{label}}`,write:`编写`,visual:`可视化`,preview:`预览`,unsupported:`此文本使用了可视化编辑器无法保留的 Markdown,例如 HTML 或脚注。`,nothingToPreview:`没有可预览的内容`,mention:`提及成员`,insertBlock:`插入块`,block:{quote:`引用`,table:`表格`,diagram:`图表`,divider:`分隔线`,file:`文件`},table:{addRow:`添加行`,addColumn:`添加列`,deleteRow:`删除行`,deleteColumn:`删除列`,deleteTable:`删除表格`},linkAddress:`链接地址`,diagram:`图表`,diagramFailed:`无法绘制此图表:{{error}}`,diagramSource:`图表源代码`}},settings:{account:{title:`设置`,security:`登录与安全`,localPassword:`本地密码`,localPasswordDescription:`更改密码会让你的其他会话退出登录。`,changePassword:`更改密码`,oidcLinked:`可使用此身份提供方登录同一账户。`,oidcUnlinked:`通过此提供方登录前,请先关联你的账户。`,linked:`已关联`,link:`关联 {{name}}`,currentPassword:`当前密码`,newPassword:`新密码`,confirmPassword:`确认新密码`,passwordMismatch:`两次输入的新密码不一致。`,passwordUpdated:`密码已更新,其他会话已退出登录。`},preferences:{behavior:`行为`,languageDescription:`适用于此浏览器,包括登录页面。`,weekStart:`每周起始日`,weekStartDescription:`适用于所有日期选择器。`,weekStartLanguage:`跟随语言`,sidebar:`启动时的侧边栏`,sidebarDescription:`下次打开 Kanvil 时生效。`,sidebarLast:`保持上次状态`,sidebarExpanded:`展开`,sidebarCollapsed:`收起`,ticketLists:`工单列表`,reset:`重置偏好设置`,resetDescription:`将此浏览器中的这些选项恢复为默认值。`,resetDone:`偏好设置已重置`},notifications:{title:`通知`,inbox:`收件箱`,inboxDescription:`你关注的工单的更新会显示在 Kanvil 中。`,inboxSwitch:`在收件箱中接收已订阅工单的更新`,push:`推送通知`,pushDescription:`将更新发送到你已注册的设备。`,pushUnavailable:`此实例未启用推送。`,pushSwitch:`在已注册设备上接收推送通知`,categories:`类别`,categorySwitch:`{{label}}通知`,reminder:`即将截止提醒`,reminderDescription:`在关注的工单截止前多久提醒。`,reminderUnit:`提醒单位`,reminderAmount:`提醒数值`,unit:{minutes:`分钟`,hours:`小时`,days:`天`,weeks:`周`}},layout:{nav:`设置`,section:`设置分区`,nested:`{{parent}} · {{child}}`,name:`名称`,description:`描述`,descriptionPlaceholder:`添加描述`,noDescription:`暂无描述`,stale:`此内容已在其他地方被更改。请取消后重新开始。`},profile:{title:`个人资料`,displayName:`显示名称`,edit:`编辑个人资料`,changePhoto:`更换照片`,removePhoto:`移除照片`,photoFile:`头像文件`,photoUpdated:`照片已更新`,photoRemoved:`照片已移除`,saved:`个人资料已保存`},credentials:{global:`全局`,globalDescription:`访问账户有权访问的所有项目和工作区,包括将来获得的访问权限。`,title:`API 密钥`,description:`为脚本、集成和智能体提供可随时撤销的访问权限。`,create:`创建 API 密钥`,creating:`创建中…`,created:`API 密钥已创建`,name:`名称`,access:`访问权限`,projects:`项目`,expires:`过期时间`,actions:`操作`,unavailableProject:`不可用的项目`,untitled:`未命名密钥`,expired:`已过期`,disabled:`已停用`,custom:`自定义`,noProjects:`无项目访问权限`,never:`永不`,revoke:`撤销 API 密钥`,revokeNamed:`要撤销 {{name}} 吗?使用它的连接将立即失去访问权限。`,revokeUnnamed:`要撤销此 API 密钥吗?使用它的连接将立即失去访问权限。`,empty:`暂无 API 密钥`,emptyDescription:`当脚本、集成或智能体需要访问你的项目时,可创建密钥。`,copyNow:`请立即复制此密钥。之后将无法再次查看。`,newKey:`新 API 密钥`,copy:`复制 API 密钥`,noProjectTitle:`请先选择项目`,noProjectDescription:`API 密钥至少需要访问一个项目。`,goToProjects:`前往项目`,keyName:`密钥名称`,keyNamePlaceholder:`例如:发布自动化`,projectAccess:`项目访问权限`,findProject:`查找项目`,projectDescription:`{{key}} · {{workspace}}`,workspace:`工作区`,noMatches:`没有匹配的项目`,roleLimit:`此密钥的权限仍受你现有项目角色的限制。`,accessLevel:`访问级别`,preset:{read:`只读`,write:`读写`,automation:`读写及认领工作`,custom:`自定义权限`},permission:{intake:{name:`提交报告`,description:`仅创建隔离工单。无法读取或编辑工单。请单独使用。`},read:{name:`读取工单`,description:`查看项目、工单、评论和附件。`},write:{name:`编辑工单`,description:`创建和更新工单、评论和附件。`},claim:{name:`认领工作`,description:`认领、续期和释放工单所有权。`},admin:{name:`管理项目和工作区`,description:`在角色允许的范围内更改项目和工作区的设置及成员。`}},expiry:{7:`7 天`,30:`30 天`,90:`90 天`,365:`1 年`,custom:`自定义日期`,never:`永不过期`},expiresOn:`过期日期`,neverDescription:`密钥在你删除之前一直有效。`},calendarFeeds:{title:`日历订阅源`,new:`新建日历订阅源`,created:`日历订阅源已创建`,create:`创建订阅源`,adminOnly:`由项目管理员共享和撤销日历订阅源。`,labels:`标签`,everyLabel:`所有标签`,stopped:`· 已停止:创建者已失去访问权限`,revoke:`撤销 {{name}}`,revokeDescription:`订阅了 {{name}} 的日历将立即停止更新。工单不受影响。`,revoked:`日历订阅源已撤销`,empty:`暂无日历订阅源`,copyNow:`请立即将此链接复制到日历应用中。它只显示一次,任何拥有该链接的人都能查看共享的工单。`,link:`订阅源链接`,name:`订阅源名称`,onlyLabels:`仅包含带这些标签的工单`,explanation:`订阅源会将设有开始或截止日期的未完成、未归档工单列为 {{zone}} 时区的全天事件。任何拥有链接的人都能看到其编号、标题、状态、优先级和日期。`},project:{title:`项目设置`,edit:`编辑项目`,copyPrefix:`复制工单前缀`,saved:`项目已保存`,noOpenTickets:`没有未完成的工单`,openTickets_other:`{{count, number}} 个未完成工单`,overdueTickets_other:`· {{count, number}} 个已逾期`,created:`· 创建于 <time/>`,access:`项目访问权限`,accessWorkspace:`工作区成员根据其工作区角色获得访问权限。`,accessPrivate:`只有你添加的成员和工作区管理员可以查看此项目。`,accessUpdated:`项目访问权限已更新`,visibility:{workspace:`工作区内所有人`,private:`仅项目成员`},workspace:`工作区`,workspaceSettings:`工作区设置`,prefix:`工单前缀`,prefixDescription:`更改后,以前的前缀和工单编号仍然有效。`,changePrefix:`更改前缀`,changePrefixTitle:`更改工单前缀`,changePrefixDescription:`{{name}} 中的所有工单都将使用新前缀,并保留原编号。`,changing:`更改中…`,prefixChanged:`工单现在使用 {{key}}`,publicLink:`公开链接`,publicDisclosure:`任何拥有链接的人都能查看此项目中所有未归档工单的标题、描述、验收标准、状态、优先级、类型、难度、标签、范围、日期以及指向其他工单的链接。人员、评论、动态、附件、证据和认领保持私密。`,publicOn:`公开链接已开启`,publicOff:`公开链接已关闭`,off:`关闭`,copyPublicLink:`复制公开链接`,openPublic:`打开公开视图`,stopSharing:`停止共享`,share:`公开共享`,background:`背景`,backgroundDescription:`显示在此项目的工单列表和看板后面。`,backgroundUpdated:`背景已更新`,backgroundRemoved:`背景已移除`,currentBackground:`当前背景`,uploading:`上传中…`,replace:`替换`,upload:`上传图片`,backgroundFile:`项目背景文件`},tickets_other:`{{count, number}} 个工单`,moveUp:`上移 {{name}}`,moveDown:`下移 {{name}}`,workflow:{title:`工作流`,new:`新建状态`,edit:`编辑状态`,editNamed:`编辑状态 {{name}}`,deleteNamed:`删除状态 {{name}}`,onlyState:`{{name}} 是唯一的{{category}}状态`,saved:`状态已保存`,name:`状态名称`,category:`类别`,color:`状态颜色`,categoryChange:`其工单的状态将变为{{status}}。`,save:`保存状态`,delete:`删除状态`,deleteTitle:`删除 {{name}}`,deleted:`状态已删除`,reassign_other:`将 {{count, number}} 个工单移到`},labels:{title:`标签`,search:`搜索标签`,new:`新建标签`,edit:`编辑标签`,workspace:`工作区`,editNamed:`编辑标签 {{name}}`,deleteNamed:`删除标签 {{name}}`,deleteUsed_other:`要从 {{count, number}} 个工单(包括已归档工单)中移除 {{name}} 吗?使用此标签的已保存视图将移除其标签筛选。`,deleteUsedShared_other:`要从所有项目的 {{count, number}} 个工单(包括已归档工单)中移除 {{name}} 吗?使用此标签的已保存视图将移除其标签筛选。`,deleteUnused:`要删除未使用的标签 {{name}} 吗?使用它的已保存视图将移除其标签筛选。`,deleted:`标签已删除`,noMatches:`没有匹配的标签`,empty:`暂无标签`,saved:`标签已保存`,name:`标签名称`,color:`标签颜色`,rename:`重命名会同步更新工单和已保存视图中的此标签。`,renameShared:`重命名会同步更新所有项目中工单和已保存视图里的此标签。`,adopt:`采用项目标签`,adoptDescription:`已在 {{projects}} 中定义。其工单将保留此标签并采用此颜色。`,save:`保存标签`},fields:{title:`字段`,new:`新建字段`,edit:`编辑字段`,editNamed:`编辑字段 {{name}}`,deleteNamed:`删除字段 {{name}}`,deleteUsed_other:`要删除 {{name}} 并从 {{count, number}} 个工单(包括已归档工单)中移除其值吗?已保存视图将失去基于它的筛选。`,deleteUnused:`要删除未使用的字段 {{name}} 吗?已保存视图将失去基于它的筛选。`,deleted:`字段已删除`,empty:`暂无字段`,saved:`字段已保存`,required:`必填`,requiredDescription:`新工单必须填写此值。`,defaultValue:`默认值 {{value}}`,default:`默认值`,name:`字段名称`,type:`类型`,options:`选项`,option:`选项 {{number}}`,optionInline:`选项 {{number}}`,optionColor:`{{name}} 的颜色`,removeOption:`移除 {{name}}`,addOption:`添加选项`,reassign:`包含 {{name}} 的工单`,clearValue:`清除值`,moveTo:`移到 {{name}}`,save:`保存字段`},lifecycle:{archivedToast:`项目已归档`,restoredToast:`项目已恢复`,archivedNotice:`归档于 <time/> · 只读`,restore:`恢复`,archive:`归档`,archivedDescription:`归档于 <time/>。其工单为只读,且不会出现在列表、搜索、我的工作、日历订阅源和智能体队列中。`,archiveDescription:`将项目从列表、搜索、我的工作、日历订阅源和智能体队列中隐藏,并将其工单设为只读。历史记录会保留。`,archiveProject:`归档项目`,archiveConfirm:`在恢复之前,{{name}} 将从项目列表和智能体队列中移除。需先释放已认领的工单。`,blocker:`{{message}}:{{tickets}}`,row:{tickets:`工单`,losesAccess:`失去访问权限`,gainsAccess:`获得访问权限`,labelsCopied:`已复制的标签`,labelsMerged:`已合并的标签`,followsRemoved:`已移除的关注`,invitations:`邀请`,comments:`评论`,files:`文件`,kept:`保留`,projects:`项目`,members:`成员`,sharedLabels:`共享标签`,signIn:`登录`,sessions:`会话`,credentials:`凭据`,devices:`设备`,access:`访问权限`,claims:`认领`,imports:`导入`,profile:`个人资料`},transferTickets_other:`{{count, number}} 个,保留其编号和链接`,noOne:`无人`,transferInvitations_other:`{{count, number}} 个待处理邀请将不再包含此项目`,files_other:`{{count, number}} 个 · {{size}}`,keptProject_other:`{{count, number}} 条动态记录和 {{key}} 前缀`,keptWorkspace_other:`{{count, number}} 条动态记录和 {{slug}} URL 标识`,archivedProject:`已归档`,membersLoseAccess_other:`{{count, number}} 人失去访问权限;其账户保留`,pendingInvitations_other:`{{count, number}} 个待处理`,move:`移动`,moveTitle:`移动 {{name}}`,moved:`已移到 {{name}}`,movedUnnamed:`已移到该工作区`,destination:`目标工作区`,moveProject:`移动项目`,moving:`移动中…`,export:`导出`,exportDescription:`将工单及其工作流、字段、标签、关联、评论、证据和链接导出为带版本的 JSON。附件和动态历史保留在此处。`,exporting:`导出中…`,exportJson:`导出 JSON`,delete:`删除`,deleteTitle:`删除 {{name}}`,deleted:`{{name}} 已删除`,typeToConfirm:`输入 {{value}} 以确认`,deleting:`删除中…`,deleteProject:`删除项目`,deleteProjectDescription:`永久移除工单、评论和文件。动态历史会保留,且 {{key}} 不会再被使用。`,signInAgain:`重新登录`,deleteWorkspace:`删除工作区`,deleteWorkspaceDescription:`永久删除工作区中的所有项目及其工单、评论和文件,并移除其成员。账户和动态历史会保留。`,noSignInMethods:`没有已关联的登录方式`,sessions_other:`{{count, number}} 个会话已退出登录`,credentials_other:`{{count, number}} 个 API 密钥或应用连接已撤销`,devices_other:`{{count, number}} 个设备或通知渠道已移除`,workspaceCount_other:`{{count, number}} 个工作区`,directProjectCount_other:`{{count, number}} 个直接项目`,accessWorkspaces:`已移除 {{workspaces}}`,accessBoth:`已移除 {{workspaces}}和 {{projects}}`,claims_other:`{{count, number}} 个认领已释放`,imports_other:`{{count, number}} 个导入已取消`,profileErased:`名称、邮箱和照片已清除`,commentCount_other:`{{count, number}} 条评论`,activityCount_other:`{{count, number}} 条动态记录`,keptAccount:`{{tickets}}、{{comments}}和 {{events}}将显示为“{{name}}”`,deleteAccount:`删除账户`,deleteOwnAccount:`永久移除你的登录方式、会话、密钥、设备、成员资格和个人信息。工单、评论和动态会保留,并显示为“{{name}}”。`,deleteOtherAccount:`永久移除此账户的登录方式、会话、密钥、设备、成员资格和个人信息。工单、评论和动态会保留,并显示为“{{name}}”。`},icon:{change:`更换图标`,title:`项目图标`,library:`图标库`,upload:`上传图片`,search:`搜索图标`,searchPlaceholder:`搜索图标…`,color:`图标颜色`,choose:`选择 {{name}}`,noMatches:`没有匹配的图标`,showMore:`显示更多图标`,uploading:`上传中…`,chooseImage:`选择图片`,formats:`PNG、JPEG 或 WebP · 最大 10 MB`,file:`项目图标文件`,reset:`重置图标`},createProject:{title:`新建项目`,inWorkspace:`位于 {{name}}`,everyoneLabel:`此工作区中的所有人`,name:`项目名称`,namePlaceholder:`移动应用`,create:`创建项目`},workspace:{title:`工作区设置`,owner:`所有者`,noOwner:`没有所有者。实例管理员可以指定一位。`,transfer:`转让所有权`,transferring:`转让中…`,transferred:`{{name}} 现在拥有 {{workspace}}`,newOwner:`新所有者`,noEligible:`所有权只能转让给活跃的工作区管理员。请先将另一位成员设为管理员。`,chosenCan:`之后 {{name}} 可以转让或删除此工作区。`,newOwnerCan:`新所有者可以转让或删除此工作区。`,ownerStays:`{{name}} 仍为管理员。`,unavailable:`工作区不可用`,backToProjects:`返回项目`,name:`工作区名称`,edit:`编辑工作区`,copyKey:`复制工作区标识`,saved:`工作区已保存`,projects:`项目`,projectCount_other:`你在此工作区中可以访问 {{count, number}} 个项目。`,viewProjects:`查看项目`,members:`成员`,membersDescription:`工作区角色适用于使用工作区访问权限的项目。`,manageMembers:`管理成员`},members:{title:`成员`,customRole:`自定义角色`,search:`搜索成员`,searchPlaceholder:`名称或邮箱…`,add:`添加成员`,added:`成员已添加`,workspaceAccess:`工作区访问权限`,owner:`所有者`,roleFor:`{{name}} 的角色`,useWorkspaceAccess:`使用工作区访问权限`,remove:`移除成员`,removeFromWorkspace:`要将 {{name}} 从此工作区及其所有项目中移除吗?`,restoreAccess:`要为 {{name}} 恢复{{role}}工作区访问权限吗?`,removeFromProject:`要移除 {{name}} 的项目访问权限吗?`,noMatches:`没有匹配的成员`,empty:`暂无成员`,projectRole:`项目角色`,workspaceRole:`工作区角色`},invitations:{title:`邀请`,invite:`通过邮箱邀请`,removedProjects:`已移除的项目`,wholeWorkspace:`整个工作区`,selectedProjects:`所选项目`,expired:`已过期`,expires:`<time/>过期`,resend:`重新向 {{email}} 发送邀请`,revoke:`撤销邀请`,revokeDescription:`发送到 {{email}} 的链接将失效。`,revoked:`邀请已撤销`,empty:`没有待处理的邀请`,email:`邮箱`,role:`角色`,access:`访问权限`,projects:`项目`,noProjects:`此工作区没有项目。`,linkExpires:`链接有效期`,inDays_other:`{{count, number}} 天`,submit:`邀请`,link:`邀请链接`,copyLink:`复制邀请链接`,emailed:`已发送邮件至 {{email}}。该链接仅可用于该地址,且只能使用一次。`,notEmailed:`此实例未配置邮件。请将此链接发送给 {{email}};它仅可用于该地址,且只能使用一次。`,notEmailedUnknown:`此实例未配置邮件。请将此链接发送给收件人;它仅可用于该地址,且只能使用一次。`},workspaces:{title:`工作区`,search:`搜索工作区`,searchPlaceholder:`名称或 URL 标识…`,noMatches:`没有匹配的工作区`,empty:`暂无工作区`,workspace:`工作区`,administrators:`管理员`,members:`成员`,projects:`项目`,created:`创建时间`,actions:`操作`,noAdministrator:`没有管理员`,manage:`管理 {{name}}`,pagerNoun:`工作区`,private:`私有`,noProjects:`没有项目`},roles:{title:`角色`,new:`新建角色`,edit:`编辑角色`,builtIn:`内置`,readOnly:`仅可读取`,memberships_other:`{{count, number}} 个成员资格`,editNamed:`编辑角色 {{name}}`,deleteNamed:`删除角色 {{name}}`,deleteUnused:`要删除未使用的角色 {{name}} 吗?`,deleted:`角色已删除`,empty:`暂无角色`,saved:`角色已保存`,name:`角色名称`,actions:`操作`,everyoneReads:`所有成员都可以读取其可访问的项目。`,changesApply_other:`更改将立即应用到持有此角色的 {{count, number}} 个成员资格。`,save:`保存角色`,delete:`删除角色`,reassignDescription_other:`有 {{count, number}} 个成员资格持有 {{name}}。请选择要将其改为的角色。`,moveTo:`将成员改为`},theme:{mode:{light:`浅色`,dark:`深色`,system:`跟随系统`},aligned:`已对齐`,hexColor:`请使用六位十六进制颜色值`,contrast:{light:`请将浅色主题的文本对比度提高到至少 4.5:1。`,dark:`请将深色主题的文本对比度提高到至少 4.5:1。`},fileTooLarge:`主题文件必须小于 100 KB。`,tooMany:`最多保留 50 个自定义主题。`},appearance:{colorScheme:`配色方案`,theme:`主题`,themes:`主题`,colorTheme:`颜色主题`,search:`搜索主题`,searchPlaceholder:`搜索主题…`,create:`创建主题`,add:`添加主题`,importFile:`导入主题文件`,useMode:{light:`在浅色模式下使用 {{name}}`,dark:`在深色模式下使用 {{name}}`},modeOnly:{light:`仅用于浅色模式`,dark:`仅用于深色模式`},copyName:`{{name}} 副本`,duplicate:`复制 {{name}}`,edit:`编辑 {{name}}`,export:`导出 {{name}}`,delete:`删除 {{name}}`,deleteDescription:`要从此浏览器中移除 {{name}} 吗?使用它的浅色或深色外观将回退到你的基础主题。`,noMatches:`没有匹配的主题`,customTheme:`自定义主题`,name:`主题名称`,paletteColor:`{{mode}}{{color}}`,color:{background:`背景`,foreground:`文本`,sidebar:`侧边栏`,primary:`强调色`,primaryForeground:`强调色文本`},save:`保存主题`},color:{swatch:`{{color}}{{label}}`,removeCustom:`从自定义颜色中移除 {{hex}}`,custom:`自定义颜色`,default:`默认`,red:`红色`,orange:`橙色`,amber:`琥珀色`,yellow:`黄色`,lime:`青柠色`,green:`绿色`,emerald:`翠绿色`,teal:`蓝绿色`,cyan:`青色`,sky:`天蓝色`,blue:`蓝色`,indigo:`靛蓝色`,violet:`紫罗兰色`,purple:`紫色`,fuchsia:`紫红色`,pink:`粉色`,rose:`玫瑰色`,gray:`灰色`}},admin:{instance:{title:`管理`,heading:`实例`,edit:`编辑实例`,name:`名称`,description:`描述`,noDescription:`暂无描述`,version:`应用版本`,publicUrl:`公开 URL`,provider:{local:`本地 PostgreSQL 存储`,s3:`S3 兼容对象存储`,postgres:`内置 PostgreSQL`,elasticsearch:`Elasticsearch 兼容搜索`},section:{storage:`文件存储`,search:`工单搜索`,events:`事件投递`},viewConfiguration:`查看配置`,configure:{storage:`配置存储`,search:`配置搜索`,events:`配置事件投递`},providerTitle:`提供方`,deploymentManaged:`由部署管理`,instanceManaged:`由实例管理`,transfers:`传输`,indexStatus:`索引状态`,connection:`连接`,transfersS3:`文件在本地保存后会转移到对象存储。`,transfersLocal:`新文件存储在 PostgreSQL 中。`,searchBuiltIn:`搜索直接在 PostgreSQL 中运行。`,searchIndexed:`工单更改会在后台建立索引。`,eventsConnection:`通知用于唤醒消费者;PostgreSQL 保存重放历史。`,builtIn:`内置`,connected:`已连接`,upToDate:`已是最新`,status:{ready:`就绪`,transferring:`传输中`,indexing:`索引中`,connecting:`连接中`,unavailable:`不可用`},pendingTransfers:`待传输`,pendingRemain:`传输完成前,这些文件仍可从 PostgreSQL 读取。`,noPending:`没有等待传输的文件。`,bucket:`存储桶`,storageEndpoint:`存储端点`,backup:`备份`,backupBuckets:`请备份 PostgreSQL 以及所有被引用的对象存储桶。`,backupDatabase:`文件内容包含在 PostgreSQL 备份中。`,fallback:`回退`,fallbackDescription:`外部索引落后或离线时,可使用 PostgreSQL 搜索。`,searchEndpoint:`搜索端点`,index:`索引`,delivery:`投递`,deliveryDescription:`持久事件和重放保存在 PostgreSQL 中。可选的消息代理负责分发唤醒信号。`,brokerEndpoint:`消息代理端点`,exchange:`交换机`},configure:{storageTitle:`配置文件存储`,searchTitle:`配置工单搜索`,eventsTitle:`配置事件投递`,saved:`实例设置已保存`,instanceName:`实例名称`,instanceDescription:`实例描述`,publicUrlSource:`公开 URL 由部署中的 KANVIL_URL 设置。`,storageIntro:`附件和头像使用此提供方。现有文件保留在原存储位置。`,storageProvider:`存储提供方`,localDescription:`文件内容存储在本地数据库中,并包含在 PostgreSQL 备份内。`,s3Endpoint:`S3 端点`,s3EndpointHint:`使用 Amazon S3 时请将端点留空。`,region:`区域`,prefix:`对象键前缀`,accessKeyId:`访问密钥 ID`,secretAccessKey:`秘密访问密钥`,savedSecret:`已保存。留空则保持不变。`,deploymentCredentials:`省略时使用部署凭据`,pathStyle:`使用路径样式的存储桶 URL`,storageVerified:`存储连接已验证`,testStorage:`测试存储连接`,filesWaiting_other:`{{count, number}} 个文件等待传输。待传输文件仍可从 PostgreSQL 读取。`,transfersComplete:`所有文件传输已完成。`,storageDeployment:`存储由 KANVIL_STORAGE_PROVIDER 和 S3_* 部署变量配置。`,locations:`现有存储位置`,locationFiles_other:`{{count, number}} 个文件`,cleanUp:`清理未使用的文件`,cleanUpConfirm:`要移除未被引用的文件和超过一天的失败上传吗?附加到工单或个人资料的文件会保留。`,cleanUpNote:`清理也会自动运行。S3 对象需要在备份数据库的同时备份存储桶。`,searchProvider:`搜索提供方`,searchBuiltIn:`内置 PostgreSQL 搜索`,indexName:`Kanvil 索引名称`,searchAuthentication:`搜索身份验证`,noAuthentication:`无身份验证`,apiKey:`API 密钥`,basic:`用户名和密码`,searchApiKey:`搜索 API 密钥`,optional:`可选`,searchUsername:`搜索用户名`,searchPassword:`搜索密码`,searchVerified:`搜索连接已验证`,testSearch:`测试搜索连接`,rebuildQueued:`搜索重建已加入队列`,rebuild:`重建索引`,searchNote:`权限和筛选始终以 PostgreSQL 为准。外部索引同步中或不可用时,搜索会回退到 PostgreSQL。`,brokerProvider:`事件投递提供方`,brokerBuiltIn:`内置 PostgreSQL 通知`,rabbitUrl:`RabbitMQ 连接 URL`,savedBrokerEndpoint:`已保存的消息代理端点`,rabbitExchange:`RabbitMQ 交换机`,brokerVerified:`RabbitMQ 投递已验证`,testBroker:`测试消息代理连接`,brokerNote:`RabbitMQ 将已提交事件的唤醒信号分发给各 Kanvil 实例,并唤醒后台任务。PostgreSQL 保存持久事件和待处理任务,并在消息代理不可用时投递唤醒信号。`,brokerDeployment:`事件投递由 KANVIL_BROKER_PROVIDER 和 RABBITMQ_* 部署变量配置。`,save:`保存实例设置`},authentication:{title:`身份验证`,saved:`身份验证设置已保存`,emailPassword:`邮箱和密码登录`,emailPasswordDescription:`包括邮件登录验证码和密码重置。`,ssoProvision:`通过 SSO 自动创建用户`,ssoProvisionDescription:`新的 SSO 用户在受邀前没有任何工作区或项目访问权限。`,registration:`公开邮箱注册`,registrationClosed:`已关闭`,identityProvider:`身份提供方`,notConfigured:`未配置`,linkedProviders:`关联账户提供方`,linkedProvidersDescription:`仅允许已关联它们的账户登录;从不创建账户。`,save:`保存身份验证设置`,discoveryUrl:`OIDC 发现 URL`,clientId:`OIDC 客户端 ID`,oidcSetup:`在部署中配置 OIDC_DISCOVERY_URL、OIDC_CLIENT_ID、OIDC_CLIENT_SECRET 和 OIDC_NAME,或 GITHUB_、GOOGLE_ 或 DISCORD_ 的 CLIENT_ID 与 CLIENT_SECRET 组合,然后重启 Kanvil。提供方密钥永远不会返回给浏览器。`,consumers:`消费者接口`,mcpEndpoint:`MCP 端点`,eventFeed:`实时事件流`,openApi:`OpenAPI 规范`},users:{title:`用户`,search:`搜索用户`,searchPlaceholder:`名称或邮箱…`,new:`新建用户`,roleFilter:`实例角色筛选`,allRoles:`所有角色`,administrators:`管理员`,users:`用户`,statusFilter:`账户状态筛选`,allAccounts:`所有账户`,active:`活跃`,disabled:`已停用`,noMatches:`没有匹配的用户`,empty:`暂无用户`,user:`用户`,role:`角色`,status:`状态`,joined:`加入时间`,actions:`操作`,administrator:`管理员`,manage:`管理 {{name}}`,pagerNoun:`用户`,create:`创建账户`,creating:`创建中…`,created:`已创建 {{email}}`,name:`名称`,email:`邮箱`,initialPassword:`初始密码`,instanceRole:`实例角色`},account:{details:`账户详情`,joined:`加入于 {{date}}`,edit:`编辑账户`,instanceRole:`实例角色`,adminDescription:`可以管理所有工作区、账户和部署设置。`,userDescription:`访问权限由工作区和项目角色决定。`,changeRole:`更改角色`,changeRoleTitle:`更改实例角色`,signInMethods:`登录方式`,setPassword:`设置本地密码`,activeSessions:`活跃会话`,sessions_other:`{{count, number}} 个会话`,revokeSessions:`撤销会话`,revokeConfirm:`要让 {{name}} 在所有设备上退出登录吗?API 密钥仍然有效。`,sessionsRevoked:`会话已撤销`,access:`账户访问`,accessDisabled:`登录和 API 访问已停用。`,accessPreserved:`停用账户会保留工单和动态历史。`,enable:`启用账户`,disable:`停用账户`,enableConfirm:`要恢复 {{name}} 的登录吗?`,disableConfirm:`要停用 {{name}} 的登录和 API 访问,并撤销其会话吗?`,enabled:`账户已启用`,disabledToast:`账户已停用`,updateFailed:`无法更新账户`,workspaces:`工作区`,addToWorkspace:`添加到工作区`,noWorkspaces:`没有工作区成员资格`,projectAccess:`直接项目访问权限`,updated:`账户已更新`,roleUpdated:`实例角色已更新`,workspaceAdded:`已添加工作区访问权限`,passwordMismatch:`两次输入的新密码不一致。`,passwordSet:`已设置本地密码并撤销会话`,name:`名称`,email:`邮箱`,user:`用户`,administrator:`管理员`,adminsNote:`管理员可以管理所有工作区、用户和实例设置。`,workspace:`工作区`,workspaceRole:`工作区角色`,newPassword:`新密码`,confirmPassword:`确认新密码`,passwordNote:`这会设置本地密码,并让该用户在所有设备上退出登录。`,save:`保存更改`},delivery:{field:{address:`邮箱地址`,server:`服务器`,topic:`主题`,accessToken:`访问令牌`,applicationToken:`应用令牌`,endpointUrl:`端点 URL`,signingSecret:`签名密钥`,incomingWebhookUrl:`传入 Webhook URL`,webhookUrl:`Webhook URL`,channel:`频道`,botToken:`机器人令牌`,chatId:`聊天 ID`,chatIdPlaceholder:`-1001234567890 或 @channel`,topicId:`话题 ID`,optional:`{{label}}(可选)`,removeSaved:`移除已保存的{{label}}`,savedSecret:`已保存 · 留空则保持不变`},failure:{blockedAddress:`不允许使用此地址`,redirectBlocked:`端点进行了重定向`,dnsError:`找不到主机`,networkError:`无法连接`,timeout:`超时`,invalidEndpoint:`无效的端点`,emailUnavailable:`此服务器未配置邮件`,smtpError:`邮件服务器不可用`,accessRevoked:`连接它的管理员已失去访问权限;请重新连接`,repositoryMismatch:`收到了来自其他仓库的投递`,http:`被拒绝,HTTP {{status}}`,smtp:`邮件服务器返回 {{code}}`},health:{delivery:{done:`<time/>已投递`,pending:`发送中…`,none:`尚未发送`,failed:`{{reason}}`},access:{done:`<time/>已检查访问权限`,pending:`正在检查访问权限…`,none:`尚未检查访问权限`,failed:`访问检查:{{reason}}`},retrying:`重试中`},paused:`已暂停`,failing:`失败中`,sendTest:`向 {{name}} 发送测试`,testQueued:`测试已加入队列`,resume:`恢复 {{name}}`,pause:`暂停 {{name}}`,edit:`编辑 {{name}}`,disconnect:`断开 {{name}}`,disconnected:`{{name}} 已断开连接`,name:`名称`,type:`类型`,channels:`渠道`,addChannel:`添加渠道`,noChannels:`暂无渠道`,editChannel:`编辑渠道`,channelSaved:`渠道已保存`,channelRemoval:`要断开 {{name}} 吗?其设置和排队中的通知将被丢弃。`,sendFrom:`发送通知的来源`,routeOff:`无`,routeAll:`所有项目`,routeSelected:`所选项目`,saveChannel:`保存渠道`,adminsOnly:`由项目管理员管理集成`,destinations:`目标`,addDestination:`添加目标`,noDestinations:`暂无目标`,editDestination:`编辑目标`,destinationSaved:`目标已保存`,destinationRemoval:`要断开 {{name}} 吗?其设置和排队中的消息将被丢弃。`,send:`发送`,saveDestination:`保存目标`},repository:{setup:{github:`令牌需要仓库读取权限;如需评论或同步议题,还需要议题和拉取请求的写入权限。添加一个 GitHub Webhook:URL 从此仓库所在行复制,内容类型为 application/json,使用此密钥,并勾选 Branch or tag creation、Branch or tag deletion、Issues、Issue comments 和 Pull requests 事件。`,gitea:`令牌需要 read:repository 范围;如需评论或同步议题,还需要 write:issue。添加一个 Gitea Webhook:URL 从此仓库所在行复制,内容类型为 application/json,使用此密钥,并勾选 Create、Delete、Issues、Issue Label、Issue Comment 和 Pull Request 事件。`,gitlab:`令牌需要 read_api 范围;如需评论或同步议题,还需要 api。添加一个 GitLab Webhook:URL 从此仓库所在行复制,使用此密钥令牌,并勾选 Push、Issues、Comments 和 Merge request 事件。`},noWebhook:`尚未收到 Webhook`,webhookReceived:`<time/>收到 Webhook`,saved:`仓库已保存`,title:`仓库`,connect:`连接仓库`,empty:`暂无仓库`,checkAccess:`检查对 {{repository}} 的访问权限`,accessQueued:`访问检查已加入队列`,copyWebhook:`复制 {{repository}} 的 Webhook URL`,issueSync:`{{repository}} 的议题同步`,removal:`要断开 {{repository}} 吗?其 Webhook 将立即失效。它添加的链接会保留在工单上。`,edit:`编辑仓库`,host:`托管平台`,serverUrl:`服务器 URL`,serverUrlOptional:`服务器 URL(可选)`,repository:`{{host}} 仓库`,nestedPlaceholder:`group/project`,placeholder:`owner/repository`,accessToken:`访问令牌`,webhookSecret:`Webhook 密钥`,savedSecret:`已保存 · 留空则保持不变`,commentOnLink:{pull_request:`在新关联的议题和拉取请求上发表评论`,merge_request:`在新关联的议题和合并请求上发表评论`},moveTickets:`移动关联的工单`,noMove:`不移动`,save:`保存仓库`},issueSync:{reason:{labels:`其同步标签已更改`,conflict:`两边都有更改`,changedWhilePaused:`仓库暂停期间议题发生了更改`,unverified:`托管平台的响应未确认此更改`,claimConflict:`工单已被认领`,invalidContent:`议题超出了工单允许的长度`},issuesSyncing_other:`{{count, number}} 个议题同步中`,linksStopped_other:`{{count, number}} 个链接已停止`,match:`匹配`,matchAny:`包含任一标签`,matchAll:`包含所有标签`,preview:{matching:`继续同步`,export:`待创建的新议题`,pause:`待暂停的链接`,review:`待审核的链接`},applied:`议题同步已应用`,title:`议题同步 · {{repository}}`,outbound:`Kanvil 到 {{host}}`,exportTickets:`将工单导出为议题`,exportDescription:`未完成的工单会生成新议题;标题、描述、状态和新评论保持同步。`,ticketLabels:`仅包含带这些标签的工单`,everyTicket:`所有未完成的工单`,inbound:`{{host}} 到 Kanvil`,importIssues:`将议题导入为工单`,importDescription:`未关闭的议题会在 {{host}} 下次报告时导入。`,issueLabels:`仅包含带这些标签的议题`,everyIssue:`所有未关闭的议题`,previewLabel:`预览`,previewAction:`预览`,stopped:`已停止的链接 · {{repository}}`,review:`审核`,linkRemoved:`链接已移除`,resumed:`同步已恢复`,open:`打开`,closed:`已关闭`,reviewTitle:`审核 {{key}}`,mayExist:`{{host}} 上可能已存在此议题;再次创建前请先确认。`,comparison:`对比`,field:{title:`标题`,description:`描述`,state:`状态`},notReported:`未报告`,unlink:`取消关联`,keepHost:`保留 {{host}} 的版本`,keepKanvil:`保留 Kanvil 的版本`,createAgain:`重新创建议题`,unlinkTicket:`取消关联 {{key}}`,unlinkConfirm:`要停止同步 {{key}} 吗?工单和议题都会保留。`},import:{count:{tickets:`工单`,workflow:`工作流状态`,fields:`自定义字段`,labels:`标签`,relations:`关联`,comments:`评论`,evidence:`证据`,links:`链接`},notExport:`此文件不是 Kanvil 工单导出文件。`,progress_other:`{{status}} · {{done, number}} / {{count, number}} 条记录`,progressFailed_other:`{{status}} · {{done, number}} / {{count, number}} 条记录 · {{failed, number}} 条失败`,title:`导入`,description:`从 Kanvil 工单导出文件或其他跟踪工具(Linear、Jira、Trello、Plane、PLANKA 或 Kaneo)创建项目。`,action:`导入项目`,detailsOf:`{{name}} 的详情`,details:`详情`,exportFile:`Kanvil 导出文件`,source:`来源`,file:`导出文件`,jiraEdition:`Jira 版本`,siteUrl:`站点 URL`,accountEmail:`账户邮箱`,apiKey:`API 密钥`,apiToken:`API 令牌`,personalToken:`个人访问令牌`,token:`令牌`,apiUrl:`API URL`,workspaceSlug:`工作区 URL 标识`,signInWith:`登录方式`,username:`用户名或邮箱`,password:`密码`,checkConnection:`请检查连接信息`,noProjects:`这些凭据无法读取任何{{label}}。`,includeComments:`包含评论`,projectName:`项目名称`,start:`导入`,connect:`连接`,preview:`预览`,starting:`启动中…`,connecting:`连接中…`,checking:`检查中…`,matched:`已匹配的人员`,unmatched:`未匹配的人员`,previewLabel:`导入预览`,errorPrefix:`错误:`,notePrefix:`注意:`,progressLabel:`导入进度`,notImported:`未导入的记录`,stop:`停止导入`,openProject:`打开项目`}},native:{labelValue:`{{label}}:{{value}}`,ui:{dismiss:`关闭`,loading:`加载中`},server:{url:`服务器 URL`,connect:`连接`,change:`更换服务器`,invalidOrigin:`请使用 Kanvil 服务器的 HTTP 或 HTTPS 源地址,不要包含路径或凭据。`,httpsRequired:`请使用 HTTPS 连接到 Kanvil 服务器。`},login:{setupTitle:`创建所有者账户`,signIn:`登录`,signingIn:`正在登录…`,createAccount:`创建账户`,signInWith:`使用 {{provider}} 登录`,name:`名称`,setupToken:`设置令牌`,email:`邮箱`,password:`密码`},connection:{connecting:`连接中`,connected:`● 实时`,offline:`离线 · 缓存数据`,closed:`已关闭`,signedOut:`登录以重新连接`},screen:{projects:`项目`,inbox:`收件箱`,settings:`设置`,tickets:`工单`,ticket:`工单`,newTicket:`新建工单`,editTicket:`编辑工单`},projects:{empty:`暂无项目`,new:`新建项目`,name:`项目名称`,prefix:`工单前缀`,description:`描述`,create:`创建项目`},tickets:{search:`搜索工单`,searchPlaceholder:`标题、描述或编号`,allStatuses:`所有状态`,empty:`没有匹配的工单`,count:`{{shown}} / {{total}}`},ticket:{priority:`{{priority}}优先级`,noDifficulty:`未指定难度`,version:`v{{version}}`,starts:`{{date}} 开始`,due:`{{date}} 截止`},editor:{stale:`此工单已被更改。你保存的草稿仍基于版本 {{version}}。`,discardDraft:`放弃草稿并重新加载`,title:`标题`,noDifficulty:`未指定`,labels:`标签(以逗号分隔)`,scopes:`范围(以逗号分隔)`,editMarkdown:`编辑 Markdown`,previewMarkdown:`预览 Markdown`,description:`描述(Markdown)`,acceptanceCriteria:`验收标准(Markdown)`,parent:`父工单 ID`,automationReady:`在需求和依赖允许时可供智能体处理`,holdReason:`搁置原因`,draftSaved:`草稿已保存在此设备上`,save:`保存工单`},detail:{archived:`已归档`,subscribe:`订阅`,unsubscribe:`取消订阅`,share:`分享`,description:`描述`,noDescription:`_暂无描述_`,acceptanceCriteria:`验收标准`,noAcceptanceCriteria:`_暂无验收标准_`,fields:`字段`,archive:{action:`归档工单`,title:`要归档工单吗?`,message:`要将此工单从活跃列表中移除,并取消智能体处理资格吗?`},unarchive:{action:`取消归档工单`,title:`要取消归档工单吗?`,message:`要将此工单恢复到活跃列表吗?`}},readiness:{title:`智能体就绪状态`,ready:`可以认领`,notReady:`尚不可认领`,hold:`搁置:{{reason}}`,claimed:`已被 {{worker}} 认领,直到 {{time}}。`,release:{action:`释放我的认领`,title:`要释放认领吗?`,message:`释放所有权前,请先停止你的执行者。`,confirm:`释放`},recover:{action:`收回已过期的认领`,explanation:`请先确认执行者已停止。`,reason:`收回原因`,confirm:`执行者已停止 · 收回`}},relations:{title:`关联`,parent:`父工单 · {{key}} · {{title}}`,openParent:`打开父工单`,children:`子工单`,previousChildren:`上一组子工单`,nextChildren:`下一组子工单`,remove:`移除关联`,removeTitle:`要移除关联吗?`,add:`添加关联`,find:`查找工单`,type:`关联类型`,ticket:`工单`,choose:`选择工单`},discussion:{title:`讨论`,previous:`较早的评论`,next:`较新的评论`,field:`评论(Markdown)`,submit:`评论`,you:`你`,edit:`编辑评论`,editField:`评论`,delete:`删除评论`,deleteTitle:`要删除评论吗?`,deleteMessage:`要永久移除此评论吗?`,save:`保存评论`},attachments:{title:`附件`,item:`{{name}} · {{size}} kB`,remove:`移除 {{name}}`,removeTitle:`要移除附件吗?`,working:`处理中…`,add:`添加附件`,tooLarge:`请选择不超过 10 MB 的文件。`,sharingUnavailable:`此设备无法分享文件。`},evidence:{title:`证据`,explanation:`结果由提交它们的账户报告。`,add:`添加证据`,name:`标题`,url:`URL`,outcome:`报告的结果`,commit:`提交(完整哈希)`,note:`备注`,save:`保存证据`},activity:{title:`动态`,previous:`较早的动态`,next:`较新的动态`},inbox:{markAllRead:`全部标记为已读`,empty:`没有通知`},notifications:{title:`通知`,inApp:`在收件箱中接收已订阅工单的更新`,push:`推送通知`,enableDevice:`在此设备上启用推送`,disableDevice:`在此设备上停用推送`,unconfigured:`此版本需要 Expo 项目 ID 和签名配置才能推送。`,noProjectId:`此版本需要 Expo 项目 ID 才能接收推送通知。`,permissionDenied:`请在设备设置中允许通知以启用推送。`,channel:`工单更新`},settings:{password:{title:`本地密码`,current:`当前密码`,new:`新密码`,change:`更改密码`,updated:`密码已更新;其他会话已撤销`},oidc:{linked:`账户已关联`,explanation:`使用此提供方登录前,请先关联此账户。`,link:`关联 {{provider}}`},signOut:{action:`退出登录`,title:`要退出登录吗?`,message:`此账户的缓存工单和草稿将从此设备中移除。`},changeServer:{title:`要更换服务器吗?`,message:`要退出登录并清除此账户的本地缓存和草稿吗?`}}}};export{e as default};
@@ -1 +1 @@
1
- import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{t as i}from"./isSameWeek-2ftYGvBT.js";import{Dt as a}from"./index-MTE_naHG.js";var o={lessThanXSeconds:{one:`不到 1 秒`,other:`不到 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分钟`,lessThanXMinutes:{one:`不到 1 分钟`,other:`不到 {{count}} 分钟`},xMinutes:{one:`1 分钟`,other:`{{count}} 分钟`},xHours:{one:`1 小时`,other:`{{count}} 小时`},aboutXHours:{one:`大约 1 小时`,other:`大约 {{count}} 小时`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大约 1 个星期`,other:`大约 {{count}} 个星期`},xWeeks:{one:`1 个星期`,other:`{{count}} 个星期`},aboutXMonths:{one:`大约 1 个月`,other:`大约 {{count}} 个月`},xMonths:{one:`1 个月`,other:`{{count}} 个月`},aboutXYears:{one:`大约 1 年`,other:`大约 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超过 1 年`,other:`超过 {{count}} 年`},almostXYears:{one:`将近 1 年`,other:`将近 {{count}} 年`}},s=(e,t,n)=>{let r,i=o[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`内`:r+`前`:r},c={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})};function l(e,t,n){return i(e,t,n)?`eeee p`:e.getTime()>t.getTime()?`'下个'eeee p`:`'上个'eeee p`}var u={lastWeek:l,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:l,other:`PP p`},d={code:`zh-CN`,formatDistance:s,formatLong:c,formatRelative:(e,t,n,r)=>{let i=u[e];return typeof i==`function`?i(t,n,r):i},localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n.toString()+`日`;case`hour`:return n.toString()+`时`;case`minute`:return n.toString()+`分`;case`second`:return n.toString()+`秒`;default:return`第 `+n.toString()}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一季`,`第二季`,`第三季`,`第四季`],wide:[`第一季度`,`第二季度`,`第三季度`,`第四季度`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`周日`,`周一`,`周二`,`周三`,`周四`,`周五`,`周六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|时|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t.today&&(i=`今天,${i}`),t.selected&&(i=`${i},已选择`),i},labelMonthDropdown:`选择月份`,labelNext:`前往下个月`,labelPrevious:`前往上个月`,labelWeekNumber:e=>`第 ${e} 周`,labelYearDropdown:`选择年份`,labelGrid:(e,t,n)=>(n??new a(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t?.today&&(i=`今天,${i}`),i},labelNav:`导航栏`,labelWeekNumberHeader:`周数`,labelWeekday:(e,t,n)=>(n??new a(t)).format(e,`cccc`)}};export{d as zhCN};
1
+ import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{t as i}from"./isSameWeek-2ftYGvBT.js";import{Dt as a}from"./index-CYVrs22O.js";var o={lessThanXSeconds:{one:`不到 1 秒`,other:`不到 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分钟`,lessThanXMinutes:{one:`不到 1 分钟`,other:`不到 {{count}} 分钟`},xMinutes:{one:`1 分钟`,other:`{{count}} 分钟`},xHours:{one:`1 小时`,other:`{{count}} 小时`},aboutXHours:{one:`大约 1 小时`,other:`大约 {{count}} 小时`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大约 1 个星期`,other:`大约 {{count}} 个星期`},xWeeks:{one:`1 个星期`,other:`{{count}} 个星期`},aboutXMonths:{one:`大约 1 个月`,other:`大约 {{count}} 个月`},xMonths:{one:`1 个月`,other:`{{count}} 个月`},aboutXYears:{one:`大约 1 年`,other:`大约 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超过 1 年`,other:`超过 {{count}} 年`},almostXYears:{one:`将近 1 年`,other:`将近 {{count}} 年`}},s=(e,t,n)=>{let r,i=o[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`内`:r+`前`:r},c={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})};function l(e,t,n){return i(e,t,n)?`eeee p`:e.getTime()>t.getTime()?`'下个'eeee p`:`'上个'eeee p`}var u={lastWeek:l,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:l,other:`PP p`},d={code:`zh-CN`,formatDistance:s,formatLong:c,formatRelative:(e,t,n,r)=>{let i=u[e];return typeof i==`function`?i(t,n,r):i},localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n.toString()+`日`;case`hour`:return n.toString()+`时`;case`minute`:return n.toString()+`分`;case`second`:return n.toString()+`秒`;default:return`第 `+n.toString()}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一季`,`第二季`,`第三季`,`第四季`],wide:[`第一季度`,`第二季度`,`第三季度`,`第四季度`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`周日`,`周一`,`周二`,`周三`,`周四`,`周五`,`周六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜间`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|时|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t.today&&(i=`今天,${i}`),t.selected&&(i=`${i},已选择`),i},labelMonthDropdown:`选择月份`,labelNext:`前往下个月`,labelPrevious:`前往上个月`,labelWeekNumber:e=>`第 ${e} 周`,labelYearDropdown:`选择年份`,labelGrid:(e,t,n)=>(n??new a(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let i=(r??new a(n)).format(e,`PPPP`);return t?.today&&(i=`今天,${i}`),i},labelNav:`导航栏`,labelWeekNumberHeader:`周数`,labelWeekday:(e,t,n)=>(n??new a(t)).format(e,`cccc`)}};export{d as zhCN};
@@ -0,0 +1 @@
1
+ var e={common:{status:{backlog:`待規劃`,todo:`待處理`,in_progress:`進行中`,in_review:`審查中`,done:`已完成`,cancelled:`已取消`},priority:{urgent:`緊急`,high:`高`,medium:`中`,low:`低`,none:`無優先順序`},kind:{feature:`功能`,bug:`錯誤`,chore:`雜務`,research:`研究`,documentation:`文件`},difficulty:{low:`低`,med:`中`,high:`高`,none:`無難度`},role:{reader:`唯讀`,writer:`可編輯`,admin:`管理員`},permission:{ticket:{write:{label:`編輯工單`,description:`建立、編輯、移動、認領及留言工單;建立專案`},delete:{label:`刪除工單`,description:`永久刪除工單`}},project:{manage:{label:`管理專案`,description:`專案詳細資料、工作流程、標籤、欄位、整合及生命週期`}},member:{manage:{label:`管理成員`,description:`新增、變更及移除成員`}},invitation:{manage:{label:`管理邀請`,description:`透過電子郵件邀請成員`}},sharing:{manage:{label:`管理共用`,description:`公開唯讀連結及行事曆訂閱`}},workspace:{manage:{label:`管理工作區`,description:`工作區詳細資料、共用標籤及角色`}}},customFieldType:{text:`文字`,number:`數字`,date:`日期`,checkbox:`核取方塊`,select:`單選`,multiselect:`複選`},customField:{removedOption:`已移除的選項`,checked:`是`},filterField:{status:`狀態`,priority:`優先順序`,kind:`類型`,difficulty:`難度`,label:`標籤`,assigneeId:`負責人`,customField:`欄位`},sort:{priority:`優先順序`,updated:`最近更新`,created:`最近建立`,title:`標題`,labels:`標籤`,due:`到期日`,start:`開始日期`,number:`工單編號`,status:`狀態`,difficulty:`難度`,kind:`類型`,assignee:`負責人`,manual:`手動`},due:{overdue:`已逾期`,today:`今天到期`,week:`本週到期`,scheduled:`有到期日`,none:`無到期日`},relation:{blocks:{outgoing:`阻擋`,incoming:`被阻擋於`},related:{outgoing:`相關`,incoming:`相關`},duplicate:{outgoing:`重複於`,incoming:`被重複於`},causes:{outgoing:`導致`,incoming:`由其導致`},clones:{outgoing:`複製自`,incoming:`被複製為`},implements:{outgoing:`實作`,incoming:`由其實作`},reviews:{outgoing:`審查`,incoming:`由其審查`}},remoteKind:{branch:`分支`,pull_request:`提取要求`,issue:`議題`},notificationCategory:{assignment:`指派`,status:`狀態變更`,comment:`留言`,mention:`提及`,update:`其他更新`,due_soon:`即將到期`,overdue:`已逾期`},destinationEvent:{created:`新工單`},deliveryKind:{email:`電子郵件`,webhook:`Webhook`},change:{pull_request:{name:`提取要求`,opened:`提取要求已開啟`,draft:`草稿提取要求`,merged:`提取要求已合併`,closed:`提取要求未合併即關閉`},merge_request:{name:`合併要求`,opened:`合併要求已開啟`,draft:`草稿合併要求`,merged:`合併要求已合併`,closed:`合併要求未合併即關閉`},branchCreated:`分支已建立`},issueLinkState:{active:`同步中`,paused:`已暫停`,review:`需要審查`,creating:`正在建立議題`,unknown:`建立未確認`},importStatus:{previewed:`可以匯入`,running:`匯入中`,completed:`已匯入`,failed:`失敗`,cancelled:`已取消`},importProvider:{linear:{project:`團隊`,setup:`請在 Linear 的 Settings › Security & access 建立個人 API 金鑰,具備讀取權限即可。`},jira:{project:`專案`,setup:`Jira Cloud 使用帳號電子郵件及在 id.atlassian.com 建立的 API 權杖登入;Data Center 和 Server 使用個人存取權杖。具備專案的瀏覽權限即可。`},trello:{project:`看板`,setup:`請使用你在 trello.com/power-ups/admin 管理的 Power-Up 的 API 金鑰及為其產生的權杖,具備讀取權限即可。`},plane:{project:`專案`,setup:`請在 Plane 的 Profile settings › Personal access tokens 建立個人存取權杖。Plane Cloud 的 API 位址為 https://api.plane.so;工作區 URL 代碼是其網址的第一段。`},planka:{project:`看板`,setup:`請使用可開啟該看板的 PLANKA 帳號登入;Kanvil 開啟的工作階段會在讀取結束時關閉。PLANKA 2 管理員也可以改為核發 API 金鑰。`},kaneo:{project:`專案`,setup:`請在 Kaneo 的 Settings › Account › Developer 建立 API 金鑰。`}},plankaSignIn:{password:`使用者名稱和密碼`,api_key:`API 金鑰`},jiraEdition:{cloud:`Cloud`,data_center:`Data Center 或 Server`},event:{time_entry:{created:`已建立時間紀錄`,updated:`已更新時間紀錄`,deleted:`已刪除時間紀錄`},label:{created:`標籤已建立`,updated:`標籤已更新`,deleted:`標籤已刪除`},workflow:{created:`工作流程狀態已新增`,updated:`工作流程狀態已變更`,deleted:`工作流程狀態已移除`},custom_field:{created:`欄位已建立`,updated:`欄位已更新`,deleted:`欄位已刪除`},ticket:{created:`工單已建立`,updated:`工單已更新`,deleted:`工單已刪除`,moved:`從其他專案移入`,moved_away:`已移至其他專案`,due_soon:`即將到期`,overdue:`已逾期`,claimed:`工作已認領`},claim:{renewed:`認領已續期`,released:`認領已釋出`,recovered:`認領已收回`},comment:{created:`已新增留言`,updated:`留言已編輯`,deleted:`留言已刪除`},relation:{added:`已新增關聯`,removed:`已移除關聯`},attachment:{created:`已附加檔案`,deleted:`已移除檔案`},evidence:{added:`已附加佐證`},resource:{added:`已新增連結`,updated:`連結已編輯`,removed:`已移除連結`},calendar_feed:{created:`行事曆訂閱已建立`,revoked:`行事曆訂閱已撤銷`},project:{created:`專案已建立`,updated:`專案已更新`,archived:`專案已封存`,restored:`專案已還原`,transferred:`專案已移至其他工作區`,deleted:`專案已刪除`},membership:{updated:`專案存取權已變更`},workspace:{owner_changed:`工作區擁有者已變更`},role:{created:`角色已建立`,updated:`角色已變更`,deleted:`角色已刪除`},invitation:{updated:`邀請已變更`},destination:{created:`已新增目的地`,updated:`目的地已變更`,deleted:`已移除目的地`},repository:{connected:`儲存庫已連線`,updated:`儲存庫連線已變更`,disconnected:`儲存庫已中斷連線`,received:`已收到儲存庫 Webhook`},issue_link:{updated:`議題同步已變更`}},error:{network:`無法連線至 Kanvil。請檢查網路連線後再試一次。`,fallback:`無法完成要求`,input:`輸入`,code:{unauthorized:`請登入以繼續。`,session_required:`此動作需要使用已登入的帳號。`,account_disabled:`此帳號已停用。`,forbidden:`您沒有執行此動作的權限。`,insufficient_scope:`此憑證不允許執行此動作。`,workspace_scope_required:`此動作需要使用具備工作區存取權的帳號。`,invalid_origin:`不允許此來源。`,not_found:`找不到此項目,或您無權檢視。`,version_conflict:`載入後此內容已變更。請重新載入後再試一次。`,time_entry_conflict:`此使用者在此工單上已有進行中的時間紀錄。`,claim_conflict:`另一個執行者已認領此工單。`,idempotency_conflict:`此要求已用於另一項變更。`,project_archived:`請先還原已封存的專案再進行變更。`,rate_limited:`短時間內變更過多。請稍候再試。`,snapshot_required:`即時動態已落後。請重新載入以繼續。`,request_failed:`無法完成要求`}},action:{add:`新增`,apply:`套用`,back:`返回`,cancel:`取消`,clear:`清除`,close:`關閉`,confirm:`確認`,continue:`繼續`,copy:`複製`,create:`建立`,delete:`刪除`,done:`完成`,edit:`編輯`,open:`開啟`,remove:`移除`,rename:`重新命名`,reset:`重設`,retry:`重試`,save:`儲存`,search:`搜尋`},state:{copied:`已複製`,loading:`載入中…`,saved:`已儲存`,saving:`儲存中…`,none:`無`,unassigned:`未指派`},evidenceKind:{pull_request:`提取要求`,test:`測試`,review:`審查`,deployment:`部署`,device:`裝置`,other:`其他`},evidenceOutcome:{reported:`已回報`,pending:`待定`,passed:`通過`,failed:`失敗`},readinessReason:{project_archived:`專案已封存`,not_open:`工單必須處於待處理狀態且未封存`,not_enabled:`尚未啟用代理程式工作`,missing_description:`新增說明`,missing_acceptance_criteria:`新增驗收條件`,missing_difficulty:`選擇難度`,duplicate:`此工單已標示為重複`,claim_recovery_required:`收回擁有權前,請確認先前的執行者已停止`,claimed:`已由 {{worker}} 認領`,dependency:`{{key}} 尚未完成`},person:{deleted:`已刪除的帳號`,former:`前成員`},signIn:{codeTitle:`使用驗證碼登入`,resetTitle:`重設密碼`,codeSent:`如果 {{email}} 有帳號,驗證碼已在寄送途中。驗證碼將於 10 分鐘後過期。`,code:`驗證碼`,newPassword:`新密碼`,sendCode:`以電子郵件寄送驗證碼`,back:`返回登入`,resend:`重新寄送驗證碼`,resent:`已重新寄送驗證碼`,emailCode:`以電子郵件寄送登入驗證碼`,forgot:`忘記密碼?`,resetDone:`密碼已重設。請使用新密碼登入。`,resetDoneTitle:`密碼已重設`,resetDoneBody:`請使用新密碼登入。`,invalidCode:`此驗證碼錯誤、已使用或已過期。請重新寄送以取得有效的驗證碼。`,localPassword:`本機密碼`},language:{label:`語言`,system:`系統預設`}},shell:{ui:{showValue:`顯示{{label}}`,hideValue:`隱藏{{label}}`,previousPage:`上一頁{{noun}}`,nextPage:`下一頁{{noun}}`,pageRange:`第 {{from}}–{{to}} 項,共 {{total}} 項`,priority:`{{label}}優先順序`,working:`處理中…`,searchPlaceholder:`搜尋…`,clearValue:`清除{{label}}`,copyValue:`複製{{label}}`,copied:`已複製{{value}}`},documentTitle:`{{name}} · Kanvil`,openKanvil:`開啟 Kanvil`,page:{home:`首頁`,myWork:`我的工作`,inbox:`收件匣`,search:`搜尋`,settings:`設定`,planning:`規劃`,ticket:`工單`,tickets:`工單`,projects:`專案`},connection:{restored:`連線已恢復`,lost:`連線已中斷`,reconnecting:`正在重新連線…`,reload:`重新載入`,signIn:`登入以重新連線`},app:{skipToContent:`跳至內容`,assigned:`指派給您的`,openCount_other:`{{count, number}} 個未完成`,noAssigned:`沒有指派給您的未完成工單`,allInMyWork_other:`在「我的工作」中檢視全部 {{count, number}} 個`,openMyWork:`開啟「我的工作」`,recentActivity:`最近活動`,noActivity:`尚無活動`,searchProjects:`搜尋專案`,projectCount_other:`{{count, number}} 個專案`,noMatchingProjects:`沒有相符的專案`,clearSearch:`清除搜尋`,noWorkspaces:`尚無工作區`,noActiveProjects:`沒有使用中的專案`,noProjects:`尚無專案`,archivedProjects:`已封存的專案`,archived:`已封存`,noOpenTickets:`沒有未完成的工單`,overdueCount_other:`{{count, number}} 個已逾期`,percentDone:`已完成 {{percent}}`,nextDue:`下次到期 <time/>`,projectSettingsFor:`{{name}} 的專案設定`,pageNotFound:`找不到頁面`,openHome:`開啟首頁`,tryAgain:`再試一次`,adminRequired:`需要執行個體管理員權限`,projectNotFound:`找不到專案`,noWorkspaceSelected:`未選取工作區`},auth:{signIn:`登入`,createOwner:`建立擁有者帳號`,ownerHint:`第一個帳號負責管理此執行個體。`,invitedHint:`請使用受邀的電子郵件地址登入以接受邀請。`,signInWith:`使用 {{provider}} 登入`,useEmail:`使用電子郵件和密碼`,or:`或`,name:`名稱`,setupToken:`設定權杖`,setupTokenHint:`請使用執行個體設定中的 KANVIL_SETUP_TOKEN。`,email:`電子郵件`,password:`密碼`,signingIn:`正在登入…`,createAccount:`建立帳號`,consent:{expired:`授權要求已過期。請重新連線用戶端。`,title:`授權 {{client}}`,titleUnnamed:`授權用戶端`,subtitle:`此用戶端要求以您的帳號身分存取。專案權限仍然適用。`,deny:`拒絕`,allow:`允許存取`},invitation:{unavailable:`邀請無法使用`,join:`加入 {{workspace}}`,invited:`受邀帳號`,from:`邀請者`,access:`存取權`,removedProjects:`已移除的專案`,wholeWorkspace:`整個工作區`,expires:`到期時間`,expired:`此邀請已過期。請向工作區管理員索取新的邀請。`,revoked:`此邀請已撤銷。請向工作區管理員索取新的邀請。`,accepted:`此邀請已被接受。請向工作區管理員索取新的邀請。`,wrongAccount:`您目前以 <account>{{current}}</account> 的身分登入。請以 {{invited}} 的身分登入以接受邀請。`,signOut:`登出`,joined:`已加入 {{workspace}}`,accept:`接受邀請`},callback:{cancelled:`登入已取消。準備好後請再試一次。`,linkedElsewhere:`此身分已連結至另一個 Kanvil 帳號。請使用其他身分或聯絡管理員。`,notLinked:`此身分未連結至 Kanvil 帳號。請使用本機帳號登入,並在設定中連結。`,expired:`登入要求已過期或無法驗證。請在此畫面再試一次。`,emailMismatch:`無法連結身分識別提供者的電子郵件。請聯絡管理員。`,failed:`無法完成登入。請再試一次或聯絡管理員。`}},you:`您`,inbox:{markAllRead:`全部標示為已讀`,clearRead:`清除已讀`,cleared_other:`已清除 {{count, number}} 則已讀通知`,unread:`未讀`,mentions:`提及`,all:`所有通知`,noUnread:`沒有未讀通知`,noMentions:`沒有提及`,noNotifications:`沒有通知`,markUnread:`標示為未讀`,markRead:`標示為已讀`,dismiss:`移除`},search:{field:`搜尋工作區`,placeholder:`搜尋工單、專案、留言、活動…`,tab:{all:`全部`,project:`專案`,ticket:`工單`,comment:`留言`,activity:`活動`},indexing:`外部搜尋正在同步,工單結果暫時來自 PostgreSQL。`,empty:`搜尋工單、專案、留言及活動`,noResults:`找不到「{{query}}」的結果`,results:`搜尋結果`,pages:`搜尋結果分頁`,previous:`上一頁`,next:`下一頁`,type:{project:`專案`,ticket:`工單`,comment:`留言`,activity:`活動`}},column:{key:`工單`,labels:`標籤`,scopes:`範圍`,status:`狀態`,priority:`優先順序`,difficulty:`難度`,kind:`類型`,assigneeId:`負責人`,startAt:`開始`,dueAt:`到期`,createdAt:`建立時間`,updatedAt:`更新時間`},public:{notShared:`此專案未共用`,notSharedHint:`此連結已關閉或從未存在。成員可登入後檢視。`,noTickets:`沒有工單`,ticketUnavailable:`工單無法使用`,backToTickets:`返回工單`,description:`說明`,noDescription:`_尚無說明_`,acceptanceCriteria:`驗收條件`,noAcceptanceCriteria:`_尚無驗收條件_`,ticketProperties:`工單屬性`,properties:`屬性`,status:`狀態`,priority:`優先順序`,kind:`類型`,difficulty:`難度`,startDate:`開始日期`,dueDate:`到期日`,labels:`標籤`,scopes:`範圍`,created:`建立時間`,updated:`更新時間`,relationships:`關聯`,parent:`父工單`,child:`子工單`},sidebar:{workspace:`工作區`,unread_other:`{{count, number}} 則未讀`,userSettings:`使用者設定`,administration:`管理`,signOut:`登出`,projectSettings:`專案設定`},workspace:{new:`新增工作區`,name:`工作區名稱`,key:`工作區代碼`,create:`建立工作區`,workspaces:`工作區`,switch:`切換工作區`,settings:`工作區設定`},palette:{open:`前往…`,title:`前往`,description:`尋找專案、工單、頁面或動作`,placeholder:`搜尋工單、專案、頁面、動作…`,searching:`搜尋中…`,noResults:`沒有結果`,jumpTo:`跳至`,openKey:`在 {{project}} 中開啟 {{key}}`,resultsIn:`{{workspace}} 中的結果`,results:`結果`,seeAll_other:`檢視全部 {{count, number}} 個結果`,actions:`動作`,pages:`頁面`,newTicketIn:`在 {{project}} 中新增工單`,myTicketsIn:`我在 {{project}} 中的工單`,lightMode:`切換為淺色模式`,darkMode:`切換為深色模式`,keywords:{jump:`{{query}} 跳至 開啟`,allResults:`所有結果 {{query}}`,newTicket:`新增工單 建立`,myTickets:`我的工單 指派給我`,lightMode:`切換 淺色模式 主題 外觀`,darkMode:`切換 深色模式 主題 外觀`,help:`鍵盤快速鍵 說明`,home:`首頁 總覽 所有專案`,myWork:`我的工作 指派的工單`,search:`搜尋 留言 活動 專案 工單`,inbox:`收件匣 通知`,settings:`設定 {{scope}} {{label}}`}},actionCategory:{general:`一般`,ticketList:`工單清單`,inbox:`收件匣`,ticket:`工單`,search:`搜尋`,markdown:`Markdown`},action:{palette:`前往任何地方`,help:`鍵盤快速鍵`,sidebar:`切換側邊欄`,newTicket:`新增工單`,search:`搜尋工單`,highlight:`醒目提示下一個或上一個工單`,open:`開啟醒目提示的工單`,preview:`在清單旁預覽醒目提示的工單`,select:`選取醒目提示的工單`,properties:`設定醒目提示工單的狀態、優先順序或負責人`,inboxHighlight:`醒目提示下一則或上一則通知`,inboxOpen:`在收件匣旁檢視醒目提示通知的工單`,inboxRead:`將醒目提示的通知標示為已讀或未讀`,inboxDismiss:`移除醒目提示的通知`,step:`開啟下一個或上一個工單`,edit:`編輯工單`,save:`儲存工單或留言`,results:`在搜尋結果間移動`,insertBlock:`在視覺化編輯器中插入表格、圖表、檔案或其他區塊`},move:{top:{label:`將醒目提示的工單移至頂端`,menu:`移至頂端`},up:{label:`將醒目提示的工單上移`,menu:`上移`},down:{label:`將醒目提示的工單下移`,menu:`下移`},bottom:{label:`將醒目提示的工單移至底端`,menu:`移至底端`},previous:{label:`將醒目提示的工單移至上一個狀態`,menu:`移至上一個狀態`},next:{label:`將醒目提示的工單移至下一個狀態`,menu:`移至下一個狀態`}},copy:{link:{label:`複製連結`,copied:`工單連結`},keyAndTitle:{label:`複製編號和標題`,copied:`工單`},title:{label:`複製標題`,copied:`標題`},markdown:{label:`複製為 Markdown`,copied:`Markdown`},branch:{label:`複製分支名稱`,copied:`分支名稱`}},settingsNav:{account:`帳號`,settings:`設定`,workspace:`工作區`,workspaceSettings:`工作區設定`,projects:`專案`,projectSettings:`專案設定`,administration:`管理`,section:{profile:`個人資料與安全性`,appearance:`外觀`,preferences:`偏好設定`,credentials:`API 金鑰`,notifications:`通知`,general:`一般`,members:`成員`,roles:`角色`,labels:`標籤`,workflow:`工作流程`,fields:`欄位`,integrations:`整合`,calendar:`行事曆訂閱`,storage:`檔案儲存空間`,search:`搜尋`,events:`事件傳遞`,users:`使用者`,workspaces:`工作區`,authentication:`驗證`}},browser:{copyFailed:`複製失敗。請選取文字後手動複製。`,readFailed:`無法讀取檔案`,encodeFailed:`無法編碼檔案`,imageTooBig:`請選擇小於 10 MB 的圖片。`,cannotResize:`此瀏覽器無法調整圖片大小。`,prepareFailed:`無法處理圖片。`,stillTooLarge:`調整大小後圖片仍然過大。請選擇較簡單的圖片。`},primitive:{close:`關閉`,more:`更多`,breadcrumb:`階層連結`,sidebar:`側邊欄`,sidebarDescription:`顯示行動版側邊欄。`,toggleSidebar:`切換側邊欄`,resizeSidebar:`調整側邊欄寬度`,expandSidebar:`展開側邊欄`,commandTitle:`命令面板`,commandDescription:`搜尋要執行的命令…`}},ticket:{list:{selectSection:`選取{{section}}工單`,expandSection:`展開{{section}}工單`,collapseSection:`收合{{section}}工單`,sectionTickets:`{{section}}工單`,later:`之後`,selectAll:`選取所有顯示的工單`,selectTicket:`選取 {{key}}`,title:`標題`,all:`全部`,planned:`已規劃`,archived:`已封存`,allTickets:`所有工單`,customView:`自訂檢視`,sectionCount:`{{n, number}} 個{{section}}`,planning:`{{project}} 規劃`,collection:`{{source}}({{sections}})`,moved:`{{key}} 已移動`,movedTo:`{{key}} 已移至{{status}}`,movedAbove:`{{key}} 已移至 {{neighbor}} 上方`,movedBelow:`{{key}} 已移至 {{neighbor}} 下方`,movedToAbove:`{{key}} 已移至{{status}},位於 {{neighbor}} 上方`,movedToBelow:`{{key}} 已移至{{status}},位於 {{neighbor}} 下方`,emptyFiltered:`沒有相符的工單`,emptyPlanning:`沒有已規劃或已封存的工單`,emptyProject:`尚無工單`,emptyWork:`沒有指派給您的未完成工單`,createFirst:`建立第一個工單`,activeWork:`進行中的工作`,views:`工單檢視`,saveCurrentView:`儲存目前的檢視`,deleteView:`刪除檢視 {{name}}`,deleteViewConfirm:`要從已儲存的檢視中移除 {{name}} 嗎?工單不受影響。`,planningLink:`規劃`,newTicketShortcut:`新增工單({{shortcut}})`,saveView:`儲存檢視`,viewSaved:`檢視已儲存`,viewName:`檢視名稱`,retry:`重新載入工單`,board:`工單看板`,tickets:`工單`,resizeColumn:`調整「{{column}}」欄寬`,count_other:`{{count, number}} 個工單`,scheduledCount_other:`{{count, number}} 個已排程工單`},move:{destination:`目的地`,projectPlaceholder:`移至專案…`,blockers:`移動前請先解決`,submit:`移動工單`,pending:`移動中…`},picker:{placeholder:`選擇工單`,loading:`正在載入工單…`,searchLabel:`搜尋{{label}}`,searchPlaceholder:`依標題或編號搜尋…`,noParent:`無父工單`,searching:`搜尋中…`,empty:`找不到工單`},property:{status:`狀態`,priority:`優先順序`,kind:`類型`,difficulty:`難度`,assignee:`負責人`,you:`{{name}}(您)`,assignTo:`指派給…`,set:`設定{{label}}…`,search:`搜尋{{label}}`,noMatches:`沒有相符項目`},field:{mixed:`混合`,unchecked:`否`,noValue:`無值`},project:{label:`專案`,placeholder:`在專案中建立…`,search:`搜尋專案`},tags:{labels:`標籤`,scopes:`範圍`,summary:`{{label}}:{{tags}}`,edit:`編輯{{label}}`,editValues:`編輯{{label}}:{{tags}}`,editMixed:`編輯{{label}}:混合`,mixed:`混合{{label}}`,none:`無{{label}}`,mixedNote:`所選工單的{{label}}各不相同。`,clear:`清除{{label}}`,replace:`取代{{label}}`},tagInput:{remove:`移除{{label}} {{tag}}`,addAnother:`再新增一個…`,add:`新增{{label}}…`,choose:`選擇{{label}}`,chooseLabels:`選擇標籤`,searchPlaceholder:`搜尋標籤…`,searchLabel:`搜尋專案標籤`,empty:`沒有相符的標籤`},link:{previewUnavailable:`無法預覽`},userPicker:{label:`帳號`,placeholder:`選擇帳號`,searchPlaceholder:`搜尋名稱或電子郵件…`,searchLabel:`搜尋帳號`,useEmail:`使用 {{email}}`,emptyAnyAccount:`搜尋成員,或輸入現有帳號的電子郵件。`,empty:`沒有相符的成員`},date:{placeholder:`選擇日期`,clear:`清除{{label}}`,start:`開始日期`,startShort:`開始`,noStart:`無開始日期`,due:`到期日`,dueShort:`到期`,noDue:`無到期日`},filter:{me:`我`,searchTickets:`搜尋工單`,searchTicketsPlaceholder:`搜尋工單…`,filters:`篩選`,filtersActive:`篩選({{active, number}})`,due:`到期`,anyDue:`任何到期日`,archived:`已封存`,hideArchived:`隱藏已封存`,includeArchived:`包含已封存`,archivedOnly:`僅已封存`,includingArchived:`包含已封存`,reset:`重設篩選`,clear:`清除篩選`,active:`目前的工單篩選`,searchChip:`搜尋:{{query}}`,chipAny:`{{field}}:`,chipNone:`{{field}}不是:`,notValues:`不是 {{values}}`,match:`{{label}}比對方式`,is:`是`,isNot:`不是`,searchPlaceholder:`{{search}}…`,anyValue:{status:`所有狀態`,priority:`所有優先順序`,kind:`所有類型`,difficulty:`所有難度`,label:`所有標籤`,assigneeId:`任何人`,customField:`任何欄位值`},searchValues:{status:`搜尋狀態`,priority:`搜尋優先順序`,kind:`搜尋類型`,difficulty:`搜尋難度`,label:`搜尋標籤`,assigneeId:`搜尋人員`,customField:`搜尋欄位`}},display:{title:`顯示`,orderBy:`排序依據`,direction:`方向`,ascending:`遞增`,descending:`遞減`,reset:`重設顯示`,groupBy:`分組依據`,dueDate:`到期日`,layout:`版面配置`,list:`清單`,board:`看板`,backgrounds:`專案背景`,show:`顯示`,hide:`隱藏`,rowSpacing:`列間距`,compact:`緊湊`,comfortable:`寬鬆`,labelDisplay:`標籤顯示`,compactPreview:`緊湊預覽`,allLabels:`所有標籤`,properties:`屬性`},selection:{region:`已選取的工單`,clear:`清除選取`,selected_other:`已選取 {{count, number}} 個`,selectedOf_other:`{{count, number}} / {{total}}<wide> 已選取</wide>`,applied_other:`已將{{label}}套用至 {{count, number}} 個工單`,partlyApplied_other:`已套用至 {{done, number}} / {{count, number}} 個工單`,mixedDue:`到期日各不相同`,fields:`欄位`,more:`更多動作`,moveTo:`移至{{status}}`,restoreChange:`還原`,restore:`還原所選項目`,archive:`封存所選項目`,delete:`刪除所選項目`,deleteLimit:`一次最多刪除 {{limit, number}} 個`,archiveConfirm_other:`要封存 {{collection}} 中的 {{count, number}} 個工單嗎?`,deleteConfirm_other:`要永久刪除 {{collection}} 中的 {{count, number}} 個工單及其留言、關聯和附件嗎?未選取的子工單將失去父工單。`,deleted_other:`已刪除 {{count, number}} 個工單`},menu:{copied:`已複製{{label}}`,open:`開啟工單`,preview:`預覽`,newTab:`在新分頁中開啟`,edit:`編輯工單`,editTitle:`編輯 {{key}}`,duplicate:`建立工單副本`,created:`已建立 {{key}}`,move:`移動`,moveToProject:`移至專案…`,moveTitle:`移動 {{key}}`,moved:`已移動為 {{key}}`,follow:`追蹤工單`,unfollow:`取消追蹤工單`,archive:`封存工單`,unarchive:`取消封存工單`,delete:`刪除工單`,deleteConfirm:`要永久刪除 {{key}} 及其留言、關聯和附件嗎?`,openProject:`開啟專案`,projectLink:`專案連結`,copyLink:`複製連結`,newTicket:`新增工單`,projectSettings:`專案設定`,manageAccount:`管理帳號`,email:`電子郵件`,copyEmail:`複製電子郵件`},schedule:{range:`{{from}} – {{to}}`,calendar:`行事曆`,timeline:`時間軸`,today:`今天`,previousMonth:`上個月`,nextMonth:`下個月`,previousWeeks:`前兩週`,nextWeeks:`後兩週`,emptyWeeks:`這幾週沒有排程`,monthTickets:`{{title}}的工單`,showDay_other:`顯示 {{day}} 的全部 {{count, number}} 個工單`,more_other:`還有 {{count, number}} 個`,ticketColumn:`工單`,scheduledTickets:`已排程工單`},copy:{description:`說明`,acceptanceCriteria:`驗收條件`}},detail:{field:{title:`標題`,description:`說明`,acceptanceCriteria:`驗收條件`,parent:`父工單`,parentTicket:`父工單`,labels:`標籤`,scopes:`範圍`,holdReason:`暫緩原因`,url:`URL`},page:{preview:`工單預覽`,unavailable:`工單無法使用`,noProject:`此連結未指明工單所屬的專案。`,gone:`此工單已刪除,或您已沒有存取權。`,closePreview:`關閉預覽`,openFullPage:`以完整頁面開啟`,backToTickets:`返回工單`,tickets:`工單`,previousTicket:`上一個工單`,previousTicketShortcut:`上一個工單(K)`,nextTicket:`下一個工單`,nextTicketShortcut:`下一個工單(J)`,position:`{{position, number}} / {{total, number}}`,subscribe:`訂閱`,unsubscribe:`取消訂閱`,subscribed:`已訂閱更新`,unsubscribed:`已取消訂閱`,archive:`封存工單`,unarchive:`取消封存工單`,archivedToast:`工單已封存`,unarchivedToast:`工單已取消封存`,archived:`已封存`,edit:`編輯工單`,editShortcut:`編輯工單(E)`,editTitle:`編輯 {{key}}`,actions:`工單動作`,copyKey:`複製工單編號`,keyCopied:`已複製 {{key}}`,noDescription:`_尚無說明_`,noAcceptanceCriteria:`_尚無驗收條件_`,coordination:`工單協作`,properties:`屬性`,created:`建立時間`,updated:`更新時間`},section:{discussion:`討論`,evidence:`佐證`,activity:`活動`},readiness:{heading:`代理程式就緒狀態`,ready:`可以認領`,notReady:`尚不可認領`,hold:`暫緩:{{reason}}`,claimedUntil:`已由 <strong>{{worker}}</strong> 認領,直到 {{date}}。`},claim:{release:`釋出我的認領`,releaseDescription:`確認執行者已停止寫入後釋出擁有權?`,recover:`收回已過期的認領`,recoverHelp:`請先確認執行者已停止。`,reason:`收回原因`,confirmed:`我已確認執行者已停止`,submit:`收回擁有權`},editor:{storageUnavailable:`此瀏覽器無法儲存草稿。儲存前請保持編輯器開啟。`,saved:`{{key}} 已儲存`,created:`{{key}} 已建立`,properties:`工單屬性`,readyForAgents:`可供代理程式處理`,readyForAgentsHelp:`在需求、阻擋項目和擁有權允許時,代理程式可以認領此工單`,agents:`代理程式`,notReady:`未就緒`,moreProperties:`更多屬性`,holdPlaceholder:`為什麼要暫緩工作?`,claimsNote:`認領仍取決於需求、阻擋項目和目前的擁有權。`,restoreSize:`還原編輯器大小`,expand:`展開編輯器`,staleTitle:`此工單已變更。`,staleDescription:`您的草稿仍以版本 {{version}} 為基礎;儲存時需要使用目前的版本。`,discardAndReload:`捨棄草稿並重新載入`,titlePlaceholder:`工單標題`,descriptionPlaceholder:`新增背景、需求或重現步驟…`,criteriaPlaceholder:`- [ ] 如何確認已完成?`,removeCriteria:`移除驗收條件`,addCriteria:`新增驗收條件`,savedLocally:`草稿已儲存在此裝置上`,notSavedLocally:`無法儲存草稿`,discardDraft:`捨棄草稿`,createMore:`繼續建立`,save:`儲存工單`,create:`建立工單`},resource:{removeConfirm:`要移除 {{name}} 嗎?`,uploading:`上傳中…`},attachment:{heading:`附件`,tooLarge:`每個檔案不得超過 10 MB。`,attached_other:`已附加 {{count, number}} 個檔案`,attach:`附加檔案`,emptyWritable:`尚無附件。將檔案拖放到這裡。`,empty:`尚無附件`,remove:`移除附件`,fileInput:`檔案(最大 10 MB)`},evidence:{description:`處理此工單的人員和整合所回報的連結及結果。`,add:`新增佐證`,empty:`尚無佐證`,added:`佐證已新增`,kindLabel:`類型`,outcomeLabel:`回報的結果`,commit:`提交(完整雜湊)`,note:`備註`},link:{heading:`連結`,add:`新增連結`,edit:`編輯連結`,save:`儲存連結`,remove:`移除連結`,empty:`尚無連結`,stateUnknown:`狀態不明`,remote:`{{kind}} · {{state}}`,remoteState:{open:`開啟`,closed:`已關閉`,merged:`已合併`,draft:`草稿`,active:`使用中`,deleted:`已刪除`}},activity:{previous:`較早的活動`,next:`較新的活動`},relations:{heading:`關聯`,add:`新增關聯`,linkExisting:`連結現有工單`,newChild:`新增子工單`,newChildTitle:`{{key}} 的新子工單`,children:`子工單 <count>{{done, number}}/{{total, number}}</count>`,previousChildren:`上一組子工單`,nextChildren:`下一組子工單`,empty:`尚無關聯`,type:`關聯類型`,ticket:`工單`,statusOf:`{{key}} 的狀態`,assigneeOf:`{{key}} 的負責人`,remove:{blocks:`移除阻擋關聯`,related:`移除相關關聯`,duplicate:`移除重複關聯`,causes:`移除導致關聯`,clones:`移除複製關聯`,implements:`移除實作關聯`,reviews:`移除審查關聯`}},discussion:{empty:`尚無留言`,previous:`較早的留言`,next:`較新的留言`,comment:`留言`,placeholder:`撰寫留言…`,posting:`張貼中…`,edited:`已編輯`,edit:`編輯留言`,delete:`刪除留言`,deleteConfirm:`要永久刪除此留言嗎?`},markdown:{format:{heading:`標題`,bold:`粗體`,italic:`斜體`,link:`連結`,linkHelp:`為所選文字加上連結`,bullets:`項目符號清單`,numbers:`編號清單`,tasks:`檢查清單`,code:`程式碼區塊`},formatting:`{{label}}格式`,editor:`{{label}}編輯器`,insertFile:`插入檔案`,insertFileInto:`將檔案插入{{label}}`,write:`撰寫`,visual:`視覺化`,preview:`預覽`,unsupported:`此文字使用了視覺化編輯器無法保留的 Markdown,例如 HTML 或註腳。`,nothingToPreview:`沒有可預覽的內容`,mention:`提及成員`,insertBlock:`插入區塊`,block:{quote:`引言`,table:`表格`,diagram:`圖表`,divider:`分隔線`,file:`檔案`},table:{addRow:`新增列`,addColumn:`新增欄`,deleteRow:`刪除列`,deleteColumn:`刪除欄`,deleteTable:`刪除表格`},linkAddress:`連結網址`,diagram:`圖表`,diagramFailed:`無法繪製此圖表:{{error}}`,diagramSource:`圖表原始碼`}},settings:{account:{title:`設定`,security:`登入與安全性`,localPassword:`本機密碼`,localPasswordDescription:`變更密碼會將您的其他工作階段登出。`,changePassword:`變更密碼`,oidcLinked:`可使用此身分識別提供者登入同一個帳號。`,oidcUnlinked:`透過此提供者登入前,請先連結您的帳號。`,linked:`已連結`,link:`連結 {{name}}`,currentPassword:`目前的密碼`,newPassword:`新密碼`,confirmPassword:`確認新密碼`,passwordMismatch:`兩次輸入的新密碼不一致。`,passwordUpdated:`密碼已更新,其他工作階段已登出。`},preferences:{behavior:`行為`,languageDescription:`套用於此瀏覽器,包括登入頁面。`,weekStart:`每週起始日`,weekStartDescription:`套用於所有日期選擇器。`,weekStartLanguage:`依語言預設`,sidebar:`啟動時的側邊欄`,sidebarDescription:`下次開啟 Kanvil 時生效。`,sidebarLast:`維持上次狀態`,sidebarExpanded:`展開`,sidebarCollapsed:`收合`,ticketLists:`工單清單`,reset:`重設偏好設定`,resetDescription:`將此瀏覽器中的這些選項還原為預設值。`,resetDone:`偏好設定已重設`},notifications:{title:`通知`,inbox:`收件匣`,inboxDescription:`您追蹤的工單更新會顯示在 Kanvil 中。`,inboxSwitch:`在收件匣接收已訂閱工單的更新`,push:`推播通知`,pushDescription:`將更新傳送到您已註冊的裝置。`,pushUnavailable:`此執行個體未啟用推播。`,pushSwitch:`在已註冊的裝置上接收推播通知`,categories:`類別`,categorySwitch:`{{label}}通知`,reminder:`即將到期提醒`,reminderDescription:`在追蹤的工單到期前多久提醒。`,reminderUnit:`提醒單位`,reminderAmount:`提醒數值`,unit:{minutes:`分鐘`,hours:`小時`,days:`天`,weeks:`週`}},layout:{nav:`設定`,section:`設定區段`,nested:`{{parent}} · {{child}}`,name:`名稱`,description:`說明`,descriptionPlaceholder:`新增說明`,noDescription:`尚無說明`,stale:`此內容已在其他地方變更。請取消後重新開始。`},profile:{title:`個人資料`,displayName:`顯示名稱`,edit:`編輯個人資料`,changePhoto:`變更相片`,removePhoto:`移除相片`,photoFile:`個人資料相片檔案`,photoUpdated:`相片已更新`,photoRemoved:`相片已移除`,saved:`個人資料已儲存`},credentials:{global:`全域`,globalDescription:`存取帳戶有權存取的所有專案和工作區,包括日後取得的存取權限。`,title:`API 金鑰`,description:`為指令碼、整合和代理程式提供可隨時撤銷的存取權。`,create:`建立 API 金鑰`,creating:`建立中…`,created:`API 金鑰已建立`,name:`名稱`,access:`存取權`,projects:`專案`,expires:`到期時間`,actions:`動作`,unavailableProject:`無法使用的專案`,untitled:`未命名的金鑰`,expired:`已過期`,disabled:`已停用`,custom:`自訂`,noProjects:`沒有專案存取權`,never:`永不`,revoke:`撤銷 API 金鑰`,revokeNamed:`要撤銷 {{name}} 嗎?使用此金鑰的連線將立即失去存取權。`,revokeUnnamed:`要撤銷此 API 金鑰嗎?使用此金鑰的連線將立即失去存取權。`,empty:`尚無 API 金鑰`,emptyDescription:`當指令碼、整合或代理程式需要存取您的專案時,可建立金鑰。`,copyNow:`請立即複製此金鑰。之後將無法再次檢視。`,newKey:`新的 API 金鑰`,copy:`複製 API 金鑰`,noProjectTitle:`請先選擇專案`,noProjectDescription:`API 金鑰至少需要存取一個專案。`,goToProjects:`前往專案`,keyName:`金鑰名稱`,keyNamePlaceholder:`例如:發行自動化`,projectAccess:`專案存取權`,findProject:`尋找專案`,projectDescription:`{{key}} · {{workspace}}`,workspace:`工作區`,noMatches:`沒有相符的專案`,roleLimit:`此金鑰的權限仍受您現有專案角色的限制。`,accessLevel:`存取層級`,preset:{read:`唯讀`,write:`讀取和寫入`,automation:`讀取、寫入及認領工作`,custom:`自訂權限`},permission:{intake:{name:`提交報告`,description:`僅建立隔離工單。無法讀取或編輯工單。請單獨使用。`},read:{name:`讀取工單`,description:`檢視專案、工單、留言和附件。`},write:{name:`編輯工單`,description:`建立和更新工單、留言和附件。`},claim:{name:`認領工作`,description:`認領、續期和釋出工單擁有權。`},admin:{name:`管理專案和工作區`,description:`在角色允許的範圍內變更專案和工作區的設定及成員。`}},expiry:{7:`7 天`,30:`30 天`,90:`90 天`,365:`1 年`,custom:`自訂日期`,never:`永不過期`},expiresOn:`到期日`,neverDescription:`金鑰在您刪除前會持續有效。`},calendarFeeds:{title:`行事曆訂閱`,new:`新增行事曆訂閱`,created:`行事曆訂閱已建立`,create:`建立訂閱`,adminOnly:`由專案管理員共用和撤銷行事曆訂閱。`,labels:`標籤`,everyLabel:`所有標籤`,stopped:`· 已停止:建立者已失去存取權`,revoke:`撤銷 {{name}}`,revokeDescription:`訂閱 {{name}} 的行事曆將立即停止更新。工單不受影響。`,revoked:`行事曆訂閱已撤銷`,empty:`尚無行事曆訂閱`,copyNow:`請立即將此連結複製到行事曆應用程式中。此連結只會顯示一次,任何持有連結的人都能讀取共用的工單。`,link:`訂閱連結`,name:`訂閱名稱`,onlyLabels:`僅限具有這些標籤的工單`,explanation:`訂閱會將設有開始日期或到期日的未完成、未封存工單列為 {{zone}} 時區的全天活動。任何持有連結的人都能看到其編號、標題、狀態、優先順序和日期。`},project:{title:`專案設定`,edit:`編輯專案`,copyPrefix:`複製工單前綴`,saved:`專案已儲存`,noOpenTickets:`沒有未完成的工單`,openTickets_other:`{{count, number}} 個未完成工單`,overdueTickets_other:`· {{count, number}} 個已逾期`,created:`· 建立於 <time/>`,access:`專案存取權`,accessWorkspace:`工作區成員依其工作區角色取得存取權。`,accessPrivate:`只有您新增的成員和工作區管理員可以檢視此專案。`,accessUpdated:`專案存取權已更新`,visibility:{workspace:`工作區中的所有人`,private:`僅限專案成員`},workspace:`工作區`,workspaceSettings:`工作區設定`,prefix:`工單前綴`,prefixDescription:`變更後,先前的前綴和工單編號仍可使用。`,changePrefix:`變更前綴`,changePrefixTitle:`變更工單前綴`,changePrefixDescription:`{{name}} 中的所有工單都會使用新前綴,並保留原本的編號。`,changing:`變更中…`,prefixChanged:`工單現在使用 {{key}}`,publicLink:`公開連結`,publicDisclosure:`任何持有連結的人都能讀取此專案中所有未封存工單的標題、說明、驗收條件、狀態、優先順序、類型、難度、標籤、範圍、日期,以及指向其他工單的連結。人員、留言、活動、附件、佐證和認領仍維持私密。`,publicOn:`公開連結已開啟`,publicOff:`公開連結已關閉`,off:`關閉`,copyPublicLink:`複製公開連結`,openPublic:`開啟公開檢視`,stopSharing:`停止共用`,share:`公開共用`,background:`背景`,backgroundDescription:`顯示在此專案的工單清單和看板後方。`,backgroundUpdated:`背景已更新`,backgroundRemoved:`背景已移除`,currentBackground:`目前的背景`,uploading:`上傳中…`,replace:`取代`,upload:`上傳圖片`,backgroundFile:`專案背景檔案`},tickets_other:`{{count, number}} 個工單`,moveUp:`上移 {{name}}`,moveDown:`下移 {{name}}`,workflow:{title:`工作流程`,new:`新增狀態`,edit:`編輯狀態`,editNamed:`編輯狀態 {{name}}`,deleteNamed:`刪除狀態 {{name}}`,onlyState:`{{name}} 是唯一的{{category}}狀態`,saved:`狀態已儲存`,name:`狀態名稱`,category:`類別`,color:`狀態色彩`,categoryChange:`其工單的狀態會變更為{{status}}。`,save:`儲存狀態`,delete:`刪除狀態`,deleteTitle:`刪除 {{name}}`,deleted:`狀態已刪除`,reassign_other:`將 {{count, number}} 個工單移至`},labels:{title:`標籤`,search:`搜尋標籤`,new:`新增標籤`,edit:`編輯標籤`,workspace:`工作區`,editNamed:`編輯標籤 {{name}}`,deleteNamed:`刪除標籤 {{name}}`,deleteUsed_other:`要從 {{count, number}} 個工單(包括已封存的工單)中移除 {{name}} 嗎?使用此標籤的已儲存檢視將移除其標籤篩選。`,deleteUsedShared_other:`要從所有專案的 {{count, number}} 個工單(包括已封存的工單)中移除 {{name}} 嗎?使用此標籤的已儲存檢視將移除其標籤篩選。`,deleteUnused:`要刪除未使用的標籤 {{name}} 嗎?使用此標籤的已儲存檢視將移除其標籤篩選。`,deleted:`標籤已刪除`,noMatches:`沒有相符的標籤`,empty:`尚無標籤`,saved:`標籤已儲存`,name:`標籤名稱`,color:`標籤色彩`,rename:`重新命名會一併更新工單和已儲存檢視中的此標籤。`,renameShared:`重新命名會一併更新所有專案中工單和已儲存檢視裡的此標籤。`,adopt:`採用專案標籤`,adoptDescription:`已在 {{projects}} 中定義。其工單會保留此標籤並採用此色彩。`,save:`儲存標籤`},fields:{title:`欄位`,new:`新增欄位`,edit:`編輯欄位`,editNamed:`編輯欄位 {{name}}`,deleteNamed:`刪除欄位 {{name}}`,deleteUsed_other:`要刪除 {{name}} 並從 {{count, number}} 個工單(包括已封存的工單)中移除其值嗎?已儲存的檢視將失去以此欄位設定的篩選。`,deleteUnused:`要刪除未使用的欄位 {{name}} 嗎?已儲存的檢視將失去以此欄位設定的篩選。`,deleted:`欄位已刪除`,empty:`尚無欄位`,saved:`欄位已儲存`,required:`必填`,requiredDescription:`新工單必須填寫此值。`,defaultValue:`預設值 {{value}}`,default:`預設值`,name:`欄位名稱`,type:`類型`,options:`選項`,option:`選項 {{number}}`,optionInline:`選項 {{number}}`,optionColor:`{{name}} 的色彩`,removeOption:`移除 {{name}}`,addOption:`新增選項`,reassign:`具有 {{name}} 的工單`,clearValue:`清除值`,moveTo:`移至 {{name}}`,save:`儲存欄位`},lifecycle:{archivedToast:`專案已封存`,restoredToast:`專案已還原`,archivedNotice:`封存於 <time/> · 唯讀`,restore:`還原`,archive:`封存`,archivedDescription:`封存於 <time/>。其工單為唯讀,且不會出現在清單、搜尋、我的工作、行事曆訂閱和代理程式佇列中。`,archiveDescription:`將專案從清單、搜尋、我的工作、行事曆訂閱和代理程式佇列中隱藏,並將其工單設為唯讀。歷程記錄會保留。`,archiveProject:`封存專案`,archiveConfirm:`在還原之前,{{name}} 會從專案清單和代理程式佇列中移除。必須先釋出已認領的工單。`,blocker:`{{message}}:{{tickets}}`,row:{tickets:`工單`,losesAccess:`失去存取權`,gainsAccess:`取得存取權`,labelsCopied:`已複製的標籤`,labelsMerged:`已合併的標籤`,followsRemoved:`已移除的追蹤`,invitations:`邀請`,comments:`留言`,files:`檔案`,kept:`保留`,projects:`專案`,members:`成員`,sharedLabels:`共用標籤`,signIn:`登入`,sessions:`工作階段`,credentials:`憑證`,devices:`裝置`,access:`存取權`,claims:`認領`,imports:`匯入`,profile:`個人資料`},transferTickets_other:`{{count, number}} 個,保留其編號和連結`,noOne:`無人`,transferInvitations_other:`{{count, number}} 個待處理的邀請將不再包含此專案`,files_other:`{{count, number}} 個 · {{size}}`,keptProject_other:`{{count, number}} 筆活動記錄和 {{key}} 前綴`,keptWorkspace_other:`{{count, number}} 筆活動記錄和 {{slug}} URL 代碼`,archivedProject:`已封存`,membersLoseAccess_other:`{{count, number}} 人失去存取權;其帳號會保留`,pendingInvitations_other:`{{count, number}} 個待處理`,move:`移動`,moveTitle:`移動 {{name}}`,moved:`已移至 {{name}}`,movedUnnamed:`已移至該工作區`,destination:`目的地工作區`,moveProject:`移動專案`,moving:`移動中…`,export:`匯出`,exportDescription:`將工單及其工作流程、欄位、標籤、關聯、留言、佐證和連結匯出為具版本的 JSON。附件和活動歷程會保留在此。`,exporting:`匯出中…`,exportJson:`匯出 JSON`,delete:`刪除`,deleteTitle:`刪除 {{name}}`,deleted:`{{name}} 已刪除`,typeToConfirm:`輸入 {{value}} 以確認`,deleting:`刪除中…`,deleteProject:`刪除專案`,deleteProjectDescription:`永久移除工單、留言和檔案。活動歷程會保留,且 {{key}} 不會再被使用。`,signInAgain:`重新登入`,deleteWorkspace:`刪除工作區`,deleteWorkspaceDescription:`永久刪除工作區中的所有專案及其工單、留言和檔案,並移除其成員。帳號和活動歷程會保留。`,noSignInMethods:`沒有已連結的登入方式`,sessions_other:`{{count, number}} 個工作階段已登出`,credentials_other:`{{count, number}} 個 API 金鑰或應用程式連線已撤銷`,devices_other:`{{count, number}} 個裝置或通知管道已移除`,workspaceCount_other:`{{count, number}} 個工作區`,directProjectCount_other:`{{count, number}} 個直接專案`,accessWorkspaces:`已移除 {{workspaces}}`,accessBoth:`已移除 {{workspaces}}和 {{projects}}`,claims_other:`{{count, number}} 個認領已釋出`,imports_other:`{{count, number}} 個匯入已取消`,profileErased:`名稱、電子郵件和相片已清除`,commentCount_other:`{{count, number}} 則留言`,activityCount_other:`{{count, number}} 筆活動記錄`,keptAccount:`{{tickets}}、{{comments}}和 {{events}}將顯示為「{{name}}」`,deleteAccount:`刪除帳號`,deleteOwnAccount:`永久移除您的登入方式、工作階段、金鑰、裝置、成員資格和個人資料。工單、留言和活動會保留,並顯示為「{{name}}」。`,deleteOtherAccount:`永久移除此帳號的登入方式、工作階段、金鑰、裝置、成員資格和個人資料。工單、留言和活動會保留,並顯示為「{{name}}」。`},icon:{change:`變更圖示`,title:`專案圖示`,library:`圖示庫`,upload:`上傳圖片`,search:`搜尋圖示`,searchPlaceholder:`搜尋圖示…`,color:`圖示色彩`,choose:`選擇 {{name}}`,noMatches:`沒有相符的圖示`,showMore:`顯示更多圖示`,uploading:`上傳中…`,chooseImage:`選擇圖片`,formats:`PNG、JPEG 或 WebP · 最大 10 MB`,file:`專案圖示檔案`,reset:`重設圖示`},createProject:{title:`新增專案`,inWorkspace:`位於 {{name}}`,everyoneLabel:`此工作區中的所有人`,name:`專案名稱`,namePlaceholder:`行動應用程式`,create:`建立專案`},workspace:{title:`工作區設定`,owner:`擁有者`,noOwner:`沒有擁有者。執行個體管理員可以指定一位。`,transfer:`轉移擁有權`,transferring:`轉移中…`,transferred:`{{name}} 現在擁有 {{workspace}}`,newOwner:`新擁有者`,noEligible:`擁有權只能轉移給使用中的工作區管理員。請先將另一位成員設為管理員。`,chosenCan:`之後 {{name}} 可以轉移或刪除此工作區。`,newOwnerCan:`新擁有者可以轉移或刪除此工作區。`,ownerStays:`{{name}} 仍為管理員。`,unavailable:`工作區無法使用`,backToProjects:`返回專案`,name:`工作區名稱`,edit:`編輯工作區`,copyKey:`複製工作區代碼`,saved:`工作區已儲存`,projects:`專案`,projectCount_other:`您在此工作區中可以存取 {{count, number}} 個專案。`,viewProjects:`檢視專案`,members:`成員`,membersDescription:`工作區角色適用於使用工作區存取權的專案。`,manageMembers:`管理成員`},members:{title:`成員`,customRole:`自訂角色`,search:`搜尋成員`,searchPlaceholder:`名稱或電子郵件…`,add:`新增成員`,added:`成員已新增`,workspaceAccess:`工作區存取權`,owner:`擁有者`,roleFor:`{{name}} 的角色`,useWorkspaceAccess:`使用工作區存取權`,remove:`移除成員`,removeFromWorkspace:`要將 {{name}} 從此工作區及其所有專案中移除嗎?`,restoreAccess:`要為 {{name}} 恢復{{role}}工作區存取權嗎?`,removeFromProject:`要移除 {{name}} 的專案存取權嗎?`,noMatches:`沒有相符的成員`,empty:`尚無成員`,projectRole:`專案角色`,workspaceRole:`工作區角色`},invitations:{title:`邀請`,invite:`透過電子郵件邀請`,removedProjects:`已移除的專案`,wholeWorkspace:`整個工作區`,selectedProjects:`選取的專案`,expired:`已過期`,expires:`<time/>到期`,resend:`重新傳送邀請給 {{email}}`,revoke:`撤銷邀請`,revokeDescription:`傳送給 {{email}} 的連結將失效。`,revoked:`邀請已撤銷`,empty:`沒有待處理的邀請`,email:`電子郵件`,role:`角色`,access:`存取權`,projects:`專案`,noProjects:`此工作區沒有專案。`,linkExpires:`連結有效期限`,inDays_other:`{{count, number}} 天`,submit:`邀請`,link:`邀請連結`,copyLink:`複製邀請連結`,emailed:`已寄送電子郵件給 {{email}}。此連結僅限該地址使用,且只能使用一次。`,notEmailed:`此執行個體未設定電子郵件。請將此連結傳送給 {{email}};此連結僅限該地址使用,且只能使用一次。`,notEmailedUnknown:`此執行個體未設定電子郵件。請將此連結傳送給收件者;此連結僅限該地址使用,且只能使用一次。`},workspaces:{title:`工作區`,search:`搜尋工作區`,searchPlaceholder:`名稱或 URL 代碼…`,noMatches:`沒有相符的工作區`,empty:`尚無工作區`,workspace:`工作區`,administrators:`管理員`,members:`成員`,projects:`專案`,created:`建立時間`,actions:`動作`,noAdministrator:`沒有管理員`,manage:`管理 {{name}}`,pagerNoun:`工作區`,private:`私人`,noProjects:`沒有專案`},roles:{title:`角色`,new:`新增角色`,edit:`編輯角色`,builtIn:`內建`,readOnly:`僅可讀取`,memberships_other:`{{count, number}} 個成員資格`,editNamed:`編輯角色 {{name}}`,deleteNamed:`刪除角色 {{name}}`,deleteUnused:`要刪除未使用的角色 {{name}} 嗎?`,deleted:`角色已刪除`,empty:`尚無角色`,saved:`角色已儲存`,name:`角色名稱`,actions:`動作`,everyoneReads:`所有成員都可以讀取其可存取的專案。`,changesApply_other:`變更會立即套用至持有此角色的 {{count, number}} 個成員資格。`,save:`儲存角色`,delete:`刪除角色`,reassignDescription_other:`有 {{count, number}} 個成員資格持有 {{name}}。請選擇要改用的角色。`,moveTo:`將成員改為`},theme:{mode:{light:`淺色`,dark:`深色`,system:`跟隨系統`},aligned:`已對齊`,hexColor:`請使用六位數的十六進位色碼`,contrast:{light:`請將淺色主題的文字對比提高到至少 4.5:1。`,dark:`請將深色主題的文字對比提高到至少 4.5:1。`},fileTooLarge:`主題檔案必須小於 100 KB。`,tooMany:`最多保留 50 個自訂主題。`},appearance:{colorScheme:`配色`,theme:`主題`,themes:`主題`,colorTheme:`色彩主題`,search:`搜尋主題`,searchPlaceholder:`搜尋主題…`,create:`建立主題`,add:`新增主題`,importFile:`匯入主題檔案`,useMode:{light:`在淺色模式使用 {{name}}`,dark:`在深色模式使用 {{name}}`},modeOnly:{light:`僅用於淺色模式`,dark:`僅用於深色模式`},copyName:`{{name}} 副本`,duplicate:`建立 {{name}} 的副本`,edit:`編輯 {{name}}`,export:`匯出 {{name}}`,delete:`刪除 {{name}}`,deleteDescription:`要從此瀏覽器移除 {{name}} 嗎?使用此主題的淺色或深色外觀將改回您的基礎主題。`,noMatches:`沒有相符的主題`,customTheme:`自訂主題`,name:`主題名稱`,paletteColor:`{{mode}}{{color}}`,color:{background:`背景`,foreground:`文字`,sidebar:`側邊欄`,primary:`強調色`,primaryForeground:`強調色文字`},save:`儲存主題`},color:{swatch:`{{color}}{{label}}`,removeCustom:`從自訂色彩中移除 {{hex}}`,custom:`自訂色彩`,default:`預設`,red:`紅色`,orange:`橘色`,amber:`琥珀色`,yellow:`黃色`,lime:`萊姆綠`,green:`綠色`,emerald:`翡翠綠`,teal:`藍綠色`,cyan:`青色`,sky:`天藍色`,blue:`藍色`,indigo:`靛藍色`,violet:`紫羅蘭色`,purple:`紫色`,fuchsia:`桃紅色`,pink:`粉紅色`,rose:`玫瑰色`,gray:`灰色`}},admin:{instance:{title:`管理`,heading:`執行個體`,edit:`編輯執行個體`,name:`名稱`,description:`說明`,noDescription:`尚無說明`,version:`應用程式版本`,publicUrl:`公開 URL`,provider:{local:`本機 PostgreSQL 儲存空間`,s3:`S3 相容物件儲存空間`,postgres:`內建 PostgreSQL`,elasticsearch:`Elasticsearch 相容搜尋`},section:{storage:`檔案儲存空間`,search:`工單搜尋`,events:`事件傳遞`},viewConfiguration:`檢視設定`,configure:{storage:`設定儲存空間`,search:`設定搜尋`,events:`設定事件傳遞`},providerTitle:`提供者`,deploymentManaged:`由部署管理`,instanceManaged:`由執行個體管理`,transfers:`傳輸`,indexStatus:`索引狀態`,connection:`連線`,transfersS3:`檔案在本機儲存後會移至物件儲存空間。`,transfersLocal:`新檔案會儲存在 PostgreSQL 中。`,searchBuiltIn:`搜尋直接在 PostgreSQL 中執行。`,searchIndexed:`工單變更會在背景建立索引。`,eventsConnection:`通知用於喚醒取用者;PostgreSQL 保存重播歷程。`,builtIn:`內建`,connected:`已連線`,upToDate:`已是最新`,status:{ready:`就緒`,transferring:`傳輸中`,indexing:`建立索引中`,connecting:`連線中`,unavailable:`無法使用`},pendingTransfers:`待傳輸`,pendingRemain:`傳輸完成前,這些檔案仍可從 PostgreSQL 讀取。`,noPending:`沒有等待傳輸的檔案。`,bucket:`儲存貯體`,storageEndpoint:`儲存空間端點`,backup:`備份`,backupBuckets:`請備份 PostgreSQL 及所有參照的物件儲存貯體。`,backupDatabase:`檔案內容包含在 PostgreSQL 備份中。`,fallback:`備援`,fallbackDescription:`外部索引落後或離線時,可使用 PostgreSQL 搜尋。`,searchEndpoint:`搜尋端點`,index:`索引`,delivery:`傳遞`,deliveryDescription:`持久事件和重播保存在 PostgreSQL 中。選用的訊息代理程式負責分送喚醒訊號。`,brokerEndpoint:`訊息代理程式端點`,exchange:`交換器`},configure:{storageTitle:`設定檔案儲存空間`,searchTitle:`設定工單搜尋`,eventsTitle:`設定事件傳遞`,saved:`執行個體設定已儲存`,instanceName:`執行個體名稱`,instanceDescription:`執行個體說明`,publicUrlSource:`公開 URL 由部署中的 KANVIL_URL 設定。`,storageIntro:`附件和個人資料相片使用此提供者。現有檔案會保留在原本的儲存位置。`,storageProvider:`儲存空間提供者`,localDescription:`檔案內容儲存在本機資料庫中,並包含在 PostgreSQL 備份內。`,s3Endpoint:`S3 端點`,s3EndpointHint:`使用 Amazon S3 時請將端點留空。`,region:`區域`,prefix:`物件索引鍵前綴`,accessKeyId:`存取金鑰 ID`,secretAccessKey:`秘密存取金鑰`,savedSecret:`已儲存。留空即可保留。`,deploymentCredentials:`省略時使用部署憑證`,pathStyle:`使用路徑樣式的儲存貯體 URL`,storageVerified:`儲存空間連線已驗證`,testStorage:`測試儲存空間連線`,filesWaiting_other:`{{count, number}} 個檔案等待傳輸。待傳輸的檔案仍可從 PostgreSQL 讀取。`,transfersComplete:`所有檔案傳輸已完成。`,storageDeployment:`儲存空間由 KANVIL_STORAGE_PROVIDER 和 S3_* 部署變數設定。`,locations:`現有儲存位置`,locationFiles_other:`{{count, number}} 個檔案`,cleanUp:`清除未使用的檔案`,cleanUpConfirm:`要移除未被參照的檔案和超過一天的失敗上傳嗎?附加至工單或個人資料的檔案會保留。`,cleanUpNote:`清除作業也會自動執行。S3 物件需要在備份資料庫的同時備份儲存貯體。`,searchProvider:`搜尋提供者`,searchBuiltIn:`內建 PostgreSQL 搜尋`,indexName:`Kanvil 索引名稱`,searchAuthentication:`搜尋驗證`,noAuthentication:`不驗證`,apiKey:`API 金鑰`,basic:`使用者名稱和密碼`,searchApiKey:`搜尋 API 金鑰`,optional:`選用`,searchUsername:`搜尋使用者名稱`,searchPassword:`搜尋密碼`,searchVerified:`搜尋連線已驗證`,testSearch:`測試搜尋連線`,rebuildQueued:`搜尋重建已加入佇列`,rebuild:`重建索引`,searchNote:`權限和篩選一律以 PostgreSQL 為準。外部索引同步中或無法使用時,搜尋會改用 PostgreSQL。`,brokerProvider:`事件傳遞提供者`,brokerBuiltIn:`內建 PostgreSQL 通知`,rabbitUrl:`RabbitMQ 連線 URL`,savedBrokerEndpoint:`已儲存的訊息代理程式端點`,rabbitExchange:`RabbitMQ 交換器`,brokerVerified:`RabbitMQ 傳遞已驗證`,testBroker:`測試訊息代理程式連線`,brokerNote:`RabbitMQ 會將已認可事件的喚醒訊號分送給各 Kanvil 執行個體,並喚醒背景工作。PostgreSQL 保存持久事件和待處理工作,並在訊息代理程式無法使用時傳遞喚醒訊號。`,brokerDeployment:`事件傳遞由 KANVIL_BROKER_PROVIDER 和 RABBITMQ_* 部署變數設定。`,save:`儲存執行個體設定`},authentication:{title:`驗證`,saved:`驗證設定已儲存`,emailPassword:`電子郵件和密碼登入`,emailPasswordDescription:`包含電子郵件登入驗證碼和密碼重設。`,ssoProvision:`透過 SSO 自動建立使用者`,ssoProvisionDescription:`新的 SSO 使用者在受邀前沒有任何工作區或專案存取權。`,registration:`公開電子郵件註冊`,registrationClosed:`已關閉`,identityProvider:`身分識別提供者`,notConfigured:`未設定`,linkedProviders:`已連結帳號的提供者`,linkedProvidersDescription:`僅允許已連結的帳號登入;絕不建立帳號。`,save:`儲存驗證設定`,discoveryUrl:`OIDC 探索 URL`,clientId:`OIDC 用戶端 ID`,oidcSetup:`請在部署中設定 OIDC_DISCOVERY_URL、OIDC_CLIENT_ID、OIDC_CLIENT_SECRET 和 OIDC_NAME,或 GITHUB_、GOOGLE_ 或 DISCORD_ 的 CLIENT_ID 與 CLIENT_SECRET 組合,然後重新啟動 Kanvil。提供者密鑰絕不會傳回瀏覽器。`,consumers:`取用者介面`,mcpEndpoint:`MCP 端點`,eventFeed:`即時事件串流`,openApi:`OpenAPI 規格`},users:{title:`使用者`,search:`搜尋使用者`,searchPlaceholder:`名稱或電子郵件…`,new:`新增使用者`,roleFilter:`執行個體角色篩選`,allRoles:`所有角色`,administrators:`管理員`,users:`使用者`,statusFilter:`帳號狀態篩選`,allAccounts:`所有帳號`,active:`使用中`,disabled:`已停用`,noMatches:`沒有相符的使用者`,empty:`尚無使用者`,user:`使用者`,role:`角色`,status:`狀態`,joined:`加入時間`,actions:`動作`,administrator:`管理員`,manage:`管理 {{name}}`,pagerNoun:`使用者`,create:`建立帳號`,creating:`建立中…`,created:`已建立 {{email}}`,name:`名稱`,email:`電子郵件`,initialPassword:`初始密碼`,instanceRole:`執行個體角色`},account:{details:`帳號詳細資料`,joined:`加入於 {{date}}`,edit:`編輯帳號`,instanceRole:`執行個體角色`,adminDescription:`可以管理所有工作區、帳號和部署設定。`,userDescription:`存取權由工作區和專案角色決定。`,changeRole:`變更角色`,changeRoleTitle:`變更執行個體角色`,signInMethods:`登入方式`,setPassword:`設定本機密碼`,activeSessions:`使用中的工作階段`,sessions_other:`{{count, number}} 個工作階段`,revokeSessions:`撤銷工作階段`,revokeConfirm:`要將 {{name}} 從所有裝置登出嗎?API 金鑰仍會有效。`,sessionsRevoked:`工作階段已撤銷`,access:`帳號存取權`,accessDisabled:`登入和 API 存取已停用。`,accessPreserved:`停用帳號會保留工單和活動歷程。`,enable:`啟用帳號`,disable:`停用帳號`,enableConfirm:`要恢復 {{name}} 的登入嗎?`,disableConfirm:`要停用 {{name}} 的登入和 API 存取,並撤銷其工作階段嗎?`,enabled:`帳號已啟用`,disabledToast:`帳號已停用`,updateFailed:`無法更新帳號`,workspaces:`工作區`,addToWorkspace:`新增至工作區`,noWorkspaces:`沒有工作區成員資格`,projectAccess:`直接專案存取權`,updated:`帳號已更新`,roleUpdated:`執行個體角色已更新`,workspaceAdded:`已新增工作區存取權`,passwordMismatch:`兩次輸入的新密碼不一致。`,passwordSet:`已設定本機密碼並撤銷工作階段`,name:`名稱`,email:`電子郵件`,user:`使用者`,administrator:`管理員`,adminsNote:`管理員可以管理所有工作區、使用者和執行個體設定。`,workspace:`工作區`,workspaceRole:`工作區角色`,newPassword:`新密碼`,confirmPassword:`確認新密碼`,passwordNote:`這會設定本機密碼,並將該使用者從所有裝置登出。`,save:`儲存變更`},delivery:{field:{address:`電子郵件地址`,server:`伺服器`,topic:`主題`,accessToken:`存取權杖`,applicationToken:`應用程式權杖`,endpointUrl:`端點 URL`,signingSecret:`簽署密鑰`,incomingWebhookUrl:`傳入 Webhook URL`,webhookUrl:`Webhook URL`,channel:`頻道`,botToken:`機器人權杖`,chatId:`聊天 ID`,chatIdPlaceholder:`-1001234567890 或 @channel`,topicId:`話題 ID`,optional:`{{label}}(選用)`,removeSaved:`移除已儲存的{{label}}`,savedSecret:`已儲存 · 留空即可保留`},failure:{blockedAddress:`不允許使用此地址`,redirectBlocked:`端點進行了重新導向`,dnsError:`找不到主機`,networkError:`無法連線`,timeout:`逾時`,invalidEndpoint:`端點無效`,emailUnavailable:`此伺服器未設定電子郵件`,smtpError:`郵件伺服器無法使用`,accessRevoked:`連線它的管理員已失去存取權;請重新連線`,repositoryMismatch:`收到來自其他儲存庫的傳遞`,http:`遭拒絕,HTTP {{status}}`,smtp:`郵件伺服器回應 {{code}}`},health:{delivery:{done:`<time/>已傳遞`,pending:`傳送中…`,none:`尚未傳送`,failed:`{{reason}}`},access:{done:`<time/>已檢查存取權`,pending:`正在檢查存取權…`,none:`尚未檢查存取權`,failed:`存取權檢查:{{reason}}`},retrying:`重試中`},paused:`已暫停`,failing:`失敗中`,sendTest:`傳送測試至 {{name}}`,testQueued:`測試已加入佇列`,resume:`繼續 {{name}}`,pause:`暫停 {{name}}`,edit:`編輯 {{name}}`,disconnect:`中斷 {{name}} 的連線`,disconnected:`{{name}} 已中斷連線`,name:`名稱`,type:`類型`,channels:`管道`,addChannel:`新增管道`,noChannels:`尚無管道`,editChannel:`編輯管道`,channelSaved:`管道已儲存`,channelRemoval:`要中斷 {{name}} 的連線嗎?其設定和佇列中的通知將被捨棄。`,sendFrom:`通知來源`,routeOff:`無`,routeAll:`所有專案`,routeSelected:`選取的專案`,saveChannel:`儲存管道`,adminsOnly:`由專案管理員管理整合`,destinations:`目的地`,addDestination:`新增目的地`,noDestinations:`尚無目的地`,editDestination:`編輯目的地`,destinationSaved:`目的地已儲存`,destinationRemoval:`要中斷 {{name}} 的連線嗎?其設定和佇列中的訊息將被捨棄。`,send:`傳送`,saveDestination:`儲存目的地`},repository:{setup:{github:`權杖需要儲存庫讀取權限;若要留言或同步議題,還需要議題和提取要求的寫入權限。請新增一個 GitHub Webhook:URL 從此儲存庫所在的列複製,內容類型為 application/json,使用此密鑰,並勾選 Branch or tag creation、Branch or tag deletion、Issues、Issue comments 和 Pull requests 事件。`,gitea:`權杖需要 read:repository 範圍;若要留言或同步議題,還需要 write:issue。請新增一個 Gitea Webhook:URL 從此儲存庫所在的列複製,內容類型為 application/json,使用此密鑰,並勾選 Create、Delete、Issues、Issue Label、Issue Comment 和 Pull Request 事件。`,gitlab:`權杖需要 read_api 範圍;若要留言或同步議題,還需要 api。請新增一個 GitLab Webhook:URL 從此儲存庫所在的列複製,使用此密鑰權杖,並勾選 Push、Issues、Comments 和 Merge request 事件。`},noWebhook:`尚未收到 Webhook`,webhookReceived:`<time/>收到 Webhook`,saved:`儲存庫已儲存`,title:`儲存庫`,connect:`連線儲存庫`,empty:`尚無儲存庫`,checkAccess:`檢查對 {{repository}} 的存取權`,accessQueued:`存取權檢查已加入佇列`,copyWebhook:`複製 {{repository}} 的 Webhook URL`,issueSync:`{{repository}} 的議題同步`,removal:`要中斷 {{repository}} 的連線嗎?其 Webhook 將立即失效。它新增的連結會保留在工單上。`,edit:`編輯儲存庫`,host:`代管平台`,serverUrl:`伺服器 URL`,serverUrlOptional:`伺服器 URL(選用)`,repository:`{{host}} 儲存庫`,nestedPlaceholder:`group/project`,placeholder:`owner/repository`,accessToken:`存取權杖`,webhookSecret:`Webhook 密鑰`,savedSecret:`已儲存 · 留空即可保留`,commentOnLink:{pull_request:`在新連結的議題和提取要求上留言`,merge_request:`在新連結的議題和合併要求上留言`},moveTickets:`移動連結的工單`,noMove:`不移動`,save:`儲存儲存庫`},issueSync:{reason:{labels:`其同步標籤已變更`,conflict:`雙方都有變更`,changedWhilePaused:`儲存庫暫停期間議題有所變更`,unverified:`代管平台的回應未確認此變更`,claimConflict:`工單已被認領`,invalidContent:`議題超過工單允許的長度`},issuesSyncing_other:`{{count, number}} 個議題同步中`,linksStopped_other:`{{count, number}} 個連結已停止`,match:`比對`,matchAny:`具有任一標籤`,matchAll:`具有所有標籤`,preview:{matching:`繼續同步`,export:`要建立的新議題`,pause:`要暫停的連結`,review:`要審查的連結`},applied:`議題同步已套用`,title:`議題同步 · {{repository}}`,outbound:`Kanvil 至 {{host}}`,exportTickets:`將工單匯出為議題`,exportDescription:`未完成的工單會產生新議題;標題、說明、狀態和新留言會保持同步。`,ticketLabels:`僅限具有這些標籤的工單`,everyTicket:`所有未完成的工單`,inbound:`{{host}} 至 Kanvil`,importIssues:`將議題匯入為工單`,importDescription:`未關閉的議題會在 {{host}} 下次回報時匯入。`,issueLabels:`僅限具有這些標籤的議題`,everyIssue:`所有未關閉的議題`,previewLabel:`預覽`,previewAction:`預覽`,stopped:`已停止的連結 · {{repository}}`,review:`審查`,linkRemoved:`連結已移除`,resumed:`同步已繼續`,open:`開啟`,closed:`已關閉`,reviewTitle:`審查 {{key}}`,mayExist:`{{host}} 上可能已有此議題;再次建立前請先確認。`,comparison:`比較`,field:{title:`標題`,description:`說明`,state:`狀態`},notReported:`未回報`,unlink:`取消連結`,keepHost:`保留 {{host}} 的版本`,keepKanvil:`保留 Kanvil 的版本`,createAgain:`重新建立議題`,unlinkTicket:`取消連結 {{key}}`,unlinkConfirm:`要停止同步 {{key}} 嗎?工單和議題都會保留。`},import:{count:{tickets:`工單`,workflow:`工作流程狀態`,fields:`自訂欄位`,labels:`標籤`,relations:`關聯`,comments:`留言`,evidence:`佐證`,links:`連結`},notExport:`此檔案不是 Kanvil 工單匯出檔。`,progress_other:`{{status}} · {{done, number}} / {{count, number}} 筆記錄`,progressFailed_other:`{{status}} · {{done, number}} / {{count, number}} 筆記錄 · {{failed, number}} 筆失敗`,title:`匯入`,description:`從 Kanvil 工單匯出檔或其他追蹤工具(Linear、Jira、Trello、Plane、PLANKA 或 Kaneo)建立專案。`,action:`匯入專案`,detailsOf:`{{name}} 的詳細資料`,details:`詳細資料`,exportFile:`Kanvil 匯出檔`,source:`來源`,file:`匯出檔`,jiraEdition:`Jira 版本`,siteUrl:`網站 URL`,accountEmail:`帳號電子郵件`,apiKey:`API 金鑰`,apiToken:`API 權杖`,personalToken:`個人存取權杖`,token:`權杖`,apiUrl:`API URL`,workspaceSlug:`工作區 URL 代碼`,signInWith:`登入方式`,username:`使用者名稱或電子郵件`,password:`密碼`,checkConnection:`請檢查連線資訊`,noProjects:`這些憑證無法讀取任何{{label}}。`,includeComments:`包含留言`,projectName:`專案名稱`,start:`匯入`,connect:`連線`,preview:`預覽`,starting:`啟動中…`,connecting:`連線中…`,checking:`檢查中…`,matched:`已配對的人員`,unmatched:`未配對的人員`,previewLabel:`匯入預覽`,errorPrefix:`錯誤:`,notePrefix:`注意:`,progressLabel:`匯入進度`,notImported:`未匯入的記錄`,stop:`停止匯入`,openProject:`開啟專案`}},native:{labelValue:`{{label}}:{{value}}`,ui:{dismiss:`關閉`,loading:`載入中`},server:{url:`伺服器 URL`,connect:`連線`,change:`變更伺服器`,invalidOrigin:`請使用 Kanvil 伺服器的 HTTP 或 HTTPS 來源,不要包含路徑或憑證。`,httpsRequired:`請使用 HTTPS 連線至 Kanvil 伺服器。`},login:{setupTitle:`建立擁有者帳號`,signIn:`登入`,signingIn:`正在登入…`,createAccount:`建立帳號`,signInWith:`使用 {{provider}} 登入`,name:`名稱`,setupToken:`設定權杖`,email:`電子郵件`,password:`密碼`},connection:{connecting:`連線中`,connected:`● 即時`,offline:`離線 · 快取資料`,closed:`已關閉`,signedOut:`登入以重新連線`},screen:{projects:`專案`,inbox:`收件匣`,settings:`設定`,tickets:`工單`,ticket:`工單`,newTicket:`新增工單`,editTicket:`編輯工單`},projects:{empty:`尚無專案`,new:`新增專案`,name:`專案名稱`,prefix:`工單前綴`,description:`說明`,create:`建立專案`},tickets:{search:`搜尋工單`,searchPlaceholder:`標題、說明或編號`,allStatuses:`所有狀態`,empty:`沒有相符的工單`,count:`{{shown}} / {{total}}`},ticket:{priority:`{{priority}}優先順序`,noDifficulty:`未指定難度`,version:`v{{version}}`,starts:`{{date}} 開始`,due:`{{date}} 到期`},editor:{stale:`此工單已變更。您儲存的草稿仍以版本 {{version}} 為基礎。`,discardDraft:`捨棄草稿並重新載入`,title:`標題`,noDifficulty:`未指定`,labels:`標籤(以逗號分隔)`,scopes:`範圍(以逗號分隔)`,editMarkdown:`編輯 Markdown`,previewMarkdown:`預覽 Markdown`,description:`說明(Markdown)`,acceptanceCriteria:`驗收條件(Markdown)`,parent:`父工單 ID`,automationReady:`在需求和相依性允許時可供代理程式處理`,holdReason:`暫緩原因`,draftSaved:`草稿已儲存在此裝置上`,save:`儲存工單`},detail:{archived:`已封存`,subscribe:`訂閱`,unsubscribe:`取消訂閱`,share:`分享`,description:`說明`,noDescription:`_尚無說明_`,acceptanceCriteria:`驗收條件`,noAcceptanceCriteria:`_尚無驗收條件_`,fields:`欄位`,archive:{action:`封存工單`,title:`要封存工單嗎?`,message:`要將此工單從使用中的清單移除,並取消代理程式處理資格嗎?`},unarchive:{action:`取消封存工單`,title:`要取消封存工單嗎?`,message:`要將此工單還原至使用中的清單嗎?`}},readiness:{title:`代理程式就緒狀態`,ready:`可以認領`,notReady:`尚不可認領`,hold:`暫緩:{{reason}}`,claimed:`已由 {{worker}} 認領,直到 {{time}}。`,release:{action:`釋出我的認領`,title:`要釋出認領嗎?`,message:`釋出擁有權前,請先停止您的執行者。`,confirm:`釋出`},recover:{action:`收回已過期的認領`,explanation:`請先確認執行者已停止。`,reason:`收回原因`,confirm:`執行者已停止 · 收回`}},relations:{title:`關聯`,parent:`父工單 · {{key}} · {{title}}`,openParent:`開啟父工單`,children:`子工單`,previousChildren:`上一組子工單`,nextChildren:`下一組子工單`,remove:`移除關聯`,removeTitle:`要移除關聯嗎?`,add:`新增關聯`,find:`尋找工單`,type:`關聯類型`,ticket:`工單`,choose:`選擇工單`},discussion:{title:`討論`,previous:`較早的留言`,next:`較新的留言`,field:`留言(Markdown)`,submit:`留言`,you:`您`,edit:`編輯留言`,editField:`留言`,delete:`刪除留言`,deleteTitle:`要刪除留言嗎?`,deleteMessage:`要永久移除此留言嗎?`,save:`儲存留言`},attachments:{title:`附件`,item:`{{name}} · {{size}} kB`,remove:`移除 {{name}}`,removeTitle:`要移除附件嗎?`,working:`處理中…`,add:`新增附件`,tooLarge:`請選擇不超過 10 MB 的檔案。`,sharingUnavailable:`此裝置無法分享檔案。`},evidence:{title:`佐證`,explanation:`結果由提交的帳號回報。`,add:`新增佐證`,name:`標題`,url:`URL`,outcome:`回報的結果`,commit:`提交(完整雜湊)`,note:`備註`,save:`儲存佐證`},activity:{title:`活動`,previous:`較早的活動`,next:`較新的活動`},inbox:{markAllRead:`全部標示為已讀`,empty:`沒有通知`},notifications:{title:`通知`,inApp:`在收件匣接收已訂閱工單的更新`,push:`推播通知`,enableDevice:`在此裝置上啟用推播`,disableDevice:`在此裝置上停用推播`,unconfigured:`此版本需要 Expo 專案 ID 和簽署設定才能推播。`,noProjectId:`此版本需要 Expo 專案 ID 才能接收推播通知。`,permissionDenied:`請在裝置設定中允許通知以啟用推播。`,channel:`工單更新`},settings:{password:{title:`本機密碼`,current:`目前的密碼`,new:`新密碼`,change:`變更密碼`,updated:`密碼已更新;其他工作階段已撤銷`},oidc:{linked:`帳號已連結`,explanation:`使用此提供者登入前,請先連結此帳號。`,link:`連結 {{provider}}`},signOut:{action:`登出`,title:`要登出嗎?`,message:`此帳號的快取工單和草稿將從此裝置中移除。`},changeServer:{title:`要變更伺服器嗎?`,message:`要登出並清除此帳號的本機快取和草稿嗎?`}}}};export{e as default};
@@ -1 +1 @@
1
- import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{Dt as i}from"./index-MTE_naHG.js";var a={lessThanXSeconds:{one:`少於 1 秒`,other:`少於 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分鐘`,lessThanXMinutes:{one:`少於 1 分鐘`,other:`少於 {{count}} 分鐘`},xMinutes:{one:`1 分鐘`,other:`{{count}} 分鐘`},xHours:{one:`1 小時`,other:`{{count}} 小時`},aboutXHours:{one:`大約 1 小時`,other:`大約 {{count}} 小時`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大約 1 個星期`,other:`大約 {{count}} 個星期`},xWeeks:{one:`1 個星期`,other:`{{count}} 個星期`},aboutXMonths:{one:`大約 1 個月`,other:`大約 {{count}} 個月`},xMonths:{one:`1 個月`,other:`{{count}} 個月`},aboutXYears:{one:`大約 1 年`,other:`大約 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超過 1 年`,other:`超過 {{count}} 年`},almostXYears:{one:`將近 1 年`,other:`將近 {{count}} 年`}},o=(e,t,n)=>{let r,i=a[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`內`:r+`前`:r},s={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})},c={lastWeek:`'上個'eeee p`,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:`'下個'eeee p`,other:`P`},l={code:`zh-TW`,formatDistance:o,formatLong:s,formatRelative:(e,t,n,r)=>c[e],localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n+`日`;case`hour`:return n+`時`;case`minute`:return n+`分`;case`second`:return n+`秒`;default:return`第 `+n}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一刻`,`第二刻`,`第三刻`,`第四刻`],wide:[`第一刻鐘`,`第二刻鐘`,`第三刻鐘`,`第四刻鐘`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`週日`,`週一`,`週二`,`週三`,`週四`,`週五`,`週六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|時|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻鐘/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^週[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t.today&&(a=`今天,${a}`),t.selected&&(a=`${a},已選取`),a},labelMonthDropdown:`選擇月份`,labelNext:`前往下個月`,labelPrevious:`前往上個月`,labelWeekNumber:e=>`第 ${e} 週`,labelYearDropdown:`選擇年份`,labelGrid:(e,t,n)=>(n??new i(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t?.today&&(a=`今天,${a}`),a},labelNav:`導覽列`,labelWeekNumberHeader:`週數`,labelWeekday:(e,t,n)=>(n??new i(t)).format(e,`cccc`)}};export{l as zhTW};
1
+ import{c as e,l as t,o as n,s as r}from"./en-US-DKYSujv3.js";import{Dt as i}from"./index-CYVrs22O.js";var a={lessThanXSeconds:{one:`少於 1 秒`,other:`少於 {{count}} 秒`},xSeconds:{one:`1 秒`,other:`{{count}} 秒`},halfAMinute:`半分鐘`,lessThanXMinutes:{one:`少於 1 分鐘`,other:`少於 {{count}} 分鐘`},xMinutes:{one:`1 分鐘`,other:`{{count}} 分鐘`},xHours:{one:`1 小時`,other:`{{count}} 小時`},aboutXHours:{one:`大約 1 小時`,other:`大約 {{count}} 小時`},xDays:{one:`1 天`,other:`{{count}} 天`},aboutXWeeks:{one:`大約 1 個星期`,other:`大約 {{count}} 個星期`},xWeeks:{one:`1 個星期`,other:`{{count}} 個星期`},aboutXMonths:{one:`大約 1 個月`,other:`大約 {{count}} 個月`},xMonths:{one:`1 個月`,other:`{{count}} 個月`},aboutXYears:{one:`大約 1 年`,other:`大約 {{count}} 年`},xYears:{one:`1 年`,other:`{{count}} 年`},overXYears:{one:`超過 1 年`,other:`超過 {{count}} 年`},almostXYears:{one:`將近 1 年`,other:`將近 {{count}} 年`}},o=(e,t,n)=>{let r,i=a[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,String(t)),n?.addSuffix?n.comparison&&n.comparison>0?r+`內`:r+`前`:r},s={date:t({formats:{full:`y'年'M'月'd'日' EEEE`,long:`y'年'M'月'd'日'`,medium:`yyyy-MM-dd`,short:`yy-MM-dd`},defaultWidth:`full`}),time:t({formats:{full:`zzzz a h:mm:ss`,long:`z a h:mm:ss`,medium:`a h:mm:ss`,short:`a h:mm`},defaultWidth:`full`}),dateTime:t({formats:{full:`{{date}} {{time}}`,long:`{{date}} {{time}}`,medium:`{{date}} {{time}}`,short:`{{date}} {{time}}`},defaultWidth:`full`})},c={lastWeek:`'上個'eeee p`,yesterday:`'昨天' p`,today:`'今天' p`,tomorrow:`'明天' p`,nextWeek:`'下個'eeee p`,other:`P`},l={code:`zh-TW`,formatDistance:o,formatLong:s,formatRelative:(e,t,n,r)=>c[e],localize:{ordinalNumber:(e,t)=>{let n=Number(e);switch(t?.unit){case`date`:return n+`日`;case`hour`:return n+`時`;case`minute`:return n+`分`;case`second`:return n+`秒`;default:return`第 `+n}},era:e({values:{narrow:[`前`,`公元`],abbreviated:[`前`,`公元`],wide:[`公元前`,`公元`]},defaultWidth:`wide`}),quarter:e({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`第一刻`,`第二刻`,`第三刻`,`第四刻`],wide:[`第一刻鐘`,`第二刻鐘`,`第三刻鐘`,`第四刻鐘`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:e({values:{narrow:[`一`,`二`,`三`,`四`,`五`,`六`,`七`,`八`,`九`,`十`,`十一`,`十二`],abbreviated:[`1月`,`2月`,`3月`,`4月`,`5月`,`6月`,`7月`,`8月`,`9月`,`10月`,`11月`,`12月`],wide:[`一月`,`二月`,`三月`,`四月`,`五月`,`六月`,`七月`,`八月`,`九月`,`十月`,`十一月`,`十二月`]},defaultWidth:`wide`}),day:e({values:{narrow:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],short:[`日`,`一`,`二`,`三`,`四`,`五`,`六`],abbreviated:[`週日`,`週一`,`週二`,`週三`,`週四`,`週五`,`週六`],wide:[`星期日`,`星期一`,`星期二`,`星期三`,`星期四`,`星期五`,`星期六`]},defaultWidth:`wide`}),dayPeriod:e({values:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`上`,pm:`下`,midnight:`凌晨`,noon:`午`,morning:`早`,afternoon:`下午`,evening:`晚`,night:`夜`},abbreviated:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`},wide:{am:`上午`,pm:`下午`,midnight:`凌晨`,noon:`中午`,morning:`早晨`,afternoon:`中午`,evening:`晚上`,night:`夜間`}},defaultFormattingWidth:`wide`})},match:{ordinalNumber:n({matchPattern:/^(第\s*)?\d+(日|時|分|秒)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:r({matchPatterns:{narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^(前)/i,/^(公元)/i]},defaultParseWidth:`any`}),quarter:r({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻鐘/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:r({matchPatterns:{narrow:/^(一|二|三|四|五|六|七|八|九|十[二一]?)/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]?|\d|1[0-2])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一]?)月/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^(一|1(?!\d))/i,/^(二|2)/i,/^(三|3)/i,/^(四|4)/i,/^(五|5)/i,/^(六|6)/i,/^(七|7)/i,/^(八|8)/i,/^(九|9)/i,/^(十(?!(一|二))|10)/i,/^(十一|11)/i,/^(十二|12)/i]},defaultParseWidth:`any`}),day:r({matchPatterns:{narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^週[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},defaultParseWidth:`any`}),dayPeriod:r({matchPatterns:{any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨)/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},defaultParseWidth:`any`})},options:{weekStartsOn:1,firstWeekContainsDate:4},labels:{labelDayButton:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t.today&&(a=`今天,${a}`),t.selected&&(a=`${a},已選取`),a},labelMonthDropdown:`選擇月份`,labelNext:`前往下個月`,labelPrevious:`前往上個月`,labelWeekNumber:e=>`第 ${e} 週`,labelYearDropdown:`選擇年份`,labelGrid:(e,t,n)=>(n??new i(t)).formatMonthYear(e),labelGridcell:(e,t,n,r)=>{let a=(r??new i(n)).format(e,`PPPP`);return t?.today&&(a=`今天,${a}`),a},labelNav:`導覽列`,labelWeekNumberHeader:`週數`,labelWeekday:(e,t,n)=>(n??new i(t)).format(e,`cccc`)}};export{l as zhTW};
@@ -20,18 +20,18 @@
20
20
  <meta name="twitter:image" content="/brand/social.png" />
21
21
  <meta name="description" content="Kanvil — self-hosted ticketing for people and agents." />
22
22
  <title>Kanvil</title>
23
- <script type="module" crossorigin src="/assets/index-MTE_naHG.js"></script>
23
+ <script type="module" crossorigin src="/assets/index-CYVrs22O.js"></script>
24
24
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-COiEfhsA.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/core-jXc03Sty.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/en-EnSRisMz.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BLdHbfdN.js">
28
- <link rel="modulepreload" crossorigin href="/assets/default-D6I-Xfqm.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/default-bQFGTwIp.js">
29
29
  <link rel="modulepreload" crossorigin href="/assets/toDate-B3HYxwtT.js">
30
- <link rel="modulepreload" crossorigin href="/assets/search-DQtwggUH.js">
31
- <link rel="modulepreload" crossorigin href="/assets/item-CRS9Ai9p.js">
32
- <link rel="modulepreload" crossorigin href="/assets/Trans-NwgJNiLl.js">
33
- <link rel="modulepreload" crossorigin href="/assets/forms-BwtRqvGj.js">
34
- <link rel="modulepreload" crossorigin href="/assets/CompositeItem-DvEBmVYM.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/search-Ble6WSEU.js">
31
+ <link rel="modulepreload" crossorigin href="/assets/item-TCHuZNK6.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/Trans-B1rRlWca.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/forms-BlEL8C_P.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/CompositeItem-CXqewtEL.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/en-US-DKYSujv3.js">
36
36
  <link rel="stylesheet" crossorigin href="/assets/index-DyQNFS69.css">
37
37
  </head>
package/docs/api.md CHANGED
@@ -8,7 +8,13 @@ Runnable MCP and durable realtime examples, plus the worker ownership sequence,
8
8
 
9
9
  Browser and native clients use Better Auth sessions with local login or configured OIDC. Public registration is closed. Initial owner setup requires `KANVIL_SETUP_TOKEN` and is available only before any account exists.
10
10
 
11
- Unattended consumers use revocable API credentials in `Authorization: Bearer <key>`. Create credentials through an authenticated account at `POST /api/v1/credentials`, with a name, `projectIds`, `read`, `write`, `claim`, or `admin` scopes, and an optional `expiresIn` in seconds (one hour to one year). An omitted `expiresIn` expires the key after 90 days; `null` creates a key that never expires. Pass a nonempty `projectIds` array for a project-scoped key, or explicit `projectIds: null` for a global key. Omitted or empty project lists are invalid. Global keys follow the owning account's current project and workspace access, including future grants; existing project-scoped keys retain their allowlists. Both key types obey operation scopes and current account roles, and neither can perform actions that require a signed-in session, including credential management and instance administration. A scope never grants more access than the owning account has. The secret is returned only on creation. Delete a credential at `/api/v1/credentials/{id}` to revoke it.
11
+ Unattended consumers use revocable API credentials in `Authorization: Bearer <key>`. Create credentials through an authenticated account at `POST /api/v1/credentials`, with a name, `projectIds`, `read`, `write`, `claim`, `admin`, or `intake` scopes, and an optional `expiresIn` in seconds (one hour to one year). An omitted `expiresIn` expires the key after 90 days; `null` creates a key that never expires. Pass a nonempty `projectIds` array for a project-scoped key, or explicit `projectIds: null` for a global key. Omitted or empty project lists are invalid. Global keys follow the owning account's current project and workspace access, including future grants; existing project-scoped keys retain their allowlists. Both key types obey operation scopes and current account roles, and neither can perform actions that require a signed-in session, including credential management and instance administration. A scope never grants more access than the owning account has. The secret is returned only on creation. Delete a credential at `/api/v1/credentials/{id}` to revoke it.
12
+
13
+ The `intake` scope is create-only and cannot be combined with another scope (`400 validation_error`). It allows only `create_ticket` over HTTP or MCP in projects the credential and its owning account can write. It grants no read access, including ticket lookup, search, snapshots, events, or attachment downloads, and cannot update, delete, move, comment on, or attach files to tickets. Other authenticated operations return `403 insufficient_scope`.
14
+
15
+ Intake creation returns only the new ticket's normal payload. The server forces `automationReady: false`, `holdReason: "Untrusted intake: human triage required"`, the first To do state, no assignee or parent, `archived: false`, no dates, empty custom fields (including defaults and required fields), and no uploads. It preserves the supplied title, description, requirements, kind, difficulty, priority, labels, and scopes, and adds the `intake` label. The 30-label limit includes that label. Reusing the same `requestId` returns the original ticket without creating another. A human session or a credential with ordinary write access can triage it later and enable automation. Eligibility inspection includes its explicit not-ready reasons until triage clears the hold and enables automation.
16
+
17
+ Repository issue sync uses the server-forced intake hold as a quarantine marker: neither export planning nor event-driven export includes the ticket until a trusted writer clears that hold. Already queued issue-sync deliveries recheck the hold before contacting the repository. Ordinary tickets without automation readiness still follow their configured sync rules.
12
18
 
13
19
  ## Writes and ownership
14
20
 
@@ -16,7 +22,7 @@ Use the ticket's current `version` as `expectedVersion` for updates. A stale ver
16
22
 
17
23
  Reuse the same UUID `requestId` when retrying a write. Reusing it with a different operation or payload returns `409 idempotency_conflict`. Bulk edits either all commit or all roll back, and publish one `ticket.updated` event per ticket with consecutive IDs in a single batch.
18
24
 
19
- Signed-in sessions may make `KANVIL_SESSION_WRITE_LIMIT` write requests per minute (120 by default) to `/api/v1`, and MCP OAuth clients get the same budget for write tools; exceeding it returns `429 rate_limited` with a `Retry-After` header. This counter is per application process. API keys have a separate limit of 600 requests per minute per key across HTTP and MCP. An instance operator can set `KANVIL_API_KEY_RATE_LIMIT_ENABLED=false` and restart the server to disable that limit for existing and new keys. The default is `true`; restoring it enforces the limit again. Session, MCP OAuth, and sign-in limits are unchanged, as are key expiration, revocation, scopes, and account permissions. Authentication rereads each key and skips timestamp-only bookkeeping writes. When a key is unlimited, authentication leaves its stored `last_request` and `updated_at` unchanged; enabled rate limits and usage quotas still consume their allowance synchronously and atomically.
25
+ Signed-in sessions may make `KANVIL_SESSION_WRITE_LIMIT` write requests per minute (120 by default) to `/api/v1`, and MCP OAuth clients get the same budget for write tools; exceeding it returns `429 rate_limited` with a `Retry-After` header. This counter is per application process. API keys have a separate limit of 600 requests per minute per key across HTTP and MCP. An instance operator can set `KANVIL_API_KEY_RATE_LIMIT_ENABLED=false` and restart the server to disable that limit for existing and new keys. The default is `true`; restoring it enforces the limit again. Session, MCP OAuth, and sign-in limits are unchanged, as are key expiration, revocation, scopes, and account permissions. Authentication rereads each key and skips timestamp-only bookkeeping writes. When a key is unlimited, authentication leaves its stored `last_request` and `updated_at` unchanged; enabled rate limits and usage quotas still consume their allowance synchronously and atomically. A request that consumed a key's last use is admitted even when a concurrent request finds the key exhausted and deletes it first.
20
26
 
21
27
  Claims require an eligible ticket and current version. Successful claiming moves it to In progress. Renew an unexpired claim using its ID and the same credential. Once a ticket has been claimed, machine ticket updates and evidence submissions require a current matching claim ID, including after release. Recovery without `reschedule` lifts that requirement and increments the ticket version, publishing `ticket.updated` with `changedFields: ["claimRequired"]`, so a ticket left outside To do (for example, In review after its work merged) accepts ordinary worker writes again; a write that still names the recovered claim ID returns `409 claim_conflict`. Submit completion and evidence before releasing ownership. Human sessions can edit and reschedule work without a machine claim. Release unexpired ownership after the worker stops or completes. The ticket response exposes `canReleaseClaim` for the exact credential or client identity; sharing an account does not confer ownership. An expired claim remains blocking until a caller with `claim` scope and `ticket.write` permission confirms the old worker stopped and explicitly calls `recover_claim` with its ID, a reason, and `confirmedStopped: true`. Administrator access is not required for expired claims. If a worker has stopped while its claim is still live, for example after revoking its credential, a caller with `project.manage` and `admin` scope can explicitly pass `cancelActive: true` to cancel it before expiry. This still requires `confirmedStopped: true` and a reason, and the recovery event records the cancellation. Without that flag, live claims remain protected. Recovery does not automatically reschedule work or grant a replacement claim. To resume without a human session, explicitly pass `reschedule: true` and the ticket's current `expectedVersion` to `recover_claim`; this returns it to To do and increments its version atomically with recovery. Then call `get_ticket` and `claim_ticket` with the new version for a fresh claim ID. A missing version returns `400 validation_error`, and a stale one returns `409 version_conflict`, leaving the claim and status unchanged. Initial claims and renewals accept `leaseSeconds` of at least 30, bounded by `KANVIL_CLAIM_MAX_LEASE_SECONDS`, which defaults to 86400 (24 hours). The default lease remains 300 seconds, or the configured maximum if smaller. A request above the configured maximum returns `400 validation_error`; renew before expiry to keep ownership.
22
28
 
@@ -36,11 +42,15 @@ The property filters `status`, `priority`, `kind`, `difficulty`, `label`, `assig
36
42
 
37
43
  `list_my_work` (`GET /api/v1/my-work`) pages through the open, unarchived tickets assigned to the caller across every project they can read, optionally narrowed to one `workspaceId`. It accepts `q`, `sort`, and `order` like `list_tickets`, plus `limit` and `offset`; `total` counts every match so clients can fetch the remaining pages. Set `activity` (up to 50) to also receive that many of the most recent events from the same accessible projects, newest first. Revoked memberships and project-bound credentials narrow the tickets, totals, and activity alike.
38
44
 
39
- `search_tickets` (`GET /api/v1/tickets/search?q=...`) finds unarchived tickets by exact key or text across every project the caller can read, optionally limited to one `workspaceId`, returning each ticket with its project `id`, `key`, and `name`. Exact key matches sort first.
45
+ `search_tickets` (`GET /api/v1/tickets/search?q=...`) finds unarchived tickets by exact key or text across every project the caller can read, optionally limited to one `workspaceId`, returning each ticket with its project `id`, `key`, and `name`. Exact key matches sort first, then the most relevant matches (the external index's score, or on PostgreSQL title matches before matches only in other text), then the most recently updated.
46
+
47
+ Ticket text queries in `list_tickets`, `list_my_work`, `search_tickets`, and `search_workspace` treat each double-quoted segment of `q` as an exact phrase: `q="live activity" acknowledge` needs the phrase `live activity` and the term `acknowledge`. Terms outside quotes keep fuzzy matching on the external index, and on PostgreSQL they must appear together as written. An unpaired quote is an ordinary character. Repeated phrases count once, and only the first 8 distinct phrases count.
48
+
49
+ `list_tickets`, `search_tickets`, and `search_workspace` take `view`: `full` (the default) or `summary`. A summary row has only `id`, `key`, `number`, `projectId`, `title`, `status`, `stateId`, `kind`, `difficulty`, `priority`, `labels`, `scopes`, `archived`, `automationReady`, `updatedAt`, and `version`, so agents can scan many results without every description and acceptance criteria. In summary view each `search_tickets` result and `search_workspace` result also carries `snippet`: up to 240 characters of its body text (a ticket's description and acceptance criteria) around the first literal match of a phrase or term, or empty when only the title, key, or a fuzzy term matched; a `search_workspace` result's `ticket` is its summary row.
40
50
 
41
- `search_workspace` (`GET /api/v1/search?q=...`) searches projects, unarchived tickets, comments on unarchived tickets, and activity across every project the caller can read, optionally within one `workspaceId`. Each result has a `type` (`project`, `ticket`, `comment`, or `activity`), a stable `id` (the project, ticket, or comment ID, or the event ID), its `project`, its `ticket` (`id`, `key`, `title`, `status`, or `null`), a display `title`, an `excerpt` around the first literal match, `actorId`, and `at`. Activity matches its event label, its ticket key, or the name of an active (not disabled) actor. Results order by exact key match, then type in the order above, then most recent first. `limit` (1–50, default 20) and `offset` (up to 1000) page through them; `type` narrows the page to one kind while `counts` still reports every kind and `total` counts the page's kind. The property filters above restrict results to matching tickets and their comments and activity, and leave out projects. Ticket text uses the external index when one is configured and current (`engine: "index"`); otherwise PostgreSQL answers (`engine: "postgres"`), and `indexing: true` says an index is configured but behind or unavailable. Projects, comments, and activity always come from PostgreSQL, and every result is filtered by current project access before counts and excerpts are computed.
51
+ `search_workspace` (`GET /api/v1/search?q=...`) searches projects, unarchived tickets, comments on unarchived tickets, and activity across every project the caller can read, optionally within one `workspaceId`. Each result has a `type` (`project`, `ticket`, `comment`, or `activity`), a stable `id` (the project, ticket, or comment ID, or the event ID), its `project`, its `ticket` (`id`, `key`, `title`, `status`, or `null`), a display `title`, an `excerpt` around the first literal match, `actorId`, and `at`. Activity matches its event label, its ticket key, or the name of an active (not disabled) actor. Results order by exact key match, then type in the order above, then ticket relevance as in `search_tickets`, then most recent first. `limit` (1–50, default 20) and `offset` (up to 1000) page through them; `type` narrows the page to one kind while `counts` still reports every kind and `total` counts the page's kind. The property filters above restrict results to matching tickets and their comments and activity, and leave out projects. Ticket text uses the external index when one is configured and current (`engine: "index"`); otherwise PostgreSQL answers (`engine: "postgres"`), and `indexing: true` says an index is configured but behind or unavailable. Projects, comments, and activity always come from PostgreSQL, and every result is filtered by current project access before counts and excerpts are computed.
42
52
 
43
- Use `list_tickets` with `parentId` set to a parent UUID or ticket key to page through child tickets. Set `archived: "include"` to include archived children. Set `relatedTo` to a ticket UUID or key to page through the tickets linked to it by any relationship, in either direction. `list_relations` also returns the current source/target keys and full titles, so consumers can show readable dependency context without separate lookups.
53
+ Use `list_tickets` with `parentId` set to a parent UUID or ticket key to page through child tickets. Set `archived: "include"` to include archived children. Set `relatedTo` to a ticket UUID or key to page through the tickets linked to it by any relationship, in either direction. `list_relations` also returns the current source/target keys, full titles, and projects, so consumers can show readable dependency context without separate lookups. `relatedTo` lists only the linked tickets in the current project; `list_relations` includes links to other projects.
44
54
 
45
55
  `duplicate_ticket` (`POST /api/v1/projects/{projectId}/tickets/{ticketId}/duplicate`) creates a new ticket in the same project with the next key, the original title followed by ` (copy)` (shortened to fit 500 characters), and the caller as `createdBy`. It copies the description, acceptance criteria, priority, kind, difficulty, due date, labels, scopes, and parent, and the assignee while they are still a project member. The copy starts in To do, unarchived, with `automationReady` false and no hold reason; the original's claims, comments, evidence, attachments, relationships, and children are not copied. A `clones` relationship links the copy to the original. One transaction writes the ticket, the relationship, a `ticket.created` event carrying `duplicateOf` (the original ID), and `relation.added` events for both tickets. It requires `write`; reuse `requestId` to retry without creating a second copy.
46
56
 
@@ -104,7 +114,7 @@ Each project has named workflow states. Every state maps to one of the six canon
104
114
 
105
115
  Ticket writes take `status`, `stateId`, or both. A `stateId` must name a state of the ticket's project, and a `status` written with it must equal that state's category; otherwise the write fails with `400 validation_error` instead of choosing a state. A `status` alone keeps the ticket's state when the category is unchanged and otherwise moves it to that category's first state, so clients that predate workflows keep working. Creation without either starts in the first To do state, duplication copies into it, and claiming moves the ticket to the first In progress state. A change to either field reports both `status` and `stateId` in `changedFields`. `list_tickets` takes `stateId` to list one state's tickets; the `status` filter matches categories. Clients reading a server that predates workflows get `stateId: null`. Clients built from this contract ignore ticket fields they do not know, so later additions do not break them.
106
116
 
107
- `add_relation` accepts `blocks`, `related`, `duplicate`, `causes`, `clones`, `implements`, or `reviews`. `direction` defaults to `outgoing` for existing clients. Use `incoming` to express the inverse from the current ticket: for example, `{ticketId: "<current>", targetId: "<blocker>", type: "blocks", direction: "incoming"}` means the current ticket is blocked by the selected ticket. The server stores a single canonical edge, checks project access on both tickets, and rejects dependency cycles in either direction. Related links are symmetric. Only blocking dependencies add readiness blockers; duplicate sources remain ineligible for agent work. Other link types are informational. Parent/child hierarchy continues to use `parentId` rather than a second relationship edge.
117
+ `add_relation` accepts `blocks`, `related`, `duplicate`, `causes`, `clones`, `implements`, or `reviews`. `direction` defaults to `outgoing` for existing clients. Use `incoming` to express the inverse from the current ticket: for example, `{ticketId: "<current>", targetId: "<blocker>", type: "blocks", direction: "incoming"}` means the current ticket is blocked by the selected ticket. `targetId` is a ticket ID or key in this project or in any other project the caller can read, in this workspace or another; a target the caller cannot read, including one outside a project-bound API key's projects, returns `404 not_found` and creates nothing. The caller needs `write` on the current ticket's project. An edge that constrains a ticket in another project, as the blocked side of `blocks` or the source of `duplicate`, also needs `write` there, to add it or to remove it, and fails with `403 forbidden` otherwise; reading that project is enough to depend on its tickets or to add an informational link. The server stores a single canonical edge and rejects dependency cycles in either direction, following blockers and parents across every project. Related links are symmetric. Only blocking dependencies add readiness blockers, whichever project the blocker is in; duplicate sources remain ineligible for agent work. Other link types are informational. Adding or removing an edge writes `relation.added` or `relation.removed` for each ticket in that ticket's own project, so realtime subscribers and followers of either project see it. `remove_relation` works from either ticket's project, under the same `write` rule for a constrained ticket elsewhere. Deleting a ticket, or its whole project, removes its relationships and writes `relation.removed` for each surviving ticket in another project, in that ticket's project. `list_relations` returns each side's `sourceKey`/`targetKey`, title, `sourceProjectId`/`targetProjectId`, and `sourceProjectKey`/`targetProjectKey`, plus `restricted`. When the other ticket is in a project the caller cannot read, `restricted` is `true` and that side carries only its ID and key, with no title or project. Relocating a ticket and moving a project to another workspace stay blocked by its relationships, whichever projects they reach. Parent/child hierarchy continues to use `parentId` rather than a second relationship edge.
108
118
 
109
119
  ### Custom fields
110
120
 
package/docs/releasing.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Releases
2
2
 
3
- PRs and `main` pushes run `.github/workflows/ci.yml`. Independent suites and browser/native/Docker matrices run in parallel; only jobs consuming build artifacts wait for the build. The always-running `Checks` status requires every suite to succeed. Releases start on a `vX.Y.Z` tag and reuse that workflow against the tagged commit. Publishing jobs have registry write permissions; PR checks have read-only repository access.
3
+ PRs and `main` pushes run `.github/workflows/ci.yml`. `main` pushes also publish an [experimental build](#experimental-builds). Independent suites and browser/native/Docker matrices run in parallel; only jobs consuming build artifacts wait for the build. The always-running `Checks` status requires every suite to succeed. Releases start on a `vX.Y.Z` tag and reuse that workflow against the tagged commit. Publishing jobs have registry write permissions; PR checks have read-only repository access.
4
4
 
5
5
  The public npm application package is `@maudecode/kanvil`; the workspace root and internal packages remain private. The release tag supplies the version for both npm and Docker: `v1.2.3` publishes `@maudecode/kanvil@1.2.3` and `ghcr.io/maudecode/kanvil:1.2.3`. The server build embeds that same version for Administration, public instance info, OpenAPI, and MCP. Installed artifacts need no Git checkout or release environment variables. No `package.json` version bump is needed. PR and local builds use the development version in `package.json`; custom Docker builds pass `--build-arg KANVIL_VERSION=X.Y.Z` to stamp the server and image label together. Native mobile app/store versions remain separate.
6
6
 
@@ -11,10 +11,24 @@ The public npm application package is `@maudecode/kanvil`; the workspace root an
11
11
  3. Check the `Release` run. It rejects malformed or prerelease tags, `v0.0.0`, and commits outside `main` history. The full CI workflow must pass on that commit.
12
12
  4. Verify `npm view @maudecode/kanvil@X.Y.Z dist.integrity` and `docker buildx imagetools inspect ghcr.io/maudecode/kanvil:X.Y.Z`. The image includes Linux amd64 and arm64. Confirm anonymous Docker pulls work, and check the GitHub Release for the tag and its automatically generated notes.
13
13
 
14
- The workflow publishes the exact npm tarball installed by CI to the `latest` dist-tag, while separate amd64/arm64 publishers push the exact image archives tested by CI. Docker builds and restoration tests run on matching native runners; release publishing does not rebuild or emulate either image. A final Docker manifest job joins those immutable digests under `ghcr.io/maudecode/kanvil:X.Y.Z` and `:latest`. Stable releases only; prerelease versions are rejected. Do not tag an older version to move `latest` backward.
14
+ The workflow publishes the exact npm tarball installed by CI to the `latest` dist-tag, while separate amd64/arm64 publishers push the exact image archives tested by CI. Docker builds and restoration tests run on matching native runners; release publishing does not rebuild or emulate either image. A final Docker manifest job joins those immutable digests under `ghcr.io/maudecode/kanvil:X.Y.Z` and `:latest`. Stable and experimental builds share this publisher, `.github/workflows/publish-images.yml`. Stable releases only; prerelease versions are rejected. Do not tag an older version to move `latest` backward.
15
15
 
16
16
  If either registry publication fails, rerun the failed release jobs. npm and Docker publication are independent after validation. The npm step accepts an existing version only when its SHA-512 integrity matches the tested tarball; different bytes fail and require a new version. Registry publication is not atomic across npm and GHCR. Never move a published tag or reuse a version for changed bytes. Avoid rerunning an old release after a newer release, since Docker's `latest` tag would move backward.
17
17
 
18
18
  After npm publication and the Docker manifest job both succeed, the workflow creates a GitHub Release for the existing tag with an automatically generated title and release notes. Only this final job has repository contents write permission. Reruns preserve an existing release and its notes.
19
19
 
20
+ ## Experimental builds
21
+
22
+ Every push to `main` also publishes an experimental build once CI passes on that exact commit. `.github/workflows/experimental.yml` runs when a CI run finishes. It publishes only a successful `push` run of this repository's `main` whose commit is still on `main`; pull requests, forks, other branches, release tags, and failed or cancelled runs publish nothing. Each `main` commit runs CI in its own concurrency group, so a newer push never cancels or replaces an older commit's verification or publication.
23
+
24
+ An experimental build of commit `SHA` (the full 40-character commit) has the version `0.0.0-experimental.gSHA` in Administration, public instance info, OpenAPI, MCP, and the image's `org.opencontainers.image.version` label; `org.opencontainers.image.revision` is `SHA`. CI builds and tests it with that identity (`KANVIL_RELEASE_CHANNEL=experimental` in `scripts/release-version.ts`), and publishing reuses the exact native images CI tested:
25
+
26
+ - `ghcr.io/maudecode/kanvil:experimental-SHA-amd64` and `-arm64`, then the multi-platform `ghcr.io/maudecode/kanvil:experimental-SHA`. These names are immutable.
27
+ - A Git tag and GitHub prerelease named `experimental-SHA`, pinned to `SHA`, created only after both architectures and the multi-platform manifest are published. It is never marked latest; its notes give the source commit, image, and manifest digest after the generated change list.
28
+ - `ghcr.io/maudecode/kanvil:experimental`, the opt-in rolling alias. It moves to the newest announced experimental build on `main`'s first-parent history and never to an older commit, so builds that finish out of order and reruns of old runs cannot move it backward. Only this step is serialized.
29
+
30
+ Experimental tags start with a letter, so tools that read numeric Docker tags as versions, such as Renovate, never treat them as upgrades from a stable release; CI's `Renovate tag selection` job checks this with Renovate itself. Experimental builds never publish npm packages or move npm dist-tags, `latest`, version tags, or the latest GitHub release.
31
+
32
+ Reruns are safe. `scripts/release-publish.ts` keeps an existing image, manifest, tag, or release that names the same commit and version, and fails on one that names anything else rather than replacing it. If one architecture fails to publish, rerun the failed jobs of the `Experimental` run; they reuse the images CI tested and the architecture already published. If only the alias move fails, rerun it, or let the next `main` commit's run move the alias; it always selects the newest published build.
33
+
20
34
  Tag creation and package publication are separate from deploying to any running instance. Operators choose when to upgrade using [self-hosting](self-hosting.md).