Files
apes-sidebar/src/client/locales-th.ts
T
Menghuan1918 b011be1e98 feat(sidebar): 打开方式双源并存 + 多选压缩下载 + 文件变动层级树
用户追加三条需求,全部落地:

1) 打开方式 = 宿主探测应用 + 插件自研 open-with(并存)
- 逐字恢复 src/client/open-with.ts / open-with-settings.tsx / plugin-settings.ts /
  src/open-external.ts / open.external 路由 / api.openExternal / editor descriptor
  的 settings.render,以及 20 个 openWith* 词条(19 份词典从 main 取回原文)
- 恢复 menu-flip.ts + layout.css 子菜单翻转规则(子菜单回来了)
- FileTree 菜单段(无标题行):宿主行 → 分隔线 → 插件 pinned + 「在应用中打开 >」
  子菜单(图钉 / SSH 后缀原样)→ 分隔线 → 宿主 reveal;宿主可用时过滤插件
  explorer 目标,宿主不可用时插件行照旧(SSH 远端场景保持可用)
- 死键清理:菜单去掉标题行后 openInApp 词条无引用,已从 21 份词典删除

2) 文件页多选右键「压缩并打包下载」
- 新增 src/zip.ts(自研 ZIP:方法 0/8 按收益二选一、UTF-8 bit 11、目录条目、
  自实现 CRC32、无第三方依赖)+ src/archive-route.ts(名净化 + 递归收集)+
  GET /sidebar/archive(同一道 workspace fence、目录递归跳过符号链接、
  10000 条目 / 256 MiB 上限)+ api.archiveUrl
- FileTree:多选 ≥2 项或单选目录时出现;fetch → blob → objectURL 下载,
  路由错误(超限 / fence / 非 GET)以 zipFailed 显示在错误条
- 修掉真实缺陷:central directory 只写 MS-DOS 位而 version-made-by 声称 Unix,
  Info-ZIP 会把每个文件解成 mode 000;改为 Unix 语义(0o100644 * 0x10000,
  << 16 会溢出 int32)。系统 unzip 复验:mode 644/755、unzip -t 无错

3) 文件变动页层级树 + 视觉打磨
- 新增 src/client/changes/change-tree.ts:单子目录链压缩成一行、目录先于文件、
  大小写不敏感排序、文件带 GitFileStatus、目录带下级变更数
- GitLens 两组各自渲染树:折叠状态按「组+路径」独立、默认展开;分组头吸顶 +
  计数胶囊;Stage all/Unstage all 改为带 aria-label 的 IconButton;选中 =
  interactive-bg-active + 2px 内嵌强调条;12px/级缩进 + l1 参考线;
  历史行 hash 徽标 / ref 胶囊 / 作者·时间右对齐

验证:typecheck / lint / test(134 文件 1422 通过)/ build 全绿;
DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过;
真实宿主截图确认三条需求(多选+双源菜单+zip 项、变动页树形层级)
2026-09-28 18:08:21 +08:00

527 lines
58 KiB
TypeScript

