宿主 MarkdownText 出于聊天安全把 raw HTML 按字面文本渲染,预览 GitHub 风格 README(徽章墙 div、details 折叠块内嵌 markdown、表格单元格内联 标签、video/picture)时全是源码文本。本次在不动渲染器的前提下: - markdown-html.ts(纯函数):fence 感知切分器把文档切成 markdown/html 段(CommonMark type-6 块级标签名单 + 注释段 + 空行终止);段内标签 tokenizer 归约 open/close/html parts;全文档引用定义收集(每段追加 保持 [text][id] 跨段语义) - MarkdownHtml.tsx:DOMPurify 白名单消毒(显式禁 script/iframe/form 等;a 强制 _blank+noopener;本地媒体 src 经 /sidebar/file 重写); MarkdownDocument 帧栈状态机让 <details> 跨段嵌套内部 markdown; MarkdownSegment 内联替换(MutationObserver 幂等 pass,把表格单元格 等处标签文本消毒还原为元素,纯散文不误伤) - md-toc.tsx:零高度 sticky 浮动目录按钮(≥3 标题)+ 弹出大纲,跳转 平滑滚动 + 自动展开折叠 details + 高亮闪现。关键修复:子组件读父 ref 在 React layout 阶段恒为 null(子先于父),改为经自身 bar ref 的 parentElement 定位容器(jsdom 单测传预填 ref 掩盖了该 bug,仅 真实挂载 e2e 抓到) - 纯 markdown 文档走原单次解析路径零变化(现有 mermaid e2e 守卫一字 不动);新增 readme-style.md 种子 + 探针(消毒渲染/嵌套/内联/TOC 全链路);19 语言词典新增 toc 键;dompurify 提升为直接依赖(与 mermaid 传递依赖去重单版本) 设计文档 docs/plans/2026-08-24-markdown-html-toc-design.md
351 lines
38 KiB
TypeScript
351 lines
38 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: 'ไฟล์',
|
|
explorer: 'ตัวสำรวจ',
|
|
git: 'การควบคุมซอร์ส',
|
|
terminal: 'เทอร์มินัล',
|
|
editor: 'ตัวแก้ไข',
|
|
editorExplorer: 'พฤติกรรมการเปิดไฟล์',
|
|
editorExplorerDesc: 'ควบคุมวิธีเปิดไฟล์',
|
|
editorExplorerMerged: 'รวม',
|
|
editorExplorerMergedDesc: 'ไฟล์สลับในตำแหน่งเดิมในหน้าต่างเดียวกัน; หน้าต่างใหม่เริ่มต้นด้วยต้นไม้ไฟล์ที่เปิดอยู่',
|
|
editorExplorerSplit: 'แยก',
|
|
editorExplorerSplitDesc: 'หน้าต่างที่ไม่มีพาธคือตัวสำรวจแบบสแตนด์อโลน (ต้นไม้ไฟล์เท่านั้น); แต่ละไฟล์เปิดหน้าต่างของตัวเอง (ต้นไม้ไฟล์ docked, ปิดเป็นค่าเริ่มต้น)',
|
|
editorTreeToggle: 'พาเนลต้นไม้ไฟล์',
|
|
editorPathPlaceholder: 'พาธไฟล์ (สัมพันธ์กับไดเรกทอรีเซสชันหรือแบบ absolute), Enter เพื่อเปิด',
|
|
editorSearchPlaceholder: 'ค้นหาไฟล์ตามชื่อ…',
|
|
editorSearchNoResults: 'ไม่มีไฟล์ที่ตรง',
|
|
editorSearchTruncated: 'ผลลัพธ์มากเกินไป — แสดงเพียงบางส่วน',
|
|
editorEmptyHint: 'เลือกไฟล์จากพาเนลต้นไม้ไฟล์หรือช่องกรอกพาธด้านบนเพื่อเริ่มพรีวิว',
|
|
openFileNewTab: 'เปิดใน Tab ใหม่',
|
|
openFileSide: 'เปิดด้านข้าง',
|
|
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:// จะไม่ปรากฏในเมนู',
|
|
newTab: 'Tab ใหม่',
|
|
openExplorer: 'ตัวสำรวจ',
|
|
brokenSymlink: 'Symlink เสีย',
|
|
openGit: 'พาเนล Git',
|
|
newTerminal: 'เทอร์มินัลใหม่',
|
|
terminalLimit: 'ถึงขีดจำกัดเทอร์มินัลแล้ว (3)',
|
|
close: 'ปิด',
|
|
closeOtherTabs: 'ปิด Tab อื่น',
|
|
closeLeftTabs: 'ปิด Tab ด้านซ้าย',
|
|
closeRightTabs: 'ปิด Tab ด้านขวา',
|
|
moveToFreeWindow: 'ย้ายไปยังหน้าต่างอิสระ',
|
|
floatDropHint: 'ปล่อยเพื่อเปิดในหน้าต่างอิสระ',
|
|
dockToSidebar: 'กลับไปที่แถบข้าง',
|
|
collapse: 'ย่อแถบด้านข้าง',
|
|
expand: 'ขยายแถบด้านข้าง',
|
|
collapseBottomPanel: 'ย่อพาเนลด้านล่าง',
|
|
expandBottomPanel: 'ขยายพาเนลด้านล่าง',
|
|
terminalError: 'การเชื่อมต่อเทอร์มินัลล้มเหลว',
|
|
terminalConnectFailed: 'เทอร์มินัลเชื่อมต่อล้มเหลวหลายครั้ง',
|
|
terminalRetry: 'ลองอีกครั้ง',
|
|
terminalDepsFailed: 'การอ้างอิงเทอร์มินัล node-pty โหลดล้มเหลว',
|
|
terminalDepsHint: 'เรียกใช้คำสั่งด้านล่างในเทอร์มินัลหรือ cmd บนเครื่อง DSH เพื่อซ่อมแซม แล้วกดลองอีกครั้ง (node-pty ต้องซิงค์กับเวอร์ชันหลักของ DSH):',
|
|
terminalDepsProfile: ' (ตรวจพบ profile: {profile})',
|
|
preview: 'พรีวิว',
|
|
toc: 'สารบัญ',
|
|
edit: 'แก้ไข',
|
|
mermaidError: 'เรนเดอร์ Mermaid ล้มเหลว',
|
|
mermaidZoomIn: 'ซูมเข้า',
|
|
mermaidZoomOut: 'ซูมออก',
|
|
mermaidZoomReset: 'รีเซ็ต',
|
|
mermaidZoomHint: 'เลื่อนเพื่อซูม · ลากเพื่อแพน · Esc เพื่อปิด',
|
|
refresh: 'รีเฟรช',
|
|
save: 'บันทึก',
|
|
saved: 'บันทึกแล้ว',
|
|
unsaved: 'ยังไม่ได้บันทึก',
|
|
saveFailed: 'บันทึกล้มเหลว',
|
|
truncation: 'ไฟล์ใหญ่เกินไป — แสดงเพียง 512KB แรก',
|
|
binary: 'ไฟล์ไบนารี ไม่สามารถพรีวิวได้',
|
|
loading: 'กำลังโหลด…',
|
|
error: 'โหลดล้มเหลว',
|
|
retry: 'ลองอีกครั้ง',
|
|
splitLeft: 'แยกซ้าย',
|
|
splitRight: 'แยกขวา',
|
|
splitUp: 'แยกขึ้น',
|
|
splitDown: 'แยกลง',
|
|
notRepo: 'ไดเรกทอรีนี้ไม่ใช่ git repository',
|
|
noChanges: 'ไม่มีการเปลี่ยนแปลง',
|
|
stage: 'Stage',
|
|
unstage: 'Unstage',
|
|
stageAll: 'Stage ทั้งหมด',
|
|
unstageAll: 'Unstage ทั้งหมด',
|
|
commitPlaceholder: 'ข้อความ commit (Ctrl+Enter)',
|
|
commit: 'Commit',
|
|
commitError: 'Commit ล้มเหลว',
|
|
branch: 'Branch',
|
|
worktree: 'เวิร์กทรี',
|
|
checkoutError: 'สลับ branch ล้มเหลว',
|
|
history: 'ประวัติ',
|
|
changes: 'การเปลี่ยนแปลง',
|
|
staged: 'Staged',
|
|
unstaged: 'Unstaged',
|
|
cancel: 'ยกเลิก',
|
|
diffEmpty: 'ไม่มีการเปลี่ยนแปลงข้อความ',
|
|
diffLoadError: 'โหลด diff ล้มเหลว',
|
|
diffBinary: 'ไบนารี',
|
|
diffAdded: 'เพิ่ม',
|
|
diffDeleted: 'ลบ',
|
|
diffRenamed: 'เปลี่ยนชื่อ',
|
|
diffExpand: 'ขยายอีก {count} บรรทัด',
|
|
diffCollapse: 'ย่อ',
|
|
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: 'ผลลัพธ์ที่สร้าง',
|
|
producedOpen: 'เปิดในแถบด้านข้าง',
|
|
disconnected: 'เทอร์มินัลถูกตัดการเชื่อมต่อ กำลังเชื่อมต่อใหม่…',
|
|
exited: 'กระบวนการเทอร์มินัลออกแล้ว',
|
|
noSession: 'เลือกแชทเพื่อใช้แถบด้านข้าง',
|
|
pluginNotLoaded: 'ปลั๊กอินไม่ได้โหลด; tab ไม่พร้อมใช้งาน:',
|
|
hiddenFiles: 'ไฟล์ที่ซ่อนอยู่',
|
|
parent: 'ไดเรกทอรีหลัก',
|
|
copied: 'คัดลอกแล้ว',
|
|
copy: 'คัดลอก',
|
|
newFile: 'ไฟล์ใหม่',
|
|
openEditor: 'เปิดตัวแก้ไข',
|
|
gitDetail: 'ดูรายละเอียดการเปลี่ยนแปลง',
|
|
referenceFile: '@ไฟล์',
|
|
addToConversation: 'เพิ่มไปยังแชท',
|
|
copyRelative: 'คัดลอกพาธสัมพัทธ์',
|
|
copyAbsolute: 'คัดลอกพาธ absolute',
|
|
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: 'เสร็จสิ้น',
|
|
settingsOpenTitle: 'เปิดโดยค่าเริ่มต้นสำหรับแชทใหม่',
|
|
settingsOpenDesc: 'ขยายการ์ดด้านข้างโดยอัตโนมัติสำหรับแชทใหม่; แชทที่มีอยู่แล้วยังคงเค้าโครงของตัวเอง',
|
|
settingsWidthTitle: 'สัดส่วนความกว้างเริ่มต้น',
|
|
settingsWidthDesc: 'สัดส่วนความกว้างเริ่มต้นของการ์ดด้านข้างจากความกว้างหน้าต่างสำหรับแชทใหม่ (20–60)',
|
|
settingsWidthSuffix: '%',
|
|
settingsOpenPathTitle: 'เปิดไฟล์แชทในแถบด้านข้าง',
|
|
settingsOpenPathDesc: 'เปิดลิงก์ไฟล์ในแชท (แถวเครื่องมือ, ไฟล์ที่สร้าง, การกล่าวถึง) ในตัวแก้ไขแถบด้านข้างแทนแอปเริ่มต้นของระบบ',
|
|
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 ที่กำหนดเอง',
|
|
settingsCustomCssDesc: 'สไตล์ที่เพิ่มต่อท้ายหน้า (ที่มาทีหลังใน cascade ชนะ; ใช้ !important เพื่อแทนที่ตัวแปร inline ที่เขียนโดย JS)',
|
|
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: 'เปิดหน้า Jobs อัตโนมัติเมื่อมีงานเบื้องหลังใหม่',
|
|
settingsJobsDesc: 'ขยายการ์ดด้านข้างและเปิดหน้า Jobs เมื่อใดก็ตามที่มีงานเบื้องหลังใหม่ปรากฏสำหรับแชทปัจจุบัน (ทุกงานใหม่จะทริกเกอร์); ปิดเพื่อเปิดเอง',
|
|
settingsToolsTitle: 'ฉีดเครื่องมือเทอร์มินัลสำหรับโมเดล',
|
|
settingsToolsDesc: 'เมื่อเปิดใช้ โมเดลสามารถสร้างและควบคุมเทอร์มินัลแถบด้านข้างผ่านเครื่องมือ terminal_* 8 ตัว (ปิดเป็นค่าเริ่มต้น)',
|
|
settingsBottomTerminalTitle: 'เปิดเทอร์มินัลอัตโนมัติเมื่อพาเนลล่างขยายครั้งแรก',
|
|
settingsBottomTerminalDesc: 'เมื่อพาเนลล่างถูกขยายครั้งแรกในเซสชัน ลองเปิด tab เทอร์มินัลใหม่ที่นั่น (โควต้าเทอร์มินัลยังคงมีผล; เปิดเป็นค่าเริ่มต้น)',
|
|
settingsFontFamilyTitle: 'ฟอนต์เทอร์มินัล',
|
|
settingsFontFamilyDesc: 'ฟอนต์เทอร์มินัลที่กำหนดเอง (CSS font-family stack เช่น "JetBrains Mono", monospace; ปล่อยว่างเพื่อตามฟอนต์ monospace ของธีม)',
|
|
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
|
|
settingsFontSizeTitle: 'ขนาดฟอนต์เทอร์มินัล',
|
|
settingsFontSizeDesc: 'ขนาดฟอนต์เทอร์มินัลเป็น px (9–32, ค่าเริ่มต้น 13)',
|
|
settingsFontSizeSuffix: 'px',
|
|
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: 'ตัวพรีวิวไฟล์',
|
|
settingsGeneralTitle: 'ทั่วไป',
|
|
settingsPopup: 'การตั้งค่าคุณสมบัติ',
|
|
settingsViewerCatchAll: 'Catch-all: ไฟล์ใดๆ',
|
|
viewerImage: 'รูปภาพ',
|
|
viewerPdf: 'PDF',
|
|
viewerMarkdown: 'Markdown',
|
|
viewerCode: 'โค้ด',
|
|
viewerBinary: 'ดาวน์โหลดไบนารี',
|
|
viewerHtml: 'HTML',
|
|
browser: 'เบราว์เซอร์',
|
|
browserPlaceholder: 'กรอก URL เช่น example.com',
|
|
browserGo: 'ไป',
|
|
browserBack: 'ย้อนกลับ',
|
|
browserForward: 'ไปข้างหน้า',
|
|
browserStart: 'กรอก URL เพื่อเริ่มเรียกดู (โหมดแซนด์บ็อกซ์)',
|
|
browserBlockedScheme: 'ถูกบล็อก: อนุญาตเฉพาะ URL http/https เท่านั้น',
|
|
browserBlockedLoopback: 'ถูกบล็อก: ไม่สามารถเรียกดูที่อยู่ภายในเครื่องและภายในได้ที่นี่',
|
|
browserInvalid: 'URL ไม่ถูกต้อง',
|
|
browserNoSandboxWarning: 'แซนด์บ็อกซ์ปิด: หน้าปัจจุบันทำงานด้วยสิทธิ์ GUI เต็มรูปแบบ (เปิดใช้ใหม่ได้ในการตั้งค่า)',
|
|
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: สามารถอ่านข้อมูลเซสชันและแสดงเป็นเซสชันล็อกอินของคุณได้ เปิดใช้เฉพาะสำหรับไซต์ที่เชื่อถือได้อย่างเต็มที่',
|
|
settingsBrowserLinksTitle: 'เปิดลิงก์ภายนอกของแชทในแถบด้านข้าง',
|
|
settingsBrowserLinksDesc: 'เมื่อเปิด การคลิกลิงก์ภายนอกในแชทหรือ GUI จะเปิดแถบด้านข้างแทนหน้าต่างใหม่; HTTP และ HTTPS ถูกควบคุมแยกโดยสวิตช์ด้านล่าง; Ctrl/Cmd+click จะข้ามเสมอ',
|
|
settingsBrowserHttpTitle: 'เปิดหน้า HTTP ในแถบด้านข้าง',
|
|
settingsBrowserHttpDesc: 'เมื่อเปิด การคลิกลิงก์ HTTP ภายนอกในแชทหรือ GUI จะเปิดแถบด้านข้าง (หน้าปลั๊กอินที่ประกาศ urlTarget win มีความสำคัญก่อน); Ctrl/Cmd+click จะข้ามเสมอ',
|
|
settingsBrowserHttpsTitle: 'เปิดหน้า HTTPS ในแถบด้านข้าง',
|
|
settingsBrowserHttpsDesc: 'เมื่อเปิด การคลิกลิงก์ HTTPS ภายนอกในแชทหรือ GUI จะเปิดแถบด้านข้าง ปิดเป็นค่าเริ่มต้น: ไซต์ HTTPS ส่วนใหญ่ปฏิเสธที่จะฝัง ดังนั้นเบราว์เซอร์ระบบจะราบรื่นกว่าเป็นค่าเริ่มต้น',
|
|
browserOpenExternal: 'เปิดในเบราว์เซอร์',
|
|
browserEmbedBlocked: '{host} ปฏิเสธที่จะถูกฝัง',
|
|
browserEmbedBlockedDesc: 'ไซต์ห้ามไม่ให้แสดงภายในหน้าอื่น (X-Frame-Options / frame-ancestors) จึงไม่สามารถโหลดในแถบด้านข้างได้ เปิดโดยตรงในเบราว์เซอร์ของคุณแทน',
|
|
browserEmbedAnyway: 'โหลดต่อไป',
|
|
subagent: 'งาน',
|
|
openSubagent: 'งาน',
|
|
subagentMainAgent: 'ตัวแทนหลัก',
|
|
subagentEmpty: 'ไม่มีตัวแทนย่อย',
|
|
subagentEmptyDesc: 'ตัวแทนย่อยที่สร้างภายใต้ตัวแทนหลักจะปรากฏที่นี่',
|
|
subagentRunning: 'กำลังทำงาน',
|
|
subagentInactive: 'ไม่ได้ทำงาน',
|
|
subagentModeOneShot: 'ครั้งเดียว',
|
|
subagentModeContinuable: 'ทำต่อได้',
|
|
subagentCount: '{count} ตัวแทนย่อย',
|
|
subagentCountRunning: '{count} ตัวแทนย่อย · {running} กำลังทำงาน',
|
|
subagentDiagCorrupt: 'เสียหาย',
|
|
subagentDiagUnsupported: 'ไม่รองรับ',
|
|
subagentDiagUnavailable: 'ไม่พร้อมใช้งาน',
|
|
subagentThinking: 'กำลังคิด…',
|
|
sideChat: 'แชทด้านข้าง (เบต้า)',
|
|
sideChatNew: 'เธรดใหม่',
|
|
sideChatUntitled: 'เธรดใหม่',
|
|
sideChatEmpty: 'ไม่มีแชทด้านข้าง',
|
|
sideChatEmptyDesc: 'แชทด้านข้างทุกรายการคือ tab ของตัวเองในแถบ tab — สืบทอดบริบทของเซสชันปัจจุบันและไม่เข้าสู่แชทหลัก',
|
|
sideChatCreating: 'กำลังสร้างแชทด้านข้าง…',
|
|
sideChatRetry: 'ลองอีกครั้ง',
|
|
sideChatThreads: 'สลับเธรด / ใหม่',
|
|
sideChatSave: 'บันทึกเป็นเซสชันใหม่',
|
|
sideChatSaveTitle: 'เลื่อนเธรดนี้เป็นเซสชันระดับบนสุดในรายการเซสชันหลัก',
|
|
sideChatSaved: 'บันทึกเป็นเซสชันใหม่แล้ว',
|
|
sideChatNoTurn: 'การบันทึกพร้อมใช้งานหลังจากรอบแรกเสร็จสมบูรณ์',
|
|
sideChatPendingDrop: 'การติดตามที่ยังไม่ได้ตอบครั้งสุดท้ายจะไม่รวมในเซสชันที่บันทึก',
|
|
sideChatFirstPlaceholder: 'ถามคำถามแรก — บริบทที่สืบทอด…',
|
|
sideChatComposerPlaceholder: 'ถามติดตาม…',
|
|
sideChatThinking: 'กำลังดำดิ่ง…',
|
|
sideChatThink: 'กำลังคิด',
|
|
sideChatInjection: 'แทรกบริบทแล้ว',
|
|
sideChatSend: 'ส่ง',
|
|
sideChatCancel: 'หยุด',
|
|
sideChatCancelTitle: 'ยกเลิกการทำงานรอบปัจจุบัน (งานในคิวยังคงอยู่)',
|
|
sideChatClose: 'ปิดเธรด',
|
|
sideChatCloseTitle: 'ปล่อยตัวแทนของเธรด (ประวัติยังคงอยู่)',
|
|
sideChatError: 'ข้อผิดพลาดแชทด้านข้าง: {message}',
|
|
jobs: 'งานเบื้องหลัง',
|
|
jobsCount: '{count} งานเบื้องหลัง',
|
|
jobsCountRunning: '{count} งานเบื้องหลัง · {running} กำลังทำงาน',
|
|
jobStatusRunning: 'กำลังทำงาน',
|
|
jobStatusStopping: 'กำลังหยุด',
|
|
jobStatusCompleted: 'เสร็จสิ้น',
|
|
jobStatusKilled: 'ถูก kill',
|
|
jobStatusFailed: 'ล้มเหลว',
|
|
jobDurationSeconds: '{seconds} วิ',
|
|
jobDurationMinutes: '{minutes} นาที {seconds} วิ',
|
|
jobDurationHours: '{hours} ชม. {minutes} นาที',
|
|
jobViewOutput: 'ดูเอาต์พุต',
|
|
jobHideOutput: 'ซ่อนเอาต์พุต',
|
|
jobNoOutput: 'ยังไม่มีเอาต์พุต',
|
|
jobNotReadYet: 'รอให้โมเดลอ่านงานนี้; เอาต์พุตจะปรากฏที่นี่เมื่อโมเดลเรียก job_output',
|
|
jobOutputTruncated: 'เอาต์พุตถูกตัดทิ้ง',
|
|
jobOutputError: 'โหลดเอาต์พุตล้มเหลว',
|
|
jobKill: 'Kill',
|
|
jobKillConfirm: 'คลิกอีกครั้งเพื่อยืนยันการ kill',
|
|
jobKillError: 'Kill ล้มเหลว',
|
|
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 ของตัวแทน',
|
|
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" พร้อมตารางเฝ้าระวังทั่วทั้งเซิร์ฟเวอร์',
|
|
pluginSidebarQaDesc: 'เลือกแล้วถาม: เลือกข้อความในแชท → ถามในพาเนลด้านขวา → เซสชันติดตามเฉพาะ (❓追问) ในพื้นที่ทำงานเดียวกัน; โมเดล no-thinking ที่รวดเร็วบีบอัดบริบทหลักและฉีดพร้อมกับคำพูดอ้างอิง โดยไม่หยุดแชทหลัก การติดตามสามารถซ้อน, ทำต่อ และเก็บถาวรได้',
|
|
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)',
|
|
}
|