most-box 0.2.6 → 0.2.7

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 (106) hide show
  1. package/README.md +6 -0
  2. package/electron/updateChecker.js +10 -31
  3. package/electron/updateChecker.test.js +43 -0
  4. package/out/admin/index.html +0 -0
  5. package/out/app/index.html +0 -0
  6. package/out/assets/{FilePreviewOverlay-DqH7uKb7.js → FilePreviewOverlay-CW8lKJCw.js} +1 -1
  7. package/out/assets/{LanguageToggle-BoBNesNU.js → LanguageToggle-Cfh33R2h.js} +1 -1
  8. package/out/assets/{MarketingHeader-Derv67Vs.js → MarketingHeader-BKBngzf5.js} +1 -1
  9. package/out/assets/MarketingLayout-C3xrXmfU.js +1 -0
  10. package/out/assets/{MarketingThemeToggle-BLuQ_uE-.js → MarketingThemeToggle-Cl7PhFgv.js} +1 -1
  11. package/out/assets/{MilkdownEditor-f2vRIY21.js → MilkdownEditor-B5SKAyjg.js} +1 -1
  12. package/out/assets/{OpenSidebarButton-BKX4B_yG.js → OpenSidebarButton-Bdx86oG8.js} +1 -1
  13. package/out/assets/{SidebarAccount-D6wj_ijc.js → SidebarAccount-c8jirEMF.js} +1 -1
  14. package/out/assets/{SidebarHomeLink-ByOHwlH8.js → SidebarHomeLink-LzYXrJRr.js} +1 -1
  15. package/out/assets/arrow-right-BC_GWahx.js +1 -0
  16. package/out/assets/{circle-alert-Dyc-4wje.js → circle-alert-Dkgyw_GE.js} +1 -1
  17. package/out/assets/{copy-D8HSH5Ki.js → copy-KIwotKoP.js} +1 -1
  18. package/out/assets/{download-Q6jKMPIG.js → download-DPA-3LpR.js} +1 -1
  19. package/out/assets/{downloadValidation-B-w8D_0W.js → downloadValidation-CH8BeY7_.js} +1 -1
  20. package/out/assets/{external-link-GQcZwDTT.js → external-link-BmR2rZ80.js} +1 -1
  21. package/out/assets/{file-text-CVl5SZPJ.js → file-text-BJQfDW9r.js} +1 -1
  22. package/out/assets/{folder-BtIdk-YN.js → folder-Gb80aQnO.js} +1 -1
  23. package/out/assets/{hard-drive-Cew_LD0N.js → hard-drive-P2dGA7FX.js} +1 -1
  24. package/out/assets/i18n-Cqyi6NZb.js +1 -0
  25. package/out/assets/index-CSBg7dZN.css +1 -0
  26. package/out/assets/index-CiHRnvMj.js +31 -0
  27. package/out/assets/index.lazy-B7u3Ztoe.js +1 -0
  28. package/out/assets/index.lazy-BdOfbfjo.js +2 -0
  29. package/out/assets/index.lazy-Bh4jDrUl.js +1 -0
  30. package/out/assets/{index.lazy-Bn4kDToA.js → index.lazy-Bo6McUf1.js} +1 -1
  31. package/out/assets/index.lazy-BxUje7fk.js +1 -0
  32. package/out/assets/{index.lazy-WXDn5r_l.js → index.lazy-CIqPn0cy.js} +1 -1
  33. package/out/assets/index.lazy-CfuoMz6P.js +1 -0
  34. package/out/assets/{index.lazy-DujygWms.js → index.lazy-DAKkwnV2.js} +1 -1
  35. package/out/assets/index.lazy-DRaxm9OS.js +1 -0
  36. package/out/assets/index.lazy-DkrwcEBu.js +2 -0
  37. package/out/assets/{index.lazy-DxAGUwlf.js → index.lazy-K6IB-5kb.js} +1 -1
  38. package/out/assets/{index.lazy-CLYRM_kh.js → index.lazy-Uu9DCtrI.js} +1 -1
  39. package/out/assets/{index.lazy-BqHgW5fE.js → index.lazy-mXESMo49.js} +1 -1
  40. package/out/assets/{key-round-D1zfZzvP.js → key-round-DvpIlAJY.js} +1 -1
  41. package/out/assets/{loader-BSclU8WE.js → loader-8eVY8_SD.js} +1 -1
  42. package/out/assets/{lock-C9VP0ezG.js → lock-Cvtl60UJ.js} +1 -1
  43. package/out/assets/{message-square-Dg3YjjmO.js → message-square-JK7ABH3O.js} +1 -1
  44. package/out/assets/{mp-FQvFEcYM.js → mp-CMvgV1-c.js} +1 -1
  45. package/out/assets/{music-BeCPak70.js → music-YRSH1Jq6.js} +1 -1
  46. package/out/assets/{notebook-pen-DO1CJiqn.js → notebook-pen-BjGx0coX.js} +1 -1
  47. package/out/assets/play-Ds19moWN.js +1 -0
  48. package/out/assets/plus-CvGkRhJV.js +1 -0
  49. package/out/assets/{save-BVeMjaW1.js → save-BcI68ZgS.js} +1 -1
  50. package/out/assets/search-BIa4RSPA.js +1 -0
  51. package/out/assets/{send-C1J-eGNs.js → send-_ups0_3f.js} +1 -1
  52. package/out/assets/{shield-check-CZYDVJoh.js → shield-check-Dzw5rdPe.js} +1 -1
  53. package/out/assets/smartphone-DSQ5L_sr.js +1 -0
  54. package/out/assets/{trash-2-C_LtCiNh.js → trash-2-BIrBn6Ce.js} +1 -1
  55. package/out/assets/{triangle-alert-DOwc-41Y.js → triangle-alert-CgWIEl4u.js} +1 -1
  56. package/out/assets/{ui-PnUvY9zL.js → ui-u9yJHkb-.js} +1 -1
  57. package/out/assets/{upload-DgxxldtV.js → upload-1jmNeGjH.js} +1 -1
  58. package/out/assets/{useChannelMessages-CZHmH5n-.js → useChannelMessages-DNxfCew-.js} +1 -1
  59. package/out/assets/useGameRoom-Du07VEgb.js +1 -0
  60. package/out/assets/userProfile-CL1Ev2GK.js +1 -0
  61. package/out/assets/{wallet-DBTWBi6K.js → wallet-BvM_X5nW.js} +1 -1
  62. package/out/assets/{wifi-pP6SJLcu.js → wifi-66t1dsgC.js} +1 -1
  63. package/out/chat/index.html +0 -0
  64. package/out/chat/join/index.html +0 -0
  65. package/out/download/index.html +2 -2
  66. package/out/game/gandengyan/index.html +0 -0
  67. package/out/game/index.html +0 -0
  68. package/out/game/zhajinhua/index.html +0 -0
  69. package/out/index.html +2 -2
  70. package/out/note/index.html +0 -0
  71. package/out/ping/index.html +2 -2
  72. package/out/profile/index.html +0 -0
  73. package/out/web3/index.html +0 -0
  74. package/package.json +5 -1
  75. package/server/src/core/channelIdentity.js +3 -5
  76. package/server/src/core/gameRoom.js +18 -43
  77. package/server/src/core/ownerMetadata.js +3 -4
  78. package/server/src/core/releaseManifest.js +108 -0
  79. package/server/src/core/shared.js +50 -0
  80. package/server/src/core/zhajinhua.js +12 -33
  81. package/server/src/games/gandengyan.js +7 -14
  82. package/server/src/http/nodeStatus.js +0 -6
  83. package/server/src/http/routes/channelRoutes.js +1 -13
  84. package/server/src/http/routes/nodeRoutes.js +1 -1
  85. package/server/src/index.js +44 -14
  86. package/server/src/utils/api.js +47 -0
  87. package/server/src/utils/auth.js +2 -5
  88. package/server/src/utils/dateTime.js +1 -3
  89. package/out/assets/MarketingLayout-fc2mymJm.js +0 -1
  90. package/out/assets/arrow-right-BCi9KXDX.js +0 -1
  91. package/out/assets/cloud-DfaFxhLj.js +0 -1
  92. package/out/assets/i18n--maTEG0d.js +0 -1
  93. package/out/assets/index-B2-kpfu5.css +0 -1
  94. package/out/assets/index-Cg4kEvx8.js +0 -31
  95. package/out/assets/index.lazy-BAq__8ON.js +0 -2
  96. package/out/assets/index.lazy-BPh8D_H9.js +0 -1
  97. package/out/assets/index.lazy-CMSCQucz.js +0 -1
  98. package/out/assets/index.lazy-Cut4XkPH.js +0 -1
  99. package/out/assets/index.lazy-DKOSJyaQ.js +0 -2
  100. package/out/assets/index.lazy-DjPbRI_L.js +0 -1
  101. package/out/assets/index.lazy-ghLI7p1x.js +0 -1
  102. package/out/assets/play-CnhsLC5C.js +0 -1
  103. package/out/assets/plus-BpjwXzbO.js +0 -1
  104. package/out/assets/search-CsAnnJyH.js +0 -1
  105. package/out/assets/useGameRoom-B8Ds_PKe.js +0 -1
  106. package/out/assets/userProfile-CRGZ8PUF.js +0 -1
