文件页(FileTree/TreePanel)
- Ctrl/Cmd 多选 + Shift 按可见行序连选(Esc/点空白/右键收敛),批量条支持复制路径、批量删除(共享 ConfirmDialog + 顺序 fsRemove)
- Git 变更着色:行名按状态上色 + M/A/D/U 徽标,目录按 dirHasChanges 着色,非仓库静默降级(数据来自共享 git 状态存储)
- 新建文件夹:fs.mkdir 路由 + mkdirWorkspaceEntry + 内联输入行(Enter/Esc/blur/IME 守卫)
- 性能:FileRow/DirRow memo(含反向验证)、搜索 hidden 停车不再卸载树、level 拉取世代守卫 + AbortController、fs.tree truncated 提示、use-dir-watch 入参 memo
- 拖拽上传视觉 token 化(硬编码色清零);可见性下传后隐藏页签停止轮询
- 右键「打开方式」改为复用 DSH 自带 open-in-app(宿主探测的关联应用 + 文件管理器显示)
文件变动页(changes/diff)
- 36px 头(宿主 SegmentedControl)+ 单一 ChangeRow + SectionHeader 分组 + 吸底提交条单状态行 + 历史独立空态
- 修掉:双份空态、暂存失败 unhandled rejection、手动刷新被丢、仓库切换刷新两次、worktree 清单缺 repoRoot、工作树被自动切走、预览持旧快照、恢复高度未 clamp、session ops 无谓轮询
- DiffPane/DiffTab 共用 use-git-diff;修掉 DiffPane 的 untracked 预览从不渲染
全局组件与宿主接入
- 新增 src/client/ui(IconButton/Chip/SectionHeader/Notice/ConfirmDialog/StatusBadge + 共享 git 状态存储)
- 新增 src/client/open-in-app.ts(宿主 open-in-app 客户端适配),删除自研 open-with 全链路与 open.external 路由
- 客户端 inject 补 remote / remote.session:缺声明时 ctx.get('remote').session 会抛出并把整个面板打成错误条(真实挂载 lane 抓到)
- 词典:+25 键 / -20 openWith* / -noChanges,20 份同步
验证:typecheck / lint / test(126 文件 1322 通过)/ build 全绿;
DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过(含 tab sweep 与 perf lane)
505 lines
35 KiB
TypeScript
505 lines
35 KiB
TypeScript
/**
|
||
* The vi (Vietnamese) 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 `'vi'`; 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 Vietnamese appropriate for software UI.
|
||
* - Terminology is kept consistent with the DSH core vi dictionary.
|
||
*/
|
||
|
||
/** The vi dictionary (key-set-equal to zh, enforced by the type annotation in locales.ts). */
|
||
export const vi: Record<string, string> = {
|
||
files: 'Tệp',
|
||
guideDescFiles: 'Duyệt cây tệp của workspace; bấm để xem trước hoặc chỉnh sửa',
|
||
guideDescGit: 'Thay đổi Git và thay đổi tệp của phiên này trong một tab',
|
||
guideDescSubagent: 'Đồ thị quy trình, bảng tác vụ nhóm và tác vụ nền, theo thời gian thực',
|
||
guideDescSidechat: 'Luồng hỏi tiếp độc lập kế thừa ngữ cảnh của phiên này',
|
||
guideDescTerminal: 'Shell thật (xterm + pty), tự kết nối lại',
|
||
guideDescBrowser: 'Trình duyệt nhúng, có thể mở link trong chat',
|
||
changesSessionEmpty: 'Chưa có thao tác tệp nào trong phiên này',
|
||
changesRead: 'Đọc',
|
||
changesMdReading: 'Đọc',
|
||
changesHtmlRender: "Kết xuất",
|
||
changesHtmlRaw: "Nguyên văn",
|
||
changesPdfRender: "Kết xuất",
|
||
changesPdfRaw: "Nguyên văn",
|
||
changesMdRaw: 'Gốc',
|
||
changesWrite: 'Ghi',
|
||
changesEdit: 'Chỉnh sửa',
|
||
changesRunning: 'đang chạy',
|
||
changesError: 'lỗi',
|
||
changesFold: '{count} dòng… bấm để mở rộng',
|
||
changesFoldLoading: 'Đang mở rộng…',
|
||
changesFoldUnavailable: 'Không tải được ngữ cảnh',
|
||
changesContext: 'ngữ cảnh',
|
||
changesPriorUnknown: 'Nội dung trước thay đổi nằm ngoài cửa sổ; hiển thị như toàn bộ mới thêm',
|
||
explorer: 'Trình khám phá',
|
||
terminal: 'Terminal',
|
||
editor: 'Trình soạn thảo',
|
||
editorExplorer: 'Cách mở tệp',
|
||
editorExplorerDesc: 'Kiểm soát cách mở tệp',
|
||
editorExplorerMerged: 'Gộp',
|
||
editorExplorerMergedDesc: 'Tệp chuyển tại chỗ trong cùng cửa sổ; cửa sổ mới mặc định mở cây tệp',
|
||
editorExplorerSplit: 'Riêng biệt',
|
||
editorExplorerSplitDesc: 'Cửa sổ không đường dẫn là trình khám phá (chỉ cây tệp); mỗi tệp mở cửa sổ riêng (có cây tệp, mặc định thu gọn)',
|
||
editorTreeToggle: 'Panel cây tệp',
|
||
editorPathPlaceholder: 'Nhập đường dẫn tệp (tương đối thư mục phiên hoặc tuyệt đối), Enter để mở',
|
||
editorSearchPlaceholder: 'Tìm theo tên tệp…',
|
||
editorSearchNoResults: 'Không có tệp phù hợp',
|
||
editorSearchTruncated: 'Quá nhiều kết quả, chỉ hiển thị một phần',
|
||
editorEmptyHint: 'Chọn tệp từ cây tệp bên phải hoặc ô nhập đường dẫn phía trên để xem trước',
|
||
openFileNewTab: 'Mở trong Tab mới',
|
||
openFileSide: 'Mở ở bên cạnh',
|
||
openInApp: 'Mở bằng',
|
||
openInAppDefault: 'Mở bằng ứng dụng mặc định',
|
||
openInAppEmpty: 'Không có ứng dụng nào mở được tệp này',
|
||
openInAppFailed: 'Không mở được: {path}',
|
||
revealInFileManager: 'Hiển thị trong trình quản lý tệp',
|
||
filesSelected: 'Đã chọn {count}',
|
||
clearSelection: 'Bỏ chọn',
|
||
copyPaths: 'Sao chép đường dẫn',
|
||
deleteSelected: 'Xóa mục đã chọn',
|
||
deleteSelectedTitle: 'Xóa {count} mục đã chọn?',
|
||
deleteSelectedDesc: 'Các tệp và thư mục này sẽ bị xóa vĩnh viễn, không thể khôi phục.',
|
||
newFolder: 'Thư mục mới',
|
||
newFolderPlaceholder: 'Tên thư mục',
|
||
newFolderInvalid: 'Tên thư mục không hợp lệ',
|
||
filesTruncated: 'Thư mục này có quá nhiều mục; chỉ hiển thị phần đầu',
|
||
gitStatusModified: 'Đã sửa',
|
||
gitStatusAdded: 'Đã thêm',
|
||
gitStatusDeleted: 'Đã xóa',
|
||
gitStatusUntracked: 'Chưa theo dõi',
|
||
gitStatusRenamed: 'Đã đổi tên',
|
||
gitStatusConflict: 'Xung đột',
|
||
changesClean: 'Không có thay đổi trong workspace',
|
||
changesNoHistory: 'Chưa có lịch sử commit',
|
||
changesStageFailed: 'Stage thất bại: {message}',
|
||
changesOpGone: 'Thao tác này không còn trong nhật ký phiên',
|
||
newTab: 'Tab mới',
|
||
brokenSymlink: 'Symlink hỏng',
|
||
close: 'Đóng',
|
||
closeOtherTabs: 'Đóng các tab khác',
|
||
closeLeftTabs: 'Đóng tab bên trái',
|
||
closeRightTabs: 'Đóng tab bên phải',
|
||
pinTerminal: 'Ghim Terminal',
|
||
pinAgentTerminal: 'Ghim Terminal Agent',
|
||
pinToWorkspace: 'Ghim vào Workspace',
|
||
pinToGlobal: 'Ghim Toàn cục',
|
||
unpinTerminal: 'Bỏ ghim',
|
||
collapseBottomPanel: 'Thu gọn panel dưới',
|
||
expandBottomPanel: 'Mở rộng panel dưới',
|
||
terminalError: 'Kết nối terminal thất bại',
|
||
terminalConnectFailed: 'Terminal kết nối thất bại nhiều lần',
|
||
terminalRetry: 'Thử lại',
|
||
terminalWaitBanner: 'Agent đang chờ {needle}',
|
||
terminalSkipWait: 'Bỏ qua thời gian chờ',
|
||
terminalDepsFailed: 'Dependency terminal node-pty tải thất bại',
|
||
terminalDepsHint: 'Chạy lệnh sau trong terminal hoặc cmd trên máy DSH để sửa, rồi nhấn thử lại (node-pty đồng bộ phiên bản với lõi DSH):',
|
||
terminalDepsProfile: ' (phát hiện profile: {profile})',
|
||
terminalShellNotFound: 'Không tìm thấy shell đã cấu hình: {name} — kiểm tra đường dẫn shell trong Cài đặt → Side card → Terminal',
|
||
preview: 'Xem trước',
|
||
toc: 'Mục lục',
|
||
edit: 'Chỉnh sửa',
|
||
mermaidError: 'Render Mermaid thất bại',
|
||
mermaidZoomIn: 'Phóng to',
|
||
mermaidZoomOut: 'Thu nhỏ',
|
||
mermaidZoomReset: 'Đặt lại',
|
||
mermaidZoomHint: 'Cuộn để zoom · kéo để di chuyển · Esc để đóng',
|
||
refresh: 'Làm mới',
|
||
showInFolder: 'Hiển thị trong thư mục',
|
||
refreshUnsavedConfirm: 'Tệp đã thay đổi trên đĩa. Làm mới sẽ loại bỏ các chỉnh sửa chưa lưu. Tiếp tục?',
|
||
save: 'Lưu',
|
||
saved: 'Đã lưu',
|
||
unsaved: 'Chưa lưu',
|
||
saveFailed: 'Lưu thất bại',
|
||
truncation: 'Tệp quá lớn, chỉ hiển thị 512KB đầu',
|
||
binary: 'Tệp nhị phân, không xem trước được',
|
||
loading: 'Đang tải…',
|
||
error: 'Tải thất bại',
|
||
retry: 'Thử lại',
|
||
notRepo: 'Thư mục hiện tại không phải repo git',
|
||
statusTruncated: 'Quá nhiều thay đổi; chỉ hiển thị 2000 mục đầu tiên',
|
||
stage: 'Stage',
|
||
unstage: 'Unstage',
|
||
stageAll: 'Stage tất cả',
|
||
unstageAll: 'Unstage tất cả',
|
||
commitPlaceholder: 'Thông điệp commit (Ctrl+Enter)',
|
||
commit: 'Commit',
|
||
branch: 'Branch',
|
||
worktree: 'Worktree',
|
||
checkoutError: 'Chuyển branch thất bại',
|
||
history: 'Lịch sử',
|
||
changes: 'Thay đổi tệp',
|
||
changesGitLens: 'Git',
|
||
changesSessionLens: 'Phiên',
|
||
changesFilterAll: 'Tất cả',
|
||
changesFilterEmpty: 'Không có thao tác thuộc loại này',
|
||
changesOpenDiffTab: 'Mở trong tab diff riêng',
|
||
changesClosePreview: 'Đóng xem trước',
|
||
changesResizePreview: 'Điều chỉnh kích thước xem trước',
|
||
changesLoadError: 'Bản ghi tệp phiên hiện không khả dụng',
|
||
staged: 'Đã stage',
|
||
unstaged: 'Chưa stage',
|
||
cancel: 'Hủy',
|
||
diffEmpty: 'Không có khác biệt văn bản',
|
||
diffLoadError: 'Tải diff thất bại',
|
||
diffBinary: 'Nhị phân',
|
||
diffAdded: 'Thêm',
|
||
diffDeleted: 'Xóa',
|
||
diffRenamed: 'Đổi tên',
|
||
diffExpand: 'Mở rộng {count} dòng còn lại',
|
||
discard: 'Bỏ thay đổi',
|
||
discardTitle: 'Bỏ thay đổi',
|
||
discardDesc: 'Sẽ hủy các thay đổi worktree của «{path}» (không thể khôi phục).',
|
||
viewCommitDiff: 'Xem diff commit',
|
||
copyShortHash: 'Sao chép hash ngắn',
|
||
copyFullHash: 'Sao chép hash đầy đủ',
|
||
copySubject: 'Sao chép thông điệp commit',
|
||
revertCommit: 'Revert commit',
|
||
revertTitle: 'Revert commit',
|
||
revertDesc: 'Sẽ tạo commit mới trên branch hiện tại đảo ngược «{subject}».',
|
||
cherryPickCommit: 'Cherry-pick commit',
|
||
cherryPickTitle: 'Cherry-pick commit',
|
||
cherryPickDesc: 'Áp dụng các thay đổi của «{subject}» lên branch hiện tại.',
|
||
timeJustNow: 'vừa xong',
|
||
timeMinutesAgo: '{n} phút trước',
|
||
timeHoursAgo: '{n} giờ trước',
|
||
timeYesterday: 'hôm qua',
|
||
loadMore: 'Tải thêm',
|
||
historyLoadError: 'Tải thêm lịch sử thất bại',
|
||
produced: 'Đã tạo',
|
||
disconnected: 'Terminal mất kết nối, đang kết nối lại…',
|
||
exited: 'Tiến trình terminal đã thoát',
|
||
noSession: 'Chọn một phiên để dùng thanh bên',
|
||
pluginNotLoaded: 'Plugin chưa tải, tab tạm không khả dụng:',
|
||
parent: 'Thư mục cha',
|
||
copied: 'Đã sao chép',
|
||
copy: 'Sao chép',
|
||
openEditor: 'Mở trình soạn thảo',
|
||
referenceFile: '@tệp',
|
||
addToConversation: 'Thêm vào cuộc trò chuyện',
|
||
copyRelative: 'Sao chép đường dẫn tương đối',
|
||
copyAbsolute: 'Sao chép đường dẫn tuyệt đối',
|
||
rename: 'Đổi tên',
|
||
renameInvalid: 'Tên không được để trống hoặc chứa dấu phân tách đường dẫn.',
|
||
delete: 'Xóa',
|
||
deleteTitle: 'Xóa "{name}"?',
|
||
deleteDescFile: 'Thao tác này sẽ xóa vĩnh viễn tệp. Không thể hoàn tác.',
|
||
deleteDescDir: 'Thao tác này sẽ xóa vĩnh viễn thư mục và toàn bộ nội dung của nó. Không thể hoàn tác.',
|
||
dismiss: 'Đóng',
|
||
download: 'Tải xuống',
|
||
uploadFiles: 'Tải tệp lên',
|
||
uploadFolder: 'Tải thư mục lên',
|
||
uploadHere: 'Tải lên đây',
|
||
uploadDropHint: 'Kéo tệp/thư mục vào đây để tải lên',
|
||
uploadDropChat: 'Kéo vào khu vực chat: thêm hình ảnh vào cuộc trò chuyện',
|
||
uploadTo: 'Tải lên {dir}',
|
||
uploadingTo: 'Đang tải lên {dir}…',
|
||
uploadProgress: 'Đang tải lên {done}/{total}: {name}',
|
||
uploadDone: 'Đã tải lên {count} tệp',
|
||
uploadFailed: 'Tải lên thất bại: {error}',
|
||
uploadFailedUnknown: 'Lỗi không xác định',
|
||
uploadTooLarge: 'Tệp quá lớn, vượt giới hạn tải lên',
|
||
uploadCancelled: 'Đã hủy tải lên',
|
||
settingsNav: 'Thẻ bên',
|
||
settingsIntro: 'Quản lý nội dung hiển thị và hành vi mặc định của thẻ bên',
|
||
settingsPopupDesc: 'Cấu hình tùy chọn cho «{feature}»',
|
||
settingsDone: 'Xong',
|
||
settingsOpenToolsTitle: 'Tiêm công cụ mở thanh bên cho mô hình',
|
||
settingsOpenToolsDesc: 'Khi bật, mô hình có thể mở tệp, thư mục và trang HTTP(S) trong thanh bên qua công cụ sidebar_open (mặc định tắt)',
|
||
settingsTitleBarTitle: 'Chế độ tương thích thanh tiêu đề',
|
||
settingsTitleBarDesc: 'Chọn phương án tương thích thanh tiêu đề: tự động phát hiện (mặc định, bảo thủ) / Web DSH chính thức / shell desktop đã biết / tùy chỉnh (khoảng dịch chuyển + CSS tùy chỉnh)',
|
||
settingsTitleBarStripTitle: 'Khoảng dịch chuyển',
|
||
settingsTitleBarStripDesc: 'Chiều cao dải thanh tiêu đề: số pixel dịch xuống của nút và nội dung thanh bên (0–120, mặc định 40; áp dụng trong chế độ tùy chỉnh)',
|
||
settingsSchemeAutoTitle: 'Tự động phát hiện',
|
||
settingsSchemeAutoDesc: 'Bảo thủ: chỉ nhường chỗ theo chiều cao thanh tiêu đề thật khi API Window Controls Overlay chuẩn khả dụng; môi trường web thuần không sửa gì',
|
||
settingsSchemeWebTitle: 'Web DSH chính thức',
|
||
settingsSchemeWebDesc: 'Khai báo tường minh chạy trên web chính thức: không điều chỉnh gì cả (kể cả hình học WCO chuẩn)',
|
||
settingsSchemeCustomTitle: 'Tùy chỉnh',
|
||
settingsSchemeCustomDesc: 'Toàn quyền kiểm soát: chèn CSS tùy chỉnh (có thể ghi đè style built-in), và chỉ định khoảng dịch chuyển thanh tiêu đề',
|
||
settingsSchemeDetectedSuffix: 'đã phát hiện',
|
||
settingsCustomCssTitle: 'CSS tùy chỉnh',
|
||
settingsCustomCssPlaceholder: '/* vd: dành sẵn 36px cho shell tự vẽ thanh tiêu đề */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
|
||
settingsSaveFailed: 'Lưu thất bại',
|
||
settingsConflict: 'Cài đặt đã bị sửa bởi cửa sổ khác, vui lòng thử lại',
|
||
binaryNoPreview: 'Loại tệp này không hỗ trợ xem trước',
|
||
downloadToView: 'Tải xuống để xem',
|
||
settingsSubagentTitle: 'Tự động kích hoạt trang Quản lý tác vụ khi phát hiện tác nhân con',
|
||
settingsSubagentDesc: 'Khi phiên hiện tại tạo tác nhân con mới, kích hoạt trang Quản lý tác vụ; trên màn hình rộng, thẻ bên cũng được mở rộng; trên màn hình hẹp, ngăn kéo toàn màn hình không bị ép mở; tắt để mở thủ công',
|
||
settingsJobsTitle: 'Tự động kích hoạt trang Quản lý tác vụ khi có tác vụ nền mới',
|
||
settingsJobsDesc: 'Mỗi khi phiên hiện tại có tác vụ nền mới, kích hoạt trang Quản lý tác vụ (mỗi tác vụ mới đều kích hoạt); trên màn hình rộng, thẻ bên cũng được mở rộng; trên màn hình hẹp, ngăn kéo toàn màn hình không bị ép mở; tắt để mở thủ công',
|
||
settingsToolsTitle: 'Tiêm công cụ terminal cho mô hình',
|
||
settingsToolsDesc: 'Khi bật, mô hình có thể tạo và điều khiển terminal thanh bên qua 8 công cụ terminal_* (mặc định tắt)',
|
||
settingsFenceTitle: 'Kiểm tra đường dẫn workspace',
|
||
settingsFenceDesc: 'Khi bật, các tính năng tệp của thanh bên chỉ truy cập đường dẫn trong workspace của phiên (mặc định); khi tắt, mọi tệp trên máy chủ đều có thể truy cập — script trong trang cũng có quyền tương ứng trong thời gian đó',
|
||
fenceErrorReason: 'Đường dẫn này nằm ngoài workspace của phiên và đã bị chặn bởi kiểm tra',
|
||
fenceDisableAction: 'Tắt kiểm tra workspace',
|
||
settingsBottomTerminalTitle: 'Tự động mở terminal khi panel dưới mở rộng lần đầu',
|
||
settingsBottomTerminalDesc: 'Khi panel dưới được mở rộng lần đầu trong phiên, thử mở một tab terminal mới ở panel dưới (giới hạn terminal vẫn áp dụng; mặc định bật)',
|
||
settingsFontFamilyTitle: 'Font terminal',
|
||
settingsFontFamilyDesc: 'Font terminal tùy chỉnh (CSS font-family, vd: "JetBrains Mono", monospace; để trống theo font mono của theme)',
|
||
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
|
||
settingsFontSizeTitle: 'Cỡ chữ terminal',
|
||
settingsFontSizeDesc: 'Cỡ chữ terminal (9–32, mặc định 13)',
|
||
settingsShellTitle: 'Đường dẫn shell',
|
||
settingsShellDesc: 'Shell khởi động cho terminal UI và mô hình (đường dẫn tuyệt đối hoặc tên thực thi). Để trống sẽ phân tích theo thứ tự: yaml config.shell → $SHELL / login shell / powershell.exe trên Windows. Áp dụng cho terminal mở sau đó',
|
||
settingsShellPlaceholder: 'vd: /bin/zsh (để trống = tự động)',
|
||
settingsShellArgsTitle: 'Tham số shell',
|
||
settingsShellArgsDesc: 'Tham số shell tường minh, phân tách bằng dấu cách; khi không trống sẽ thay thế hoàn toàn mặc định (đồng bộ với contract shellArgs yaml)',
|
||
settingsShellArgsPlaceholder: 'vd: -l (để trống = mặc định)',
|
||
settingsTabsTitle: 'Nội dung thanh bên',
|
||
settingsViewersTitle: 'Trình xem tệp',
|
||
settingsMobileTitle: "Di động",
|
||
settingsMobileNoAutoOpenTitle: "Không tự mở trên màn hình hẹp",
|
||
settingsMobileNoAutoOpenDesc: "Trên điện thoại / màn hình hẹp, tác nhân con hay tác vụ nền mới sẽ không tự chuyển sang trang Tác vụ nữa (vẫn mở thủ công được)",
|
||
settingsMobileTreeTitle: "Trang Tác vụ mặc định dạng cây",
|
||
settingsMobileTreeDesc: "Trên điện thoại / màn hình hẹp, trang Tác vụ mở dưới dạng cây cổ điển thay vì sơ đồ quy trình; nút chuyển trong trang vẫn hoạt động",
|
||
settingsGeneralTitle: 'Chung',
|
||
settingsPopup: 'Cài đặt tính năng',
|
||
settingsViewerCatchAll: 'Catch-all: mọi tệp',
|
||
viewerMarkdown: 'Markdown',
|
||
viewerCode: 'Mã',
|
||
viewerHtml: 'HTML',
|
||
browser: 'Trình duyệt',
|
||
browserPlaceholder: 'Nhập URL, vd: example.com',
|
||
browserGo: 'Đi',
|
||
browserBack: 'Lùi',
|
||
browserForward: 'Tiến',
|
||
browserStart: 'Nhập URL để bắt đầu duyệt (chế độ sandbox)',
|
||
browserBlockedScheme: 'Đã chặn: chỉ cho phép link http/https',
|
||
browserBlockedLoopback: 'Đã chặn: không cho phép truy cập địa chỉ cục bộ hoặc nội bộ trong trình duyệt',
|
||
browserInvalid: 'URL không hợp lệ',
|
||
htmlNoSandboxWarning: 'Sandbox đã tắt: HTML này cùng nguồn với UI, có thể đọc tệp phiên và API nội bộ (có thể bật lại trong cài đặt)',
|
||
sandboxStatusOn: 'Chế độ sandbox: đã bật · trang không thể truy cập dữ liệu UI và tệp cục bộ, đăng nhập và cookie bên thứ ba có thể không hoạt động',
|
||
sandboxUnlock: 'Mở khóa tạm (không an toàn)',
|
||
sandboxRestore: 'Khôi phục sandbox',
|
||
settingsHtmlDefaultUnsafeTitle: 'Mở xem trước HTML không sandbox mặc định (không an toàn)',
|
||
settingsHtmlDefaultUnsafeDesc: 'Khi bật, mỗi lần mở tệp HTML xem trước sẽ mặc định không sandbox (cùng nguồn UI, có thể đọc tệp phiên và API nội bộ); có thể khôi phục sandbox tạm thời trên thanh trạng thái',
|
||
settingsHtmlSandboxTitle: 'Tắt sandbox xem trước HTML (không an toàn)',
|
||
settingsHtmlSandboxDesc: 'Khi tắt, HTML xem trước sẽ chạy cùng nguồn với UI: có thể đọc tệp phiên, local storage và gọi API nội bộ. Chỉ bật cho tệp hoàn toàn đáng tin cậy',
|
||
settingsBrowserSandboxTitle: 'Tắt sandbox trình duyệt (không an toàn)',
|
||
settingsBrowserSandboxDesc: 'Khi tắt, mọi trang truy cập sẽ chạy cùng nguồn với UI: có thể đọc dữ liệu phiên và mạo danh phiên đăng nhập. Chỉ bật cho trang hoàn toàn đáng tin cậy',
|
||
settingsBrowserLoopbackTitle: 'Địa chỉ cục bộ được phép',
|
||
settingsBrowserLoopbackDesc: 'Danh sách cho phép phân tách bằng dấu phẩy của địa chỉ loopback (vd. localhost:5174 hoặc 127.0.0.1:8080) mà trình duyệt thanh bên có thể truy cập; để trống sẽ chặn tất cả địa chỉ cục bộ theo mặc định. Hộp cát vẫn áp dụng — các trang không thể đọc dữ liệu GUI',
|
||
settingsBrowserLoopbackPlaceholder: 'vd. localhost:5174, 127.0.0.1:8080',
|
||
browserOpenExternal: 'Mở trong trình duyệt',
|
||
browserEmbedBlocked: '{host} từ chối nhúng',
|
||
browserEmbedBlockedDesc: 'Trang này cấm hiển thị trong trang khác qua X-Frame-Options / frame-ancestors, không thể tải trong thanh bên. Mở trực tiếp trong trình duyệt',
|
||
browserEmbedAnyway: 'Vẫn tải',
|
||
subagent: 'Quản lý tác vụ',
|
||
subagentMainAgent: 'Tác nhân chính',
|
||
subagentEmpty: 'Không có tác nhân con',
|
||
subagentEmptyDesc: 'Tác nhân con do tác nhân chính tạo ra sẽ hiển thị ở đây',
|
||
subagentInactive: 'Nghỉ',
|
||
subagentModeOneShot: 'Một lần',
|
||
subagentModeContinuable: 'Có thể tiếp tục',
|
||
subagentCount: '{count} tác nhân con',
|
||
subagentCountRunning: '{count} tác nhân con · {running} đang chạy',
|
||
subagentThinking: 'Đang suy nghĩ…',
|
||
sideChat: 'Chat bên (beta)',
|
||
sideChatNew: 'Luồng mới',
|
||
sideChatUntitled: 'Luồng mới',
|
||
sideChatEmpty: 'Không có cuộc trò chuyện bên',
|
||
sideChatEmptyDesc: 'Mỗi cuộc trò chuyện bên là một Tab riêng trong thanh tab, kế thừa ngữ cảnh phiên hiện tại, không vào phiên chính',
|
||
sideChatCreating: 'Đang tạo cuộc trò chuyện bên…',
|
||
sideChatRetry: 'Thử lại',
|
||
sideChatThreads: 'Chuyển luồng / mới',
|
||
sideChatSave: 'Lưu thành phiên mới',
|
||
sideChatSaveTitle: 'Nâng luồng này thành phiên cấp cao nhất, xuất hiện trong danh sách phiên chính',
|
||
sideChatSaved: 'Đã lưu thành phiên mới',
|
||
sideChatNoTurn: 'Cần hoàn thành ít nhất một vòng trò chuyện trước khi lưu',
|
||
sideChatPendingDrop: 'Tin nhắn theo dõi chưa hoàn thành cuối cùng sẽ không được đưa vào phiên đã lưu',
|
||
sideChatFirstPlaceholder: 'Hỏi câu đầu tiên — ngữ cảnh đã kế thừa…',
|
||
sideChatComposerPlaceholder: 'Hỏi tiếp…',
|
||
sideChatThinking: 'Đang đào sâu…',
|
||
sideChatThink: 'Suy nghĩ',
|
||
sideChatInjection: 'Đã tiêm ngữ cảnh',
|
||
sideChatSend: 'Gửi',
|
||
sideChatCancelTitle: 'Hủy vòng hiện tại (giữ hàng đợi)',
|
||
sideChatError: 'Lỗi chat bên: {message}',
|
||
sideChatTurnUsage: 'Vào {input} tok · Ra {output} tok',
|
||
sideChatBlockCollapse: 'Thu gọn',
|
||
sideChatBlockCollapseAria: 'Thu gọn',
|
||
sideChatBlockExpand: 'Mở rộng {hidden} dòng',
|
||
sideChatBlockExpandAria: 'Mở rộng thêm {hidden} dòng',
|
||
sideChatBlockSignal: 'Kết thúc bởi tín hiệu: {signal}',
|
||
sideChatBlockExitCode: 'Mã thoát {code}',
|
||
sideChatBlockNoExitCode: "Kết thúc không có mã thoát",
|
||
sideChatBlockRunning: 'Đang chạy',
|
||
sideChatBlockFailed: 'Thất bại',
|
||
sideChatBlockDone: 'Hoàn tất',
|
||
sideChatBlockNoOutput: '(không có đầu ra)',
|
||
codeBlockTitle: 'Khối mã',
|
||
codeBlockWrap: 'Ngắt dòng',
|
||
codeBlockUnwrap: 'Không ngắt dòng',
|
||
sideChatBlockWindow: '{shown} trong {total} dòng',
|
||
sideChatConnDisconnected: 'Mất kết nối',
|
||
sideChatConnConnecting: 'Đang kết nối lại…',
|
||
sideChatConnRecovered: 'Đã khôi phục kết nối',
|
||
sideChatConnReconnectAction: 'Kết nối lại ngay',
|
||
sideChatConnRestartAction: 'Khởi động lại kết nối',
|
||
jobs: 'Tác vụ nền',
|
||
jobsCount: '{count} tác vụ nền',
|
||
jobsCountRunning: '{count} tác vụ nền · {running} đang chạy',
|
||
jobStatusRunning: 'Đang chạy',
|
||
jobStatusStopping: 'Đang dừng',
|
||
jobStatusCompleted: 'Đã hoàn thành',
|
||
jobStatusKilled: 'Đã hủy',
|
||
jobStatusFailed: 'Thất bại',
|
||
jobDurationSeconds: '{seconds}s',
|
||
jobDurationMinutes: '{minutes}m {seconds}s',
|
||
jobDurationHours: '{hours}h {minutes}m',
|
||
jobViewOutput: 'Xem đầu ra',
|
||
jobNoOutput: 'Chưa có đầu ra',
|
||
jobNotReadYet: 'Đang chờ mô hình đọc đầu ra tác vụ này (sau khi mô hình chạy job_output, đầu ra sẽ hiển thị ở đây)',
|
||
jobOutputTruncated: 'Đầu ra quá dài, đã cắt bớt',
|
||
jobOutputError: 'Đọc đầu ra thất bại',
|
||
jobKill: 'Hủy',
|
||
jobKillConfirm: 'Nhấp lại để xác nhận hủy',
|
||
jobKillError: 'Hủy thất bại',
|
||
tasksViewGraph: 'Đồ thị quy trình',
|
||
tasksViewTree: 'Cây',
|
||
tasksViewSwitchToGraph: 'Chuyển sang đồ thị quy trình',
|
||
tasksViewSwitchToTree: 'Chuyển sang chế độ cây',
|
||
settingsViewModeTitle: 'Chế độ xem mặc định của trang tác vụ',
|
||
settingsViewModeDesc: 'Cách trang tác vụ hiển thị khi mở (nút chuyển trên trang vẫn đổi tùy lúc)',
|
||
settingsViewModeGraph: 'Đồ thị quy trình',
|
||
settingsViewModeGraphDesc: 'Đồ thị nút phân tầng với thu phóng và di chuyển',
|
||
settingsViewModeTree: 'Cây',
|
||
settingsViewModeTreeDesc: 'Cây thụt lề cổ điển, điều hướng được bằng bàn phím',
|
||
tasksFoldIdleGroup: 'N waiting',
|
||
tasksFoldIdle: 'Idle {count}',
|
||
tasksFoldCompleted: '✓ {count} hoàn thành',
|
||
tasksFoldOne: 'Gộp vào đã xong',
|
||
tasksFoldExpand: 'Mở rộng các nút đã hoàn thành',
|
||
tasksFoldCollapse: 'Thu gọn các nút đã hoàn thành',
|
||
tasksZoomIn: 'Phóng to',
|
||
tasksZoomOut: 'Thu nhỏ',
|
||
tasksZoomFit: 'Vừa khung vẽ',
|
||
tasksNodeJump: 'Mở bản ghi hội thoại',
|
||
tasksNodeDetail: 'Chi tiết nút',
|
||
workflowRun: 'Quy trình',
|
||
tasksNodeState: 'Trạng thái',
|
||
tasksNodeMode: 'Chế độ',
|
||
tasksNodeModel: 'Mô hình',
|
||
tasksNodeTeamRole: 'Vai trò trong nhóm',
|
||
tasksNodeActivity: 'Hoạt động gần đây',
|
||
tasksStateRunning: 'Đang chạy',
|
||
tasksStateIdle: 'Nhàn rỗi',
|
||
tasksStateProvisioning: 'Provisioning',
|
||
tasksStateDone: 'Hoàn thành',
|
||
tasksStateError: 'Lỗi',
|
||
tasksKindSubagent: 'Tác nhân con',
|
||
tasksKindTeammate: 'Thành viên nhóm',
|
||
tasksKindWorkflow: 'Quy trình',
|
||
taskWindowCreate: 'New task',
|
||
taskWindowDetail: 'Task detail',
|
||
teamBoard: 'Bảng tác vụ nhóm',
|
||
teamChip: 'Nhóm {members} thành viên · {tasks} tác vụ',
|
||
teamTasksEmpty: 'Chưa có tác vụ dùng chung',
|
||
teamTaskCreate: 'Tác vụ mới',
|
||
teamTaskSubject: 'Chủ đề',
|
||
teamTaskDescription: 'Mô tả',
|
||
teamTaskOwner: 'Người phụ trách',
|
||
teamTaskUnowned: 'Chưa nhận',
|
||
teamTaskPending: 'Chờ xử lý',
|
||
teamTaskInProgress: 'Đang tiến hành',
|
||
teamTaskCompleted: 'Hoàn thành',
|
||
teamTaskBlocked: 'Bị chặn',
|
||
teamTaskClaim: 'Claim',
|
||
teamTaskComplete: 'Hoàn tất',
|
||
teamTaskReopen: 'Mở lại',
|
||
teamTaskDelete: 'Xóa',
|
||
teamTaskDeleteConfirm: 'Xác nhận xóa',
|
||
teamTaskEdit: 'Sửa',
|
||
teamTaskSave: 'Lưu',
|
||
teamTaskCancel: 'Hủy',
|
||
teamTaskConflict: 'Tác vụ đã bị người khác thay đổi, đã làm mới',
|
||
teamTaskError: 'Thao tác thất bại: {message}',
|
||
teamTaskDeleted: 'Đã xóa',
|
||
teamTaskActions: 'Thao tác với tác vụ',
|
||
teamTaskDetail: 'Chi tiết tác vụ',
|
||
teamTaskNoDescription: 'Chưa có mô tả — bấm “Sửa” để thêm',
|
||
teamTaskBlockedBy: 'Bị chặn bởi',
|
||
teamTaskSubjectPlaceholder: 'Mô tả việc cần làm trong một dòng',
|
||
teamTaskDescriptionPlaceholder: 'Thông tin bổ sung (không bắt buộc)',
|
||
teamFilterAll: 'Tất cả',
|
||
tasksNodeTasks: 'Tác vụ dùng chung',
|
||
jobCopyOutput: 'Sao chép đầu ra',
|
||
jobCopied: 'Đã sao chép',
|
||
jobFollowTail: 'Theo dòng mới nhất',
|
||
jobDragHint: 'Kéo để di chuyển',
|
||
workflowRunning: 'Đang chạy',
|
||
workflowCompleted: 'Hoàn thành',
|
||
workflowCancelled: 'Đã hủy',
|
||
workflowFailed: 'Thất bại',
|
||
workflowPhaseUnnamed: 'Giai đoạn chưa đặt tên',
|
||
workflowMembers: '{done}/{total} thành viên',
|
||
jobsAutoCollapsed: 'Tự động thu gọn (nhiều agent)',
|
||
catalogLoadFailed: '{count} nhánh không tải được',
|
||
addPluginsTabCard: 'Thêm plugin tab',
|
||
addPluginsTabCardDesc: 'Đăng ký trang thanh bên mới',
|
||
addPluginsViewerCard: 'Thêm plugin xem trước',
|
||
addPluginsViewerCardDesc: 'Đăng ký xem trước loại tệp mới',
|
||
addPluginsTabDesc: 'Trang thanh bên (tab) có thể mở rộng qua plugin. Plugin đăng ký qua service ctx.betterSidebar; nhấp «Cài đặt» để sao chép lệnh cài, dán vào terminal nơi DSH chạy rồi thực thi.',
|
||
addPluginsViewerDesc: 'Trình xem tệp có thể mở rộng qua plugin. Plugin đăng ký qua service ctx.betterSidebar; nhấp «Cài đặt» để sao chép lệnh cài, dán vào terminal nơi DSH chạy rồi thực thi.',
|
||
addPluginsBrowseMore: 'Duyệt thêm plugin trên GitHub (topic: dsh-better-sidebar)',
|
||
addPluginsSearch: 'Tìm theo tên / mô tả plugin…',
|
||
addPluginsNoMatch: 'Không có plugin phù hợp',
|
||
addPluginsRecommended: 'Plugin đề xuất',
|
||
addPluginsEmpty: 'Chưa có plugin nào, hoan nghênh bạn publish plugin dưới GitHub topic',
|
||
openPlugin: 'Mở',
|
||
copyInstall: 'Sao chép lệnh cài',
|
||
pluginOfficeDesc: 'Xem trước bộ Office (.docx / .xlsx / .pptx) cho trình soạn thảo better-sidebar, tách thư viện render Office nặng ra khỏi bundle chính, cài theo nhu cầu',
|
||
pluginFlowglassDesc: 'Biểu đồ luồng phiên theo thời gian thực: ba lane cho user, assistant và tool call, hỗ trợ nhóm song song, nhánh tác nhân con, drill-down từng lớp và trạng thái trực tiếp; sau khi cài better-sidebar đăng ký tab «Flowglass» native, khi chưa cài giữ drawer riêng',
|
||
pluginGitForgeDesc: 'Tab «Git Forge» của better-sidebar: kho tài khoản GitHub/Gitea và Forge khác + cấp quyền theo project + chặn cứng chính sách push; token chỉ lưu secrets cục bộ, không vào ngữ cảnh mô hình; cung cấp công cụ GitForge chỉ đọc và HTTPS credential helper cho agent',
|
||
pluginGithubWorkbenchDesc: 'Tab GitHub Workbench: cây repo từ xa + Issues / Pull requests / Actions với hỗ trợ ghi đầy đủ — tạo Issue/PR, bình luận, chỉnh sửa, đóng/mở lại, merge squash·merge·rebase (xác nhận mạnh), chạy lại/hủy CI; bộ chuyển repo tự liệt kê các repo có quyền truy cập và tìm kiếm repo công khai; khi chưa cài better-sidebar sẽ tự động chuyển sang panel bên phải độc lập',
|
||
pluginMdExportDesc: 'Thêm nút «Xuất» vào thanh công cụ Markdown của better-sidebar: một cú nhấp chuyển .md hiện tại thành HTML độc lập (bảng/khối mã/sơ đồ Mermaid nhúng, bố cục theo theme xem trước) và lưu cạnh tệp .md, hoặc xuất PDF qua hộp thoại in',
|
||
pluginCodeNavDesc: 'Điều hướng xem trước mã: tự nhận diện ngôn ngữ theo loại tệp và tô sáng cú pháp, phác thảo ký hiệu (lọc lớp/phương thức/biến + nhảy một cú nhấp), tìm kiếm trong tệp (tô sáng mọi kết quả, trước/sau, phân biệt hoa thường) — đảm nhận xem trước tệp mã trong trình soạn thảo better-sidebar',
|
||
pluginSuhuangScrollDesc: 'Kết nối Suhuang Scroll Runtime cục bộ với phần cài đặt DSH và better-sidebar để cấu hình mô hình, kiểm tra kết nối và điều khiển chấm bài liên tục; yêu cầu Suhuang Scroll Runtime và dsh-better-sidebar',
|
||
pluginBetterOverleafDesc: 'Tab Overleaf cho better-sidebar: đăng nhập trực tiếp qua trình duyệt CDP (hỗ trợ Chromium bên thứ ba), danh sách/chuyển dự án, mirror git cục bộ trong <workspace>/overleaf/, đồng bộ git hai chiều với dự phòng API chỉ đọc, xem trước tệp qua workbench của thanh bên',
|
||
pluginGitRemotesDesc: 'Tab Git Remotes của better-sidebar: xem branch/upstream/ahead-behind, fetch (có thể prune), pull ff-only, push chỉ sau khi xác nhận trong tab. Không thay thế tab stage/commit Git built-in, cũng không cung cấp force-push hay công cụ auto-push cho mô hình',
|
||
pluginSentinelDesc: 'Hệ thống đánh thức agent theo điều kiện: cảm biến file/process/port/HTTP/command/webhook, khi điều kiện đạt sẽ tự đánh thức phiên ngủ; đăng ký tab «Sentinel» hiển thị bảng giám sát toàn server',
|
||
pluginServerDeckDesc: 'Bảng điều khiển thẻ máy chủ: một thẻ cho mỗi host hiển thị trạng thái trực tuyến, hệ điều hành, thời gian hoạt động, mức dùng CPU/bộ nhớ/ổ đĩa và độ trễ; nhấp vào thẻ để mở terminal xterm.js tương tác; nhập ~/.ssh.config một chạm (tự bỏ qua bí danh dịch vụ lưu trữ Git). Đăng ký tab 「Máy chủ」 gốc khi better-sidebar được cài, ngược lại giữ ngăn kéo độc lập',
|
||
pluginSidebarQaDesc: 'Tab chọn-đoạn-hỏi dựa trên better-sidebar: chọn văn bản trò chuyện → hỏi ở panel phải → phiên theo dõi riêng trong cùng workspace (❓ theo dõi · chủ đề): mô hình nhanh không suy nghĩ nén ngữ cảnh chat chính rồi tiêm cùng trích dẫn, không gián đoạn chat chính; theo dõi có thể lồng nhau, tiếp tục, lưu trữ',
|
||
pluginSidenoteDesc: 'Side chat kiểu Codex + chú thích vùng chọn: fork phiên hiện tại sang một panel bên cố định (được ẩn khỏi danh sách phiên bằng lưu trữ, chạy được nhiều thực thể cùng lúc, lệnh /side, tồn tại qua reload, mô hình bám theo phiên chính); chọn văn bản assistant → badge đánh số + trình soạn chú thích → chip "N chú thích" đính kèm theo tin nhắn tiếp theo, hoặc hỏi thẳng trong side chat',
|
||
pluginSshTunnelDesc: 'Tab «SSH Tunnel» của better-sidebar: danh sách máy đa host + cấp quyền theo project + khóa lưu cục bộ; công cụ mô hình SSHManager (exec/SFTP/chiến lược phiên); terminal tương tác trung tâm và SFTP hai pane',
|
||
pluginTurnReviewDesc: 'Cổng duyệt người cho diff «vừa rồi»: Approve / Request changes theo path kèm comment tùy chọn; path nhóm theo phiên chính / tác nhân con / không rõ nguồn; nhấp file xem diff snapshot đầu vòng vs hiện tại. Không fork, không /rewind',
|
||
pluginVideoPreviewDesc: 'Xem trước video inline trong trình soạn thảo better-sidebar (.mp4/.webm/.mov/.mkv/.avi v.v.), có route host /video hỗ trợ HTTP Range (206), có thể tua tiến độ, không bị giới hạn mediaLimit 20MB',
|
||
pluginDocsPanelDesc: '«Tài liệu toàn cục» trong thanh bên DSH: ghi chú Markdown toàn cục, đọc từ bất kỳ workspace nào — danh sách chọn để đọc, outline hover để nhảy, mở ngoài trong Chrome / VS Code, sao chép code, thư mục cấu hình được (mặc định ~/.dsh/docs)',
|
||
pluginEgoBrowserDesc: 'Trình duyệt agent cho DeepSeek Harness: 32 công cụ ego_* điều khiển Chromium thật; tab «ego browser» gốc trong thanh bên hiển thị trực tiếp mọi trang agent truy cập — bạn có thể bấm, kéo và gõ để tiếp quản. Tự động đăng ký tab khi có better-sidebar, nếu không thì rơi về bong bóng nổi',
|
||
pluginBilingualReaderDesc: 'Đọc PDF trong thanh bên DSH: hiển thị PDF gốc, chọn văn bản để dịch bằng LLM, dùng ngữ cảnh và hoàn toàn tách biệt khỏi cuộc trò chuyện chính',
|
||
changesRedactOn: "Đang làm mờ: giá trị nhạy cảm hiển thị [REDACTED]; nhấp để tắt (tự chịu rủi ro)",
|
||
changesRedactOff: "Đã tắt làm mờ: nội dung hiển thị nguyên bản; nhấp để bật",
|
||
changesRedactOnLabel: "Đang làm mờ",
|
||
changesRedactOffLabel: "Không làm mờ",
|
||
changesRedactBanner: "Đã làm mờ",
|
||
pluginSentinelName: 'dsh-sentinel Hệ thống đánh thức',
|
||
pluginEgoBrowserName: 'ego-browser Trình duyệt agent',
|
||
pluginBetterOverleafName: 'dsh-better-overleaf Tab Overleaf',
|
||
pluginDocsPanelName: 'dsh-docs-panel Tài liệu toàn cục',
|
||
pluginFlowglassName: 'dsh-flowglass Flowglass',
|
||
pluginGitForgeName: 'dsh-git-forge Thông tin đăng nhập Git',
|
||
pluginGitRemotesName: 'dsh-git-remotes Remote Git',
|
||
pluginGithubWorkbenchName: 'dsh-github-workbench Bàn làm việc GitHub',
|
||
pluginSidebarQaName: 'dsh-sidebar-qa Chọn & hỏi',
|
||
pluginSidenoteName: 'dsh-sidenote Trò chuyện bên',
|
||
pluginServerDeckName: 'dsh-server-deck Bảng máy chủ',
|
||
pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll',
|
||
pluginSshTunnelName: 'dsh-ssh-tunnel Đường hầm SSH',
|
||
pluginTurnReviewName: 'dsh-turn-review Duyệt vòng',
|
||
pluginBilingualReaderName: 'dsh-bilingual-reader Trình đọc song ngữ',
|
||
pluginOfficeName: 'Xem trước Office',
|
||
pluginMdExportName: 'Xuất Markdown',
|
||
pluginCodeNavName: 'Trình điều hướng xem trước mã',
|
||
pluginVideoPreviewName: 'Xem trước video',
|
||
presetDshDesktopDesc: 'Chế độ Electron nâng cao (không viền): macOS dành 20px ở trên cùng; Windows dành 32px cho thanh tiêu đề khi không có WCO',
|
||
}
|