feat(settings): data-safe editors, deep-linked search, Data/About/Cost pages
- EditorModal loads once per path (a parent re-render no longer reloads the file over the user's typing), refuses Save after a failed load, opens a truncated (>256 KB) file read-only, and asks before overwriting a file that changed on disk or could not be re-read. - Settings/Hooks editors unset only keys from the snapshot taken at Edit, warn when the file changed underneath, keep a renamed key's value, and refuse a new key named like a redacted one (env) or a read-only hook event, which used to replace the secret/hooks. - Project scope shows its resolved folder and is disabled inside the plugin cache. Account-profile, pricing-row and pet deletes confirm; two-click actions disarm after 3 s; unsaved drafts ask before closing. - Search indexes every Claude Code / Codex sub-tab, opens it via ?tab= and scrolls to + highlights the row; the active config tab is in the URL. - General splits into General / Data / About; Pricing moves to a Cost group with one shared load; config tabs group as Content / Extensions / Config with arrow-key roving; Promise.allSettled per tab. - Data: browser-preferences export/import (allowlisted keys), per-section reset, housekeeping dry-run first, clear-all behind a typed phrase. Server: purge days must be a whole number >= 1 (INVALID_PURGE_DAYS) and dry_run returns exactly what the real run would delete. - Alerts can be edited; webhooks/alerts/remote-source failures toast; copies go through copyText; modals get dialog roles and useDialog. - Sagi: Ctrl/Cmd+B only when shown and not typing, default spot clear of row controls, arrow keys move it, reduced motion honoured; the dead /run launch link goes to the workspace.
This commit is contained in:
@@ -10,7 +10,9 @@
|
||||
"user": "Người dùng",
|
||||
"project": "Dự án",
|
||||
"projectLocal": "Dự án (cục bộ)",
|
||||
"home": "Home"
|
||||
"home": "Home",
|
||||
"projectIs": "Dự án = {{path}}",
|
||||
"projectInCache": "Dashboard đang chạy từ bộ nhớ đệm plugin của Claude Code, thư mục này bị thay mới mỗi lần cập nhật plugin — tệp dự án ghi vào đó sẽ mất. Đã tắt phạm vi Dự án."
|
||||
},
|
||||
"tabs": {
|
||||
"overview": "Tổng quan",
|
||||
@@ -150,7 +152,9 @@
|
||||
"fileMissing": "(không có file settings trong phạm vi này)"
|
||||
},
|
||||
"settings": {
|
||||
"fileMissing": "(không có file settings trong phạm vi này)"
|
||||
"fileMissing": "(không có file settings trong phạm vi này)",
|
||||
"structured": "Có cấu trúc",
|
||||
"rawJson": "JSON thô"
|
||||
},
|
||||
"memory": {
|
||||
"userScope": "Bộ nhớ người dùng",
|
||||
@@ -217,7 +221,17 @@
|
||||
"output-styles": "---\nname: my-style\ndescription: Mô tả kiểu xuất\n---\n\nChỉ thị về kiểu.\n",
|
||||
"memory": "# Bộ nhớ dự án\n\nClaude đọc tệp này khi bắt đầu phiên.\n",
|
||||
"auto-memory": "---\nname: my-fact\ndescription: Tóm tắt một dòng về sự kiện được ghi nhớ\nmetadata:\n type: feedback\n---\n\nNội dung cần ghi nhớ.\n"
|
||||
}
|
||||
},
|
||||
"nameRequired": "Hãy nhập tên trước.",
|
||||
"nameInvalid": "Chỉ dùng chữ, số, dấu chấm, gạch ngang hoặc gạch dưới (bắt đầu bằng chữ hoặc số, tối đa 64 ký tự).",
|
||||
"loadError": "Không tải được tệp: {{message}}. Đã tắt Lưu để tệp không bị ghi đè.",
|
||||
"truncatedReadOnly": "Tệp lớn hơn 256 KB nên chỉ tải được một phần, vì vậy chỉ mở ở chế độ đọc. Hãy sửa bằng trình soạn thảo của bạn.",
|
||||
"changedOnDiskTitle": "Tệp đã thay đổi trên đĩa",
|
||||
"changedOnDiskBody": "Có tiến trình khác đã sửa tệp này sau khi bạn mở. Lưu bây giờ sẽ thay thay đổi đó bằng nội dung của bạn (vẫn có bản sao lưu).",
|
||||
"overwrite": "Ghi đè",
|
||||
"unverifiedTitle": "Không kiểm tra được tệp trên đĩa",
|
||||
"unverifiedBody": "Không đọc lại được tệp để kiểm tra xem có gì khác đã sửa nó từ khi bạn mở hay chưa. Vẫn lưu? (Bản sao lưu của tệp hiện tại vẫn được tạo.)",
|
||||
"saveAnyway": "Vẫn lưu"
|
||||
},
|
||||
"backups": {
|
||||
"title": "Bản sao lưu",
|
||||
@@ -225,7 +239,7 @@
|
||||
"viewLink": "Xem lịch sử sao lưu",
|
||||
"openButton": "Bản sao lưu",
|
||||
"subtitle": "Mỗi thao tác lưu / xoá đều ghi bản sao tới đây trước. Thư mục sao lưu nằm ngoài các vị trí Claude Code quét, nên không xuất hiện như mục thừa trong CLI.",
|
||||
"restoreHint": "Khôi phục bằng cách đổi tên bản sao về vị trí cũ:",
|
||||
"restoreHint": "Khôi phục bằng cách sao chép bản sao lưu về chỗ cũ (bản sao lưu vẫn được giữ):",
|
||||
"size": "Kích thước",
|
||||
"created": "Tạo lúc",
|
||||
"type": "Loại",
|
||||
@@ -263,7 +277,9 @@
|
||||
"renameLabel": "Tên profile",
|
||||
"renameHint": "Bấm để đổi tên",
|
||||
"rename": "Đổi tên",
|
||||
"renameSuccess": "Đã đổi tên thành \"{{name}}\"."
|
||||
"renameSuccess": "Đã đổi tên thành \"{{name}}\".",
|
||||
"deleteConfirmTitle": "Xóa hồ sơ “{{name}}”?",
|
||||
"deleteConfirmBody": "Thao tác này xóa thông tin đăng nhập đã lưu (OAuth) của tài khoản này. Muốn dùng lại, bạn phải chạy `claude auth login` và lưu lại một lần nữa."
|
||||
},
|
||||
"explain": {
|
||||
"hooks": {
|
||||
@@ -385,6 +401,42 @@
|
||||
"settingsBadJson": "Giá trị của {{key}} không phải JSON hợp lệ.",
|
||||
"settingsSaved": "Đã lưu settings vào {{file}}.",
|
||||
"settingsHelp": "Giá trị là JSON: \"opus\", true, 42, [\"a\"], {\"k\":1}. Chỉ những khóa bạn sửa mới được ghi; phần còn lại của file giữ nguyên.",
|
||||
"settingsRedactedKeys": "Không sửa được ở đây vì giá trị đã bị che: {{keys}}"
|
||||
"settingsRedactedKeys": "Không sửa được ở đây vì giá trị đã bị che: {{keys}}",
|
||||
"hooksChangedBody": "Các hook này đã thay đổi trên đĩa kể từ khi bạn bắt đầu sửa. Lưu sẽ ghi phiên bản của bạn cho các sự kiện bạn đã sửa; các sự kiện mới thêm trong lúc đó vẫn được giữ.",
|
||||
"settingsChangedBody": "Tệp cài đặt này đã thay đổi trên đĩa kể từ khi bạn bắt đầu sửa (CLI đang chạy ghi lại nó). Lưu sẽ ghi các khóa bạn đã đổi; các khóa mới thêm trong lúc đó vẫn được giữ.",
|
||||
"settingsRedactedKey": "“{{key}}” chứa giá trị bí mật đã bị ẩn nên không sửa được ở đây — lưu sẽ thay giá trị thật bằng nội dung bạn nhập. Hãy sửa trực tiếp trong tệp.",
|
||||
"hookReadOnlyEvent": "“{{event}}” đã có hook không sửa được ở đây (chỉ đọc) — một dòng mới cùng tên sẽ thay thế chúng. Hãy dùng tên sự kiện khác hoặc sửa trực tiếp trong tệp."
|
||||
},
|
||||
"tabGroups": {
|
||||
"content": "Nội dung",
|
||||
"extensions": "Mở rộng",
|
||||
"config": "Cấu hình"
|
||||
},
|
||||
"currentConfig": {
|
||||
"title": "Cấu hình hiện tại",
|
||||
"setCount_one": "Đã đặt {{count}} tùy chọn · còn lại dùng mặc định",
|
||||
"setCount_other": "Đã đặt {{count}} tùy chọn · còn lại dùng mặc định",
|
||||
"default": "mặc định",
|
||||
"groups": {
|
||||
"model": "Mô hình & suy luận",
|
||||
"output": "Đầu ra & hiển thị",
|
||||
"session": "Phiên & nhập liệu"
|
||||
},
|
||||
"keys": {
|
||||
"model": "Mô hình",
|
||||
"effortLevel": "Mức nỗ lực",
|
||||
"alwaysThinkingEnabled": "Luôn suy nghĩ",
|
||||
"outputStyle": "Kiểu đầu ra",
|
||||
"verbose": "Đầu ra chi tiết",
|
||||
"theme": "Giao diện",
|
||||
"language": "Ngôn ngữ",
|
||||
"spinnerTipsEnabled": "Mẹo khi chờ",
|
||||
"autoScrollEnabled": "Tự cuộn",
|
||||
"autoCompactEnabled": "Tự nén ngữ cảnh",
|
||||
"fileCheckpointingEnabled": "Điểm khôi phục tệp",
|
||||
"editorMode": "Chế độ soạn thảo",
|
||||
"preferredNotifChannel": "Thông báo",
|
||||
"awaySummaryEnabled": "Tóm tắt khi vắng mặt"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user