@@ -0,0 +1 @@
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]);export{t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]);export{t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
@@ -1 +1 @@
1
- import{C as e,h as t,l as n,p as r}from"./index-Cg4kEvx8.js";var i={CID_EMPTY:`cid_empty`,INVALID_CID_FORMAT:`invalid_cid_format`,CID_V1_REQUIRED:`cid_v1_required`,CID_DIGEST_LENGTH:`cid_digest_length`,LINK_EMPTY:`link_empty`,INVALID_URL:`invalid_url`,INVALID_PROTOCOL:`invalid_protocol`,UNSUPPORTED_PATH:`unsupported_path`,UNSUPPORTED_QUERY_PARAM:`unsupported_query_param`};function a(e){return{valid:!1,errorCode:e}}function o(e,t){return{cid:``,errorCode:e,...t?{details:t}:{}}}function s(t){if(!t||typeof t!=`string`)return a(i.CID_EMPTY);let n;try{n=e.parse(t)}catch{return a(i.INVALID_CID_FORMAT)}return n.version===1?n.multihash.digest.length===32?{valid:!0}:a(i.CID_DIGEST_LENGTH):a(i.CID_V1_REQUIRED)}function c(e){if(!e||typeof e!=`string`)return o(i.LINK_EMPTY);let t;try{t=new URL(e)}catch{return o(i.INVALID_URL)}if(t.protocol!==`most:`)return o(i.INVALID_PROTOCOL);if(t.pathname&&t.pathname!==`/`)return o(i.UNSUPPORTED_PATH);let n=t.hostname,r=t.searchParams.get(`filename`),a=[...t.searchParams.keys()].find(e=>e!==`filename`),c=s(n);return c.valid?a?o(i.UNSUPPORTED_QUERY_PARAM,{param:a}):{cid:n,fileName:r?.trim()||n}:o(c.errorCode)}var l={timeout:`检测等待超时,暂时没有等到在线种子响应。请确认分享者或其他下载者仍在线做种,稍后再检测。`,offline:`无法连接本地节点,请确认 MostBox 后端正在运行后再检测。`,missingApi:`当前后端还没有检测接口,请重启 MostBox 后端后再试。`,validation:`链接格式不正确,请粘贴完整的 most://<cid>?filename=... 分享链接。`,nameConflict:`下载目录已有同名文件,请先重命名或移走后再检测。`,noPeer:`暂时没有发现在线种子。请确认分享者或其他下载者仍在线做种,稍后再检测。`,permission:`下载目录不可写,请检查目录权限后再检测。`,starting:`本地节点还没有启动完成,请稍等几秒后重新检测。`,server:`本地节点检测时出错,请稍后重试或查看节点日志。`,fallback:`检测未通过,请确认链接完整、发布者在线且本机网络正常。`};i.INVALID_URL,i.INVALID_PROTOCOL,i.UNSUPPORTED_PATH,i.CID_EMPTY,i.INVALID_CID_FORMAT,i.CID_V1_REQUIRED,i.CID_DIGEST_LENGTH;function u(e={},t=``){if(t===`TimeoutError`)return l.timeout;if(!e.status)return l.offline;if(e.status===404)return l.missingApi;switch(e.code){case`VALIDATION_ERROR`:return l.validation;case`CONFLICT`:return e.error?`${e.error},请先处理同名文件后再下载。`:l.nameConflict;case`PEER_NOT_FOUND`:return l.noPeer;case`PERMISSION_ERROR`:return e.error?`下载目录不可写:${e.error}`:l.permission;case`ENGINE_NOT_INITIALIZED`:return l.starting;default:break}return e.status===503?l.noPeer:e.status>=500?l.server:e.error?`检测未通过:${e.error}`:l.fallback}async function d(e,t){let r=new FormData;r.append(`file`,e,t||e.name);let i=await n.post(`/api/publish`,{body:r});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Request failed`)}return i.json()}async function f(e){return u(await r(e),e&&typeof e==`object`&&`name`in e?String(e.name):``)}var p={listPublishedFiles:()=>n.get(`/api/files`).json(),listTrashFiles:()=>n.get(`/api/trash`).json(),deletePublishedFile:e=>n.delete(`/api/files/${e}`).json(),restoreTrashFile:e=>n.post(`/api/trash/${e}/restore`).json(),permanentDeleteTrashFile:e=>n.delete(`/api/trash/${e}`).json(),emptyTrash:()=>n.delete(`/api/trash`).json(),toggleStar:e=>n.post(`/api/files/${e}/star`).json(),getConfig:()=>n.get(`/api/config`).json(),getDataPath:()=>n.get(`/api/config/data-path`).json(),getNetworkAddresses:()=>n.get(`/api/network`).json(),saveConfig:e=>n.post(`/api/config`,{json:e}).json(),publishFile:d,checkDownload:(e,t={})=>{let r=typeof t.timeout==`number`?{link:e,timeout:t.timeout}:{link:e};return n.post(`/api/download/check`,{json:r,timeout:t.requestTimeout??15e3}).json()},downloadFile:e=>n.post(`/api/download`,{json:{link:e}}).json(),cacheFile:e=>n.post(`/api/files/${e}/cache`).json(),cancelDownload:e=>n.post(`/api/download/cancel`,{json:{taskId:e}}).json(),getFileDownloadUrl:e=>t(`/api/files/${e}/download`),moveFile:(e,t)=>n.post(`/api/move`,{json:{cid:e,newFileName:t}}).json(),renameFolder:(e,t)=>n.post(`/api/folder/rename`,{json:{oldPath:e,newPath:t}}).json()},m={[i.LINK_EMPTY]:`app.download.validation.empty`,[i.INVALID_URL]:`app.download.validation.invalidUrl`,[i.INVALID_PROTOCOL]:`app.download.validation.protocol`,[i.UNSUPPORTED_PATH]:`app.download.validation.path`,[i.CID_EMPTY]:`app.download.validation.invalidCid`,[i.INVALID_CID_FORMAT]:`app.download.validation.invalidCid`,[i.CID_V1_REQUIRED]:`app.download.validation.cidV1`,[i.CID_DIGEST_LENGTH]:`app.download.validation.cidDigest`};function h(e){if(!e)return{key:`app.download.validation.empty`};let t=c(e);return t.errorCode?t.errorCode===i.UNSUPPORTED_QUERY_PARAM?{key:`app.download.validation.unsupportedParam`,params:{param:t.details?.param||``}}:{key:m[t.errorCode||``]||`app.download.validation.generic`}:null}function g(e,t){let n=h(e);return n?t(n.key,n.params):null}export{c as i,p as n,f as r,g as t};
1
+ import{A as e,h as t,l as n,p as r}from"./index-CiHRnvMj.js";var i={CID_EMPTY:`cid_empty`,INVALID_CID_FORMAT:`invalid_cid_format`,CID_V1_REQUIRED:`cid_v1_required`,CID_DIGEST_LENGTH:`cid_digest_length`,LINK_EMPTY:`link_empty`,INVALID_URL:`invalid_url`,INVALID_PROTOCOL:`invalid_protocol`,UNSUPPORTED_PATH:`unsupported_path`,UNSUPPORTED_QUERY_PARAM:`unsupported_query_param`};function a(e){return{valid:!1,errorCode:e}}function o(e,t){return{cid:``,errorCode:e,...t?{details:t}:{}}}function s(t){if(!t||typeof t!=`string`)return a(i.CID_EMPTY);let n;try{n=e.parse(t)}catch{return a(i.INVALID_CID_FORMAT)}return n.version===1?n.multihash.digest.length===32?{valid:!0}:a(i.CID_DIGEST_LENGTH):a(i.CID_V1_REQUIRED)}function c(e){if(!e||typeof e!=`string`)return o(i.LINK_EMPTY);let t;try{t=new URL(e)}catch{return o(i.INVALID_URL)}if(t.protocol!==`most:`)return o(i.INVALID_PROTOCOL);if(t.pathname&&t.pathname!==`/`)return o(i.UNSUPPORTED_PATH);let n=t.hostname,r=t.searchParams.get(`filename`),a=[...t.searchParams.keys()].find(e=>e!==`filename`),c=s(n);return c.valid?a?o(i.UNSUPPORTED_QUERY_PARAM,{param:a}):{cid:n,fileName:r?.trim()||n}:o(c.errorCode)}var l={timeout:`检测等待超时,暂时没有等到在线种子响应。请确认分享者或其他下载者仍在线做种,稍后再检测。`,offline:`无法连接本地节点,请确认 MostBox 后端正在运行后再检测。`,missingApi:`当前后端还没有检测接口,请重启 MostBox 后端后再试。`,validation:`链接格式不正确,请粘贴完整的 most://<cid>?filename=... 分享链接。`,nameConflict:`下载目录已有同名文件,请先重命名或移走后再检测。`,noPeer:`暂时没有发现在线种子。请确认分享者或其他下载者仍在线做种,稍后再检测。`,permission:`下载目录不可写,请检查目录权限后再检测。`,starting:`本地节点还没有启动完成,请稍等几秒后重新检测。`,server:`本地节点检测时出错,请稍后重试或查看节点日志。`,fallback:`检测未通过,请确认链接完整、发布者在线且本机网络正常。`};i.INVALID_URL,i.INVALID_PROTOCOL,i.UNSUPPORTED_PATH,i.CID_EMPTY,i.INVALID_CID_FORMAT,i.CID_V1_REQUIRED,i.CID_DIGEST_LENGTH;function u(e={},t=``){if(t===`TimeoutError`)return l.timeout;if(!e.status)return l.offline;if(e.status===404)return l.missingApi;switch(e.code){case`VALIDATION_ERROR`:return l.validation;case`CONFLICT`:return e.error?`${e.error},请先处理同名文件后再下载。`:l.nameConflict;case`PEER_NOT_FOUND`:return l.noPeer;case`PERMISSION_ERROR`:return e.error?`下载目录不可写:${e.error}`:l.permission;case`ENGINE_NOT_INITIALIZED`:return l.starting;default:break}return e.status===503?l.noPeer:e.status>=500?l.server:e.error?`检测未通过:${e.error}`:l.fallback}async function d(e,t){let r=new FormData;r.append(`file`,e,t||e.name);let i=await n.post(`/api/publish`,{body:r});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Request failed`)}return i.json()}async function f(e){return u(await r(e),e&&typeof e==`object`&&`name`in e?String(e.name):``)}var p={listPublishedFiles:()=>n.get(`/api/files`).json(),listTrashFiles:()=>n.get(`/api/trash`).json(),deletePublishedFile:e=>n.delete(`/api/files/${e}`).json(),restoreTrashFile:e=>n.post(`/api/trash/${e}/restore`).json(),permanentDeleteTrashFile:e=>n.delete(`/api/trash/${e}`).json(),emptyTrash:()=>n.delete(`/api/trash`).json(),toggleStar:e=>n.post(`/api/files/${e}/star`).json(),getConfig:()=>n.get(`/api/config`).json(),getDataPath:()=>n.get(`/api/config/data-path`).json(),getNetworkAddresses:()=>n.get(`/api/network`).json(),saveConfig:e=>n.post(`/api/config`,{json:e}).json(),publishFile:d,checkDownload:(e,t={})=>{let r=typeof t.timeout==`number`?{link:e,timeout:t.timeout}:{link:e};return n.post(`/api/download/check`,{json:r,timeout:t.requestTimeout??15e3}).json()},downloadFile:e=>n.post(`/api/download`,{json:{link:e}}).json(),cacheFile:e=>n.post(`/api/files/${e}/cache`).json(),cancelDownload:e=>n.post(`/api/download/cancel`,{json:{taskId:e}}).json(),getFileDownloadUrl:e=>t(`/api/files/${e}/download`),moveFile:(e,t)=>n.post(`/api/move`,{json:{cid:e,newFileName:t}}).json(),renameFolder:(e,t)=>n.post(`/api/folder/rename`,{json:{oldPath:e,newPath:t}}).json()},m={[i.LINK_EMPTY]:`app.download.validation.empty`,[i.INVALID_URL]:`app.download.validation.invalidUrl`,[i.INVALID_PROTOCOL]:`app.download.validation.protocol`,[i.UNSUPPORTED_PATH]:`app.download.validation.path`,[i.CID_EMPTY]:`app.download.validation.invalidCid`,[i.INVALID_CID_FORMAT]:`app.download.validation.invalidCid`,[i.CID_V1_REQUIRED]:`app.download.validation.cidV1`,[i.CID_DIGEST_LENGTH]:`app.download.validation.cidDigest`};function h(e){if(!e)return{key:`app.download.validation.empty`};let t=c(e);return t.errorCode?t.errorCode===i.UNSUPPORTED_QUERY_PARAM?{key:`app.download.validation.unsupportedParam`,params:{param:t.details?.param||``}}:{key:m[t.errorCode||``]||`app.download.validation.generic`}:null}function g(e,t){let n=h(e);return n?t(n.key,n.params):null}export{c as i,p as n,f as r,g as t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]);export{t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]);export{t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),n=e(`folder`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]);export{t as n,n as t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),n=e(`folder`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]);export{t as n,n as t};
@@ -1 +1 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]);export{t};
1
+ import{w as e}from"./ui-u9yJHkb-.js";var t=e(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]);export{t};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";var r=t(e(),1),i={"common.brand":`MOST PEOPLE`,"common.product":`MostBox`,"common.web3":`Web3`,"common.cancel":`取消`,"common.confirm":`确认`,"common.processing":`处理中...`,"common.copy":`复制`,"common.download":`下载`,"common.open":`打开`,"common.close":`关闭`,"common.copied":`已复制`,"common.back":`上一页`,"common.backHome":`回首页`,"common.moreActions":`更多操作`,"common.theme.toggle":`切换主题`,"common.locale.choose":`选择语言`,"common.locale.current":`当前语言`,"common.locale.switchToChinese":`切换到中文`,"common.locale.switchToEnglish":`切换到英文`,"common.status.checking":`检测中`,"common.status.connected":`已连接`,"common.status.needsConnection":`需连接`,"common.status.ready":`已就绪`,"nav.downloadClient":`下载客户端`,"nav.openWeb":`打开 Web`,"nav.getStarted":`开始使用`,"nav.profile":`个人资料`,"nav.accountMenu":`账号菜单`,"nav.editDisplayName":`修改名称`,"nav.displayNamePlaceholder":`输入显示名称`,"nav.changeAvatar":`修改头像`,"nav.avatarUrlPlaceholder":`输入头像 URL`,"nav.avatarUrlInvalid":`请输入 http 或 https 头像 URL`,"footer.about":`关于`,"footer.network":`网络`,"errorBoundary.title":`出错了`,"errorBoundary.desc":`发生了意外错误,请尝试重新加载页面`,"errorBoundary.reload":`重新加载`,"notFound.title":`页面未找到`,"notFound.desc":`你访问的页面似乎已经迷失在 P2P 网络中了`,"appGlobals.syncStartFailed":`账号同步启动失败`,"appShell.openMenu":`打开菜单`,"appShell.expandSidebar":`展开侧边栏`,"appShell.collapseSidebar":`收起侧边栏`,"appShell.openSidebar":`打开侧边栏`,"desktopUpdate.checking":`检查更新`,"desktopUpdate.downloading":`正在下载`,"desktopUpdate.downloadingProgress":`正在下载 {progress}%`,"desktopUpdate.downloadingTitle":`正在下载 MostBox 更新`,"desktopUpdate.install":`重启更新`,"desktopUpdate.installing":`正在重启`,"desktopUpdate.readyTitle":`MostBox {version} 已下载,点击重启安装`},a={"common.brand":`MOST PEOPLE`,"common.product":`MostBox`,"common.web3":`Web3`,"common.cancel":`取消`,"common.confirm":`確認`,"common.processing":`處理中...`,"common.copy":`複製`,"common.download":`下載`,"common.open":`開啟`,"common.close":`關閉`,"common.copied":`已複製`,"common.back":`上一頁`,"common.backHome":`回首頁`,"common.moreActions":`更多操作`,"common.theme.toggle":`切換主題`,"common.locale.choose":`選擇語言`,"common.locale.current":`目前語言`,"common.locale.switchToChinese":`切換到中文`,"common.locale.switchToEnglish":`切換到英文`,"common.status.checking":`檢測中`,"common.status.connected":`已連線`,"common.status.needsConnection":`需連線`,"common.status.ready":`已就緒`,"nav.downloadClient":`下載用戶端`,"nav.openWeb":`開啟 Web`,"nav.getStarted":`開始使用`,"nav.profile":`個人資料`,"nav.accountMenu":`帳號選單`,"nav.editDisplayName":`修改名稱`,"nav.displayNamePlaceholder":`輸入顯示名稱`,"nav.changeAvatar":`修改頭像`,"nav.avatarUrlPlaceholder":`輸入頭像 URL`,"nav.avatarUrlInvalid":`請輸入 http 或 https 頭像 URL`,"footer.about":`關於`,"footer.network":`網路`,"errorBoundary.title":`出錯了`,"errorBoundary.desc":`發生了意外錯誤,請嘗試重新載入頁面`,"errorBoundary.reload":`重新載入`,"notFound.title":`頁面未找到`,"notFound.desc":`你訪問的頁面似乎已經迷失在 P2P 網路中了`,"appGlobals.syncStartFailed":`帳號同步啟動失敗`,"appShell.openMenu":`開啟選單`,"appShell.expandSidebar":`展開側邊欄`,"appShell.collapseSidebar":`收起側邊欄`,"appShell.openSidebar":`開啟側邊欄`,"desktopUpdate.checking":`檢查更新`,"desktopUpdate.downloading":`正在下載`,"desktopUpdate.downloadingProgress":`正在下載 {progress}%`,"desktopUpdate.downloadingTitle":`正在下載 MostBox 更新`,"desktopUpdate.install":`重啟更新`,"desktopUpdate.installing":`正在重啟`,"desktopUpdate.readyTitle":`MostBox {version} 已下載,點擊重啟安裝`},o={"common.brand":`MOST PEOPLE`,"common.product":`MostBox`,"common.web3":`Web3`,"common.cancel":`Cancel`,"common.confirm":`Confirm`,"common.processing":`Processing...`,"common.copy":`Copy`,"common.download":`Download`,"common.open":`Open`,"common.close":`Close`,"common.copied":`Copied`,"common.back":`Back`,"common.backHome":`Back home`,"common.moreActions":`More actions`,"common.theme.toggle":`Toggle theme`,"common.locale.choose":`Choose language`,"common.locale.current":`Current language`,"common.locale.switchToChinese":`Switch to Chinese`,"common.locale.switchToEnglish":`Switch to English`,"common.status.checking":`Checking`,"common.status.connected":`Connected`,"common.status.needsConnection":`Needs connection`,"common.status.ready":`Ready`,"nav.downloadClient":`Download client`,"nav.openWeb":`Open Web`,"nav.getStarted":`Get Started`,"nav.profile":`Profile`,"nav.accountMenu":`Account menu`,"nav.editDisplayName":`Edit display name`,"nav.displayNamePlaceholder":`Enter a display name`,"nav.changeAvatar":`Change avatar`,"nav.avatarUrlPlaceholder":`Enter an avatar URL`,"nav.avatarUrlInvalid":`Enter an http or https avatar URL`,"footer.about":`About`,"footer.network":`Network`,"errorBoundary.title":`Something went wrong`,"errorBoundary.desc":`An unexpected error occurred. Try reloading the page.`,"errorBoundary.reload":`Reload`,"notFound.title":`Page not found`,"notFound.desc":`The page you opened seems to be lost in the P2P network.`,"appGlobals.syncStartFailed":`Failed to start account sync`,"appShell.openMenu":`Open menu`,"appShell.expandSidebar":`Expand sidebar`,"appShell.collapseSidebar":`Collapse sidebar`,"appShell.openSidebar":`Open sidebar`,"desktopUpdate.checking":`Checking updates`,"desktopUpdate.downloading":`Downloading`,"desktopUpdate.downloadingProgress":`Downloading {progress}%`,"desktopUpdate.downloadingTitle":`MostBox update is downloading.`,"desktopUpdate.install":`Restart to update`,"desktopUpdate.installing":`Restarting`,"desktopUpdate.readyTitle":`MostBox {version} has downloaded. Restart to install.`},s={"download.meta.title":`下载 MostBox 桌面客户端`,"download.meta.desc":`下载 MostBox 桌面客户端,获得完整的 P2P 文件分享、下载校验和持续做种能力`,"download.hero.title":`下载客户端`,"download.hero.desc":`桌面客户端是当前 MVP 的首选入口,内置本地 P2P 节点,提供发布、下载校验和持续做种的完整能力。Web 端只连接已有 MostBox 节点。`,"download.platforms.title":`选择你的平台`,"download.comparison.title":`Web 端 vs 桌面端`,"download.comparison.feature":`功能`,"download.comparison.web":`Web 端`,"download.comparison.desktop":`桌面端`,"download.comparison.node":`节点能力`,"download.comparison.fileSharing":`P2P 文件分享`,"download.comparison.verification":`下载校验`,"download.comparison.seeding":`持续做种`,"download.comparison.largeFiles":`大文件传输`,"download.comparison.webConnectsNode":`连接已有节点`,"download.comparison.webDependsNode":`依赖所连节点`,"download.comparison.desktopBuiltinNode":`内置本地节点`,"download.comparison.desktopFull":`完整支持`,"download.comparison.desktopDefaultOn":`默认开启`,"download.comparison.desktop10gb":`10GB 上限内`,"download.npmNote":`使用 npm 入口请先安装 Node.js >= 22.12,然后运行 npx most-box@latest 启动本机完整节点。`,"download.source.label":`下载来源`,"download.source.r2Mirror":`Cloudflare R2 高速镜像`,"download.source.loading":`正在获取 Cloudflare R2 高速镜像。`,"download.source.ready":`当前版本 {version},可切换 Cloudflare R2 或 GitHub Releases 下载。`,"download.source.fallback":`无法获取高速镜像信息,已切换到 GitHub Releases 备用下载。`,"download.platform.windows.desc":`Windows 10 或更高版本`,"download.platform.macos.desc":`macOS 12 Monterey 或更高版本`,"download.platform.linux.desc":`Ubuntu 20.04+ / Debian 11+ / 其他主流发行版`,"download.platform.source":`来源`,"download.platform.size":`大小`,"download.platform.action":`下载 {ext}`,"download.platform.current":`当前`,"download.platform.currentSystem":`当前系统`,"download.platform.recommended":`推荐下载`,"download.platform.matchedSystem":`已匹配你的设备`,"download.platform.otherPlatforms":`桌面端`,"download.platform.mobilePlatforms":`移动端`,"download.platform.comingSoon":`敬请期待`,"download.platform.ios.name":`iOS`,"download.platform.ios.desc":`iPhone / iPad 客户端规划中`,"download.platform.android.name":`安卓`,"download.platform.android.desc":`Android 手机和平板客户端规划中`},c={"download.meta.title":`下載 MostBox 桌面用戶端`,"download.meta.desc":`下載 MostBox 桌面用戶端,獲得完整的 P2P 檔案分享、下載校驗和持續做種能力`,"download.hero.title":`下載用戶端`,"download.hero.desc":`桌面用戶端是當前 MVP 的首選入口,內建本機 P2P 節點,提供發布、下載校驗和持續做種的完整能力。Web 端只連線已有 MostBox 節點。`,"download.platforms.title":`選擇你的平臺`,"download.comparison.title":`Web 端 vs 桌面端`,"download.comparison.feature":`功能`,"download.comparison.web":`Web 端`,"download.comparison.desktop":`桌面端`,"download.comparison.node":`節點能力`,"download.comparison.fileSharing":`P2P 檔案分享`,"download.comparison.verification":`下載校驗`,"download.comparison.seeding":`持續做種`,"download.comparison.largeFiles":`大檔案傳輸`,"download.comparison.webConnectsNode":`連線已有節點`,"download.comparison.webDependsNode":`依賴所連節點`,"download.comparison.desktopBuiltinNode":`內建本機節點`,"download.comparison.desktopFull":`完整支援`,"download.comparison.desktopDefaultOn":`預設開啟`,"download.comparison.desktop10gb":`10GB 上限內`,"download.npmNote":`使用 npm 入口請先安裝 Node.js >= 22.12,然後執行 npx most-box@latest 啟動本機完整節點。`,"download.source.label":`下載來源`,"download.source.r2Mirror":`Cloudflare R2 高速映象`,"download.source.loading":`正在取得 Cloudflare R2 高速映象。`,"download.source.ready":`當前版本 {version},可切換 Cloudflare R2 或 GitHub Releases 下載。`,"download.source.fallback":`無法取得高速映象資訊,已切換到 GitHub Releases 備用下載。`,"download.platform.windows.desc":`Windows 10 或更高版本`,"download.platform.macos.desc":`macOS 12 Monterey 或更高版本`,"download.platform.linux.desc":`Ubuntu 20.04+ / Debian 11+ / 其他主流發行版`,"download.platform.source":`來源`,"download.platform.size":`大小`,"download.platform.action":`下載 {ext}`,"download.platform.current":`當前`,"download.platform.currentSystem":`當前系統`,"download.platform.recommended":`推薦下載`,"download.platform.matchedSystem":`已匹配你的裝置`,"download.platform.otherPlatforms":`桌面端`,"download.platform.mobilePlatforms":`行動端`,"download.platform.comingSoon":`敬請期待`,"download.platform.ios.name":`iOS`,"download.platform.ios.desc":`iPhone / iPad 用戶端規劃中`,"download.platform.android.name":`Android`,"download.platform.android.desc":`Android 手機和平板用戶端規劃中`},l={"download.meta.title":`Download the MostBox desktop client`,"download.meta.desc":`Download the MostBox desktop client for full P2P sharing, verification, and continuous seeding.`,"download.hero.title":`Download client`,"download.hero.desc":`The desktop client is the preferred MVP entry point. It includes a local P2P node and full publish, download verification, and continuous seeding support. The Web entry only connects to existing MostBox nodes.`,"download.platforms.title":`Choose your platform`,"download.comparison.title":`Web vs desktop`,"download.comparison.feature":`Feature`,"download.comparison.web":`Web`,"download.comparison.desktop":`Desktop`,"download.comparison.node":`Node capability`,"download.comparison.fileSharing":`P2P file sharing`,"download.comparison.verification":`Download verification`,"download.comparison.seeding":`Continuous seeding`,"download.comparison.largeFiles":`Large file transfer`,"download.comparison.webConnectsNode":`Connects to existing nodes`,"download.comparison.webDependsNode":`Depends on the connected node`,"download.comparison.desktopBuiltinNode":`Built-in local node`,"download.comparison.desktopFull":`Fully supported`,"download.comparison.desktopDefaultOn":`On by default`,"download.comparison.desktop10gb":`Within the 10GB limit`,"download.npmNote":`For the npm entry, install Node.js >= 22.12 first, then run npx most-box@latest to start a full local node.`,"download.source.label":`Download source`,"download.source.r2Mirror":`Cloudflare R2 mirror`,"download.source.loading":`Fetching the Cloudflare R2 mirror.`,"download.source.ready":`Current version {version}. You can switch between Cloudflare R2 and GitHub Releases.`,"download.source.fallback":`Mirror information is unavailable, so GitHub Releases is selected as fallback.`,"download.platform.windows.desc":`Windows 10 or later`,"download.platform.macos.desc":`macOS 12 Monterey or later`,"download.platform.linux.desc":`Ubuntu 20.04+ / Debian 11+ / other mainstream distributions`,"download.platform.source":`Source`,"download.platform.size":`Size`,"download.platform.action":`Download {ext}`,"download.platform.current":`Current`,"download.platform.currentSystem":`Current system`,"download.platform.recommended":`Recommended download`,"download.platform.matchedSystem":`Matched to your device`,"download.platform.otherPlatforms":`Desktop`,"download.platform.mobilePlatforms":`Mobile`,"download.platform.comingSoon":`Coming soon`,"download.platform.ios.name":`iOS`,"download.platform.ios.desc":`iPhone and iPad client is planned.`,"download.platform.android.name":`Android`,"download.platform.android.desc":`Android phone and tablet client is planned.`},u={"cid.meta.title":`CID 下载检查 - MostBox`,"cid.meta.desc":`检查 MostBox CID 是否有在线种子,并在确认后开始下载。`,"cid.kicker":`MOSTBOX CID`,"cid.title":`检查分享文件`,"cid.subtitle":`MostBox 会先检查这个 CID 是否能从在线种子下载。确认可用后,你可以手动开始下载。`,"cid.handoff.title":`用 MostBox 客户端打开`,"cid.handoff.desc":`已安装客户端时,浏览器会交给系统打开这个 most:// 分享,并让 MostBox 接管检测和下载。`,"cid.handoff.action":`用 MostBox 打开`,"cid.handoff.fallback":`如果浏览器没有弹出确认,或 MostBox 没有打开,可能还没安装客户端或系统协议未注册。你仍可在本页连接本地节点检测下载。`,"cid.handoff.downloadAction":`下载客户端`,"cid.fileNameLabel":`文件名`,"cid.cidLabel":`CID`,"cid.sizeLabel":`大小`,"cid.saveToLabel":`保存到`,"cid.saveToFallback":`MostBox 数据目录/downloads`,"cid.unknownSize":`检测到后显示`,"cid.label.idle":`准备检测`,"cid.label.checking":`正在检测`,"cid.label.available":`可以下载`,"cid.label.alreadyLocal":`本机已有`,"cid.label.loginRequired":`需要登录`,"cid.label.backendMissing":`节点未连接`,"cid.label.waitingBackend":`等待节点`,"cid.label.error":`检测未通过`,"cid.status.waitingBackend":`正在等待本地节点状态。`,"cid.status.backendMissing":`没有连接到 MostBox 本地节点。`,"cid.status.loginRequired":`请先登录本地身份,然后再检查这个 CID。`,"cid.status.checking":`正在查找在线种子并确认下载目录可写。`,"cid.status.available":`{fileName} 当前可以下载。`,"cid.status.alreadyLocal":`{fileName} 已在本机,可继续做种。`,"cid.status.startingDownload":`正在创建下载任务。`,"cid.status.downloading":`正在下载并校验文件。`,"cid.status.downloadingFile":`正在下载 {fileName}。`,"cid.status.downloadComplete":`{fileName} 下载完成,已默认继续做种。`,"cid.status.downloadFailed":`下载失败:{error}`,"cid.status.cancelled":`下载已取消。`,"cid.errorFallback":`未知错误`,"cid.loginAction":`登录`,"cid.connectAction":`连接节点`,"cid.startAction":`开始下载`,"cid.downloadingAction":`下载中`,"cid.cancelAction":`取消下载`,"cid.retryAction":`重新检测`,"cid.openAppAction":`打开文件列表`,"cid.toast.downloadStarted":`下载已开始`,"cid.toast.downloadComplete":`下载完成`,"cid.toast.downloadFailed":`下载失败:{error}`,"cid.toast.cancelled":`下载已取消`,"cid.toast.alreadyLocal":`本机已有该文件`},d={"cid.meta.title":`CID 下載檢查 - MostBox`,"cid.meta.desc":`檢查 MostBox CID 是否有線上種子,並在確認後開始下載。`,"cid.kicker":`MOSTBOX CID`,"cid.title":`檢查分享檔案`,"cid.subtitle":`MostBox 會先檢查這個 CID 是否能從線上種子下載。確認可用後,你可以手動開始下載。`,"cid.handoff.title":`用 MostBox 用戶端開啟`,"cid.handoff.desc":`已安裝用戶端時,瀏覽器會交給系統開啟這個 most:// 分享,並讓 MostBox 接管檢測和下載。`,"cid.handoff.action":`用 MostBox 開啟`,"cid.handoff.fallback":`如果瀏覽器沒有跳出確認,或 MostBox 沒有開啟,可能尚未安裝用戶端或系統協議未註冊。你仍可在本頁連線本機節點檢測下載。`,"cid.handoff.downloadAction":`下載用戶端`,"cid.fileNameLabel":`檔案名稱`,"cid.cidLabel":`CID`,"cid.sizeLabel":`大小`,"cid.saveToLabel":`儲存到`,"cid.saveToFallback":`MostBox 資料目錄/downloads`,"cid.unknownSize":`檢測到後顯示`,"cid.label.idle":`準備檢測`,"cid.label.checking":`正在檢測`,"cid.label.available":`可以下載`,"cid.label.alreadyLocal":`本機已有`,"cid.label.loginRequired":`需要登入`,"cid.label.backendMissing":`節點未連線`,"cid.label.waitingBackend":`等待節點`,"cid.label.error":`檢測未通過`,"cid.status.waitingBackend":`正在等待本機節點狀態。`,"cid.status.backendMissing":`沒有連線到 MostBox 本機節點。`,"cid.status.loginRequired":`請先登入本機身份,然後再檢查這個 CID。`,"cid.status.checking":`正在尋找線上種子並確認下載目錄可寫。`,"cid.status.available":`{fileName} 目前可以下載。`,"cid.status.alreadyLocal":`{fileName} 已在本機,可繼續做種。`,"cid.status.startingDownload":`正在建立下載任務。`,"cid.status.downloading":`正在下載並校驗檔案。`,"cid.status.downloadingFile":`正在下載 {fileName}。`,"cid.status.downloadComplete":`{fileName} 下載完成,已預設繼續做種。`,"cid.status.downloadFailed":`下載失敗:{error}`,"cid.status.cancelled":`下載已取消。`,"cid.errorFallback":`未知錯誤`,"cid.loginAction":`登入`,"cid.connectAction":`連線節點`,"cid.startAction":`開始下載`,"cid.downloadingAction":`下載中`,"cid.cancelAction":`取消下載`,"cid.retryAction":`重新檢測`,"cid.openAppAction":`開啟檔案列表`,"cid.toast.downloadStarted":`下載已開始`,"cid.toast.downloadComplete":`下載完成`,"cid.toast.downloadFailed":`下載失敗:{error}`,"cid.toast.cancelled":`下載已取消`,"cid.toast.alreadyLocal":`本機已有該檔案`},ee={"cid.meta.title":`CID download check - MostBox`,"cid.meta.desc":`Check whether a MostBox CID has online seeders, then start the download after confirming it.`,"cid.kicker":`MOSTBOX CID`,"cid.title":`Check shared file`,"cid.subtitle":`MostBox checks whether this CID can be downloaded from online seeders first. Once it is available, you can start the download manually.`,"cid.handoff.title":`Open with the MostBox client`,"cid.handoff.desc":`If the client is installed, your browser will hand this most:// share to the system so MostBox can take over checking and downloading.`,"cid.handoff.action":`Open in MostBox`,"cid.handoff.fallback":`If the browser did not ask for confirmation or MostBox did not open, the client may not be installed or the system protocol may not be registered. You can still connect a local node on this page to check and download.`,"cid.handoff.downloadAction":`Download client`,"cid.fileNameLabel":`File name`,"cid.cidLabel":`CID`,"cid.sizeLabel":`Size`,"cid.saveToLabel":`Save to`,"cid.saveToFallback":`MostBox data directory/downloads`,"cid.unknownSize":`Shown after checking`,"cid.label.idle":`Ready to check`,"cid.label.checking":`Checking`,"cid.label.available":`Ready to download`,"cid.label.alreadyLocal":`Already local`,"cid.label.loginRequired":`Login required`,"cid.label.backendMissing":`Node disconnected`,"cid.label.waitingBackend":`Waiting for node`,"cid.label.error":`Check failed`,"cid.status.waitingBackend":`Waiting for the local node status.`,"cid.status.backendMissing":`No MostBox local node is connected.`,"cid.status.loginRequired":`Sign in with a local identity before checking this CID.`,"cid.status.checking":`Looking for online seeders and checking that the download directory is writable.`,"cid.status.available":`{fileName} is available to download.`,"cid.status.alreadyLocal":`{fileName} is already on this device and can keep seeding.`,"cid.status.startingDownload":`Creating the download task.`,"cid.status.downloading":`Downloading and verifying the file.`,"cid.status.downloadingFile":`Downloading {fileName}.`,"cid.status.downloadComplete":`{fileName} downloaded and is seeding by default.`,"cid.status.downloadFailed":`Download failed: {error}`,"cid.status.cancelled":`Download cancelled.`,"cid.errorFallback":`Unknown error`,"cid.loginAction":`Sign in`,"cid.connectAction":`Connect node`,"cid.startAction":`Start download`,"cid.downloadingAction":`Downloading`,"cid.cancelAction":`Cancel download`,"cid.retryAction":`Check again`,"cid.openAppAction":`Open file list`,"cid.toast.downloadStarted":`Download started`,"cid.toast.downloadComplete":`Download complete`,"cid.toast.downloadFailed":`Download failed: {error}`,"cid.toast.cancelled":`Download cancelled`,"cid.toast.alreadyLocal":`This file is already local`},te={"ping.meta.title":`MostBox - 网络连通性`,"ping.meta.desc":`测试到全球主流网站的网络连通性和延迟`,"ping.title":`网络连通性`,"ping.subtitle":`通过向对应网站发送请求进行测试,延迟值仅供参考。`,"ping.retryAll":`重新测试全部`,"ping.retryOne":`重新测试 {name}`,"ping.retry":`重新测试`,"ping.available":`可用`,"ping.unavailable":`不可用`,"ping.timeout":`超时`},ne={"ping.meta.title":`MostBox - 網路連通性`,"ping.meta.desc":`測試到全球主流網站的網路連通性和延遲`,"ping.title":`網路連通性`,"ping.subtitle":`通過向對應網站傳送請求進行測試,延遲值僅供參考。`,"ping.retryAll":`重新測試全部`,"ping.retryOne":`重新測試 {name}`,"ping.retry":`重新測試`,"ping.available":`可用`,"ping.unavailable":`不可用`,"ping.timeout":`超時`},re={"ping.meta.title":`MostBox - Network connectivity`,"ping.meta.desc":`Test connectivity and latency to major global websites`,"ping.title":`Network connectivity`,"ping.subtitle":`Tests send requests to the corresponding websites. Latency is for reference only.`,"ping.retryAll":`Retest all`,"ping.retryOne":`Retest {name}`,"ping.retry":`Retest`,"ping.available":`Available`,"ping.unavailable":`Unavailable`,"ping.timeout":`Timeout`},ie={"portal.hero.subtitle":`去中心化 P2P 工具箱`,"portal.nodeEntry":`节点入口`,"portal.webConnectNode":`Web 连接节点`,"portal.nodeAdmin":`节点管理`,"portal.enterFeature":`进入 {title}`,"portal.openFeature":`打开{title}`,"portal.feature.app.title":`MostBox`,"portal.feature.app.subtitle":`P2P 文件分享`,"portal.feature.app.hero":`P2P 文件分享,无需注册`,"portal.feature.app.desc":`基于 Hyperswarm 的去中心化文件传输,让文件分享回归点对点。MostBox 不是云盘;链接来自 CID,可用性来自当前在线种子。当前 MVP 优先使用桌面客户端。`,"portal.feature.app.bullet.localIdentity":`无需云端账号,使用本地身份隔离数据`,"portal.feature.app.bullet.hyperswarm":`Hyperswarm P2P 直连传输`,"portal.feature.app.bullet.largeFiles":`GB 级大文件流式处理`,"portal.feature.app.bullet.cid":`相同文件 = 相同 CID,链接可反复校验`,"portal.feature.app.bullet.seedAfterDownload":`下载完成后默认继续做种`,"portal.feature.app.bullet.noCloud":`相比微信、QQ 或网盘,不依赖中心化账号和云端托管`,"portal.feature.app.bullet.desktop":`Web 端只连接已有节点,桌面端提供完整 P2P 能力`,"portal.feature.app.bullet.openSource":`MIT 开源,自托管,数据完全自主掌控`,"portal.feature.app.step.download.title":`下载客户端`,"portal.feature.app.step.download.desc":`支持 Windows、macOS 和 Linux,桌面端提供完整的 P2P 能力。`,"portal.feature.app.step.download.link":`前往下载页`,"portal.feature.app.step.install.title":`安装并运行`,"portal.feature.app.step.install.desc":`安装后打开应用,无需单独安装 Node.js。`,"portal.feature.app.step.share.title":`开始分享`,"portal.feature.app.step.share.desc":`发布文件生成 most:// 链接,朋友下载校验通过后也会成为新的种子。`,"portal.feature.chat.title":`P2P 聊天`,"portal.feature.chat.subtitle":`频道加密通讯`,"portal.feature.chat.hero":`去中心化频道聊天`,"portal.feature.chat.desc":`基于 Hypercore 的 P2P 加密即时通讯。创建频道,邀请朋友,端到端加密,无需服务器中转。`,"portal.feature.chat.bullet.encrypted":`P2P 加密频道消息`,"portal.feature.chat.bullet.identity":`本地登录身份保护消息署名`,"portal.feature.chat.bullet.sync":`消息通过 Hyperswarm 网络同步`,"portal.feature.chat.bullet.offline":`离线消息自动同步`,"portal.feature.chat.bullet.noAccount":`无需中心化账号注册`,"portal.feature.chat.step.download.title":`下载客户端`,"portal.feature.chat.step.download.desc":`支持 Windows、macOS 和 Linux。`,"portal.feature.chat.step.download.link":`前往下载页`,"portal.feature.chat.step.create.title":`创建频道`,"portal.feature.chat.step.create.desc":`输入任意频道名即可加入或创建。`,"portal.feature.chat.step.send.title":`开始聊天`,"portal.feature.chat.step.send.desc":`发送消息,P2P 网络自动同步给所有在线节点。`,"portal.feature.note.title":`笔记`,"portal.feature.note.subtitle":`加密云备份`,"portal.feature.note.hero":`Web3 加密笔记`,"portal.feature.note.desc":`使用本地 Web3 密钥加密 Markdown 笔记,可在浏览器本地保存并按需同步到云端备份。`,"portal.feature.note.bullet.markdown":`Markdown 块编辑器`,"portal.feature.note.bullet.privacy":`公开 / 私密笔记切换`,"portal.feature.note.bullet.folders":`文件夹、搜索和移动`,"portal.feature.note.bullet.web3":`Web3 登录态加密`,"portal.feature.note.bullet.backup":`云端备份与恢复`,"portal.feature.note.bullet.independent":`独立于 P2P 文件分享`,"portal.feature.note.step.account.title":`生成 Web3 账号`,"portal.feature.note.step.account.desc":`用用户名和密码派生本地密钥。`,"portal.feature.note.step.create.title":`创建笔记`,"portal.feature.note.step.create.desc":`写 Markdown,按需切换为私密内容。`,"portal.feature.note.step.backup.title":`备份恢复`,"portal.feature.note.step.backup.desc":`登录后可把加密笔记同步到云端。`,"portal.feature.game.title":`游戏`,"portal.feature.game.subtitle":`P2P 牌桌`,"portal.feature.game.hero":`常驻节点里的在线牌桌`,"portal.feature.game.desc":`把干瞪眼作为 MostBox 的独立页面接入,复用现有频道消息、Web3 登录身份和桌面端常驻入口。`,"portal.feature.game.bullet.account":`使用 MostBox 本地账号进入房间`,"portal.feature.game.bullet.channel":`复用 /chat/ 的频道后端,不新增游戏后端接口`,"portal.feature.game.bullet.link":`房间链接可直接分享到群组`,"portal.feature.game.bullet.rules":`支持 1-2 副牌、2-6 人和人机陪测`,"portal.feature.game.bullet.maintain":`游戏规则、频道事件和页面样式拆分维护`,"portal.feature.game.step.login.title":`登录账号`,"portal.feature.game.step.login.desc":`使用现有 MostBox Web3 本地账号作为牌桌身份。`,"portal.feature.game.step.create.title":`创建房间`,"portal.feature.game.step.create.desc":`创建房间后复制链接,发给朋友加入。`,"portal.feature.game.step.test.title":`开始调试`,"portal.feature.game.step.test.desc":`可先用人机补位测试出牌、计分和房间同步。`,"portal.feature.web3.title":`Web3`,"portal.feature.web3.subtitle":`账户工具箱`,"portal.feature.web3.hero":`确定性密钥派生工具箱`,"portal.feature.web3.desc":`纯前端运行的 Web3 账户工具。输入用户名和密码,即可生成 Ed25519 / x25519 密钥对、助记词、以太坊地址,支持 PEM 导出和地址派生。`,"portal.feature.web3.bullet.frontend":`纯前端运行,无需后端`,"portal.feature.web3.bullet.keys":`Ed25519 / x25519 密钥对生成`,"portal.feature.web3.bullet.mnemonic":`BIP-39 助记词派生`,"portal.feature.web3.bullet.eth":`以太坊地址与私钥导出`,"portal.feature.web3.bullet.pem":`PEM 格式密钥导出`,"portal.feature.web3.bullet.qr":`二维码展示地址与助记词`,"portal.feature.web3.step.username.title":`输入用户名`,"portal.feature.web3.step.username.desc":`用户名 + 密码(可选)作为种子。`,"portal.feature.web3.step.keys.title":`查看密钥`,"portal.feature.web3.step.keys.desc":`即时生成 Ed25519、x25519 公钥与 IPNS ID。`,"portal.feature.web3.step.export.title":`导出使用`,"portal.feature.web3.step.export.desc":`复制地址、导出 PEM、派生子地址。`},ae={"portal.hero.subtitle":`去中心化 P2P 工具箱`,"portal.nodeEntry":`節點入口`,"portal.webConnectNode":`Web 連線節點`,"portal.nodeAdmin":`節點管理`,"portal.enterFeature":`進入 {title}`,"portal.openFeature":`開啟{title}`,"portal.feature.app.title":`MostBox`,"portal.feature.app.subtitle":`P2P 檔案分享`,"portal.feature.app.hero":`P2P 檔案分享,無需註冊`,"portal.feature.app.desc":`基於 Hyperswarm 的去中心化檔案傳輸,讓檔案分享迴歸點對點。MostBox 不是雲盤;連結來自 CID,可用性來自當前線上種子。當前 MVP 優先使用桌面用戶端。`,"portal.feature.app.bullet.localIdentity":`無需雲端帳號,使用本機身份隔離資料`,"portal.feature.app.bullet.hyperswarm":`Hyperswarm P2P 直連傳輸`,"portal.feature.app.bullet.largeFiles":`GB 級大檔案流式處理`,"portal.feature.app.bullet.cid":`相同檔案 = 相同 CID,連結可反覆校驗`,"portal.feature.app.bullet.seedAfterDownload":`下載完成後預設繼續做種`,"portal.feature.app.bullet.noCloud":`相比微信、QQ 或網盤,不依賴中心化帳號和雲端託管`,"portal.feature.app.bullet.desktop":`Web 端只連線已有節點,桌面端提供完整 P2P 能力`,"portal.feature.app.bullet.openSource":`MIT 開源,自託管,資料完全自主掌控`,"portal.feature.app.step.download.title":`下載用戶端`,"portal.feature.app.step.download.desc":`支援 Windows、macOS 和 Linux,桌面端提供完整的 P2P 能力。`,"portal.feature.app.step.download.link":`前往下載頁`,"portal.feature.app.step.install.title":`安裝並執行`,"portal.feature.app.step.install.desc":`安裝後開啟應用,無需單獨安裝 Node.js。`,"portal.feature.app.step.share.title":`開始分享`,"portal.feature.app.step.share.desc":`發布檔案生成 most:// 連結,朋友下載校驗通過後也會成為新的種子。`,"portal.feature.chat.title":`P2P 聊天`,"portal.feature.chat.subtitle":`頻道加密通訊`,"portal.feature.chat.hero":`去中心化頻道聊天`,"portal.feature.chat.desc":`基於 Hypercore 的 P2P 加密即時通訊。建立頻道,邀請朋友,端到端加密,無需伺服器中轉。`,"portal.feature.chat.bullet.encrypted":`P2P 加密頻道訊息`,"portal.feature.chat.bullet.identity":`本機登入身份保護訊息署名`,"portal.feature.chat.bullet.sync":`訊息通過 Hyperswarm 網路同步`,"portal.feature.chat.bullet.offline":`離線訊息自動同步`,"portal.feature.chat.bullet.noAccount":`無需中心化帳號註冊`,"portal.feature.chat.step.download.title":`下載用戶端`,"portal.feature.chat.step.download.desc":`支援 Windows、macOS 和 Linux。`,"portal.feature.chat.step.download.link":`前往下載頁`,"portal.feature.chat.step.create.title":`建立頻道`,"portal.feature.chat.step.create.desc":`輸入任意頻道名即可加入或建立。`,"portal.feature.chat.step.send.title":`開始聊天`,"portal.feature.chat.step.send.desc":`傳送訊息,P2P 網路自動同步給所有線上節點。`,"portal.feature.note.title":`筆記`,"portal.feature.note.subtitle":`加密雲備份`,"portal.feature.note.hero":`Web3 加密筆記`,"portal.feature.note.desc":`使用本機 Web3 金鑰加密 Markdown 筆記,可在瀏覽器本機儲存並按需同步到雲端備份。`,"portal.feature.note.bullet.markdown":`Markdown 塊編輯器`,"portal.feature.note.bullet.privacy":`公開 / 私密筆記切換`,"portal.feature.note.bullet.folders":`資料夾、搜尋和移動`,"portal.feature.note.bullet.web3":`Web3 登入態加密`,"portal.feature.note.bullet.backup":`雲端備份與恢復`,"portal.feature.note.bullet.independent":`獨立於 P2P 檔案分享`,"portal.feature.note.step.account.title":`生成 Web3 帳號`,"portal.feature.note.step.account.desc":`用使用者名稱和密碼派生本機金鑰。`,"portal.feature.note.step.create.title":`建立筆記`,"portal.feature.note.step.create.desc":`寫 Markdown,按需切換為私密內容。`,"portal.feature.note.step.backup.title":`備份恢復`,"portal.feature.note.step.backup.desc":`登入後可把加密筆記同步到雲端。`,"portal.feature.game.title":`遊戲`,"portal.feature.game.subtitle":`P2P 牌桌`,"portal.feature.game.hero":`常駐節點裡的線上牌桌`,"portal.feature.game.desc":`把乾瞪眼作為 MostBox 的獨立頁面接入,複用現有頻道訊息、Web3 登入身份和桌面端常駐入口。`,"portal.feature.game.bullet.account":`使用 MostBox 本機帳號進入房間`,"portal.feature.game.bullet.channel":`複用 /chat/ 的頻道後端,不新增遊戲後端介面`,"portal.feature.game.bullet.link":`房間連結可直接分享到群組`,"portal.feature.game.bullet.rules":`支援 1-2 副牌、2-6 人和人機陪測`,"portal.feature.game.bullet.maintain":`遊戲規則、頻道事件和頁面樣式拆分維護`,"portal.feature.game.step.login.title":`登入帳號`,"portal.feature.game.step.login.desc":`使用現有 MostBox Web3 本機帳號作為牌桌身份。`,"portal.feature.game.step.create.title":`建立房間`,"portal.feature.game.step.create.desc":`建立房間後複製連結,發給朋友加入。`,"portal.feature.game.step.test.title":`開始除錯`,"portal.feature.game.step.test.desc":`可先用人機補位測試出牌、計分和房間同步。`,"portal.feature.web3.title":`Web3`,"portal.feature.web3.subtitle":`帳戶工具箱`,"portal.feature.web3.hero":`確定性金鑰派生工具箱`,"portal.feature.web3.desc":`純前端執行的 Web3 帳戶工具。輸入使用者名稱和密碼,即可生成 Ed25519 / x25519 金鑰對、助記詞、以太坊地址,支援 PEM 匯出和地址派生。`,"portal.feature.web3.bullet.frontend":`純前端執行,無需後端`,"portal.feature.web3.bullet.keys":`Ed25519 / x25519 金鑰對生成`,"portal.feature.web3.bullet.mnemonic":`BIP-39 助記詞派生`,"portal.feature.web3.bullet.eth":`以太坊地址與私鑰匯出`,"portal.feature.web3.bullet.pem":`PEM 格式金鑰匯出`,"portal.feature.web3.bullet.qr":`二維碼展示地址與助記詞`,"portal.feature.web3.step.username.title":`輸入使用者名稱`,"portal.feature.web3.step.username.desc":`使用者名稱 + 密碼(可選)作為種子。`,"portal.feature.web3.step.keys.title":`檢視金鑰`,"portal.feature.web3.step.keys.desc":`即時生成 Ed25519、x25519 公鑰與 IPNS ID。`,"portal.feature.web3.step.export.title":`匯出使用`,"portal.feature.web3.step.export.desc":`複製地址、匯出 PEM、派生子地址。`},oe={"portal.hero.subtitle":`Decentralized P2P toolbox`,"portal.nodeEntry":`Node entry`,"portal.webConnectNode":`Connect Web node`,"portal.nodeAdmin":`Node admin`,"portal.enterFeature":`Open {title}`,"portal.openFeature":`Open {title}`,"portal.feature.app.title":`MostBox`,"portal.feature.app.subtitle":`P2P file sharing`,"portal.feature.app.hero":`P2P file sharing, no signup required`,"portal.feature.app.desc":`Decentralized file transfer powered by Hyperswarm. MostBox is not cloud storage; links come from CIDs and availability comes from online seeders. The current MVP is best experienced in the desktop client.`,"portal.feature.app.bullet.localIdentity":`No cloud account required; local identity keeps data separated`,"portal.feature.app.bullet.hyperswarm":`Direct Hyperswarm P2P transfer`,"portal.feature.app.bullet.largeFiles":`Streaming support for GB-scale files`,"portal.feature.app.bullet.cid":`Same file means same CID, and links can be verified repeatedly`,"portal.feature.app.bullet.seedAfterDownload":`Downloads keep seeding by default after completion`,"portal.feature.app.bullet.noCloud":`Unlike chat apps or cloud drives, it does not depend on centralized accounts or hosted storage`,"portal.feature.app.bullet.desktop":`The Web app connects to existing nodes; the desktop app provides full P2P capability`,"portal.feature.app.bullet.openSource":`MIT open source, self-hostable, and fully under your control`,"portal.feature.app.step.download.title":`Download client`,"portal.feature.app.step.download.desc":`Supports Windows, macOS, and Linux. The desktop app provides full P2P capability.`,"portal.feature.app.step.download.link":`Go to downloads`,"portal.feature.app.step.install.title":`Install and run`,"portal.feature.app.step.install.desc":`Open the app after installation. No separate Node.js install is required.`,"portal.feature.app.step.share.title":`Start sharing`,"portal.feature.app.step.share.desc":`Publish a file to create a most:// link. Friends who complete and verify the download become new seeders.`,"portal.feature.chat.title":`P2P chat`,"portal.feature.chat.subtitle":`Encrypted channels`,"portal.feature.chat.hero":`Decentralized channel chat`,"portal.feature.chat.desc":`P2P encrypted messaging powered by Hypercore. Create a channel, invite friends, and chat without a relay server.`,"portal.feature.chat.bullet.encrypted":`Encrypted P2P channel messages`,"portal.feature.chat.bullet.identity":`Local login identity protects message signatures`,"portal.feature.chat.bullet.sync":`Messages sync through the Hyperswarm network`,"portal.feature.chat.bullet.offline":`Offline messages sync automatically`,"portal.feature.chat.bullet.noAccount":`No centralized account registration required`,"portal.feature.chat.step.download.title":`Download client`,"portal.feature.chat.step.download.desc":`Supports Windows, macOS, and Linux.`,"portal.feature.chat.step.download.link":`Go to downloads`,"portal.feature.chat.step.create.title":`Create channel`,"portal.feature.chat.step.create.desc":`Enter any channel name to join or create it.`,"portal.feature.chat.step.send.title":`Start chatting`,"portal.feature.chat.step.send.desc":`Send messages and the P2P network syncs them to online nodes.`,"portal.feature.note.title":`Notes`,"portal.feature.note.subtitle":`Encrypted cloud backup`,"portal.feature.note.hero":`Web3 encrypted notes`,"portal.feature.note.desc":`Encrypt Markdown notes with local Web3 keys, save them in the browser, and sync encrypted backups when needed.`,"portal.feature.note.bullet.markdown":`Markdown block editor`,"portal.feature.note.bullet.privacy":`Public/private note switching`,"portal.feature.note.bullet.folders":`Folders, search, and move`,"portal.feature.note.bullet.web3":`Web3 login-based encryption`,"portal.feature.note.bullet.backup":`Cloud backup and restore`,"portal.feature.note.bullet.independent":`Independent from P2P file sharing`,"portal.feature.note.step.account.title":`Generate Web3 account`,"portal.feature.note.step.account.desc":`Derive local keys from a username and password.`,"portal.feature.note.step.create.title":`Create note`,"portal.feature.note.step.create.desc":`Write Markdown and switch content to private when needed.`,"portal.feature.note.step.backup.title":`Backup and restore`,"portal.feature.note.step.backup.desc":`After login, encrypted notes can sync to the cloud.`,"portal.feature.game.title":`Games`,"portal.feature.game.subtitle":`P2P card table`,"portal.feature.game.hero":`Online card tables in a resident node`,"portal.feature.game.desc":`Gandengyan is integrated as an independent MostBox page, reusing channel messages, Web3 login identity, and the desktop resident node.`,"portal.feature.game.bullet.account":`Enter rooms with your local MostBox account`,"portal.feature.game.bullet.channel":`Reuses the /chat/ channel backend without adding game-only APIs`,"portal.feature.game.bullet.link":`Room links can be shared directly to groups`,"portal.feature.game.bullet.rules":`Supports 1-2 decks, 2-6 players, and bot testing`,"portal.feature.game.bullet.maintain":`Game rules, channel events, and page styles are maintained separately`,"portal.feature.game.step.login.title":`Sign in`,"portal.feature.game.step.login.desc":`Use your existing local MostBox Web3 account as the table identity.`,"portal.feature.game.step.create.title":`Create room`,"portal.feature.game.step.create.desc":`Create a room, copy the link, and send it to friends.`,"portal.feature.game.step.test.title":`Start testing`,"portal.feature.game.step.test.desc":`Use bot seats to test plays, scoring, and room sync first.`,"portal.feature.web3.title":`Web3`,"portal.feature.web3.subtitle":`Account toolbox`,"portal.feature.web3.hero":`Deterministic key derivation toolbox`,"portal.feature.web3.desc":`A front-end only Web3 account tool. Enter a username and password to generate Ed25519/x25519 key pairs, a mnemonic, an Ethereum address, PEM exports, and derived addresses.`,"portal.feature.web3.bullet.frontend":`Runs fully in the browser, no backend`,"portal.feature.web3.bullet.keys":`Ed25519 / x25519 key pair generation`,"portal.feature.web3.bullet.mnemonic":`BIP-39 mnemonic derivation`,"portal.feature.web3.bullet.eth":`Ethereum address and private key export`,"portal.feature.web3.bullet.pem":`PEM key export`,"portal.feature.web3.bullet.qr":`QR codes for addresses and mnemonics`,"portal.feature.web3.step.username.title":`Enter username`,"portal.feature.web3.step.username.desc":`Use username plus optional password as the seed.`,"portal.feature.web3.step.keys.title":`View keys`,"portal.feature.web3.step.keys.desc":`Instantly generate Ed25519 and x25519 public keys plus an IPNS ID.`,"portal.feature.web3.step.export.title":`Export and use`,"portal.feature.web3.step.export.desc":`Copy addresses, export PEM, and derive child addresses.`},se={"remote.title.edit":`当前远程节点`,"remote.title.connect":`连接远程节点`,"remote.hint":`Web 端只连接已有 MostBox 节点。输入别人部署好的节点地址和邀请码后,可通过该节点使用文件分享和聊天;本机完整 P2P 能力请使用桌面客户端。`,"remote.invite.placeholder":`邀请码`,"remote.connecting":`连接中...`,"remote.updateConnection":`更新连接`,"remote.connectNode":`连接节点`,"remote.disconnect":`断开连接`,"remote.history.title":`历史节点`,"remote.history.current":`当前`,"remote.history.switchTo":`切换到 {url}`,"remote.error.invalidUrl":`请输入有效的 http(s) 节点地址`,"remote.error.http":`远程节点 HTTP 不可达,请检查地址`,"remote.error.ws":`远程节点 WebSocket 不可达,请检查地址或代理配置`,"remote.error.failed":`远程节点连接失败,请检查地址和邀请码`,"remote.connected":`远程节点已连接`,"remote.connectFailed":`远程节点连接失败`,"remote.cleared":`已清除远程节点,优先使用本地节点`,"connectModal.title":`连接节点`,"account.notSignedIn":`未登录`,"account.signIn":`登录`,"account.actions":`账号操作`,"account.logout":`退出`,"account.logoutTitle":`退出登录`,"account.logoutConfirm":`确定要退出当前账号吗?`},ce={"remote.title.edit":`當前遠端節點`,"remote.title.connect":`連線遠端節點`,"remote.hint":`Web 端只連線已有 MostBox 節點。輸入別人部署好的節點地址和邀請碼後,可通過該節點使用檔案分享和聊天;本機完整 P2P 能力請使用桌面用戶端。`,"remote.invite.placeholder":`邀請碼`,"remote.connecting":`連線中...`,"remote.updateConnection":`更新連線`,"remote.connectNode":`連線節點`,"remote.disconnect":`斷開連線`,"remote.history.title":`歷史節點`,"remote.history.current":`當前`,"remote.history.switchTo":`切換到 {url}`,"remote.error.invalidUrl":`請輸入有效的 http(s) 節點地址`,"remote.error.http":`遠端節點 HTTP 不可達,請檢查地址`,"remote.error.ws":`遠端節點 WebSocket 不可達,請檢查地址或代理設定`,"remote.error.failed":`遠端節點連線失敗,請檢查地址和邀請碼`,"remote.connected":`遠端節點已連線`,"remote.connectFailed":`遠端節點連線失敗`,"remote.cleared":`已清除遠端節點,優先使用本機節點`,"connectModal.title":`連線節點`,"account.notSignedIn":`未登入`,"account.signIn":`登入`,"account.actions":`帳號操作`,"account.logout":`退出`,"account.logoutTitle":`登出`,"account.logoutConfirm":`確定要退出當前帳號嗎?`},f={"remote.title.edit":`Current remote node`,"remote.title.connect":`Connect remote node`,"remote.hint":`The Web app only connects to an existing MostBox node. Enter a deployed node URL and invite code to use file sharing and chat through that node; use the desktop client for full local P2P capability.`,"remote.invite.placeholder":`Invite code`,"remote.connecting":`Connecting...`,"remote.updateConnection":`Update connection`,"remote.connectNode":`Connect node`,"remote.disconnect":`Disconnect`,"remote.history.title":`Node history`,"remote.history.current":`Current`,"remote.history.switchTo":`Switch to {url}`,"remote.error.invalidUrl":`Please enter a valid http(s) node URL`,"remote.error.http":`The remote node HTTP endpoint is unreachable`,"remote.error.ws":`The remote node WebSocket endpoint is unreachable. Check the URL or proxy.`,"remote.error.failed":`Remote node connection failed. Check the URL and invite code.`,"remote.connected":`Remote node connected`,"remote.connectFailed":`Remote node connection failed`,"remote.cleared":`Remote node cleared; local node will be preferred`,"connectModal.title":`Connect node`,"account.notSignedIn":`Not signed in`,"account.signIn":`Sign in`,"account.actions":`Account actions`,"account.logout":`Sign out`,"account.logoutTitle":`Sign out`,"account.logoutConfirm":`Sign out of the current account?`},p={"chat.unread":`有新消息`,"chat.channelActions":`频道操作`,"chat.pin":`置顶`,"chat.unpin":`取消置顶`,"chat.rename":`重命名`,"chat.delete":`删除`,"chat.noMembers":`暂无成员`,"chat.attachmentType":`附件类型`,"chat.attachment.add":`添加附件`,"chat.attachment.image":`图片`,"chat.attachment.video":`视频`,"chat.attachment.file":`文件`,"chat.sendMessage":`发送消息`,"chat.sending":`发送中...`,"chat.checking":`检测中`,"chat.mostboxFile":`MostBox 文件`,"chat.attachment.downloadStarted":`开始下载附件`,"chat.attachment.downloadCompleted":`{fileName} 下载完成`,"chat.attachment.downloadCancelled":`附件下载已取消`,"chat.attachment.downloadFailed":`附件下载失败`,"chat.attachment.localAvailable":`本机已有`,"chat.attachment.previewAvailable":`可预览`,"chat.attachment.noSeedsTitle":`暂时没有在线种子`,"chat.attachment.noSeedsFallback":`暂时没有发现在线种子。请确认分享者或其他下载者仍在线做种。`,"chat.attachment.retryCheck":`再次检测`,"chat.channel.createdAt":`创建时间`,"chat.title":`聊天`,"chat.search.placeholder":`搜索频道`,"chat.empty.noChannels":`暂无频道`,"chat.empty.noMatches":`未找到频道`,"chat.joinChannel":`加入频道`,"chat.channelSettings":`频道设置`,"chat.empty.noMessages":`暂无消息,开始聊天吧!`,"chat.composer.placeholder":`输入消息...`,"chat.composer.signInPlaceholder":`请先登录后发言`,"chat.restoring.title":`正在打开频道`,"chat.restoring.desc":`正在恢复聊天内容...`,"chat.select.title":`选择频道`,"chat.select.desc":`从左侧边栏选择一个频道开始聊天,或创建一个新频道`,"chat.openChannelList":`打开频道列表`,"chat.join.placeholder":`频道ID:3-20 位字母、数字、_ 或 -`,"chat.join.confirm":`加入`,"chat.join.joining":`加入中...`,"chat.renameChannel":`重命名频道`,"chat.remark.placeholder":`输入备注名称`,"chat.remark.save":`保存`,"chat.remark.saving":`保存中...`,"chat.remark.tooLong":`备注名称最多 50 个字符`,"chat.leaveChannel":`退出频道`,"chat.leaveConfirm":`确定要退出频道 "{channel}" 吗?`,"chat.leaving":`退出中...`,"chat.details.title":`频道详情`,"chat.details.members":`群成员 ({count})`,"chat.details.showAddressSuffix":`显示 #地址后四位`,"chat.details.channelId":`频道 ID`,"chat.attachment.published":`{fileName} 已发布`,"chat.error.members":`无法读取频道成员`,"chat.error.messages":`无法读取频道消息`,"chat.error.nodeId":`无法读取节点 ID`,"chat.error.channelList":`无法读取频道列表`,"chat.error.leave":`退出频道失败`,"chat.error.pin":`置顶失败`,"chat.error.unpin":`取消置顶失败`,"chat.error.join":`加入频道失败`,"chat.error.send":`发送失败`,"chat.error.attachmentSend":`附件发送失败`,"chat.error.remark":`设置备注失败`,"chat.error.rename":`重命名失败`,"chat.validation.nameMin":`频道名至少 {count} 个字符`,"chat.validation.nameMax":`频道名最多 {count} 个字符`,"chat.validation.dotReserved":`点号为系统保留,不能用于手动频道 ID`,"chat.validation.allowedChars":`频道名只能包含字母、数字、下划线和连字符`},m={"chat.unread":`有新訊息`,"chat.channelActions":`頻道操作`,"chat.pin":`置頂`,"chat.unpin":`取消置頂`,"chat.rename":`重新命名`,"chat.delete":`刪除`,"chat.noMembers":`暫無成員`,"chat.attachmentType":`附件型別`,"chat.attachment.add":`新增附件`,"chat.attachment.image":`圖片`,"chat.attachment.video":`影片`,"chat.attachment.file":`檔案`,"chat.sendMessage":`傳送訊息`,"chat.sending":`傳送中...`,"chat.checking":`檢測中`,"chat.mostboxFile":`MostBox 檔案`,"chat.attachment.downloadStarted":`開始下載附件`,"chat.attachment.downloadCompleted":`{fileName} 下載完成`,"chat.attachment.downloadCancelled":`附件下載已取消`,"chat.attachment.downloadFailed":`附件下載失敗`,"chat.attachment.localAvailable":`本機已有`,"chat.attachment.previewAvailable":`可預覽`,"chat.attachment.noSeedsTitle":`暫時沒有線上種子`,"chat.attachment.noSeedsFallback":`暫時沒有發現線上種子。請確認分享者或其他下載者仍線上做種。`,"chat.attachment.retryCheck":`再次檢測`,"chat.channel.createdAt":`建立時間`,"chat.title":`聊天`,"chat.search.placeholder":`搜尋頻道`,"chat.empty.noChannels":`暫無頻道`,"chat.empty.noMatches":`未找到頻道`,"chat.joinChannel":`加入頻道`,"chat.channelSettings":`頻道設定`,"chat.empty.noMessages":`暫無訊息,開始聊天吧!`,"chat.composer.placeholder":`輸入訊息...`,"chat.composer.signInPlaceholder":`請先登入後發言`,"chat.restoring.title":`正在開啟頻道`,"chat.restoring.desc":`正在恢復聊天內容...`,"chat.select.title":`選擇頻道`,"chat.select.desc":`從左側邊欄選擇一個頻道開始聊天,或建立一個新頻道`,"chat.openChannelList":`開啟頻道列表`,"chat.join.placeholder":`頻道ID:3-20 位字母、數字、_ 或 -`,"chat.join.confirm":`加入`,"chat.join.joining":`加入中...`,"chat.renameChannel":`重新命名頻道`,"chat.remark.placeholder":`輸入備註名稱`,"chat.remark.save":`儲存`,"chat.remark.saving":`儲存中...`,"chat.remark.tooLong":`備註名稱最多 50 個字元`,"chat.leaveChannel":`退出頻道`,"chat.leaveConfirm":`確定要退出頻道 "{channel}" 嗎?`,"chat.leaving":`退出中...`,"chat.details.title":`頻道詳情`,"chat.details.members":`群成員 ({count})`,"chat.details.showAddressSuffix":`顯示 #地址後四位`,"chat.details.channelId":`頻道 ID`,"chat.attachment.published":`{fileName} 已發布`,"chat.error.members":`無法讀取頻道成員`,"chat.error.messages":`無法讀取頻道訊息`,"chat.error.nodeId":`無法讀取節點 ID`,"chat.error.channelList":`無法讀取頻道列表`,"chat.error.leave":`退出頻道失敗`,"chat.error.pin":`置頂失敗`,"chat.error.unpin":`取消置頂失敗`,"chat.error.join":`加入頻道失敗`,"chat.error.send":`傳送失敗`,"chat.error.attachmentSend":`附件傳送失敗`,"chat.error.remark":`設定備註失敗`,"chat.error.rename":`重新命名失敗`,"chat.validation.nameMin":`頻道名至少 {count} 個字元`,"chat.validation.nameMax":`頻道名最多 {count} 個字元`,"chat.validation.dotReserved":`點號為系統保留,不能用於手動頻道 ID`,"chat.validation.allowedChars":`頻道名只能包含字母、數字、下劃線和連字元`},h={"chat.unread":`New messages`,"chat.channelActions":`Channel actions`,"chat.pin":`Pin`,"chat.unpin":`Unpin`,"chat.rename":`Rename`,"chat.delete":`Delete`,"chat.noMembers":`No members yet`,"chat.attachmentType":`Attachment type`,"chat.attachment.add":`Add attachment`,"chat.attachment.image":`Image`,"chat.attachment.video":`Video`,"chat.attachment.file":`File`,"chat.sendMessage":`Send message`,"chat.sending":`Sending...`,"chat.checking":`Checking`,"chat.mostboxFile":`MostBox file`,"chat.attachment.downloadStarted":`Attachment download started`,"chat.attachment.downloadCompleted":`{fileName} downloaded`,"chat.attachment.downloadCancelled":`Attachment download cancelled`,"chat.attachment.downloadFailed":`Attachment download failed`,"chat.attachment.localAvailable":`Already on this device`,"chat.attachment.previewAvailable":`Ready to preview`,"chat.attachment.noSeedsTitle":`No online seeders right now`,"chat.attachment.noSeedsFallback":`No online seeders were found. Make sure the sharer or another downloader is still seeding.`,"chat.attachment.retryCheck":`Check again`,"chat.channel.createdAt":`Created`,"chat.title":`Chat`,"chat.search.placeholder":`Search channels`,"chat.empty.noChannels":`No channels yet`,"chat.empty.noMatches":`No channels found`,"chat.joinChannel":`Join channel`,"chat.channelSettings":`Channel settings`,"chat.empty.noMessages":`No messages yet. Start the conversation.`,"chat.composer.placeholder":`Type a message...`,"chat.composer.signInPlaceholder":`Sign in before sending messages`,"chat.restoring.title":`Opening channel`,"chat.restoring.desc":`Restoring chat content...`,"chat.select.title":`Select a channel`,"chat.select.desc":`Choose a channel from the sidebar to start chatting, or create a new one.`,"chat.openChannelList":`Open channel list`,"chat.join.placeholder":`Channel ID: 3-20 letters, numbers, _ or -`,"chat.join.confirm":`Join`,"chat.join.joining":`Joining...`,"chat.renameChannel":`Rename channel`,"chat.remark.placeholder":`Enter remark name`,"chat.remark.save":`Save`,"chat.remark.saving":`Saving...`,"chat.remark.tooLong":`Remark name must be 50 characters or fewer`,"chat.leaveChannel":`Leave channel`,"chat.leaveConfirm":`Leave channel "{channel}"?`,"chat.leaving":`Leaving...`,"chat.details.title":`Channel details`,"chat.details.members":`Members ({count})`,"chat.details.showAddressSuffix":`Show #address suffix`,"chat.details.channelId":`Channel ID`,"chat.attachment.published":`{fileName} published`,"chat.error.members":`Failed to read channel members`,"chat.error.messages":`Failed to read channel messages`,"chat.error.nodeId":`Failed to read node ID`,"chat.error.channelList":`Failed to read channel list`,"chat.error.leave":`Failed to leave channel`,"chat.error.pin":`Failed to pin channel`,"chat.error.unpin":`Failed to unpin channel`,"chat.error.join":`Failed to join channel`,"chat.error.send":`Failed to send message`,"chat.error.attachmentSend":`Failed to send attachment`,"chat.error.remark":`Failed to set remark`,"chat.error.rename":`Failed to rename channel`,"chat.validation.nameMin":`Channel name must be at least {count} characters`,"chat.validation.nameMax":`Channel name must be at most {count} characters`,"chat.validation.dotReserved":`Dots are reserved for the system and cannot be used in manual channel IDs`,"chat.validation.allowedChars":`Channel names can only contain letters, numbers, underscores, and hyphens`},g={"chatJoin.title":`加入频道`,"chatJoin.status.checkingBackend":`正在检测后端连接...`,"chatJoin.status.connectingRemote":`正在连接远程节点...`,"chatJoin.status.signingIn":`正在登录邀请账号...`,"chatJoin.status.joiningChannel":`正在加入频道...`,"chatJoin.status.openingChannel":`加入成功,正在打开频道...`,"chatJoin.status.loadingFixture":`正在载入 {name} 预设邀请...`,"chatJoin.status.decryptingInvite":`正在解密邀请...`,"chatJoin.status.decrypting":`正在解密...`,"chatJoin.status.decryptSuccess":`解密成功`,"chatJoin.error.unknownFixture":`未知预设邀请:{fixture}`,"chatJoin.error.missingToken":`缺少 token 参数`,"chatJoin.error.missingPub":`缺少 pub 参数`,"chatJoin.error.remoteConnectFailed":`远程节点连接失败`,"chatJoin.error.noBackend":`未连接后端,邀请中也没有 node_url`,"chatJoin.error.decrypt":`解密失败`,"chatJoin.error.invalidInvite":`邀请内容缺少 uid 或 channels[].id`,"chatJoin.error.request":`请求出错: {message}`,"chatJoin.specTitle":`支持字段`,"chatJoin.field.required":`必填`,"chatJoin.field.optional":`可选`,"chatJoin.field.nodeUrl":`Web 端未连接后端时,用于连接远程节点。`,"chatJoin.field.nodeInvite":`配合 node_url 作为远程节点邀请码。`,"chatJoin.field.uid":`作为用户名,密码为空,用于生成账户并自动登录。`,"chatJoin.field.identity":`邀请身份类型;user 为普通用户,service 为服务账号。`,"chatJoin.field.logo":`覆盖邀请用户聊天页顶部 logo。`,"chatJoin.field.avatar":`覆盖默认头像。`,"chatJoin.field.name":`覆盖默认昵称。`,"chatJoin.field.locale":`指定邀请流程自动切换的界面语言,支持 zh-CN、zh-TW、en。`,"chatJoin.field.channelId":`频道 ID,用于自动加入频道。`,"chatJoin.field.channelName":`频道备注,不作为频道 ID。`,"chatJoin.testPublicKey":`测试公钥`,"chatJoin.openWeb3":`前往 Web3 工具箱`},_={"chatJoin.title":`加入頻道`,"chatJoin.status.checkingBackend":`正在檢測後端連線...`,"chatJoin.status.connectingRemote":`正在連線遠端節點...`,"chatJoin.status.signingIn":`正在登入邀請帳號...`,"chatJoin.status.joiningChannel":`正在加入頻道...`,"chatJoin.status.openingChannel":`加入成功,正在開啟頻道...`,"chatJoin.status.loadingFixture":`正在載入 {name} 預設邀請...`,"chatJoin.status.decryptingInvite":`正在解密邀請...`,"chatJoin.status.decrypting":`正在解密...`,"chatJoin.status.decryptSuccess":`解密成功`,"chatJoin.error.unknownFixture":`未知預設邀請:{fixture}`,"chatJoin.error.missingToken":`缺少 token 參數`,"chatJoin.error.missingPub":`缺少 pub 參數`,"chatJoin.error.remoteConnectFailed":`遠端節點連線失敗`,"chatJoin.error.noBackend":`未連線後端,邀請中也沒有 node_url`,"chatJoin.error.decrypt":`解密失敗`,"chatJoin.error.invalidInvite":`邀請內容缺少 uid 或 channels[].id`,"chatJoin.error.request":`請求出錯: {message}`,"chatJoin.specTitle":`支援欄位`,"chatJoin.field.required":`必填`,"chatJoin.field.optional":`可選`,"chatJoin.field.nodeUrl":`Web 端未連線後端時,用於連線遠端節點。`,"chatJoin.field.nodeInvite":`配合 node_url 作為遠端節點邀請碼。`,"chatJoin.field.uid":`作為使用者名稱,密碼為空,用於生成帳戶並自動登入。`,"chatJoin.field.identity":`邀請身份型別;user 為普通使用者,service 為服務帳號。`,"chatJoin.field.logo":`覆蓋邀請使用者聊天頁頂部 logo。`,"chatJoin.field.avatar":`覆蓋預設頭像。`,"chatJoin.field.name":`覆蓋預設暱稱。`,"chatJoin.field.locale":`指定邀請流程自動切換的介面語言,支援 zh-CN、zh-TW、en。`,"chatJoin.field.channelId":`頻道 ID,用於自動加入頻道。`,"chatJoin.field.channelName":`頻道備註,不作為頻道 ID。`,"chatJoin.testPublicKey":`測試公鑰`,"chatJoin.openWeb3":`前往 Web3 工具箱`},v={"chatJoin.title":`Join channel`,"chatJoin.status.checkingBackend":`Checking backend connection...`,"chatJoin.status.connectingRemote":`Connecting to remote node...`,"chatJoin.status.signingIn":`Signing in with invited account...`,"chatJoin.status.joiningChannel":`Joining channel...`,"chatJoin.status.openingChannel":`Joined. Opening channel...`,"chatJoin.status.loadingFixture":`Loading {name} preset invite...`,"chatJoin.status.decryptingInvite":`Decrypting invite...`,"chatJoin.status.decrypting":`Decrypting...`,"chatJoin.status.decryptSuccess":`Decrypted`,"chatJoin.error.unknownFixture":`Unknown preset invite: {fixture}`,"chatJoin.error.missingToken":`Missing token parameter`,"chatJoin.error.missingPub":`Missing pub parameter`,"chatJoin.error.remoteConnectFailed":`Failed to connect to remote node`,"chatJoin.error.noBackend":`No backend is connected and the invite has no node_url`,"chatJoin.error.decrypt":`Decrypt failed`,"chatJoin.error.invalidInvite":`Invite is missing uid or channels[].id`,"chatJoin.error.request":`Request failed: {message}`,"chatJoin.specTitle":`Supported fields`,"chatJoin.field.required":`Required`,"chatJoin.field.optional":`Optional`,"chatJoin.field.nodeUrl":`Used to connect to a remote node when the web app has no backend.`,"chatJoin.field.nodeInvite":`Remote node invite code used together with node_url.`,"chatJoin.field.uid":`Used as the username. The password is empty for automatic sign-in.`,"chatJoin.field.identity":`Invite identity type. user is a normal user, service is a service account.`,"chatJoin.field.logo":`Overrides the invited user logo in the chat header.`,"chatJoin.field.avatar":`Overrides the default avatar.`,"chatJoin.field.name":`Overrides the default display name.`,"chatJoin.field.locale":`Automatically switches the invite flow UI language. Supported values: zh-CN, zh-TW, en.`,"chatJoin.field.channelId":`Channel ID to join automatically.`,"chatJoin.field.channelName":`Channel remark. It is not used as the channel ID.`,"chatJoin.testPublicKey":`Test public key`,"chatJoin.openWeb3":`Open Web3 toolbox`},y={"preview.close":`关闭预览`,"preview.loadFailed":`加载失败`,"preview.audioLoading":`正在加载音频预览...`,"preview.unsupported":`无法预览`,"preview.textLoading":`正在加载文本预览...`,"preview.firstSyncHint":`如果是初次预览,可能需要等待 P2P 网络同步`,"preview.emptyFile":`(文件为空)`,"move.title":`移动到`,"move.selectedCount":`已选 {count} 个项目`,"move.pathPlaceholder":`输入路径创建嵌套文件夹`,"move.pathExample":`如 图片/壁纸`,"move.noSubfolders":`该目录下没有子文件夹`,"move.action":`移动`,"move.root":`全部内容`,"app.nav.local":`本地`,"app.nav.favorites":`收藏`,"app.nav.trash":`回收站`,"app.search.placeholder":`搜索...`,"app.emptyTrash":`清空回收站`,"app.publishFile":`发布文件`,"app.downloadFile":`下载文件`,"app.allContent":`全部内容`,"app.noMatches":`未找到相关文件`,"app.trashEmpty":`回收站是空的`,"app.noFavorites":`暂无的收藏`,"app.noLocalFiles":`暂无本地文件`,"app.openFileNavigation":`打开文件导航`,"app.deletedOn":`删除于 {date}`,"app.shareLink":`分享链接`,"app.shareSeedNote":`本机在线时可下载;下载者完成后会默认继续做种。`,"app.downloadLink.placeholder":`输入 most:// 链接`,"app.download.validation.empty":`请先粘贴 most:// 分享链接。`,"app.download.validation.invalidUrl":`链接格式不正确,请粘贴完整的 most:// 分享链接。`,"app.download.validation.protocol":`链接协议不正确,应以 most:// 开头。`,"app.download.validation.path":`链接路径不受支持,请使用 most://<CID>?filename=... 格式。`,"app.download.validation.invalidCid":`链接中的 CID 格式不正确。`,"app.download.validation.cidV1":`链接中的 CID 必须是 CID v1。`,"app.download.validation.cidDigest":`链接中的 CID digest 长度不正确。`,"app.download.validation.filenameRequired":`分享链接缺少 filename 参数。`,"app.download.validation.unsupportedParam":`分享链接包含不支持的参数:{param}。`,"app.download.validation.generic":`分享链接无效,请检查后重试。`,"app.check":`检测`,"app.checking":`检测中...`,"app.passed":`已通过`,"app.startDownload":`开始下载`,"app.downloading":`下载中...`,"app.selectedItems":`已选 {count} 项`,"app.restore":`恢复`,"app.permanentDelete":`永久删除`,"app.preview":`预览`,"app.favorite":`收藏`,"app.rename":`重命名`,"app.move":`移动`,"app.delete":`删除`,"app.pullToLocal":`拉取到本机`,"app.share":`分享`,"app.saveAs":`另存为`,"app.transfers":`传输`,"app.noTransfers":`暂无传输`,"app.completed":`完成`,"app.failed":`失败`,"app.cancelled":`已取消`,"app.cancelling":`取消中`,"app.transferProgress":`{fileName} 传输进度`,"app.clearTrash.title":`清空回收站`,"app.clearTrash.message":`确定要清空回收站吗?此操作不可恢复!`,"app.clear":`清空`,"app.batchDelete":`批量删除`,"app.deleteSelectedPermanent":`确定要永久删除选中的 {count} 个项目吗?此操作不可恢复!`,"app.deleteSelected":`确定要删除选中的 {count} 个项目吗?`,"app.renameFolder":`重命名文件夹`,"app.renameFile":`重命名文件`,"app.enterNewName":`请输入新名称`,"app.fileAlreadyExists":`{fileName} 已存在`,"app.fileAddedLocal":`{fileName} 已添加到本地`,"app.fileAlreadyLocal":`{fileName} 已在本机`,"app.fileAvailable":`{fileName} 可下载`,"app.fileDownloadCompleted":`{fileName} 下载完成`,"app.publishFailedWithFile":`发布失败: {fileName}`,"app.downloadFailedWithError":`下载失败: {error}`,"app.saveFailedWithError":`保存失败: {error}`,"app.toast.restored":`已恢复`,"app.toast.restoreFailed":`恢复失败`,"app.toast.trashEmptied":`回收站已清空`,"app.toast.emptyFailed":`清空失败`,"app.toast.favorited":`已收藏`,"app.toast.unfavorited":`已取消收藏`,"app.toast.actionFailed":`操作失败`,"app.toast.deletedPermanently":`已永久删除`,"app.toast.deleted":`已删除`,"app.toast.deleteFailed":`删除失败`,"app.toast.moved":`已移动`,"app.toast.moveFailed":`移动失败`,"app.toast.renamed":`已重命名`,"app.toast.renameFailed":`重命名失败`,"app.toast.signInBeforePublish":`请先登录后发布文件`,"app.toast.signInBeforeDownload":`请先登录后下载文件`,"app.toast.checkLinkFirst":`请先检测链接可用性`,"app.toast.downloadStarted":`下载已开始`,"app.toast.downloadFailed":`下载失败`,"app.toast.cancelFailed":`取消失败`,"app.toast.fileNotLocal":`文件尚未保存在本机,请先拉取到本机`,"app.toast.getFileFailed":`获取文件失败`,"app.toast.fileSaved":`文件已保存`,"app.toast.fileDownloaded":`文件已下载`,"app.toast.startPullLocal":`开始拉取到本机`,"app.toast.pulledAndSeeding":`已拉取到本机并开始做种`,"app.toast.pullFailed":`拉取失败`,"app.toast.downloadCancelled":`下载已取消`,"app.toast.checkPassed":`检测通过`,"app.downloadFallbackName":`下载文件`},b={"preview.close":`關閉預覽`,"preview.loadFailed":`載入失敗`,"preview.audioLoading":`正在載入音訊預覽...`,"preview.unsupported":`無法預覽`,"preview.textLoading":`正在載入文字預覽...`,"preview.firstSyncHint":`如果是初次預覽,可能需要等待 P2P 網路同步`,"preview.emptyFile":`(檔案為空)`,"move.title":`移動到`,"move.selectedCount":`已選 {count} 個項目`,"move.pathPlaceholder":`輸入路徑建立巢狀資料夾`,"move.pathExample":`如 圖片/桌布`,"move.noSubfolders":`該目錄下沒有子資料夾`,"move.action":`移動`,"move.root":`全部內容`,"app.nav.local":`本機`,"app.nav.favorites":`收藏`,"app.nav.trash":`垃圾桶`,"app.search.placeholder":`搜尋...`,"app.emptyTrash":`清空垃圾桶`,"app.publishFile":`發布檔案`,"app.downloadFile":`下載檔案`,"app.allContent":`全部內容`,"app.noMatches":`未找到相關檔案`,"app.trashEmpty":`垃圾桶是空的`,"app.noFavorites":`暫無的收藏`,"app.noLocalFiles":`暫無本機檔案`,"app.openFileNavigation":`開啟檔案導覽`,"app.deletedOn":`刪除於 {date}`,"app.shareLink":`分享連結`,"app.shareSeedNote":`本機線上時可下載;下載者完成後會預設繼續做種。`,"app.downloadLink.placeholder":`輸入 most:// 連結`,"app.download.validation.empty":`請先貼上 most:// 分享連結。`,"app.download.validation.invalidUrl":`連結格式不正確,請貼上完整的 most:// 分享連結。`,"app.download.validation.protocol":`連結協議不正確,應以 most:// 開頭。`,"app.download.validation.path":`連結路徑不受支援,請使用 most://<CID>?filename=... 格式。`,"app.download.validation.invalidCid":`連結中的 CID 格式不正確。`,"app.download.validation.cidV1":`連結中的 CID 必須是 CID v1。`,"app.download.validation.cidDigest":`連結中的 CID digest 長度不正確。`,"app.download.validation.filenameRequired":`分享連結缺少 filename 參數。`,"app.download.validation.unsupportedParam":`分享連結包含不支援的參數:{param}。`,"app.download.validation.generic":`分享連結無效,請檢查後重試。`,"app.check":`檢測`,"app.checking":`檢測中...`,"app.passed":`已通過`,"app.startDownload":`開始下載`,"app.downloading":`下載中...`,"app.selectedItems":`已選 {count} 項`,"app.restore":`恢復`,"app.permanentDelete":`永久刪除`,"app.preview":`預覽`,"app.favorite":`收藏`,"app.rename":`重新命名`,"app.move":`移動`,"app.delete":`刪除`,"app.pullToLocal":`拉取到本機`,"app.share":`分享`,"app.saveAs":`另存新檔`,"app.transfers":`傳輸`,"app.noTransfers":`暫無傳輸`,"app.completed":`完成`,"app.failed":`失敗`,"app.cancelled":`已取消`,"app.cancelling":`取消中`,"app.transferProgress":`{fileName} 傳輸進度`,"app.clearTrash.title":`清空垃圾桶`,"app.clearTrash.message":`確定要清空垃圾桶嗎?此操作不可恢復!`,"app.clear":`清空`,"app.batchDelete":`批次刪除`,"app.deleteSelectedPermanent":`確定要永久刪除選中的 {count} 個項目嗎?此操作不可恢復!`,"app.deleteSelected":`確定要刪除選中的 {count} 個項目嗎?`,"app.renameFolder":`重新命名資料夾`,"app.renameFile":`重新命名檔案`,"app.enterNewName":`請輸入新名稱`,"app.fileAlreadyExists":`{fileName} 已存在`,"app.fileAddedLocal":`{fileName} 已新增到本機`,"app.fileAlreadyLocal":`{fileName} 已在本機`,"app.fileAvailable":`{fileName} 可下載`,"app.fileDownloadCompleted":`{fileName} 下載完成`,"app.publishFailedWithFile":`發布失敗: {fileName}`,"app.downloadFailedWithError":`下載失敗: {error}`,"app.saveFailedWithError":`儲存失敗: {error}`,"app.toast.restored":`已恢復`,"app.toast.restoreFailed":`恢復失敗`,"app.toast.trashEmptied":`垃圾桶已清空`,"app.toast.emptyFailed":`清空失敗`,"app.toast.favorited":`已收藏`,"app.toast.unfavorited":`已取消收藏`,"app.toast.actionFailed":`操作失敗`,"app.toast.deletedPermanently":`已永久刪除`,"app.toast.deleted":`已刪除`,"app.toast.deleteFailed":`刪除失敗`,"app.toast.moved":`已移動`,"app.toast.moveFailed":`移動失敗`,"app.toast.renamed":`已重新命名`,"app.toast.renameFailed":`重新命名失敗`,"app.toast.signInBeforePublish":`請先登入後發布檔案`,"app.toast.signInBeforeDownload":`請先登入後下載檔案`,"app.toast.checkLinkFirst":`請先檢測連結可用性`,"app.toast.downloadStarted":`下載已開始`,"app.toast.downloadFailed":`下載失敗`,"app.toast.cancelFailed":`取消失敗`,"app.toast.fileNotLocal":`檔案尚未儲存在本機,請先拉取到本機`,"app.toast.getFileFailed":`取得檔案失敗`,"app.toast.fileSaved":`檔案已儲存`,"app.toast.fileDownloaded":`檔案已下載`,"app.toast.startPullLocal":`開始拉取到本機`,"app.toast.pulledAndSeeding":`已拉取到本機並開始做種`,"app.toast.pullFailed":`拉取失敗`,"app.toast.downloadCancelled":`下載已取消`,"app.toast.checkPassed":`檢測通過`,"app.downloadFallbackName":`下載檔案`},x={"preview.close":`Close preview`,"preview.loadFailed":`Failed to load`,"preview.audioLoading":`Loading audio preview...`,"preview.unsupported":`Preview unavailable`,"preview.textLoading":`Loading text preview...`,"preview.firstSyncHint":`For a first preview, P2P sync may take a moment.`,"preview.emptyFile":`(File is empty)`,"move.title":`Move to`,"move.selectedCount":`Selected {count} items`,"move.pathPlaceholder":`Enter a path to create nested folders`,"move.pathExample":`Example: Images/Wallpapers`,"move.noSubfolders":`No subfolders in this folder`,"move.action":`Move`,"move.root":`All content`,"app.nav.local":`Local`,"app.nav.favorites":`Favorites`,"app.nav.trash":`Trash`,"app.search.placeholder":`Search...`,"app.emptyTrash":`Empty trash`,"app.publishFile":`Publish file`,"app.downloadFile":`Download file`,"app.allContent":`All content`,"app.noMatches":`No matching files found`,"app.trashEmpty":`Trash is empty`,"app.noFavorites":`No favorites yet`,"app.noLocalFiles":`No local files yet`,"app.openFileNavigation":`Open file navigation`,"app.deletedOn":`Deleted on {date}`,"app.shareLink":`Share link`,"app.shareSeedNote":`Available while this device is online. Completed downloaders keep seeding by default.`,"app.downloadLink.placeholder":`Enter a most:// link`,"app.download.validation.empty":`Paste a most:// share link first.`,"app.download.validation.invalidUrl":`The link format is invalid. Paste a complete most:// share link.`,"app.download.validation.protocol":`The link must start with most://.`,"app.download.validation.path":`Link paths are not supported. Use most://<CID>?filename=...`,"app.download.validation.invalidCid":`The CID in this link is invalid.`,"app.download.validation.cidV1":`The CID in this link must be CID v1.`,"app.download.validation.cidDigest":`The CID digest in this link has the wrong length.`,"app.download.validation.filenameRequired":`The share link is missing the filename parameter.`,"app.download.validation.unsupportedParam":`The share link contains an unsupported parameter: {param}.`,"app.download.validation.generic":`This share link is invalid. Check it and try again.`,"app.check":`Check`,"app.checking":`Checking...`,"app.passed":`Passed`,"app.startDownload":`Start download`,"app.downloading":`Downloading...`,"app.selectedItems":`Selected {count} items`,"app.restore":`Restore`,"app.permanentDelete":`Delete permanently`,"app.preview":`Preview`,"app.favorite":`Favorite`,"app.rename":`Rename`,"app.move":`Move`,"app.delete":`Delete`,"app.pullToLocal":`Pull to this device`,"app.share":`Share`,"app.saveAs":`Save as`,"app.transfers":`Transfers`,"app.noTransfers":`No transfers`,"app.completed":`Completed`,"app.failed":`Failed`,"app.cancelled":`Cancelled`,"app.cancelling":`Cancelling`,"app.transferProgress":`{fileName} transfer progress`,"app.clearTrash.title":`Empty trash`,"app.clearTrash.message":`Empty trash? This cannot be undone.`,"app.clear":`Empty`,"app.batchDelete":`Delete selected`,"app.deleteSelectedPermanent":`Permanently delete {count} selected items? This cannot be undone.`,"app.deleteSelected":`Delete {count} selected items?`,"app.renameFolder":`Rename folder`,"app.renameFile":`Rename file`,"app.enterNewName":`Enter a new name`,"app.fileAlreadyExists":`{fileName} already exists`,"app.fileAddedLocal":`{fileName} added locally`,"app.fileAlreadyLocal":`{fileName} is already on this device`,"app.fileAvailable":`{fileName} is available to download`,"app.fileDownloadCompleted":`{fileName} download completed`,"app.publishFailedWithFile":`Publish failed: {fileName}`,"app.downloadFailedWithError":`Download failed: {error}`,"app.saveFailedWithError":`Save failed: {error}`,"app.toast.restored":`Restored`,"app.toast.restoreFailed":`Restore failed`,"app.toast.trashEmptied":`Trash emptied`,"app.toast.emptyFailed":`Empty failed`,"app.toast.favorited":`Added to favorites`,"app.toast.unfavorited":`Removed from favorites`,"app.toast.actionFailed":`Action failed`,"app.toast.deletedPermanently":`Deleted permanently`,"app.toast.deleted":`Deleted`,"app.toast.deleteFailed":`Delete failed`,"app.toast.moved":`Moved`,"app.toast.moveFailed":`Move failed`,"app.toast.renamed":`Renamed`,"app.toast.renameFailed":`Rename failed`,"app.toast.signInBeforePublish":`Sign in before publishing files`,"app.toast.signInBeforeDownload":`Sign in before downloading files`,"app.toast.checkLinkFirst":`Check link availability first`,"app.toast.downloadStarted":`Download started`,"app.toast.downloadFailed":`Download failed`,"app.toast.cancelFailed":`Cancel failed`,"app.toast.fileNotLocal":`This file is not saved on this device yet. Pull it locally first.`,"app.toast.getFileFailed":`Failed to get file`,"app.toast.fileSaved":`File saved`,"app.toast.fileDownloaded":`File downloaded`,"app.toast.startPullLocal":`Pulling to this device`,"app.toast.pulledAndSeeding":`Pulled to this device and started seeding`,"app.toast.pullFailed":`Pull failed`,"app.toast.downloadCancelled":`Download cancelled`,"app.toast.checkPassed":`Check passed`,"app.downloadFallbackName":`Download file`},S={"note.title":`笔记`,"note.count":`{count} 篇`,"note.listLabel":`笔记列表`,"note.root":`全部笔记`,"note.preview.encrypted":`私密内容已加密`,"note.preview.empty":`空白笔记`,"note.privacy.secret":`私密`,"note.privacy.public":`公开`,"note.mode.edit":`编辑模式`,"note.mode.read":`阅读模式`,"note.search.placeholder":`搜索笔记`,"note.empty.noMatches":`未找到笔记`,"note.empty.noNotes":`还没有笔记`,"note.folder":`文件夹`,"note.newNote":`新笔记`,"note.namePlaceholder":`笔记名称`,"note.untitled":`未命名笔记`,"note.editorLabel.edit":`笔记编辑器`,"note.editorLabel.read":`笔记阅读器`,"note.noOpen.title":`没有打开的笔记`,"note.noOpen.select":`选择一篇笔记继续`,"note.noOpen.createFirst":`创建第一篇笔记`,"note.openList":`打开笔记列表`,"note.loading":`加载中...`,"note.create.title":`新建笔记`,"note.create.action":`创建`,"note.delete.folderTitle":`删除文件夹`,"note.delete.noteTitle":`删除笔记`,"note.delete.message":`确定要删除「{name}」吗?此操作不可撤销。`,"note.action.save":`保存`,"note.action.saving":`保存中`,"note.action.move":`移动`,"note.action.delete":`删除`,"note.action.edit":`编辑`,"note.toast.notFound":`笔记不存在`,"note.toast.nameRequired":`请输入笔记名称`,"note.toast.saved":`笔记已保存`,"note.toast.saveFailed":`保存失败`,"note.toast.created":`笔记已创建`,"note.toast.createFailed":`创建失败`,"note.toast.renamed":`已重命名`,"note.toast.renameFailed":`重命名失败`,"note.toast.moved":`已移动`,"note.toast.moveFailed":`移动失败`,"note.toast.deleted":`已删除`,"note.error.notFound":`笔记不存在`,"note.error.loginToDecrypt":`请先登录 Web3 账号以解密此笔记`,"note.error.decryptFailed":`无法解密,请确认当前 Web3 账号正确`,"note.error.nameRequired":`请输入名称`,"note.error.nameNoSlash":`名称不能包含 /`,"note.error.nameNoBackslash":`名称不能包含 \\`,"note.error.nameInvalid":`名称无效`,"note.error.nameConflict":`目标位置已存在同名笔记`,"note.error.moveIntoSelf":`不能移动到自身子目录`,"note.move.title":`移动笔记`,"note.move.moving":`正在移动`,"note.move.noFolders":`还没有可选文件夹`,"note.move.pathPlaceholder":`或输入新目录路径,如 文章/摘录`,"note.move.destinationLabel":`目标位置:`,"note.move.destination":`目标位置:{path}`,"milkdown.placeholder":`输入 / 以使用命令...`,"milkdown.image.upload":`上传图片`,"milkdown.image.placeholder":`或粘贴图片链接...`,"milkdown.image.captionPlaceholder":`添加标题...`,"milkdown.group.basic":`基础`,"milkdown.group.list":`列表`,"milkdown.group.advanced":`高级`,"milkdown.block.text":`文本`,"milkdown.block.h1":`一级标题`,"milkdown.block.h2":`二级标题`,"milkdown.block.h3":`三级标题`,"milkdown.block.h4":`四级标题`,"milkdown.block.h5":`五级标题`,"milkdown.block.h6":`六级标题`,"milkdown.block.quote":`引用`,"milkdown.block.divider":`分割线`,"milkdown.block.bulletList":`无序列表`,"milkdown.block.orderedList":`有序列表`,"milkdown.block.taskList":`任务列表`,"milkdown.block.image":`图片`,"milkdown.block.codeBlock":`代码块`,"milkdown.block.table":`表格`,"milkdown.block.math":`数学公式`},C={"note.title":`筆記`,"note.count":`{count} 篇`,"note.listLabel":`筆記列表`,"note.root":`全部筆記`,"note.preview.encrypted":`私密內容已加密`,"note.preview.empty":`空白筆記`,"note.privacy.secret":`私密`,"note.privacy.public":`公開`,"note.mode.edit":`編輯模式`,"note.mode.read":`閱讀模式`,"note.search.placeholder":`搜尋筆記`,"note.empty.noMatches":`未找到筆記`,"note.empty.noNotes":`還沒有筆記`,"note.folder":`資料夾`,"note.newNote":`新筆記`,"note.namePlaceholder":`筆記名稱`,"note.untitled":`未命名筆記`,"note.editorLabel.edit":`筆記編輯器`,"note.editorLabel.read":`筆記閱讀器`,"note.noOpen.title":`沒有開啟的筆記`,"note.noOpen.select":`選擇一篇筆記繼續`,"note.noOpen.createFirst":`建立第一篇筆記`,"note.openList":`開啟筆記列表`,"note.loading":`載入中...`,"note.create.title":`新建筆記`,"note.create.action":`建立`,"note.delete.folderTitle":`刪除資料夾`,"note.delete.noteTitle":`刪除筆記`,"note.delete.message":`確定要刪除「{name}」嗎?此操作不可撤銷。`,"note.action.save":`儲存`,"note.action.saving":`儲存中`,"note.action.move":`移動`,"note.action.delete":`刪除`,"note.action.edit":`編輯`,"note.toast.notFound":`筆記不存在`,"note.toast.nameRequired":`請輸入筆記名稱`,"note.toast.saved":`筆記已儲存`,"note.toast.saveFailed":`儲存失敗`,"note.toast.created":`筆記已建立`,"note.toast.createFailed":`建立失敗`,"note.toast.renamed":`已重新命名`,"note.toast.renameFailed":`重新命名失敗`,"note.toast.moved":`已移動`,"note.toast.moveFailed":`移動失敗`,"note.toast.deleted":`已刪除`,"note.error.notFound":`筆記不存在`,"note.error.loginToDecrypt":`請先登入 Web3 帳號以解密此筆記`,"note.error.decryptFailed":`無法解密,請確認當前 Web3 帳號正確`,"note.error.nameRequired":`請輸入名稱`,"note.error.nameNoSlash":`名稱不能包含 /`,"note.error.nameNoBackslash":`名稱不能包含 \\\\`,"note.error.nameInvalid":`名稱無效`,"note.error.nameConflict":`目標位置已存在同名筆記`,"note.error.moveIntoSelf":`不能移動到自身子目錄`,"note.move.title":`移動筆記`,"note.move.moving":`正在移動`,"note.move.noFolders":`還沒有可選資料夾`,"note.move.pathPlaceholder":`或輸入新目錄路徑,如 文章/摘錄`,"note.move.destinationLabel":`目標位置:`,"note.move.destination":`目標位置:{path}`,"milkdown.placeholder":`輸入 / 以使用命令...`,"milkdown.image.upload":`上傳圖片`,"milkdown.image.placeholder":`或貼上圖片連結...`,"milkdown.image.captionPlaceholder":`新增標題...`,"milkdown.group.basic":`基礎`,"milkdown.group.list":`列表`,"milkdown.group.advanced":`高階`,"milkdown.block.text":`文字`,"milkdown.block.h1":`一級標題`,"milkdown.block.h2":`二級標題`,"milkdown.block.h3":`三級標題`,"milkdown.block.h4":`四級標題`,"milkdown.block.h5":`五級標題`,"milkdown.block.h6":`六級標題`,"milkdown.block.quote":`引用`,"milkdown.block.divider":`分割線`,"milkdown.block.bulletList":`無序列表`,"milkdown.block.orderedList":`有序列表`,"milkdown.block.taskList":`任務列表`,"milkdown.block.image":`圖片`,"milkdown.block.codeBlock":`程式碼塊`,"milkdown.block.table":`表格`,"milkdown.block.math":`數學公式`},w={"note.title":`Notes`,"note.count":`{count} notes`,"note.listLabel":`Note list`,"note.root":`All notes`,"note.preview.encrypted":`Private content is encrypted`,"note.preview.empty":`Blank note`,"note.privacy.secret":`Private`,"note.privacy.public":`Public`,"note.mode.edit":`Edit mode`,"note.mode.read":`Read mode`,"note.search.placeholder":`Search notes`,"note.empty.noMatches":`No notes found`,"note.empty.noNotes":`No notes yet`,"note.folder":`Folder`,"note.newNote":`New note`,"note.namePlaceholder":`Note name`,"note.untitled":`Untitled note`,"note.editorLabel.edit":`Note editor`,"note.editorLabel.read":`Note reader`,"note.noOpen.title":`No note open`,"note.noOpen.select":`Select a note to continue`,"note.noOpen.createFirst":`Create your first note`,"note.openList":`Open note list`,"note.loading":`Loading...`,"note.create.title":`New note`,"note.create.action":`Create`,"note.delete.folderTitle":`Delete folder`,"note.delete.noteTitle":`Delete note`,"note.delete.message":`Delete "{name}"? This cannot be undone.`,"note.action.save":`Save`,"note.action.saving":`Saving`,"note.action.move":`Move`,"note.action.delete":`Delete`,"note.action.edit":`Edit`,"note.toast.notFound":`Note not found`,"note.toast.nameRequired":`Enter a note name`,"note.toast.saved":`Note saved`,"note.toast.saveFailed":`Save failed`,"note.toast.created":`Note created`,"note.toast.createFailed":`Create failed`,"note.toast.renamed":`Renamed`,"note.toast.renameFailed":`Rename failed`,"note.toast.moved":`Moved`,"note.toast.moveFailed":`Move failed`,"note.toast.deleted":`Deleted`,"note.error.notFound":`Note not found`,"note.error.loginToDecrypt":`Sign in with a Web3 account to decrypt this note`,"note.error.decryptFailed":`Could not decrypt. Make sure the current Web3 account is correct.`,"note.error.nameRequired":`Enter a name`,"note.error.nameNoSlash":`Names cannot contain /`,"note.error.nameNoBackslash":`Names cannot contain \\`,"note.error.nameInvalid":`Invalid name`,"note.error.nameConflict":`A note with this name already exists there`,"note.error.moveIntoSelf":`Cannot move a folder into itself`,"note.move.title":`Move note`,"note.move.moving":`Moving`,"note.move.noFolders":`No folders available`,"note.move.pathPlaceholder":`Or enter a new folder path, e.g. Articles/Clips`,"note.move.destinationLabel":`Destination: `,"note.move.destination":`Destination: {path}`,"milkdown.placeholder":`Type / for commands...`,"milkdown.image.upload":`Upload image`,"milkdown.image.placeholder":`Or paste an image link...`,"milkdown.image.captionPlaceholder":`Add caption...`,"milkdown.group.basic":`Basic`,"milkdown.group.list":`List`,"milkdown.group.advanced":`Advanced`,"milkdown.block.text":`Text`,"milkdown.block.h1":`Heading 1`,"milkdown.block.h2":`Heading 2`,"milkdown.block.h3":`Heading 3`,"milkdown.block.h4":`Heading 4`,"milkdown.block.h5":`Heading 5`,"milkdown.block.h6":`Heading 6`,"milkdown.block.quote":`Quote`,"milkdown.block.divider":`Divider`,"milkdown.block.bulletList":`Bullet list`,"milkdown.block.orderedList":`Ordered list`,"milkdown.block.taskList":`Task list`,"milkdown.block.image":`Image`,"milkdown.block.codeBlock":`Code block`,"milkdown.block.table":`Table`,"milkdown.block.math":`Math`},T={"login.title":`登录`,"login.username.placeholder":`用户名`,"login.password.placeholder":`密码`,"login.preview":`登录`,"login.previewed":`检查地址`,"login.loading":`登录中`,"login.toast.signedIn":`已登录 {username}`,"login.error.credentialsRequired":`请输入用户名和密码`,"login.error.previewRequired":`请先预览并确认头像`,"login.error.failed":`登录失败`},E={"login.title":`登入`,"login.username.placeholder":`使用者名稱`,"login.password.placeholder":`密碼`,"login.preview":`登入`,"login.previewed":`檢查地址`,"login.loading":`登入中`,"login.toast.signedIn":`已登入 {username}`,"login.error.credentialsRequired":`請輸入使用者名稱和密碼`,"login.error.previewRequired":`請先預覽並確認頭像`,"login.error.failed":`登入失敗`},D={"login.title":`Sign in`,"login.username.placeholder":`Username`,"login.password.placeholder":`Password`,"login.preview":`Sign in`,"login.previewed":`Check address`,"login.loading":`Signing in`,"login.toast.signedIn":`Signed in as {username}`,"login.error.credentialsRequired":`Enter a username and password`,"login.error.previewRequired":`Preview and confirm the avatar first`,"login.error.failed":`Sign-in failed`},O={"web3.view.wallet":`Web3`,"web3.view.pem":`PEM 导出`,"web3.view.export":`Wallet 导出`,"web3.view.asymmetric":`非对称加密`,"web3.login.passwordOptional":`密码(可选)`,"web3.login.generating":`生成中...`,"web3.login.generateAndSignIn":`生成并登录`,"web3.toast.accountGenerated":`账号已生成`,"web3.error.accountsRequired":`请先生成 A 和 B 两个账号`,"web3.error.messageRequired":`请输入要加密的消息`,"web3.error.cipherRequired":`请先生成或粘贴密文`,"web3.error.decryptFailed":`解密失败,请确认发送方公钥、接收方私钥和密文匹配`,"web3.error.senderPublicRequired":`请输入发送方公钥`,"web3.error.recipientPrivateRequired":`请输入接收方私钥`,"web3.error.senderPrivateRequired":`请输入发送方私钥`,"web3.error.recipientPublicRequired":`请输入接收方公钥`,"web3.empty.pem":`请输入用户名和密码以生成 PEM 密钥`,"web3.empty.identity":`请输入用户名和密码以查看身份信息`,"web3.empty.walletTools":`请输入用户名和密码以使用钱包工具`,"web3.notSignedIn":`未登录`,"web3.action.view":`查看`,"web3.action.show":`显示`,"web3.action.hide":`隐藏`,"web3.action.showPrivateKey":`显示私钥`,"web3.action.hidePrivateKey":`隐藏私钥`,"web3.action.showAddressQr":`显示地址二维码`,"web3.action.hideAddressQr":`隐藏地址二维码`,"web3.action.showMnemonic":`显示助记词`,"web3.action.hideMnemonic":`隐藏助记词`,"web3.action.showMnemonicQr":`显示助记词二维码`,"web3.action.hideMnemonicQr":`隐藏助记词二维码`,"web3.action.deriveAddresses":`派生 {count} 个地址`,"web3.warning.mnemonic":`任何拥有您助记词的人都可以窃取您账户中的任何资产,切勿泄露!`,"web3.warning.privateKey":`任何拥有您私钥的人都可以窃取您地址中的任何资产,切勿泄露!`,"web3.label.account":`账户`,"web3.label.address":`地址`,"web3.label.ed25519Public":`Ed25519 公钥`,"web3.label.x25519Public":`x25519 公钥`,"web3.label.x25519Private":`x25519 私钥`,"web3.label.combinedPrivate":`x25519 & Ed25519 私钥`,"web3.label.privateKeyToggle":`私钥(点击{action})`,"web3.box.accountA":`A 账号`,"web3.box.accountB":`B 账号`,"web3.box.account.desc":`用户名和密码会确定性生成 x25519 密钥对。`,"web3.box.account.generate":`生成账号`,"web3.box.flowAB.desc":`加密使用 A 私钥 + B 公钥;解密使用 A 公钥 + B 私钥。`,"web3.box.flowAB.encrypt":`用 A 私钥 + B 公钥加密`,"web3.box.flowAB.decrypt":`用 A 公钥 + B 私钥解密`,"web3.box.flowAB.messagePlaceholder":`输入要从 A 发给 B 的消息`,"web3.box.flowBA.desc":`加密使用 B 私钥 + A 公钥;解密使用 B 公钥 + A 私钥。`,"web3.box.flowBA.encrypt":`用 B 私钥 + A 公钥加密`,"web3.box.flowBA.decrypt":`用 B 公钥 + A 私钥解密`,"web3.box.flowBA.messagePlaceholder":`输入要从 B 发给 A 的消息`,"web3.box.cipherPlaceholder":`加密后生成密文,或粘贴已有密文`,"web3.box.plaintext":`明文`,"web3.box.ciphertext":`密文`,"web3.box.decryptResult":`解密结果`,"web3.box.decryptResultPlaceholder":`解密成功后显示明文`,"web3.box.timestamp":`时间戳`,"web3.box.nonce":`随机数`,"web3.box.encryptTitle":`加密`,"web3.box.encryptDesc":`只输入发送方私钥和接收方公钥即可加密,无需生成完整账号。`,"web3.box.decryptTitle":`解密`,"web3.box.decryptDesc":`只输入发送方公钥和接收方私钥即可解密,无需生成完整账号。`,"web3.box.sender":`发送方`,"web3.box.recipient":`接收方`,"web3.box.senderPrivatePlaceholder":`发送方 x25519 私钥`,"web3.box.senderPublicPlaceholder":`发送方 x25519 公钥`,"web3.box.recipientPrivatePlaceholder":`接收方 x25519 私钥`,"web3.box.recipientPublicPlaceholder":`接收方 x25519 公钥`,"web3.box.messagePlaceholder":`输入要加密的消息`,"web3.box.encryptResultPlaceholder":`加密成功后显示密文`,"web3.box.cipherDecryptPlaceholder":`粘贴要解密的密文`},k={"web3.view.wallet":`Web3`,"web3.view.pem":`PEM 匯出`,"web3.view.export":`Wallet 匯出`,"web3.view.asymmetric":`非對稱加密`,"web3.login.passwordOptional":`密碼(可選)`,"web3.login.generating":`生成中...`,"web3.login.generateAndSignIn":`生成並登入`,"web3.toast.accountGenerated":`帳號已生成`,"web3.error.accountsRequired":`請先生成 A 和 B 兩個帳號`,"web3.error.messageRequired":`請輸入要加密的訊息`,"web3.error.cipherRequired":`請先生成或貼上密文`,"web3.error.decryptFailed":`解密失敗,請確認傳送方公鑰、接收方私鑰和密文匹配`,"web3.error.senderPublicRequired":`請輸入傳送方公鑰`,"web3.error.recipientPrivateRequired":`請輸入接收方私鑰`,"web3.error.senderPrivateRequired":`請輸入傳送方私鑰`,"web3.error.recipientPublicRequired":`請輸入接收方公鑰`,"web3.empty.pem":`請輸入使用者名稱和密碼以生成 PEM 金鑰`,"web3.empty.identity":`請輸入使用者名稱和密碼以檢視身份資訊`,"web3.empty.walletTools":`請輸入使用者名稱和密碼以使用錢包工具`,"web3.notSignedIn":`未登入`,"web3.action.view":`檢視`,"web3.action.show":`顯示`,"web3.action.hide":`隱藏`,"web3.action.showPrivateKey":`顯示私鑰`,"web3.action.hidePrivateKey":`隱藏私鑰`,"web3.action.showAddressQr":`顯示地址二維碼`,"web3.action.hideAddressQr":`隱藏地址二維碼`,"web3.action.showMnemonic":`顯示助記詞`,"web3.action.hideMnemonic":`隱藏助記詞`,"web3.action.showMnemonicQr":`顯示助記詞二維碼`,"web3.action.hideMnemonicQr":`隱藏助記詞二維碼`,"web3.action.deriveAddresses":`派生 {count} 個地址`,"web3.warning.mnemonic":`任何擁有您助記詞的人都可以竊取您帳戶中的任何資產,切勿洩露!`,"web3.warning.privateKey":`任何擁有您私鑰的人都可以竊取您地址中的任何資產,切勿洩露!`,"web3.label.account":`帳戶`,"web3.label.address":`地址`,"web3.label.ed25519Public":`Ed25519 公鑰`,"web3.label.x25519Public":`x25519 公鑰`,"web3.label.x25519Private":`x25519 私鑰`,"web3.label.combinedPrivate":`x25519 & Ed25519 私鑰`,"web3.label.privateKeyToggle":`私鑰(點選{action})`,"web3.box.accountA":`A 帳號`,"web3.box.accountB":`B 帳號`,"web3.box.account.desc":`使用者名稱和密碼會確定性生成 x25519 金鑰對。`,"web3.box.account.generate":`生成帳號`,"web3.box.flowAB.desc":`加密使用 A 私鑰 + B 公鑰;解密使用 A 公鑰 + B 私鑰。`,"web3.box.flowAB.encrypt":`用 A 私鑰 + B 公鑰加密`,"web3.box.flowAB.decrypt":`用 A 公鑰 + B 私鑰解密`,"web3.box.flowAB.messagePlaceholder":`輸入要從 A 發給 B 的訊息`,"web3.box.flowBA.desc":`加密使用 B 私鑰 + A 公鑰;解密使用 B 公鑰 + A 私鑰。`,"web3.box.flowBA.encrypt":`用 B 私鑰 + A 公鑰加密`,"web3.box.flowBA.decrypt":`用 B 公鑰 + A 私鑰解密`,"web3.box.flowBA.messagePlaceholder":`輸入要從 B 發給 A 的訊息`,"web3.box.cipherPlaceholder":`加密後生成密文,或貼上已有密文`,"web3.box.plaintext":`明文`,"web3.box.ciphertext":`密文`,"web3.box.decryptResult":`解密結果`,"web3.box.decryptResultPlaceholder":`解密成功後顯示明文`,"web3.box.timestamp":`時間戳`,"web3.box.nonce":`隨機數`,"web3.box.encryptTitle":`加密`,"web3.box.encryptDesc":`只輸入傳送方私鑰和接收方公鑰即可加密,無需生成完整帳號。`,"web3.box.decryptTitle":`解密`,"web3.box.decryptDesc":`只輸入傳送方公鑰和接收方私鑰即可解密,無需生成完整帳號。`,"web3.box.sender":`傳送方`,"web3.box.recipient":`接收方`,"web3.box.senderPrivatePlaceholder":`傳送方 x25519 私鑰`,"web3.box.senderPublicPlaceholder":`傳送方 x25519 公鑰`,"web3.box.recipientPrivatePlaceholder":`接收方 x25519 私鑰`,"web3.box.recipientPublicPlaceholder":`接收方 x25519 公鑰`,"web3.box.messagePlaceholder":`輸入要加密的訊息`,"web3.box.encryptResultPlaceholder":`加密成功後顯示密文`,"web3.box.cipherDecryptPlaceholder":`貼上要解密的密文`},A={"web3.view.wallet":`Web3`,"web3.view.pem":`PEM export`,"web3.view.export":`Wallet export`,"web3.view.asymmetric":`Asymmetric encryption`,"web3.login.passwordOptional":`Password (optional)`,"web3.login.generating":`Generating...`,"web3.login.generateAndSignIn":`Generate and sign in`,"web3.toast.accountGenerated":`Account generated`,"web3.error.accountsRequired":`Generate both A and B accounts first`,"web3.error.messageRequired":`Enter a message to encrypt`,"web3.error.cipherRequired":`Generate or paste ciphertext first`,"web3.error.decryptFailed":`Decrypt failed. Check the sender public key, recipient private key, and ciphertext.`,"web3.error.senderPublicRequired":`Enter the sender public key`,"web3.error.recipientPrivateRequired":`Enter the recipient private key`,"web3.error.senderPrivateRequired":`Enter the sender private key`,"web3.error.recipientPublicRequired":`Enter the recipient public key`,"web3.empty.pem":`Enter a username and password to generate PEM keys`,"web3.empty.identity":`Enter a username and password to view identity info`,"web3.empty.walletTools":`Enter a username and password to use wallet tools`,"web3.notSignedIn":`Not signed in`,"web3.action.view":`View`,"web3.action.show":`show`,"web3.action.hide":`hide`,"web3.action.showPrivateKey":`Show private key`,"web3.action.hidePrivateKey":`Hide private key`,"web3.action.showAddressQr":`Show address QR`,"web3.action.hideAddressQr":`Hide address QR`,"web3.action.showMnemonic":`Show mnemonic`,"web3.action.hideMnemonic":`Hide mnemonic`,"web3.action.showMnemonicQr":`Show mnemonic QR`,"web3.action.hideMnemonicQr":`Hide mnemonic QR`,"web3.action.deriveAddresses":`Derive {count} addresses`,"web3.warning.mnemonic":`Anyone with your mnemonic can steal assets from your account. Never disclose it.`,"web3.warning.privateKey":`Anyone with your private key can steal assets from your address. Never disclose it.`,"web3.label.account":`Account`,"web3.label.address":`Address`,"web3.label.ed25519Public":`Ed25519 public key`,"web3.label.x25519Public":`x25519 public key`,"web3.label.x25519Private":`x25519 private key`,"web3.label.combinedPrivate":`x25519 & Ed25519 private key`,"web3.label.privateKeyToggle":`Private key (click to {action})`,"web3.box.accountA":`Account A`,"web3.box.accountB":`Account B`,"web3.box.account.desc":`The username and password deterministically generate an x25519 key pair.`,"web3.box.account.generate":`Generate account`,"web3.box.flowAB.desc":`Encrypt with A private key + B public key. Decrypt with A public key + B private key.`,"web3.box.flowAB.encrypt":`Encrypt with A private + B public`,"web3.box.flowAB.decrypt":`Decrypt with A public + B private`,"web3.box.flowAB.messagePlaceholder":`Message from A to B`,"web3.box.flowBA.desc":`Encrypt with B private key + A public key. Decrypt with B public key + A private key.`,"web3.box.flowBA.encrypt":`Encrypt with B private + A public`,"web3.box.flowBA.decrypt":`Decrypt with B public + A private`,"web3.box.flowBA.messagePlaceholder":`Message from B to A`,"web3.box.cipherPlaceholder":`Ciphertext appears after encryption, or paste existing ciphertext`,"web3.box.plaintext":`Plaintext`,"web3.box.ciphertext":`Ciphertext`,"web3.box.decryptResult":`Decrypted result`,"web3.box.decryptResultPlaceholder":`Plaintext appears after decryption`,"web3.box.timestamp":`Timestamp`,"web3.box.nonce":`Nonce`,"web3.box.encryptTitle":`Encrypt`,"web3.box.encryptDesc":`Encrypt with only the sender private key and recipient public key. A full account is not required.`,"web3.box.decryptTitle":`Decrypt`,"web3.box.decryptDesc":`Decrypt with only the sender public key and recipient private key. A full account is not required.`,"web3.box.sender":`Sender`,"web3.box.recipient":`Recipient`,"web3.box.senderPrivatePlaceholder":`Sender x25519 private key`,"web3.box.senderPublicPlaceholder":`Sender x25519 public key`,"web3.box.recipientPrivatePlaceholder":`Recipient x25519 private key`,"web3.box.recipientPublicPlaceholder":`Recipient x25519 public key`,"web3.box.messagePlaceholder":`Enter a message to encrypt`,"web3.box.encryptResultPlaceholder":`Ciphertext appears after encryption`,"web3.box.cipherDecryptPlaceholder":`Paste ciphertext to decrypt`},j={"game.gandengyan.title":`干瞪眼`,"game.zhajinhua.title":`炸金花`,"game.toast.joinedRoom":`已进入房间`,"game.toast.roomCreated":`房间已创建`,"game.action.shareRoom":`分享房间`,"game.action.createRoom":`创建房间`,"game.action.joinRoom":`加入房间`,"game.action.startRound":`开始本局`,"game.action.nextRound":`再来一局`,"game.hero.desc":`创建房间码邀请朋友加入,房间状态通过 MostBox P2P 频道同步。`,"game.currentAccount":`当前账号`,"game.roomCode":`房间号`,"game.roomCode.placeholder":`输入房间号`,"game.room.error.readLog":`无法读取房间记录`,"game.room.error.invalidCode":`请输入 4-8 位房间码`,"game.room.error.createFailed":`创建房间失败`,"game.room.error.joinFailed":`进入房间失败`,"game.room.error.sendEventFailed":`发送房间事件失败`,"game.status.nodeConnected":`节点已连接`,"game.status.nodeConnecting":`正在连接节点...`,"game.status.playing":`进行中`,"game.status.finished":`本局结束`,"game.status.waitingStart":`等待开局`,"game.status.title":`状态`,"game.actions":`操作`,"game.waitingHost":`等待房主开始或继续牌局。`,"game.waitingPlayers":`等待玩家加入`,"game.host":`房主`,"game.round":`本轮`,"game.hint":`提示`,"game.player":`玩家`,"game.card":`牌`,"game.roomLabel":`房间 {room}`,"game.status.online":`在线`,"game.status.offline":`离线`,"game.toast.playerLeft":`{player} 已退出房间`,"game.gandengyan.mark":`干`,"game.gandengyan.hero.title":`干瞪眼牌桌`,"game.gandengyan.speech.gameOver":`游戏结束`,"game.gandengyan.error.playFailed":`出牌失败`,"game.gandengyan.error.actionFailed":`操作失败`,"game.gandengyan.deck":`牌堆`,"game.gandengyan.tablePlay":`{player} 出 {combo}`,"game.gandengyan.waitingLead":`等待领出`,"game.gandengyan.baseScore":`底分`,"game.gandengyan.result.winnerGain":`{player} 获胜,赢 {score} 分`,"game.gandengyan.result.bombCount":`({count} 个炸弹)`,"game.gandengyan.result.sealedLoss":`{player}(封牌)扣 {loss} 分`,"game.gandengyan.result.cardsLeftLoss":`{player} 剩 {cards} 张,扣 {loss} 分`,"game.gandengyan.result.winner":`{player} 获胜`,"game.gandengyan.status.yourTurn":`轮到你出牌`,"game.gandengyan.roundPanel":`牌局`,"game.gandengyan.score":`分数`,"game.gandengyan.bombCount":`炸弹 {count} 次`,"game.gandengyan.discardCount":`弃牌 {count} 张`,"game.gandengyan.log":`牌局记录`,"game.gandengyan.invalidCombo":`牌型不合法`,"game.gandengyan.selectCards":`先选牌`,"game.gandengyan.jokerOrderHint":`按选择顺序解释大小王`,"game.gandengyan.action.play":`出牌`,"game.gandengyan.action.pass":`不要`,"game.gandengyan.handCount":`{count} 张`,"game.gandengyan.position.seat":`座位 {seat}`,"game.gandengyan.position.me":`我`,"game.gandengyan.position.opponent":`对手位`,"game.gandengyan.position.nextOpponent":`下家/对手位`,"game.gandengyan.position.prevOpponent":`上家/对手位`,"game.gandengyan.position.partner":`对家/队友位`,"game.gandengyan.position.seatPartner":`座位 {seat}/队友位`,"game.gandengyan.position.seatOpponent":`座位 {seat}/对手位`,"game.zhajinhua.hero.title":`炸金花牌桌`,"game.zhajinhua.toast.roundStarted":`新一局已开始`,"game.zhajinhua.error.notEnoughPlayers":`至少需要 2 名有足够筹码的玩家`,"game.zhajinhua.error.startFailed":`开局失败`,"game.zhajinhua.error.tooManyLowChips":`筹码不足的玩家太多,无法开局`,"game.zhajinhua.status.yourTurn":`轮到你操作`,"game.zhajinhua.status.waitingPlayer":`等待 {player}`,"game.zhajinhua.result.winChips":`{player} 赢得 {amount} 筹码`,"game.zhajinhua.result.winner":`{player} 胜出`,"game.zhajinhua.pot":`底池`,"game.zhajinhua.currentBet":`当前注 {amount}`,"game.zhajinhua.chips":`{amount} 筹码`,"game.zhajinhua.player.folded":`已弃牌`,"game.zhajinhua.player.looked":`已看牌`,"game.zhajinhua.player.inRound":`在局中`,"game.zhajinhua.myHand":`我的手牌`,"game.zhajinhua.myChips":`我的筹码`,"game.zhajinhua.hand.unlooked":`未看牌`,"game.zhajinhua.hand.waitingDeal":`等待房主发牌`,"game.zhajinhua.action.look":`看牌`,"game.zhajinhua.action.call":`跟注`,"game.zhajinhua.action.fold":`弃牌`,"game.zhajinhua.action.raiseOption":`加 {amount}`,"game.zhajinhua.action.raise":`加注`,"game.zhajinhua.action.comparePlaceholder":`选择比牌对象`,"game.zhajinhua.action.compare":`比牌`,"game.zhajinhua.compareResult":`比牌结果`},M={"game.gandengyan.title":`乾瞪眼`,"game.zhajinhua.title":`炸金花`,"game.toast.joinedRoom":`已進入房間`,"game.toast.roomCreated":`房間已建立`,"game.action.shareRoom":`分享房間`,"game.action.createRoom":`建立房間`,"game.action.joinRoom":`加入房間`,"game.action.startRound":`開始本局`,"game.action.nextRound":`再來一局`,"game.hero.desc":`建立房間碼邀請朋友加入,房間狀態通過 MostBox P2P 頻道同步。`,"game.currentAccount":`當前帳號`,"game.roomCode":`房間號`,"game.roomCode.placeholder":`輸入房間號`,"game.room.error.readLog":`無法讀取房間記錄`,"game.room.error.invalidCode":`請輸入 4-8 位房間碼`,"game.room.error.createFailed":`建立房間失敗`,"game.room.error.joinFailed":`進入房間失敗`,"game.room.error.sendEventFailed":`傳送房間事件失敗`,"game.status.nodeConnected":`節點已連線`,"game.status.nodeConnecting":`正在連線節點...`,"game.status.playing":`進行中`,"game.status.finished":`本局結束`,"game.status.waitingStart":`等待開局`,"game.status.title":`狀態`,"game.actions":`操作`,"game.waitingHost":`等待房主開始或繼續牌局。`,"game.waitingPlayers":`等待玩家加入`,"game.host":`房主`,"game.round":`本輪`,"game.hint":`提示`,"game.player":`玩家`,"game.card":`牌`,"game.roomLabel":`房間 {room}`,"game.status.online":`線上`,"game.status.offline":`離線`,"game.toast.playerLeft":`{player} 已退出房間`,"game.gandengyan.mark":`幹`,"game.gandengyan.hero.title":`乾瞪眼牌桌`,"game.gandengyan.speech.gameOver":`遊戲結束`,"game.gandengyan.error.playFailed":`出牌失敗`,"game.gandengyan.error.actionFailed":`操作失敗`,"game.gandengyan.deck":`牌堆`,"game.gandengyan.tablePlay":`{player} 出 {combo}`,"game.gandengyan.waitingLead":`等待領出`,"game.gandengyan.baseScore":`底分`,"game.gandengyan.result.winnerGain":`{player} 獲勝,贏 {score} 分`,"game.gandengyan.result.bombCount":`({count} 個炸彈)`,"game.gandengyan.result.sealedLoss":`{player}(封牌)扣 {loss} 分`,"game.gandengyan.result.cardsLeftLoss":`{player} 剩 {cards} 張,扣 {loss} 分`,"game.gandengyan.result.winner":`{player} 獲勝`,"game.gandengyan.status.yourTurn":`輪到你出牌`,"game.gandengyan.roundPanel":`牌局`,"game.gandengyan.score":`分數`,"game.gandengyan.bombCount":`炸彈 {count} 次`,"game.gandengyan.discardCount":`棄牌 {count} 張`,"game.gandengyan.log":`牌局記錄`,"game.gandengyan.invalidCombo":`牌型不合法`,"game.gandengyan.selectCards":`先選牌`,"game.gandengyan.jokerOrderHint":`按選擇順序解釋大小王`,"game.gandengyan.action.play":`出牌`,"game.gandengyan.action.pass":`不要`,"game.gandengyan.handCount":`{count} 張`,"game.gandengyan.position.seat":`座位 {seat}`,"game.gandengyan.position.me":`我`,"game.gandengyan.position.opponent":`對手位`,"game.gandengyan.position.nextOpponent":`下家/對手位`,"game.gandengyan.position.prevOpponent":`上家/對手位`,"game.gandengyan.position.partner":`對家/隊友位`,"game.gandengyan.position.seatPartner":`座位 {seat}/隊友位`,"game.gandengyan.position.seatOpponent":`座位 {seat}/對手位`,"game.zhajinhua.hero.title":`炸金花牌桌`,"game.zhajinhua.toast.roundStarted":`新一局已開始`,"game.zhajinhua.error.notEnoughPlayers":`至少需要 2 名有足夠籌碼的玩家`,"game.zhajinhua.error.startFailed":`開局失敗`,"game.zhajinhua.error.tooManyLowChips":`籌碼不足的玩家太多,無法開局`,"game.zhajinhua.status.yourTurn":`輪到你操作`,"game.zhajinhua.status.waitingPlayer":`等待 {player}`,"game.zhajinhua.result.winChips":`{player} 贏得 {amount} 籌碼`,"game.zhajinhua.result.winner":`{player} 勝出`,"game.zhajinhua.pot":`底池`,"game.zhajinhua.currentBet":`當前注 {amount}`,"game.zhajinhua.chips":`{amount} 籌碼`,"game.zhajinhua.player.folded":`已棄牌`,"game.zhajinhua.player.looked":`已看牌`,"game.zhajinhua.player.inRound":`在局中`,"game.zhajinhua.myHand":`我的手牌`,"game.zhajinhua.myChips":`我的籌碼`,"game.zhajinhua.hand.unlooked":`未看牌`,"game.zhajinhua.hand.waitingDeal":`等待房主發牌`,"game.zhajinhua.action.look":`看牌`,"game.zhajinhua.action.call":`跟注`,"game.zhajinhua.action.fold":`棄牌`,"game.zhajinhua.action.raiseOption":`加 {amount}`,"game.zhajinhua.action.raise":`加註`,"game.zhajinhua.action.comparePlaceholder":`選擇比牌物件`,"game.zhajinhua.action.compare":`比牌`,"game.zhajinhua.compareResult":`比牌結果`},N={"game.gandengyan.title":`Gan Deng Yan`,"game.zhajinhua.title":`Zha Jin Hua`,"game.toast.joinedRoom":`Joined room`,"game.toast.roomCreated":`Room created`,"game.action.shareRoom":`Share room`,"game.action.createRoom":`Create room`,"game.action.joinRoom":`Join room`,"game.action.startRound":`Start round`,"game.action.nextRound":`Next round`,"game.hero.desc":`Create a room code and invite friends. Room state syncs through the MostBox P2P channel.`,"game.currentAccount":`Current account`,"game.roomCode":`Room code`,"game.roomCode.placeholder":`Enter room code`,"game.room.error.readLog":`Failed to read room log`,"game.room.error.invalidCode":`Enter a 4-8 character room code`,"game.room.error.createFailed":`Failed to create room`,"game.room.error.joinFailed":`Failed to join room`,"game.room.error.sendEventFailed":`Failed to send room event`,"game.status.nodeConnected":`Node connected`,"game.status.nodeConnecting":`Connecting node...`,"game.status.playing":`In progress`,"game.status.finished":`Round finished`,"game.status.waitingStart":`Waiting to start`,"game.status.title":`Status`,"game.actions":`Actions`,"game.waitingHost":`Waiting for the host to start or continue.`,"game.waitingPlayers":`Waiting for players`,"game.host":`Host`,"game.round":`Round`,"game.hint":`Hint`,"game.player":`Player`,"game.card":`cards`,"game.roomLabel":`Room {room}`,"game.status.online":`Online`,"game.status.offline":`Offline`,"game.toast.playerLeft":`{player} left the room`,"game.gandengyan.mark":`G`,"game.gandengyan.hero.title":`Gan Deng Yan table`,"game.gandengyan.speech.gameOver":`Game over`,"game.gandengyan.error.playFailed":`Failed to play cards`,"game.gandengyan.error.actionFailed":`Action failed`,"game.gandengyan.deck":`Deck`,"game.gandengyan.tablePlay":`{player} played {combo}`,"game.gandengyan.waitingLead":`Waiting for lead`,"game.gandengyan.baseScore":`Base score`,"game.gandengyan.result.winnerGain":`{player} wins {score} points`,"game.gandengyan.result.bombCount":` ({count} bombs)`,"game.gandengyan.result.sealedLoss":`{player} sealed, loses {loss} points`,"game.gandengyan.result.cardsLeftLoss":`{player} has {cards} cards left, loses {loss} points`,"game.gandengyan.result.winner":`{player} wins`,"game.gandengyan.status.yourTurn":`Your turn to play`,"game.gandengyan.roundPanel":`Round`,"game.gandengyan.score":`Score`,"game.gandengyan.bombCount":`{count} bombs`,"game.gandengyan.discardCount":`{count} discarded`,"game.gandengyan.log":`Round log`,"game.gandengyan.invalidCombo":`Invalid combo`,"game.gandengyan.selectCards":`Select cards first`,"game.gandengyan.jokerOrderHint":`Jokers are interpreted in the selected order`,"game.gandengyan.action.play":`Play`,"game.gandengyan.action.pass":`Pass`,"game.gandengyan.handCount":`{count} cards`,"game.gandengyan.position.seat":`Seat {seat}`,"game.gandengyan.position.me":`Me`,"game.gandengyan.position.opponent":`Opponent`,"game.gandengyan.position.nextOpponent":`Next / opponent`,"game.gandengyan.position.prevOpponent":`Previous / opponent`,"game.gandengyan.position.partner":`Across / partner`,"game.gandengyan.position.seatPartner":`Seat {seat} / partner`,"game.gandengyan.position.seatOpponent":`Seat {seat} / opponent`,"game.zhajinhua.hero.title":`Zha Jin Hua table`,"game.zhajinhua.toast.roundStarted":`New round started`,"game.zhajinhua.error.notEnoughPlayers":`At least 2 players with enough chips are required`,"game.zhajinhua.error.startFailed":`Failed to start round`,"game.zhajinhua.error.tooManyLowChips":`Too many players are short on chips to start`,"game.zhajinhua.status.yourTurn":`Your turn`,"game.zhajinhua.status.waitingPlayer":`Waiting for {player}`,"game.zhajinhua.result.winChips":`{player} won {amount} chips`,"game.zhajinhua.result.winner":`{player} wins`,"game.zhajinhua.pot":`Pot`,"game.zhajinhua.currentBet":`Current bet {amount}`,"game.zhajinhua.chips":`{amount} chips`,"game.zhajinhua.player.folded":`Folded`,"game.zhajinhua.player.looked":`Looked`,"game.zhajinhua.player.inRound":`In round`,"game.zhajinhua.myHand":`My hand`,"game.zhajinhua.myChips":`My chips`,"game.zhajinhua.hand.unlooked":`Not looked`,"game.zhajinhua.hand.waitingDeal":`Waiting for host to deal`,"game.zhajinhua.action.look":`Look`,"game.zhajinhua.action.call":`Call`,"game.zhajinhua.action.fold":`Fold`,"game.zhajinhua.action.raiseOption":`Raise {amount}`,"game.zhajinhua.action.raise":`Raise`,"game.zhajinhua.action.comparePlaceholder":`Choose compare target`,"game.zhajinhua.action.compare":`Compare`,"game.zhajinhua.compareResult":`Compare result`},P={"admin.title":`节点管理`,"admin.status.online":`在线`,"admin.status.waiting":`等待`,"admin.action.refresh":`刷新`,"admin.action.copyNodeId":`复制节点 ID`,"admin.action.clear":`清除`,"admin.action.saveConfig":`保存配置`,"admin.action.exportDiagnostics":`导出诊断`,"admin.action.clearLogs":`清空日志`,"admin.toast.backendChecking":`正在检测后端连接,请稍后再试`,"admin.toast.backendDisconnected":`未连接后端`,"admin.toast.statusRefreshed":`节点状态已刷新`,"admin.toast.configSavedRestart":`节点配置已保存。修改了数据目录,需要重启 daemon 生效。`,"admin.toast.configSaved":`节点配置已保存`,"admin.toast.nodeIdCopied":`节点 ID 已复制`,"admin.toast.logsCleared":`节点日志已清空`,"admin.toast.diagnosticsExported":`诊断已导出`,"admin.toast.userDataCleared":`用户数据已清除`,"admin.error.readStatus":`无法读取节点状态`,"admin.error.saveConfig":`保存配置失败`,"admin.error.clearLogs":`清空日志失败`,"admin.error.exportDiagnostics":`导出诊断失败`,"admin.error.clearUserData":`清除用户数据失败`,"admin.error.localDaemonDisconnected":`未连接本地 daemon`,"admin.remoteUnavailable.title":`远程节点管理不可用`,"admin.remoteUnavailable.desc":`当前连接的是别人部署的远程节点,普通邀请码不能查看或修改节点管理数据。`,"admin.confirm.clearUserData":`确定清除用户 {address} 的文件记录和回收站吗?无人引用的副本也会被清理。`,"admin.metric.nodeId":`节点 ID`,"admin.metric.connections":`连接`,"admin.metric.peers":`{count} peers`,"admin.metric.capacity":`容量`,"admin.metric.uptime":`运行`,"admin.uptime.daysHours":`{days} 天 {hours} 小时`,"admin.uptime.hoursMinutes":`{hours} 小时 {minutes} 分钟`,"admin.uptime.minutes":`{minutes} 分钟`,"admin.nodeStatus.title":`节点状态`,"admin.nodeStatus.version":`版本`,"admin.nodeStatus.listen":`监听`,"admin.nodeStatus.dataPath":`数据目录`,"admin.userData.title":`用户数据`,"admin.userData.user":`用户`,"admin.userData.files":`文件`,"admin.userData.trash":`回收站`,"admin.userData.actions":`操作`,"admin.userData.empty":`暂无用户数据`,"admin.settings.title":`节点设置`,"admin.settings.dataPath":`数据目录`,"admin.settings.capacityGiB":`容量上限 GiB`,"admin.settings.maxFileSizeGiB":`单文件最大 GiB`,"admin.settings.remoteInvites":`远程访问邀请码`,"admin.settings.remoteInvitesPlaceholder":`每行一个,或用英文逗号分隔`,"admin.settings.hint":`数据目录变更保存后需要重启 daemon。修改邀请码后新请求立即生效。发布和下载成功后会固定做种;MostBox 不设同时做种数或传输限速。`,"admin.holdings.title":`持有副本`,"admin.holdings.hiddenCount":`当前仅展示前 100 个副本,另有 {count} 个仍在后台做种。`,"admin.holdings.file":`文件`,"admin.holdings.size":`大小`,"admin.holdings.peers":`Peer`,"admin.holdings.topicJoined":`Topic join`,"admin.holdings.lastServed":`最近服务`,"admin.holdings.totalServed":`累计服务`,"admin.holdings.status":`状态`,"admin.holdings.joinedYes":`已 join`,"admin.holdings.joinedNo":`未 join`,"admin.holdings.empty":`暂无持有副本`,"admin.seedHelp.label":`做种状态说明`,"admin.seedHelp.active.label":`做种中`,"admin.seedHelp.active.desc":`已加入 CID topic,可被其他节点发现并提供完整副本。`,"admin.seedHelp.pending.label":`队列中 / 加入中`,"admin.seedHelp.pending.desc":`正在等待或重连 topic,通常会自动进入做种中。`,"admin.seedHelp.paused.label":`已暂停 / 未 join`,"admin.seedHelp.paused.desc":`本机仍持有文件,但当前不会对外提供下载。`,"admin.seedHelp.error.label":`错误`,"admin.seedHelp.error.desc":`加入或做种失败,请查看下方节点日志里的 seed 事件。`,"admin.seedStatus.queued":`队列中`,"admin.seedStatus.joining":`加入中`,"admin.seedStatus.active":`做种中`,"admin.seedStatus.paused":`已暂停`,"admin.seedStatus.error":`错误`,"admin.seedStatus.errorWithMessage":`错误:{message}`,"admin.seedStatus.notJoined":`未 join`,"admin.time.never":`从未`,"admin.time.justNow":`刚刚`,"admin.logs.title":`节点日志`,"admin.logs.filterLabel":`日志筛选`,"admin.logs.empty":`暂无日志`,"admin.logFilter.all":`全部`,"admin.logFilter.join":`Join`,"admin.logFilter.pull":`Pull`,"admin.logFilter.verify":`Verify`,"admin.logFilter.serve":`Serve`,"admin.logFilter.error":`Error`},F={"admin.title":`節點管理`,"admin.status.online":`線上`,"admin.status.waiting":`等待`,"admin.action.refresh":`重新整理`,"admin.action.copyNodeId":`複製節點 ID`,"admin.action.clear":`清除`,"admin.action.saveConfig":`儲存設定`,"admin.action.exportDiagnostics":`匯出診斷`,"admin.action.clearLogs":`清空日誌`,"admin.toast.backendChecking":`正在檢測後端連線,請稍後再試`,"admin.toast.backendDisconnected":`未連線後端`,"admin.toast.statusRefreshed":`節點狀態已重新整理`,"admin.toast.configSavedRestart":`節點設定已儲存。修改了資料目錄,需要重啟 daemon 生效。`,"admin.toast.configSaved":`節點設定已儲存`,"admin.toast.nodeIdCopied":`節點 ID 已複製`,"admin.toast.logsCleared":`節點日誌已清空`,"admin.toast.diagnosticsExported":`診斷已匯出`,"admin.toast.userDataCleared":`使用者資料已清除`,"admin.error.readStatus":`無法讀取節點狀態`,"admin.error.saveConfig":`儲存設定失敗`,"admin.error.clearLogs":`清空日誌失敗`,"admin.error.exportDiagnostics":`匯出診斷失敗`,"admin.error.clearUserData":`清除使用者資料失敗`,"admin.error.localDaemonDisconnected":`未連線本機 daemon`,"admin.remoteUnavailable.title":`遠端節點管理不可用`,"admin.remoteUnavailable.desc":`當前連線的是別人部署的遠端節點,普通邀請碼不能檢視或修改節點管理資料。`,"admin.confirm.clearUserData":`確定清除使用者 {address} 的檔案記錄和垃圾桶嗎?無人引用的副本也會被清理。`,"admin.metric.nodeId":`節點 ID`,"admin.metric.connections":`連線`,"admin.metric.peers":`{count} peers`,"admin.metric.capacity":`容量`,"admin.metric.uptime":`執行`,"admin.uptime.daysHours":`{days} 天 {hours} 小時`,"admin.uptime.hoursMinutes":`{hours} 小時 {minutes} 分鐘`,"admin.uptime.minutes":`{minutes} 分鐘`,"admin.nodeStatus.title":`節點狀態`,"admin.nodeStatus.version":`版本`,"admin.nodeStatus.listen":`監聽`,"admin.nodeStatus.dataPath":`資料目錄`,"admin.userData.title":`使用者資料`,"admin.userData.user":`使用者`,"admin.userData.files":`檔案`,"admin.userData.trash":`垃圾桶`,"admin.userData.actions":`操作`,"admin.userData.empty":`暫無使用者資料`,"admin.settings.title":`節點設定`,"admin.settings.dataPath":`資料目錄`,"admin.settings.capacityGiB":`容量上限 GiB`,"admin.settings.maxFileSizeGiB":`單檔案最大 GiB`,"admin.settings.remoteInvites":`遠端訪問邀請碼`,"admin.settings.remoteInvitesPlaceholder":`每行一個,或用英文逗號分隔`,"admin.settings.hint":`資料目錄變更儲存後需要重啟 daemon。修改邀請碼後新請求立即生效。發布和下載成功後會固定做種;MostBox 不設同時做種數或傳輸限速。`,"admin.holdings.title":`持有副本`,"admin.holdings.hiddenCount":`當前僅展示前 100 個副本,另有 {count} 個仍在後臺做種。`,"admin.holdings.file":`檔案`,"admin.holdings.size":`大小`,"admin.holdings.peers":`Peer`,"admin.holdings.topicJoined":`Topic join`,"admin.holdings.lastServed":`最近服務`,"admin.holdings.totalServed":`累計服務`,"admin.holdings.status":`狀態`,"admin.holdings.joinedYes":`已 join`,"admin.holdings.joinedNo":`未 join`,"admin.holdings.empty":`暫無持有副本`,"admin.seedHelp.label":`做種狀態說明`,"admin.seedHelp.active.label":`做種中`,"admin.seedHelp.active.desc":`已加入 CID topic,可被其他節點發現並提供完整副本。`,"admin.seedHelp.pending.label":`佇列中 / 加入中`,"admin.seedHelp.pending.desc":`正在等待或重連 topic,通常會自動進入做種中。`,"admin.seedHelp.paused.label":`已暫停 / 未 join`,"admin.seedHelp.paused.desc":`本機仍持有檔案,但當前不會對外提供下載。`,"admin.seedHelp.error.label":`錯誤`,"admin.seedHelp.error.desc":`加入或做種失敗,請檢視下方節點日誌裡的 seed 事件。`,"admin.seedStatus.queued":`佇列中`,"admin.seedStatus.joining":`加入中`,"admin.seedStatus.active":`做種中`,"admin.seedStatus.paused":`已暫停`,"admin.seedStatus.error":`錯誤`,"admin.seedStatus.errorWithMessage":`錯誤:{message}`,"admin.seedStatus.notJoined":`未 join`,"admin.time.never":`從未`,"admin.time.justNow":`剛剛`,"admin.logs.title":`節點日誌`,"admin.logs.filterLabel":`日誌篩選`,"admin.logs.empty":`暫無日誌`,"admin.logFilter.all":`全部`,"admin.logFilter.join":`Join`,"admin.logFilter.pull":`Pull`,"admin.logFilter.verify":`Verify`,"admin.logFilter.serve":`Serve`,"admin.logFilter.error":`Error`},le={"admin.title":`Node admin`,"admin.status.online":`Online`,"admin.status.waiting":`Waiting`,"admin.action.refresh":`Refresh`,"admin.action.copyNodeId":`Copy node ID`,"admin.action.clear":`Clear`,"admin.action.saveConfig":`Save config`,"admin.action.exportDiagnostics":`Export diagnostics`,"admin.action.clearLogs":`Clear logs`,"admin.toast.backendChecking":`Checking backend connection. Try again soon.`,"admin.toast.backendDisconnected":`Backend is not connected`,"admin.toast.statusRefreshed":`Node status refreshed`,"admin.toast.configSavedRestart":`Node config saved. Restart the daemon for the data directory change to take effect.`,"admin.toast.configSaved":`Node config saved`,"admin.toast.nodeIdCopied":`Node ID copied`,"admin.toast.logsCleared":`Node logs cleared`,"admin.toast.diagnosticsExported":`Diagnostics exported`,"admin.toast.userDataCleared":`User data cleared`,"admin.error.readStatus":`Failed to read node status`,"admin.error.saveConfig":`Failed to save config`,"admin.error.clearLogs":`Failed to clear logs`,"admin.error.exportDiagnostics":`Failed to export diagnostics`,"admin.error.clearUserData":`Failed to clear user data`,"admin.error.localDaemonDisconnected":`Local daemon is not connected`,"admin.remoteUnavailable.title":`Remote node admin unavailable`,"admin.remoteUnavailable.desc":`You are connected to a remote node deployed by someone else. A regular invite cannot view or edit node admin data.`,"admin.confirm.clearUserData":`Clear file records and trash for user {address}? Unreferenced local copies may also be removed.`,"admin.metric.nodeId":`Node ID`,"admin.metric.connections":`Connections`,"admin.metric.peers":`{count} peers`,"admin.metric.capacity":`Capacity`,"admin.metric.uptime":`Uptime`,"admin.uptime.daysHours":`{days} d {hours} h`,"admin.uptime.hoursMinutes":`{hours} h {minutes} min`,"admin.uptime.minutes":`{minutes} min`,"admin.nodeStatus.title":`Node status`,"admin.nodeStatus.version":`Version`,"admin.nodeStatus.listen":`Listen`,"admin.nodeStatus.dataPath":`Data directory`,"admin.userData.title":`User data`,"admin.userData.user":`User`,"admin.userData.files":`Files`,"admin.userData.trash":`Trash`,"admin.userData.actions":`Actions`,"admin.userData.empty":`No user data`,"admin.settings.title":`Node settings`,"admin.settings.dataPath":`Data directory`,"admin.settings.capacityGiB":`Capacity limit GiB`,"admin.settings.maxFileSizeGiB":`Max file GiB`,"admin.settings.remoteInvites":`Remote access invites`,"admin.settings.remoteInvitesPlaceholder":`One per line, or separate with commas`,"admin.settings.hint":`Restart the daemon after saving a data directory change. Invite changes apply to new requests immediately. Publishing and downloading always seed afterward; MostBox does not set a product-level seed count or transfer throttle.`,"admin.holdings.title":`Held copies`,"admin.holdings.hiddenCount":`Only the first 100 copies are shown. {count} more are still seeding in the background.`,"admin.holdings.file":`File`,"admin.holdings.size":`Size`,"admin.holdings.peers":`Peers`,"admin.holdings.topicJoined":`Topic join`,"admin.holdings.lastServed":`Last served`,"admin.holdings.totalServed":`Served`,"admin.holdings.status":`Status`,"admin.holdings.joinedYes":`Joined`,"admin.holdings.joinedNo":`Not joined`,"admin.holdings.empty":`No held copies`,"admin.seedHelp.label":`Seeding status help`,"admin.seedHelp.active.label":`Seeding`,"admin.seedHelp.active.desc":`Joined the CID topic and can be discovered by other nodes to provide a full copy.`,"admin.seedHelp.pending.label":`Queued / joining`,"admin.seedHelp.pending.desc":`Waiting for or reconnecting to the topic. It usually becomes active automatically.`,"admin.seedHelp.paused.label":`Paused / not joined`,"admin.seedHelp.paused.desc":`This device still holds the file, but is not currently serving downloads.`,"admin.seedHelp.error.label":`Error`,"admin.seedHelp.error.desc":`Joining or seeding failed. Check seed events in the node logs below.`,"admin.seedStatus.queued":`Queued`,"admin.seedStatus.joining":`Joining`,"admin.seedStatus.active":`Seeding`,"admin.seedStatus.paused":`Paused`,"admin.seedStatus.error":`Error`,"admin.seedStatus.errorWithMessage":`Error: {message}`,"admin.seedStatus.notJoined":`Not joined`,"admin.time.never":`Never`,"admin.time.justNow":`Just now`,"admin.logs.title":`Node logs`,"admin.logs.filterLabel":`Log filter`,"admin.logs.empty":`No logs`,"admin.logFilter.all":`All`,"admin.logFilter.join":`Join`,"admin.logFilter.pull":`Pull`,"admin.logFilter.verify":`Verify`,"admin.logFilter.serve":`Serve`,"admin.logFilter.error":`Error`},I={"profile.meta.title":`个人资料 | MostBox`,"profile.meta.desc":`管理 MostBox 账号头像、显示名称和本地身份信息。`,"profile.kicker":`个人资料`,"profile.signedOut.title":`请先登录`,"profile.signedOut.desc":`登录后可以管理头像、显示名称,并查看当前用户地址和公钥信息。`,"profile.section.account":`账号资料`,"profile.section.account.desc":`这些信息只保存在本机,用于聊天、游戏和工具箱里的身份展示。`,"profile.section.avatar":`头像`,"profile.section.avatar.desc":`选择一个内置头像,或继续使用自己的头像 URL。`,"profile.section.backup":`账号备份`,"profile.section.backup.desc":`手动备份或恢复加密账号数据,包括笔记、文件目录、回收站和频道偏好。`,"profile.section.identity":`身份信息`,"profile.section.identity.desc":`以下信息来自当前本地账号,可用于识别和复制公开身份。`,"profile.label.displayName":`显示名称`,"profile.label.username":`用户名`,"profile.label.customAvatar":`自定义头像 URL`,"profile.action.save":`保存`,"profile.action.openWallet":`打开 Web3 钱包`,"profile.backup.action.cloudBackup":`备份到云端`,"profile.backup.action.cloudRestore":`从云端恢复`,"profile.backup.action.exportLocal":`导出备份`,"profile.backup.action.importLocal":`导入备份`,"profile.backup.status.disabled":`未登录`,"profile.backup.status.idle":`待操作`,"profile.backup.status.backingUp":`正在备份`,"profile.backup.status.restoring":`正在恢复`,"profile.backup.status.exporting":`正在导出`,"profile.backup.status.importing":`正在导入`,"profile.backup.status.done":`已完成`,"profile.backup.status.error":`操作失败`,"profile.backup.confirm.backupTitle":`确认备份到云端`,"profile.backup.confirm.backupMessage":`这会用当前本机账号数据覆盖云端备份,继续吗?`,"profile.backup.confirm.restoreTitle":`确认从云端恢复`,"profile.backup.confirm.restoreMessage":`这会用云端备份覆盖当前本机数据,继续吗?`,"profile.backup.confirm.importTitle":`确认导入备份`,"profile.backup.confirm.restore":`导入备份会合并账号元数据并替换本地笔记,继续吗?`,"profile.backup.toast.cloudUpdated":`账号备份已上传`,"profile.backup.toast.noCloudBackup":`云端暂无账号备份`,"profile.backup.toast.restoredCloud":`已从云端恢复账号备份`,"profile.backup.toast.exportedLocal":`账号备份已导出`,"profile.backup.toast.restoredLocal":`已导入账号备份`,"profile.backup.toast.cancelRestore":`已取消恢复`,"profile.backup.error.backendRequired":`请先连接 MostBox 后端`,"profile.backup.error.loginRequired":`请先登录`,"profile.backup.error.ownerMismatch":`备份不属于当前账号`,"profile.backup.error.backupFailed":`账号备份失败`,"profile.backup.error.restoreFailed":`账号恢复失败`,"profile.backup.error.exportFailed":`导出备份失败`,"profile.backup.error.importFailed":`导入备份失败`,"profile.backup.error.profileSaveFailed":`资料已保存到本机,但写入后端 profile 失败`,"profile.toast.saved":`资料已保存`,"profile.toast.avatarUpdated":`头像已更新`,"profile.avatar.address":`地址头像`,"profile.avatar.panda":`熊猫`,"profile.avatar.owl":`猫头鹰`,"profile.avatar.dolphin":`海豚`,"profile.avatar.tiger":`老虎`,"profile.avatar.turtle":`海龟`,"profile.avatar.snow-mountain":`雪山`},L={"profile.meta.title":`個人資料 | MostBox`,"profile.meta.desc":`管理 MostBox 帳號頭像、顯示名稱和本機身份資訊。`,"profile.kicker":`個人資料`,"profile.signedOut.title":`請先登入`,"profile.signedOut.desc":`登入後可以管理頭像、顯示名稱,並查看目前使用者地址和公鑰資訊。`,"profile.section.account":`帳號資料`,"profile.section.account.desc":`這些資訊只保存在本機,用於聊天、遊戲和工具箱裡的身份展示。`,"profile.section.avatar":`頭像`,"profile.section.avatar.desc":`選擇一個內建頭像,或繼續使用自己的頭像 URL。`,"profile.section.backup":`帳號備份`,"profile.section.backup.desc":`手動備份或恢復加密帳號資料,包括筆記、檔案目錄、垃圾桶和頻道偏好。`,"profile.section.identity":`身份資訊`,"profile.section.identity.desc":`以下資訊來自目前本機帳號,可用於識別和複製公開身份。`,"profile.label.displayName":`顯示名稱`,"profile.label.username":`使用者名稱`,"profile.label.customAvatar":`自訂頭像 URL`,"profile.action.save":`儲存`,"profile.action.openWallet":`開啟 Web3 錢包`,"profile.backup.action.cloudBackup":`備份到雲端`,"profile.backup.action.cloudRestore":`從雲端恢復`,"profile.backup.action.exportLocal":`匯出備份`,"profile.backup.action.importLocal":`匯入備份`,"profile.backup.status.disabled":`未登入`,"profile.backup.status.idle":`待操作`,"profile.backup.status.backingUp":`正在備份`,"profile.backup.status.restoring":`正在恢復`,"profile.backup.status.exporting":`正在匯出`,"profile.backup.status.importing":`正在匯入`,"profile.backup.status.done":`已完成`,"profile.backup.status.error":`操作失敗`,"profile.backup.confirm.backupTitle":`確認備份到雲端`,"profile.backup.confirm.backupMessage":`這會用目前本機帳號資料覆蓋雲端備份,繼續嗎?`,"profile.backup.confirm.restoreTitle":`確認從雲端恢復`,"profile.backup.confirm.restoreMessage":`這會用雲端備份覆蓋目前本機資料,繼續嗎?`,"profile.backup.confirm.importTitle":`確認匯入備份`,"profile.backup.confirm.restore":`匯入備份會合併帳號元資料並取代本機筆記,繼續嗎?`,"profile.backup.toast.cloudUpdated":`帳號備份已上傳`,"profile.backup.toast.noCloudBackup":`雲端暫無帳號備份`,"profile.backup.toast.restoredCloud":`已從雲端恢復帳號備份`,"profile.backup.toast.exportedLocal":`帳號備份已匯出`,"profile.backup.toast.restoredLocal":`已匯入帳號備份`,"profile.backup.toast.cancelRestore":`已取消恢復`,"profile.backup.error.backendRequired":`請先連接 MostBox 後端`,"profile.backup.error.loginRequired":`請先登入`,"profile.backup.error.ownerMismatch":`備份不屬於目前帳號`,"profile.backup.error.backupFailed":`帳號備份失敗`,"profile.backup.error.restoreFailed":`帳號恢復失敗`,"profile.backup.error.exportFailed":`匯出備份失敗`,"profile.backup.error.importFailed":`匯入備份失敗`,"profile.backup.error.profileSaveFailed":`資料已儲存到本機,但寫入後端 profile 失敗`,"profile.toast.saved":`資料已儲存`,"profile.toast.avatarUpdated":`頭像已更新`,"profile.avatar.address":`地址頭像`,"profile.avatar.panda":`熊貓`,"profile.avatar.owl":`貓頭鷹`,"profile.avatar.dolphin":`海豚`,"profile.avatar.tiger":`老虎`,"profile.avatar.turtle":`海龜`,"profile.avatar.snow-mountain":`雪山`},R={"profile.meta.title":`Profile | MostBox`,"profile.meta.desc":`Manage the MostBox account avatar, display name, and local identity.`,"profile.kicker":`Profile`,"profile.signedOut.title":`Sign in first`,"profile.signedOut.desc":`After signing in, you can manage your avatar, display name, address, and public identity.`,"profile.section.account":`Account`,"profile.section.account.desc":`These details stay on this device and are used for identity display across chat, games, and tools.`,"profile.section.avatar":`Avatar`,"profile.section.avatar.desc":`Choose a built-in avatar, or keep using your own avatar URL.`,"profile.section.backup":`Account backup`,"profile.section.backup.desc":`Manually back up or restore encrypted account data, including notes, file directories, trash, and channel preferences.`,"profile.section.identity":`Identity`,"profile.section.identity.desc":`These details come from the current local account and are safe to copy as public identity.`,"profile.label.displayName":`Display name`,"profile.label.username":`Username`,"profile.label.customAvatar":`Custom avatar URL`,"profile.action.save":`Save`,"profile.action.openWallet":`Open Web3 wallet`,"profile.backup.action.cloudBackup":`Back up to cloud`,"profile.backup.action.cloudRestore":`Restore from cloud`,"profile.backup.action.exportLocal":`Export backup`,"profile.backup.action.importLocal":`Import backup`,"profile.backup.status.disabled":`Not signed in`,"profile.backup.status.idle":`Ready`,"profile.backup.status.backingUp":`Backing up`,"profile.backup.status.restoring":`Restoring`,"profile.backup.status.exporting":`Exporting`,"profile.backup.status.importing":`Importing`,"profile.backup.status.done":`Done`,"profile.backup.status.error":`Failed`,"profile.backup.confirm.backupTitle":`Confirm cloud backup`,"profile.backup.confirm.backupMessage":`This will replace the cloud backup with this device account data. Continue?`,"profile.backup.confirm.restoreTitle":`Confirm cloud restore`,"profile.backup.confirm.restoreMessage":`This will replace this device data with the cloud backup. Continue?`,"profile.backup.confirm.importTitle":`Confirm backup import`,"profile.backup.confirm.restore":`Importing a backup will merge account metadata and replace local notes. Continue?`,"profile.backup.toast.cloudUpdated":`Account backup uploaded`,"profile.backup.toast.noCloudBackup":`No account backup in the cloud`,"profile.backup.toast.restoredCloud":`Account backup restored from cloud`,"profile.backup.toast.exportedLocal":`Account backup exported`,"profile.backup.toast.restoredLocal":`Account backup imported`,"profile.backup.toast.cancelRestore":`Restore cancelled`,"profile.backup.error.backendRequired":`Connect to the MostBox backend first`,"profile.backup.error.loginRequired":`Sign in first`,"profile.backup.error.ownerMismatch":`This backup belongs to another account`,"profile.backup.error.backupFailed":`Account backup failed`,"profile.backup.error.restoreFailed":`Account restore failed`,"profile.backup.error.exportFailed":`Backup export failed`,"profile.backup.error.importFailed":`Backup import failed`,"profile.backup.error.profileSaveFailed":`Profile was saved locally, but backend profile save failed`,"profile.toast.saved":`Profile saved`,"profile.toast.avatarUpdated":`Avatar updated`,"profile.avatar.address":`Address avatar`,"profile.avatar.panda":`Panda`,"profile.avatar.owl":`Owl`,"profile.avatar.dolphin":`Dolphin`,"profile.avatar.tiger":`Tiger`,"profile.avatar.turtle":`Turtle`,"profile.avatar.snow-mountain":`Snow mountain`},z=`zh-CN`,B=`mostbox.locale`,V=[`zh-CN`,`zh-TW`,`en`],H={"zh-CN":`简体中文`,"zh-TW":`繁體中文`,en:`English`},U={...i,...s,...u,...te,...ie,...se,...p,...g,...y,...S,...T,...O,...j,...P,...I},W={...o,...l,...ee,...re,...oe,...f,...h,...v,...x,...w,...D,...A,...N,...le,...R},G={"zh-CN":U,"zh-TW":{...a,...c,...d,...ne,...ae,...ce,...m,..._,...b,...C,...E,...k,...M,...F,...L},en:W},ue=n(),K=(0,r.createContext)(null);function q(e){return typeof e==`string`&&V.includes(e)}function J(e){return q(e)?e:z}function Y(e){let t=V.indexOf(e);return V[t<0?0:(t+1)%V.length]??`zh-CN`}function de(e,t){return t?e.replace(/\{(\w+)\}/g,(e,n)=>t[n]===void 0?`{${n}}`:String(t[n])):e}function X(e,t=z,n){return de(G[t][e]||G[`zh-CN`][e],n)}function Z(){if(typeof window>`u`)return z;try{return J(window.localStorage.getItem(B))}catch{return z}}function fe(e){if(!(typeof window>`u`))try{window.localStorage.setItem(B,e)}catch{}}function Q(e){typeof document>`u`||(document.documentElement.lang=e,document.documentElement.dataset.locale=e)}function $(e){return e instanceof Date?e:new Date(e)}function pe({children:e}){let[t,n]=(0,r.useState)(z);(0,r.useEffect)(()=>{n(Z())},[]);let i=(0,r.useCallback)(e=>{n(e),fe(e),Q(e)},[]);(0,r.useEffect)(()=>{Q(t)},[t]),(0,r.useEffect)(()=>{if(typeof window>`u`)return;function e(e){e.key===`mostbox.locale`&&n(Z())}return window.addEventListener(`storage`,e),()=>window.removeEventListener(`storage`,e)},[]);let a=(0,r.useMemo)(()=>{let e=Y(t),n=new Intl.DateTimeFormat(t),r=new Intl.DateTimeFormat(t,{hour:`2-digit`,minute:`2-digit`}),a=new Intl.DateTimeFormat(t,{dateStyle:`medium`,timeStyle:`short`}),o=new Intl.NumberFormat(t),s=new Intl.Collator(t);return{locale:t,localeName:H[t],nextLocale:e,nextLocaleName:H[e],setLocale:i,t:(e,n)=>X(e,t,n),formatDate:(e,r)=>r?new Intl.DateTimeFormat(t,r).format($(e)):n.format($(e)),formatTime:(e,n)=>n?new Intl.DateTimeFormat(t,n).format($(e)):r.format($(e)),formatDateTime:(e,n)=>n?new Intl.DateTimeFormat(t,n).format($(e)):a.format($(e)),formatNumber:(e,n)=>n?new Intl.NumberFormat(t,n).format(e):o.format(e),compareStrings:(e,t)=>s.compare(e,t)}},[t,i]);return(0,ue.jsx)(K.Provider,{value:a,children:e})}function me(){let e=(0,r.useContext)(K);if(!e)throw Error(`useI18n must be used within I18nProvider`);return e}export{me as a,H as c,X as i,q as n,V as o,J as r,B as s,pe as t};