Files
apes-sidebar/src/client/locales-vi.ts
T
figmar 5a7e2139a0 chore(sync): re-base the fork onto upstream dsh-better-sidebar v0.19.1
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.
2026-10-03 22:51:09 +08:00

458 lines
34 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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',
}