The fork was pinned at upstream v0.18.0. That is the entire reason the window
ran TWO sidebars and TWO near-identical panel toggles: DSH 2.0.10 ships its own
right sidebar (@deepseek-ai/dsh-client-ui-sidebar-right), and upstream only
adopted it in v0.19.0-alpha.1 — which arrived after our fork point. v0.19.1 is
also the one upstream line whose support range actually matches our host
(engines.dsh >=0.1.5-rc.1, 14 DSH peers ^0.1.5-rc.1, host = 0.1.5-rc.2), so it
is the only tag the host's startup precheck accepts.
What upstream v0.18.0 → v0.19.1 brings
- src/client/native/{index,surface,tab-adapter}.tsx: every tab the plugin can
draw becomes an OFFICIAL native tab type + body, and an external plugin's
descriptor registered later gets its native type too. This is what retires
the fork's own right panel — and with it the duplicate toggle cluster
(`toggleCluster` is gone from v0.19.1).
- native tab-chip icons via the `sidebar.right.pane.tab.title` seat, coloured
built-in tab icons, file/folder glyphs from DSH's own `FileTypeIcon`.
- guide descriptions (DSH renders them while the guide lists <= 4 entries),
tab bodies that fill the panel, and the 0.1.5-rc.2 adaptation work we were
carrying by hand (peer/devDep pinning, primitives' transitive devDeps).
How the sync was done
Rebuilt the tree from the v0.19.1 tag rather than resolving 53 conflicted
files: our v0.18.0 delta was measured first and is only (a) one mechanical
rename `dsh-better-sidebar` -> `dsh-apes-sidebar` and (b) ten real edits. So:
tag tree + rename (scoped: code/config/scripts/tests/README, while the 46
historical docs/plans records and switch.sh's upstream package name stay
untouched) + re-applied deltas + our apes module.
Fork deltas re-applied on the new base
- src/client/apes/ (icons / locales / tabs): the three apes:* information-layer
tabs (agents / apps / profile), registered through the same BetterSidebarService
as the builtins — which is exactly why they now ride upstream's native adapter
into the official sidebar for free.
- identity: package.json (name/version 1.2.0/description/forkedFrom), dsh.plugin.json
(id/version), SIDEBAR_SERVICE_VERSION 1.2.0, README fork notice,
docs/external-plugin-guide.md.
- scripts/switch.sh + the pnpm switch* scripts (apes <-> upstream two-line switch).
- tests/apes-tabs.spec.ts (unescaped: it starts from the v0.19.1 base).
Dropped
- the Phase A native-registration spike (`apes/native-tabs.tsx` + its spec): it
re-derived by hand exactly what upstream's native layer already does — the
hand-written bridge is dead weight now, and v0.19.1's own e2e/jsdom lanes
cover the same seat contract far better.
- the unused apesProfileGuideDesc key and the two package.json.bak.* backups.
Verified on the new base: typecheck clean; build clean; 1351 passed / 9 skipped
(128 files), up from 1255 on the old base.
458 lines
34 KiB
TypeScript
458 lines
34 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: 'Sơ đồ subagent 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',
|
||
openWithMenu: 'Mở bằng',
|
||
openWithSshSuffix: ' (SSH)',
|
||
pinOpenWith: 'Ghim vào menu',
|
||
unpinOpenWith: 'Bỏ ghim',
|
||
openWithExplorer: 'Trình quản lý tệp',
|
||
openWithVscode: 'VS Code',
|
||
openWithCursor: 'Cursor',
|
||
openWithZed: 'Zed',
|
||
openWithSettingsSshTitle: 'Máy chủ từ xa SSH',
|
||
openWithSettingsSshDesc: 'Để trống cho không gian làm việc cục bộ; nhập user@host hoặc alias SSH, các trình mở họ VSCode sẽ chuyển sang giao thức vscode-remote/ssh-remote, Trình quản lý tệp / Zed / trình soạn thảo tùy chỉnh không phải VSCode sẽ ẩn khỏi menu',
|
||
openWithSettingsSshPlaceholder: 'user@host hoặc alias SSH',
|
||
openWithSettingsCustomTitle: 'Trình soạn thảo tùy chỉnh',
|
||
openWithSettingsCustomDesc: 'Tên + mẫu URL (placeholder {path}) + cờ họ VSCode; ở chế độ SSH chỉ họ VSCode mở được đường dẫn từ xa',
|
||
openWithSettingsAdd: 'Thêm',
|
||
openWithSettingsName: 'Tên',
|
||
openWithSettingsTemplate: 'vd: cursor://file/{path}',
|
||
openWithSettingsFamily: 'Họ VSCode',
|
||
openWithSettingsFamilyDesc: 'Trình soạn thảo này dùng giao thức URL của VSCode (hỗ trợ mở từ xa qua SSH)',
|
||
openWithSettingsRemove: 'Xóa',
|
||
openWithSettingsInvalidHint: 'Trình soạn thảo thiếu tên hoặc mẫu (cần chứa {path} và bắt đầu bằng scheme://) sẽ không xuất hiện trong menu',
|
||
newTab: 'Tab mới',
|
||
openExplorer: 'Trình khám phá',
|
||
brokenSymlink: 'Symlink hỏng',
|
||
openGit: 'Panel Git',
|
||
newTerminal: 'Terminal mới',
|
||
terminalLimit: 'Đã đạt giới hạn terminal (3)',
|
||
close: 'Đóng',
|
||
closeOtherTabs: 'Đóng các tab khác',
|
||
closeLeftTabs: 'Đóng tab bên trái',
|
||
closeRightTabs: 'Đóng tab bên phải',
|
||
floatDropHint: 'Thả để mở trong cửa sổ tự do',
|
||
dockToSidebar: 'Quay lại thanh bên',
|
||
pinTerminal: 'Ghim Terminal',
|
||
pinAgentTerminal: 'Ghim Terminal Agent',
|
||
pinToWorkspace: 'Ghim vào Workspace',
|
||
pinToGlobal: 'Ghim Toàn cục',
|
||
unpinTerminal: 'Bỏ ghim',
|
||
pinnedTerminalTooltip: '{kind} · {scope} · {cwd}',
|
||
pinnedTerminalKindUi: 'Terminal UI',
|
||
pinnedTerminalKindAgent: 'Terminal Agent',
|
||
pinnedTerminalScopeWorkspace: 'Đã ghim vào workspace',
|
||
pinnedTerminalScopeGlobal: 'Đã ghim toàn cục',
|
||
pinnedRailLabel: 'Terminal đã ghim',
|
||
closePinnedTerminal: 'Đóng Terminal',
|
||
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',
|
||
splitLeft: 'Chia bên trái',
|
||
splitRight: 'Chia bên phải',
|
||
splitUp: 'Chia lên trên',
|
||
splitDown: 'Chia xuống dưới',
|
||
notRepo: 'Thư mục hiện tại không phải repo git',
|
||
noChanges: 'Không có thay đổi',
|
||
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',
|
||
commitError: 'Commit thất bại',
|
||
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',
|
||
diffCollapse: 'Thu gọn',
|
||
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',
|
||
producedOpen: 'Mở trong thanh bên',
|
||
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:',
|
||
hiddenFiles: 'Tệp ẩn',
|
||
parent: 'Thư mục cha',
|
||
copied: 'Đã sao chép',
|
||
copy: 'Sao chép',
|
||
newFile: 'Tệp mới',
|
||
openEditor: 'Mở trình soạn thảo',
|
||
gitDetail: 'Xem chi tiết thay đổi',
|
||
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',
|
||
settingsCustomCssDesc: 'Style追加 vào cuối trang (cùng ưu tiên thì viết sau thắng; ghi đè biến inline JS cần !important)',
|
||
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)',
|
||
settingsFontSizeSuffix: 'px',
|
||
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',
|
||
settingsGeneralTitle: 'Chung',
|
||
settingsPopup: 'Cài đặt tính năng',
|
||
settingsViewerCatchAll: 'Catch-all: mọi tệp',
|
||
viewerImage: 'Hình ảnh',
|
||
viewerPdf: 'PDF',
|
||
viewerMarkdown: 'Markdown',
|
||
viewerCode: 'Mã',
|
||
viewerBinary: 'Tải nhị phân',
|
||
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ệ',
|
||
browserNoSandboxWarning: 'Sandbox đã tắt: trang hiện tại cùng nguồn với UI, có toàn quyền phiên (có thể bật lại trong cài đặt)',
|
||
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',
|
||
settingsBrowserLinksTitle: 'Mở link ngoài trong chat ở thanh bên',
|
||
settingsBrowserLinksDesc: 'Khi bật, nhấp link ngoài trong chat hoặc UI sẽ mở trong thanh bên thay vì cửa sổ mới; HTTP và HTTPS được kiểm soát riêng bởi công tắc bên dưới; Ctrl/Cmd+nhấp luôn bỏ qua',
|
||
settingsBrowserHttpTitle: 'Mở trang HTTP trong thanh bên',
|
||
settingsBrowserHttpDesc: 'Khi bật, nhấp link HTTP ngoài trong chat hoặc UI sẽ mở trong thanh bên (trang plugin khai báo urlTarget ưu tiên); Ctrl/Cmd+nhấp luôn bỏ qua',
|
||
settingsBrowserHttpsTitle: 'Mở trang HTTPS trong thanh bên',
|
||
settingsBrowserHttpsDesc: 'Khi bật, nhấp link HTTPS ngoài trong chat hoặc UI sẽ mở trong thanh bên. Mặc định tắt: đa số trang HTTPS từ chối nhúng, trình duyệt hệ thống mượt mà hơn',
|
||
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ụ',
|
||
openSubagent: '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',
|
||
subagentRunning: 'Đang chạ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',
|
||
subagentDiagCorrupt: 'Bị hỏng',
|
||
subagentDiagUnsupported: 'Không hỗ trợ',
|
||
subagentDiagUnavailable: 'Không khả dụng',
|
||
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',
|
||
sideChatCancel: 'Dừng',
|
||
sideChatCancelTitle: 'Hủy vòng hiện tại (giữ hàng đợi)',
|
||
sideChatClose: 'Đóng luồng',
|
||
sideChatCloseTitle: 'Giải phóng agent của luồng (lịch sử được giữ)',
|
||
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}',
|
||
sideChatBlockRunning: 'Đang chạy',
|
||
sideChatBlockFailed: 'Thất bại',
|
||
sideChatBlockDone: 'Hoàn tất',
|
||
sideChatBlockNoOutput: '(không có đầu ra)',
|
||
sideChatBlockFiles: '{count} tệp',
|
||
sideChatBlockWindow: '{shown} trong {total} dòng',
|
||
sideChatConnDisconnected: 'Mất kết nối',
|
||
sideChatConnReconnect: 'Kết nối lạ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',
|
||
jobHideOutput: 'Ẩn đầ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',
|
||
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-apes-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-apes-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',
|
||
}
|