pisper 0.5.21-linux-x64.0 → 0.5.21
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.
- package/README.en.md +53 -0
- package/README.md +46 -46
- package/bin/pisper.mjs +48 -0
- package/lib/install.mjs +392 -0
- package/lib/npm-platform.mjs +41 -0
- package/lib/npm-update.mjs +165 -0
- package/lib/platform.mjs +43 -0
- package/lib/postinstall.mjs +3 -0
- package/package.json +36 -14
- package/updater.pubkey +1 -0
- package/web/.vite/manifest.json +2249 -0
- package/web/assets/AnimatedContent-BiVNqD3m.js +1 -0
- package/web/assets/AnimatedList-CJTx-B8I.js +1 -0
- package/web/assets/AppOverlays-C_v-1VL6.js +1 -0
- package/web/assets/AppSelect-g6etLk2g.js +1 -0
- package/web/assets/AssetsPage-Dt5ST6Ej.js +1 -0
- package/web/assets/ChannelsPage-C9dO2yLN.js +1 -0
- package/web/assets/ChatHistoryPage-ZvSTAtXB.js +1 -0
- package/web/assets/ChatPage-BD3WkozH.js +9 -0
- package/web/assets/ClickSpark-BhxL8WOQ.js +1 -0
- package/web/assets/ConfigPage-ifZdPO01.js +1 -0
- package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/assets/MarkdownMessage-CMr3WuAI.js +1 -0
- package/web/assets/MemoryPage-D5Hjoc5p.js +1 -0
- package/web/assets/PageHeader-BKfO_vPe.js +1 -0
- package/web/assets/PluginsPage-DhkVJf05.js +1 -0
- package/web/assets/PreviewPages-mRjRmA0i.js +1 -0
- package/web/assets/SchedulesPage-DNe-Y6o5.js +1 -0
- package/web/assets/ShinyText-fuaKxKqJ.js +1 -0
- package/web/assets/SkillsPage-PguSYt8I.js +1 -0
- package/web/assets/StarOrbit-BlI6MhVr.js +1 -0
- package/web/assets/TerminalPanel-BrP-ENHg.css +1 -0
- package/web/assets/TerminalPanel-DrnfpA8m.js +18 -0
- package/web/assets/Threads-DskDSsK6.js +1 -0
- package/web/assets/WelcomeEffects-Bf8Z6qHU.js +1 -0
- package/web/assets/WorkflowsPage-C6sGl2oG.js +1 -0
- package/web/assets/WorkspacePicker-Cu2Z5jid.js +1 -0
- package/web/assets/alert-B7D8joCd.js +1 -0
- package/web/assets/alert-dialog-D5F_JQyX.js +1 -0
- package/web/assets/andromeeda-vGVdxbeo.js +1 -0
- package/web/assets/angular-html-17rlCfBS.js +1 -0
- package/web/assets/angular-ts-it3MaXWH.js +1 -0
- package/web/assets/astro-BEVDzCov.js +1 -0
- package/web/assets/aurora-x-CDeNXAV0.js +1 -0
- package/web/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/web/assets/ayu-light-C3h-C4tm.js +1 -0
- package/web/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/web/assets/blade-B3yUZIOx.js +1 -0
- package/web/assets/brand-CFOXmGdd.js +1 -0
- package/web/assets/button-DzlQCSNK.js +1 -0
- package/web/assets/c-aGSZMVdM.js +1 -0
- package/web/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/web/assets/catppuccin-latte-CtsyrtPq.js +1 -0
- package/web/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/web/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/web/assets/chevron-down-DXmj1gMQ.js +1 -0
- package/web/assets/circle-dot-CbGG7s_7.js +1 -0
- package/web/assets/coffee-ouOQ86EC.js +1 -0
- package/web/assets/copy-DO0sQBgx.js +1 -0
- package/web/assets/cpp-Bm3vm43L.js +1 -0
- package/web/assets/css-CWcS1xXm.js +1 -0
- package/web/assets/csv-Dx-8-gkx.js +1 -0
- package/web/assets/dark-plus-Cs2F2srj.js +1 -0
- package/web/assets/dist-BaCXUSxG.js +1 -0
- package/web/assets/dist-Bv5OI2pf.js +1 -0
- package/web/assets/dracula-BHWKrbxM.js +1 -0
- package/web/assets/dracula-soft-5eyTD99u.js +1 -0
- package/web/assets/earth-D-KiHvdO.js +1 -0
- package/web/assets/es2015-CfKlxLgF.js +41 -0
- package/web/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/web/assets/everforest-light-Df2xbC6M.js +1 -0
- package/web/assets/field-CCo2X7MX.js +1 -0
- package/web/assets/file-B6GksU4A.js +1 -0
- package/web/assets/file-code-corner-3gopYCm4.js +1 -0
- package/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/web/assets/github-dark-C-LZuMrd.js +1 -0
- package/web/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/web/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/web/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/web/assets/github-light-EUqPIrTm.js +1 -0
- package/web/assets/github-light-default-BXViO-2h.js +1 -0
- package/web/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/web/assets/glsl-TOBAB6bO.js +1 -0
- package/web/assets/graphql-BEmIBNve.js +1 -0
- package/web/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/web/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/web/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/web/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/web/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/web/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/web/assets/haml-CDWtFtU9.js +1 -0
- package/web/assets/handlebars-BNtjo3pL.js +1 -0
- package/web/assets/horizon-CE9ld1lL.js +1 -0
- package/web/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/web/assets/houston-CsvMBhTu.js +1 -0
- package/web/assets/html-BVyvp26C.js +1 -0
- package/web/assets/html-derivative-BseLpURQ.js +1 -0
- package/web/assets/http-CkCfSMV9.js +1 -0
- package/web/assets/hurl-syYMt6Rn.js +1 -0
- package/web/assets/image-Bu_a9jz0.js +1 -0
- package/web/assets/imba-DsUTQ-LC.js +1 -0
- package/web/assets/index-BIQcwjFR.js +41 -0
- package/web/assets/index-Btu6aNk7.css +2 -0
- package/web/assets/java-duG_UTKe.js +1 -0
- package/web/assets/javascript-DWVbOe4X.js +1 -0
- package/web/assets/jinja-Boj4niAz.js +1 -0
- package/web/assets/jison-CHwnC1Pv.js +1 -0
- package/web/assets/json-qhed-kSA.js +1 -0
- package/web/assets/json5-BR5RXkoi.js +1 -0
- package/web/assets/jsonc-CYpm1nAK.js +1 -0
- package/web/assets/jsonl-CmCQp5Yx.js +1 -0
- package/web/assets/jsx-fcCEM_-L.js +1 -0
- package/web/assets/julia-VoF7UKfw.js +1 -0
- package/web/assets/kanagawa-dragon-Bozd7klA.js +1 -0
- package/web/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/web/assets/kanagawa-wave-BML5mF2J.js +1 -0
- package/web/assets/laserwave-C_8bwKvT.js +1 -0
- package/web/assets/less-DVTAwKKz.js +1 -0
- package/web/assets/light-plus-DVQuIRkW.js +1 -0
- package/web/assets/link-2-SOWAopyR.js +1 -0
- package/web/assets/loader-circle-i0WYlBWu.js +1 -0
- package/web/assets/markdown-BYOwaDjH.js +1 -0
- package/web/assets/marko-Cupn1xhw.js +1 -0
- package/web/assets/material-theme-Bm3Qr25_.js +1 -0
- package/web/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/web/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/web/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/web/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/web/assets/mdc-4FfK5iWR.js +1 -0
- package/web/assets/mdx-DQZ5AkYe.js +1 -0
- package/web/assets/message-circle-C3tSGsW0.js +1 -0
- package/web/assets/min-dark-BSWPekZh.js +1 -0
- package/web/assets/min-light-DDpmG2fV.js +1 -0
- package/web/assets/monokai-B_bV9PQ9.js +1 -0
- package/web/assets/network-zt1ahOiz.js +1 -0
- package/web/assets/night-owl-DhmEMT88.js +1 -0
- package/web/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/web/assets/nord-Cb4Vim4T.js +1 -0
- package/web/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/web/assets/one-light-D7Lr4KcI.js +1 -0
- package/web/assets/panel-top-DYcS-wiY.js +1 -0
- package/web/assets/paperclip-t0nP1kBQ.js +1 -0
- package/web/assets/pencil-BOb7CieI.js +1 -0
- package/web/assets/php-CUREQQ7f.js +1 -0
- package/web/assets/pick-system-directory-BnIFt85A.js +1 -0
- package/web/assets/plastic-DQwYfKfQ.js +1 -0
- package/web/assets/play-V5zloi0R.js +1 -0
- package/web/assets/poimandres-DRFjx7u4.js +1 -0
- package/web/assets/postcss-BXeXVLqQ.js +1 -0
- package/web/assets/progress-DWkHIRCG.js +6 -0
- package/web/assets/pug-CQyGKZpv.js +1 -0
- package/web/assets/python-gzcpVVnB.js +1 -0
- package/web/assets/r-C5FwQflr.js +1 -0
- package/web/assets/react-bits-DQli9s7O.css +1 -0
- package/web/assets/red-DX1BQOs8.js +1 -0
- package/web/assets/regexp--aR2_iz7.js +1 -0
- package/web/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/web/assets/rose-pine-aMsaMD1D.js +1 -0
- package/web/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/web/assets/rose-pine-moon-DO-qXg-I.js +1 -0
- package/web/assets/sass-DXrisJhu.js +1 -0
- package/web/assets/save-CTsP04bb.js +1 -0
- package/web/assets/scss-Davl4E3T.js +1 -0
- package/web/assets/search-Chj7BjSz.js +1 -0
- package/web/assets/shellscript-CLZ0U2zV.js +1 -0
- package/web/assets/shield-check-By9gGYwr.js +1 -0
- package/web/assets/slack-dark-DnToyrRv.js +1 -0
- package/web/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/web/assets/smithy-Dgaz7aur.js +1 -0
- package/web/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/web/assets/solarized-dark-UdsmMDCL.js +1 -0
- package/web/assets/solarized-light-C1IUL_tW.js +1 -0
- package/web/assets/sql-b92rrcVl.js +1 -0
- package/web/assets/square-DQQwOv3-.js +1 -0
- package/web/assets/square-terminal-ByK0g_OZ.js +1 -0
- package/web/assets/stylus-B6D30XZt.js +1 -0
- package/web/assets/sun-CiCuEpCg.js +1 -0
- package/web/assets/svelte-BfstjgUc.js +1 -0
- package/web/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/web/assets/tag-B0fT5ThM.js +1 -0
- package/web/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/web/assets/trash-2-2GzVxk5J.js +1 -0
- package/web/assets/ts-tags-Cckpt1jI.js +1 -0
- package/web/assets/tsx-JMDX3aQ7.js +1 -0
- package/web/assets/typescript-BAz-bF8J.js +1 -0
- package/web/assets/use-i18n-DmLwOjO5.js +1 -0
- package/web/assets/usePagePrimaryAction-Bw0OFTDZ.js +1 -0
- package/web/assets/utils-C8uzG5AZ.js +1 -0
- package/web/assets/vendor-dockview-D5adAaCg.css +1 -0
- package/web/assets/vendor-dockview-yY5mBM3U.js +1 -0
- package/web/assets/vendor-markdown-CWK5AVhB.js +130 -0
- package/web/assets/vendor-markdown-plugins-DCl4I7Pz.js +263 -0
- package/web/assets/vendor-motion-XxgxfZSY.js +9 -0
- package/web/assets/vendor-react-CHuvPdJE.js +9 -0
- package/web/assets/vendor-router-Bw2aAdMs.js +4 -0
- package/web/assets/vendor-shiki-runtime-CxE5QolQ.js +153 -0
- package/web/assets/vendor-state-DE1O_s6m.js +1 -0
- package/web/assets/vendor-ui-DvrYggeS.js +1 -0
- package/web/assets/vendor-xyflow-CnjXtcyK.js +7 -0
- package/web/assets/vendor-xyflow-DLioOiRN.css +1 -0
- package/web/assets/vesper-DdrHHSXu.js +1 -0
- package/web/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/web/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/web/assets/vitesse-light-VbXTXTou.js +1 -0
- package/web/assets/vue-3H7P6ncC.js +1 -0
- package/web/assets/vue-html-DZGW9MGR.js +1 -0
- package/web/assets/vue-vine-BECt67gq.js +1 -0
- package/web/assets/wasm-BnjxR4X6.js +1 -0
- package/web/assets/wasm-ByWQv1Qj.js +1 -0
- package/web/assets/wgsl-BsKzXJz4.js +1 -0
- package/web/assets/wit-DdvCle-K.js +1 -0
- package/web/assets/wrench-DkHcVlxK.js +1 -0
- package/web/assets/xml-CNfvW5JP.js +1 -0
- package/web/assets/yaml-rwi0_p6S.js +1 -0
- package/web/assets/zap-CRNpJWAy.js +1 -0
- package/web/favicon.svg +25 -0
- package/web/icons.svg +24 -0
- package/web/index.html +72 -0
- package/web/memory-galaxy-background.webp +0 -0
- package/web/mobile-startup.html +316 -0
- package/web/notification-sw.js +13 -0
- package/web/tauri-pet.css +117 -0
- package/web/tauri-pet.html +16 -0
- package/web/tauri-pet.js +117 -0
- package/components/runtime/Pisper_Runtime_Node_0.5.20_linux_x86_64.tar.gz +0 -0
- package/components/runtime/Pisper_Runtime_Node_0.5.20_linux_x86_64.tar.gz.sig +0 -1
- package/components/tui/Pisper_TUI_Component_0.5.12_linux_x86_64.tar.gz +0 -0
- package/components/tui/Pisper_TUI_Component_0.5.12_linux_x86_64.tar.gz.sig +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t,r as n,t as r}from"./vendor-react-CHuvPdJE.js";import{a as i,r as a}from"./button-DzlQCSNK.js";import{o}from"./vendor-state-DE1O_s6m.js";var s=e(t(),1),c=e(n(),1),l=r(),u=Object.defineProperty,d=(e,t)=>u(e,`name`,{value:t,configurable:!0}),f=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=i(`Primitive.${t}`),r=s.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,l.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function p(e,t){e&&c.flushSync(()=>e.dispatchEvent(t))}d(p,`dispatchDiscreteCustomEvent`);var m=Object.defineProperty,h=(e,t)=>m(e,`name`,{value:t,configurable:!0});function g(e,t){let n=s.createContext(t);n.displayName=e+`Context`;let r=h(e=>{let{children:t,...r}=e,i=s.useMemo(()=>r,Object.values(r));return(0,l.jsx)(n.Provider,{value:i,children:t})},`Provider`);r.displayName=e+`Provider`;function i(r,i={}){let{optional:a=!1}=i,o=s.useContext(n);if(o)return o;if(t!==void 0)return t;if(!a)throw Error(`\`${r}\` must be used within \`${e}\``)}return h(i,`useContext`),[r,i]}h(g,`createContext`);function _(e,t=[]){let n=[];function r(t,r){let i=s.createContext(r);i.displayName=t+`Context`;let a=n.length;n=[...n,r];let o=h(t=>{let{scope:n,children:r,...o}=t,c=n?.[e]?.[a]||i,u=s.useMemo(()=>o,Object.values(o));return(0,l.jsx)(c.Provider,{value:u,children:r})},`Provider`);o.displayName=t+`Provider`;function c(n,o,c={}){let{optional:l=!1}=c,u=o?.[e]?.[a]||i,d=s.useContext(u);if(d)return d;if(r!==void 0)return r;if(!l)throw Error(`\`${n}\` must be used within \`${t}\``)}return h(c,`useContext`),[o,c]}h(r,`createContext`);let i=h(()=>{let t=n.map(e=>s.createContext(e));return h(function(n){let r=n?.[e]||t;return s.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])},`useScope`)},`createScope`);return i.scopeName=e,[r,v(i,...t)]}h(_,`createContextScope`);function v(...e){let t=e[0];if(e.length===1)return t;let n=h(()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return h(function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return s.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])},`useComposedScopes`)},`createScope`);return n.scopeName=t.scopeName,n}h(v,`composeContextScopes`);var y=Object.defineProperty,b=(e,t)=>y(e,`name`,{value:t,configurable:!0}),x=!!(typeof window<`u`&&window.document&&window.document.createElement);function S(e,t,{checkForDefaultPrevented:n=!0}={}){return b(function(r){if(e?.(r),n===!1||!r||!r.defaultPrevented)return t?.(r)},`handleEvent`)}b(S,`composeEventHandlers`);function C(e){if(!x)throw Error(`Cannot access window outside of the DOM`);return e?.ownerDocument?.defaultView??window}b(C,`getOwnerWindow`);function w(e){if(!x)throw Error(`Cannot access document outside of the DOM`);return e?.ownerDocument??document}b(w,`getOwnerDocument`);function T(e,t=!1){let{activeElement:n}=w(e);if(!n?.nodeName)return null;if(E(n)&&n.contentDocument)return T(n.contentDocument.body,t);if(t){let e=n.getAttribute(`aria-activedescendant`);if(e){let t=w(n).getElementById(e);if(t)return t}}return n}b(T,`getActiveElement`);function E(e){return e.tagName===`IFRAME`}b(E,`isFrame`);var D=globalThis?.document?s.useLayoutEffect:()=>{},O=Object.defineProperty,ee=(e,t)=>O(e,`name`,{value:t,configurable:!0}),te=s.useEffectEvent,ne=s.useInsertionEffect;function k(e){if(typeof te==`function`)return te(e);let t=s.useRef(()=>{throw Error(`Cannot call an event handler while rendering.`)});return typeof ne==`function`?ne(()=>{t.current=e}):D(()=>{t.current=e}),s.useMemo(()=>((...e)=>t.current?.(...e)),[])}ee(k,`useEffectEvent`);var re=Object.defineProperty,A=(e,t)=>re(e,`name`,{value:t,configurable:!0}),ie=s.useInsertionEffect||D;function ae({prop:e,defaultProp:t,onChange:n=A(()=>{},`onChange`),caller:r}){let[i,a,o]=oe({defaultProp:t,onChange:n}),c=e!==void 0;return[c?e:i,s.useCallback(t=>{if(c){let n=se(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[c,e,a,o])]}A(ae,`useControllableState`);function oe({defaultProp:e,onChange:t}){let[n,r]=s.useState(e),i=s.useRef(n),a=s.useRef(t);return ie(()=>{a.current=t},[t]),s.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}A(oe,`useUncontrolledState`);function se(e){return typeof e==`function`}A(se,`isFunction`);var ce=Symbol(`RADIX:SYNC_STATE`);function le(e,t,n,r){let{prop:i,defaultProp:a,onChange:o,caller:c}=t,l=i!==void 0,u=k(o),d=[{...n,state:a}];r&&d.push(r);let[f,p]=s.useReducer((t,n)=>{if(n.type===ce)return{...t,state:n.state};let r=e(t,n);return l&&!Object.is(r.state,t.state)&&u(r.state),r},...d),m=f.state,h=s.useRef(m);s.useEffect(()=>{h.current!==m&&(h.current=m,l||u(m))},[m,h,l]);let g=s.useMemo(()=>i===void 0?f:{...f,state:i},[f,i]);return s.useEffect(()=>{l&&!Object.is(i,f.state)&&p({type:ce,state:i})},[i,f.state,l]),[g,p]}A(le,`useControllableStateReducer`);var ue=Object.defineProperty,de=(e,t)=>ue(e,`name`,{value:t,configurable:!0});function fe(e){let[t,n]=s.useState(void 0);return D(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let r=t[0],i,a;if(`borderBoxSize`in r){let e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;i=t.inlineSize,a=t.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}n(void 0)},[e]),t}de(fe,`useSize`);var j=e=>typeof e==`string`,M=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},pe=e=>e==null?``:String(e),me=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},he=/###/g,ge=e=>e&&e.includes(`###`)?e.replace(he,`.`):e,_e=e=>!e||j(e),N=(e,t,n)=>{let r=j(t)?t.split(`.`):t,i=0;for(;i<r.length-1;){if(_e(e))return{};let t=ge(r[i]);!e[t]&&n&&(e[t]=new n),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++i}return _e(e)?{}:{obj:e,k:ge(r[i])}},ve=(e,t,n)=>{let{obj:r,k:i}=N(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=N(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=N(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},ye=(e,t,n,r)=>{let{obj:i,k:a}=N(e,t,Object);i[a]=i[a]||[],i[a].push(n)},P=(e,t)=>{let{obj:n,k:r}=N(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},be=(e,t,n)=>{let r=P(e,n);return r===void 0?P(t,n):r},F=(e,t,n)=>{for(let r in t)r!==`__proto__`&&r!==`constructor`&&(Object.prototype.hasOwnProperty.call(e,r)?j(e[r])||e[r]instanceof String||j(t[r])||t[r]instanceof String?n&&(e[r]=t[r]):F(e[r],t[r],n):e[r]=t[r]);return e},I=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),xe={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`,"/":`/`},Se=e=>j(e)?e.replace(/[&<>"'\/]/g,e=>xe[e]):e,Ce=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},we=[` `,`,`,`?`,`!`,`;`],Te=new Ce(20),Ee=(e,t,n)=>{t||=``,n||=``;let r=we.filter(e=>!t.includes(e)&&!n.includes(e));if(r.length===0)return!0;let i=Te.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},L=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e<r.length;){if(!i||typeof i!=`object`)return;let t,a=``;for(let o=e;o<r.length;++o)if(o!==e&&(a+=n),a+=r[o],t=i[a],t!==void 0){if([`string`,`number`,`boolean`].includes(typeof t)&&o<r.length-1)continue;e+=o-e+1;break}i=t}return i},R=e=>e?.replace(/_/g,`-`),De={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},z=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||De,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,t,n,r){return r&&!this.debug?null:(e=e.map(e=>j(e)?e.replace(/[\r\n\x00-\x1F\x7F]/g,` `):e),j(e[0])&&(e[0]=`${n}${this.prefix} ${e[0]}`),this.logger[t](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},B=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let n=(...r)=>{t(...r),this.off(e,n)};return this.on(e,n),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r<n;r++)e(...t)}),this.observers[`*`]&&Array.from(this.observers[`*`].entries()).forEach(([n,r])=>{for(let i=0;i<r;i++)n(e,...t)})}},Oe=class extends B{constructor(e,t={ns:[`translation`],defaultNS:`translation`}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,n,r={}){let i=r.keySeparator===void 0?this.options.keySeparator:r.keySeparator,a=r.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:r.ignoreJSONStructure,o;e.includes(`.`)?o=e.split(`.`):(o=[e,t],n&&(Array.isArray(n)?o.push(...n):j(n)&&i?o.push(...n.split(i)):o.push(n)));let s=P(this.data,o);return!s&&!t&&!n&&e.includes(`.`)&&(e=o[0],t=o[1],n=o.slice(2).join(`.`)),s||!a||!j(n)?s:L(this.data?.[e]?.[t],n,i)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.includes(`.`)&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),ve(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,t,n,r={silent:!1}){for(let r in n)(j(n[r])||Array.isArray(n[r]))&&this.addResource(e,t,r,n[r],{silent:!0});r.silent||this.emit(`added`,e,t,n)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(`.`)&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=P(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?F(s,n,i):s={...s,...n},ve(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},ke={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},Ae=Symbol(`i18next/PATH_KEY`);function je(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===Ae?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function V(e,t){let{[Ae]:n}=e(je()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`,a=t?.enableSelector===`strict`;if(n.length>1&&i){let e=t?.ns,o=a?Array.isArray(e)?e:e?[e]:null:Array.isArray(e)?e:null;if(o&&(a?o:o.length>1?o.slice(1):[]).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var H=e=>!j(e)&&typeof e!=`boolean`&&typeof e!=`number`,Me=class e extends B{constructor(e,t={}){super(),me([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=z.create(`translator`),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=H(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,t){let n=t.nsSeparator===void 0?this.options.nsSeparator:t.nsSeparator;n===void 0&&(n=`:`);let r=t.keySeparator===void 0?this.options.keySeparator:t.keySeparator,i=t.ns||this.options.defaultNS||[],a=n&&e.includes(n),o=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!Ee(e,n,r);if(a&&!o){let t=e.match(this.interpolator.nestingRegexp);if(t&&t.length>0)return{key:e,namespaces:j(i)?[i]:i};let a=e.split(n);(n!==r||n===r&&this.options.ns.includes(a[0]))&&(i=a.shift()),e=a.join(r)}return{key:e,namespaces:j(i)?[i]:i}}translate(t,n,r){let i=typeof n==`object`?{...n}:n;if(typeof i!=`object`&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i==`object`&&(i={...i}),i||={},t==null)return``;typeof t==`function`&&(t=V(t,{...this.options,...i})),Array.isArray(t)||(t=[String(t)]),t=t.map(e=>typeof e==`function`?V(e,{...this.options,...i}):String(e));let a=i.returnDetails===void 0?this.options.returnDetails:i.returnDetails,o=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,{key:s,namespaces:c}=this.extractFromKey(t[t.length-1],i),l=c[c.length-1],u=i.nsSeparator===void 0?this.options.nsSeparator:i.nsSeparator;u===void 0&&(u=`:`);let d=i.lng||this.language,f=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d?.toLowerCase()===`cimode`)return f?a?{res:`${l}${u}${s}`,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:`${l}${u}${s}`:a?{res:s,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:s;let p=this.resolve(t,i),m=p?.res,h=p?.usedKey||s,g=p?.exactUsedKey||s,_=[`[object Number]`,`[object Function]`,`[object RegExp]`],v=i.joinArrays===void 0?this.options.joinArrays:i.joinArrays,y=!this.i18nFormat||this.i18nFormat.handleAsObject,b=i.count!==void 0&&!j(i.count),x=e.hasDefaultValue(i),S=b?this.pluralResolver.getSuffix(d,i.count,i):``,C=i.ordinal&&b?this.pluralResolver.getSuffix(d,i.count,{ordinal:!1}):``,w=b&&!i.ordinal&&i.count===0,T=w&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${S}`]||i[`defaultValue${C}`]||i.defaultValue,E=m;y&&!m&&x&&(E=T);let D=H(E),O=Object.prototype.toString.apply(E);if(y&&E&&D&&!_.includes(O)&&!(j(v)&&Array.isArray(E))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,E,{...i,ns:c}):`key '${s} (${this.language})' returned an object instead of string.`;return a?(p.res=e,p.usedParams=this.getUsedParamsDetails(i),p):e}if(o){let e=Array.isArray(E),t=e?[]:{},n=e?g:h;for(let e in E)if(Object.prototype.hasOwnProperty.call(E,e)){let r=`${n}${o}${e}`;t[e]=x&&!m?this.translate(r,{...i,defaultValue:H(T)?T[e]:void 0,joinArrays:!1,ns:c}):this.translate(r,{...i,joinArrays:!1,ns:c}),t[e]===r&&(t[e]=E[e])}m=t}}else if(y&&j(v)&&Array.isArray(m))m=m.join(v),m&&=this.extendTranslation(m,t,i,r);else{let e=!1,n=!1;!this.isValidLookup(m)&&x&&(e=!0,m=T),this.isValidLookup(m)||(n=!0,m=s);let a=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&n?void 0:m,c=x&&T!==m&&this.options.updateMissing;if(n||e||c){if(this.logger.log(c?`updateKey`:`missingKey`,d,l,b&&!c?`${s}${this.pluralResolver.getSuffix(d,i.count,i)}`:s,c?T:m),o){let e=this.resolve(s,{...i,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n<t.length;n++)e.push(t[n]);else this.options.saveMissingTo===`all`?e=this.languageUtils.toResolveHierarchy(i.lng||this.language):e.push(i.lng||this.language);let n=(e,t,n)=>{let r=x&&n!==m?n:a;this.options.missingKeyHandler?this.options.missingKeyHandler(e,l,t,r,c,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,l,t,r,c,i),this.emit(`missingKey`,e,l,t,m)};this.options.saveMissing&&(this.options.saveMissingPlurals&&b?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,i);w&&i[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],s+t,i[`defaultValue${t}`]||T)})}):n(e,s,T))}m=this.extendTranslation(m,t,i,p,r),n&&m===s&&this.options.appendNamespaceToMissingKey&&(m=`${l}${u}${s}`),(n||e)&&this.options.parseMissingKeyHandler&&(m=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}${u}${s}`:s,e?m:void 0,i))}return a?(p.res=m,p.usedParams=this.getUsedParamsDetails(i),p):m}extendTranslation(e,t,n,r,i){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});let a=j(e)&&(n?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:n.interpolation.skipOnVariables),o;if(a){let t=e.match(this.interpolator.nestingRegexp);o=t&&t.length}let s=n.replace&&!j(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(s={...this.options.interpolation.defaultVariables,...s}),e=this.interpolator.interpolate(e,s,n.lng||this.language||r.usedLng,n),a){let t=e.match(this.interpolator.nestingRegexp),r=t&&t.length;o<r&&(n.nest=!1)}!n.lng&&r&&r.res&&(n.lng=this.language||r.usedLng),n.nest!==!1&&(e=this.interpolator.nest(e,(...e)=>i?.[0]===e[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${t[0]}`),null):this.translate(...e,t),n)),n.interpolation&&this.interpolator.reset()}let a=n.postProcess||this.options.postProcess,o=j(a)?[a]:a;return e!=null&&o?.length&&n.applyPostProcessor!==!1&&(e=ke.handle(o,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),e}resolve(e,t={}){let n,r,i,a,o;return j(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?V(e,{...this.options,...t}):e)),e.forEach(e=>{if(this.isValidLookup(n))return;let s=this.extractFromKey(e,t),c=s.key;r=c;let l=s.namespaces;this.options.fallbackNS&&(l=l.concat(this.options.fallbackNS));let u=t.count!==void 0&&!j(t.count),d=u&&!t.ordinal&&t.count===0,f=t.context!==void 0&&(j(t.context)||typeof t.context==`number`)&&t.context!==``,p=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);l.forEach(e=>{this.isValidLookup(n)||(o=e,!this.checkedLoadedFor[`${p[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(this.checkedLoadedFor[`${p[0]}-${e}`]=!0,this.logger.warn(`key "${r}" for languages "${p.join(`, `)}" won't get resolved as namespace "${o}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),p.forEach(r=>{if(this.isValidLookup(n))return;a=r;let o=[c];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(o,c,r,e,t);else{let e;u&&(e=this.pluralResolver.getSuffix(r,t.count,t));let n=`${this.options.pluralSeparator}zero`,i=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(u&&(t.ordinal&&e.startsWith(i)&&o.push(c+e.replace(i,this.options.pluralSeparator)),o.push(c+e),d&&o.push(c+n)),f){let r=`${c}${this.options.contextSeparator||`_`}${t.context}`;o.push(r),u&&(t.ordinal&&e.startsWith(i)&&o.push(r+e.replace(i,this.options.pluralSeparator)),o.push(r+e),d&&o.push(r+n))}}let s;for(;s=o.pop();)this.isValidLookup(n)||(i=s,n=this.getResource(r,e,s,t))}))})}),{res:n,usedKey:r,exactUsedKey:i,usedLng:a,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let t=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],n=e.replace&&!j(e.replace),r=n?e.replace:e;if(n&&e.count!==void 0&&(r={...r,count:e.count}),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!n){r={...r};for(let e of t)delete r[e]}return r}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith(`defaultValue`)&&e[t]!==void 0)return!0;return!1}},Ne=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=z.create(`languageUtils`)}getScriptPartFromCode(e){if(e=R(e),!e||!e.includes(`-`))return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=R(e),!e||!e.includes(`-`))return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(j(e)&&e.includes(`-`)){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>e===r?!0:!e.includes(`-`)&&!r.includes(`-`)?!1:!!(e.includes(`-`)&&!r.includes(`-`)&&e.slice(0,e.indexOf(`-`))===r||e.startsWith(r)&&r.length>1))}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,t){if(!e)return[];if(typeof e==`function`&&(e=e(t)),j(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let n=e[t];return n||=e[this.getScriptPartFromCode(t)],n||=e[this.formatLanguageCode(t)],n||=e[this.getLanguagePartFromCode(t)],n||=e.default,n||[]}toResolveHierarchy(e,t){let n=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),r=[],i=e=>{e&&(this.isSupportedCode(e)?r.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return j(e)&&(e.includes(`-`)||e.includes(`_`))?(this.options.load!==`languageOnly`&&i(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&i(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&i(this.getLanguagePartFromCode(e))):j(e)&&i(this.formatLanguageCode(e)),n.forEach(e=>{r.includes(e)||i(this.formatLanguageCode(e))}),r}},Pe={zero:0,one:1,two:2,few:3,many:4,other:5},Fe={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},Ie=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=z.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=R(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),Fe;if(!e.match(/-|_/))return Fe;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>Pe[e]-Pe[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},Le=(e,t,n,r=`.`,i=!0)=>{let a=be(e,t,n);return!a&&i&&j(n)&&(a=L(e,n,r),a===void 0&&(a=L(t,n,r))),a},Re=e=>e.replace(/\$/g,`$$$$`),ze=class{constructor(e={}){this.logger=z.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:m,nestingOptionsSeparator:h,maxReplaces:g,alwaysFormat:_}=e.interpolation;this.escape=t===void 0?Se:t,this.escapeValue=n===void 0||n,this.useRawValueToEscape=r!==void 0&&r,this.prefix=i?I(i):a||`{{`,this.suffix=o?I(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u?I(u):`-`,this.unescapeSuffix=this.unescapePrefix?``:l?I(l):``,this.nestingPrefix=d?I(d):f||I(`$t(`),this.nestingSuffix=p?I(p):m||I(`)`),this.nestingOptionsSeparator=h||`,`,this.maxReplaces=g||1e3,this.alwaysFormat=_!==void 0&&_,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,n,r){let i,a,o,s=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=e=>{if(!e.includes(this.formatSeparator)){let i=Le(t,s,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(i,void 0,n,{...r,...t,interpolationkey:e}):i}let i=e.split(this.formatSeparator),a=i.shift().trim(),o=i.join(this.formatSeparator).trim();return this.format(Le(t,s,a,this.options.keySeparator,this.options.ignoreJSONStructure),o,n,{...r,...t,interpolationkey:a})};this.resetRegExp(),!this.escapeValue&&typeof e==`string`&&/\$t\([^)]*\{[^}]*\{\{/.test(e)&&this.logger.warn(`nesting options string contains interpolated variables with escapeValue: false — if any of those values are attacker-controlled they can inject additional nesting options (e.g. redirect lng/ns). Sanitise untrusted input before passing it to t(), or keep escapeValue: true.`);let l=r?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=r?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:r.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>e},{regex:this.regexp,safeValue:e=>this.escapeValue?this.escape(e):e}].forEach(t=>{for(o=0;i=t.regex.exec(e);){let n=i[1].trim();if(a=c(n),a===void 0){if(typeof l==`function`){let t=l(e,i,r);a=j(t)?t:``}else if(r&&Object.prototype.hasOwnProperty.call(r,n))a=``;else if(u){a=i[0];continue}else this.logger.warn(`missed to pass in variable ${n} for interpolating ${e}`),a=``}else!j(a)&&!this.useRawValueToEscape&&(a=pe(a));let s=t.safeValue(a);if(e=e.replace(i[0],Re(s)),u?(t.regex.lastIndex+=s.length,t.regex.lastIndex-=i[0].length):t.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,t,n={}){let r,i,a,o=(e,t)=>{let n=this.nestingOptionsSeparator;if(!e.includes(n))return e;let r=e.split(RegExp(`${I(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,a);let o=i.match(/'/g),s=i.match(/"/g);((o?.length??0)%2==0&&!s||(s?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{a=JSON.parse(i),t&&(a={...t,...a})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return a.defaultValue&&a.defaultValue.includes(this.prefix)&&delete a.defaultValue,e};for(;r=this.nestingRegexp.exec(e);){let s=[];a={...n},a=a.replace&&!j(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let c=/{.*}/s.test(r[1])?r[1].lastIndexOf(`}`)+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(s=r[1].slice(c).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),i=t(o.call(this,r[1].trim(),a),a),i&&r[0]===e&&!j(i))return i;j(i)||(i=pe(i)),i||=(this.logger.warn(`missed to resolve ${r[1]} for nesting ${e}`),``),s.length&&(i=s.reduce((e,t)=>this.format(e,t,n.lng,{...n,interpolationkey:r[1].trim()}),i.trim())),e=e.replace(r[0],i),this.regexp.lastIndex=0}return e}},Be=e=>{let t=e.toLowerCase().trim(),n={};if(e.includes(`(`)){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].slice(0,-1);t===`currency`&&!i.includes(`:`)?n.currency||=i.trim():t===`relativetime`&&!i.includes(`:`)?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},U=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(R(r),i),t[o]=s),s(n)}},Ve=e=>(t,n,r)=>e(R(n),r)(t),He=class{constructor(e={}){this.logger=z.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?U:Ve;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=U(t)}format(e,t,n,r={}){if(!t||e==null)return e;let i=t.split(this.formatSeparator),a=[];for(let e=0;e<i.length;e++){let t=i[e];for(;t.indexOf(`(`)>-1&&!t.includes(`)`)&&e+1<i.length;)t=`${t}${this.formatSeparator}${i[++e]}`;a.push(t)}return a.reduce((e,t)=>{let{formatName:i,formatOptions:a}=Be(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}return this.logger.warn(`there was no format function for ${i}`),e},e)}},Ue=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},We=class extends B{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=z.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{ye(n.loaded,[i],a),Ue(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r<this.maxRetries){setTimeout(()=>{this.read(e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,t,n={},r){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),r&&r();j(e)&&(e=this.languageUtils.toResolveHierarchy(e)),j(t)&&(t=[t]);let i=this.queueLoad(e,t,n,r);if(!i.toLoad.length)return i.pending.length||r(),null;i.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(n!=null&&n!==``){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},W=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,enableSelector:!1,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]==`object`&&(t=e[1]),j(e[1])&&(t.defaultValue=e[1]),j(e[2])&&(t.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let n=e[3]||e[2];Object.keys(n).forEach(e=>{t[e]=n[e]})}return t},interpolation:{escapeValue:!0,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),Ge=e=>(j(e.ns)&&(e.ns=[e.ns]),j(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),j(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes(`cimode`)&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),e),G=()=>{},Ke=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},K=class e extends B{constructor(e={},t){if(super(),this.options=Ge(e),this.services={},this.logger=z,this.modules={external:[]},Ke(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e==`function`&&(t=e,e={}),e.defaultNS==null&&e.ns&&(j(e.ns)?e.defaultNS=e.ns:e.ns.includes(`translation`)||(e.defaultNS=e.ns[0]));let n=W();this.options={...n,...this.options,...Ge(e)},this.options.interpolation={...n.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler);let r=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?z.init(r(this.modules.logger),this.options):z.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:He;let t=new Ne(this.options);this.store=new Oe(this.options.resources,this.options);let n=this.services;n.logger=z,n.resourceStore=this.store,n.languageUtils=t,n.pluralResolver=new Ie(t,{prepend:this.options.pluralSeparator}),e&&(n.formatter=r(e),n.formatter.init&&n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new ze(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new We(r(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(n.languageDetector=r(this.modules.languageDetector),n.languageDetector.init&&n.languageDetector.init(n,this.options.detection,this.options)),this.modules.i18nFormat&&(n.i18nFormat=r(this.modules.i18nFormat),n.i18nFormat.init&&n.i18nFormat.init(this)),this.translator=new Me(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,t||=G,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let i=M(),a=()=>{let e=(e,n)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),i.resolve(n),t(e,n)};if((this.languages||this.isLanguageChangingTo)&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?a():setTimeout(a,0),i}loadResources(e,t=G){let n=t,r=j(e)?e:this.language;if(typeof e==`function`&&(n=e),!this.options.resources||this.options.partialBundledLanguages){if(r?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return n();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&(e.includes(t)||e.push(t))})};r?t(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(e)})}else n(null)}reloadResources(e,t,n){let r=M();return typeof e==`function`&&(n=e,e=void 0),typeof t==`function`&&(n=t,t=void 0),e||=this.languages,t||=this.options.ns,n||=G,this.services.backendConnector.reload(e,t,e=>{r.resolve(),n(e)}),r}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&ke.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&![`cimode`,`dev`].includes(e)){for(let e=0;e<this.languages.length;e++){let t=this.languages[e];if(![`cimode`,`dev`].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;let n=M();this.emit(`languageChanging`,e);let r=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},i=(i,a)=>{a?this.isLanguageChangingTo===e&&(r(a),this.translator.changeLanguage(a),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,a),this.logger.log(`languageChanged`,a)):this.isLanguageChangingTo=void 0,n.resolve((...e)=>this.t(...e)),t&&t(i,(...e)=>this.t(...e))},a=t=>{!e&&!t&&this.services.languageDetector&&(t=[]);let n=j(t)?t:t&&t[0],a=this.store.hasLanguageSomeTranslations(n)?n:this.services.languageUtils.getBestMatchFromCodes(j(t)?[t]:t);a&&(this.language||r(a),this.translator.language||this.translator.changeLanguage(a),this.services.languageDetector?.cacheUserLanguage?.(a)),this.loadResources(a,e=>{i(e,a)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(e),n}getFixedT(e,t,n,r){let i=r?.scopeNs,a=(e,t,...r)=>{let o;o=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(r)),o.lng=o.lng||a.lng,o.lngs=o.lngs||a.lngs;let s=o.ns!==void 0&&o.ns!==null;o.ns=o.ns||a.ns,o.keyPrefix!==``&&(o.keyPrefix=o.keyPrefix||n||a.keyPrefix);let c={...this.options,...o};Array.isArray(i)&&!s&&(c.ns=i),typeof o.keyPrefix==`function`&&(o.keyPrefix=V(o.keyPrefix,c));let l=this.options.keySeparator||`.`,u;return o.keyPrefix&&Array.isArray(e)?u=e.map(e=>(typeof e==`function`&&(e=V(e,c)),`${o.keyPrefix}${l}${e}`)):(typeof e==`function`&&(e=V(e,c)),u=o.keyPrefix?`${o.keyPrefix}${l}${e}`:e),this.t(u,o)};return j(e)?a.lng=e:a.lngs=e,a.ns=t,a.keyPrefix=n,a}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,t){let n=M();return this.options.ns?(j(e)&&(e=[e]),e.forEach(e=>{this.options.ns.includes(e)||this.options.ns.push(e)}),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}loadLanguages(e,t){let n=M();j(e)&&(e=[e]);let r=this.options.preload||[],i=e.filter(e=>!r.includes(e)&&this.services.languageUtils.isSupportedCode(e));return i.length?(this.options.preload=r.concat(i),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new Ne(W());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.includes(n.getLanguagePartFromCode(e))||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=G){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new Oe(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...W().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new ze(n)}return a.translator=new Me(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();K.createInstance,K.dir,K.init,K.loadResources,K.reloadResources,K.use,K.changeLanguage,K.getFixedT,K.t,K.exists,K.setDefaultNamespace,K.hasLoadedNamespace,K.loadNamespaces,K.loadLanguages;var qe=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);Y(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},Je={},q=(e,t,n,r)=>{Y(n)&&Je[n]||(Y(n)&&(Je[n]=new Date),qe(e,t,n,r))},Ye=(e,t)=>()=>{if(e.isInitialized)t();else{let n=()=>{setTimeout(()=>{e.off(`initialized`,n)},0),t()};e.on(`initialized`,n)}},J=(e,t,n)=>{e.loadNamespaces(t,Ye(e,n))},Xe=(e,t,n,r)=>{if(Y(n)&&(n=[n]),e.options.preload&&e.options.preload.indexOf(t)>-1)return J(e,n,r);n.forEach(t=>{e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,Ye(e,r))},Ze=(e,t,n={})=>!t.languages||!t.languages.length?(q(t,`NO_LANGUAGES`,`i18n.languages were undefined or empty`,{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:n.lng,precheck:(t,r)=>{if(n.bindI18n&&n.bindI18n.indexOf(`languageChanging`)>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}),Y=e=>typeof e==`string`,Qe=e=>typeof e==`object`&&!!e,$e=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,et={"&":`&`,"&":`&`,"<":`<`,"<":`<`,">":`>`,">":`>`,"'":`'`,"'":`'`,""":`"`,""":`"`," ":` `," ":` `,"©":`©`,"©":`©`,"®":`®`,"®":`®`,"…":`…`,"…":`…`,"/":`/`,"/":`/`},tt=e=>et[e],X={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:e=>e.replace($e,tt),transDefaultProps:void 0},nt=(e={})=>{X={...X,...e}},rt=()=>X,it,at=e=>{it=e},ot=()=>it,st={type:`3rdParty`,init(e){nt(e.options.react),at(e)}},ct=(0,s.createContext)(),lt=class{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}},ut=o(),dt={t:(e,t)=>{if(Y(t))return t;if(Qe(t)&&Y(t.defaultValue))return t.defaultValue;if(typeof e==`function`)return``;if(Array.isArray(e)){let t=e[e.length-1];return typeof t==`function`?``:t}return e},ready:!1},ft=()=>()=>{},pt=(e,t={})=>{let{i18n:n}=t,{i18n:r,defaultNS:i}=(0,s.useContext)(ct)||{},a=n||r||ot();a&&!a.reportNamespaces&&(a.reportNamespaces=new lt),a||q(a,`NO_I18NEXT_INSTANCE`,`useTranslation: You will need to pass in an i18next instance by using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`);let o=(0,s.useMemo)(()=>({...rt(),...a?.options?.react,...t}),[a,t]),{useSuspense:c,keyPrefix:l}=o,u=e||i||a?.options?.defaultNS,d=Y(u)?[u]:u||[`translation`],f=(0,s.useMemo)(()=>d,d);a?.reportNamespaces?.addUsedNamespaces?.(f);let p=(0,s.useRef)(0),m=(0,s.useCallback)(e=>{if(!a)return ft;let{bindI18n:t,bindI18nStore:n}=o,r=()=>{p.current+=1,e()};return t&&a.on(t,r),n&&a.store.on(n,r),()=>{t&&t.split(` `).forEach(e=>a.off(e,r)),n&&n.split(` `).forEach(e=>a.store.off(e,r))}},[a,o]),h=(0,s.useRef)(),g=(0,s.useCallback)(()=>{if(!a)return dt;let e=!!(a.isInitialized||a.initializedStoreOnce)&&f.every(e=>Ze(e,a,o)),n=t.lng||a.language,r=p.current,i=h.current;if(i&&i.ready===e&&i.lng===n&&i.keyPrefix===l&&i.revision===r)return i;let s={t:a.getFixedT(n,o.nsMode===`fallback`?f:f[0],l,{scopeNs:f}),ready:e,lng:n,keyPrefix:l,revision:r};return h.current=s,s},[a,f,l,o,t.lng]),[_,v]=(0,s.useState)(0),{t:y,ready:b}=(0,ut.useSyncExternalStore)(m,g,g);(0,s.useEffect)(()=>{if(a&&!b&&!c){let e=()=>v(e=>e+1);t.lng?Xe(a,t.lng,f,e):J(a,f,e)}},[a,t.lng,f,b,c,_]);let x=a||{},S=(0,s.useRef)(null),C=(0,s.useRef)(),w=e=>{let t=Object.getOwnPropertyDescriptors(e);t.__original&&delete t.__original;let n=Object.create(Object.getPrototypeOf(e),t);if(!Object.prototype.hasOwnProperty.call(n,`__original`))try{Object.defineProperty(n,"__original",{value:e,writable:!1,enumerable:!1,configurable:!1})}catch{}return n},T=(0,s.useMemo)(()=>{let e=x,t=e?.language,n=e;e&&(S.current&&S.current.__original===e&&C.current===t?n=S.current:(n=w(e),S.current=n,C.current=t));let r=!b&&!c?(...e)=>(q(a,`USE_T_BEFORE_READY`,`useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.`),y(...e)):y,i=[r,n,b];return i.t=r,i.i18n=n,i.ready=b,i},[y,x,b,x.resolvedLanguage,x.language,x.languages]);if(a&&c&&!b){let e=!1;try{e=!1}catch{}throw e&&q(a,`SUSPENDED_WHILE_LOADING`,`useTranslation: suspended while translations are loading (useSuspense is true by default). Add a <Suspense> boundary above this component, or set react.useSuspense: false in the i18next init options. https://react.i18next.com/latest/usetranslation-hook`),new Promise(e=>{let n=()=>e();t.lng?Xe(a,t.lng,f,n):J(a,f,n)})}return T},mt={"assetsPage.images":`Images`,"assetsPage.files":`Files`,"assetsPage.links":`Links`,"assetsPage.fromCurrentChat":`From current chat`,"assetsPage.adding":`Adding…`,"assetsPage.addLink":`Add link`,"assetsPage.addLinkAsset":`Add link asset`,"assetsPage.agentOutputs":`Agent outputs`,"assetsPage.all":`All`,"assetsPage.assetDeleted":`Asset deleted`,"assetsPage.assets":`assets`,"assetsPage.bringInALinkOrAttachAFileInAConversationPisperWillGatherTheOutputsCreatedAlongTheWay":`Bring in a link or attach a file in a conversation; Pisper will gather the outputs created along the way.`,"assetsPage.cancel":`Cancel`,"assetsPage.closeDialog":`Close dialog`,"assetsPage.conversationAttachmentsAndAgentOutputsGatherHereAutomatically":`Conversation attachments and Agent outputs gather here automatically.`,"assetsPage.delete":`Delete`,"assetsPage.deleteAsset":`Delete asset`,"assetsPage.deleteAssetName":`Delete asset “{name}”?`,"assetsPage.download":`Download`,"assetsPage.forExampleOpenAIAPIDocs":`For example, OpenAI API docs`,"assetsPage.fromName":`From: {name}`,"assetsPage.linkAssetAdded":`Link asset added`,"assetsPage.linksCanBeArchivedOpenedOrAddedToAChatAsContext":`Links can be archived, opened, or added to a chat as context.`,"assetsPage.loadingAssets":`Loading assets`,"assetsPage.chatAttachments":`Chat attachments`,"assetsPage.manualUploads":`Manual uploads`,"assetsPage.name":`Name`,"assetsPage.nameAddedToChat":`{name} added to chat`,"assetsPage.nothingHasGatheredHereYet":`Nothing has gathered here yet`,"assetsPage.open":`Open`,"assetsPage.preview":`Preview`,"assetsPage.thisFileTypeCanBeDownloadedSupportedDocumentsCanAlsoBeAddedToAChatForAnalysis":`This file type can be downloaded. Supported documents can also be added to a chat for analysis.`,"assetsPage.useInChat":`Use in chat`},ht={"channelsPage.feishu":`Feishu`,"channelsPage.weChat":`WeChat`,"channelsPage.feishuAppBot":`Feishu app bot`,"channelsPage.webSocketPersistentConnection":`Persistent WebSocket connection`,"channelsPage.tencentILinkPersistentConnection":`Persistent Tencent iLink connection`,"channelsPage.feishuCapabilities":`Direct messages, group mentions, images, and files`,"channelsPage.weChatCapabilities":`Personal WeChat messages, images, and files`,"channelsPage.notConnected":`Not connected`,"channelsPage.connecting":`Connecting`,"channelsPage.online":`Online`,"channelsPage.reconnecting":`Reconnecting`,"channelsPage.connectionFailed":`Connection failed`,"channelsPage.requestingLoginQrCode":`Requesting login QR code…`,"channelsPage.scanAndConfirmConnection":`Scan with your phone and confirm the connection`,"channelsPage.scannedWaitingForConfirmation":`Scanned; waiting for confirmation…`,"channelsPage.enterPairingCode":`Enter the numeric pairing code shown on your phone`,"channelsPage.confirmingAuthorization":`Confirming authorization…`,"channelsPage.authorizationSucceededConnecting":`Authorization succeeded; establishing connection…`,"channelsPage.channelConnected":`Channel connected`,"channelsPage.cancelled":`Cancelled`,"channelsPage.accessScope":`Access scope`,"channelsPage.accessScopeUpdated":`Access scope updated`,"channelsPage.afterYouScanAndConfirmCredentialsAreSavedAndTheChannelStaysOnlineIncomingMessagesGoDirectlyToThe":`After you scan and confirm, credentials are saved and the channel stays online. Incoming messages go directly to the selected model and {agent}.`,"channelsPage.cancel":`Cancel`,"channelsPage.cannotScanOpenTheSignInLink":`Cannot scan? Open the sign-in link`,"channelsPage.channelChatReset":`Channel chat reset`,"channelsPage.channelChats":`Channel chats`,"channelsPage.channelReplyModelUpdated":`Channel reply model updated`,"channelsPage.closeDialog":`Close dialog`,"channelsPage.connectedTime":`Connected {time}`,"channelsPage.connectNameByQRCode":`Connect {name} by QR code`,"channelsPage.continueScanning":`Continue scanning`,"channelsPage.countLinked":`{count} linked`,"channelsPage.createTheBotAppThroughTheOfficialFeishuAuthorizationPage":`Create the bot app through the official Feishu authorization page.`,"channelsPage.defaultModel":`Default model`,"channelsPage.defaultWorkingDirectoryForNewChats":`Default working directory for new chats`,"channelsPage.defaultWorkingDirectorySaved":`Default working directory saved`,"channelsPage.disconnect":`Disconnect`,"channelsPage.disconnectName":`Disconnect {name}`,"channelsPage.eachContactOrChatMapsToAnIndependentAgentSession":`Each contact or chat maps to an independent agent session`,"channelsPage.enableThisChannel":`Enable this channel`,"channelsPage.enterTheNumberShownOnYourPhone":`Enter the number shown on your phone`,"channelsPage.establishingPersistentConnection":`Establishing persistent connection`,"channelsPage.generateANewQRCode":`Generate a new QR code`,"channelsPage.loadingChannels":`Loading channels`,"channelsPage.localCredentialsAndChatMappingsWillBeDeleted":`Local credentials and chat mappings will be deleted.`,"channelsPage.localSecurityBoundary":`Local security boundary`,"channelsPage.channelPaused":`Channel paused`,"channelsPage.channelEnabled":`Channel enabled`,"channelsPage.allWeChatUsersWhoMessageTheBot":`All WeChat users who message the bot`,"channelsPage.allMembersInTheCurrentTenant":`All members in the current tenant`,"channelsPage.scanAgainToReconnect":`Scan again to reconnect`,"channelsPage.nameConnectionQRCode":`{name} connection QR code`,"channelsPage.nameDisconnected":`{name} disconnected`,"channelsPage.nameReconnected":`{name} reconnected`,"channelsPage.nameSettings":`{name} settings`,"channelsPage.nameTwoWayConnectionEstablished":`{name} two-way connection established`,"channelsPage.noMessages":`No messages`,"channelsPage.off":`Off`,"channelsPage.onceConnectedMessagesFromFeishuOrWeixinWillArriveHereInPisper":`Once connected, messages from Feishu or Weixin will arrive here in Pisper.`,"channelsPage.ownerOnlyAccessRespectsToolPermissionsAndExecutionMode":`Only the person who scanned the QR code is allowed by default. Agent tools still follow the configured tool permissions and session execution mode.`,"channelsPage.pairingCodeSubmitted":`Pairing code submitted`,"channelsPage.persistentTwoWayConnection":`Persistent two-way connection`,"channelsPage.processing":`Processing…`,"channelsPage.qrCodeExpiresTime":`QR code expires {time}`,"channelsPage.qrCodeOwnerOnly":`QR-code owner only`,"channelsPage.reconnect":`Reconnect`,"channelsPage.reconnectName":`Reconnect {name}`,"channelsPage.replyModel":`Reply model`,"channelsPage.reset":`Reset`,"channelsPage.resetChannelChat":`Reset channel chat`,"channelsPage.resetChat":`Reset chat`,"channelsPage.resetTheAppChatLinkedToScope":`Reset the {app} chat linked to “{scope}”?`,"channelsPage.save":`Save`,"channelsPage.scanningAgainWillReplaceTheCurrentNameConnectionContinue":`Scanning again will replace the current {name} connection. Continue?`,"channelsPage.signInToPersonalWeChatThroughTencentILinkBot":`Sign in to personal WeChat through Tencent iLink Bot.`,"channelsPage.submitPairingCode":`Submit pairing code`,"channelsPage.tencentILinkContinuouslyPollsDirectMessagesAndSupportsTextAndMediaReplies":`Tencent iLink continuously polls direct messages and supports text and media replies.`,"channelsPage.trueTwoWayMessagingNoNotificationWebhookRequired":`True two-way messaging; no notification webhook required`,"channelsPage.turnOffToDisconnectWhileKeepingSignInCredentials":`Turn off to disconnect while keeping sign-in credentials.`,"channelsPage.twoWay":`Two-way`,"channelsPage.twoWayCapability":`Two-way capability`,"channelsPage.useApplicationDefaultModel":`Use application default model`,"channelsPage.waitingForTheFirstReplyFromAfar":`Waiting for the first reply from afar`,"channelsPage.webSocketReceivesDirectMessagesAndGroupMentions":`WebSocket receives direct messages and group @ mentions.`},gt={"resourcePicker.title":`Invoke a resource`,"resourcePicker.description":`Insert a Prompt, invoke a Skill or Tool, or start a workflow you can track over time.`,"resourcePicker.open":`Open Prompts, Skills, Tools, and workflows`,"resourcePicker.close":`Close resource picker`,"resourcePicker.search":`Search Prompts, Skills, Tools, and workflows`,"resourcePicker.categories":`Resource categories`,"resourcePicker.all":`All`,"resourcePicker.prompt":`Prompt`,"resourcePicker.skill":`Skill`,"resourcePicker.workflow":`Workflow`,"resourcePicker.tool":`Tool`,"resourcePicker.loading":`Loading resources…`,"resourcePicker.empty":`No invokable resources found.`,"resourcePicker.noDescription":`No description`,"resourcePicker.chooseResource":`Choose a resource to configure the invocation.`,"resourcePicker.useResource":`Use this resource`,"resourcePicker.insertPrompt":`Insert Prompt`,"resourcePicker.remove":`Remove invoked resource`,"commands.open":`Open Slash commands`,"commands.prompt":`Prompt`,"commands.skill":`Skill`,"commands.loading":`Loading commands…`,"commands.loadError":`Commands could not be loaded.`,"commands.empty":`No matching commands.`,"commands.noDescription":`No description`,"commands.scope.user":`User`,"commands.scope.project":`Project`,"commands.scope.package":`Package`,"commands.scope.custom":`Custom`,"pathAttachmentPicker.title":`Attach local paths`,"pathAttachmentPicker.description":`Pass file paths to Agent without reading or uploading file contents.`,"pathAttachmentPicker.directoryPath":`File directory`,"pathAttachmentPicker.selectName":`Select {name}`,"pathAttachmentPicker.empty":`This directory has no files or subdirectories`,"pathAttachmentPicker.attachCount":`Attach {count} paths`,"sessionTree.menu":`Recall`,"sessionTree.menuDescription":`Explore key turns and branching paths`,"sessionTree.waitForRun":`Wait for the current run before opening Recall`,"sessionTree.title":`Recall`,"sessionTree.description":`This conversation contains {nodes} nodes across {branches} branching paths. Switching paths preserves the rest of the context.`,"sessionTree.conversation":`Chat`,"sessionTree.labeled":`Labeled`,"sessionTree.all":`All`,"sessionTree.allMarks":`All marks`,"sessionTree.markActive":`Active branch`,"sessionTree.markTimes":`Chat {sessionTime} · node {nodeTime}`,"sessionTree.noMarksYet":`No nodes have been marked yet. Click the mark icon on a message to mark it.`,"sessionTree.loadingMarks":`Loading marks`,"sessionTree.userMessage":`User message`,"sessionTree.agentMessage":`Agent response`,"sessionTree.toolResult":`Tool result`,"sessionTree.toolCall":`Tool call`,"sessionTree.branchSummary":`Branch summary`,"sessionTree.compactionSummary":`Context summary`,"sessionTree.settingsChange":`Runtime setting`,"sessionTree.labelChange":`Mark change`,"sessionTree.branchPosition":`Pending branch position`,"sessionTree.extensionEntry":`Runtime entry`,"sessionTree.metadataEntry":`Session metadata`,"sessionTree.message":`Message`,"sessionTree.current":`Current`,"sessionTree.fork":`Fork`,"sessionTree.active":`Active branch`,"sessionTree.loading":`Organizing Recall…`,"sessionTree.searchPlaceholder":`Search marks and node content`,"sessionTree.empty":`No nodes match this filter.`,"sessionTree.noPreview":`This node has no displayable text.`,"sessionTree.nodeLabel":`Node mark`,"sessionTree.labelPlaceholder":`Optional navigation marker`,"sessionTree.saveLabel":`Save mark`,"sessionTree.savingLabel":`Saving…`,"sessionTree.removeLabel":`Remove mark`,"sessionTree.abandonedBranchSummary":`Summarize the branch being left`,"sessionTree.abandonedBranchSummaryHint":`The current model generates context for the new branch. This makes one model request.`,"sessionTree.sideEffectsRemain":`Switching changes future conversation context only. It does not undo file, network, or tool effects.`,"sessionTree.navigating":`Switching…`,"sessionTree.currentPosition":`Current node`,"sessionTree.continueFromNode":`Continue from here`,"sessionTree.createChildChat":`Open a separate chat`,"sessionTree.creatingChildChat":`Creating separate chat…`,"sessionTree.conversationLineage":`Conversation lineage`,"sessionTree.returnToOriginalChat":`Return to original chat: {name}`,"sessionTree.openSeparateChat":`Open separate chat: {name}`,"sessionTree.chooseNode":`Choose a node to inspect it.`,"sessionTree.retry":`Retry`,"workflowRun.running":`Running`,"workflowRun.waitingApproval":`Waiting for approval`,"workflowRun.completed":`Completed`,"workflowRun.failed":`Failed`,"workflowRun.stopped":`Stopped`,"workflowRun.interrupted":`Interrupted`,"workflowRun.approve":`Approve`,"workflowRun.reject":`Reject`,"workflowRun.stop":`Stop run`,"workflowRun.request":`Request`,"workflowRun.inputs":`Inputs`,"planBoard.ariaLabel":`Execution plan`,"planBoard.toggleAriaLabel":`Expand or collapse the current execution plan`,"planBoard.openCurrentPlan":`View current plan, {progress}`,"planBoard.progress":`Plan · {completed}/{total}`,"planBoard.countInProgress":`{count} in progress`,"planBoard.countBlocked":`{count} blocked`,"planBoard.completed":`Completed`,"planBoard.inProgress":`In progress`,"planBoard.blocked":`Blocked`,"planBoard.pending":`Pending`,"planBoard.unassigned":`Unassigned`,"planBoard.assignedTo":`Assigned to {name}`,"planBoard.waitingFor":`Waiting for: {tasks}`,"agentRunActivity.readingFiles":`Reading files`,"agentRunActivity.searchingContent":`Searching content`,"agentRunActivity.findingFiles":`Finding files`,"agentRunActivity.browsingDirectories":`Browsing directories`,"agentRunActivity.editingFiles":`Editing files`,"agentRunActivity.writingFiles":`Writing files`,"agentRunActivity.runningCommands":`Running commands`,"agentRunActivity.searchingMemory":`Searching memory`,"agentRunActivity.savingMemory":`Saving memory`,"agentRunActivity.startingSubagent":`Starting subagent`,"agentRunActivity.checkingSubagents":`Checking subagents`,"agentRunActivity.messagingSubagent":`Messaging subagent`,"agentRunActivity.addingSubagentTask":`Adding a subagent task`,"agentRunActivity.waitingForSubagent":`Waiting for subagent`,"agentRunActivity.interruptingSubagent":`Interrupting subagent`,"agentRunActivity.liveCommandOutput":`Live command output`,"agentRunActivity.readingPlan":`Reading plan`,"agentRunActivity.updatingPlan":`Updating plan`,"agentRunActivity.controllingBrowser":`Controlling browser`,"agentRunActivity.generatingVisualContent":`Generating visual content`,"agentRunActivity.discoveringTools":`Discovering optional tools`,"agentRunActivity.filesRead":`Files read`,"agentRunActivity.searchCompleted":`Search completed`,"agentRunActivity.findCompleted":`Find completed`,"agentRunActivity.directoriesBrowsed":`Directories browsed`,"agentRunActivity.filesEdited":`Files edited`,"agentRunActivity.filesWritten":`Files written`,"agentRunActivity.commandCompleted":`Command completed`,"agentRunActivity.commandOutput":`Command output`,"agentRunActivity.subagentStarted":`Subagent started`,"agentRunActivity.subagentStatusUpdated":`Subagent status updated`,"agentRunActivity.toolsDiscovered":`Tool discovery completed`,"agentRunActivity.agentQueued":`{name} is queued`,"agentRunActivity.agentStarting":`{name} is starting`,"agentRunActivity.agentRunning":`{name} is running`,"agentRunActivity.agentCompleted":`{name} completed`,"agentRunActivity.agentInterrupted":`{name} was interrupted`,"agentRunActivity.agentFailed":`{name} failed`,"agentRunActivity.agentStatusUpdated":`{name} status updated`,"agentRunActivity.addedTitle":`Added: {title}`,"agentRunActivity.advancingTheTask":`Advancing the task`,"agentRunActivity.blockedTitle":`Blocked: {title}`,"agentRunActivity.compactingContext":`Compacting context`,"agentRunActivity.completedTitle":`Completed: {title}`,"agentRunActivity.completedTotalCompleted":`{completed}/{total} completed`,"agentRunActivity.contextCompactedBeforeAfterTokens":`Context compacted: {before} → {after} tokens`,"agentRunActivity.contextIsFullTheRequestWillRetryAfterCompaction":`Context is full; the request will retry after compaction`,"agentRunActivity.contextIsNearingItsLimitSummarizingOlderMessages":`Context is nearing its limit; summarizing older messages`,"agentRunActivity.countInProgress":`{count} in progress`,"agentRunActivity.countLiveOperations":`{count} live operations`,"agentRunActivity.countCompletedOperations":`{count} operations completed`,"agentRunActivity.countMoreChanges":`{count} more changes`,"agentRunActivity.countPlanChanges":`{count} plan changes`,"agentRunActivity.currentOperationCompleted":`Current operation completed`,"agentRunActivity.inProgressTitle":`In progress: {title}`,"agentRunActivity.noNewProgressForCountS":`No new progress for {count}s`,"agentRunActivity.pendingTitle":`Pending: {title}`,"agentRunActivity.planCleared":`Plan cleared`,"agentRunActivity.planUpdated":`Plan updated`,"agentRunActivity.preparingTheResponse":`Preparing the response`,"agentRunActivity.processingToolResult":`Processing tool result`,"agentRunActivity.startingTheModel":`Starting the model request`,"agentRunActivity.reasoningAboutTheNextStep":`Reasoning about the next step`,"agentRunActivity.reasoningInProgress":`Thinking`,"agentRunActivity.reasoningCompleted":`Reasoning`,"agentRunActivity.toggleReasoning":`Expand or collapse reasoning`,"agentRunActivity.toolActivityAriaLabel":`Tool activity`,"agentRunActivity.removedTitle":`Removed: {title}`,"agentRunActivity.retryingRequest":`Retrying request`,"agentRunActivity.runStopped":`Run stopped`,"agentRunActivity.subagent":`Subagent`,"agentRunActivity.summarizingOlderMessages":`Summarizing older messages`,"agentRunActivity.summarizingOlderMessagesAsRequested":`Summarizing older messages as requested`,"agentRunActivity.thisRunFailed":`This run failed`,"agentRunActivity.toolFailed":`{tool} failed`,"agentRunActivity.tools":`Tools`,"agentRunActivity.understandingTheTask":`Understanding the task`,"agentRunActivity.usingTool":`Using {tool}`,"agentRunActivity.waitingForTheModel":`Waiting for the model`,"agentRunActivity.waitingToRetry":`Waiting to retry`,"agentRunActivity.finalizingTheRun":`Finalizing this run`,"attachments.couldNotReadFile":`Could not read file`,"attachments.nameExceedsThe10MBLimit":`{name} exceeds the 10 MB limit`,"attachments.nameIsNotSupportedChooseAnImageOrTextCodeFile":`{name} is not supported. Choose an image, document, or text/code file.`,"attachments.totalAttachmentSizeCannotExceed20MB":`Total attachment size cannot exceed 20 MB`,"chatDock.openAChatFromTheSessionListOrSplitItInAnyDirection":`Open a chat from the sidebar, or split it in any direction.`,"chatDock.openAChatToBegin":`Open a chat to begin`,"chatHistoryPage.agentRunning":`Agent running`,"chatHistoryPage.chatDeleted":`Chat deleted`,"chatHistoryPage.chatHistory":`Chat history`,"chatHistoryPage.chatTitle":`Chat title`,"chatHistoryPage.chatTitleUpdated":`Chat title updated`,"chatHistoryPage.countChatHistoryItems":`{count} chat history items`,"chatHistoryPage.countCurrentlyFiltered":`{count} currently filtered`,"chatHistoryPage.countMessages":`{count} messages`,"chatHistoryPage.delete":`Delete`,"chatHistoryPage.deleteChat":`Delete chat`,"chatHistoryPage.deleteChatNameThisAlsoRemovesLocalChatHistory":`Delete chat “{name}”? This also removes local chat history.`,"chatHistoryPage.loadingChatHistory":`Loading chat history`,"chatHistoryPage.noConversationsHaveLeftAnEchoYet":`No conversations have left an echo yet`,"chatHistoryPage.noMatchingConversations":`No matching conversations`,"chatHistoryPage.noMessageSummary":`No message summary`,"chatHistoryPage.onceAConversationBeginsItWillBeQuietlyGatheredHere":`Once a conversation begins, it will be quietly gathered here.`,"chatHistoryPage.refresh":`Refresh`,"chatHistoryPage.renameChat":`Rename chat`,"chatHistoryPage.save":`Save`,"chatHistoryPage.sortedByMostRecentlyUpdated":`Sorted by most recently updated`,"chatHistoryPage.splitNameToTheBottom":`Split {name} below`,"chatHistoryPage.splitNameToTheLeft":`Split {name} to the left`,"chatHistoryPage.splitNameToTheRight":`Split {name} to the right`,"chatHistoryPage.splitNameToTheTop":`Split {name} above`,"chatHistoryPage.splitToBottom":`Split below`,"chatHistoryPage.splitToLeft":`Split to left`,"chatHistoryPage.splitToRight":`Split to right`,"chatHistoryPage.splitToTop":`Split above`,"chatHistoryPage.tryADifferentSearch":`Try a different search.`,"chatHistoryPage.untitledChat":`Untitled chat`,"chatMessage.closePreview":`Close preview`,"chatMessage.downloadOriginal":`Download original`,"chatMessage.deriveFromHere":`Continue from here`,"chatMessage.continueFromHere":`Continue from here`,"chatMessage.createChildChat":`Open a separate chat from here`,"chatMessage.labelThisTurn":`Mark this turn`,"chatMessage.fileAttachment":`File attachment`,"chatMessage.fullScreenImagePreview":`Full-screen image preview`,"chatMessage.generatedImage":`Generated image`,"chatMessage.generatedVideo":`Generated video`,"chatMessage.imageAttachment":`Image attachment`,"chatMessage.openFullScreenPreview":`Open full-screen preview`,"chatPage.appChat":`{app} chat`,"chatPage.approvalRequired":`Review before writing`,"chatPage.approvalStatusUpdated":`Approval status updated`,"chatPage.chatTitle":`Chat title`,"chatPage.chatTitleUpdated":`Chat title updated`,"chatPage.checkTheSystemSettingsAndTryAgain":`Check the system settings and try again`,"chatPage.continueSetup":`Continue setup`,"chatPage.contextCompacted":`Context compacted`,"chatPage.compactAfterModelSwitch":`Compact the current context?`,"chatPage.compactAfterModelSwitchDescription":`The previous prefix cache cannot be reused after switching models. Compacting now reduces the input the new model must process on its first request.`,"chatPage.compactNow":`Compact now`,"chatPage.currentRunStopped":`Current run stopped`,"chatPage.branchedFromNode":`Derived a branch from this turn; the conversation continues here`,"chatPage.derivedChatCreated":`Separate chat created`,"chatPage.derivedSessionName":`{name} · Separate`,"chatPage.createChildChat":`Open a separate chat from here`,"chatPage.separateChatSuffix":`Separate`,"chatPage.childChatCreated":`Separate chat created`,"chatPage.create":`Create`,"chatPage.enableFullAccess":`Enable full access`,"chatPage.enableSecureExecution":`Enable secure execution`,"chatPage.executionModeChangedToMode":`Execution mode changed to {mode}`,"chatPage.fullAccess":`Full access`,"chatPage.fullAccessAllowsTheAgentToUseFilesAndNetworkServicesOutsideTheWorkspaceAndShellCommandsWillNoLon":`Full access allows the Agent to use files and network services outside the workspace and run Shell as the current OS user without per-command approval.`,"chatPage.goalPaused":`Goal paused`,"chatPage.goalTokenBudgetUpdated":`Goal token budget updated`,"chatPage.modelsSessionsAndContextAreSettlingIntoPlace":`Models, sessions, and context are settling into place…`,"chatPage.newChat":`New chat`,"chatPage.newChatCreated":`New chat created`,"chatPage.noModelConfigured":`No model configured`,"chatPage.onNarrowScreensChatsStayInASingleTabGroup":`On narrow screens, chats stay in a single tab group.`,"chatPage.pleaseAnalyzeTheseAttachments":`Please analyze these attachments.`,"chatPage.readOnly":`Read only`,"chatPage.renameChat":`Rename chat`,"chatPage.retryingAttemptMaxAttemptsMessage":`Retrying {attempt}/{maxAttempts}: {message}`,"chatPage.save":`Save`,"chatPage.splitToBottom":`Split below`,"chatPage.splitToLeft":`Split to left`,"chatPage.splitToRight":`Split to right`,"chatPage.splitToTop":`Split above`,"chatPage.stopped":`Stopped`,"chatPage.switchedToModel":`Switched to {model}`,"chatPage.switchedToThinkingLevel":`Switched thinking level to {level}`,"chatPage.theAgentHasFinishedResponding":`The agent has finished responding.`,"chatPage.theChatWasCreatedButTheListCouldNotBeRefreshedError":`The chat was created, but the list could not be refreshed: {error}`,"chatPage.thisGroupHasOnlyOneChatChooseAnotherChatFromTheSessionListToCreateASplit":`This group has only one chat. Choose another chat from the session list to create a split.`,"chatPage.unsupportedEnvironment":`Unsupported environment`,"chatPage.untitledChat":`Untitled chat`,"chatPage.waitingForConfiguration":`Waiting for configuration`,"chatPage.wakingTheAgent":`Waking the Agent`,"chatPage.workingDirectoryChangedToWorkspace":`Working directory changed to {workspace}`,"chatPage.workingDirectoryPath":`Working directory path`,"chatPage.enterAWorkingDirectoryPath":`Enter the full path to the working directory (the desktop shell offers a system picker)`,"chatPage.stopTheActiveRunBeforeChangingTheWorkspace":`Stop the active run before changing the working directory`,"chatPage.stopTheActiveRunBeforeRenamingTheChat":`Stop the active run before renaming the chat`,"chatPage.stopTheActiveRunBeforeChangingTheExecutionMode":`Stop the active run before changing the execution mode`,"focusSession.addAttachment":`Add attachment`,"focusSession.openCommandPaletteShortcut":`Open command palette ({shortcut})`,"focusSession.quickActions":`Quick actions`,"focusSession.expandQuickActions":`Expand quick actions`,"focusSession.collapseQuickActions":`Collapse quick actions`,"focusSession.commands":`Commands`,"focusSession.addGuidanceForTheRunningAgent":`Add guidance for the running agent`,"focusSession.addGuidanceForTheRunningAgentShiftEnterForANewLine":`Add guidance for the running agent; Shift + Enter for a new line`,"focusSession.allow":`Allow`,"focusSession.allowOnce":`Allow once`,"focusSession.autoCompactionThreshold":`Auto-compaction threshold`,"focusSession.autoCompactionThresholdAboutPercent":`Auto-compaction threshold: about {percent}%`,"focusSession.automaticContextCompactionIsDisabled":`Automatic context compaction is disabled`,"focusSession.cannotSwitchWhileTheAgentIsRunning":`Cannot switch while the agent is running`,"focusSession.changeDirectory":`Change folder`,"focusSession.changeWorkingDirectoryWorkspace":`Change working directory: {workspace}`,"focusSession.chatActions":`Chat actions`,"focusSession.closeTab":`Close tab`,"focusSession.compactContextNow":`Compact context now`,"focusSession.compactingContext":`Compacting context`,"focusSession.contextUsageTokensLimitTokensPercent":`Context usage: {tokens} / {limit} tokens ({percent}%)`,"focusSession.contextUsageToCompactionTokensPercent":`{tokens} tokens ({percent}%) remain before auto-compaction`,"focusSession.contextUsageWillUpdateAfterTheNextModelResponseLimitLimitTokens":`Context usage will update after the next model response; limit: {limit} tokens`,"focusSession.countMore":`{count} more`,"focusSession.countMoreWaiting":`{count} more waiting`,"focusSession.currentChatModel":`Current chat model`,"focusSession.currentModelModelCannotSwitchWhileRunning":`Current model: {model} (cannot switch while running)`,"focusSession.currentModelModelClickToSwitch":`Current model: {model}. Click to switch.`,"focusSession.currentThinkingLevel":`Current thinking level`,"focusSession.currentThinkingLevelLevelCannotSwitchWhileRunning":`Current thinking level: {level} (cannot switch while running)`,"focusSession.currentThinkingLevelLevelClickToSwitch":`Current thinking level: {level}. Click to switch.`,"focusSession.thinkingLevelUnsupported":`The current model has no configurable thinking levels`,"focusSession.thinkingLevelFixed":`The current model only supports the {level} thinking level`,"focusSession.thinkingLevelsLoadFailed":`Thinking levels failed to load. Refresh to retry.`,"focusSession.loadingThinkingLevels":`Loading thinking levels…`,"focusSession.deny":`Deny`,"focusSession.document":`Document`,"focusSession.derivedFromSession":`Derived from “{name}”`,"focusSession.enableForTheNextMessageOnly":`Enable for the next message only`,"focusSession.estimatedContextUsageTokensLimitTokensPercent":`Estimated context usage: {tokens} / {limit} tokens ({percent}%)`,"focusSession.executionMode":`Execution mode`,"focusSession.executionModeMode":`Execution mode: {mode}`,"focusSession.executionModeModeDescription":`Execution mode: {mode} — {description}`,"focusSession.explainCode":`Explain code`,"focusSession.explainHowThisCodeWorks":`Explain how this code works:`,"focusSession.findABug":`Find a bug`,"focusSession.summarize":`Summarize`,"focusSession.summarizeContentAndExtractKeyPoints":`Summarize the following content and extract the key points:`,"focusSession.findIssues":`Find issues`,"focusSession.fullAccess":`Full access`,"focusSession.goalComplete":`Goal complete`,"focusSession.goalMode":`Goal mode`,"focusSession.goalBudgetSave":`Save budget`,"focusSession.goalTokenBudget":`Token budget`,"focusSession.goalTokenBudgetHint":`At least {min} tokens, no upper limit`,"focusSession.goalTokenBudgetUpdateHint":`Applies immediately and is used on the next goal resume`,"focusSession.gitCancel":`Cancel`,"focusSession.gitChanges":`Changes`,"focusSession.gitCommit":`Commit`,"focusSession.gitCommitMessagePlaceholder":`Commit message (default: Agent changes)`,"focusSession.gitCommitted":`Changes committed`,"focusSession.gitConfirmRevert":`Confirm revert`,"focusSession.gitCloseDiff":`Close diff`,"focusSession.gitDetachedHead":`Detached HEAD`,"focusSession.gitDiffChangedFiles":`Changed files`,"focusSession.gitDiffFileCount":`{count} files`,"focusSession.gitDiffModified":`Modified`,"focusSession.gitDiffNoTextChanges":`No text changes are available for this file`,"focusSession.gitDiffOriginal":`Original`,"focusSession.gitDiffTruncated":`diff truncated (too large)`,"focusSession.gitDiffUnavailable":`No diff available`,"focusSession.gitFilesChanged":`{count} files`,"focusSession.gitLoading":`Loading...`,"focusSession.gitLoadFailed":`Failed to load. Click refresh to retry.`,"focusSession.gitUnavailable":`No git/svn command found. Install a version control tool and restart Pisper.`,"focusSession.gitMoreFiles":`{count} more files not shown`,"focusSession.gitNoChanges":`No uncommitted changes in the workspace`,"focusSession.gitNotARepository":`Current directory is not a Git/SVN workspace`,"focusSession.gitPush":`Push`,"focusSession.gitPushAhead":`Push {count} unpushed commits`,"focusSession.gitPushed":`Pushed to remote`,"focusSession.gitRefresh":`Refresh changes`,"focusSession.gitRevert":`Revert`,"focusSession.gitRevertDescription":`Discard all uncommitted changes (git reset --hard + git clean -fd)`,"focusSession.vcsRevertDescription":`Discard all uncommitted changes (Git: reset --hard + clean -fd; SVN: revert -R . + remove unversioned files)`,"focusSession.vcsSvnWorkspace":`SVN working copy`,"focusSession.gitReverted":`All changes reverted`,"focusSession.gitViewDiff":`View diff`,"focusSession.gitWaitForRunToFinish":`Wait for the current run to finish`,"focusSession.cacheHitRate":`Cache`,"focusSession.processedTokens":`Consumed tokens`,"focusSession.sessionUsageDetail":`Consumed {processed} · Input {input} · Output {output} · Cache read {cacheRead} · Cache write {cacheWrite} · Reasoning {reasoning} · {requests} requests`,"focusSession.goalPaused":`Goal paused`,"focusSession.goalReachedItsBudget":`Goal reached its budget`,"focusSession.helpMeLocateAndFixThisBug":`Help me locate and fix this bug:`,"focusSession.makeAPlan":`Make a plan`,"focusSession.makeAClearActionablePlanForThisGoal":`Create a clear, actionable plan for this goal:`,"focusSession.image":`Image`,"focusSession.localPath":`Local path`,"focusSession.keepTheHistoryAndCloseOnlyThisView":`Keep the history and close only this view`,"focusSession.letSBeginWithASparkOfAnIdea":`Give every idea its own branch`,"focusSession.timeLateNight":`It is late - wrap up and get some rest`,"focusSession.timeMorning":`Good morning - what shall we build today?`,"focusSession.timeLunch":`It is lunch time - take a break`,"focusSession.timeAfternoon":`Good afternoon - keep the momentum`,"focusSession.timeEvening":`Good evening - what is tonight's project?`,"focusSession.feelLikeBuildingAPlugin":`Feel like building a plugin today?`,"focusSession.letAgentWriteItsOwnTool":`Let the agent write its own tool?`,"focusSession.wireUpAnMcpServer":`Wire up an MCP server?`,"focusSession.scheduleTheRepetitiveWork":`Schedule the repetitive work away?`,"focusSession.turnRepeatedWorkIntoAWorkflow":`Turn repeated work into a workflow?`,"focusSession.branchOutAndRunInParallel":`Branch out and run a few in parallel?`,"focusSession.letMemoryRememberYou":`Let memory learn your preferences?`,"focusSession.loadingConversationHistory":`Loading conversation history…`,"focusSession.loadingOlderMessages":`Loading older messages…`,"focusSession.manualCompactionWaitForRun":`Wait for the current run to finish before compacting context`,"focusSession.loadOlderMessages":`Load older messages`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheBottom":`Move the current tab into a new group below`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheLeft":`Move the current tab into a new group on the left`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheRight":`Move the current tab into a new group on the right`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheTop":`Move the current tab into a new group above`,"focusSession.newChat":`New chat`,"focusSession.newContent":`New content`,"focusSession.onlyInspectAndAnalyzeContent":`Only inspect and analyze content`,"focusSession.approvalRequired":`Review before writing`,"focusSession.approvalRequiredShowsADiffBeforeWriting":`Show a Diff and wait for approval before changing workspace files; every Shell command also needs approval`,"focusSession.fullAccessRunsShellWithoutPerCommandApproval":`Can access host files and the network; Shell does not require per-command approval`,"focusSession.openChatActionsMenu":`Open chat actions menu`,"focusSession.readOnly":`Read only`,"focusSession.workspaceWrite":`Auto-approve`,"focusSession.workspaceWriteRunsCommandsWithAutomaticApproval":`Write to the workspace and auto-approve routine commands; external access remains restricted`,"focusSession.workspaceTrustLoadFailed":`Workspace trust could not be loaded; project resources remain restricted`,"focusSession.retryWorkspaceTrust":`Retry`,"focusSession.workspaceTrustRequired":`This workspace contains project resources`,"focusSession.workspaceTrustRequiredDescription":`Project Skills, prompts, settings, and system instructions load only after you trust it.`,"focusSession.workspaceResourcesRestricted":`Project resources are restricted`,"focusSession.workspaceResourcesRestrictedDescription":`Only user-level resources are loaded. Trust this workspace after verifying its source.`,"focusSession.keepWorkspaceRestricted":`Keep restricted`,"focusSession.trustWorkspace":`Trust workspace`,"focusSession.trustWorkspaceTitle":`Trust this workspace?`,"focusSession.trustWorkspaceDescription":`Project Skills, prompts, settings, and system instructions can change Agent behavior and may direct it to use tools. Continue only when you trust this directory and its source. Trust is not an operating-system sandbox.`,"focusSession.refactor":`Refactor`,"focusSession.refactorThisCodeAndExplainTheImprovements":`Refactor this code and explain the improvements:`,"focusSession.organizeInformation":`Organize information`,"focusSession.organizeThisInformationIntoAClearStructure":`Organize the following information into a clear structure:`,"focusSession.removeName":`Remove {name}`,"focusSession.renameChat":`Rename chat`,"focusSession.retryOlderMessages":`Retry older messages`,"focusSession.running":`Running`,"focusSession.savingCompactionThreshold":`Saving threshold…`,"focusSession.runningAutonomously":`Running autonomously`,"focusSession.sendMessage":`Send message`,"focusSession.sentToTheRunningAgent":`Sent to the running agent`,"focusSession.setWorkingDirectory":`Set working directory`,"focusSession.splitToBottom":`Split below`,"focusSession.splitToLeft":`Split to left`,"focusSession.splitToRight":`Split to right`,"focusSession.splitToTop":`Split above`,"focusSession.stop":`Stop`,"focusSession.text":`Text`,"focusSession.theNextMessageWillResumeTheGoal":`The next message will resume the Goal`,"focusSession.theNextMessageWillStartAGoal":`The next message will start a Goal`,"focusSession.thisGroupHasOnlyOneChat":`This group has only one chat`,"focusSession.toolRequestsApproval":`{tool} requests approval`,"focusSession.truncated":`Truncated`,"focusSession.unknownSourceSession":`Unknown source chat`,"focusSession.usedBudgetTokensUsed":`{used}/{budget} tokens used`,"focusSession.readyToWorkWithTheCurrentDirectoryAndHelpCompleteTheTask":`Pisper is ready to work with content in the current directory and help carry the task through. In full-access mode, Shell runs as the current operating-system user.`,"focusSession.viewCallArguments":`View call arguments`,"focusSession.waitingForInput":`Waiting for input`,"focusSession.reviewThisContentAndSuggestImprovements":`Review the following content, identify issues, and suggest improvements:`,"focusSession.writeTests":`Write tests`,"focusSession.workingDirectory":`Working directory`,"focusSession.writeUnitTestsForTheFollowingCode":`Write unit tests for the following code:`,"focusSession.writeWhatYouWantToAccomplish":`Write what you want to accomplish`,"focusSession.writeWhatYouWantToAccomplishShiftEnterForANewLine":`Write what you want to accomplish; Shift + Enter for a new line`},_t={"agentStatusAvatar.idle":`Pisper Agent`,"agentStatusAvatar.waiting":`Agent waiting for input`,"agentStatusAvatar.thinking":`Agent thinking`,"app.dragTabsOrSplitChatsInAnyDirectionFromTheSessionList":`Drag tabs, or split chats in any direction`,"app.sessions":`Sessions`,"app.wakingPisper":`Waking Pisper…`,"markdownMessage.copied":`Copied`,"markdownMessage.copy":`Copy`,"markdownMessage.copyCode":`Copy code`,"ui.cancel":`Cancel`,"ui.closeDialog":`Close dialog`,"ui.confirm":`Confirm`,"ui.demoInterfaceRuntimeNotConnected":`Demo interface · runtime not connected`,"ui.name":`Name`,"useAppDialog.confirm":`Confirm`,"useAppDialog.confirmAction":`Confirm action`,"useAppDialog.enterContent":`Enter content`,"useAppDialog.save":`Save`,"workspacePicker.enterAbsolutePath":`Enter an absolute path, such as /home/user/project`,"workspacePicker.go":`Go`,"workspacePicker.parentFolder":`Parent directory`,"workspacePicker.readingFolder":`Reading directory…`,"workspacePicker.selectDirectoryDescription":`Select a local working directory`,"workspacePicker.selectWorkspaceForChat":`Select the working directory for “{name}”`,"workspacePicker.selectWorkspaceForSchedule":`Select the working directory for this schedule`,"workspacePicker.setWorkingDirectory":`Set working directory`,"workspacePicker.switching":`Switching…`,"workspacePicker.thisFolderHasNoSubfolders":`This directory has no subdirectories`,"workspacePicker.useThisFolder":`Use this directory`,"workspacePicker.workingDirectoryPath":`Working directory path`,"webPreview.back":`Back`,"webPreview.embedNotice":`Some websites block embedded previews. Use Open in browser if the page does not load.`,"webPreview.forward":`Forward`,"webPreview.loading":`Loading preview…`,"webPreview.openExternal":`Open in browser`,"webPreview.reload":`Reload`,"webPreview.title":`Web preview`,"webPreview.url":`Preview URL`,"webPreview.urlPlaceholder":`Enter a URL…`,"app.importableProvidersTitle":`Importable providers found`,"app.importableProvidersMessage":`Found {count} importable provider(s) in local Codex/Claude configs. Open settings to review?`,"app.openSettings":`Open settings`},vt={"notificationSettings.feishu":`Feishu`,"notificationSettings.weChat":`WeChat`,"notificationSettings.browserNotification":`Notification`,"notificationSettings.chatCompleted":`Chat completed`,"notificationSettings.chatCompletedDescription":`Sent after Agent finishes responding`,"notificationSettings.chatWaiting":`Waiting for confirmation`,"notificationSettings.chatWaitingDescription":`Sent when Agent pauses and waits for user confirmation`,"notificationSettings.savedButLocalDeliveryUnavailable":`Saved (applies everywhere). This environment cannot show notifications: {reason}`,"notificationSettings.confirmationIsRequired":`Confirmation is required before this action can run.`,"notificationSettings.scheduleCompleted":`Scheduled task completed`,"notificationSettings.scheduleCompletedDescription":`Sent after a scheduled task completes successfully`,"notificationSettings.scheduleFailed":`Scheduled task failed`,"notificationSettings.scheduleFailedDescription":`Sent after a scheduled task fails`,"notificationSettings.workflowCompleted":`Workflow completed`,"notificationSettings.workflowCompletedDescription":`Sent after every node in a workflow completes`,"notificationSettings.workflowFailed":`Workflow failed`,"notificationSettings.workflowFailedDescription":`Sent after a workflow is interrupted or a node fails`,"settingsShell.agent":`Agent`,"settingsShell.agentCapabilities":`Agent capabilities`,"settingsShell.contextAndData":`Context and data`,"settingsShell.connections":`Connections`,"settingsShell.application":`Application`,"settingsShell.settingsNavigation":`Settings navigation`,"aboutSettings.copyright":`Pisper Contributors · MIT License`,"aboutSettings.description":`A multi-agent app for desktop, terminal, and mobile.`,"aboutSettings.license":`Open-source license`,"aboutSettings.projectInformation":`Project information`,"aboutSettings.sourceCode":`Source code`,"aboutSettings.starOnGitHub":`Support Pisper on GitHub`,"aboutSettings.supportDescription":`If Pisper has been useful to you, leave a Star on GitHub to help more people discover the project.`,"aboutSettings.supportPisper":`Support Pisper`,"aboutSettings.website":`Project website`,"configPage.addCountModels":`Add {count} models`,"configPage.added":`Added`,"configPage.adding":`Adding…`,"configPage.addManually":`Add manually`,"configPage.addModel":`Add model`,"configPage.addProvider":`Add Provider`,"configPage.addProviderConnection":`Add Provider connection`,"configPage.afterSavingExistingRuntimesAreReleasedAndNewChatsUseTheLatestPolicy":`Existing sessions keep running; new or reloaded sessions use the latest policy.`,"configPage.agentRuntimePolicy":`Agent runtime policy`,"configPage.agentSettingsSavedNewChatsWillUseThisModel":`Agent settings saved. New chats will use this model.`,"configPage.allChangesSaved":`Settings saved`,"configPage.apiKeyRequired":`API key required`,"configPage.apiKeyCouldNotBeUpdatedPleaseRetry":`The API key could not be updated. Please try again.`,"configPage.apiProtocol":`API protocol`,"configPage.about":`About`,"configPage.appUpdates":`App updates`,"configPage.authenticationAndEndpointsAreStoredIndependentlyForEachConnection":`Authentication and endpoints are stored independently for each connection`,"configPage.authenticationIncludedInConfiguration":`Authentication included in configuration`,"configPage.authenticationReady":`Authentication ready`,"configPage.authenticationRequired":`Authentication required`,"configPage.autoDetect":`Auto detect`,"configPage.automaticContext":`Automatic context`,"configPage.availableTools":`Available tools`,"configPage.cancel":`Cancel`,"configPage.cannotLoad":`Cannot load`,"configPage.chat":`Chat`,"configPage.chatGPTOAuthConnected":`ChatGPT OAuth connected`,"configPage.chatProvider":`Chat Provider`,"configPage.closeDialog":`Close dialog`,"configPage.codexCLILoginRequired":`Codex CLI login required`,"configPage.completeProviderAuthenticationBeforeSaving":`Enter an API key or load Provider authentication before saving.`,"configPage.configurationFileIsTooLarge":`Configuration file is too large`,"configPage.configured":`Configured`,"configPage.configuredLeaveBlankToKeepTheExistingKey":`Configured; leave blank to keep the existing key`,"configPage.conflictDetected":`Conflict detected`,"configPage.countModels":`{count} models`,"configPage.countModelsAdded":`{count} models added`,"configPage.createConnection":`Create connection`,"configPage.creating":`Creating…`,"configPage.customBaseURL":`Custom base URL`,"configPage.customManageEachToolOnThePluginsPage":`Custom: manage each tool on the Plugins page`,"configPage.defaultChatModel":`Chat model for this connection`,"configPage.defaultEndpointForModelsInThisConnection":`Default endpoint for models in this connection`,"configPage.delete":`Delete`,"configPage.deleteNameItsModelSettingsAndAuthenticationDetailsWillAlsoBeRemoved":`Delete “{name}”? Its model settings and authentication details will also be removed.`,"configPage.deleteProvider":`Delete Provider`,"configPage.deleteProviderConnection":`Delete Provider connection`,"configPage.disabled":`Disabled`,"configPage.disabled2":`Disabled`,"configPage.desktopPet":`Desktop pet`,"configPage.displayName":`Display name`,"configPage.enableAfterCreation":`Enable after creation`,"configPage.enabled":`Enabled`,"configPage.enableReasoningEffortThinkingLevel":`Enable reasoning effort / thinking level`,"configPage.enableToSave":`Enable to save`,"configPage.enterTheAPIKeyForThisConnection":`Enter the API key for this connection`,"configPage.enterTheProviderAPIKey":`Enter the Provider API key`,"configPage.enterProviderBaseURLBeforeSaving":`Enter the Provider Base URL before saving.`,"configPage.fetchAgain":`Fetch again`,"configPage.fetchFromAPI":`Fetch from API`,"configPage.fetching":`Fetching…`,"configPage.fetchModelIDsFromProviderOrAddOneManually":`Fetch model IDs from {provider}, or add one manually.`,"configPage.fetchModels":`Fetch models`,"configPage.fetchOrAddAChatModel":`Fetch or add a chat model.`,"configPage.forExampleOpenAIOfficial":`For example, OpenAI Official`,"configPage.fullToolAccess":`Full: add Shell`,"configPage.image":`Image`,"configPage.imageGenerationAndEditing":`Image generation and editing`,"configPage.initialModelID":`Initial model ID`,"configPage.incompleteLoginState":`Login state is incomplete; sign in again with the official client`,"configPage.interface":`Interface`,"configPage.invalidConfigurationFileFormat":`Invalid configuration file format`,"configPage.keyVariableName":`Key variable: {name}`,"configPage.leaveBlankToUseTheModelID":`Leave blank to use the model ID`,"configPage.loadAuthenticationToSave":`Load authentication to save`,"configPage.loadConfiguration":`Load configuration`,"configPage.loadLoginState":`Load login state`,"configPage.loadOfficialProviderLoginStateFromSource":`Load the login state from {source}? It will be bound only to the official Provider and will not be used with custom Base URLs.`,"configPage.loaded":`Loaded`,"configPage.loading":`Loading…`,"configPage.loadingModelCatalog":`Loading model catalog`,"configPage.loadProviderConfiguration":`Load provider configuration`,"configPage.loadThisProviderConfigurationFromSource":`Load this Provider configuration from {source}?`,"configPage.localProviderConfiguration":`Local provider configuration`,"configPage.modelBaseURL":`Model Base URL`,"configPage.modelID":`Model ID`,"configPage.modelName":`Model name`,"configPage.models":`Models`,"configPage.modelType":`Model type`,"configPage.multipleAuthenticationFieldsWereDetectedTheAuthorizationFieldTakesPrecedence":`Multiple authentication fields were detected; the authorization field takes precedence.`,"configPage.nameConfigurationHasBeenLoadedIntoPisper":`{name} configuration has been loaded into Pisper`,"configPage.nameLoginStateHasBeenLoadedIntoPisper":`{name} login state has been loaded into Pisper`,"configPage.nameState":`{name} {state}`,"configPage.noAuthenticationInConfiguration":`No authentication in configuration`,"configPage.noBaseURLSpecified":`No Base URL specified`,"configPage.noChatModelAvailable":`No chat model available`,"configPage.noImportableCodexOrClaudeProviderConfigurationWasDetected":`No importable Codex or Claude provider configuration was detected.`,"configPage.noImportableProviderConfigurationWasFound":`No importable provider configuration was found`,"configPage.noMatchingModels":`No matching models`,"configPage.noModelSpecified":`No model specified`,"configPage.notAuthenticated":`Not authenticated`,"configPage.notifications":`Notifications`,"configPage.remoteAccess":`Remote access`,"configPage.mobileServer":`Servers`,"mobileServer.addServer":`Add server`,"mobileServer.awaitingApproval":`A connection request was sent to “{name}”. Approve it on the desktop.`,"mobileServer.cameraDenied":`Camera permission was not granted. Use manual pairing instead.`,"mobileServer.cancelRequest":`Cancel request`,"mobileServer.cancelScan":`Cancel scan`,"mobileServer.code":`Pairing code`,"mobileServer.connect":`Connect`,"mobileServer.current":`Connected`,"mobileServer.currentLocal":`Running here`,"mobileServer.description":`Choose which desktop to connect to. Sessions and data live on the desktop; this device is a client.`,"mobileServer.discoverDescription":`Choose a desktop found on this LAN and wait for its approval, or pair remotely with a QR code.`,"mobileServer.discovering":`Searching this LAN for Pisper Desktop…`,"mobileServer.discoveryFailed":`LAN discovery is unavailable. Try again or pair with a QR code.`,"mobileServer.localNetworkDenied":`Local network access is required to discover desktops. Allow it in system settings and retry.`,"mobileServer.empty":`No paired servers yet. Tap “Add server” to connect.`,"mobileServer.forget":`Forget`,"mobileServer.forgetConfirm":`You will need to pair again to reconnect to this server. Forget it?`,"mobileServer.loadFailed":`Failed to load the server list. Please restart the app.`,"mobileServer.localTitle":`On-device`,"mobileServer.localDescription":`Run the same Pisper Runtime used by desktop directly on this device. Available capabilities depend on the device environment.`,"mobileServer.enterLocal":`Run on this device`,"mobileServer.manual":`Pair manually`,"mobileServer.nearby":`Nearby desktops`,"mobileServer.noNearby":`No available desktops were found. Make sure remote access is enabled on the computer.`,"mobileServer.otherMethods":`Other connection methods`,"mobileServer.pair":`Pair`,"mobileServer.pairFailed":`Pairing succeeded, but the server proxy address is unavailable.`,"mobileServer.scan":`Scan QR code`,"mobileServer.scanFailed":`No valid pairing QR code was found.`,"mobileServer.scanHint":`Place the desktop QR code inside the frame. It scans automatically; no photo is needed.`,"mobileServer.scanTitle":`Scan pairing QR code`,"mobileServer.rediscover":`Search the LAN again`,"mobileServer.requestConnect":`Request access`,"mobileServer.url":`Desktop address`,"mobileServer.activeTransport":`Current path: {transport}`,"mobileServer.transportLan":`LAN`,"mobileServer.transportLanP2p":`LAN + P2P`,"mobileServer.transportP2p":`P2P`,"mobileServer.localTransport":`On-device`,"mobileServer.title":`Servers`,"remoteAccess.approvalFailed":`Failed to process the connection request: {message}`,"remoteAccess.approve":`Approve`,"remoteAccess.codeExpiresAt":`Pairing code expires {time}`,"remoteAccess.currentDevice":`(this device)`,"remoteAccess.description":`Connect a phone or tablet to this Pisper instance. The app prefers LAN and falls back to Iroh P2P away from home; TLS fingerprint pinning and device tokens still protect the upper layer.`,"remoteAccess.devices":`Paired devices`,"remoteAccess.fingerprint":`Certificate fingerprint`,"remoteAccess.generateQr":`Generate pairing QR code`,"remoteAccess.generatingQr":`Generating…`,"remoteAccess.lastSeen":`Last active: {time}`,"remoteAccess.irohDirectOnly":`P2P direct addresses are ready; relay is still connecting`,"remoteAccess.irohFailed":`P2P failed to start: {message}`,"remoteAccess.irohReady":`P2P relay is ready`,"remoteAccess.irohStarting":`P2P is starting`,"remoteAccess.listenFailed":`Remote listener failed to start: {message}`,"remoteAccess.loadFailed":`Failed to load remote access status. Make sure the runtime supports remote access.`,"remoteAccess.noDevices":`No paired devices yet. Generate a pairing QR code and scan it with the Pisper app on your phone.`,"remoteAccess.pairing":`Device pairing`,"remoteAccess.pairingDescription":`Click the button to open a pairing QR code. The pairing code is valid for 5 minutes and can be used once.`,"remoteAccess.pairingFailed":`Failed to generate pairing code: {message}`,"remoteAccess.pairingQrTitle":`Pair with the Pisper app`,"remoteAccess.pendingApprovals":`Pending connections`,"remoteAccess.pendingApprovalsDescription":`Approve only the device you are connecting now. It cannot access sessions or Runtime APIs before approval.`,"remoteAccess.qrAlt":`Pairing QR code`,"remoteAccess.qrUnavailable":`The QR code could not be generated. Regenerate it or restart the desktop Runtime.`,"remoteAccess.scanQrDescription":`Open Add server on your phone and scan the QR code below. The app prefers LAN and falls back to Iroh P2P when needed.`,"remoteAccess.regenerate":`Regenerate`,"remoteAccess.refresh":`Refresh`,"remoteAccess.reject":`Reject`,"remoteAccess.requestedAt":`Requested {time}`,"remoteAccess.requestSource":`Source address: {ip}`,"remoteAccess.revoke":`Revoke`,"remoteAccess.revokeConfirm":`Revoking will immediately disconnect “{name}”. Continue?`,"remoteAccess.revokeFailed":`Failed to revoke device: {message}`,"remoteAccess.title":`Remote access`,"remoteAccess.toggleFailed":`Failed to toggle remote access: {message}`,"configPage.loginStateFileDetected":`Verified OAuth login state`,"configPage.officialEndpointOnly":`Official endpoint only`,"configPage.officialProviderAuthenticationOnly":`Official Provider authentication`,"configPage.openAICodexUsesChatGPTPlusProOAuthAndDoesNotAcceptARegularAPIKey":`OpenAI Codex uses ChatGPT Plus/Pro OAuth and does not accept a regular API key.`,"configPage.optionalLeaveBlankToInheritTheProviderBaseURL":`Optional; leave blank to inherit the Provider base URL`,"configPage.optionalOverrideTheProviderBaseURLForThisModel":`Optional; override the Provider base URL for this model`,"configPage.optionalUsedOnlyForOpenAIOrganization":`Optional; used only for OpenAI Organization`,"configPage.permissionsAreEnforcedByTheRuntime":`Permissions are enforced by the Runtime`,"configPage.providerConnectionCreated":`Provider connection created`,"configPage.providerConnectionDeleted":`Provider connection deleted`,"configPage.providerConnections":`Provider connections`,"configPage.modelService":`Model service`,"configPage.currentModelService":`Current model service`,"configPage.providerPurpose":`Provider purpose`,"configPage.providerSettingsSaved":`Provider settings saved`,"configPage.providerWasNotReadyAfterSaving":`The Provider is still unauthenticated or disabled after saving. Check the settings and try again.`,"configPage.readingProvidersAndAuthenticationStatus":`Reading Providers and authentication status…`,"configPage.readOnlyInspectionTools":`Read only: inspect and search`,"configPage.readProviderEndpointModelAndAuthenticationFieldsFromCodexConfigTomlAndClaudeSettingsJson":`Read Provider settings and explicitly import official Codex or Claude login states from local files.`,"configPage.reasoningModel":`Reasoning model`,"configPage.reasoningSupported":`Reasoning supported`,"configPage.remoteModelCatalog":`Remote model catalog`,"configPage.rescan":`Rescan`,"configPage.runtimeStatus":`Runtime status`,"configPage.currentDefaultProvider":`Current default Provider`,"configPage.saveProviderSettings":`Save Provider settings`,"configPage.setAsDefaultProvider":`Set as default Provider`,"configPage.saveVisualModelSettings":`Save visual model settings`,"configPage.saving":`Saving…`,"configPage.scanningProviderConfigurationFiles":`Scanning provider configuration files…`,"configPage.searchModelIDOrName":`Search model ID or name`,"configPage.selectAChatModelBeforeSaving":`Select a chat model before saving.`,"configPage.signInWithCodexCLIThenLoadItFromTheLocalProvidersSectionAbove":`Sign in with Codex CLI, then load it from the Local providers section above.`,"configPage.someConfigurationFieldsCannotBeImported":`Some configuration fields cannot be imported`,"configPage.standardModel":`Standard model`,"configPage.status":`Status`,"configPage.theAPIProtocolInThisConfigurationIsNotSupportedYet":`The API protocol in this configuration is not supported yet`,"configPage.theKeyEnvironmentVariableNameIsInvalid":`The key environment variable name is invalid`,"configPage.theProviderEndpointIsInvalid":`The provider endpoint is invalid`,"configPage.thinkingLevel":`Thinking level`,"configPage.unableToReadTheConfigurationFile":`Unable to read the configuration file`,"configPage.unsavedChanges":`Unsaved settings`,"configPage.usedForAgentChatAndMayAlsoIncludeVisualModels":`Used for Agent chat and may also include visual models.`,"configPage.usedOnlyForImageGenerationVideoGenerationAndImageEditingAndExcludedFromAgentChatModelSelection":`Used only for image generation, video generation, and image editing, and excluded from Agent chat model selection.`,"configPage.usedOnlyForImageGenerationVideoGenerationAndImageEditingChatModelsAreIgnored":`Used only for image generation, video generation, and image editing; chat models are ignored.`,"configPage.video":`Video`,"configPage.videoGeneration":`Video generation`,"configPage.visualModels":`Visual models`,"configPage.visualModelsAreSelectedByTheVisualGenerationToolAndDoNotAppearInTheChatModelList":`Visual models are selected by the visual generation tool and do not appear in the chat model list.`,"configPage.visualModelSettingsSaved":`Visual model settings saved`,"configPage.visualOnlyProvider":`Visual-only Provider`,"configPage.visualProvider":`Visual Provider`,"configPage.fileEditingTools":`File editing: add edit / write`,"configPage.youCanCreateMultipleConnectionsUsingTheSameProtocolEachWithItsOwnKeyAndBaseURL":`You can create multiple connections using the same protocol, each with its own key and base URL.`,"interfaceSettings.accentBlue":`Pisper blue`,"interfaceSettings.accentColor":`Accent color`,"interfaceSettings.accentCoral":`Coral`,"interfaceSettings.accentCustom":`Custom`,"interfaceSettings.customAccentColor":`Custom accent color`,"interfaceSettings.customAccentHex":`Enter a HEX color`,"interfaceSettings.customAccentHint":`Pick any color — applied instantly across the app`,"interfaceSettings.invalidAccentColor":`Enter a 6-digit HEX color (e.g. #1677e8)`,"interfaceSettings.accentNeutral":`Neutral`,"interfaceSettings.accentTeal":`Teal`,"interfaceSettings.accentViolet":`Violet`,"interfaceSettings.appearance":`Appearance`,"interfaceSettings.appearanceDescription":`Choose the color mode, accent, and visual style of the interface.`,"interfaceSettings.automaticByTime":`Automatic by time`,"interfaceSettings.automaticByTimeDescription":`Use dark mode from 18:00 to 08:00`,"interfaceSettings.colorMode":`Color mode`,"interfaceSettings.comfortable":`Comfortable`,"interfaceSettings.comfortableDescription":`Keep relaxed spacing and sizing`,"interfaceSettings.compact":`Compact`,"interfaceSettings.compactDescription":`Fit more content on screen`,"interfaceSettings.cornerStyle":`Corner style`,"interfaceSettings.dark":`Dark`,"interfaceSettings.darkDescription":`Always use the low-light interface`,"interfaceSettings.defaultsRestored":`Interface settings restored to defaults`,"interfaceSettings.displayAndMotion":`Display and motion`,"interfaceSettings.displayAndMotionDescription":`Adjust content density and the amount of interface motion.`,"interfaceSettings.followSystem":`Follow system`,"interfaceSettings.followSystemDescription":`Match the operating system color mode`,"interfaceSettings.fontSize":`Font size`,"interfaceSettings.interfaceDensity":`Interface density`,"interfaceSettings.interfaceStyle":`Interface style`,"interfaceSettings.large":`Large`,"interfaceSettings.light":`Light`,"interfaceSettings.lightDescription":`Always use the bright interface`,"interfaceSettings.livePreview":`Live preview`,"interfaceSettings.motion":`Interface motion`,"interfaceSettings.motionFull":`Full`,"interfaceSettings.motionFullDescription":`Keep all transitions and feedback`,"interfaceSettings.motionReduced":`Reduced`,"interfaceSettings.motionReducedDescription":`Reduce nonessential movement`,"interfaceSettings.motionSystem":`Follow system`,"interfaceSettings.motionSystemDescription":`Use the operating system motion preference`,"interfaceSettings.preferencesUpdated":`Interface preferences updated`,"interfaceSettings.previewAgentMessage":`The Agent completed the current task.`,"interfaceSettings.previewUserMessage":`Continue reviewing the changes.`,"interfaceSettings.restoreDefaults":`Restore defaults`,"interfaceSettings.sharp":`Sharp`,"interfaceSettings.small":`Small`,"interfaceSettings.soft":`Soft`,"interfaceSettings.standard":`Standard`,"languageSettings.adjustSpacingAndSizingCompactModeFitsMoreContentOnScreen":`Adjust spacing and sizing. Compact mode fits more content on screen.`,"languageSettings.chineseInterface":`Chinese interface`,"languageSettings.chooseTheLanguageUsedByPisperChangesApplyImmediatelyAndAreSavedForYourNextVisit":`Choose the language used by Pisper. Changes apply immediately and are saved for your next visit.`,"languageSettings.comfortable":`Comfortable`,"languageSettings.compact":`Compact`,"languageSettings.currentDensity":`Current density`,"languageSettings.currentLanguage":`Current language`,"languageSettings.defaultSpacingAndSizing":`Default spacing and sizing`,"languageSettings.displayLanguage":`Display language`,"languageSettings.displayLanguageChangedToEnglish":`Display language changed to English`,"languageSettings.displayLanguageChangedToSimplifiedChinese":`Display language changed to Simplified Chinese`,"languageSettings.englishInterface":`English interface`,"languageSettings.english":`English`,"languageSettings.fitMoreContentOnScreen":`Fit more content on screen`,"languageSettings.interfaceDensity":`Interface density`,"languageSettings.interfaceDensitySwitchedToDensity":`Interface density switched to {density}`,"languageSettings.languagePreferenceIsStoredInThisBrowser":`Language preference is stored in this browser`,"languageSettings.simplifiedChinese":`Simplified Chinese`,"languageSettings.thisSettingChangesInterfaceTextOnlyItDoesNotControlTheLanguageOfAgentResponses":`This setting changes interface text only; it does not control the language of agent responses.`,"languageSettings.thisSettingOnlyAffectsTheInterfaceInThisBrowser":`This setting only affects the interface in this browser.`,"cliSettings.checking":`Checking`,"cliSettings.commandNotInstalled":`The {command} terminal command is not installed`,"cliSettings.commandReady":`The {command} terminal command is ready`,"cliSettings.description":`Install the Pisper terminal client and configure PATH for the current user without administrator access.`,"cliSettings.install":`Install terminal command`,"cliSettings.installed":`Installed`,"cliSettings.installedNotification":`Pisper terminal command installed; restart the terminal host to activate it`,"cliSettings.needsRepair":`Needs repair`,"cliSettings.notInstalled":`Not installed`,"cliSettings.pathConfigured":`Added to the current user's PATH.`,"cliSettings.pathNeedsRepair":`PATH configuration is incomplete. Repair the installation.`,"cliSettings.repair":`Repair terminal command`,"cliSettings.restartTerminal":`Restart the terminal host after installing or uninstalling so it reads the updated PATH. Fully quit and reopen Windows Terminal, or restart the IDE that owns an integrated terminal.`,"cliSettings.title":`Pisper terminal command`,"cliSettings.unavailable":`Unavailable in this build`,"cliSettings.uninstall":`Uninstall terminal command`,"cliSettings.uninstalledNotification":`Pisper terminal command uninstalled`,"notificationSettings.appNotificationTest":`{app} notification test`,"notificationSettings.availableVariables":`Available variables`,"notificationSettings.browserFailedToStart":`Browser failed to start`,"notificationSettings.browserNotificationsAreBlocked":`Browser notifications are blocked`,"notificationSettings.checking":`Checking`,"notificationSettings.connected":`Connected`,"notificationSettings.controlledByBrowserSitePermissions":`Controlled by browser site permissions`,"notificationSettings.controlledByOperatingSystemNotificationSettings":`Controlled by operating system notification settings`,"notificationSettings.dailyCodeReview":`Daily code review`,"notificationSettings.disabled":`Disabled`,"notificationSettings.enabled":`Enabled`,"notificationSettings.enabled2":`Enabled`,"notificationSettings.endToEndTests":`End-to-end tests`,"notificationSettings.fixChannelNotification":`Fix channel notification`,"notificationSettings.found2IssuesToAddressTheReportHasBeenArchived":`Found 2 issues to address. The report has been archived.`,"notificationSettings.implementationIsCompleteTestsAndBuildHavePassed":`Implementation is complete. Tests and build have passed.`,"notificationSettings.loadingNotificationSettings":`Loading notification settings`,"notificationSettings.message2Min18Sec":`2 min 18 sec`,"notificationSettings.message6Min42Sec":`6 min 42 sec`,"notificationSettings.messageContent":`Message content`,"notificationSettings.notConnected":`Not connected`,"notificationSettings.notEnabled":`Not enabled`,"notificationSettings.notification":`Notification`,"notificationSettings.notificationPermissionWasNotGrantedAllowNotificationsInTheBrowserSiteSettings":`Notification permission was not granted. Allow notifications in the browser site settings.`,"notificationSettings.notificationsAreWorking":`Notifications are working.`,"notificationSettings.notificationsDisabled":`Notifications disabled`,"notificationSettings.notificationsEnabled":`Notifications enabled`,"notificationSettings.notificationTemplates":`Notification templates`,"notificationSettings.notificationTemplateSaved":`Notification template saved`,"notificationSettings.notSupported":`Not supported`,"notificationSettings.openNotificationPermissionsInYourOperatingSystemSettings":`Open notification permissions in your operating system settings.`,"notificationSettings.openSystemNotificationSettings":`Open system notification settings`,"notificationSettings.permissionGranted":`Permission granted`,"notificationSettings.preReleaseChecks":`Pre-release checks`,"notificationSettings.preview":`Preview`,"notificationSettings.saveTemplate":`Save template`,"notificationSettings.sendTest":`Send test`,"notificationSettings.sendTestNotification":`Send test notification`,"notificationSettings.sharedByChatsScheduledTasksAndWorkflows":`Shared by chats, scheduled tasks, and workflows`,"notificationSettings.systemNotificationsAreNotSupportedInThisEnvironment":`System notifications are not supported in this environment.`,"notificationSettings.systemNotificationsAreOff":`System notifications are off`,"notificationSettings.systemNotificationsAreOffAllowPisperToSendNotificationsInYourOperatingSystemSettings":`System notifications are off. Allow Pisper to send notifications in your operating system settings.`,"notificationSettings.testNotificationSentToCountChats":`Test notification sent to {count} chats`,"notificationSettings.testProcessTimedOut":`Test process timed out`,"notificationSettings.testsBuildAndSecurityChecksHaveAllPassed":`Tests, build, and security checks have all passed.`,"notificationSettings.theBrowserBackgroundNotificationServiceCouldNotBeRegistered":`The browser background notification service could not be registered.`,"notificationSettings.theDesktopAppUsesOperatingSystemNotificationsTurningThisOffDoesNotChangeTheOperatingSystemPermis":`The desktop app uses operating system notifications. Turning this off does not change the operating system permission itself.`,"notificationSettings.theOperatingSystemDidNotAcceptTheNotificationCheckYourSystemNotificationSettings":`The operating system did not accept the notification. Check your system notification settings.`,"notificationSettings.theTestNotificationWasSentCheckYourSystemNotificationCenter":`The test notification was sent. Check your system notification center.`,"notificationSettings.theWebAppUsesBrowserSiteNotificationsTurningThisOffDoesNotChangeTheBrowserPermissionItself":`The Web app uses browser site notifications. Turning this off does not change the browser permission itself.`,"notificationSettings.tomorrow0900":`Tomorrow 09:00`,"notificationSettings.pisperUsesTheCurrentPlatformNotificationSystemWhenAnAgentCompletesOrFails":`Pisper uses the current platform notification system when an agent completes or fails.`,"notificationSettings.waitingForPermission":`Waiting for permission`,"updateSettings.browserMode":`Browser mode`,"updateSettings.checkFailed":`Check failed`,"updateSettings.checkForUpdates":`Check for updates`,"updateSettings.checking":`Checking`,"updateSettings.checking2":`Checking…`,"updateSettings.commitsThatHaveNotBeenSyncedWillAppearHereAfterTheCheck":`Commits that have not been synced will appear here after the check.`,"updateSettings.commitsToSync":`Commits to sync`,"updateSettings.currentReleaseNotes":`Current release notes`,"updateSettings.currentSource":`Current source`,"updateSettings.currentSourceStatus":`Current source status`,"updateSettings.currentVersion":`Current version`,"updateSettings.downloadedDataWasPreservedAndCanResumeFromTheInterruptionPoint":`Downloaded data was preserved and can resume from the interruption point.`,"updateSettings.downloading":`Downloading`,"updateSettings.downloadPaused":`Download paused`,"desktopPetSettings.browsePetdex":`Browse Petdex pets`,"desktopPetSettings.bubbleDone":`All done!`,"desktopPetSettings.bubbleFailed":`Something went wrong`,"desktopPetSettings.bubbleHello":`Hello!`,"desktopPetSettings.bubbleResponding":`Responding…`,"desktopPetSettings.bubbleThinking":`Thinking…`,"desktopPetSettings.bubbleWorking":`Working…`,"desktopPetSettings.currentPet":`Current pet: {name}`,"desktopPetSettings.delete":`Delete pet`,"desktopPetSettings.deleteConfirm":`Delete “{name}”? Its local pet resources will be removed.`,"desktopPetSettings.deleteTitle":`Delete desktop pet`,"desktopPetSettings.description":`This is a built-in Pisper desktop pet. The desktop app uses an independent window, while the Web app floats it inside Pisper and drives it from current Agent activity.`,"desktopPetSettings.desktopOnly":`Desktop-only feature`,"desktopPetSettings.desktopOnlyDescription":`Desktop pets are available only in the Pisper desktop app.`,"desktopPetSettings.install":`Install`,"desktopPetSettings.installed":`Installed`,"desktopPetSettings.installBeforeEnabling":`Install a pet from Petdex before enabling desktop display.`,"desktopPetSettings.installDescription":`Search Petdex pets. Pisper installs and manages them without the Petdex CLI or separate desktop app.`,"desktopPetSettings.installedDescription":`Choose the pet shown by Pisper. Existing Petdex and Codex pet directories remain compatible.`,"desktopPetSettings.installedTitle":`Installed pets`,"desktopPetSettings.installTitle":`Add a pet from Petdex`,"desktopPetSettings.loading":`Loading desktop pet status…`,"desktopPetSettings.opacity":`Pet opacity`,"desktopPetSettings.petDisabled":`Desktop pet disabled`,"desktopPetSettings.petEnabled":`Desktop pet enabled`,"desktopPetSettings.petInstalled":`Installed and selected {name}`,"desktopPetSettings.petRemoved":`Deleted {name}`,"desktopPetSettings.petSelected":`Switched to {name}`,"desktopPetSettings.petSlug":`Petdex pet slug`,"desktopPetSettings.running":`Visible`,"desktopPetSettings.search":`Search`,"desktopPetSettings.searchPlaceholder":`Search by pet name or slug, for example boba`,"desktopPetSettings.showOnDesktop":`Show on desktop`,"desktopPetSettings.stopped":`Hidden`,"desktopPetSettings.title":`Pisper desktop pet`,"desktopPetSettings.webPetLabel":`Pisper desktop pet: {name}`,"updateSettings.appComponents":`App components`,"updateSettings.desktopFrontend":`Desktop frontend`,"updateSettings.downloadAndInstallUpdates":`Download and install updates`,"updateSettings.downloadProgress":`Download progress`,"updateSettings.downloadUpdate":`Download update`,"updateSettings.installed":`Installed`,"updateSettings.installingUpdates":`Installing updates…`,"updateSettings.newVersionReleaseNotes":`New version release notes`,"updateSettings.noReleaseNotesAreAvailableForThisVersion":`No release notes are available for this version.`,"updateSettings.notChecked":`Not checked`,"updateSettings.platform":`Platform`,"updateSettings.readyToRestart":`Ready to restart`,"updateSettings.restartAndInstall":`Restart and install`,"updateSettings.resumeDownload":`Resume download`,"updateSettings.runtime":`Runtime`,"updateSettings.sourceUpdatesAvailable":`Source updates available`,"updateSettings.theCurrentWebSourceIsSyncedWithBranch":`The current Web source is synced with {branch}.`,"updateSettings.updateAvailable":`Update available`,"updateSettings.tuiClient":`TUI client`,"updateSettings.updateChannel":`Update channel`,"updateSettings.upToDate":`Up to date`,"updateSettings.pisperAppUpdates":`Pisper app updates`,"updateSettings.sponsors":`Project sponsors`,"updateSettings.sponsorsDescription":`These partners support the Pisper community. Sponsor content is not targeted using conversation or workspace data.`,"updateSettings.sponsored":`Sponsored`,"updateSettings.visitSponsor":`Visit`,"updateSettings.hideSponsor":`Hide this sponsor for 30 days`,"updateSettings.viewRelease":`View release`,"updateSettings.viewSourceUpdates":`View source updates`,"updateSettings.viewUpdateDiagnosticLog":`View update diagnostic log`,"configPage.connection":`Connection`,"configPage.policy":`Policy`,"configPage.authentication":`Authentication`,"configPage.endpoint":`Endpoint`},yt={"memoryPage.conceptType":`Concept`,"memoryPage.fileType":`File`,"memoryPage.riskType":`Risk`,"memoryPage.preferenceType":`Preference`,"memoryPage.decisionType":`Decision`,"memoryPage.factType":`Fact`,"memoryPage.taskType":`Task`,"memoryPage.addMemory":`Add memory`,"memoryPage.autoApproveSaved":`Auto-approve threshold saved`,"memoryPage.autoApproveThreshold":`Auto-approve threshold`,"memoryPage.autoApproveThresholdHint":`Candidates at or above this confidence are confirmed automatically; below it they need review.`,"memoryPage.createdByAgent":`Created by Agent`,"memoryPage.agentProposed":`Agent proposed`,"memoryPage.conversationExtracted":`Conversation extracted`,"memoryPage.confidencePercent":`Confidence {value}%`,"memoryPage.topic":`Fact topic`,"memoryPage.expires":`Expires`,"memoryPage.authority":`Authority`,"memoryPage.cancel":`Cancel`,"memoryPage.closeDialog":`Close dialog`,"memoryPage.common":`Common`,"memoryPage.confirm":`Confirm`,"memoryPage.count":`{count}`,"memoryPage.countMemories":`{count} memories`,"memoryPage.created":`Created`,"memoryPage.delete":`Delete`,"memoryPage.deleteMemory":`Delete memory`,"memoryPage.deleteMemoryName":`Delete memory “{name}”?`,"memoryPage.deleteMemorySpace":`Delete memory space`,"memoryPage.deleteMemorySpaceNameAndAllMemoriesInIt":`Delete memory space “{name}” and all memories in it?`,"memoryPage.edit":`Edit`,"memoryPage.evidence":`Evidence`,"memoryPage.explicitUserRequest":`Explicit user request`,"memoryPage.forExampleProductDesignGuidelines":`For example: Product design guidelines`,"memoryPage.forExampleProjectUIConstraints":`For example: Project UI constraints`,"memoryPage.giveEachThemeOrProjectItsOwnMemorySpaceSoDurableMemoriesHaveSomewhereToBelong":`Give each theme or project its own memory space, so durable memories have somewhere to belong.`,"memoryPage.globalMemorySpace":`Global memory space`,"memoryPage.ignore":`Ignore`,"memoryPage.ignoreAll":`Ignore all`,"memoryPage.ignoredCountMemoryDrafts":`Ignored {count} memory drafts`,"memoryPage.importance":`Importance`,"memoryPage.important":`Important`,"memoryPage.lightUpIdeasWorthKeepingAsMemoriesYouCanReturnToLater":`Light up ideas worth keeping as memories you can return to later.`,"memoryPage.localMemory":`Local memory`,"memoryPage.memoryCandidateConfirmed":`Memory candidate confirmed`,"memoryPage.memoryCandidateIgnored":`Memory candidate ignored`,"memoryPage.memoryContent":`Memory content`,"memoryPage.memoryDeleted":`Memory deleted`,"memoryPage.memoryDrafts":`Memory drafts`,"memoryPage.memoryMapTypes":`Memory map types`,"memoryPage.memorySpace":`Memory space`,"memoryPage.memorySpaceDeleted":`Memory space deleted`,"memoryPage.memorySpaceName":`Memory space name`,"memoryPage.memorySpaces":`Memory spaces`,"memoryPage.memoryTitle":`Memory title`,"memoryPage.memoryType":`Memory type`,"memoryPage.addedManually":`Added manually`,"memoryPage.memoryUpdated":`Memory updated`,"memoryPage.editMemory":`Edit memory`,"memoryPage.memoryCreated":`Memory created`,"memoryPage.memorySpaceRenamed":`Memory space renamed`,"memoryPage.renameMemorySpace":`Rename memory space`,"memoryPage.memorySpaceCreated":`Memory space created`,"memoryPage.newMemorySpace":`New memory space`,"memoryPage.normal":`Normal`,"memoryPage.optionalForExampleECodeProjectREADMEMd":`Optional, for example E:\\code\\project\\README.md`,"memoryPage.recordStandaloneReusableMemoryForFutureChats":`Record standalone, reusable memory for future chats`,"memoryPage.refresh":`Refresh`,"memoryPage.relatedFilePath":`Related file path`,"memoryPage.relatedFiles":`Related files`,"memoryPage.relatedMemories":`Related memories`,"memoryPage.rename":`Rename`,"memoryPage.save":`Save`,"memoryPage.saving":`Saving…`,"memoryPage.selectAMemoryInTheMapToViewItsDetails":`Select a memory in the map to view its details.`,"memoryPage.selectedMemory":`Selected memory`,"memoryPage.source":`Source`,"memoryPage.strict":`Strict`,"memoryPage.thereAreNoPendingMemoryCandidates":`There are no pending memory candidates.`,"memoryPage.thisMemoryHasNoRelatedFiles":`This memory has no related files.`,"memoryPage.thisMemorySpaceIsStillUnlitClickInTheTopLeftToPlantTheFirstStar":`This memory space is still unlit. Click + in the top-left to plant the first star.`,"memoryPage.userConfirmedConversationCandidate":`User-confirmed conversation candidate`,"memoryPage.view":`View`,"memoryPage.visibleTotalMemories":`{visible}/{total} memories`,"memoryPage.zoomIn":`Zoom in`,"memoryPage.zoomOut":`Zoom out`},bt={"navigation.app":`App`,"navigation.capabilities":`Capabilities`,"navigation.system":`System`,"navigation.chat":`Chats`,"navigation.chatDescription":`Keep multiple chats moving forward in parallel on their own tracks`,"navigation.chatHistory":`Chat history`,"navigation.chatHistoryDescription":`Every conversation leaves a clear, searchable echo here`,"navigation.assets":`Assets`,"navigation.assetsDescription":`Gather files, images, and creative outputs from conversations`,"navigation.channels":`Channels`,"navigation.channelsDescription":`Bring Pisper beyond the screen and into your collaboration spaces`,"navigation.schedules":`Scheduled tasks`,"navigation.schedulesDescription":`Leave repetitive waiting to tasks that start on time`,"navigation.settings":`Settings`,"navigation.settingsDescription":`Tune models, runtime policies, and notification cadence`,"navigation.plugins":`Plugins`,"navigation.pluginsDescription":`Install and manage plugins while controlling the tool capabilities available to Agent`,"navigation.memory":`Memory`,"navigation.memoryDescription":`Keep thoughts, preferences, and decisions glowing in the map`,"navigation.mcp":`MCP`,"navigation.mcpDescription":`Connect external capabilities while protecting every permission boundary`,"navigation.skills":`Skills`,"navigation.skillsDescription":`Collect reusable techniques so capabilities can be invoked by each task`,"navigation.workflows":`Workflows`,"navigation.workflowsDescription":`Arrange ideas into paths and let multiple processes grow in parallel`,"navigation.newWorkflow":`New workflow`,"navigation.newWorkflowDescription":`Drag nodes to turn an idea into a runnable path`,"appOverlays.actions":`Actions`,"appOverlays.actionSucceeded":`{action} succeeded`,"appOverlays.addAShortDescription":`Add a short description`,"appOverlays.addMCPService":`Add MCP service`,"appOverlays.addMemory":`Add memory`,"appOverlays.addProvider":`Add Provider`,"appOverlays.cancel":`Cancel`,"appOverlays.closeDialog":`Close dialog`,"appOverlays.commandPalette":`Command palette`,"appOverlays.connectChannel":`Connect channel`,"appOverlays.create":`Create`,"appOverlays.createFromTemplate":`Create from template`,"appOverlays.custom":`Custom`,"appOverlays.default":`Default`,"appOverlays.description":`Description`,"appOverlays.enterAName":`Enter a name`,"appOverlays.enterTheBasicDetailsToContinue":`Enter the basic details to continue.`,"appOverlays.exportAsset":`Export asset`,"appOverlays.installSkill":`Import global Skill`,"appOverlays.newProject":`New project`,"appOverlays.name":`Name`,"appOverlays.newChat":`New chat`,"appOverlays.newChat2":`New chat`,"appOverlays.newScheduledTask":`New scheduled task`,"appOverlays.noMatchingResults":`No matching results`,"appOverlays.openLabeledTurnFailed":`Could not open the response for this mark`,"appOverlays.labelResultTimes":`Chat {sessionTime} · node {nodeTime}`,"appOverlays.locatingLabel":`Locating mark…`,"appOverlays.savePluginPolicy":`Save plugin policy`,"appOverlays.searchPagesChatsOrActions":`Search pages, chats, marks, or actions`,"appOverlays.searchingLabels":`Searching session marks…`,"appOverlays.type":`Type`,"appOverlays.untitledChat":`Untitled chat`,"appOverlays.unknownTime":`Unknown time`,"appSidebar.closeNavigation":`Close navigation`,"appSidebar.backToApp":`Back to app`,"appSidebar.collapseSidebar":`Collapse sidebar`,"appSidebar.countCommitsBehindBranch":`{count} commits behind {branch}`,"appSidebar.downloading":`Downloading`,"appSidebar.expandSidebar":`Expand sidebar`,"appSidebar.mainNavigation":`Main navigation`,"appSidebar.newChatInWorkspace":`New chat in {workspace}`,"appSidebar.noWorkspace":`No workspace`,"appSidebar.noChatHistoryYet":`No chat history yet`,"appSidebar.readyToRestart":`Ready to restart`,"appSidebar.recentChats":`Recent chats`,"appSidebar.sourceUpdatesAvailable":`Source updates available`,"appSidebar.untitledChat":`Untitled chat`,"appSidebar.updateAvailable":`Update available`,"appSidebar.viewAll":`View all`,"appSidebar.viewAllCountChats":`View all {count} chats`,"appSidebar.viewUpdateDetails":`View update details`,"pageHeader.addLink":`Add link`,"pageHeader.addMemory":`Add memory`,"pageHeader.addProvider":`Add Provider`,"pageHeader.addService":`Add service`,"pageHeader.connectChannel":`Connect channel`,"pageHeader.dark":`Dark`,"pageHeader.installSkill":`Import global Skill`,"pageHeader.light":`Light`,"pageHeader.newChat":`New chat`,"pageHeader.newTask":`New task`,"pageHeader.newWorkflow":`New workflow`,"pageHeader.publish":`Publish`,"pageHeader.primaryActionShortcut":`{action} (Ctrl/⌘ N)`,"pageHeader.saveDraft":`Save draft`,"pageHeader.savePolicy":`Save policy`,"pageHeader.search":`Search (/)`,"pageHeader.searchMemoriesOrFiles":`Search memories or files`,"pageHeader.searchPage":`Search {page}`,"pageHeader.searchServicesOrTools":`Search services or tools`,"pageHeader.stop":`Stop`,"pageHeader.system":`Follow system`,"pageHeader.scheduled":`Automatic by time`,"pageHeader.testRun":`Test run`,"pageHeader.themeThemeClickToSwitch":`Theme: {theme} (click to switch)`,"pageHeader.themeThemeClickToSwitchThemes":`Theme: {theme}. Click to switch themes.`,"pageHeader.toggleTerminal":"Toggle terminal (Ctrl+`)","pageLoader.bringingTheNeededCapabilitiesIntoPlace":`Bringing the needed capabilities into place…`,"pageLoader.lightingUpThisPage":`Lighting up this page`,"statusBar.calculatingTodaySTokenUsage":`Calculating today’s token usage`,"statusBar.connected":`Connected`,"statusBar.enabledTotalEnabled":`{enabled} / {total} enabled`,"statusBar.inputInputOutputOutputReasoningReasoningCacheReadCacheRead":`Input {input} · Output {output} · Reasoning {reasoning} · Cache read {cacheRead}`,"statusBar.nativeRuntime":`Native runtime`,"statusBar.noModelConfigured":`No model configured`,"statusBar.todaySTokens":`Today’s tokens`},xt={"pluginsPage.all":`All`,"toolLabels.read":`Read files`,"toolLabels.list":`List directories`,"toolLabels.grep":`Search content`,"toolLabels.find":`Find files`,"toolLabels.edit":`Edit files`,"toolLabels.write":`Write files`,"toolLabels.shell":`Run commands`,"toolLabels.webSearch":`Web search`,"toolLabels.browserControl":`Browser control`,"toolLabels.visualGeneration":`Generate visual content`,"toolLabels.skillCreate":`Create Skill`,"toolLabels.pluginCreate":`Create plugin`,"toolLabels.memorySearch":`Search memory`,"toolLabels.memoryRemember":`Save memory`,"toolLabels.mcpList":`View MCP services`,"toolLabels.mcpManage":`Manage MCP services`,"toolLabels.readDescription":`Read text, code, and image files in the workspace.`,"toolLabels.listDescription":`List directory structures and basic file information.`,"toolLabels.grepDescription":`Run full-text and regular-expression searches across project files.`,"toolLabels.findDescription":`Find project files by name and pattern.`,"toolLabels.editDescription":`Apply precise local edits to existing files.`,"toolLabels.writeDescription":`Create new files or overwrite file contents.`,"toolLabels.shellDescription":`Run terminal commands as the current operating-system user.`,"toolLabels.webSearchDescription":`Search the internet through Bing RSS without installation or an API key.`,"toolLabels.browserControlDescription":`Give Agent an isolated, controlled browser for navigation, inspection, and interaction.`,"toolLabels.visualGenerationDescription":`Use configured visual providers to generate or edit images and generate videos in the workspace.`,"toolLabels.skillCreateDescription":`Create a standards-compliant Agent Skill in the current project or global Pisper skills directory.`,"toolLabels.pluginCreateDescription":`Define, validate, and install a local Pisper plugin with one or more Agent tools.`,"toolLabels.memorySearchDescription":`Search long-term memory across global and current-project spaces.`,"toolLabels.memoryRememberDescription":`Save explicit remember requests directly and silently queue inferred reusable information as candidates.`,"toolLabels.mcpListDescription":`Read configured MCP services, connection status, and available tools.`,"toolLabels.mcpManageDescription":`Add, update, delete, test, enable, or disable MCP services and tools with structured parameters.`,"toolLabels.lowRisk":`Low risk`,"toolLabels.mediumRisk":`Medium risk`,"toolLabels.highRisk":`High risk`,"toolLabels.fileSystem":`File system`,"toolLabels.search":`Search`,"toolLabels.terminal":`Terminal`,"toolLabels.visual":`Visual`,"toolLabels.skills":`Skills`,"toolLabels.plugins":`Plugins`,"toolLabels.browser":`Browser`,"toolLabels.memory":`Memory`,"toolLabels.mcp":`MCP`,"toolLabels.collaboration":`Collaboration`,"toolLabels.currentChatWorkspace":`Current chat workspace`,"toolLabels.currentOsUser":`Current operating-system user`,"toolLabels.bingPublicWebSearch":`Bing public web search`,"toolLabels.isolatedSessionBrowser":`Isolated browser for the current primary Agent chat; HTTP/HTTPS only`,"toolLabels.visualProviderAndWorkspace":`Configured visual providers and the current workspace/generated/visuals directory`,"toolLabels.projectAndGlobalSkills":`Current project and global Pisper skills directories`,"toolLabels.globalPluginSources":`Global Pisper plugin sources and local plugin installation`,"toolLabels.globalAndProjectMemory":`Global and current-project memory spaces`,"toolLabels.applicationMcpConfiguration":`Application-level MCP configuration`,"toolLabels.readCapability":`Read file contents without modifying files`,"toolLabels.listCapability":`Browse directories without reading file contents`,"toolLabels.grepCapability":`Search text without modifying files`,"toolLabels.findCapability":`Find paths without modifying files`,"toolLabels.editCapability":`Modify existing files and produce diffs`,"toolLabels.writeCapability":`Create and overwrite files`,"toolLabels.shellCapability":`Run commands, builds, and tests`,"toolLabels.webSearchCapability":`Send search terms and return titles, links, summaries, and dates without modifying web pages`,"toolLabels.browserControlCapability":`Navigate, inspect, click, type, wait, capture screenshots, and close the browser without arbitrary JavaScript`,"toolLabels.visualGenerationCapability":`Use visual models to generate or edit images and generate videos, then write output files`,"toolLabels.skillCreateCapability":`Validate and atomically create a new SKILL.md without overwriting existing content`,"toolLabels.pluginCreateCapability":`Create plugin source without overwriting files, run the standard preflight checks, and install all declared tools`,"toolLabels.memorySearchCapability":`Read relevant preferences, facts, decisions, and tasks without modifying memory`,"toolLabels.memoryRememberCapability":`Save explicit requests, queue inferred candidates, and hide common secret formats`,"toolLabels.mcpListCapability":`Read redacted MCP service information without changing configuration`,"toolLabels.mcpManageCapability":`Modify MCP service configuration without exposing sensitive headers or environment values`,"pluginsPage.auto":`Auto`,"pluginsPage.bingSearchIsAvailableAndReturnedCountResults":`Bing search is available and returned {count} results`,"pluginsPage.capabilities":`Capabilities`,"pluginsPage.category":`Category`,"pluginsPage.highRiskToolsEnabledFullAccessUsesCurrentUserPermissions":`{count} high-risk tools are enabled: {tools}. In full-access mode, file and Shell tools run with the current operating-system user's permissions.`,"pluginsPage.defaultLanguage":`Default language`,"pluginsPage.disabled":`Disabled`,"pluginsPage.enabled":`Enabled`,"pluginsPage.enabled2":`Enabled`,"pluginsPage.english":`English`,"pluginsPage.full":`Full`,"pluginsPage.highRisk":`High risk`,"pluginsPage.loadingToolPlugins":`Loading tool plugins`,"pluginsPage.disableThisTool":`Disable this tool`,"pluginsPage.policySaved":`Policy saved`,"pluginsPage.disable":`Disable`,"pluginsPage.enableThisTool":`Enable this tool`,"pluginsPage.moderate":`Moderate`,"pluginsPage.namePluginPolicy":`{name} plugin policy`,"pluginsPage.noHighRiskToolsAreEnabledTheAgentCanOnlyReadAndSearch":`No high-risk tools are enabled. The agent can only read and search.`,"pluginsPage.noInstallationOrAPIKeyRequiredTheAgentCanUseItAfterSaving":`No installation or API key required. The agent can use it after saving.`,"pluginsPage.noMatchingTools":`No matching tools`,"pluginsPage.noPermissionChangesYet":`No permission changes yet`,"pluginsPage.noPluginPolicyChanges":`No plugin policy changes`,"pluginsPage.off":`Off`,"pluginsPage.onTheNextAgentRequestAfterSaving":`On the next agent request after saving`,"pluginsPage.pathScope":`Path scope`,"pluginsPage.pluginPolicySavedAgentRuntimeUpdated":`Plugin policy saved. Agent runtime updated.`,"pluginsPage.presets":`Presets`,"pluginsPage.queriesAreSentToBingDoNotIncludeSecretsOrPrivateData":`Queries are sent to Bing. Do not include secrets or private data.`,"pluginsPage.readingTheAgentSRegisteredToolsAndPermissions":`Reading the agent’s registered tools and permissions…`,"pluginsPage.readOnly":`Read only`,"pluginsPage.recentChanges":`Recent changes`,"pluginsPage.resultCount":`Result count`,"pluginsPage.riskLevel":`Risk level`,"pluginsPage.safeSearch":`Safe search`,"pluginsPage.savePolicy":`Save policy`,"pluginsPage.saving":`Saving…`,"pluginsPage.securitySummary":`Security summary`,"pluginsPage.simplifiedChinese":`Simplified Chinese`,"pluginsPage.source":`Source`,"pluginsPage.strict":`Strict`,"pluginsPage.takesEffect":`Takes effect`,"pluginsPage.testConnection":`Test connection`,"pluginsPage.testing":`Testing…`,"pluginsPage.toolID":`Tool ID`,"pluginsPage.toolPlugins":`Tool plugins`,"pluginsPage.unsaved":`Unsaved`,"pluginsPage.pisperAppTools":`Pisper app tools`,"pluginsPage.pisperBuiltInTools":`Pisper built-in tools`,"pluginsPage.builtIn":`Built-in`,"pluginsPage.local":`Local`,"pluginsPage.toolCatalog":`Tool catalog`,"pluginsPage.installPlugin":`Install plugin`,"pluginsPage.installLocalPlugin":`Install local plugin`,"pluginsPage.installLocalPluginDescription":`Inspect and install a plugin from a local directory.`,"pluginsPage.pluginDirectory":`Plugin directory`,"pluginsPage.pluginDirectoryPlaceholder":`Absolute path containing pisper-plugin.json`,"pluginsPage.chooseDirectory":`Choose directory`,"pluginsPage.files":`files`,"pluginsPage.inspectPlugin":`Inspect plugin`,"pluginsPage.processing":`Processing…`,"pluginsPage.localPluginSecurityWarning":`Local plugin code runs in an isolated Worker, but it can still access local files and the network as the current operating-system user. Its tools are available only in Full Access mode.`,"pluginsPage.toggleToolDetails":`Toggle details for {name}`,"pluginsPage.executionMode":`Execution mode`,"pluginsPage.fullAccessOnly":`Full Access only`,"pluginsPage.uninstallPlugin":`Uninstall plugin`,"pluginsPage.uninstallPluginDescription":`Uninstall {name} and all tools it provides? Built-in Pisper tools cannot be uninstalled.`,"pluginsPage.pluginUninstalled":`{name} was uninstalled`,"pluginsPage.saveBeforePluginChanges":`Save pending tool policy changes before installing or uninstalling a plugin.`,"pluginsPage.workspace":`Workspace`},St={"schedulesPage.fullAccessHelp":`Background tasks run Shell as the current OS user without per-command approval.`,"schedulesPage.readOnlyHelp":`Only reading and analysis are allowed; files cannot be modified and Shell cannot run.`,"schedulesPage.atIntervals":`At intervals`,"schedulesPage.daily":`Daily`,"schedulesPage.weekly":`Weekly`,"schedulesPage.monthly":`Monthly`,"schedulesPage.minutes":`Minutes`,"schedulesPage.hours":`Hours`,"schedulesPage.days":`Days`,"schedulesPage.browserNotification":`Notification`,"schedulesPage.feishu":`Feishu`,"schedulesPage.weChat":`WeChat`,"schedulesPage.browseDirectories":`Browse directories`,"schedulesPage.cancel":`Cancel`,"schedulesPage.closeDialog":`Close dialog`,"schedulesPage.countSec":`{count} sec`,"schedulesPage.createATaskAndLetItSetOutAutomaticallyAtTheAppointedTime":`Create a task and let it set out automatically at the appointed time.`,"schedulesPage.creating":`Creating…`,"schedulesPage.delete":`Delete`,"schedulesPage.deleteScheduledTask":`Delete scheduled task`,"schedulesPage.deleteScheduledTaskNameAndItsRunHistory":`Delete scheduled task “{name}” and its run history?`,"schedulesPage.deleteTask":`Delete task`,"schedulesPage.describeTheWorkTheAgentShouldCompleteEachTime":`Describe the work the agent should complete each time`,"schedulesPage.editTemplates":`Edit templates`,"schedulesPage.enabled":`Enabled`,"schedulesPage.enabledAutomaticallyAfterCreation":`Enabled automatically after creation`,"schedulesPage.enterTheProjectSAbsolutePath":`Enter the project’s absolute path`,"schedulesPage.executionMode":`Execution mode`,"schedulesPage.executionTarget":`Execution target`,"schedulesPage.forExampleDailyCodeReview":`For example, daily code review`,"schedulesPage.frequency":`Frequency`,"schedulesPage.fullAccess":`Full access`,"schedulesPage.lastRunTime":`Last run: {time}`,"schedulesPage.loadingScheduledTasks":`Loading scheduled tasks`,"schedulesPage.pause":`Pause`,"schedulesPage.failuresOnly":`Failures only`,"schedulesPage.runNow":`Run now`,"schedulesPage.scheduledTrigger":`Scheduled trigger`,"schedulesPage.completionAndFailure":`Completion and failure`,"schedulesPage.taskFailed":`Task failed`,"schedulesPage.taskInterrupted":`Task interrupted because Pisper restarted`,"schedulesPage.createTask":`Create task`,"schedulesPage.manualRun":`Manual run`,"schedulesPage.saveTask":`Save task`,"schedulesPage.taskCompleted":`Task completed`,"schedulesPage.newScheduledTask":`New scheduled task`,"schedulesPage.nextRunTime":`Next run: {time}`,"schedulesPage.noRunHistory":`No run history`,"schedulesPage.notificationChannels":`Notification channels`,"schedulesPage.readOnly":`Read only`,"schedulesPage.recentRuns":`Recent runs`,"schedulesPage.runInterval":`Run interval`,"schedulesPage.running":`Running`,"schedulesPage.running2":`Running`,"schedulesPage.saving":`Saving…`,"schedulesPage.scheduledTaskCreated":`Scheduled task created`,"schedulesPage.scheduledTaskDeleted":`Scheduled task deleted`,"schedulesPage.scheduledTaskSaved":`Scheduled task saved`,"schedulesPage.scheduledTaskStarted":`Scheduled task started`,"schedulesPage.schedules":`Schedules`,"schedulesPage.taskName":`Task name`,"schedulesPage.taskQueue":`Task queue`,"schedulesPage.theScheduledAgentWillRunInThisDirectory":`The scheduled Agent will run in this directory.`,"schedulesPage.theTimelineIsStillUnlit":`The timeline is still unlit`,"schedulesPage.time":`Time`,"schedulesPage.timeZone":`Time zone`,"schedulesPage.workingDirectory":`Working directory`,"schedulesPage.workflow":`Workflow`,"schedulesPage.workflowUnavailable":`Workflow unavailable`,"schedulesPage.selectPublishedWorkflow":`Select a published workflow`,"schedulesPage.noPublishedWorkflows":`No published workflows are available. Publish one from the Workflows page first.`,"schedulesPage.workflowUsesItsOwnRuntimeSettings":`The workflow controls its own working directory, model, and execution settings.`,"schedulesPage.workflowInputs":`Workflow inputs`,"schedulesPage.workflowInputsHelp":`Saved only with this task and passed to the selected workflow on every run.`,"schedulesPage.youCanContinueEditingTheRunTimeAndNotificationChannelsAfterCreation":`You can continue editing the run time and notification channels after creation.`,"schedulesPage.youCanContinueSettingTheRunTimeAndNotificationChannelsAfterCreation":`You can continue setting the run time and notification channels after creation.`,"schedulesPage.notificationChannelsHelp":`Choose channels to notify when the task finishes`,"schedulesPage.configured":`Configured`,"schedulesPage.notConfigured":`Not configured`},Ct={"skillsPage.all":`All`,"skillsPage.installed":`Installed`,"skillsPage.design":`Design`,"skillsPage.code":`Code`,"skillsPage.documents":`Documents`,"skillsPage.global":`Global`,"skillsPage.globalSkills":`Global Skills`,"skillsPage.globalSkillSourceHelp":`Enter a Skill source: a local Skill directory or SKILL.md, an npm package name, or a git URL. Pisper extracts only Skill resources and copies them to ~/.pisper/agent/skills for use in every project.`,"skillsPage.highPrivilege":`High privilege`,"skillsPage.allowAutomaticModelInvocation":`Allow automatic model invocation`,"skillsPage.automaticManual":`Automatic + manual`,"skillsPage.configuredSkillPackages":`Configured skill packages`,"skillsPage.continue":`Continue`,"skillsPage.countSkillPackages":`{count} skill packages`,"skillsPage.declaresRequiredTools":`Declares required tools`,"skillsPage.enterALocalSkillDirectorySKILLMdFileNpmPackageOrGitSourcePisperImportsOnlyItsSkillResources":`Enter a local skill directory, SKILL.md file, npm package, or git source. Pisper imports only its skill resources.`,"skillsPage.import":`Import`,"skillsPage.importGlobalSkill":`Import global Skill`,"skillsPage.install":`Install`,"skillsPage.installedSkills":`Installed skills`,"skillsPage.installSkill":`Install skill`,"skillsPage.loadingSkills":`Loading skills`,"skillsPage.locallyReady":`Locally ready`,"skillsPage.manualOnly":`Manual only`,"skillsPage.noGlobalSkills":`No global Skills. Import one into ~/.pisper/agent/skills.`,"skillsPage.noProjectSkills":`This workspace has no project Skills. Add one under .pisper/skills in the current workspace.`,"skillsPage.noSkillAvailable":`No Skill available`,"skillsPage.noSkillInstalled":`No skill installed`,"skillsPage.noSkillPackagesAreConfiguredYetAfterYouInstallASkillItsSourceWillAppearHere":`No skill packages are configured yet. After you install a skill, its source will appear here.`,"skillsPage.noSkillsInstalledYetUseInstallSkillInTheUpperRightToAddALocalDirectoryNpmPackageOrGitSource":`No skills installed yet. Use “Install skill” in the upper-right to add a local directory, npm package, or git source.`,"skillsPage.noSkillsMatchTheCurrentFilter":`No skills match the current filter.`,"skillsPage.notMaterialized":`Not materialized`,"skillsPage.permissions":`Permissions`,"skillsPage.project":`Project`,"skillsPage.projectSkills":`Project Skills`,"skillsPage.projectScopedConfiguration":`Project-scoped configuration`,"skillsPage.projectScopedSkill":`Project-scoped skill`,"skillsPage.addGlobalOrProjectSkill":`Import a global Skill into ~/.pisper/agent/skills, or add a project Skill under .pisper/skills in the current workspace.`,"skillsPage.saveSettings":`Save settings`,"skillsPage.scanningSkillDirectoriesAndConfiguredPackages":`Scanning global Skills and current project Skills`,"skillsPage.scope":`Scope`,"skillsPage.selectedSkill":`Selected skill`,"skillsPage.skillInstalledAndLoadedIntoTheAgentRuntime":`Global Skill imported and loaded into the agent runtime`,"skillsPage.skillSettingsSavedAndReloaded":`Skill settings saved and reloaded`,"skillsPage.skillSource":`Skill source`,"skillsPage.skillsProvideInstructionsToTheAgentAndMayIncludeExecutableScriptsConfirmThatYouTrustTheSource":`Skills provide instructions to the agent and may include executable scripts. Confirm that you trust the source.`,"skillsPage.skillUninstalled":`Skill uninstalled`,"skillsPage.source":`Source`,"skillsPage.supportManualSkillCommand":`Support manual /skill command`,"skillsPage.thisRemovesTheSkillDirectoryInstalledByPisperItDoesNotUninstallTheOriginalNpmOrGitPackage":`This removes the skill directory installed by Pisper. It does not uninstall the original npm or git package.`,"skillsPage.toggleSkillName":`Toggle skill {name}`,"skillsPage.triggerConditions":`Trigger conditions`,"skillsPage.triggerMode":`Trigger mode`,"skillsPage.uninstall":`Uninstall`,"skillsPage.uninstallSkill":`Uninstall skill`,"skillsPage.userScopedConfiguration":`User-scoped configuration`,"skillsPage.usesChatToolPermissions":`Uses chat tool permissions`,"skillsPage.useTheButtonInTheUpperRightToInstallAnAgentSkillsCompatibleSkill":`Use the button in the upper-right to install an Agent Skills-compatible skill.`,"skillsPage.version":`Version`},wt={"terminalPanel.terminal":`Terminal`,"terminalPanel.resizeTerminal":`Resize terminal`,"terminalPanel.hideTerminal":"Hide terminal (Ctrl+`)","terminalPanel.showTerminal":"Show terminal (Ctrl+`)","terminalPanel.newTerminal":`New terminal`,"terminalPanel.closeTerminal":`Close terminal`,"terminalPanel.maximizeTerminal":`Expand terminal panel`,"terminalPanel.openTerminal":`Open terminal`,"terminalPanel.usesActiveSessionWorkspace":`New terminals use the active session workspace`,"terminalPanel.orphanedTerminal":`Unlinked`,"terminalPanel.starting":`Starting shell...`,"terminalPanel.processExited":`Process exited with code {code}`},Tt={"workflowsPage.workflowDuplicated":`Workflow duplicated`,"workflowsPage.workflowImported":`Workflow imported`,"workflowsPage.skillNode":`Skill`,"workflowsPage.callSkill":`Invoke Skill`,"workflowsPage.conditionBranch":`Condition branch`,"workflowsPage.parallelJoin":`Parallel join`,"workflowsPage.humanApproval":`Human approval`,"workflowsPage.waitingApproval":`Waiting for approval`,"workflowsPage.interrupted":`Interrupted`,"workflowsPage.runHistory":`Run history`,"workflowsPage.templates":`Templates`,"workflowsPage.import":`Import`,"workflowsPage.neverRun":`Never run`,"workflowsPage.duplicateWorkflow":`Duplicate workflow`,"workflowsPage.export":`Export`,"workflowsPage.countAttempts":`{count} attempts`,"workflowsPage.approve":`Approve`,"workflowsPage.reject":`Reject`,"workflowsPage.retryRun":`Retry run`,"workflowsPage.averageDuration":`Average duration`,"workflowsPage.visibility":`Visibility`,"workflowsPage.private":`Private`,"workflowsPage.shared":`Shared in workspace`,"workflowsPage.tags":`Tags`,"workflowsPage.revision":`Current revision`,"workflowsPage.inputParameters":`Input parameters`,"workflowsPage.addInput":`Add input parameter`,"workflowsPage.newInput":`New input`,"workflowsPage.parameterName":`Parameter name`,"workflowsPage.parameterType":`Parameter type`,"workflowsPage.required":`Required`,"workflowsPage.chooseSkill":`Choose an enabled Skill`,"workflowsPage.mcpToolNames":`MCP tool names`,"workflowsPage.executionMode":`Execution mode`,"workflowsPage.readOnly":`Read only`,"workflowsPage.workspaceWrite":`Auto-approve`,"workflowsPage.fullAccess":`Full access`,"workflowsPage.readOnlyHelp":`Only reading and analysis are allowed; files cannot be modified and Shell cannot run.`,"workflowsPage.workspaceWriteHelp":`Write to the current working directory and auto-approve routine commands; external access remains restricted.`,"workflowsPage.fullAccessHelp":`Access host files and the network, and run Shell as the current OS user.`,"workflowsPage.outputFormat":`Output format`,"workflowsPage.dataPath":`Data path`,"workflowsPage.operator":`Operator`,"workflowsPage.comparisonValue":`Comparison value`,"workflowsPage.approvalMessage":`Approval message`,"workflowsPage.approvalTimeout":`Approval timeout (minutes)`,"workflowsPage.all":`All`,"workflowsPage.custom":`Custom`,"workflowsPage.triggerNode":`Trigger`,"workflowsPage.fileNode":`File`,"workflowsPage.mcpNode":`MCP`,"workflowsPage.notificationNode":`Notification`,"workflowsPage.notificationTitle":`Notification title`,"workflowsPage.notificationContent":`Notification content`,"workflowsPage.notificationChannels":`Notification channels`,"workflowsPage.notificationChannelEnabled":`Channel enabled`,"workflowsPage.notificationChannelNotEnabled":`This channel is not enabled. Enable it in Channel settings first`,"workflowsPage.noExternalNotificationChannelsEnabled":`No Feishu or WeChat channel is enabled. System notifications can still be authorized separately.`,"workflowsPage.openChannelSettings":`Open Channels`,"workflowsPage.openSystemNotificationSettings":`Notification settings`,"workflowsPage.systemNotificationPermissionRequired":`System notification permission is off. Allow Pisper to send notifications in your browser or operating system settings.`,"workflowsPage.systemNotificationReady":`Click to request system notification permission`,"workflowsPage.systemNotificationsEnabled":`System notifications enabled`,"workflowsPage.systemNotificationsUnsupported":`System notifications are not supported in this environment.`,"workflowsPage.conditionNode":`Condition`,"workflowsPage.parallelNode":`Parallel`,"workflowsPage.approvalNode":`Approval`,"workflowsPage.manualTrigger":`Manual trigger`,"workflowsPage.readWriteFiles":`Read/write files`,"workflowsPage.callMcp":`Call MCP`,"workflowsPage.sendNotification":`Send notification`,"workflowsPage.runPrompt":`Run Prompt`,"workflowsPage.triggerGroup":`Trigger`,"workflowsPage.browserNotification":`Notification`,"workflowsPage.feishu":`Feishu`,"workflowsPage.weChat":`WeChat`,"workflowsPage.codeReview":`Code review`,"workflowsPage.codeReviewDescription":`Read diff → run tests → generate review`,"workflowsPage.prFix":`PR fix`,"workflowsPage.prFixDescription":`Locate failure → modify code → regression test`,"workflowsPage.research":`Research`,"workflowsPage.researchDescription":`Search sources → extract citations → save memory`,"workflowsPage.dailyWeeklyReport":`Daily/weekly report`,"workflowsPage.reportDescription":`Collect chats → generate summary → notify channel`,"workflowsPage.assetGeneration":`Asset generation`,"workflowsPage.assetDescription":`Generate image → save to assets → request review`,"workflowsPage.releasePreparation":`Release preparation`,"workflowsPage.releaseDescription":`Check version → changelog → create release checklist`,"previewPages.addMCPService":`Add MCP service`,"previewPages.afterDeletionToolsFromThisServerWillBeRemovedFromSubsequentAgentRuns":`After deletion, tools from this server will be removed from subsequent agent runs.`,"previewPages.availableTools":`Available tools`,"previewPages.online":`Online`,"previewPages.connecting":`Connecting`,"previewPages.unauthorized":`Unauthorized`,"previewPages.disabled":`Disabled`,"previewPages.offline":`Offline`,"previewPages.lowRisk":`Low risk`,"previewPages.mediumRisk":`Medium risk`,"previewPages.highRisk":`High risk`,"previewPages.transport":`Transport`,"previewPages.latency":`Latency`,"previewPages.lastPing":`Last ping`,"previewPages.authentication":`Authentication`,"previewPages.configuredEnvironmentVariables":`Configured environment variables`,"previewPages.connect":`Connect`,"previewPages.connectMCPServer":`Connect MCP server`,"previewPages.continue":`Continue`,"previewPages.countRequestHeaders":`{count} request headers`,"previewPages.countRestrictedTools":`{count} restricted tools`,"previewPages.countServicesTotal":`{count} services total`,"previewPages.currentService":`Current service`,"previewPages.delete":`Delete`,"previewPages.deleteMCPServer":`Delete MCP server`,"previewPages.enterAStreamableHTTPURLAStdioCommandOrJSONContainingHeadersEnv":`Enter a Streamable HTTP URL, a stdio command, or JSON containing headers/env.`,"previewPages.errorRate":`Error rate`,"previewPages.executable":`Executable`,"previewPages.localProcess":`Local process`,"previewPages.mcpConnectionTestPassed":`MCP connection test passed`,"previewPages.mcpServerAdded":`MCP server added`,"previewPages.mcpServerDeleted":`MCP server deleted`,"previewPages.mcpServerDisabled":`MCP server disabled`,"previewPages.mcpServerEnabled":`MCP server enabled`,"previewPages.mcpServersCanExposeToolsThatPerformExternalActionsConnectOnlyToServersYouTrust":`MCP servers can expose tools that perform external actions. Connect only to servers you trust.`,"previewPages.none":`None`,"previewPages.noServerConfigured":`No server configured`,"previewPages.onlineServices":`Online services`,"previewPages.recentCalls":`Recent calls`,"previewPages.serverAddress":`Server address`,"previewPages.serverConfiguration":`Server configuration`,"previewPages.serverEnabled":`Server enabled`,"previewPages.services":`Services`,"previewPages.testConnection":`Test connection`,"previewPages.thisServerExposesToolsThroughAStandardMCPTransportEnabledToolsAreRegisteredInNewAgentRuntimes":`This server exposes tools through a standard MCP transport. Enabled tools are registered in new agent runtimes.`,"previewPages.toggleMCPServer":`Toggle MCP server`,"previewPages.toggleToolName":`Toggle tool {name}`,"previewPages.toolCapabilities":`Tool capabilities`,"previewPages.useTheButtonInTheUpperRightToAddAStreamableHTTPOrStdioMCPServer":`Use the button in the upper-right to add a Streamable HTTP or stdio MCP server.`,"previewPages.workingDirectory":`Working directory`,"workflowsPage.aConnectionIsCurrentlySelected":`A connection is currently selected.`,"workflowsPage.aTriggerCannotHaveAnUpstreamConnection":`A trigger cannot have an upstream connection`,"workflowsPage.aWorkflowCannotContainCyclicConnections":`A workflow cannot contain cyclic connections`,"workflowsPage.chooseATemplateAboveToGetStarted":`Choose a template above to get started`,"workflowsPage.commonTemplates":`Common templates`,"workflowsPage.completed":`Completed`,"workflowsPage.completionDelivery":`Completion delivery`,"workflowsPage.configurablePerNode":`Configurable per node`,"workflowsPage.connectionCreated":`Connection created`,"workflowsPage.connectionDeleted":`Connection deleted`,"workflowsPage.countAvailableChannels":`{count} available channels`,"workflowsPage.countCurrentlyRunning":`{count} currently running`,"workflowsPage.countTemplates":`{count} templates`,"workflowsPage.countWorkflows":`{count} workflows`,"workflowsPage.countWorkflowsTotal":`{count} workflows total`,"workflowsPage.customWorkflow":`Custom workflow`,"workflowsPage.defaultModel":`Default model`,"workflowsPage.delete":`Delete`,"workflowsPage.deleteConnection":`Delete connection`,"workflowsPage.deleteNode":`Delete node`,"workflowsPage.deleteWorkflow":`Delete workflow`,"workflowsPage.deleteWorkflowNameAndItsRunHistory":`Delete workflow “{name}” and its run history?`,"workflowsPage.describeTheWorkTheAgentShouldCompleteInThisNode":`Describe the work the agent should complete in this node`,"workflowsPage.description":`Description`,"workflowsPage.draft":`Draft`,"workflowsPage.drag":`Drag`,"workflowsPage.dragFromANodeOutputToTheTargetInputToConnectThem":`Drag from a node output to the target input to connect them`,"workflowsPage.dragNodesFromTheLeftToStartBuildingTheWorkflow":`Drag nodes from the left to start building the workflow.`,"workflowsPage.duplicateNode":`Duplicate node`,"workflowsPage.edit":`Edit`,"workflowsPage.enabled":`Enabled`,"workflowsPage.failed":`Failed`,"workflowsPage.failureHandling":`Failure handling`,"workflowsPage.inheritWorkflowDefaultModel":`Inherit workflow default model`,"workflowsPage.inputPort":`Input port`,"workflowsPage.latestRun":`Latest run`,"workflowsPage.loadingWorkflowEditor":`Loading workflow editor`,"workflowsPage.loadingWorkflows":`Loading workflows`,"workflowsPage.maximumConcurrency":`Maximum concurrency`,"workflowsPage.name":`Name`,"workflowsPage.noCustomWorkflowYet":`No custom workflow yet`,"workflowsPage.nodeDeleted":`Node deleted`,"workflowsPage.nodeDuplicated":`Node duplicated`,"workflowsPage.nodeLibrary":`Node library`,"workflowsPage.nodeModel":`Node model`,"workflowsPage.nodeName":`Node name`,"workflowsPage.noMatchingWorkflows":`No matching workflows`,"workflowsPage.noRunHistory":`No run history`,"workflowsPage.notEnabled":`Not enabled`,"workflowsPage.outputPort":`Output port`,"workflowsPage.preparing":`Preparing`,"workflowsPage.presets":`Presets`,"workflowsPage.pressDeleteOrBackspaceToRemoveThisConnection":`Press Delete or Backspace to remove this connection.`,"workflowsPage.published":`Published`,"workflowsPage.queueAndLimits":`Queue and limits`,"workflowsPage.retryCount":`Retry count`,"workflowsPage.retryOnFailure":`Retry on failure`,"workflowsPage.run":`Run`,"workflowsPage.running":`Running`,"workflowsPage.runningNode":`Running: {node}`,"workflowsPage.runningNodeCompletedTotalCompleted":`Running: {node} · {completed}/{total} completed`,"workflowsPage.selectedConnection":`Selected connection`,"workflowsPage.selectedNode":`Selected node`,"workflowsPage.skipThisNode":`Skip this node`,"workflowsPage.startBlank":`Start blank`,"workflowsPage.stop":`Stop`,"workflowsPage.stopImmediately":`Stop immediately`,"workflowsPage.stopped":`Stopped`,"workflowsPage.stoppingWorkflow":`Stopping workflow`,"workflowsPage.task":`Task`,"workflowsPage.thisConnectionAlreadyExists":`This connection already exists`,"workflowsPage.timeoutMinutes":`Timeout (minutes)`,"workflowsPage.unknownNode":`Unknown node`,"workflowsPage.upTo3TimesPerNode":`Up to 3 times per node`,"workflowsPage.useSystemDefault":`Use system default`,"workflowsPage.workflowCompleted":`Workflow completed`,"workflowsPage.workflowDeleted":`Workflow deleted`,"workflowsPage.workflowDraftSaved":`Workflow draft saved`,"workflowsPage.workflowFailed":`Workflow failed`,"workflowsPage.workflowNotFoundABlankEditorWasOpened":`Workflow not found. A blank editor was opened.`,"workflowsPage.workflowPublished":`Workflow published`,"workflowsPage.workflowRunning":`Workflow running`,"workflowsPage.workflows":`Workflows`,"workflowsPage.workflowSettings":`Workflow settings`,"workflowsPage.workflowStarted":`Workflow started`,"workflowsPage.workingDirectory":`Working directory`,"previewPages.noToolsAvailable":`No tools available`,"previewPages.noRecentCalls":`No recent calls`},Et={"assetsPage.images":`图片`,"assetsPage.files":`文件`,"assetsPage.links":`链接`,"assetsPage.fromCurrentChat":`来自当前会话`,"assetsPage.adding":`添加中…`,"assetsPage.addLink":`添加链接`,"assetsPage.addLinkAsset":`添加链接资产`,"assetsPage.agentOutputs":`Agent 产物`,"assetsPage.all":`全部`,"assetsPage.assetDeleted":`资产已删除`,"assetsPage.assets":`个资产`,"assetsPage.bringInALinkOrAttachAFileInAConversationPisperWillGatherTheOutputsCreatedAlongTheWay":`把链接带来,或在对话中加入附件;Pisper 会把沿途生成的文件一并收好。`,"assetsPage.cancel":`取消`,"assetsPage.closeDialog":`关闭对话框`,"assetsPage.conversationAttachmentsAndAgentOutputsGatherHereAutomatically":`对话附件与 Agent 产物,会在这里自动汇聚`,"assetsPage.delete":`删除`,"assetsPage.deleteAsset":`删除资产`,"assetsPage.deleteAssetName":`确定删除资产「{name}」吗?`,"assetsPage.download":`下载`,"assetsPage.forExampleOpenAIAPIDocs":`例如 OpenAI API 文档`,"assetsPage.fromName":`来自:{name}`,"assetsPage.linkAssetAdded":`链接资产已添加`,"assetsPage.linksCanBeArchivedOpenedOrAddedToAChatAsContext":`链接可以归档、打开,也可以作为上下文加入对话。`,"assetsPage.loadingAssets":`正在加载资产`,"assetsPage.chatAttachments":`对话附件`,"assetsPage.manualUploads":`手动上传`,"assetsPage.name":`名称`,"assetsPage.nameAddedToChat":`{name} 已加入对话`,"assetsPage.nothingHasGatheredHereYet":`这里还没有留下产物`,"assetsPage.open":`打开`,"assetsPage.preview":`预览`,"assetsPage.thisFileTypeCanBeDownloadedSupportedDocumentsCanAlsoBeAddedToAChatForAnalysis":`此类型可下载,支持的文档也可以直接加入对话分析。`,"assetsPage.useInChat":`用于对话`},Dt={"channelsPage.feishu":`飞书`,"channelsPage.weChat":`微信`,"channelsPage.feishuAppBot":`飞书应用机器人`,"channelsPage.webSocketPersistentConnection":`WebSocket 长连接`,"channelsPage.tencentILinkPersistentConnection":`Tencent iLink 持续连接`,"channelsPage.feishuCapabilities":`私聊、群聊 @、图片和文件`,"channelsPage.weChatCapabilities":`个人微信私聊、图片和文件`,"channelsPage.notConnected":`未连接`,"channelsPage.connecting":`连接中`,"channelsPage.online":`在线`,"channelsPage.reconnecting":`重连中`,"channelsPage.connectionFailed":`连接失败`,"channelsPage.requestingLoginQrCode":`正在申请登录二维码…`,"channelsPage.scanAndConfirmConnection":`请使用手机扫码并确认连接`,"channelsPage.scannedWaitingForConfirmation":`已扫码,正在等待确认…`,"channelsPage.enterPairingCode":`请输入手机上显示的数字配对码`,"channelsPage.confirmingAuthorization":`正在确认授权…`,"channelsPage.authorizationSucceededConnecting":`授权成功,正在建立持续连接…`,"channelsPage.channelConnected":`渠道已经连接`,"channelsPage.cancelled":`已取消`,"channelsPage.accessScope":`访问范围`,"channelsPage.accessScopeUpdated":`访问范围已更新`,"channelsPage.afterYouScanAndConfirmCredentialsAreSavedAndTheChannelStaysOnlineIncomingMessagesGoDirectlyToThe":`扫码确认后会自动保存凭据并保持在线,收到消息后直接交给指定模型和 {agent}。`,"channelsPage.cancel":`取消`,"channelsPage.cannotScanOpenTheSignInLink":`无法扫码?打开登录链接`,"channelsPage.channelChatReset":`渠道会话已重置`,"channelsPage.channelChats":`渠道会话`,"channelsPage.channelReplyModelUpdated":`渠道回复模型已更新`,"channelsPage.closeDialog":`关闭对话框`,"channelsPage.connectedTime":`已连接 {time}`,"channelsPage.connectNameByQRCode":`扫码连接{name}`,"channelsPage.continueScanning":`继续扫码`,"channelsPage.countLinked":`{count} 个已绑定`,"channelsPage.createTheBotAppThroughTheOfficialFeishuAuthorizationPage":`由飞书官方授权页创建机器人应用。`,"channelsPage.defaultModel":`默认模型`,"channelsPage.defaultWorkingDirectoryForNewChats":`新会话默认工作目录`,"channelsPage.defaultWorkingDirectorySaved":`默认工作目录已保存`,"channelsPage.disconnect":`解除连接`,"channelsPage.disconnectName":`解除{name}连接`,"channelsPage.eachContactOrChatMapsToAnIndependentAgentSession":`每个联系人或聊天独立映射 Agent 会话`,"channelsPage.enableThisChannel":`启用此渠道`,"channelsPage.enterTheNumberShownOnYourPhone":`输入手机显示的数字`,"channelsPage.establishingPersistentConnection":`正在建立持续连接`,"channelsPage.generateANewQRCode":`重新生成二维码`,"channelsPage.loadingChannels":`正在加载渠道`,"channelsPage.localCredentialsAndChatMappingsWillBeDeleted":`本地凭据和会话映射会被删除。`,"channelsPage.localSecurityBoundary":`本机安全边界`,"channelsPage.channelPaused":`渠道已暂停`,"channelsPage.channelEnabled":`渠道已启用`,"channelsPage.allWeChatUsersWhoMessageTheBot":`所有给机器人发消息的微信用户`,"channelsPage.allMembersInTheCurrentTenant":`当前租户所有成员`,"channelsPage.scanAgainToReconnect":`重新扫码绑定`,"channelsPage.nameConnectionQRCode":`{name}连接二维码`,"channelsPage.nameDisconnected":`{name}已解除连接`,"channelsPage.nameReconnected":`{name}已重新连接`,"channelsPage.nameSettings":`{name}设置`,"channelsPage.nameTwoWayConnectionEstablished":`{name}已建立双向连接`,"channelsPage.noMessages":`暂无消息`,"channelsPage.off":`关闭`,"channelsPage.onceConnectedMessagesFromFeishuOrWeixinWillArriveHereInPisper":`连接完成后,来自飞书或微信的消息会在这里抵达 Pisper。`,"channelsPage.ownerOnlyAccessRespectsToolPermissionsAndExecutionMode":`默认仅允许扫码创建者使用;Agent 工具仍遵循已配置的工具权限和会话执行模式。`,"channelsPage.pairingCodeSubmitted":`配对码已提交`,"channelsPage.persistentTwoWayConnection":`持续在线的双向连接`,"channelsPage.processing":`正在处理…`,"channelsPage.qrCodeExpiresTime":`二维码将在 {time}过期`,"channelsPage.qrCodeOwnerOnly":`仅扫码创建者`,"channelsPage.reconnect":`重连`,"channelsPage.reconnectName":`重新连接{name}`,"channelsPage.replyModel":`回复模型`,"channelsPage.reset":`重置`,"channelsPage.resetChannelChat":`重置渠道会话`,"channelsPage.resetChat":`重置会话`,"channelsPage.resetTheAppChatLinkedToScope":`重置“{scope}”绑定的 {app} 会话?`,"channelsPage.save":`保存`,"channelsPage.scanningAgainWillReplaceTheCurrentNameConnectionContinue":`重新扫码会替换当前{name}连接,是否继续?`,"channelsPage.signInToPersonalWeChatThroughTencentILinkBot":`由腾讯 iLink Bot 完成个人微信登录。`,"channelsPage.submitPairingCode":`提交配对码`,"channelsPage.tencentILinkContinuouslyPollsDirectMessagesAndSupportsTextAndMediaReplies":`腾讯 iLink 持续拉取私聊消息,并支持文字与媒体回复。`,"channelsPage.trueTwoWayMessagingNoNotificationWebhookRequired":`真正双向收发,不使用通知 Webhook`,"channelsPage.turnOffToDisconnectWhileKeepingSignInCredentials":`关闭后断开连接,但保留登录凭据`,"channelsPage.twoWay":`双向`,"channelsPage.twoWayCapability":`双向能力`,"channelsPage.useApplicationDefaultModel":`跟随应用默认模型`,"channelsPage.waitingForTheFirstReplyFromAfar":`等待远方的第一声回应`,"channelsPage.webSocketReceivesDirectMessagesAndGroupMentions":`WebSocket 接收私聊和群聊 @ 消息。`},Ot={"resourcePicker.title":`调用资源`,"resourcePicker.description":`插入 Prompt,调用 Skill 或工具,或启动可持续跟踪的工作流。`,"resourcePicker.open":`打开 Prompt、Skill、工具和工作流`,"resourcePicker.close":`关闭资源选择器`,"resourcePicker.search":`搜索 Prompt、Skill、工具和工作流`,"resourcePicker.categories":`资源分类`,"resourcePicker.all":`全部`,"resourcePicker.prompt":`Prompt`,"resourcePicker.skill":`Skill`,"resourcePicker.workflow":`工作流`,"resourcePicker.tool":`工具`,"resourcePicker.loading":`正在加载资源…`,"resourcePicker.empty":`没有找到可调用的资源。`,"resourcePicker.noDescription":`暂无说明`,"resourcePicker.chooseResource":`选择左侧资源以查看调用配置。`,"resourcePicker.useResource":`使用此资源`,"resourcePicker.insertPrompt":`插入 Prompt`,"resourcePicker.remove":`移除调用资源`,"commands.open":`打开 Slash 命令`,"commands.prompt":`Prompt`,"commands.skill":`Skill`,"commands.loading":`正在加载命令…`,"commands.loadError":`命令加载失败。`,"commands.empty":`没有匹配的命令。`,"commands.noDescription":`暂无说明`,"commands.scope.user":`用户级`,"commands.scope.project":`项目级`,"commands.scope.package":`Package`,"commands.scope.custom":`自定义`,"pathAttachmentPicker.title":`添加本机路径`,"pathAttachmentPicker.description":`只将文件路径传给 Agent,不读取或上传文件内容。`,"pathAttachmentPicker.directoryPath":`文件所在目录`,"pathAttachmentPicker.selectName":`选择 {name}`,"pathAttachmentPicker.empty":`此目录没有文件或子目录`,"pathAttachmentPicker.attachCount":`添加 {count} 个路径`,"sessionTree.menu":`追忆`,"sessionTree.menuDescription":`查看关键 Turn 与分叉路径`,"sessionTree.waitForRun":`等待当前运行完成后再打开追忆`,"sessionTree.title":`追忆`,"sessionTree.description":`这段对话沉淀了 {nodes} 个节点和 {branches} 条分叉路径;切换路径不会删除其他上下文。`,"sessionTree.conversation":`对话`,"sessionTree.labeled":`标记`,"sessionTree.all":`全部`,"sessionTree.allMarks":`全部标记`,"sessionTree.markActive":`当前分支`,"sessionTree.markTimes":`会话 {sessionTime} · 节点 {nodeTime}`,"sessionTree.noMarksYet":`还没有标记过任何节点。在聊天中点消息上的标记图标即可标记。`,"sessionTree.loadingMarks":`正在加载标记`,"sessionTree.userMessage":`用户消息`,"sessionTree.agentMessage":`Agent 回复`,"sessionTree.toolResult":`工具结果`,"sessionTree.toolCall":`工具调用`,"sessionTree.branchSummary":`分支摘要`,"sessionTree.compactionSummary":`上下文摘要`,"sessionTree.settingsChange":`运行设置`,"sessionTree.labelChange":`标记变更`,"sessionTree.branchPosition":`待继续的分支位置`,"sessionTree.extensionEntry":`Runtime 条目`,"sessionTree.metadataEntry":`会话元数据`,"sessionTree.message":`消息`,"sessionTree.current":`当前`,"sessionTree.fork":`分叉`,"sessionTree.active":`活动分支`,"sessionTree.loading":`正在整理追忆…`,"sessionTree.searchPlaceholder":`搜索标记和节点内容`,"sessionTree.empty":`此筛选下没有节点。`,"sessionTree.noPreview":`此节点没有可显示的正文。`,"sessionTree.nodeLabel":`节点标记`,"sessionTree.labelPlaceholder":`可选,用于快速定位`,"sessionTree.saveLabel":`保存标记`,"sessionTree.savingLabel":`正在保存…`,"sessionTree.removeLabel":`删除标记`,"sessionTree.abandonedBranchSummary":`总结离开的分支`,"sessionTree.abandonedBranchSummaryHint":`由当前模型生成摘要并带入新分支,会产生一次模型请求。`,"sessionTree.sideEffectsRemain":`切换只改变后续对话上下文,不会撤销文件、网络或工具操作。`,"sessionTree.navigating":`正在切换…`,"sessionTree.currentPosition":`当前节点`,"sessionTree.continueFromNode":`从此处继续`,"sessionTree.createChildChat":`从此处另开`,"sessionTree.creatingChildChat":`正在创建独立对话…`,"sessionTree.conversationLineage":`对话脉络`,"sessionTree.returnToOriginalChat":`返回原对话:{name}`,"sessionTree.openSeparateChat":`打开另开的对话:{name}`,"sessionTree.chooseNode":`选择一个节点查看详情。`,"sessionTree.retry":`重试`,"workflowRun.running":`运行中`,"workflowRun.waitingApproval":`等待审批`,"workflowRun.completed":`已完成`,"workflowRun.failed":`失败`,"workflowRun.stopped":`已停止`,"workflowRun.interrupted":`已中断`,"workflowRun.approve":`批准`,"workflowRun.reject":`拒绝`,"workflowRun.stop":`停止运行`,"workflowRun.request":`启动说明`,"workflowRun.inputs":`输入参数`,"planBoard.ariaLabel":`执行计划`,"planBoard.toggleAriaLabel":`展开或折叠当前执行计划`,"planBoard.openCurrentPlan":`查看当前计划,{progress}`,"planBoard.progress":`Plan · {completed}/{total}`,"planBoard.countInProgress":`{count} 进行中`,"planBoard.countBlocked":`{count} 被阻塞`,"planBoard.completed":`已完成`,"planBoard.inProgress":`进行中`,"planBoard.blocked":`被阻塞`,"planBoard.pending":`待处理`,"planBoard.unassigned":`未认领`,"planBoard.assignedTo":`认领人:{name}`,"planBoard.waitingFor":`等待:{tasks}`,"agentRunActivity.readingFiles":`正在读取文件`,"agentRunActivity.searchingContent":`正在搜索内容`,"agentRunActivity.findingFiles":`正在查找文件`,"agentRunActivity.browsingDirectories":`正在浏览目录`,"agentRunActivity.editingFiles":`正在修改文件`,"agentRunActivity.writingFiles":`正在写入文件`,"agentRunActivity.runningCommands":`正在运行命令`,"agentRunActivity.searchingMemory":`正在搜索记忆`,"agentRunActivity.savingMemory":`正在保存记忆`,"agentRunActivity.startingSubagent":`正在启动子 Agent`,"agentRunActivity.checkingSubagents":`正在检查子 Agent`,"agentRunActivity.messagingSubagent":`正在向子 Agent 发送消息`,"agentRunActivity.addingSubagentTask":`正在追加子 Agent 任务`,"agentRunActivity.waitingForSubagent":`正在等待子 Agent`,"agentRunActivity.interruptingSubagent":`正在中断子 Agent`,"agentRunActivity.liveCommandOutput":`实时命令输出`,"agentRunActivity.readingPlan":`正在读取计划`,"agentRunActivity.updatingPlan":`正在更新计划`,"agentRunActivity.controllingBrowser":`正在操作浏览器`,"agentRunActivity.generatingVisualContent":`正在生成视觉内容`,"agentRunActivity.discoveringTools":`正在查找可选工具`,"agentRunActivity.filesRead":`已读取文件`,"agentRunActivity.searchCompleted":`已完成搜索`,"agentRunActivity.findCompleted":`已完成查找`,"agentRunActivity.directoriesBrowsed":`已浏览目录`,"agentRunActivity.filesEdited":`已修改文件`,"agentRunActivity.filesWritten":`已写入文件`,"agentRunActivity.commandCompleted":`命令执行完成`,"agentRunActivity.commandOutput":`命令输出`,"agentRunActivity.subagentStarted":`子 Agent 已启动`,"agentRunActivity.subagentStatusUpdated":`子 Agent 状态已更新`,"agentRunActivity.toolsDiscovered":`已完成工具发现`,"agentRunActivity.agentQueued":`{name} 等待调度`,"agentRunActivity.agentStarting":`{name} 正在启动`,"agentRunActivity.agentRunning":`{name} 正在运行`,"agentRunActivity.agentCompleted":`{name} 已完成`,"agentRunActivity.agentInterrupted":`{name} 已中断`,"agentRunActivity.agentFailed":`{name} 执行失败`,"agentRunActivity.agentStatusUpdated":`{name} 状态已更新`,"agentRunActivity.addedTitle":`新增:{title}`,"agentRunActivity.advancingTheTask":`正在推进任务`,"agentRunActivity.blockedTitle":`阻塞:{title}`,"agentRunActivity.compactingContext":`正在压缩上下文`,"agentRunActivity.completedTitle":`完成:{title}`,"agentRunActivity.completedTotalCompleted":`{completed}/{total} 已完成`,"agentRunActivity.contextCompactedBeforeAfterTokens":`上下文已压缩:{before} → {after} tokens`,"agentRunActivity.contextIsFullTheRequestWillRetryAfterCompaction":`上下文已满,压缩后将自动重试`,"agentRunActivity.contextIsNearingItsLimitSummarizingOlderMessages":`上下文接近上限,正在摘要较早消息`,"agentRunActivity.countInProgress":`{count} 项进行中`,"agentRunActivity.countLiveOperations":`{count} 项实时操作`,"agentRunActivity.countCompletedOperations":`已完成 {count} 项操作`,"agentRunActivity.countMoreChanges":`还有 {count} 项变更`,"agentRunActivity.countPlanChanges":`{count} 项计划变更`,"agentRunActivity.currentOperationCompleted":`当前操作已完成`,"agentRunActivity.inProgressTitle":`进行中:{title}`,"agentRunActivity.noNewProgressForCountS":`{count} 秒无新进度`,"agentRunActivity.pendingTitle":`待处理:{title}`,"agentRunActivity.planCleared":`计划已清空`,"agentRunActivity.planUpdated":`已更新计划`,"agentRunActivity.preparingTheResponse":`正在整理回复`,"agentRunActivity.processingToolResult":`正在处理工具结果`,"agentRunActivity.startingTheModel":`正在启动模型请求`,"agentRunActivity.reasoningAboutTheNextStep":`正在推理下一步`,"agentRunActivity.reasoningInProgress":`思考中`,"agentRunActivity.reasoningCompleted":`思考过程`,"agentRunActivity.toggleReasoning":`展开或折叠思考过程`,"agentRunActivity.toolActivityAriaLabel":`工具使用记录`,"agentRunActivity.removedTitle":`移除:{title}`,"agentRunActivity.retryingRequest":`正在重试请求`,"agentRunActivity.runStopped":`已停止运行`,"agentRunActivity.subagent":`子 Agent`,"agentRunActivity.summarizingOlderMessages":`正在整理较早消息`,"agentRunActivity.summarizingOlderMessagesAsRequested":`正在按请求整理较早消息`,"agentRunActivity.thisRunFailed":`本轮执行失败`,"agentRunActivity.toolFailed":`{tool}执行失败`,"agentRunActivity.tools":`工具`,"agentRunActivity.understandingTheTask":`正在理解任务`,"agentRunActivity.usingTool":`正在使用 {tool}`,"agentRunActivity.waitingForTheModel":`正在等待模型响应`,"agentRunActivity.waitingToRetry":`正在等待重试`,"agentRunActivity.finalizingTheRun":`正在完成本轮执行`,"attachments.couldNotReadFile":`读取文件失败`,"attachments.nameExceedsThe10MBLimit":`{name} 超过 10 MB 限制`,"attachments.nameIsNotSupportedChooseAnImageOrTextCodeFile":`{name} 暂不支持;请选择图片、文档或文本/代码文件`,"attachments.totalAttachmentSizeCannotExceed20MB":`附件总大小不能超过 20 MB`,"chatDock.openAChatFromTheSessionListOrSplitItInAnyDirection":`从侧边栏打开会话,或向任意方向拆分。`,"chatDock.openAChatToBegin":`打开一个会话开始工作`,"chatHistoryPage.agentRunning":`Agent 运行中`,"chatHistoryPage.chatDeleted":`会话已删除`,"chatHistoryPage.chatHistory":`历史会话`,"chatHistoryPage.chatTitle":`会话标题`,"chatHistoryPage.chatTitleUpdated":`会话标题已更新`,"chatHistoryPage.countChatHistoryItems":`{count} 个历史会话`,"chatHistoryPage.countCurrentlyFiltered":`当前筛选到 {count} 个`,"chatHistoryPage.countMessages":`{count} 条消息`,"chatHistoryPage.delete":`删除`,"chatHistoryPage.deleteChat":`删除会话`,"chatHistoryPage.deleteChatNameThisAlsoRemovesLocalChatHistory":`确定删除会话「{name}」吗?此操作会删除本地历史记录。`,"chatHistoryPage.loadingChatHistory":`正在加载历史会话`,"chatHistoryPage.noConversationsHaveLeftAnEchoYet":`还没有会话留下回声`,"chatHistoryPage.noMatchingConversations":`没有匹配的历史会话`,"chatHistoryPage.noMessageSummary":`暂无消息摘要`,"chatHistoryPage.onceAConversationBeginsItWillBeQuietlyGatheredHere":`开始一段对话后,它会被安静地收进这里。`,"chatHistoryPage.refresh":`刷新`,"chatHistoryPage.renameChat":`重命名会话`,"chatHistoryPage.save":`保存`,"chatHistoryPage.sortedByMostRecentlyUpdated":`按最近更新时间排列`,"chatHistoryPage.splitNameToTheBottom":`将 {name} 拆分到下方`,"chatHistoryPage.splitNameToTheLeft":`将 {name} 拆分到左侧`,"chatHistoryPage.splitNameToTheRight":`将 {name} 拆分到右侧`,"chatHistoryPage.splitNameToTheTop":`将 {name} 拆分到上方`,"chatHistoryPage.splitToBottom":`拆分到下方`,"chatHistoryPage.splitToLeft":`拆分到左侧`,"chatHistoryPage.splitToRight":`拆分到右侧`,"chatHistoryPage.splitToTop":`拆分到上方`,"chatHistoryPage.tryADifferentSearch":`更换搜索关键词后重试。`,"chatHistoryPage.untitledChat":`未命名会话`,"chatMessage.closePreview":`关闭预览`,"chatMessage.downloadOriginal":`下载原图`,"chatMessage.deriveFromHere":`从此处继续`,"chatMessage.continueFromHere":`从此处继续`,"chatMessage.createChildChat":`从此处另开对话`,"chatMessage.labelThisTurn":`标记此轮回复`,"chatMessage.fileAttachment":`文件附件`,"chatMessage.fullScreenImagePreview":`图片大屏预览`,"chatMessage.generatedImage":`生成图片`,"chatMessage.generatedVideo":`生成视频`,"chatMessage.imageAttachment":`图片附件`,"chatMessage.openFullScreenPreview":`点击大屏查看`,"chatPage.appChat":`{app} 对话`,"chatPage.approvalRequired":`审批后写入`,"chatPage.approvalStatusUpdated":`授权状态已更新`,"chatPage.chatTitle":`会话标题`,"chatPage.chatTitleUpdated":`会话标题已更新`,"chatPage.checkTheSystemSettingsAndTryAgain":`请检查系统设置后重试`,"chatPage.continueSetup":`继续安装`,"chatPage.contextCompacted":`上下文已压缩`,"chatPage.compactAfterModelSwitch":`压缩当前上下文?`,"chatPage.compactAfterModelSwitchDescription":`切换模型后原有前缀缓存无法继续复用。现在压缩历史上下文,可减少新模型首次请求需要重新处理的输入量。`,"chatPage.compactNow":`立即压缩`,"chatPage.currentRunStopped":`已停止当前运行`,"chatPage.branchedFromNode":`已从该节点衍生分支,后续对话将在此继续`,"chatPage.derivedChatCreated":`独立对话已创建`,"chatPage.derivedSessionName":`{name} · 另开`,"chatPage.createChildChat":`从此处另开对话`,"chatPage.separateChatSuffix":`另开`,"chatPage.childChatCreated":`独立对话已创建`,"chatPage.create":`创建`,"chatPage.enableFullAccess":`启用完全访问`,"chatPage.enableSecureExecution":`首次启用安全执行`,"chatPage.executionModeChangedToMode":`执行模式已切换为{mode}`,"chatPage.fullAccess":`完全访问`,"chatPage.fullAccessAllowsTheAgentToUseFilesAndNetworkServicesOutsideTheWorkspaceAndShellCommandsWillNoLon":`完全访问允许 Agent 操作工作区之外的文件和网络服务,并以当前系统用户权限运行 Shell,不再逐次请求授权。`,"chatPage.goalPaused":`Goal 已暂停`,"chatPage.goalTokenBudgetUpdated":`Goal token 预算已更新`,"chatPage.modelsSessionsAndContextAreSettlingIntoPlace":`模型、会话与上下文正在依次归位…`,"chatPage.newChat":`新会话`,"chatPage.newChatCreated":`新会话已创建`,"chatPage.noModelConfigured":`未配置模型`,"chatPage.onNarrowScreensChatsStayInASingleTabGroup":`窄屏模式下会话将保留在同一标签组中。`,"chatPage.pleaseAnalyzeTheseAttachments":`请分析这些附件。`,"chatPage.readOnly":`只读`,"chatPage.renameChat":`重命名会话`,"chatPage.retryingAttemptMaxAttemptsMessage":`正在重试 {attempt}/{maxAttempts}:{message}`,"chatPage.save":`保存`,"chatPage.splitToBottom":`拆分到下方`,"chatPage.splitToLeft":`拆分到左侧`,"chatPage.splitToRight":`拆分到右侧`,"chatPage.splitToTop":`拆分到上方`,"chatPage.stopped":`已停止`,"chatPage.switchedToModel":`已切换至 {model}`,"chatPage.switchedToThinkingLevel":`已切换思考等级至 {level}`,"chatPage.theAgentHasFinishedResponding":`Agent 已完成回复。`,"chatPage.theChatWasCreatedButTheListCouldNotBeRefreshedError":`会话已创建,但刷新列表失败:{error}`,"chatPage.thisGroupHasOnlyOneChatChooseAnotherChatFromTheSessionListToCreateASplit":`当前分组只有一个会话,请从左侧会话列表选择其他会话进行拆分。`,"chatPage.unsupportedEnvironment":`环境不受支持`,"chatPage.untitledChat":`未命名会话`,"chatPage.waitingForConfiguration":`等待配置`,"chatPage.wakingTheAgent":`正在唤醒 Agent`,"chatPage.workingDirectoryChangedToWorkspace":`工作目录已切换至 {workspace}`,"chatPage.workingDirectoryPath":`工作目录路径`,"chatPage.enterAWorkingDirectoryPath":`输入工作目录的完整路径(桌面端可从系统目录选择器选取)`,"chatPage.stopTheActiveRunBeforeChangingTheWorkspace":`请先停止运行,再切换工作目录`,"chatPage.stopTheActiveRunBeforeRenamingTheChat":`请先停止运行,再重命名会话`,"chatPage.stopTheActiveRunBeforeChangingTheExecutionMode":`请先停止运行,再切换执行模式`,"focusSession.addAttachment":`添加附件`,"focusSession.openCommandPaletteShortcut":`打开命令面板({shortcut})`,"focusSession.quickActions":`快捷操作`,"focusSession.expandQuickActions":`展开快捷操作`,"focusSession.collapseQuickActions":`收起快捷操作`,"focusSession.commands":`命令`,"focusSession.addGuidanceForTheRunningAgent":`向正在运行的 Agent 追加说明`,"focusSession.addGuidanceForTheRunningAgentShiftEnterForANewLine":`向正在运行的 Agent 追加说明,Shift + Enter 换行`,"focusSession.allow":`允许`,"focusSession.allowOnce":`本次允许`,"focusSession.autoCompactionThreshold":`自动压缩阈值`,"focusSession.autoCompactionThresholdAboutPercent":`自动压缩阈值约 {percent}%`,"focusSession.automaticContextCompactionIsDisabled":`自动上下文压缩未启用`,"focusSession.cannotSwitchWhileTheAgentIsRunning":`Agent 运行期间不能切换`,"focusSession.changeDirectory":`更改目录`,"focusSession.changeWorkingDirectoryWorkspace":`更改工作目录:{workspace}`,"focusSession.chatActions":`会话操作`,"focusSession.closeTab":`关闭标签`,"focusSession.compactContextNow":`立即压缩上下文`,"focusSession.compactingContext":`正在压缩上下文`,"focusSession.contextUsageTokensLimitTokensPercent":`上下文占用:{tokens} / {limit} tokens({percent}%)`,"focusSession.contextUsageToCompactionTokensPercent":`距离自动压缩还剩 {tokens} tokens({percent}%)`,"focusSession.contextUsageWillUpdateAfterTheNextModelResponseLimitLimitTokens":`上下文占用将在下一次模型响应后更新;上限 {limit} tokens`,"focusSession.countMore":`另有 {count} 条`,"focusSession.countMoreWaiting":`另有 {count} 项等待`,"focusSession.currentChatModel":`当前会话模型`,"focusSession.currentModelModelCannotSwitchWhileRunning":`当前模型:{model}(运行期间不可切换)`,"focusSession.currentModelModelClickToSwitch":`当前模型:{model},点击切换`,"focusSession.currentThinkingLevel":`当前思考等级`,"focusSession.currentThinkingLevelLevelCannotSwitchWhileRunning":`当前思考等级:{level}(运行期间不可切换)`,"focusSession.currentThinkingLevelLevelClickToSwitch":`当前思考等级:{level},点击切换`,"focusSession.thinkingLevelUnsupported":`当前模型不支持配置思考等级`,"focusSession.thinkingLevelFixed":`当前模型仅支持 {level} 思考等级`,"focusSession.thinkingLevelsLoadFailed":`思考等级加载失败,请刷新重试`,"focusSession.loadingThinkingLevels":`正在加载思考等级…`,"focusSession.deny":`拒绝`,"focusSession.document":`文档`,"focusSession.derivedFromSession":`衍生自「{name}」`,"focusSession.enableForTheNextMessageOnly":`仅对下一条消息启用`,"focusSession.estimatedContextUsageTokensLimitTokensPercent":`上下文占用(估算):{tokens} / {limit} tokens({percent}%)`,"focusSession.executionMode":`执行模式`,"focusSession.executionModeMode":`执行模式:{mode}`,"focusSession.executionModeModeDescription":`执行模式:{mode}——{description}`,"focusSession.explainCode":`解释代码`,"focusSession.explainHowThisCodeWorks":`解释这段代码的工作原理:`,"focusSession.findABug":`查 bug`,"focusSession.findIssues":`查找问题`,"focusSession.fullAccess":`完全访问`,"focusSession.goalComplete":`Goal 已完成`,"focusSession.goalMode":`Goal 模式`,"focusSession.goalBudgetSave":`保存预算`,"focusSession.goalTokenBudget":`Token 预算`,"focusSession.goalTokenBudgetHint":`不低于 {min} tokens,不设上限`,"focusSession.goalTokenBudgetUpdateHint":`调整后即时生效,并用于下一次继续 Goal`,"focusSession.gitCancel":`取消`,"focusSession.gitChanges":`改动`,"focusSession.gitCommit":`Commit`,"focusSession.gitCommitMessagePlaceholder":`提交信息(默认:Agent changes)`,"focusSession.gitCommitted":`已提交改动`,"focusSession.gitConfirmRevert":`确认撤销`,"focusSession.gitCloseDiff":`关闭 Diff`,"focusSession.gitDetachedHead":`游离 HEAD`,"focusSession.gitDiffChangedFiles":`变更文件`,"focusSession.gitDiffFileCount":`{count} 个文件`,"focusSession.gitDiffModified":`修改后`,"focusSession.gitDiffNoTextChanges":`该文件没有可显示的文本差异`,"focusSession.gitDiffOriginal":`原始`,"focusSession.gitDiffTruncated":`diff 过长已截断`,"focusSession.gitDiffUnavailable":`暂无可用 diff`,"focusSession.gitFilesChanged":`{count} 个文件`,"focusSession.gitLoading":`加载中…`,"focusSession.gitLoadFailed":`加载失败,请点右侧刷新重试`,"focusSession.gitUnavailable":`未找到 git/svn 命令,请安装版本控制工具后重启 Pisper`,"focusSession.gitMoreFiles":`还有 {count} 个文件未显示`,"focusSession.gitNoChanges":`工作区没有未提交的改动`,"focusSession.gitNotARepository":`当前目录不是 Git/SVN 工作区`,"focusSession.gitPush":`Push`,"focusSession.gitPushAhead":`推送 {count} 个未推送提交`,"focusSession.gitPushed":`已推送到远端`,"focusSession.gitRefresh":`刷新改动`,"focusSession.gitRevert":`撤销`,"focusSession.gitRevertDescription":`撤销全部未提交改动(git reset --hard + git clean -fd)`,"focusSession.vcsRevertDescription":`撤销全部未提交改动(Git: reset --hard + clean -fd;SVN: revert -R . + 删除未版本化文件)`,"focusSession.vcsSvnWorkspace":`SVN 工作区`,"focusSession.gitReverted":`已撤销全部改动`,"focusSession.gitViewDiff":`查看 diff`,"focusSession.gitWaitForRunToFinish":`请等待当前运行完成`,"focusSession.cacheHitRate":`缓存`,"focusSession.processedTokens":`消耗 Token`,"focusSession.sessionUsageDetail":`消耗 {processed} · 输入 {input} · 输出 {output} · 缓存读取 {cacheRead} · 缓存写入 {cacheWrite} · Reasoning {reasoning} · {requests} 次请求`,"focusSession.goalPaused":`Goal 已暂停`,"focusSession.goalReachedItsBudget":`Goal 已达到预算`,"focusSession.helpMeLocateAndFixThisBug":`帮我定位并修复这个 bug:`,"focusSession.makeAPlan":`制定计划`,"focusSession.makeAClearActionablePlanForThisGoal":`为以下目标制定清晰、可执行的计划:`,"focusSession.image":`图片`,"focusSession.localPath":`本机路径`,"focusSession.keepTheHistoryAndCloseOnlyThisView":`保留历史记录,仅关闭当前视图`,"focusSession.letSBeginWithASparkOfAnIdea":`给每个想法,开一条分支`,"focusSession.timeLateNight":`夜深了,做完这件就休息吧`,"focusSession.timeMorning":`早上好,今天想做点什么?`,"focusSession.timeLunch":`午饭时间,该休息一下了`,"focusSession.timeAfternoon":`下午好,继续推进点什么?`,"focusSession.timeEvening":`晚上好,今晚做点什么?`,"focusSession.feelLikeBuildingAPlugin":`想做点什么插件吗?`,"focusSession.letAgentWriteItsOwnTool":`让 Agent 给自己写个工具?`,"focusSession.wireUpAnMcpServer":`接个 MCP 服务试试?`,"focusSession.scheduleTheRepetitiveWork":`给重复的工作排个定时任务?`,"focusSession.turnRepeatedWorkIntoAWorkflow":`把重复劳动连成工作流?`,"focusSession.branchOutAndRunInParallel":`开几条分支并行试试?`,"focusSession.letMemoryRememberYou":`让星忆记住你的偏好?`,"focusSession.loadingConversationHistory":`正在载入会话记录…`,"focusSession.loadingOlderMessages":`正在加载更早消息…`,"focusSession.manualCompactionWaitForRun":`请等待当前运行完成后再压缩上下文`,"focusSession.loadOlderMessages":`加载更早消息`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheBottom":`将当前标签移动到下方新分组`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheLeft":`将当前标签移动到左侧新分组`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheRight":`将当前标签移动到右侧新分组`,"focusSession.moveTheCurrentTabIntoANewGroupOnTheTop":`将当前标签移动到上方新分组`,"focusSession.newChat":`新会话`,"focusSession.newContent":`有新内容`,"focusSession.onlyInspectAndAnalyzeContent":`只能查看和分析内容`,"focusSession.approvalRequired":`审批后写入`,"focusSession.approvalRequiredShowsADiffBeforeWriting":`修改工作区文件前展示 Diff 并等待批准;Shell 命令也需要逐条批准`,"focusSession.fullAccessRunsShellWithoutPerCommandApproval":`允许访问本机文件和网络;Shell 不再逐次请求授权`,"focusSession.openChatActionsMenu":`打开会话操作菜单`,"focusSession.readOnly":`只读`,"focusSession.workspaceWrite":`自动审批`,"focusSession.workspaceWriteRunsCommandsWithAutomaticApproval":`允许修改当前工作区并自动批准常规命令;外部访问仍受限制`,"focusSession.workspaceTrustLoadFailed":`无法读取工作区信任状态,项目资源仍保持受限`,"focusSession.retryWorkspaceTrust":`重试`,"focusSession.workspaceTrustRequired":`此工作区包含项目资源`,"focusSession.workspaceTrustRequiredDescription":`信任后才会加载项目 Skill、Prompt、设置和系统指令。`,"focusSession.workspaceResourcesRestricted":`项目资源已受限`,"focusSession.workspaceResourcesRestrictedDescription":`当前只加载用户级资源;可在确认来源后信任此工作区。`,"focusSession.keepWorkspaceRestricted":`保持受限`,"focusSession.trustWorkspace":`信任工作区`,"focusSession.trustWorkspaceTitle":`信任此工作区?`,"focusSession.trustWorkspaceDescription":`项目 Skill、Prompt、设置和系统指令会改变 Agent 行为,并可能引导其使用工具。仅在你信任此目录内容及其来源时继续。信任不是操作系统沙箱。`,"focusSession.organizeInformation":`整理信息`,"focusSession.organizeThisInformationIntoAClearStructure":`将以下信息整理成清晰的结构:`,"focusSession.refactor":`重构`,"focusSession.refactorThisCodeAndExplainTheImprovements":`重构这段代码并说明改进点:`,"focusSession.removeName":`移除 {name}`,"focusSession.renameChat":`重命名会话`,"focusSession.retryOlderMessages":`重试加载更早消息`,"focusSession.running":`运行中`,"focusSession.savingCompactionThreshold":`正在保存阈值…`,"focusSession.runningAutonomously":`正在自动执行`,"focusSession.sendMessage":`发送消息`,"focusSession.sentToTheRunningAgent":`已发送给运行中的 Agent`,"focusSession.setWorkingDirectory":`设置工作目录`,"focusSession.splitToBottom":`拆分到下方`,"focusSession.splitToLeft":`拆分到左侧`,"focusSession.splitToRight":`拆分到右侧`,"focusSession.splitToTop":`拆分到上方`,"focusSession.stop":`停止`,"focusSession.summarize":`总结内容`,"focusSession.summarizeContentAndExtractKeyPoints":`总结以下内容并提炼关键点:`,"focusSession.text":`文本`,"focusSession.theNextMessageWillResumeTheGoal":`下一条消息将继续 Goal`,"focusSession.theNextMessageWillStartAGoal":`下一条消息将启动 Goal`,"focusSession.thisGroupHasOnlyOneChat":`当前分组只有一个会话`,"focusSession.toolRequestsApproval":`{tool} 请求授权`,"focusSession.truncated":`已截断`,"focusSession.unknownSourceSession":`未知来源会话`,"focusSession.usedBudgetTokensUsed":`已用 {used}/{budget} tokens`,"focusSession.readyToWorkWithTheCurrentDirectoryAndHelpCompleteTheTask":`Pisper 已准备好处理当前工作目录中的内容,并协助你把任务推进到完成。完全访问模式下,Shell 以当前系统用户权限运行。`,"focusSession.viewCallArguments":`查看调用参数`,"focusSession.waitingForInput":`等待输入`,"focusSession.reviewThisContentAndSuggestImprovements":`检查以下内容,找出问题并提出改进建议:`,"focusSession.writeTests":`写单测`,"focusSession.workingDirectory":`工作目录`,"focusSession.writeUnitTestsForTheFollowingCode":`为以下代码编写单元测试:`,"focusSession.writeWhatYouWantToAccomplish":`写下你想完成的事`,"focusSession.writeWhatYouWantToAccomplishShiftEnterForANewLine":`写下你想完成的事,Shift + Enter 换行`},kt={"agentStatusAvatar.idle":`Pisper Agent`,"agentStatusAvatar.waiting":`Agent 等待输入`,"agentStatusAvatar.thinking":`Agent 思考中`,"app.dragTabsOrSplitChatsInAnyDirectionFromTheSessionList":`拖动标签,或向左、右、上、下拆分会话`,"app.sessions":`会话`,"app.wakingPisper":`正在唤醒 Pisper…`,"markdownMessage.copied":`已复制`,"markdownMessage.copy":`复制`,"markdownMessage.copyCode":`复制代码`,"ui.cancel":`取消`,"ui.closeDialog":`关闭对话框`,"ui.confirm":`确认`,"ui.demoInterfaceRuntimeNotConnected":`演示界面 · 尚未连接真实运行时`,"ui.name":`名称`,"useAppDialog.confirm":`确认`,"useAppDialog.confirmAction":`确认操作`,"useAppDialog.enterContent":`输入内容`,"useAppDialog.save":`保存`,"workspacePicker.enterAbsolutePath":`输入绝对路径,例如 E:\\code\\project`,"workspacePicker.go":`转到`,"workspacePicker.parentFolder":`上一级目录`,"workspacePicker.readingFolder":`正在读取目录…`,"workspacePicker.selectDirectoryDescription":`选择一个本地工作目录`,"workspacePicker.selectWorkspaceForChat":`为“{name}”选择工作目录`,"workspacePicker.selectWorkspaceForSchedule":`选择定时任务运行的工作目录`,"workspacePicker.setWorkingDirectory":`设置工作目录`,"workspacePicker.switching":`正在切换…`,"workspacePicker.thisFolderHasNoSubfolders":`此目录没有子目录`,"workspacePicker.useThisFolder":`使用此目录`,"workspacePicker.workingDirectoryPath":`工作目录路径`,"webPreview.back":`后退`,"webPreview.embedNotice":`部分网站会阻止嵌入式预览。如果页面无法加载,请使用“在浏览器中打开”。`,"webPreview.forward":`前进`,"webPreview.loading":`正在加载预览…`,"webPreview.openExternal":`在浏览器中打开`,"webPreview.reload":`重新加载`,"webPreview.title":`网页预览`,"webPreview.url":`预览地址`,"webPreview.urlPlaceholder":`输入网址…`,"app.importableProvidersTitle":`发现可导入的提供商`,"app.importableProvidersMessage":`从本地 Codex/Claude 配置中检测到 {count} 个可导入的提供商,是否前往设置页查看?`,"app.openSettings":`前往设置`},At={"notificationSettings.feishu":`飞书`,"notificationSettings.weChat":`微信`,"notificationSettings.browserNotification":`通知`,"notificationSettings.chatCompleted":`对话完成`,"notificationSettings.chatCompletedDescription":`Agent 完成回复后发送`,"notificationSettings.chatWaiting":`等待用户确认`,"notificationSettings.chatWaitingDescription":`Agent 暂停运行并等待用户确认时发送`,"notificationSettings.savedButLocalDeliveryUnavailable":`已保存(全局生效)。当前环境无法弹出通知:{reason}`,"notificationSettings.confirmationIsRequired":`需要确认后才能执行此操作。`,"notificationSettings.scheduleCompleted":`定时任务完成`,"notificationSettings.scheduleCompletedDescription":`定时任务正常完成后发送`,"notificationSettings.scheduleFailed":`定时任务失败`,"notificationSettings.scheduleFailedDescription":`定时任务执行失败后发送`,"notificationSettings.workflowCompleted":`工作流完成`,"notificationSettings.workflowCompletedDescription":`工作流所有节点执行完成后发送`,"notificationSettings.workflowFailed":`工作流失败`,"notificationSettings.workflowFailedDescription":`工作流中断或节点失败后发送`,"settingsShell.agent":`Agent`,"settingsShell.agentCapabilities":`Agent 能力`,"settingsShell.contextAndData":`上下文与数据`,"settingsShell.connections":`连接`,"settingsShell.application":`应用`,"settingsShell.settingsNavigation":`设置导航`,"aboutSettings.copyright":`Pisper Contributors · MIT License`,"aboutSettings.description":`桌面、终端与移动端的多 Agent 应用。`,"aboutSettings.license":`开源许可证`,"aboutSettings.projectInformation":`项目信息`,"aboutSettings.sourceCode":`源代码`,"aboutSettings.starOnGitHub":`在 GitHub 上支持 Pisper`,"aboutSettings.supportDescription":`如果 Pisper 对你有帮助,欢迎在 GitHub 上留下 Star,帮助更多人发现这个项目。`,"aboutSettings.supportPisper":`支持 Pisper`,"aboutSettings.website":`项目主页`,"configPage.addCountModels":`添加 {count} 个模型`,"configPage.added":`已添加`,"configPage.adding":`添加中…`,"configPage.addManually":`手工添加`,"configPage.addModel":`添加模型`,"configPage.addProvider":`添加 Provider`,"configPage.addProviderConnection":`添加 Provider 连接`,"configPage.afterSavingExistingRuntimesAreReleasedAndNewChatsUseTheLatestPolicy":`现有会话继续运行;新会话或重新加载后的会话使用最新策略。`,"configPage.agentRuntimePolicy":`Agent 运行策略`,"configPage.agentSettingsSavedNewChatsWillUseThisModel":`Agent 配置已保存,新会话将使用该模型`,"configPage.allChangesSaved":`配置已保存`,"configPage.apiKeyRequired":`需要 API Key`,"configPage.apiKeyCouldNotBeUpdatedPleaseRetry":`API Key 未能更新,请重试。`,"configPage.apiProtocol":`API 协议`,"configPage.about":`关于`,"configPage.appUpdates":`应用更新`,"configPage.authenticationAndEndpointsAreStoredIndependentlyForEachConnection":`每个连接独立保存认证与地址`,"configPage.authenticationIncludedInConfiguration":`配置中包含认证`,"configPage.authenticationReady":`认证可用`,"configPage.authenticationRequired":`需重新认证`,"configPage.autoDetect":`自动识别`,"configPage.automaticContext":`自动上下文`,"configPage.availableTools":`可用工具`,"configPage.cancel":`取消`,"configPage.cannotLoad":`不可加载`,"configPage.chat":`对话`,"configPage.chatGPTOAuthConnected":`ChatGPT OAuth 已接入`,"configPage.chatProvider":`对话 Provider`,"configPage.closeDialog":`关闭对话框`,"configPage.codexCLILoginRequired":`需要 Codex CLI 登录`,"configPage.completeProviderAuthenticationBeforeSaving":`请先填写 API Key 或加载 Provider 认证,再保存。`,"configPage.configurationFileIsTooLarge":`配置文件过大`,"configPage.configured":`已配置`,"configPage.configuredLeaveBlankToKeepTheExistingKey":`已配置;留空将保持现有密钥`,"configPage.conflictDetected":`存在冲突`,"configPage.countModels":`{count} 个模型`,"configPage.countModelsAdded":`{count} 个模型已添加`,"configPage.createConnection":`创建连接`,"configPage.creating":`创建中…`,"configPage.customBaseURL":`独立 Base URL`,"configPage.customManageEachToolOnThePluginsPage":`自定义:在插件页逐项管理`,"configPage.defaultChatModel":`此连接使用的对话模型`,"configPage.defaultEndpointForModelsInThisConnection":`此连接下模型默认使用的地址`,"configPage.delete":`删除`,"configPage.deleteNameItsModelSettingsAndAuthenticationDetailsWillAlsoBeRemoved":`确定删除「{name}」吗?对应的模型配置和认证信息也会删除。`,"configPage.deleteProvider":`删除 Provider`,"configPage.deleteProviderConnection":`删除 Provider 连接`,"configPage.disabled":`停用`,"configPage.disabled2":`已停用`,"configPage.desktopPet":`桌面宠物`,"configPage.displayName":`显示名称`,"configPage.enableAfterCreation":`创建后启用`,"configPage.enabled":`启用`,"configPage.enableReasoningEffortThinkingLevel":`启用 reasoning effort / thinking level`,"configPage.enableToSave":`启用后可保存`,"configPage.enterTheAPIKeyForThisConnection":`输入此连接使用的 API Key`,"configPage.enterTheProviderAPIKey":`输入 Provider API Key`,"configPage.enterProviderBaseURLBeforeSaving":`请先填写 Provider Base URL,再保存。`,"configPage.fetchAgain":`重新获取`,"configPage.fetchFromAPI":`从 API 获取`,"configPage.fetching":`获取中…`,"configPage.fetchModelIDsFromProviderOrAddOneManually":`从 {provider} 获取模型 ID,或继续手工添加。`,"configPage.fetchModels":`获取模型`,"configPage.fetchOrAddAChatModel":`请获取或添加一个对话模型。`,"configPage.forExampleOpenAIOfficial":`例如 OpenAI 官方`,"configPage.fullToolAccess":`完整:增加 Shell`,"configPage.image":`图像`,"configPage.imageGenerationAndEditing":`图像生成与编辑`,"configPage.initialModelID":`初始模型 ID`,"configPage.incompleteLoginState":`登录状态不完整,请在对应官方客户端重新登录`,"configPage.interface":`界面设置`,"configPage.invalidConfigurationFileFormat":`配置文件格式无效`,"configPage.keyVariableName":`密钥变量:{name}`,"configPage.leaveBlankToUseTheModelID":`留空使用模型 ID`,"configPage.loadAuthenticationToSave":`加载认证后可保存`,"configPage.loadConfiguration":`加载配置`,"configPage.loadLoginState":`加载登录状态`,"configPage.loadOfficialProviderLoginStateFromSource":`从 {source} 加载登录状态?该状态只会绑定官方 Provider,不会用于自定义 Base URL。`,"configPage.loaded":`已加载`,"configPage.loading":`加载中…`,"configPage.loadingModelCatalog":`正在加载模型目录`,"configPage.loadProviderConfiguration":`加载 Provider 配置`,"configPage.loadThisProviderConfigurationFromSource":`从 {source} 加载此 Provider 配置?`,"configPage.localProviderConfiguration":`本机 Provider 配置`,"configPage.modelBaseURL":`模型 Base URL`,"configPage.modelID":`模型 ID`,"configPage.modelName":`模型名称`,"configPage.models":`模型配置`,"configPage.modelType":`模型用途`,"configPage.multipleAuthenticationFieldsWereDetectedTheAuthorizationFieldTakesPrecedence":`检测到多个认证字段,将优先使用授权字段`,"configPage.nameConfigurationHasBeenLoadedIntoPisper":`{name} 配置已加载到 Pisper`,"configPage.nameLoginStateHasBeenLoadedIntoPisper":`{name} 登录状态已加载到 Pisper`,"configPage.nameState":`{name} 已{state}`,"configPage.noAuthenticationInConfiguration":`配置中未包含认证`,"configPage.noBaseURLSpecified":`未指定 Base URL`,"configPage.noChatModelAvailable":`没有可用的对话模型`,"configPage.noImportableCodexOrClaudeProviderConfigurationWasDetected":`未检测到可导入的 Codex 或 Claude Provider 配置。`,"configPage.noImportableProviderConfigurationWasFound":`未找到可导入的 Provider 配置`,"configPage.noMatchingModels":`没有匹配的模型`,"configPage.noModelSpecified":`未指定模型`,"configPage.notAuthenticated":`未认证`,"configPage.notifications":`通知设置`,"configPage.remoteAccess":`远程访问`,"configPage.mobileServer":`服务器`,"mobileServer.addServer":`添加服务器`,"mobileServer.awaitingApproval":`已向“{name}”发送连接申请,请在桌面端批准。`,"mobileServer.cameraDenied":`相机权限未授予,请使用手动配对。`,"mobileServer.cancelRequest":`取消申请`,"mobileServer.cancelScan":`取消扫描`,"mobileServer.code":`配对码`,"mobileServer.connect":`连接`,"mobileServer.current":`当前连接`,"mobileServer.currentLocal":`当前运行`,"mobileServer.description":`选择要连接的桌面端。会话与数据都保存在桌面端,手机作为客户端接入。`,"mobileServer.discoverDescription":`选择同一局域网内发现的桌面端并等待对方批准,或使用二维码远程配对。`,"mobileServer.discovering":`正在搜索同一局域网内的 Pisper Desktop…`,"mobileServer.discoveryFailed":`局域网发现不可用,请重试或使用二维码配对。`,"mobileServer.localNetworkDenied":`需要允许本地网络访问才能发现桌面端,请在系统设置中授权后重试。`,"mobileServer.empty":`还没有已配对的服务器。点击「添加服务器」开始连接。`,"mobileServer.forget":`删除`,"mobileServer.forgetConfirm":`删除后需要重新配对才能连接该服务器,确定删除?`,"mobileServer.loadFailed":`读取服务器列表失败,请重启应用后重试。`,"mobileServer.localTitle":`本机运行`,"mobileServer.localDescription":`不连接桌面端,直接运行与桌面端同源的 Pisper Runtime;可用能力由当前设备环境决定。`,"mobileServer.enterLocal":`在本机运行`,"mobileServer.manual":`手动配对`,"mobileServer.nearby":`附近的桌面端`,"mobileServer.noNearby":`未发现可连接的桌面端,请确认电脑已开启远程访问。`,"mobileServer.otherMethods":`其他连接方式`,"mobileServer.pair":`配对`,"mobileServer.pairFailed":`配对成功,但服务器代理地址不可用。`,"mobileServer.scan":`扫描二维码`,"mobileServer.scanFailed":`未读取到有效的配对二维码。`,"mobileServer.scanHint":`将桌面端二维码置于框内,系统会自动识别,无需拍照。`,"mobileServer.scanTitle":`扫描配对二维码`,"mobileServer.rediscover":`重新搜索局域网设备`,"mobileServer.requestConnect":`申请连接`,"mobileServer.url":`桌面端地址`,"mobileServer.activeTransport":`当前路径:{transport}`,"mobileServer.transportLan":`局域网`,"mobileServer.transportLanP2p":`局域网 + P2P`,"mobileServer.transportP2p":`P2P`,"mobileServer.localTransport":`本机`,"mobileServer.title":`服务器`,"remoteAccess.approvalFailed":`处理连接申请失败:{message}`,"remoteAccess.approve":`批准`,"remoteAccess.codeExpiresAt":`配对码 {time}过期`,"remoteAccess.currentDevice":`(当前设备)`,"remoteAccess.description":`让手机或平板连接到这台电脑上的 Pisper。优先使用局域网,离开局域网后自动回退到 Iroh P2P;上层仍由 TLS 指纹和设备令牌保护。`,"remoteAccess.devices":`已配对设备`,"remoteAccess.fingerprint":`证书指纹`,"remoteAccess.generateQr":`生成配对二维码`,"remoteAccess.generatingQr":`正在生成…`,"remoteAccess.lastSeen":`最近活跃:{time}`,"remoteAccess.irohDirectOnly":`P2P 直连地址已就绪,relay 仍在连接`,"remoteAccess.irohFailed":`P2P 启动失败:{message}`,"remoteAccess.irohReady":`P2P relay 已就绪`,"remoteAccess.irohStarting":`P2P 正在启动`,"remoteAccess.listenFailed":`远程监听启动失败:{message}`,"remoteAccess.loadFailed":`远程访问状态加载失败,请确认运行时支持远程访问。`,"remoteAccess.noDevices":`还没有已配对的设备。生成配对二维码,在手机上打开 Pisper App 扫码即可配对。`,"remoteAccess.pairing":`设备配对`,"remoteAccess.pairingDescription":`点击按钮后会打开配对二维码。配对码 5 分钟内有效且仅可使用一次。`,"remoteAccess.pairingFailed":`生成配对码失败:{message}`,"remoteAccess.pairingQrTitle":`使用 Pisper App 扫码配对`,"remoteAccess.pendingApprovals":`待审批连接`,"remoteAccess.pendingApprovalsDescription":`仅批准你正在连接的设备。批准前,对方无法访问会话或 Runtime API。`,"remoteAccess.qrAlt":`配对二维码`,"remoteAccess.qrUnavailable":`二维码生成失败,请重新生成或重启桌面端 Runtime。`,"remoteAccess.scanQrDescription":`在手机端打开“添加服务器”,扫描下方二维码。连接时优先使用局域网,失败后自动回退到 Iroh P2P。`,"remoteAccess.regenerate":`重新生成`,"remoteAccess.refresh":`刷新`,"remoteAccess.reject":`拒绝`,"remoteAccess.requestedAt":`申请于 {time}`,"remoteAccess.requestSource":`来源地址:{ip}`,"remoteAccess.revoke":`吊销`,"remoteAccess.revokeConfirm":`吊销后设备「{name}」将立即断开连接,确定吊销?`,"remoteAccess.revokeFailed":`吊销失败:{message}`,"remoteAccess.title":`远程访问`,"remoteAccess.toggleFailed":`切换远程访问失败:{message}`,"configPage.loginStateFileDetected":`已验证 OAuth 登录状态`,"configPage.officialEndpointOnly":`仅限官方端点`,"configPage.officialProviderAuthenticationOnly":`官方 Provider 认证`,"configPage.openAICodexUsesChatGPTPlusProOAuthAndDoesNotAcceptARegularAPIKey":`OpenAI Codex 使用 ChatGPT Plus/Pro OAuth,不支持普通 API Key。`,"configPage.optionalLeaveBlankToInheritTheProviderBaseURL":`可选;留空继承 Provider Base URL`,"configPage.optionalOverrideTheProviderBaseURLForThisModel":`可选;为当前模型覆盖 Provider Base URL`,"configPage.optionalUsedOnlyForOpenAIOrganization":`可选,仅 OpenAI Organization 使用`,"configPage.permissionsAreEnforcedByTheRuntime":`权限由 Runtime 执行`,"configPage.providerConnectionCreated":`Provider 连接已创建`,"configPage.providerConnectionDeleted":`Provider 连接已删除`,"configPage.providerConnections":`Provider 连接`,"configPage.modelService":`模型服务`,"configPage.currentModelService":`当前模型服务`,"configPage.providerPurpose":`Provider 用途`,"configPage.providerSettingsSaved":`Provider 配置已保存`,"configPage.providerWasNotReadyAfterSaving":`Provider 保存后仍未完成认证或启用,请检查配置后重试。`,"configPage.readingProvidersAndAuthenticationStatus":`读取 Provider 与认证状态…`,"configPage.readOnlyInspectionTools":`只读:查看和搜索`,"configPage.readProviderEndpointModelAndAuthenticationFieldsFromCodexConfigTomlAndClaudeSettingsJson":`读取本机 Provider 配置,并由你明确导入官方 Codex 或 Claude 登录状态。`,"configPage.reasoningModel":`推理模型`,"configPage.reasoningSupported":`支持推理`,"configPage.remoteModelCatalog":`远端模型列表`,"configPage.rescan":`重新扫描`,"configPage.runtimeStatus":`运行时状态`,"configPage.currentDefaultProvider":`当前默认 Provider`,"configPage.saveProviderSettings":`保存 Provider 配置`,"configPage.setAsDefaultProvider":`设为默认 Provider`,"configPage.saveVisualModelSettings":`保存视觉模型配置`,"configPage.saving":`保存中…`,"configPage.scanningProviderConfigurationFiles":`正在扫描 Provider 配置文件…`,"configPage.searchModelIDOrName":`搜索模型 ID 或名称`,"configPage.selectAChatModelBeforeSaving":`请先选择一个对话模型,再保存。`,"configPage.signInWithCodexCLIThenLoadItFromTheLocalProvidersSectionAbove":`请先登录 Codex CLI,再从上方的本机 Provider 区域加载。`,"configPage.someConfigurationFieldsCannotBeImported":`部分配置字段无法导入`,"configPage.standardModel":`标准模型`,"configPage.status":`状态`,"configPage.theAPIProtocolInThisConfigurationIsNotSupportedYet":`配置中的 API 协议暂不支持`,"configPage.theKeyEnvironmentVariableNameIsInvalid":`密钥环境变量名称无效`,"configPage.theProviderEndpointIsInvalid":`Provider 地址无效`,"configPage.thinkingLevel":`思考强度`,"configPage.unableToReadTheConfigurationFile":`无法读取配置文件`,"configPage.unsavedChanges":`有未保存的配置`,"configPage.usedForAgentChatAndMayAlsoIncludeVisualModels":`用于 Agent 对话,也可以包含视觉模型。`,"configPage.usedOnlyForImageGenerationVideoGenerationAndImageEditingAndExcludedFromAgentChatModelSelection":`仅用于生图、生视频和图片编辑,不参与 Agent 对话模型选择。`,"configPage.usedOnlyForImageGenerationVideoGenerationAndImageEditingChatModelsAreIgnored":`仅用于生图、生视频和图片编辑,聊天模型会被忽略。`,"configPage.video":`视频`,"configPage.videoGeneration":`视频生成`,"configPage.visualModels":`视觉模型`,"configPage.visualModelsAreSelectedByTheVisualGenerationToolAndDoNotAppearInTheChatModelList":`视觉模型由视觉生成工具自动选择,不会进入对话模型列表`,"configPage.visualModelSettingsSaved":`视觉模型配置已保存`,"configPage.visualOnlyProvider":`纯视觉模型 Provider`,"configPage.visualProvider":`视觉 Provider`,"configPage.fileEditingTools":`文件编辑:增加 edit / write`,"configPage.youCanCreateMultipleConnectionsUsingTheSameProtocolEachWithItsOwnKeyAndBaseURL":`同一种协议可创建多个连接,每个连接独立使用 Key 和 Base URL。`,"interfaceSettings.accentBlue":`Pisper 蓝`,"interfaceSettings.accentColor":`强调色`,"interfaceSettings.accentCoral":`珊瑚红`,"interfaceSettings.accentCustom":`自定义`,"interfaceSettings.customAccentColor":`自定义强调色`,"interfaceSettings.customAccentHex":`输入 HEX 颜色`,"interfaceSettings.customAccentHint":`挑一个颜色,即刻全界面生效`,"interfaceSettings.invalidAccentColor":`请输入 6 位 HEX 颜色(如 #1677e8)`,"interfaceSettings.accentNeutral":`中性黑`,"interfaceSettings.accentTeal":`青绿色`,"interfaceSettings.accentViolet":`紫罗兰`,"interfaceSettings.appearance":`外观`,"interfaceSettings.appearanceDescription":`选择界面的明暗模式、强调色和视觉风格。`,"interfaceSettings.automaticByTime":`按时间自动`,"interfaceSettings.automaticByTimeDescription":`18:00 至次日 8:00 使用深色`,"interfaceSettings.colorMode":`颜色模式`,"interfaceSettings.comfortable":`舒适`,"interfaceSettings.comfortableDescription":`保留宽松的间距与尺寸`,"interfaceSettings.compact":`紧凑`,"interfaceSettings.compactDescription":`在同屏显示更多内容`,"interfaceSettings.cornerStyle":`圆角风格`,"interfaceSettings.dark":`深色`,"interfaceSettings.darkDescription":`始终使用低亮度深色界面`,"interfaceSettings.defaultsRestored":`界面设置已恢复默认值`,"interfaceSettings.displayAndMotion":`显示与动效`,"interfaceSettings.displayAndMotionDescription":`调整内容密度以及界面过渡的动态程度。`,"interfaceSettings.followSystem":`跟随系统`,"interfaceSettings.followSystemDescription":`随操作系统明暗模式切换`,"interfaceSettings.fontSize":`字体大小`,"interfaceSettings.interfaceDensity":`界面密度`,"interfaceSettings.interfaceStyle":`界面风格`,"interfaceSettings.large":`大`,"interfaceSettings.light":`浅色`,"interfaceSettings.lightDescription":`始终使用明亮的浅色界面`,"interfaceSettings.livePreview":`实时预览`,"interfaceSettings.motion":`界面动效`,"interfaceSettings.motionFull":`完整`,"interfaceSettings.motionFullDescription":`保留全部过渡与反馈`,"interfaceSettings.motionReduced":`减少`,"interfaceSettings.motionReducedDescription":`减少非必要的移动效果`,"interfaceSettings.motionSystem":`跟随系统`,"interfaceSettings.motionSystemDescription":`采用系统的动态效果偏好`,"interfaceSettings.preferencesUpdated":`界面偏好已更新`,"interfaceSettings.previewAgentMessage":`Agent 已完成当前任务。`,"interfaceSettings.previewUserMessage":`继续检查变更。`,"interfaceSettings.restoreDefaults":`恢复默认`,"interfaceSettings.sharp":`利落`,"interfaceSettings.small":`小`,"interfaceSettings.soft":`柔和`,"interfaceSettings.standard":`标准`,"languageSettings.adjustSpacingAndSizingCompactModeFitsMoreContentOnScreen":`调整界面元素间距与尺寸。紧凑模式可在同屏显示更多内容。`,"languageSettings.chineseInterface":`中文界面`,"languageSettings.chooseTheLanguageUsedByPisperChangesApplyImmediatelyAndAreSavedForYourNextVisit":`选择 Pisper 的界面语言。切换后立即生效,并会在下次访问时保留。`,"languageSettings.comfortable":`舒适`,"languageSettings.compact":`紧凑`,"languageSettings.currentDensity":`当前密度`,"languageSettings.currentLanguage":`当前语言`,"languageSettings.defaultSpacingAndSizing":`默认间距与尺寸`,"languageSettings.displayLanguage":`界面语言`,"languageSettings.displayLanguageChangedToEnglish":`界面语言已切换为英文`,"languageSettings.displayLanguageChangedToSimplifiedChinese":`界面语言已切换为简体中文`,"languageSettings.englishInterface":`英文界面`,"languageSettings.english":`English`,"languageSettings.fitMoreContentOnScreen":`同屏显示更多内容`,"languageSettings.interfaceDensity":`界面密度`,"languageSettings.interfaceDensitySwitchedToDensity":`界面密度已切换为{density}`,"languageSettings.languagePreferenceIsStoredInThisBrowser":`语言偏好保存在当前浏览器`,"languageSettings.simplifiedChinese":`简体中文`,"languageSettings.thisSettingChangesInterfaceTextOnlyItDoesNotControlTheLanguageOfAgentResponses":`该设置仅影响界面文案,不会改变 Agent 的回复语言。`,"languageSettings.thisSettingOnlyAffectsTheInterfaceInThisBrowser":`该设置仅影响当前浏览器的界面显示。`,"cliSettings.checking":`正在检查`,"cliSettings.commandNotInstalled":`终端命令 {command} 尚未安装`,"cliSettings.commandReady":`终端命令 {command} 已可用`,"cliSettings.description":`安装 Pisper 终端客户端并配置当前用户的 PATH,无需管理员权限。`,"cliSettings.install":`安装终端命令`,"cliSettings.installed":`已安装`,"cliSettings.installedNotification":`Pisper 终端命令已安装;重启终端宿主后生效`,"cliSettings.needsRepair":`需要修复`,"cliSettings.notInstalled":`未安装`,"cliSettings.pathConfigured":`已写入当前用户 PATH。`,"cliSettings.pathNeedsRepair":`PATH 配置不完整,请修复安装。`,"cliSettings.repair":`修复终端命令`,"cliSettings.restartTerminal":`安装或卸载后需重启终端宿主以读取最新 PATH。Windows Terminal 请完全退出后重开;IDE 内置终端需重启 IDE。`,"cliSettings.title":`Pisper 终端命令`,"cliSettings.unavailable":`当前构建不可用`,"cliSettings.uninstall":`卸载终端命令`,"cliSettings.uninstalledNotification":`Pisper 终端命令已卸载`,"notificationSettings.appNotificationTest":`{app} 通知测试`,"notificationSettings.availableVariables":`可用变量`,"notificationSettings.browserFailedToStart":`浏览器启动失败`,"notificationSettings.browserNotificationsAreBlocked":`浏览器通知已关闭`,"notificationSettings.checking":`正在检查`,"notificationSettings.connected":`已连接`,"notificationSettings.controlledByBrowserSitePermissions":`由浏览器站点权限控制`,"notificationSettings.controlledByOperatingSystemNotificationSettings":`由操作系统通知设置控制`,"notificationSettings.dailyCodeReview":`每日代码巡检`,"notificationSettings.disabled":`停用`,"notificationSettings.enabled":`启用`,"notificationSettings.enabled2":`已启用`,"notificationSettings.endToEndTests":`端到端测试`,"notificationSettings.fixChannelNotification":`修复渠道通知`,"notificationSettings.found2IssuesToAddressTheReportHasBeenArchived":`发现 2 个待处理问题,报告已归档。`,"notificationSettings.implementationIsCompleteTestsAndBuildHavePassed":`实现已完成,测试和构建均已通过。`,"notificationSettings.loadingNotificationSettings":`正在加载通知设置`,"notificationSettings.message2Min18Sec":`2 分 18 秒`,"notificationSettings.message6Min42Sec":`6 分 42 秒`,"notificationSettings.messageContent":`消息内容`,"notificationSettings.notConnected":`未连接`,"notificationSettings.notEnabled":`未启用`,"notificationSettings.notification":`通知`,"notificationSettings.notificationPermissionWasNotGrantedAllowNotificationsInTheBrowserSiteSettings":`通知权限未授权,请在浏览器站点设置中允许通知`,"notificationSettings.notificationsAreWorking":`通知工作正常。`,"notificationSettings.notificationsDisabled":`通知已关闭`,"notificationSettings.notificationsEnabled":`通知已启用`,"notificationSettings.notificationTemplates":`通知模板`,"notificationSettings.notificationTemplateSaved":`通知模板已保存`,"notificationSettings.notSupported":`当前环境不支持`,"notificationSettings.openNotificationPermissionsInYourOperatingSystemSettings":`请在操作系统设置中打开通知权限。`,"notificationSettings.openSystemNotificationSettings":`打开系统通知设置`,"notificationSettings.permissionGranted":`权限已允许`,"notificationSettings.preReleaseChecks":`发布前检查`,"notificationSettings.preview":`预览`,"notificationSettings.saveTemplate":`保存模板`,"notificationSettings.sendTest":`测试发送`,"notificationSettings.sendTestNotification":`发送测试通知`,"notificationSettings.sharedByChatsScheduledTasksAndWorkflows":`对话、定时任务和工作流共用`,"notificationSettings.systemNotificationsAreNotSupportedInThisEnvironment":`当前环境不支持系统通知`,"notificationSettings.systemNotificationsAreOff":`系统通知已关闭`,"notificationSettings.systemNotificationsAreOffAllowPisperToSendNotificationsInYourOperatingSystemSettings":`系统通知已关闭,请在操作系统设置中允许 Pisper 发送通知。`,"notificationSettings.testNotificationSentToCountChats":`测试通知已发送到 {count} 个会话`,"notificationSettings.testProcessTimedOut":`测试进程超时`,"notificationSettings.testsBuildAndSecurityChecksHaveAllPassed":`测试、构建和安全检查均已通过。`,"notificationSettings.theBrowserBackgroundNotificationServiceCouldNotBeRegistered":`浏览器后台通知服务注册失败`,"notificationSettings.theDesktopAppUsesOperatingSystemNotificationsTurningThisOffDoesNotChangeTheOperatingSystemPermis":`桌面端使用操作系统通知;关闭开关不会修改系统自身的通知权限。`,"notificationSettings.theOperatingSystemDidNotAcceptTheNotificationCheckYourSystemNotificationSettings":`系统没有接受通知请求,请检查操作系统通知设置。`,"notificationSettings.theTestNotificationWasSentCheckYourSystemNotificationCenter":`测试通知已发送,请检查系统通知中心。`,"notificationSettings.theWebAppUsesBrowserSiteNotificationsTurningThisOffDoesNotChangeTheBrowserPermissionItself":`Web 端使用浏览器站点通知;关闭开关不会修改浏览器自身的站点权限。`,"notificationSettings.tomorrow0900":`明天 09:00`,"notificationSettings.pisperUsesTheCurrentPlatformNotificationSystemWhenAnAgentCompletesOrFails":`Agent 完成或失败时,Pisper 会通过当前平台的系统通知提醒你。`,"notificationSettings.waitingForPermission":`等待授权`,"updateSettings.browserMode":`浏览器模式`,"updateSettings.checkFailed":`检查失败`,"updateSettings.checkForUpdates":`检查更新`,"updateSettings.checking":`正在检查`,"updateSettings.checking2":`正在检查…`,"updateSettings.commitsThatHaveNotBeenSyncedWillAppearHereAfterTheCheck":`检查后将在这里显示尚未同步的提交。`,"updateSettings.commitsToSync":`待同步提交`,"updateSettings.currentReleaseNotes":`当前版本更新日志`,"updateSettings.currentSource":`当前源码`,"updateSettings.currentSourceStatus":`当前源码状态`,"updateSettings.currentVersion":`当前版本`,"updateSettings.downloadedDataWasPreservedAndCanResumeFromTheInterruptionPoint":`下载进度已保留,可从断点继续。`,"updateSettings.downloading":`正在下载`,"updateSettings.downloadPaused":`下载已暂停`,"desktopPetSettings.browsePetdex":`浏览 Petdex 宠物库`,"desktopPetSettings.bubbleDone":`完成啦!`,"desktopPetSettings.bubbleFailed":`遇到问题了`,"desktopPetSettings.bubbleHello":`你好!`,"desktopPetSettings.bubbleResponding":`正在回复…`,"desktopPetSettings.bubbleThinking":`正在思考…`,"desktopPetSettings.bubbleWorking":`正在工作…`,"desktopPetSettings.currentPet":`当前宠物:{name}`,"desktopPetSettings.delete":`删除宠物`,"desktopPetSettings.deleteConfirm":`确定删除「{name}」吗?本地宠物资源将被移除。`,"desktopPetSettings.deleteTitle":`删除桌面宠物`,"desktopPetSettings.description":`这是 Pisper 内建的桌面宠物功能。桌面端显示独立宠物窗口,Web 端在 Pisper 页面内悬浮,并直接响应当前 Agent 的活动。`,"desktopPetSettings.desktopOnly":`桌面端专属功能`,"desktopPetSettings.desktopOnlyDescription":`桌面宠物仅在 Pisper 桌面应用中可用。`,"desktopPetSettings.install":`安装`,"desktopPetSettings.installed":`已安装`,"desktopPetSettings.installBeforeEnabling":`先从 Petdex 安装一只宠物,再启用桌面显示。`,"desktopPetSettings.installDescription":`搜索 Petdex 宠物,由 Pisper 安装并管理资源,无需 Petdex CLI 或独立桌面程序。`,"desktopPetSettings.installedDescription":`选择 Pisper 桌面上显示的宠物。兼容已有 Petdex/Codex 宠物目录。`,"desktopPetSettings.installedTitle":`已安装的宠物`,"desktopPetSettings.installTitle":`从 Petdex 添加宠物`,"desktopPetSettings.loading":`正在读取桌面宠物状态…`,"desktopPetSettings.opacity":`宠物透明度`,"desktopPetSettings.petDisabled":`桌面宠物已关闭`,"desktopPetSettings.petEnabled":`桌面宠物已启用`,"desktopPetSettings.petInstalled":`已安装并选择 {name}`,"desktopPetSettings.petRemoved":`已删除 {name}`,"desktopPetSettings.petSelected":`已切换到 {name}`,"desktopPetSettings.petSlug":`Petdex 宠物标识`,"desktopPetSettings.running":`显示中`,"desktopPetSettings.search":`搜索`,"desktopPetSettings.searchPlaceholder":`搜索宠物名称或标识,例如 boba`,"desktopPetSettings.showOnDesktop":`在桌面上显示`,"desktopPetSettings.stopped":`已隐藏`,"desktopPetSettings.title":`Pisper 桌面宠物`,"desktopPetSettings.webPetLabel":`Pisper 桌面宠物:{name}`,"updateSettings.appComponents":`应用组件`,"updateSettings.desktopFrontend":`Desktop 前端`,"updateSettings.downloadAndInstallUpdates":`下载并安装更新`,"updateSettings.downloadProgress":`下载进度`,"updateSettings.downloadUpdate":`下载更新`,"updateSettings.installed":`已安装`,"updateSettings.installingUpdates":`正在安装更新…`,"updateSettings.newVersionReleaseNotes":`新版本更新日志`,"updateSettings.noReleaseNotesAreAvailableForThisVersion":`该版本暂未提供更新日志。`,"updateSettings.notChecked":`尚未检查`,"updateSettings.platform":`运行平台`,"updateSettings.readyToRestart":`等待重启安装`,"updateSettings.restartAndInstall":`重启并安装`,"updateSettings.resumeDownload":`继续下载`,"updateSettings.runtime":`Runtime`,"updateSettings.sourceUpdatesAvailable":`发现代码更新`,"updateSettings.theCurrentWebSourceIsSyncedWithBranch":`当前 Web 源码已同步 {branch}。`,"updateSettings.updateAvailable":`发现新版本`,"updateSettings.tuiClient":`TUI 客户端`,"updateSettings.updateChannel":`更新通道`,"updateSettings.upToDate":`已是最新`,"updateSettings.pisperAppUpdates":`Pisper 应用更新`,"updateSettings.sponsors":`项目赞助商`,"updateSettings.sponsorsDescription":`以下合作伙伴为 Pisper 社区提供支持。赞助内容不会使用会话或工作区数据进行定向。`,"updateSettings.sponsored":`赞助`,"updateSettings.visitSponsor":`访问`,"updateSettings.hideSponsor":`隐藏此赞助商 30 天`,"updateSettings.viewRelease":`查看新版本`,"updateSettings.viewSourceUpdates":`查看代码更新`,"updateSettings.viewUpdateDiagnosticLog":`查看更新诊断日志`,"configPage.connection":`连接`,"configPage.policy":`策略`,"configPage.authentication":`认证`,"configPage.endpoint":`端点`},jt={"memoryPage.conceptType":`概念`,"memoryPage.fileType":`文件`,"memoryPage.riskType":`风险`,"memoryPage.preferenceType":`偏好`,"memoryPage.decisionType":`决策`,"memoryPage.factType":`事实`,"memoryPage.taskType":`任务`,"memoryPage.addMemory":`点亮星辰`,"memoryPage.autoApproveSaved":`自动确认阈值已保存`,"memoryPage.autoApproveThreshold":`自动确认阈值`,"memoryPage.autoApproveThresholdHint":`置信度达到该值的候选记忆将自动确认,低于该值才需要审核。`,"memoryPage.createdByAgent":`Agent 点亮`,"memoryPage.agentProposed":`Agent 提议`,"memoryPage.conversationExtracted":`对话抽取`,"memoryPage.confidencePercent":`置信度 {value}%`,"memoryPage.topic":`事实主题`,"memoryPage.expires":`过期时间`,"memoryPage.authority":`可信度`,"memoryPage.cancel":`取消`,"memoryPage.closeDialog":`关闭对话框`,"memoryPage.common":`常用`,"memoryPage.confirm":`确认`,"memoryPage.count":`{count} 颗`,"memoryPage.countMemories":`{count} 星辰`,"memoryPage.created":`创建时间`,"memoryPage.delete":`删除`,"memoryPage.deleteMemory":`删除星辰`,"memoryPage.deleteMemoryName":`确定删除星辰“{name}”吗?`,"memoryPage.deleteMemorySpace":`删除星域`,"memoryPage.deleteMemorySpaceNameAndAllMemoriesInIt":`确定删除星域“{name}”及其全部星辰吗?`,"memoryPage.edit":`编辑`,"memoryPage.evidence":`证据`,"memoryPage.explicitUserRequest":`用户明确要求`,"memoryPage.forExampleProductDesignGuidelines":`例如:产品设计规范`,"memoryPage.forExampleProjectUIConstraints":`例如:项目 UI 约束`,"memoryPage.giveEachThemeOrProjectItsOwnMemorySpaceSoDurableMemoriesHaveSomewhereToBelong":`为不同主题或项目留出一片星域,让长期星忆各有归处。`,"memoryPage.globalMemorySpace":`全局星域`,"memoryPage.ignore":`忽略`,"memoryPage.ignoreAll":`全部忽略`,"memoryPage.ignoredCountMemoryDrafts":`已忽略 {count} 份星忆草稿`,"memoryPage.importance":`重要度`,"memoryPage.important":`重要`,"memoryPage.lightUpIdeasWorthKeepingAsMemoriesYouCanReturnToLater":`把值得长久保存的想法,点亮为日后仍可寻回的星忆。`,"memoryPage.localMemory":`本地星忆`,"memoryPage.memoryCandidateConfirmed":`候选记忆已确认`,"memoryPage.memoryCandidateIgnored":`候选记忆已忽略`,"memoryPage.memoryContent":`星忆内容`,"memoryPage.memoryDeleted":`星辰已删除`,"memoryPage.memoryDrafts":`星忆草稿`,"memoryPage.memoryMapTypes":`星图类型`,"memoryPage.memorySpace":`所属星域`,"memoryPage.memorySpaceDeleted":`星域已删除`,"memoryPage.memorySpaceName":`星域名称`,"memoryPage.memorySpaces":`星域`,"memoryPage.memoryTitle":`星辰名称`,"memoryPage.memoryType":`星辰类型`,"memoryPage.addedManually":`手动添加`,"memoryPage.memoryUpdated":`星辰已更新`,"memoryPage.editMemory":`编辑星辰`,"memoryPage.memoryCreated":`星辰已点亮`,"memoryPage.memorySpaceRenamed":`星域已重命名`,"memoryPage.renameMemorySpace":`重命名星域`,"memoryPage.memorySpaceCreated":`星域已创建`,"memoryPage.newMemorySpace":`新建星域`,"memoryPage.normal":`一般`,"memoryPage.optionalForExampleECodeProjectREADMEMd":`可选,例如 E:\\code\\project\\README.md`,"memoryPage.recordStandaloneReusableMemoryForFutureChats":`记录独立可理解、未来可复用的星忆`,"memoryPage.refresh":`刷新`,"memoryPage.relatedFilePath":`关联文件路径`,"memoryPage.relatedFiles":`关联文件`,"memoryPage.relatedMemories":`关联星辰`,"memoryPage.rename":`重命名`,"memoryPage.save":`保存`,"memoryPage.saving":`保存中…`,"memoryPage.selectAMemoryInTheMapToViewItsDetails":`从星图中选择一颗星辰查看详细内容。`,"memoryPage.selectedMemory":`选中星辰`,"memoryPage.source":`来源`,"memoryPage.strict":`强约束`,"memoryPage.thereAreNoPendingMemoryCandidates":`当前没有待处理的记忆候选。`,"memoryPage.thisMemoryHasNoRelatedFiles":`当前星辰没有关联文件。`,"memoryPage.thisMemorySpaceIsStillUnlitClickInTheTopLeftToPlantTheFirstStar":`这片星域尚未点亮。点击左上角 +,种下第一颗星。`,"memoryPage.userConfirmedConversationCandidate":`用户确认的对话候选`,"memoryPage.view":`查看`,"memoryPage.visibleTotalMemories":`{visible}/{total} 星辰`,"memoryPage.zoomIn":`放大`,"memoryPage.zoomOut":`缩小`},Mt={"navigation.app":`应用`,"navigation.capabilities":`能力`,"navigation.system":`系统`,"navigation.chat":`会话`,"navigation.chatDescription":`让多个会话沿各自轨道并行推进`,"navigation.chatHistory":`历史会话`,"navigation.chatHistoryDescription":`每一次交谈,都在这里留下清晰可寻的回声`,"navigation.assets":`资产`,"navigation.assetsDescription":`收拢对话中的文件、图像与灵感产物`,"navigation.channels":`渠道`,"navigation.channelsDescription":`让 Pisper 穿过屏幕,抵达你的协作现场`,"navigation.schedules":`定时任务`,"navigation.schedulesDescription":`把重复的等待,交给准时启程的任务`,"navigation.settings":`设置`,"navigation.settingsDescription":`校准模型、运行策略与通知节奏`,"navigation.plugins":`插件`,"navigation.pluginsDescription":`安装和管理插件,同时控制 Agent 可调用的工具能力`,"navigation.memory":`星忆`,"navigation.memoryDescription":`让思考、偏好与决策在星图中长久发光`,"navigation.mcp":`MCP`,"navigation.mcpDescription":`连接外部能力,也守住每一道权限边界`,"navigation.skills":`技能`,"navigation.skillsDescription":`收纳可复用的技艺,让能力随任务被唤醒`,"navigation.workflows":`工作流`,"navigation.workflowsDescription":`把灵感编排成路径,让多个流程并行生长`,"navigation.newWorkflow":`新建工作流`,"navigation.newWorkflowDescription":`拖拽节点,把一次设想编排成可运行的星轨`,"appOverlays.actions":`操作`,"appOverlays.actionSucceeded":`{action}成功`,"appOverlays.addAShortDescription":`补充简短描述`,"appOverlays.addMCPService":`添加 MCP 服务`,"appOverlays.addMemory":`点亮星辰`,"appOverlays.addProvider":`添加 Provider`,"appOverlays.cancel":`取消`,"appOverlays.closeDialog":`关闭对话框`,"appOverlays.commandPalette":`命令面板`,"appOverlays.connectChannel":`连接渠道`,"appOverlays.create":`确认创建`,"appOverlays.createFromTemplate":`从模板创建`,"appOverlays.custom":`自定义`,"appOverlays.default":`默认`,"appOverlays.description":`描述`,"appOverlays.enterAName":`输入名称`,"appOverlays.enterTheBasicDetailsToContinue":`填写基本信息后即可继续配置。`,"appOverlays.exportAsset":`导出资产`,"appOverlays.installSkill":`导入全局 Skill`,"appOverlays.newProject":`新建项目`,"appOverlays.name":`名称`,"appOverlays.newChat":`新会话`,"appOverlays.newChat2":`新建会话`,"appOverlays.newScheduledTask":`新建定时任务`,"appOverlays.noMatchingResults":`无匹配结果`,"appOverlays.openLabeledTurnFailed":`无法打开此标记所在的回复`,"appOverlays.labelResultTimes":`会话 {sessionTime} · 节点 {nodeTime}`,"appOverlays.locatingLabel":`正在定位标记…`,"appOverlays.savePluginPolicy":`保存插件策略`,"appOverlays.searchPagesChatsOrActions":`搜索页面、会话、标记或操作`,"appOverlays.searchingLabels":`正在搜索会话标记…`,"appOverlays.type":`类型`,"appOverlays.untitledChat":`未命名会话`,"appOverlays.unknownTime":`时间未知`,"appSidebar.closeNavigation":`关闭导航`,"appSidebar.backToApp":`返回应用`,"appSidebar.collapseSidebar":`收起侧栏`,"appSidebar.countCommitsBehindBranch":`落后 {branch} {count} 个提交`,"appSidebar.downloading":`正在下载`,"appSidebar.expandSidebar":`展开侧栏`,"appSidebar.mainNavigation":`主导航`,"appSidebar.newChatInWorkspace":`在 {workspace} 中新建会话`,"appSidebar.noWorkspace":`无工作区`,"appSidebar.noChatHistoryYet":`暂无历史会话`,"appSidebar.readyToRestart":`等待重启安装`,"appSidebar.recentChats":`最近会话`,"appSidebar.sourceUpdatesAvailable":`发现代码更新`,"appSidebar.untitledChat":`未命名会话`,"appSidebar.updateAvailable":`发现新版本`,"appSidebar.viewAll":`查看全部`,"appSidebar.viewAllCountChats":`查看全部历史会话,共 {count} 个`,"appSidebar.viewUpdateDetails":`点击查看更新`,"pageHeader.addLink":`添加链接`,"pageHeader.addMemory":`点亮星辰`,"pageHeader.addProvider":`添加 Provider`,"pageHeader.addService":`添加服务`,"pageHeader.connectChannel":`连接渠道`,"pageHeader.dark":`深色`,"pageHeader.installSkill":`导入全局 Skill`,"pageHeader.light":`浅色`,"pageHeader.newChat":`新会话`,"pageHeader.newTask":`新建任务`,"pageHeader.newWorkflow":`新建工作流`,"pageHeader.publish":`发布`,"pageHeader.primaryActionShortcut":`{action}(Ctrl/⌘ N)`,"pageHeader.saveDraft":`保存草稿`,"pageHeader.savePolicy":`保存策略`,"pageHeader.search":`搜索(/)`,"pageHeader.searchMemoriesOrFiles":`搜索星辰或文件`,"pageHeader.searchPage":`搜索{page}`,"pageHeader.searchServicesOrTools":`搜索服务或工具`,"pageHeader.stop":`停止`,"pageHeader.system":`跟随系统`,"pageHeader.scheduled":`按时间自动`,"pageHeader.testRun":`试运行`,"pageHeader.themeThemeClickToSwitch":`主题:{theme}(点击切换)`,"pageHeader.themeThemeClickToSwitchThemes":`主题:{theme},点击切换主题`,"pageHeader.toggleTerminal":"切换终端(Ctrl+`)","pageLoader.bringingTheNeededCapabilitiesIntoPlace":`所需能力正在依次就位…`,"pageLoader.lightingUpThisPage":`正在点亮此页`,"statusBar.calculatingTodaySTokenUsage":`正在统计今日 Token 消耗`,"statusBar.connected":`已接入`,"statusBar.enabledTotalEnabled":`已启用 {enabled} / {total}`,"statusBar.inputInputOutputOutputReasoningReasoningCacheReadCacheRead":`输入 {input} · 输出 {output} · 推理 {reasoning} · 缓存读取 {cacheRead}`,"statusBar.nativeRuntime":`原生运行时`,"statusBar.noModelConfigured":`未配置模型`,"statusBar.todaySTokens":`今日 tokens`},Nt={"pluginsPage.all":`全部`,"toolLabels.read":`读取文件`,"toolLabels.list":`浏览目录`,"toolLabels.grep":`搜索内容`,"toolLabels.find":`查找文件`,"toolLabels.edit":`修改文件`,"toolLabels.write":`写入文件`,"toolLabels.shell":`运行命令`,"toolLabels.webSearch":`联网搜索`,"toolLabels.browserControl":`浏览器控制`,"toolLabels.visualGeneration":`生成视觉内容`,"toolLabels.skillCreate":`创建技能`,"toolLabels.pluginCreate":`创建插件`,"toolLabels.memorySearch":`搜索星忆`,"toolLabels.memoryRemember":`保存星忆`,"toolLabels.mcpList":`查看 MCP 服务`,"toolLabels.mcpManage":`管理 MCP 服务`,"toolLabels.readDescription":`读取工作目录中的文本、代码和图片文件。`,"toolLabels.listDescription":`列出目录结构和文件基本信息。`,"toolLabels.grepDescription":`在项目文件中进行全文和正则搜索。`,"toolLabels.findDescription":`按名称和模式查找项目文件。`,"toolLabels.editDescription":`对现有文件执行精确的局部编辑。`,"toolLabels.writeDescription":`创建新文件或覆盖写入文件内容。`,"toolLabels.shellDescription":`以当前系统用户权限执行终端命令。`,"toolLabels.webSearchDescription":`通过无需安装和 API Key 的 Bing RSS 搜索互联网。`,"toolLabels.browserControlDescription":`为 Agent 提供隔离、受控的浏览器环境,用于网页导航、内容检查和页面交互。`,"toolLabels.visualGenerationDescription":`自动调用已配置的视觉 Provider 生成图片、编辑图片或生成视频,并保存到工作目录。`,"toolLabels.skillCreateDescription":`在当前项目或 Pisper 全局技能目录中创建符合规范的 Agent Skill。`,"toolLabels.pluginCreateDescription":`定义、校验并安装一个提供一个或多个 Agent 工具的本地 Pisper 插件。`,"toolLabels.memorySearchDescription":`搜索全局与当前项目中的长期星忆。`,"toolLabels.memoryRememberDescription":`用户明确要求记住时直接写入长期星忆;否则将可复用信息静默加入候选待办。`,"toolLabels.mcpListDescription":`读取已配置的 MCP 服务、连接状态和可用工具。`,"toolLabels.mcpManageDescription":`使用结构化参数添加、更新、删除、测试或启停 MCP 服务和工具。`,"toolLabels.lowRisk":`低风险`,"toolLabels.mediumRisk":`中风险`,"toolLabels.highRisk":`高风险`,"toolLabels.fileSystem":`文件系统`,"toolLabels.search":`搜索`,"toolLabels.terminal":`终端`,"toolLabels.visual":`视觉`,"toolLabels.skills":`技能`,"toolLabels.plugins":`插件`,"toolLabels.browser":`浏览器`,"toolLabels.memory":`星忆`,"toolLabels.mcp":`MCP`,"toolLabels.collaboration":`协作`,"toolLabels.currentChatWorkspace":`当前会话工作目录`,"toolLabels.currentOsUser":`当前系统用户权限`,"toolLabels.bingPublicWebSearch":`Bing 公开网页搜索`,"toolLabels.isolatedSessionBrowser":`当前主 Agent 会话的隔离浏览器;仅支持 HTTP/HTTPS`,"toolLabels.visualProviderAndWorkspace":`已配置的视觉 Provider;当前会话工作目录/generated/visuals`,"toolLabels.projectAndGlobalSkills":`当前项目与 Pisper 全局技能目录`,"toolLabels.globalPluginSources":`Pisper 全局插件源码与本地插件安装目录`,"toolLabels.globalAndProjectMemory":`全局星域与当前项目星域`,"toolLabels.applicationMcpConfiguration":`应用级 MCP 配置`,"toolLabels.readCapability":`读取文件内容,不修改文件`,"toolLabels.listCapability":`浏览目录,不读取文件正文`,"toolLabels.grepCapability":`搜索文本,不修改文件`,"toolLabels.findCapability":`查找路径,不修改文件`,"toolLabels.editCapability":`修改现有文件并生成差异`,"toolLabels.writeCapability":`创建和覆盖文件`,"toolLabels.shellCapability":`执行命令、构建和测试`,"toolLabels.webSearchCapability":`发送搜索关键词并返回标题、链接、摘要和发布时间,不修改网页内容`,"toolLabels.browserControlCapability":`导航、检查、点击、输入、等待、截图和关闭浏览器;不执行任意 JavaScript`,"toolLabels.visualGenerationCapability":`调用视觉模型生成或编辑图片、生成视频,并写入输出文件`,"toolLabels.skillCreateCapability":`校验并原子创建新的 SKILL.md,不覆盖已有内容`,"toolLabels.pluginCreateCapability":`不覆盖现有文件地创建插件源码,执行统一预检,并安装声明的全部工具`,"toolLabels.memorySearchCapability":`读取相关偏好、事实、决策和任务星忆,不修改星忆`,"toolLabels.memoryRememberCapability":`明确要求直接入库,推断内容进入候选,并自动隐藏常见密钥格式`,"toolLabels.mcpListCapability":`读取经过脱敏的 MCP 服务信息,不修改配置`,"toolLabels.mcpManageCapability":`修改 MCP 服务配置;敏感 headers 和 env 不出现在返回结果中`,"pluginsPage.auto":`自动`,"pluginsPage.bingSearchIsAvailableAndReturnedCountResults":`Bing 搜索可用,返回 {count} 条结果`,"pluginsPage.capabilities":`能力`,"pluginsPage.category":`分类`,"pluginsPage.highRiskToolsEnabledFullAccessUsesCurrentUserPermissions":`{count} 个高风险工具已启用:{tools}。完全访问模式下,文件和 Shell 工具均使用当前系统用户权限。`,"pluginsPage.defaultLanguage":`默认语言`,"pluginsPage.disabled":`已禁用`,"pluginsPage.enabled":`启用`,"pluginsPage.enabled2":`已启用`,"pluginsPage.english":`英语`,"pluginsPage.full":`完整`,"pluginsPage.highRisk":`高风险`,"pluginsPage.loadingToolPlugins":`正在加载工具插件`,"pluginsPage.disableThisTool":`禁用此工具`,"pluginsPage.policySaved":`策略已保存`,"pluginsPage.disable":`禁用`,"pluginsPage.enableThisTool":`启用此工具`,"pluginsPage.moderate":`适中`,"pluginsPage.namePluginPolicy":`{name} 插件策略`,"pluginsPage.noHighRiskToolsAreEnabledTheAgentCanOnlyReadAndSearch":`当前没有启用高风险工具,Agent 仅拥有读取和搜索能力。`,"pluginsPage.noInstallationOrAPIKeyRequiredTheAgentCanUseItAfterSaving":`无需安装、无需 API Key,保存后即可由 Agent 使用。`,"pluginsPage.noMatchingTools":`没有匹配的工具`,"pluginsPage.noPermissionChangesYet":`尚无权限变更记录`,"pluginsPage.noPluginPolicyChanges":`插件策略没有变化`,"pluginsPage.off":`关闭`,"pluginsPage.onTheNextAgentRequestAfterSaving":`保存后下一次 Agent 请求`,"pluginsPage.pathScope":`路径范围`,"pluginsPage.pluginPolicySavedAgentRuntimeUpdated":`插件策略已保存,Agent 运行时已更新`,"pluginsPage.presets":`预设`,"pluginsPage.queriesAreSentToBingDoNotIncludeSecretsOrPrivateData":`搜索词会发送到 Bing,请勿在查询中包含密钥或隐私数据。`,"pluginsPage.readingTheAgentSRegisteredToolsAndPermissions":`读取 Agent 当前注册工具与权限…`,"pluginsPage.readOnly":`只读`,"pluginsPage.recentChanges":`最近变更`,"pluginsPage.resultCount":`结果数量`,"pluginsPage.riskLevel":`风险等级`,"pluginsPage.safeSearch":`安全搜索`,"pluginsPage.savePolicy":`保存策略`,"pluginsPage.saving":`保存中…`,"pluginsPage.securitySummary":`安全摘要`,"pluginsPage.simplifiedChinese":`简体中文`,"pluginsPage.source":`来源`,"pluginsPage.strict":`严格`,"pluginsPage.takesEffect":`生效时间`,"pluginsPage.testConnection":`测试连接`,"pluginsPage.testing":`测试中…`,"pluginsPage.toolID":`工具 ID`,"pluginsPage.toolPlugins":`工具插件`,"pluginsPage.unsaved":`未保存`,"pluginsPage.pisperAppTools":`Pisper 应用工具`,"pluginsPage.pisperBuiltInTools":`Pisper 内置工具`,"pluginsPage.builtIn":`内置`,"pluginsPage.local":`本地`,"pluginsPage.toolCatalog":`工具目录`,"pluginsPage.installPlugin":`安装插件`,"pluginsPage.installLocalPlugin":`安装本地插件`,"pluginsPage.installLocalPluginDescription":`检查并安装本机目录中的插件。`,"pluginsPage.pluginDirectory":`插件目录`,"pluginsPage.pluginDirectoryPlaceholder":`包含 pisper-plugin.json 的绝对路径`,"pluginsPage.chooseDirectory":`选择目录`,"pluginsPage.files":`个文件`,"pluginsPage.inspectPlugin":`检查插件`,"pluginsPage.processing":`处理中…`,"pluginsPage.localPluginSecurityWarning":`本地插件代码在独立 Worker 中运行,但仍能以当前系统用户权限访问本机文件和网络;其工具仅在“完全访问”模式下可用。`,"pluginsPage.toggleToolDetails":`展开或收起 {name} 的详情`,"pluginsPage.executionMode":`执行模式`,"pluginsPage.fullAccessOnly":`仅完全访问`,"pluginsPage.uninstallPlugin":`卸载插件`,"pluginsPage.uninstallPluginDescription":`卸载 {name} 及其提供的全部工具?Pisper 内置工具不支持卸载。`,"pluginsPage.pluginUninstalled":`已卸载 {name}`,"pluginsPage.saveBeforePluginChanges":`请先保存待处理的工具策略变更,再安装或卸载插件。`,"pluginsPage.workspace":`工作区`},Pt={"schedulesPage.fullAccessHelp":`后台任务以当前系统用户权限运行 Shell,不会逐次请求授权。`,"schedulesPage.readOnlyHelp":`仅允许读取和分析,不允许修改文件或运行 Shell。`,"schedulesPage.atIntervals":`每隔一段时间`,"schedulesPage.daily":`每天`,"schedulesPage.weekly":`每周`,"schedulesPage.monthly":`每月`,"schedulesPage.minutes":`分钟`,"schedulesPage.hours":`小时`,"schedulesPage.days":`天`,"schedulesPage.browserNotification":`通知`,"schedulesPage.feishu":`飞书`,"schedulesPage.weChat":`微信`,"schedulesPage.browseDirectories":`浏览目录`,"schedulesPage.cancel":`取消`,"schedulesPage.closeDialog":`关闭对话框`,"schedulesPage.countSec":`{count} 秒`,"schedulesPage.createATaskAndLetItSetOutAutomaticallyAtTheAppointedTime":`新建一项任务,让它在约定的时刻自动启程。`,"schedulesPage.creating":`创建中…`,"schedulesPage.delete":`删除`,"schedulesPage.deleteScheduledTask":`删除定时任务`,"schedulesPage.deleteScheduledTaskNameAndItsRunHistory":`删除定时任务「{name}」及其执行历史?`,"schedulesPage.deleteTask":`删除任务`,"schedulesPage.describeTheWorkTheAgentShouldCompleteEachTime":`描述 Agent 每次需要完成的工作`,"schedulesPage.editTemplates":`编辑模板`,"schedulesPage.enabled":`启用`,"schedulesPage.enabledAutomaticallyAfterCreation":`创建后自动启用`,"schedulesPage.enterTheProjectSAbsolutePath":`输入项目的绝对路径`,"schedulesPage.executionMode":`执行模式`,"schedulesPage.executionTarget":`执行目标`,"schedulesPage.forExampleDailyCodeReview":`例如 每日代码巡检`,"schedulesPage.frequency":`频率`,"schedulesPage.fullAccess":`完全访问`,"schedulesPage.lastRunTime":`上次运行:{time}`,"schedulesPage.loadingScheduledTasks":`正在加载定时任务`,"schedulesPage.pause":`暂停`,"schedulesPage.failuresOnly":`仅失败时`,"schedulesPage.runNow":`立即运行`,"schedulesPage.scheduledTrigger":`定时触发`,"schedulesPage.completionAndFailure":`完成与失败`,"schedulesPage.taskFailed":`任务执行失败`,"schedulesPage.taskInterrupted":`任务因 Pisper 重启而中断`,"schedulesPage.createTask":`创建任务`,"schedulesPage.manualRun":`手动运行`,"schedulesPage.saveTask":`保存任务`,"schedulesPage.taskCompleted":`任务已完成`,"schedulesPage.newScheduledTask":`新建定时任务`,"schedulesPage.nextRunTime":`下次运行:{time}`,"schedulesPage.noRunHistory":`暂无执行记录`,"schedulesPage.notificationChannels":`通知渠道`,"schedulesPage.readOnly":`只读`,"schedulesPage.recentRuns":`最近执行`,"schedulesPage.runInterval":`执行间隔`,"schedulesPage.running":`运行中`,"schedulesPage.running2":`正在运行`,"schedulesPage.saving":`保存中…`,"schedulesPage.scheduledTaskCreated":`定时任务已创建`,"schedulesPage.scheduledTaskDeleted":`定时任务已删除`,"schedulesPage.scheduledTaskSaved":`定时任务已保存`,"schedulesPage.scheduledTaskStarted":`定时任务已开始运行`,"schedulesPage.schedules":`定时任务`,"schedulesPage.taskName":`任务名称`,"schedulesPage.taskQueue":`任务队列`,"schedulesPage.theScheduledAgentWillRunInThisDirectory":`定时任务的 Agent 将在此目录中运行。`,"schedulesPage.theTimelineIsStillUnlit":`时间轴尚未点亮`,"schedulesPage.time":`时间`,"schedulesPage.timeZone":`时区`,"schedulesPage.workingDirectory":`工作目录`,"schedulesPage.workflow":`工作流`,"schedulesPage.workflowUnavailable":`工作流不可用`,"schedulesPage.selectPublishedWorkflow":`选择已发布的工作流`,"schedulesPage.noPublishedWorkflows":`暂无已发布的工作流。请先在工作流页面发布一个工作流。`,"schedulesPage.workflowUsesItsOwnRuntimeSettings":`工作目录、模型和执行参数由工作流自身配置决定。`,"schedulesPage.workflowInputs":`工作流输入`,"schedulesPage.workflowInputsHelp":`仅保存到当前任务,每次运行时传入所选工作流。`,"schedulesPage.youCanContinueEditingTheRunTimeAndNotificationChannelsAfterCreation":`创建后可继续编辑运行时间和通知渠道。`,"schedulesPage.youCanContinueSettingTheRunTimeAndNotificationChannelsAfterCreation":`创建后可继续设置运行时间和通知渠道。`,"schedulesPage.notificationChannelsHelp":`选择任务完成后需要通知的渠道`,"schedulesPage.configured":`已配置`,"schedulesPage.notConfigured":`未配置`},Ft={"skillsPage.all":`全部`,"skillsPage.installed":`已安装`,"skillsPage.design":`设计`,"skillsPage.code":`代码`,"skillsPage.documents":`文档`,"skillsPage.global":`全局`,"skillsPage.globalSkills":`全局 Skill`,"skillsPage.globalSkillSourceHelp":`输入一个 Skill 来源:本地技能目录或 SKILL.md、npm 包名,或者 git 地址。Pisper 只提取其中的 Skill 资源并复制到 ~/.pisper/agent/skills,所有项目均可使用。`,"skillsPage.highPrivilege":`高权限`,"skillsPage.allowAutomaticModelInvocation":`允许模型自动调用`,"skillsPage.automaticManual":`自动 + 手动`,"skillsPage.configuredSkillPackages":`已配置技能包`,"skillsPage.continue":`继续`,"skillsPage.countSkillPackages":`{count} 个技能包`,"skillsPage.declaresRequiredTools":`声明所需工具`,"skillsPage.enterALocalSkillDirectorySKILLMdFileNpmPackageOrGitSourcePisperImportsOnlyItsSkillResources":`输入本地技能目录、SKILL.md、npm 包或 git 来源。Pisper 只导入其中的技能资源。`,"skillsPage.import":`导入`,"skillsPage.importGlobalSkill":`导入全局 Skill`,"skillsPage.install":`安装`,"skillsPage.installedSkills":`已安装技能`,"skillsPage.installSkill":`安装技能`,"skillsPage.loadingSkills":`正在加载技能`,"skillsPage.locallyReady":`本地已就绪`,"skillsPage.manualOnly":`仅手动`,"skillsPage.noGlobalSkills":`尚无全局 Skill。可导入到 ~/.pisper/agent/skills。`,"skillsPage.noProjectSkills":`当前工作区没有项目 Skill。请将 Skill 放入当前工作区的 .pisper/skills。`,"skillsPage.noSkillAvailable":`暂无可用 Skill`,"skillsPage.noSkillInstalled":`尚未安装技能`,"skillsPage.noSkillPackagesAreConfiguredYetAfterYouInstallASkillItsSourceWillAppearHere":`当前没有已配置技能包。安装技能后,对应来源会出现在这里。`,"skillsPage.noSkillsInstalledYetUseInstallSkillInTheUpperRightToAddALocalDirectoryNpmPackageOrGitSource":`尚未安装技能。请用右上角“安装技能”接入本地目录、npm 或 git 来源。`,"skillsPage.noSkillsMatchTheCurrentFilter":`当前筛选下没有匹配技能。`,"skillsPage.notMaterialized":`尚未落地`,"skillsPage.permissions":`权限`,"skillsPage.project":`项目`,"skillsPage.projectSkills":`项目 Skill`,"skillsPage.projectScopedConfiguration":`项目级配置`,"skillsPage.projectScopedSkill":`项目范围技能`,"skillsPage.addGlobalOrProjectSkill":`可导入全局 Skill 到 ~/.pisper/agent/skills,或在当前工作区的 .pisper/skills 中添加项目 Skill。`,"skillsPage.saveSettings":`保存设置`,"skillsPage.scanningSkillDirectoriesAndConfiguredPackages":`正在扫描全局 Skill 与当前项目 Skill`,"skillsPage.scope":`范围`,"skillsPage.selectedSkill":`选中技能`,"skillsPage.skillInstalledAndLoadedIntoTheAgentRuntime":`全局 Skill 已导入并载入 Agent Runtime`,"skillsPage.skillSettingsSavedAndReloaded":`技能设置已保存并重新载入`,"skillsPage.skillSource":`技能来源`,"skillsPage.skillsProvideInstructionsToTheAgentAndMayIncludeExecutableScriptsConfirmThatYouTrustTheSource":`技能会向 Agent 提供指令,并可能包含可执行脚本。请确认该来源可信。`,"skillsPage.skillUninstalled":`技能已卸载`,"skillsPage.source":`来源`,"skillsPage.supportManualSkillCommand":`支持 /skill 手动命令`,"skillsPage.thisRemovesTheSkillDirectoryInstalledByPisperItDoesNotUninstallTheOriginalNpmOrGitPackage":`将删除由 Pisper 安装的技能目录。此操作不会卸载原始 npm 或 git 包。`,"skillsPage.toggleSkillName":`切换技能 {name}`,"skillsPage.triggerConditions":`触发条件`,"skillsPage.triggerMode":`触发方式`,"skillsPage.uninstall":`卸载`,"skillsPage.uninstallSkill":`卸载技能`,"skillsPage.userScopedConfiguration":`用户级配置`,"skillsPage.usesChatToolPermissions":`按会话工具权限`,"skillsPage.useTheButtonInTheUpperRightToInstallAnAgentSkillsCompatibleSkill":`使用右上角按钮安装符合 Agent Skills 标准的技能。`,"skillsPage.version":`版本`},It={"terminalPanel.terminal":`终端`,"terminalPanel.resizeTerminal":`调整终端高度`,"terminalPanel.hideTerminal":"收起终端(Ctrl+`)","terminalPanel.showTerminal":"显示终端(Ctrl+`)","terminalPanel.newTerminal":`新建终端`,"terminalPanel.closeTerminal":`关闭终端`,"terminalPanel.maximizeTerminal":`增大终端面板`,"terminalPanel.openTerminal":`打开终端`,"terminalPanel.usesActiveSessionWorkspace":`新终端使用当前活动会话的工作目录`,"terminalPanel.orphanedTerminal":`未关联`,"terminalPanel.starting":`正在启动 Shell...`,"terminalPanel.processExited":`进程已退出,代码 {code}`},Lt={"workflowsPage.workflowDuplicated":`工作流已复制`,"workflowsPage.workflowImported":`工作流已导入`,"workflowsPage.skillNode":`Skill`,"workflowsPage.callSkill":`调用 Skill`,"workflowsPage.conditionBranch":`条件分支`,"workflowsPage.parallelJoin":`并行汇合`,"workflowsPage.humanApproval":`人工审批`,"workflowsPage.waitingApproval":`等待审批`,"workflowsPage.interrupted":`已中断`,"workflowsPage.runHistory":`运行记录`,"workflowsPage.templates":`模板`,"workflowsPage.import":`导入`,"workflowsPage.neverRun":`尚未运行`,"workflowsPage.duplicateWorkflow":`复制工作流`,"workflowsPage.export":`导出`,"workflowsPage.countAttempts":`{count} 次尝试`,"workflowsPage.approve":`批准`,"workflowsPage.reject":`拒绝`,"workflowsPage.retryRun":`重试运行`,"workflowsPage.averageDuration":`平均耗时`,"workflowsPage.visibility":`可见范围`,"workflowsPage.private":`仅自己`,"workflowsPage.shared":`工作区共享`,"workflowsPage.tags":`标签`,"workflowsPage.revision":`当前修订`,"workflowsPage.inputParameters":`输入参数`,"workflowsPage.addInput":`添加输入参数`,"workflowsPage.newInput":`新参数`,"workflowsPage.parameterName":`参数名`,"workflowsPage.parameterType":`参数类型`,"workflowsPage.required":`必填`,"workflowsPage.chooseSkill":`选择已启用的 Skill`,"workflowsPage.mcpToolNames":`MCP 工具名称`,"workflowsPage.executionMode":`执行模式`,"workflowsPage.readOnly":`只读`,"workflowsPage.workspaceWrite":`自动审批`,"workflowsPage.fullAccess":`完全访问`,"workflowsPage.readOnlyHelp":`仅允许读取和分析,不允许修改文件或运行 Shell。`,"workflowsPage.workspaceWriteHelp":`允许修改当前工作目录并自动批准常规命令;目录外访问仍受限制。`,"workflowsPage.fullAccessHelp":`允许访问本机文件和网络,并以当前系统用户权限运行 Shell。`,"workflowsPage.outputFormat":`输出格式`,"workflowsPage.dataPath":`数据路径`,"workflowsPage.operator":`比较方式`,"workflowsPage.comparisonValue":`比较值`,"workflowsPage.approvalMessage":`审批说明`,"workflowsPage.approvalTimeout":`审批超时(分钟)`,"workflowsPage.all":`全部`,"workflowsPage.custom":`自定义`,"workflowsPage.triggerNode":`触发器`,"workflowsPage.fileNode":`文件`,"workflowsPage.mcpNode":`MCP`,"workflowsPage.notificationNode":`通知`,"workflowsPage.notificationTitle":`通知标题`,"workflowsPage.notificationContent":`通知内容`,"workflowsPage.notificationChannels":`通知渠道`,"workflowsPage.notificationChannelEnabled":`渠道已启用`,"workflowsPage.notificationChannelNotEnabled":`该渠道尚未启用,请先前往渠道设置启用`,"workflowsPage.noExternalNotificationChannelsEnabled":`尚未启用飞书或微信渠道。系统通知仍可单独授权使用。`,"workflowsPage.openChannelSettings":`前往渠道`,"workflowsPage.openSystemNotificationSettings":`通知设置`,"workflowsPage.systemNotificationPermissionRequired":`系统通知权限未开启,请在浏览器或操作系统设置中允许 Pisper 发送通知。`,"workflowsPage.systemNotificationReady":`点击后将请求系统通知权限`,"workflowsPage.systemNotificationsEnabled":`系统通知已启用`,"workflowsPage.systemNotificationsUnsupported":`当前环境不支持系统通知。`,"workflowsPage.conditionNode":`判断`,"workflowsPage.parallelNode":`并行`,"workflowsPage.approvalNode":`审批`,"workflowsPage.manualTrigger":`手动触发`,"workflowsPage.readWriteFiles":`读写文件`,"workflowsPage.callMcp":`调用 MCP`,"workflowsPage.sendNotification":`发送通知`,"workflowsPage.runPrompt":`运行 Prompt`,"workflowsPage.triggerGroup":`触发`,"workflowsPage.browserNotification":`通知`,"workflowsPage.feishu":`飞书`,"workflowsPage.weChat":`微信`,"workflowsPage.codeReview":`代码审查`,"workflowsPage.codeReviewDescription":`读取 diff → 运行测试 → 生成 review`,"workflowsPage.prFix":`PR 修复`,"workflowsPage.prFixDescription":`定位失败 → 修改代码 → 回归测试`,"workflowsPage.research":`资料调研`,"workflowsPage.researchDescription":`搜索资料 → 提取引用 → 点亮星忆`,"workflowsPage.dailyWeeklyReport":`日报周报`,"workflowsPage.reportDescription":`汇总会话 → 生成摘要 → 渠道通知`,"workflowsPage.assetGeneration":`资产生成`,"workflowsPage.assetDescription":`生成图片 → 存入资产库 → 通知验收`,"workflowsPage.releasePreparation":`发布准备`,"workflowsPage.releaseDescription":`版本检查 → changelog → 创建发布单`,"previewPages.addMCPService":`添加 MCP 服务`,"previewPages.afterDeletionToolsFromThisServerWillBeRemovedFromSubsequentAgentRuns":`删除后,该服务提供的工具会从后续 Agent 运行中移除。`,"previewPages.availableTools":`可用工具`,"previewPages.online":`在线`,"previewPages.connecting":`连接中`,"previewPages.unauthorized":`未授权`,"previewPages.disabled":`已禁用`,"previewPages.offline":`离线`,"previewPages.lowRisk":`低风险`,"previewPages.mediumRisk":`中风险`,"previewPages.highRisk":`高风险`,"previewPages.transport":`传输方式`,"previewPages.latency":`延迟`,"previewPages.lastPing":`最后探测`,"previewPages.authentication":`认证`,"previewPages.configuredEnvironmentVariables":`已配置环境变量`,"previewPages.connect":`连接`,"previewPages.connectMCPServer":`连接 MCP 服务`,"previewPages.continue":`继续`,"previewPages.countRequestHeaders":`{count} 个请求头`,"previewPages.countRestrictedTools":`{count} 个受限工具`,"previewPages.countServicesTotal":`共 {count} 个服务`,"previewPages.currentService":`当前服务`,"previewPages.delete":`删除`,"previewPages.deleteMCPServer":`删除 MCP 服务`,"previewPages.enterAStreamableHTTPURLAStdioCommandOrJSONContainingHeadersEnv":`输入 Streamable HTTP URL、stdio 命令,或包含 headers/env 的 JSON 配置。`,"previewPages.errorRate":`错误率`,"previewPages.executable":`可执行文件`,"previewPages.localProcess":`本地进程`,"previewPages.mcpConnectionTestPassed":`MCP 连接测试通过`,"previewPages.mcpServerAdded":`MCP 服务已添加`,"previewPages.mcpServerDeleted":`MCP 服务已删除`,"previewPages.mcpServerDisabled":`MCP 服务已禁用`,"previewPages.mcpServerEnabled":`MCP 服务已启用`,"previewPages.mcpServersCanExposeToolsThatPerformExternalActionsConnectOnlyToServersYouTrust":`MCP 服务可以提供会执行外部操作的工具。仅连接你信任的服务。`,"previewPages.none":`无`,"previewPages.noServerConfigured":`尚未配置服务`,"previewPages.onlineServices":`在线服务`,"previewPages.recentCalls":`最近调用`,"previewPages.serverAddress":`服务地址`,"previewPages.serverConfiguration":`服务配置`,"previewPages.serverEnabled":`服务启用`,"previewPages.services":`服务`,"previewPages.testConnection":`测试连接`,"previewPages.thisServerExposesToolsThroughAStandardMCPTransportEnabledToolsAreRegisteredInNewAgentRuntimes":`该服务已通过标准 MCP transport 暴露工具,启用的工具会在新 Agent Runtime 中注册。`,"previewPages.toggleMCPServer":`切换 MCP 服务`,"previewPages.toggleToolName":`切换工具 {name}`,"previewPages.toolCapabilities":`工具能力`,"previewPages.useTheButtonInTheUpperRightToAddAStreamableHTTPOrStdioMCPServer":`使用右上角按钮添加 Streamable HTTP 或 stdio MCP 服务。`,"previewPages.workingDirectory":`工作目录`,"workflowsPage.aConnectionIsCurrentlySelected":`当前选中的是连线。`,"workflowsPage.aTriggerCannotHaveAnUpstreamConnection":`触发器不能连接上游节点`,"workflowsPage.aWorkflowCannotContainCyclicConnections":`工作流不能包含循环连接`,"workflowsPage.chooseATemplateAboveToGetStarted":`从上方选择一个预设开始创建`,"workflowsPage.commonTemplates":`常见预设`,"workflowsPage.completed":`已完成`,"workflowsPage.completionDelivery":`完成推送`,"workflowsPage.configurablePerNode":`可在节点中独立设置`,"workflowsPage.connectionCreated":`连线已建立`,"workflowsPage.connectionDeleted":`连线已删除`,"workflowsPage.countAvailableChannels":`{count} 个可用渠道`,"workflowsPage.countCurrentlyRunning":`当前 {count} 个运行`,"workflowsPage.countTemplates":`{count} 个模板`,"workflowsPage.countWorkflows":`{count} 个工作流`,"workflowsPage.countWorkflowsTotal":`共 {count} 个工作流`,"workflowsPage.customWorkflow":`自定义工作流`,"workflowsPage.defaultModel":`默认模型`,"workflowsPage.delete":`删除`,"workflowsPage.deleteConnection":`删除连线`,"workflowsPage.deleteNode":`删除节点`,"workflowsPage.deleteWorkflow":`删除工作流`,"workflowsPage.deleteWorkflowNameAndItsRunHistory":`删除工作流「{name}」及其运行记录?`,"workflowsPage.describeTheWorkTheAgentShouldCompleteInThisNode":`描述该节点需要 Agent 完成的工作`,"workflowsPage.description":`描述`,"workflowsPage.draft":`草稿`,"workflowsPage.drag":`拖拽`,"workflowsPage.dragFromANodeOutputToTheTargetInputToConnectThem":`从节点右侧端口拖到目标节点左侧端口建立连线`,"workflowsPage.dragNodesFromTheLeftToStartBuildingTheWorkflow":`从左侧拖入节点开始编排工作流。`,"workflowsPage.duplicateNode":`复制节点`,"workflowsPage.edit":`编辑`,"workflowsPage.enabled":`已启用`,"workflowsPage.failed":`失败`,"workflowsPage.failureHandling":`失败处理`,"workflowsPage.inheritWorkflowDefaultModel":`继承工作流默认模型`,"workflowsPage.inputPort":`输入端口`,"workflowsPage.latestRun":`最近运行`,"workflowsPage.loadingWorkflowEditor":`正在加载工作流编辑器`,"workflowsPage.loadingWorkflows":`正在加载工作流`,"workflowsPage.maximumConcurrency":`最大并发`,"workflowsPage.name":`名称`,"workflowsPage.noCustomWorkflowYet":`还没有自定义工作流`,"workflowsPage.nodeDeleted":`节点已删除`,"workflowsPage.nodeDuplicated":`节点已复制`,"workflowsPage.nodeLibrary":`节点库`,"workflowsPage.nodeModel":`节点模型`,"workflowsPage.nodeName":`节点名称`,"workflowsPage.noMatchingWorkflows":`还没有符合条件的工作流`,"workflowsPage.noRunHistory":`暂无运行记录`,"workflowsPage.notEnabled":`未启用`,"workflowsPage.outputPort":`输出端口`,"workflowsPage.preparing":`准备中`,"workflowsPage.presets":`预设`,"workflowsPage.pressDeleteOrBackspaceToRemoveThisConnection":`按 Delete 或 Backspace 也可以删除这条连线。`,"workflowsPage.published":`已发布`,"workflowsPage.queueAndLimits":`队列与限制`,"workflowsPage.retryCount":`重试次数`,"workflowsPage.retryOnFailure":`失败重试`,"workflowsPage.run":`运行`,"workflowsPage.running":`正在运行`,"workflowsPage.runningNode":`正在执行:{node}`,"workflowsPage.runningNodeCompletedTotalCompleted":`正在执行:{node} · 已完成 {completed}/{total}`,"workflowsPage.selectedConnection":`选中连线`,"workflowsPage.selectedNode":`选中节点`,"workflowsPage.skipThisNode":`跳过此节点`,"workflowsPage.startBlank":`空白创建`,"workflowsPage.stop":`停止`,"workflowsPage.stopImmediately":`立即停止`,"workflowsPage.stopped":`已停止`,"workflowsPage.stoppingWorkflow":`正在停止工作流`,"workflowsPage.task":`任务`,"workflowsPage.thisConnectionAlreadyExists":`这条连线已经存在`,"workflowsPage.timeoutMinutes":`超时(分钟)`,"workflowsPage.unknownNode":`未知节点`,"workflowsPage.upTo3TimesPerNode":`每节点最多 3 次`,"workflowsPage.useSystemDefault":`跟随系统默认`,"workflowsPage.workflowCompleted":`工作流已完成`,"workflowsPage.workflowDeleted":`工作流已删除`,"workflowsPage.workflowDraftSaved":`工作流草稿已保存`,"workflowsPage.workflowFailed":`工作流执行失败`,"workflowsPage.workflowNotFoundABlankEditorWasOpened":`工作流不存在,已打开空白编辑器。`,"workflowsPage.workflowPublished":`工作流已发布`,"workflowsPage.workflowRunning":`工作流运行中`,"workflowsPage.workflows":`工作流`,"workflowsPage.workflowSettings":`工作流设置`,"workflowsPage.workflowStarted":`工作流已开始运行`,"workflowsPage.workingDirectory":`工作目录`,"previewPages.noToolsAvailable":`暂无可用工具`,"previewPages.noRecentCalls":`暂无调用记录`},Z=`zh-CN`,Rt=[`zh-CN`,`en-US`];function Q(e){return typeof e==`string`&&Rt.includes(e)}var zt=[{value:`zh-CN`,shortName:`中文`},{value:`en-US`,shortName:`EN`}],Bt=Object.freeze([`assets`,`channels`,`common`,`navigation`,`chat`,`config`,`memory`,`plugins`,`schedules`,`skills`,`terminal`,`workflows`]);function Vt(){try{let e=localStorage.getItem(a.language);return Q(e)?e:Z}catch{return Z}}var $=K.createInstance();$.use(st).init({lng:Vt(),fallbackLng:Z,supportedLngs:Rt,defaultNS:`common`,ns:Bt,resources:{"zh-CN":{assets:Et,channels:Dt,common:kt,navigation:Mt,chat:Ot,config:At,memory:jt,plugins:Nt,schedules:Pt,skills:Ft,terminal:It,workflows:Lt},"en-US":{assets:mt,channels:ht,common:_t,navigation:bt,chat:gt,config:vt,memory:yt,plugins:xt,schedules:St,skills:Ct,terminal:wt,workflows:Tt}},interpolation:{prefix:`{`,suffix:`}`,escapeValue:!1},keySeparator:!1,nsSeparator:`:`,initAsync:!1});function Ht(e,t=Z,n){return $.getFixedT(t)(e,n)}function Ut(){let{i18n:e}=pt(),t=Q(e.resolvedLanguage)?e.resolvedLanguage:Z;return{language:t,locale:t,setLanguage:(0,s.useCallback)(t=>{Q(t)&&e.changeLanguage(t)},[e]),t:(0,s.useCallback)((e,n)=>Ht(e,t,n),[t])}}export{Q as a,pt as c,ae as d,D as f,p as g,f as h,$ as i,ct as l,_ as m,Z as n,Vt as o,S as p,zt as r,Ht as s,Ut as t,fe as u};
|