优化: 聊天体验批与Web规范合规

This commit is contained in:
lxy
2026-10-05 23:41:32 +08:00
parent 9e81182b4f
commit 28e6acbf3f
41 changed files with 1518 additions and 570 deletions
+5 -1
View File
@@ -27,7 +27,7 @@ export default {
aiStreamRetry: 'Connection interrupted, auto-retrying ({attempt}/{max})…',
// Fatal errors (4xx/auth) are not retryable — prompt user to check settings instead
notRetryable: 'This error cannot be resolved by retrying. Please check the configuration.',
streamInterruptedAfterTool: '⚠ The tool finished, but the following reply was interrupted (no data stream for a long time). You can click Continue to retry.',
streamInterruptedAfterTool: '⚠ The tool finished, but the following reply was interrupted (no data stream for a long time). Click Retry to continue (reruns the whole turn; completed tools will execute again).',
streamInterrupted: '⚠ The response was interrupted (no data stream for a long time). This may be due to a network disconnection or a backend error. Please try again.',
// Light-convergence notice when the watchdog probe reports the backend already finished (only the closing event was lost)
streamFinishedConverged: 'The response was interrupted during finalization and has been converged.',
@@ -45,6 +45,7 @@ export default {
queuedSendFailed: 'Failed to send queued message: {error}',
// UX-P2-A2: toast when queued messages get dropped by error/regenerate/edit (was silent)
queueCleared: 'Cleared {n} queued message(s)',
queueWillContinue: 'Stopped. {n} queued message(s) will still send automatically.',
approvalTimeout: '⚰ Approval timed out, automatically rejected: {toolName}',
// conversation load/switch failure feedback (network jitter/IPC down → empty list/blank, was silent)
loadConvFail: 'Failed to load conversations. Please check your network or backend connection.',
@@ -181,6 +182,9 @@ export default {
echoDirs: '{n} dirs',
echoBudget: 'budget {rounds} rounds / {tokens} tokens / {secs}s',
echoNoBudget: 'no budget limit',
// A12: budget validation field locator; A11: dirty-edit kept notice
budgetInvalidField: '{field} must be a positive integer',
dirtyKept: 'Unsaved edits kept (target conversation switched, verify before confirming)',
},
},
}
+22 -2
View File
@@ -49,6 +49,19 @@ export default {
pinOnTop: 'Pin on top',
unpin: 'Unpin',
closeWindow: 'Close window',
// I9(2026-10-05) text/code file attachment
pickFileTitle: 'Select text/code files',
textFileFilter: 'Text/code files',
fileTooLargeTruncated: 'File too large, truncated on insert',
fileReadFailed: 'Failed to read file, skipped',
shortcutsTitle: 'Keyboard shortcuts',
scNewConv: 'New conversation',
scFocusInput: 'Focus message input',
scRegenerate: 'Regenerate last reply',
scClearChat: 'Clear current conversation',
scSearch: 'Focus conversation search',
scToggleSidebar: 'Toggle sidebar',
scCloseOverlay: 'Close dialog / panel',
// ── Approval overlay (global top-right) ──
approvalWaitingTitle: 'Approval required',
@@ -163,9 +176,10 @@ export default {
copyAsImageFailed: 'Failed to copy as image',
// ── Message actions bar ──
regenerate: 'Regenerate',
regenerateFailed: 'Regenerate failed: {msg}',
// regenerateUnavailable: Ctrl+R / retry paths still call store.regenerate(); precheck toast key
// (I6 revert removed the UI button only — key still referenced by useAiSend.ts, review 2026-10-05 ②)
regenerateUnavailable: 'No reply to regenerate',
regenerateFailed: 'Regenerate failed: {msg}',
// fetch_url "Install obscura via AI" button triggers sendMessage; failure toast (mirrors editMessageFailed)
sendFailed: 'Send failed: {msg}',
@@ -237,6 +251,8 @@ export default {
compressing: 'Compressing…',
clearSuccess: 'Context cleared',
compressSuccess: 'Context compressed',
// B4: one-shot auto-compress notice (loop auto-compress no longer fully silent)
autoCompressed: 'Context auto-compressed (earlier messages folded into summary)',
compressError: 'Compression failed: {msg}',
clearError: 'Clear failed: {msg}',
// Separator expand / collapse
@@ -279,6 +295,10 @@ export default {
tokenInLabel: 'Input (cache miss, full price)',
tokenCacheLabel: 'Cache hit (low price)',
tokenOutLabel: 'Output',
// #12 conversation-cumulative tokens (token detail popover footer)
tokenConvTotal: 'Conversation total',
tokenConvTotalIn: 'Total in',
tokenConvTotalOut: 'Total out',
tokenReasonLabel: 'Reasoning',
tokenCacheRateLabel: 'Cache hit rate',
tokenModelLabel: 'Model',
+6
View File
@@ -14,6 +14,10 @@ export default {
argsCollapse: 'Collapse args',
// batch approve high-risk interception (count badge + confirm text)
batchHighRiskHint: '{n} high-risk',
// R7 group-header failure badge: folded group contains failed tool cards
groupFailCount: '{n} failed',
// #14 batch approve partial failure toast
batchPartialFail: 'Batch done: {ok} approved, {fail} failed.',
batchHighRiskConfirm: 'Batch approval includes {n} high-risk operations (e.g. delete/command execution/network requests). Approve all?',
rejectedHint: 'User rejected this action',
// tool execution slow hint (frontend fallback, no backend cancel IPC)
@@ -30,6 +34,8 @@ export default {
// Singular expand/collapse (ToolCard single-card content, command output toggle)
expand: 'Expand',
collapse: 'Collapse',
diffExpand: 'Expand all {n} lines',
diffCollapse: 'Collapse diff',
written: 'written',
items: 'items',
lines: 'lines',