/**
* The th (Thai) dictionary for the betterSidebar namespace.
*
* Mirrors the key set of `zh` in `locales.ts`. The sidebar's `t()`
* consults this dict when `attachBetterLocale(store)` has been called
* with an active better-locale store whose `active` is `'th'`; absent
* that, the existing zh/en chain runs unchanged.
*
* Translation conventions:
* - Technical terms stay in English where appropriate (Git, SSH, HTTP, URL,
* Markdown, PDF, VS Code, API Key, Base URL, token, etc.).
* - Placeholders keep {name} verbatim (interpolation runs after lookup).
* - Formal Thai appropriate for software UI.
* - Terminology is kept consistent with the DSH core th dictionary.
*/
/** The th dictionary (key-set-equal to zh, enforced by the type annotation in locales.ts). */
export const th: Record<string, string> = {
files: 'ไฟล์',
guideDescFiles: 'เรียกดูแผนผังไฟล์ของเวิร์กสเปซ คลิกเพื่อดูตัวอย่างหรือแก้ไข',
guideDescGit: 'การเปลี่ยนแปลง Git และไฟล์ที่แก้ในเซสชันนี้ในแท็บเดียว',
guideDescSubagent: 'กราฟเวิร์กโฟลว์ บอร์ดงานของทีม และงานเบื้องหลัง แบบเรียลไทม์',
guideDescSidechat: 'เธรดถามต่ออิสระที่สืบทอดบริบทของเซสชันนี้',
guideDescTerminal: 'เชลล์จริง (xterm + pty) เชื่อมต่อใหม่ได้',
guideDescBrowser: 'เบราว์เซอร์ในตัว รับช่วงลิงก์จากแชทได้',
changesSessionEmpty: 'ยังไม่มีการดำเนินการไฟล์ในเซสชันนี้',
changesRead: 'อ่าน',
changesMdReading: 'อ่าน',
changesHtmlRender: "เรนเดอร์",
changesHtmlRaw: "ต้นฉบับ",
changesPdfRender: "เรนเดอร์",
changesPdfRaw: "ต้นฉบับ",
changesMdRaw: 'ดิบ',
changesWrite: 'เขียน',
changesEdit: 'แก้ไข',
changesRunning: 'กำลังทำงาน',
changesError: 'ข้อผิดพลาด',
changesFold: '{count} บรรทัด… คลิกเพื่อขยาย',
changesFoldLoading: 'กำลังขยาย…',
changesFoldUnavailable: 'ไม่สามารถโหลดบริบทได้',
changesContext: 'บริบท',
changesPriorUnknown: 'เนื้อหาก่อนแก้ไขอยู่นอกหน้าต่าง แสดงเป็นเพิ่มใหม่ทั้งหมด',
explorer: 'ตัวสำรวจ',
terminal: 'เทอร์มินัล',
editor: 'ตัวแก้ไข',
editorExplorer: 'พฤติกรรมการเปิดไฟล์',
editorExplorerDesc: 'ควบคุมวิธีเปิดไฟล์',
editorExplorerMerged: 'รวม',
editorExplorerMergedDesc: 'ไฟล์สลับในตำแหน่งเดิมในหน้าต่างเดียวกัน; หน้าต่างใหม่เริ่มต้นด้วยต้นไม้ไฟล์ที่เปิดอยู่',
editorExplorerSplit: 'แยก',
editorExplorerSplitDesc: 'หน้าต่างที่ไม่มีพาธคือตัวสำรวจแบบสแตนด์อโลน (ต้นไม้ไฟล์เท่านั้น); แต่ละไฟล์เปิดหน้าต่างของตัวเอง (ต้นไม้ไฟล์ docked, ปิดเป็นค่าเริ่มต้น)',
editorTreeToggle: 'พาเนลต้นไม้ไฟล์',
editorPathPlaceholder: 'พาธไฟล์ (สัมพันธ์กับไดเรกทอรีเซสชันหรือแบบ absolute), Enter เพื่อเปิด',
editorSearchPlaceholder: 'ค้นหาไฟล์ตามชื่อ…',
editorSearchNoResults: 'ไม่มีไฟล์ที่ตรง',
editorSearchTruncated: 'ผลลัพธ์มากเกินไป — แสดงเพียงบางส่วน',
editorEmptyHint: 'เลือกไฟล์จากพาเนลต้นไม้ไฟล์หรือช่องกรอกพาธด้านบนเพื่อเริ่มพรีวิว',
openFileNewTab: 'เปิดใน Tab ใหม่',
openFileSide: 'เปิดด้านข้าง',
zipDownload: 'บีบอัดและดาวน์โหลด',
zipDownloadCount: 'บีบอัดและดาวน์โหลด ({count} รายการ)',
zipFailed: 'สร้างไฟล์บีบอัดไม่สำเร็จ: {message}',
openWithMenu: 'เปิดด้วย',
openWithSshSuffix: ' (SSH)',
pinOpenWith: 'ปักหมุดในเมนู',
unpinOpenWith: 'ยกเลิกการปักหมุด',
openWithExplorer: 'ตัวจัดการไฟล์',
openWithVscode: 'VS Code',
openWithCursor: 'Cursor',
openWithZed: 'Zed',
openWithSettingsSshTitle: 'โฮสต์ระยะไกล SSH',
openWithSettingsSshDesc: 'ว่าง = พื้นที่ทำงานในเครื่อง; เมื่อกรอก user@host หรือ alias SSH ตัวเปิดตระกูล VSCode จะสลับไปใช้โปรโตคอล vscode-remote/ssh-remote และตัวจัดการไฟล์ / Zed / ตัวแก้ไขที่กำหนดเองที่ไม่ใช่ตระกูล VSCode จะถูกซ่อนจากเมนู',
openWithSettingsSshPlaceholder: 'user@host หรือ alias SSH',
openWithSettingsCustomTitle: 'ตัวแก้ไขที่กำหนดเอง',
openWithSettingsCustomDesc: 'ชื่อ + เทมเพลต URL (placeholder {path}) + แฟล็กตระกูล VSCode; ในโหมดระยะไกลเฉพาะตัวแก้ไขตระกูล VSCode เท่านั้นที่เปิดพาธระยะไกลได้',
openWithSettingsAdd: 'เพิ่ม',
openWithSettingsName: 'ชื่อ',
openWithSettingsTemplate: 'เช่น cursor://file/{path}',
openWithSettingsFamily: 'ตระกูล VSCode',
openWithSettingsFamilyDesc: 'ตัวแก้ไขนี้ใช้โปรโตคอล URL ของ VSCode (รองรับการเปิดจากระยะไกลผ่าน SSH)',
openWithSettingsRemove: 'ลบ',
openWithSettingsInvalidHint: 'ตัวแก้ไขที่ไม่มีชื่อหรือเทมเพลตที่ไม่มี {path} / scheme:// จะไม่ปรากฏในเมนู',
openInAppDefault: 'เปิดด้วยแอปเริ่มต้น',
openInAppEmpty: 'ไม่มีแอปที่เปิดไฟล์นี้ได้',
openInAppFailed: 'เปิดไม่สำเร็จ: {path}',
revealInFileManager: 'แสดงในตัวจัดการไฟล์',
filesSelected: 'เลือกแล้ว {count} รายการ',
clearSelection: 'ล้างการเลือก',
copyPaths: 'คัดลอกพาธ',
deleteSelected: 'ลบรายการที่เลือก',
deleteSelectedTitle: 'ลบ {count} รายการที่เลือกหรือไม่',
deleteSelectedDesc: 'ไฟล์และโฟลเดอร์เหล่านี้จะถูกลบอย่างถาวรและกู้คืนไม่ได้',
newFolder: 'โฟลเดอร์ใหม่',
newFolderPlaceholder: 'ชื่อโฟลเดอร์',
newFolderInvalid: 'ชื่อโฟลเดอร์ไม่ถูกต้อง',
filesTruncated: 'โฟลเดอร์นี้มีรายการมากเกินไป จึงแสดงเฉพาะส่วนแรก',
gitStatusModified: 'แก้ไขแล้ว',
gitStatusAdded: 'เพิ่มแล้ว',
gitStatusDeleted: 'ลบแล้ว',
gitStatusUntracked: 'ยังไม่ติดตาม',
gitStatusRenamed: 'เปลี่ยนชื่อแล้ว',
gitStatusConflict: 'มีความขัดแย้ง',
changesClean: 'ไม่มีการเปลี่ยนแปลงในเวิร์กสเปซ',
changesNoHistory: 'ยังไม่มีประวัติการ commit',
changesStageFailed: 'stage ไม่สำเร็จ: {message}',
changesOpGone: 'การดำเนินการนี้ไม่อยู่ในบันทึกเซสชันแล้ว',
newTab: 'Tab ใหม่',
brokenSymlink: 'Symlink เสีย',
close: 'ปิด',
closeOtherTabs: 'ปิด Tab อื่น',
closeLeftTabs: 'ปิด Tab ด้านซ้าย',
closeRightTabs: 'ปิด Tab ด้านขวา',
pinTerminal: 'ปักหมุดเทอร์มินัล',
pinAgentTerminal: 'ปักหมุดเทอร์มินัล Agent',
pinToWorkspace: 'ปักหมุดไปยังพื้นที่ทำงาน',
pinToGlobal: 'ปักหมุดแบบ Global',
unpinTerminal: 'ยกเลิกการปักหมุด',
collapseBottomPanel: 'ย่อพาเนลด้านล่าง',
expandBottomPanel: 'ขยายพาเนลด้านล่าง',
terminalError: 'การเชื่อมต่อเทอร์มินัลล้มเหลว',
terminalConnectFailed: 'เทอร์มินัลเชื่อมต่อล้มเหลวหลายครั้ง',
terminalRetry: 'ลองอีกครั้ง',
terminalWaitBanner: 'เอเจนต์กำลังรอ {needle}',
terminalSkipWait: 'ข้ามการรอ',
terminalDepsFailed: 'การอ้างอิงเทอร์มินัล node-pty โหลดล้มเหลว',
terminalDepsHint: 'เรียกใช้คำสั่งด้านล่างในเทอร์มินัลหรือ cmd บนเครื่อง DSH เพื่อซ่อมแซม แล้วกดลองอีกครั้ง (node-pty ต้องซิงค์กับเวอร์ชันหลักของ DSH):',
terminalDepsProfile: ' (ตรวจพบ profile: {profile})',
terminalShellNotFound: 'ไม่พบ shell ที่กำหนดไว้: {name} — ตรวจสอบพาธ shell ใน การตั้งค่า → Side card → Terminal',
preview: 'พรีวิว',
toc: 'สารบัญ',
edit: 'แก้ไข',
mermaidError: 'เรนเดอร์ Mermaid ล้มเหลว',
mermaidZoomIn: 'ซูมเข้า',
mermaidZoomOut: 'ซูมออก',
mermaidZoomReset: 'รีเซ็ต',
mermaidZoomHint: 'เลื่อนเพื่อซูม · ลากเพื่อแพน · Esc เพื่อปิด',
refresh: 'รีเฟรช',
showInFolder: 'แสดงในโฟลเดอร์',
refreshUnsavedConfirm: 'ไฟล์เปลี่ยนบนดิสก์ การรีเฟรชจะทิ้งการแก้ไขที่ยังไม่ได้บันทึก ดำเนินการต่อหรือไม่',
save: 'บันทึก',
saved: 'บันทึกแล้ว',
unsaved: 'ยังไม่ได้บันทึก',
saveFailed: 'บันทึกล้มเหลว',
truncation: 'ไฟล์ใหญ่เกินไป — แสดงเพียง 512KB แรก',
binary: 'ไฟล์ไบนารี ไม่สามารถพรีวิวได้',
loading: 'กำลังโหลด…',
error: 'โหลดล้มเหลว',
retry: 'ลองอีกครั้ง',
notRepo: 'ไดเรกทอรีนี้ไม่ใช่ git repository',
statusTruncated: 'การเปลี่ยนแปลงมากเกินไป แสดงเพียง 2000 รายการแรก',
stage: 'Stage',
unstage: 'Unstage',
stageAll: 'Stage ทั้งหมด',
unstageAll: 'Unstage ทั้งหมด',
commitPlaceholder: 'ข้อความ commit (Ctrl+Enter)',
commit: 'Commit',
branch: 'Branch',
worktree: 'เวิร์กทรี',
checkoutError: 'สลับ branch ล้มเหลว',
history: 'ประวัติ',
changes: 'การเปลี่ยนแปลงไฟล์',
changesGitLens: 'Git',
changesSessionLens: 'เซสชัน',
changesFilterAll: 'ทั้งหมด',
changesFilterEmpty: 'ไม่มีการดำเนินการประเภทนี้',
changesOpenDiffTab: 'เปิดในแท็บ diff แยก',
changesClosePreview: 'ปิดตัวอย่าง',
changesResizePreview: 'ปรับขนาดตัวอย่าง',
changesLoadError: 'บันทึกไฟล์ของเซสชันยังใช้ไม่ได้ตอนนี้',
staged: 'Staged',
unstaged: 'Unstaged',
cancel: 'ยกเลิก',
diffEmpty: 'ไม่มีการเปลี่ยนแปลงข้อความ',
diffLoadError: 'โหลด diff ล้มเหลว',
diffBinary: 'ไบนารี',
diffAdded: 'เพิ่ม',
diffDeleted: 'ลบ',
diffRenamed: 'เปลี่ยนชื่อ',
diffExpand: 'ขยายอีก {count} บรรทัด',
discard: 'ยกเลิกการเปลี่ยนแปลง',
discardTitle: 'ยกเลิกการเปลี่ยนแปลง',
discardDesc: 'จะยกเลิกการเปลี่ยนแปลง worktree ของ "{path}" (ไม่สามารถกู้คืนได้)',
viewCommitDiff: 'ดู diff ของ commit',
copyShortHash: 'คัดลอก short hash',
copyFullHash: 'คัดลอก full hash',
copySubject: 'คัดลอกหัวข้อ commit',
revertCommit: 'Revert commit',
revertTitle: 'Revert commit',
revertDesc: 'สร้าง commit ใหม่บน branch ปัจจุบันที่ revert "{subject}"',
cherryPickCommit: 'Cherry-pick commit',
cherryPickTitle: 'Cherry-pick commit',
cherryPickDesc: 'นำการเปลี่ยนแปลงของ "{subject}" ไปใช้กับ branch ปัจจุบัน',
timeJustNow: 'เมื่อสักครู่',
timeMinutesAgo: '{n} นาทีที่แล้ว',
timeHoursAgo: '{n} ชม. ที่แล้ว',
timeYesterday: 'เมื่อวาน',
loadMore: 'โหลดเพิ่มเติม',
historyLoadError: 'โหลดประวัติเพิ่มเติมล้มเหลว',
produced: 'ผลลัพธ์ที่สร้าง',
disconnected: 'เทอร์มินัลถูกตัดการเชื่อมต่อ กำลังเชื่อมต่อใหม่…',
exited: 'กระบวนการเทอร์มินัลออกแล้ว',
noSession: 'เลือกแชทเพื่อใช้แถบด้านข้าง',
pluginNotLoaded: 'ปลั๊กอินไม่ได้โหลด; tab ไม่พร้อมใช้งาน:',
parent: 'ไดเรกทอรีหลัก',
copied: 'คัดลอกแล้ว',
copy: 'คัดลอก',
openEditor: 'เปิดตัวแก้ไข',
referenceFile: '@ไฟล์',
addToConversation: 'เพิ่มไปยังแชท',
copyRelative: 'คัดลอกพาธสัมพัทธ์',
copyAbsolute: 'คัดลอกพาธ absolute',
rename: 'เปลี่ยนชื่อ',
renameInvalid: 'ชื่อต้องไม่ว่างเปล่าและต้องไม่มีตัวคั่นเส้นทาง',
delete: 'ลบ',
deleteTitle: 'ลบ "{name}" หรือไม่',
deleteDescFile: 'การดำเนินการนี้จะลบไฟล์อย่างถาวร และไม่สามารถย้อนกลับได้',
deleteDescDir: 'การดำเนินการนี้จะลบไดเรกทอรีและเนื้อหาทั้งหมดอย่างถาวร และไม่สามารถย้อนกลับได้',
dismiss: 'ปิด',
download: 'ดาวน์โหลด',
uploadFiles: 'อัปโหลดไฟล์',
uploadFolder: 'อัปโหลดโฟลเดอร์',
uploadHere: 'อัปโหลดที่นี่',
uploadDropHint: 'ลากไฟล์/โฟลเดอร์มาที่นี่เพื่ออัปโหลด',
uploadDropChat: 'ลากไปที่แชทเพื่อเพิ่มรูปภาพ',
uploadTo: 'อัปโหลดไปยัง {dir}',
uploadingTo: 'กำลังอัปโหลดไปยัง {dir}…',
uploadProgress: 'กำลังอัปโหลด {done}/{total}: {name}',
uploadDone: 'อัปโหลด {count} ไฟล์แล้ว',
uploadFailed: 'อัปโหลดล้มเหลว: {error}',
uploadFailedUnknown: 'ข้อผิดพลาดที่ไม่รู้จัก',
uploadTooLarge: 'ไฟล์ใหญ่เกินไป (เกินขีดจำกัดการอัปโหลด)',
uploadCancelled: 'การอัปโหลดถูกยกเลิก',
settingsNav: 'การ์ดด้านข้าง',
settingsIntro: 'จัดการสิ่งที่การ์ดด้านข้างแสดงและพฤติกรรมของมัน',
settingsPopupDesc: 'กำหนดค่าตัวเลือกที่เกี่ยวข้องสำหรับ {feature}',
settingsDone: 'เสร็จสิ้น',
settingsOpenToolsTitle: 'ฉีดเครื่องมือเปิดแถบด้านข้างสำหรับโมเดล',
settingsOpenToolsDesc: 'เมื่อเปิดใช้ โมเดลสามารถเปิดไฟล์ โฟลเดอร์ และหน้า HTTP(S) ในแถบด้านข้างผ่านเครื่องมือ sidebar_open (ปิดเป็นค่าเริ่มต้น)',
settingsTitleBarTitle: 'โหมดความเข้ากันได้ของตำแหน่ง',
settingsTitleBarDesc: 'เลือกโครงร่างความเข้ากันได้ของไตเติลบาร์: ตรวจจับอัตโนมัติ (ค่าเริ่มต้น, อนุรักษ์นิยม) / DSH เว็บอย่างเป็นทางการ / เชลล์เดสก์ท็อปที่รู้จัก / กำหนดเอง (ระยะการเลื่อน + CSS ที่กำหนดเอง)',
settingsTitleBarStripTitle: 'ระยะการเลื่อน',
settingsTitleBarStripDesc: 'ความสูงของแถบไตเติลบาร์: จำนวนพิกเซลที่ปุ่มแถบด้านข้างและเนื้อหาเลื่อนลง (0–120, ค่าเริ่มต้น 40; มีผลภายใต้โครงร่างกำหนดเอง)',
settingsSchemeAutoTitle: 'ตรวจจับอัตโนมัติ',
settingsSchemeAutoDesc: 'อนุรักษ์นิยม: เฉพาะ API มาตรฐาน Window Controls Overlay เท่านั้นที่มีส่วนร่วม (ความสูง caption-overlay จริง); สภาพแวดล้อมเว็บธรรมดาไม่ได้รับการแก้ไข',
settingsSchemeWebTitle: 'DSH เว็บอย่างเป็นทางการ',
settingsSchemeWebDesc: 'ประกาศอย่างชัดเจนว่าเป็นเว็บ UI อย่างเป็นทางการ: ไม่มีการปรับตัวใดๆ (แม้แต่เรขาคณิต WCO มาตรฐาน)',
settingsSchemeCustomTitle: 'กำหนดเอง',
settingsSchemeCustomDesc: 'ควบคุมเต็ม: ฉีด CSS ที่กำหนดเอง (สามารถแทนที่สไตล์ built-in) และตั้งระยะการเลื่อนไตเติลบาร์',
settingsSchemeDetectedSuffix: 'ตรวจพบแล้ว',
settingsCustomCssTitle: 'CSS ที่กำหนดเอง',
settingsCustomCssPlaceholder: '/* เช่น สำรอง 36px สำหรับเชลล์ที่มีไตเติลบาร์ที่วาดเอง */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
settingsSaveFailed: 'บันทึกล้มเหลว',
settingsConflict: 'การตั้งค่าถูกเปลี่ยนในหน้าต่างอื่น — โปรดลองอีกครั้ง',
binaryNoPreview: 'ไม่สามารถพรีวิวประเภทไฟล์นี้ได้',
downloadToView: 'ดาวน์โหลดเพื่อดู',
settingsSubagentTitle: 'เลือกหน้า Tasks โดยอัตโนมัติเมื่อมีตัวแทนย่อยปรากฏ',
settingsSubagentDesc: 'เมื่อแชทปัจจุบันสร้างตัวแทนย่อยใหม่ ระบบจะเลือกหน้า Tasks โดยอัตโนมัติ; ในมุมมองแบบกว้าง ระบบจะขยายการ์ดด้านข้างด้วย ส่วนในมุมมองแบบแคบ ระบบจะไม่บังคับเปิดลิ้นชักเต็มหน้าจอ; ปิดเพื่อเลือกหน้าด้วยตนเอง',
settingsJobsTitle: 'เลือกหน้า Tasks โดยอัตโนมัติเมื่อมีงานเบื้องหลังใหม่',
settingsJobsDesc: 'เมื่อมีงานเบื้องหลังใหม่ปรากฏในแชทปัจจุบัน ระบบจะเลือกหน้า Tasks โดยอัตโนมัติ (ทุกงานใหม่จะทริกเกอร์); ในมุมมองแบบกว้าง ระบบจะขยายการ์ดด้านข้างด้วย ส่วนในมุมมองแบบแคบ ระบบจะไม่บังคับเปิดลิ้นชักเต็มหน้าจอ; ปิดเพื่อเลือกหน้าด้วยตนเอง',
settingsToolsTitle: 'ฉีดเครื่องมือเทอร์มินัลสำหรับโมเดล',
settingsToolsDesc: 'เมื่อเปิดใช้ โมเดลสามารถสร้างและควบคุมเทอร์มินัลแถบด้านข้างผ่านเครื่องมือ terminal_* 8 ตัว (ปิดเป็นค่าเริ่มต้น)',
settingsFenceTitle: 'การตรวจสอบเส้นทางเวิร์กสเปซ',
settingsFenceDesc: 'เมื่อเปิด ฟีเจอร์ไฟล์ของแถบข้างเข้าถึงได้เฉพาะเส้นทางในเวิร์กสเปซของเซสชัน (ค่าเริ่มต้น) เมื่อปิด จะเข้าถึงไฟล์ใดก็ได้บนโฮสต์ — สคริปต์ในหน้าก็ได้ขอบเขตเดียวกันตลอดช่วงนั้น',
fenceErrorReason: 'เส้นทางนี้อยู่นอกเวิร์กสเปซของเซสชันและถูกบล็อกโดยการตรวจสอบ',
fenceDisableAction: 'ปิดการตรวจสอบเวิร์กสเปซ',
settingsBottomTerminalTitle: 'เปิดเทอร์มินัลอัตโนมัติเมื่อพาเนลล่างขยายครั้งแรก',
settingsBottomTerminalDesc: 'เมื่อพาเนลล่างถูกขยายครั้งแรกในเซสชัน ลองเปิด tab เทอร์มินัลใหม่ที่นั่น (โควต้าเทอร์มินัลยังคงมีผล; เปิดเป็นค่าเริ่มต้น)',
settingsFontFamilyTitle: 'ฟอนต์เทอร์มินัล',
settingsFontFamilyDesc: 'ฟอนต์เทอร์มินัลที่กำหนดเอง (CSS font-family stack เช่น "JetBrains Mono", monospace; ปล่อยว่างเพื่อตามฟอนต์ monospace ของธีม)',
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
settingsFontSizeTitle: 'ขนาดฟอนต์เทอร์มินัล',
settingsFontSizeDesc: 'ขนาดฟอนต์เทอร์มินัลเป็น px (9–32, ค่าเริ่มต้น 13)',
settingsShellTitle: 'พาธ Shell',
settingsShellDesc: 'Shell ที่เรียกสำหรับเทอร์มินัล UI และโมเดล (พาธ absolute หรือ executable ลำพัง) ว่างจะคงลำดับเดิม: yaml config.shell → $SHELL / login shell / Windows powershell.exe มีผลกับเทอร์มินัลที่เปิดภายหลัง',
settingsShellPlaceholder: 'เช่น /bin/zsh (ว่าง = อัตโนมัติ)',
settingsShellArgsTitle: 'อาร์กิวเมนต์ Shell',
settingsShellArgsDesc: 'อาร์กิวเมนต์ shell ที่ชัดเจน คั่นด้วยช่องว่าง; เมื่อไม่ว่างจะแทนที่ค่าเริ่มต้นทั้งหมด (สัญญาณเดียวกับ yaml shellArgs)',
settingsShellArgsPlaceholder: 'เช่น -l (ว่าง = ค่าเริ่มต้น)',
settingsTabsTitle: 'เนื้อหาแถบด้านข้าง',
settingsViewersTitle: 'ตัวพรีวิวไฟล์',
settingsMobileTitle: "มือถือ",
settingsMobileNoAutoOpenTitle: "ไม่เปิดอัตโนมัติบนจอแคบ",
settingsMobileNoAutoOpenDesc: "บนมือถือ / จอแคบ เอเจนต์ย่อยหรืองานเบื้องหลังใหม่จะไม่สลับไปหน้าภารกิจให้เองอีก (ยังเปิดเองได้)",
settingsMobileTreeTitle: "หน้าภารกิจใช้ทรีเป็นค่าเริ่มต้น",
settingsMobileTreeDesc: "บนมือถือ / จอแคบ หน้าภารกิจจะเปิดเป็นทรีแบบคลาสสิกแทนกราฟเวิร์กโฟลว์ ปุ่มสลับในหน้ายังใช้ได้",
settingsGeneralTitle: 'ทั่วไป',
settingsPopup: 'การตั้งค่าคุณสมบัติ',
settingsViewerCatchAll: 'Catch-all: ไฟล์ใดๆ',
viewerMarkdown: 'Markdown',
viewerCode: 'โค้ด',
viewerHtml: 'HTML',
browser: 'เบราว์เซอร์',
browserPlaceholder: 'กรอก URL เช่น example.com',
browserGo: 'ไป',
browserBack: 'ย้อนกลับ',
browserForward: 'ไปข้างหน้า',
browserStart: 'กรอก URL เพื่อเริ่มเรียกดู (โหมดแซนด์บ็อกซ์)',
browserBlockedScheme: 'ถูกบล็อก: อนุญาตเฉพาะ URL http/https เท่านั้น',
browserBlockedLoopback: 'ถูกบล็อก: ไม่สามารถเรียกดูที่อยู่ภายในเครื่องและภายในได้ที่นี่',
browserInvalid: 'URL ไม่ถูกต้อง',
htmlNoSandboxWarning: 'แซนด์บ็อกซ์ปิด: HTML นี้ทำงานด้วยสิทธิ์ GUI เต็มรูปแบบ (เปิดใช้ใหม่ได้ในการตั้งค่า)',
sandboxStatusOn: 'โหมดแซนด์บ็อกซ์: เปิด · หน้าเว็บไม่สามารถเข้าถึงข้อมูลหรือไฟล์ภายในของ GUI ได้; การล็อกอินและคุกกี้ของบุคคลที่สามอาจไม่ทำงาน',
sandboxUnlock: 'ปิดใช้ชั่วคราว (ไม่ปลอดภัย)',
sandboxRestore: 'คืนค่าแซนด์บ็อกซ์',
settingsHtmlDefaultUnsafeTitle: 'เปิดพรีวิว HTML โดยไม่มีแซนด์บ็อกซ์เป็นค่าเริ่มต้น (ไม่ปลอดภัย)',
settingsHtmlDefaultUnsafeDesc: 'เมื่อเปิด พรีวิว HTML ที่เปิดใหม่ทุกครั้งจะเริ่มในสถานะไม่มีแซนด์บ็อกซ์ (origin เดียวกับ GUI — สามารถอ่านไฟล์เซสชันและ API ภายในได้); แถวสถานะยังคงเสนอการคืนค่าแบบแตะครั้งเดียว',
settingsHtmlSandboxTitle: 'ปิดแซนด์บ็อกซ์พรีวิว HTML (ไม่ปลอดภัย)',
settingsHtmlSandboxDesc: 'เมื่อปิดแซนด์บ็อกซ์ HTML ที่พรีวิวจะทำงานด้วย origin เดียวกับ GUI: สามารถอ่านไฟล์เซสชัน, ที่เก็บข้อมูลในเครื่อง และเรียก API ภายในได้ เปิดใช้เฉพาะสำหรับไฟล์ที่เชื่อถือได้อย่างเต็มที่',
settingsBrowserSandboxTitle: 'ปิดแซนด์บ็อกซ์เบราว์เซอร์ (ไม่ปลอดภัย)',
settingsBrowserSandboxDesc: 'เมื่อปิดแซนด์บ็อกซ์ ไซต์ที่เยี่ยมชมใดๆ จะทำงานด้วย origin เดียวกับ GUI: สามารถอ่านข้อมูลเซสชันและแสดงเป็นเซสชันล็อกอินของคุณได้ เปิดใช้เฉพาะสำหรับไซต์ที่เชื่อถือได้อย่างเต็มที่',
settingsBrowserLoopbackTitle: 'ที่อยู่ภายในเครื่องที่อนุญาต',
settingsBrowserLoopbackDesc: 'รายการที่อนุญาตแบบคั่นด้วยจุลภาคของที่อยู่ลูปแบ็ก (เช่น localhost:5174 หรือ 127.0.0.1:8080) ที่เบราว์เซอร์แถบด้านข้างสามารถเยี่ยมชมได้ ค่าว่างจะบล็อกที่อยู่ภายในทั้งหมดโดยค่าเริ่มต้น แซนด์บ็อกซ์ยังคงมีผล — หน้าเว็บไม่สามารถอ่านข้อมูล GUI ได้',
settingsBrowserLoopbackPlaceholder: 'เช่น localhost:5174, 127.0.0.1:8080',
browserOpenExternal: 'เปิดในเบราว์เซอร์',
browserEmbedBlocked: '{host} ปฏิเสธที่จะถูกฝัง',
browserEmbedBlockedDesc: 'ไซต์ห้ามไม่ให้แสดงภายในหน้าอื่น (X-Frame-Options / frame-ancestors) จึงไม่สามารถโหลดในแถบด้านข้างได้ เปิดโดยตรงในเบราว์เซอร์ของคุณแทน',
browserEmbedAnyway: 'โหลดต่อไป',
subagent: 'งาน',
subagentMainAgent: 'ตัวแทนหลัก',
subagentEmpty: 'ไม่มีตัวแทนย่อย',
subagentEmptyDesc: 'ตัวแทนย่อยที่สร้างภายใต้ตัวแทนหลักจะปรากฏที่นี่',
subagentInactive: 'ไม่ได้ทำงาน',
subagentModeOneShot: 'ครั้งเดียว',
subagentModeContinuable: 'ทำต่อได้',
subagentCount: '{count} ตัวแทนย่อย',
subagentCountRunning: '{count} ตัวแทนย่อย · {running} กำลังทำงาน',
subagentThinking: 'กำลังคิด…',
sideChat: 'แชทด้านข้าง (เบต้า)',
sideChatNew: 'เธรดใหม่',
sideChatUntitled: 'เธรดใหม่',
sideChatEmpty: 'ไม่มีแชทด้านข้าง',
sideChatEmptyDesc: 'แชทด้านข้างทุกรายการคือ tab ของตัวเองในแถบ tab — สืบทอดบริบทของเซสชันปัจจุบันและไม่เข้าสู่แชทหลัก',
sideChatCreating: 'กำลังสร้างแชทด้านข้าง…',
sideChatRetry: 'ลองอีกครั้ง',
sideChatThreads: 'สลับเธรด / ใหม่',
sideChatSave: 'บันทึกเป็นเซสชันใหม่',
sideChatSaveTitle: 'เลื่อนเธรดนี้เป็นเซสชันระดับบนสุดในรายการเซสชันหลัก',
sideChatSaved: 'บันทึกเป็นเซสชันใหม่แล้ว',
sideChatNoTurn: 'การบันทึกพร้อมใช้งานหลังจากรอบแรกเสร็จสมบูรณ์',
sideChatPendingDrop: 'การติดตามที่ยังไม่ได้ตอบครั้งสุดท้ายจะไม่รวมในเซสชันที่บันทึก',
sideChatFirstPlaceholder: 'ถามคำถามแรก — บริบทที่สืบทอด…',
sideChatComposerPlaceholder: 'ถามติดตาม…',
sideChatThinking: 'กำลังดำดิ่ง…',
sideChatThink: 'กำลังคิด',
sideChatInjection: 'แทรกบริบทแล้ว',
sideChatSend: 'ส่ง',
sideChatCancelTitle: 'ยกเลิกการทำงานรอบปัจจุบัน (งานในคิวยังคงอยู่)',
sideChatError: 'ข้อผิดพลาดแชทด้านข้าง: {message}',
sideChatTurnUsage: 'อินพุต {input} tok · เอาต์พุต {output} tok',
sideChatBlockCollapse: 'ย่อ',
sideChatBlockCollapseAria: 'ย่อ',
sideChatBlockExpand: 'ขยาย {hidden} บรรทัด',
sideChatBlockExpandAria: 'ขยายอีก {hidden} บรรทัด',
sideChatBlockSignal: 'ถูกยุตด้วยสัญญาณ: {signal}',
sideChatBlockExitCode: 'รหัสออก {code}',
sideChatBlockNoExitCode: "สิ้นสุดโดยไม่มีรหัสออก",
sideChatBlockRunning: 'กำลังทำงาน',
sideChatBlockFailed: 'ล้มเหลว',
sideChatBlockDone: 'เสร็จสิ้น',
sideChatBlockNoOutput: '(ไม่มีเอาต์พุต)',
codeBlockTitle: 'บล็อกโค้ด',
codeBlockWrap: 'ตัดบรรทัดอัตโนมัติ',
codeBlockUnwrap: 'ไม่ตัดบรรทัด',
sideChatBlockWindow: '{shown} จาก {total} บรรทัด',
sideChatConnDisconnected: 'การเชื่อมต่อขาดหาย',
sideChatConnConnecting: 'กำลังเชื่อมต่อใหม่…',
sideChatConnRecovered: 'กู้คืนการเชื่อมต่อแล้ว',
sideChatConnReconnectAction: 'เชื่อมต่อใหม่ตอนนี้',
sideChatConnRestartAction: 'เริ่มการเชื่อมต่อใหม่',
jobs: 'งานเบื้องหลัง',
jobsCount: '{count} งานเบื้องหลัง',
jobsCountRunning: '{count} งานเบื้องหลัง · {running} กำลังทำงาน',
jobStatusRunning: 'กำลังทำงาน',
jobStatusStopping: 'กำลังหยุด',
jobStatusCompleted: 'เสร็จสิ้น',
jobStatusKilled: 'ถูก kill',
jobStatusFailed: 'ล้มเหลว',
jobDurationSeconds: '{seconds} วิ',
jobDurationMinutes: '{minutes} นาที {seconds} วิ',
jobDurationHours: '{hours} ชม. {minutes} นาที',
jobViewOutput: 'ดูเอาต์พุต',
jobNoOutput: 'ยังไม่มีเอาต์พุต',
jobNotReadYet: 'รอให้โมเดลอ่านงานนี้; เอาต์พุตจะปรากฏที่นี่เมื่อโมเดลเรียก job_output',
jobOutputTruncated: 'เอาต์พุตถูกตัดทิ้ง',
jobOutputError: 'โหลดเอาต์พุตล้มเหลว',
jobKill: 'Kill',
jobKillConfirm: 'คลิกอีกครั้งเพื่อยืนยันการ kill',
jobKillError: 'Kill ล้มเหลว',
tasksViewGraph: 'กราฟเวิร์กโฟลว์',
tasksViewTree: 'มุมมองต้นไม้',
tasksViewSwitchToGraph: 'สลับเป็นกราฟเวิร์กโฟลว์',
tasksViewSwitchToTree: 'สลับเป็นมุมมองต้นไม้',
settingsViewModeTitle: 'มุมมองเริ่มต้นของหน้างาน',
settingsViewModeDesc: 'รูปแบบการแสดงหน้างานเมื่อเปิด (ปุ่มสลับในหน้ายังใช้สลับชั่วคราวได้)',
settingsViewModeGraph: 'กราฟเวิร์กโฟลว์',
settingsViewModeGraphDesc: 'กราฟโหนดแบบชั้น ซูมและเลื่อนได้',
settingsViewModeTree: 'มุมมองต้นไม้',
settingsViewModeTreeDesc: 'ต้นไม้แบบเยื้องคลาสสิก นำทางด้วยคีย์บอร์ดได้',
tasksFoldIdleGroup: 'N waiting',
tasksFoldIdle: 'Idle {count}',
tasksFoldCompleted: '✓ เสร็จแล้ว {count}',
tasksFoldOne: 'พับรวมกับที่เสร็จแล้ว',
tasksFoldExpand: 'ขยายโหนดที่เสร็จแล้ว',
tasksFoldCollapse: 'ย่อโหนดที่เสร็จแล้ว',
tasksZoomIn: 'ซูมเข้า',
tasksZoomOut: 'ซูมออก',
tasksZoomFit: 'พอดีผืนผ้าใบ',
tasksNodeJump: 'เปิดบันทึกถอดความ',
tasksNodeDetail: 'รายละเอียดโหนด',
workflowRun: 'เวิร์กโฟลว์',
tasksNodeState: 'สถานะ',
tasksNodeMode: 'โหมด',
tasksNodeModel: 'โมเดล',
tasksNodeTeamRole: 'บทบาทในทีม',
tasksNodeActivity: 'กิจกรรมล่าสุด',
tasksStateRunning: 'กำลังทำงาน',
tasksStateIdle: 'พร้อม',
tasksStateProvisioning: 'Provisioning',
tasksStateDone: 'เสร็จแล้ว',
tasksStateError: 'ข้อผิดพลาด',
tasksKindSubagent: 'เอเจนต์ย่อย',
tasksKindTeammate: 'สมาชิกทีม',
tasksKindWorkflow: 'เวิร์กโฟลว์',
taskWindowCreate: 'New task',
taskWindowDetail: 'Task detail',
teamBoard: 'บอร์ดงานของทีม',
teamChip: 'ทีม {members} สมาชิก · {tasks} งาน',
teamTasksEmpty: 'ยังไม่มีงานที่แชร์',
teamTaskCreate: 'งานใหม่',
teamTaskSubject: 'หัวข้อ',
teamTaskDescription: 'คำอธิบาย',
teamTaskOwner: 'ผู้รับผิดชอบ',
teamTaskUnowned: 'ยังไม่มีผู้รับ',
teamTaskPending: 'รอดำเนินการ',
teamTaskInProgress: 'กำลังดำเนินการ',
teamTaskCompleted: 'เสร็จแล้ว',
teamTaskBlocked: 'ถูกบล็อก',
teamTaskClaim: 'Claim',
teamTaskComplete: 'ทำให้เสร็จ',
teamTaskReopen: 'เปิดใหม่',
teamTaskDelete: 'ลบ',
teamTaskDeleteConfirm: 'ยืนยันการลบ',
teamTaskEdit: 'แก้ไข',
teamTaskSave: 'บันทึก',
teamTaskCancel: 'ยกเลิก',
teamTaskConflict: 'งานถูกแก้ไขโดยผู้อื่น รีเฟรชแล้ว',
teamTaskError: 'ดำเนินการไม่สำเร็จ: {message}',
teamTaskDeleted: 'ลบแล้ว',
teamTaskActions: 'การดำเนินการของงาน',
teamTaskDetail: 'รายละเอียดงาน',
teamTaskNoDescription: 'ยังไม่มีคำอธิบาย — คลิก “แก้ไข” เพื่อเพิ่ม',
teamTaskBlockedBy: 'ถูกบล็อกโดย',
teamTaskSubjectPlaceholder: 'อธิบายงานที่ต้องทำในบรรทัดเดียว',
teamTaskDescriptionPlaceholder: 'รายละเอียดเพิ่มเติม (ไม่บังคับ)',
teamFilterAll: 'ทั้งหมด',
tasksNodeTasks: 'งานที่แชร์',
jobCopyOutput: 'คัดลอกเอาต์พุต',
jobCopied: 'คัดลอกแล้ว',
jobFollowTail: 'ติดตามบรรทัดล่าสุด',
jobDragHint: 'ลากเพื่อย้าย',
workflowRunning: 'กำลังทำงาน',
workflowCompleted: 'เสร็จสิ้น',
workflowCancelled: 'ยกเลิกแล้ว',
workflowFailed: 'ล้มเหลว',
workflowPhaseUnnamed: 'เฟสไม่มีชื่อ',
workflowMembers: '{done}/{total} สมาชิก',
jobsAutoCollapsed: 'ย่ออัตโนมัติ (เอเจนต์จำนวนมาก)',
catalogLoadFailed: 'โหลดสาขาไม่สำเร็จ {count} รายการ',
addPluginsTabCard: 'เพิ่มปลั๊กอิน tab',
addPluginsTabCardDesc: 'ลงทะเบียนหน้าแถบด้านข้างใหม่',
addPluginsViewerCard: 'เพิ่มปลั๊กอินพรีวิว',
addPluginsViewerCardDesc: 'ลงทะเบียนพรีวิวประเภทไฟล์',
addPluginsTabDesc: 'หน้าแถบด้านข้าง (tab) สามารถขยายได้ด้วยปลั๊กอิน ปลั๊กอินลงทะเบียนผ่านบริการ ctx.betterSidebar; การคลิก Install จะคัดลอกคำสั่งติดตั้ง — วางลงในเทอร์มินัลที่ DSH profile ของคุณอยู่แล้วเรียกใช้',
addPluginsViewerDesc: 'ตัวพรีวิวไฟล์สามารถขยายได้ด้วยปลั๊กอิน ปลั๊กอินลงทะเบียนผ่านบริการ ctx.betterSidebar; การคลิก Install จะคัดลอกคำสั่งติดตั้ง — วางลงในเทอร์มินัลที่ DSH profile ของคุณอยู่แล้วเรียกใช้',
addPluginsBrowseMore: 'เรียกดูปลั๊กอินเพิ่มเติมบน GitHub (topic: dsh-better-sidebar)',
addPluginsSearch: 'ค้นหาตามชื่อหรือคำอธิบายปลั๊กอิน…',
addPluginsNoMatch: 'ไม่มีปลั๊กอินที่ตรง',
addPluginsRecommended: 'ปลั๊กอินแนะนำ',
addPluginsEmpty: 'ยังไม่มีปลั๊กอินที่คัดสรร — เผยแพร่ปลั๊กอินของคุณภายใต้ topic บน GitHub',
openPlugin: 'เปิด',
copyInstall: 'คัดลอกคำสั่งติดตั้ง',
pluginOfficeDesc: 'พรีวิวชุด Office (.docx / .xlsx / .pptx) สำหรับตัวแก้ไข better-sidebar โดยแยกไลบรารีเรนเดอร์ Office ที่หนักออกจาก bundle หลัก',
pluginFlowglassDesc: 'กราฟโฟลว์เซสชันสดพร้อมเลนสามเลนสำหรับผู้ใช้, ผู้ช่วย และการเรียกเครื่องมือ พร้อมกลุ่มขนาน, สาขาตัวแทนย่อย, drill-down และสถานะสด; ลงทะเบียน tab Flowglass แบบ native เมื่อติดตั้ง better-sidebar และคงลิ้นชักสแตนด์อโลนเป็นทางเลือกสำรอง',
pluginGitForgeDesc: 'tab Git Forge: คลังบัญชี GitHub/Gitea (และ forge อื่นๆ) + การอนุญาตต่อโปรเจกต์ + นโยบาย push แบบเข้มงวด; token อยู่ใน secrets ในเครื่อง (ไม่เคยอยู่ในบริบทโมเดล); เครื่องมือ GitForge แบบอ่านอย่างเดียวและตัวช่วย credential HTTPS ของตัวแทน',
pluginGithubWorkbenchDesc: 'แท็บ GitHub Workbench: โครงสร้าง repo รีโมต + Issues / Pull requests / Actions พร้อมรองรับการเขียนครบวงจร — สร้าง Issue/PR, แสดงความคิดเห็น, แก้ไข, ปิด/เปิดใหม่, รวมแบบ squash·merge·rebase (ยืนยันก่อนเสมอ), รัน/ยกเลิก CI ใหม่; ตัวสลับ repo จะดึงรายการ repo ที่มีสิทธิ์เข้าถึงโดยอัตโนมัติและค้นหา repo สาธารณะได้; หากไม่ได้ติดตั้ง better-sidebar จะสลับไปใช้แผงด้านขวาแบบสแตนด์อโลนอัตโนมัติ',
pluginMdExportDesc: 'เพิ่มปุ่ม "ส่งออก" ในแถบเครื่องมือ Markdown ของ better-sidebar: เรนเดอร์ .md ปัจจุบันเป็น HTML แบบสแตนด์อโลนในคลิกเดียว (ตาราง/บล็อกโค้ด/ไดอะแกรม Mermaid แบบอินไลน์ เลย์เอาต์ตามธีมพรีวิว) แล้วบันทึกไว้โฟลเดอร์เดียวกัน หรือส่งออกเป็น PDF ผ่านกล่องโต้ตอบการพิมพ์',
pluginCodeNavDesc: 'การนำทางพรีวิวโค้ด: ระบุภาษาอัตโนมัติจากประเภทไฟล์และไฮไลต์ไวยากรณ์ โครงร่างสัญลักษณ์ (กรองคลาส/เมธอด/ตัวแปร + กระโดดคลิกเดียว) และค้นหาในไฟล์ (ไฮไลต์ทุกจุดที่ตรง ก่อนหน้า/ถัดไป แยกตัวพิมพ์ใหญ่เล็ก) — รับช่วงพรีวิวไฟล์โค้ดในตัวแก้ไข better-sidebar',
pluginSuhuangScrollDesc: 'เชื่อมต่อ Suhuang Scroll Runtime ในเครื่องกับการตั้งค่า DSH และ better-sidebar สำหรับการกำหนดค่าโมเดล การทดสอบการเชื่อมต่อ และการควบคุมการตรวจงานต่อเนื่อง โดยต้องติดตั้ง Suhuang Scroll Runtime และ dsh-better-sidebar',
pluginBetterOverleafDesc: 'แท็บ Overleaf สำหรับ better-sidebar: เข้าสู่ระบบผ่านเบราว์เซอร์ CDP โดยตรง (รองรับ Chromium ของบุคคลที่สาม) รายการ/สลับโปรเจกต์ มิเรอร์ git ภายในเครื่องที่ <workspace>/overleaf/ ซิงก์ git สองทางพร้อมสำรองแบบ API อ่านอย่างเดียว และดูตัวอย่างไฟล์ผ่านเวิร์กเบนช์ของแถบข้าง',
pluginGitRemotesDesc: 'tab Git Remotes: branch/upstream/ahead-behind, fetch (optional prune), ff-only pull และ push หลังการยืนยันใน tab เท่านั้น ไม่แทนที่ tab stage/commit ของ Git แบบ built-in และไม่เสนอ force-push หรือเครื่องมือ auto-push ของโมเดล',
pluginSentinelDesc: 'การปลุกตัวแทนที่ขับเคลื่อนด้วยเงื่อนไข: เซนเซอร์ file/process/port/http/command/webhook ปลุกเซสชันที่หลับเมื่อเงื่อนไขเกิดขึ้น; ลงทะเบียน tab "Sentinel" พร้อมตารางเฝ้าระวังทั่วทั้งเซิร์ฟเวอร์',
pluginServerDeckDesc: 'แดชบอร์ดการ์ดเซิร์ฟเวอร์: การ์ดหนึ่งใบต่อโฮสต์แสดงสถานะออนไลน์ OS เวลาทำงาน การใช้งาน CPU/หน่วยความจำ/ดิสก์ และ latency; คลิกการ์ดเพื่อเปิดเทอร์มินัล xterm.js แบบโต้ตอบ; นำเข้า ~/.ssh/config คลิกเดียว (ข้าม alias ของบริการ Git โฮสติ้งอัตโนมัติ) เมื่อติดตั้ง better-sidebar จะลงทะเบียนแท็บ 「เซิร์ฟเวอร์」 ในตัว หากไม่มีจะคงลิ้นชักอิสระไว้',
pluginSidebarQaDesc: 'เลือกแล้วถาม: เลือกข้อความในแชท → ถามในพาเนลด้านขวา → เซสชันติดตามเฉพาะ (❓追问) ในพื้นที่ทำงานเดียวกัน; โมเดล no-thinking ที่รวดเร็วบีบอัดบริบทหลักและฉีดพร้อมกับคำพูดอ้างอิง โดยไม่หยุดแชทหลัก การติดตามสามารถซ้อน, ทำต่อ และเก็บถาวรได้',
pluginSidenoteDesc: 'แชทข้างแบบ Codex + คำอธิบายประกอบจากการเลือกข้อความ: fork เซสชันปัจจุบันออกไปเป็นแผงข้างแบบถาวร (ถูกเก็บออกจากรายการเซสชัน, รองรับหลายอินสแตนซ์, คำสั่ง /side, อยู่รอดหลังรีโหลด, โมเดลตามเซสชันหลัก); เลือกข้อความของ assistant → badge แสดงหมายเลข + ตัวแก้ไขโน้ต → chip "N คำอธิบายประกอบ" ที่แนบไปกับข้อความถัดไป หรือถามตรง ๆ ในแชทข้างเลย',
pluginSshTunnelDesc: 'tab SSH Tunnel: รายการโฮสต์หลายเครื่อง + การอนุญาตต่อโปรเจกต์ + secrets ในเครื่อง; เครื่องมือ SSHManager (exec/SFTP/กลยุทธ์เซสชัน); เทอร์มินัลโต้ตอบกลางและ SFTP แบบสองพาเนล',
pluginTurnReviewDesc: 'ประตูมนุษย์บนรอบที่เพิ่งเสร็จสิ้น: Approve / Request changes ต่อพาธพร้อมความคิดเห็นที่ไม่บังคับ; พาธจัดกลุ่มตามเซสชันหลัก / ตัวแทนย่อย / ไม่ระบุแหล่งที่มา; diff แบบ snapshot-vs-now อินไลน์ก่อนตัดสินใจ ไม่มีการ fork, ไม่มี /rewind',
pluginVideoPreviewDesc: 'พรีวิววิดีโอแบบอินไลน์ (.mp4/.webm/.mov/.mkv/.avi ฯลฯ) สำหรับตัวแก้ไข better-sidebar โดยสนับสนุนด้วย route /video โฮสต์เฉพาะพร้อมรองรับ HTTP Range (206) — การ scrub ทำงานได้และไฟล์ไม่จำกัดโดย mediaLimit 20MB',
pluginDocsPanelDesc: 'เอกสารส่วนกลางในแถบด้านข้าง DSH: อ่านบันทึก Markdown ของคุณเองจากพื้นที่ทำงานใดๆ — รายการไฟล์, เค้าโครง, เปิดใน Chrome / VS Code และปุ่มคัดลอก; ไดเรกทอรีเอกสารสามารถกำหนดค่าได้ (ค่าเริ่มต้น ~/.dsh/docs)',
pluginEgoBrowserDesc: 'เบราว์เซอร์เอเจนต์สำหรับ DeepSeek Harness: เครื่องมือ ego_* 32 ตัวขับเคลื่อน Chromium จริง แท็บ «ego browser» เนทีฟในแถบด้านข้างแสดงทุกหน้าที่เอเจนต์เยี่ยมชมแบบสด — คลิก ลาก และพิมพ์เพื่อเข้าไปควบคุมแทนได้ ลงทะเบียนแท็บอัตโนมัติเมื่อมี better-sidebar มิฉะนั้นจะใช้บับเบิลลอย',
pluginBilingualReaderDesc: 'อ่าน PDF ในแถบด้านข้าง DSH: แสดง PDF ต้นฉบับ เลือกข้อความเพื่อแปลด้วย LLM พร้อมบริบทและแยกจากการสนทนาหลักโดยสิ้นเชิง',
changesRedactOn: "ซ่อนข้อมูลอยู่: ค่าลับแสดงเป็น [REDACTED]; คลิกเพื่อปิด (ยอมรับความเสี่ยงเอง)",
changesRedactOff: "ปิดการซ่อนข้อมูล: เนื้อหาจะแสดงตามจริง; คลิกเพื่อเปิด",
changesRedactOnLabel: "กำลังซ่อน",
changesRedactOffLabel: "ไม่ซ่อน",
changesRedactBanner: "ถูกซ่อนแล้ว",
pluginSentinelName: 'dsh-sentinel ระบบปลุกเตือน',
pluginEgoBrowserName: 'ego-browser เบราว์เซอร์เอเจนต์',
pluginBetterOverleafName: 'dsh-better-overleaf แท็บ Overleaf',
pluginDocsPanelName: 'dsh-docs-panel เอกสารส่วนกลาง',
pluginFlowglassName: 'dsh-flowglass Flowglass',
pluginGitForgeName: 'dsh-git-forge ข้อมูลรับรอง Git',
pluginGitRemotesName: 'dsh-git-remotes Remote ของ Git',
pluginGithubWorkbenchName: 'dsh-github-workbench เวิร์กเบนช์ GitHub',
pluginSidebarQaName: 'dsh-sidebar-qa เลือกแล้วถาม',
pluginSidenoteName: 'dsh-sidenote แชทข้างเคียง',
pluginServerDeckName: 'dsh-server-deck เด็คเซิร์ฟเวอร์',
pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll',
pluginSshTunnelName: 'dsh-ssh-tunnel อุโมงค์ SSH',
pluginTurnReviewName: 'dsh-turn-review รีวิวรอบ',
pluginBilingualReaderName: 'dsh-bilingual-reader ตัวอ่านสองภาษา',
pluginOfficeName: 'พรีวิว Office',
pluginMdExportName: 'ส่งออก Markdown',
pluginCodeNavName: 'ตัวนำทางพรีวิวโค้ด',
pluginVideoPreviewName: 'พรีวิววิดีโอ',
presetDshDesktopDesc: 'โหมดขั้นสูงของ Electron (ไร้กรอบ): macOS จองแถบด้านบน 20px; Windows จอง 32px ให้แถบหัวเรื่องเมื่อไม่มี WCO',
}