From 371d9ce515437d862348ba27a87679ba907471b3 Mon Sep 17 00:00:00 2001 From: mcocdaa <2021137961@qq.com> Date: Sat, 17 Oct 2026 10:29:47 +0200 Subject: [PATCH] fix(client-ui): localize all remaining hardcoded Chinese strings across views, components, and composables --- .../components/agent/AgentApprovalPanel.vue | 2 +- .../src/components/agent/AgentChatSession.vue | 6 +- .../src/components/agent/AgentComposer.vue | 2 +- .../src/components/agent/AgentMessageList.vue | 16 +- .../agent/AgentSensitiveReauthDialog.vue | 24 +- .../src/components/agent/AgentSetupForm.vue | 8 +- .../components/agent/TerminalAgentPanel.vue | 9 +- .../components/computers/EnrollmentDialog.vue | 6 +- .../settings/AuthorizedClientsPanel.vue | 4 +- .../src/components/terminal/MobileKeyBar.vue | 10 +- .../components/terminal/TerminalTitlebar.vue | 5 +- .../components/terminal/TmuxActionMenu.vue | 4 +- .../components/terminal/TmuxControls.test.ts | 15 ++ .../src/composables/useAgentApprovals.ts | 15 +- .../src/composables/useAgentConversation.ts | 7 +- .../src/composables/useAgentConversations.ts | 17 +- .../client-ui/src/composables/useDashboard.ts | 3 +- .../useDeviceAuthorizationApproval.ts | 11 +- .../client-ui/src/composables/useTermAgent.ts | 39 +-- .../src/composables/useTerminalSession.ts | 22 +- packages/client-ui/src/i18n/index.ts | 222 +++++++++++++++++- packages/client-ui/src/terminal/actions.ts | 42 +++- .../client-ui/src/views/AgentPreviewView.vue | 36 +-- .../src/views/DeviceAuthorizeView.test.ts | 18 ++ .../src/views/DeviceAuthorizeView.vue | 32 +-- .../src/views/NativeAuthorizeView.vue | 28 ++- packages/client-ui/src/views/TerminalView.vue | 2 +- 27 files changed, 446 insertions(+), 159 deletions(-) diff --git a/packages/client-ui/src/components/agent/AgentApprovalPanel.vue b/packages/client-ui/src/components/agent/AgentApprovalPanel.vue index 60546445..cdedb4f0 100644 --- a/packages/client-ui/src/components/agent/AgentApprovalPanel.vue +++ b/packages/client-ui/src/components/agent/AgentApprovalPanel.vue @@ -204,7 +204,7 @@ function countdown(expiresAt: string): string { const parsed = parseTimestamp(expiresAt) const remaining = parsed - nowMs.value if (!Number.isFinite(remaining)) return '—' - if (remaining <= 0) return '已过期' + if (remaining <= 0) return t('agent.approval.state.expired') const total = Math.floor(remaining / 1_000) const minutes = Math.floor(total / 60) const seconds = total % 60 diff --git a/packages/client-ui/src/components/agent/AgentChatSession.vue b/packages/client-ui/src/components/agent/AgentChatSession.vue index d833f9d5..715ebdb6 100644 --- a/packages/client-ui/src/components/agent/AgentChatSession.vue +++ b/packages/client-ui/src/components/agent/AgentChatSession.vue @@ -197,7 +197,7 @@ async function removeConversation() { await runtime.api.agents.deleteConversation(props.conversationId) await router.push('/agent') } catch (error) { - toast.show({ text: error instanceof Error ? error.message : '删除失败,请稍后重试。', tone: 'error' }) + toast.show({ text: error instanceof Error ? error.message : t('agent.chat.deleteError'), tone: 'error' }) } finally { deletePending.value = false deleteConfirm.value = false @@ -211,7 +211,7 @@ async function changePolicy(policy: 'manual' | 'auto') { policyConfirm.value = false await loadDetail() } catch (error) { - toast.show({ text: error instanceof Error ? error.message : '无法更新审批方式。', tone: 'error' }) + toast.show({ text: error instanceof Error ? error.message : t('agent.chat.policyUpdateError'), tone: 'error' }) } finally { policyPending.value = false } @@ -284,7 +284,7 @@ async function cancelRun() { } conversation.history.value = { ...base, runs } } else { - toast.show({ text: error instanceof Error ? error.message : '取消失败,请稍后重试。', tone: 'error' }) + toast.show({ text: error instanceof Error ? error.message : t('agent.chat.cancelError'), tone: 'error' }) } } finally { canceling.value = false diff --git a/packages/client-ui/src/components/agent/AgentComposer.vue b/packages/client-ui/src/components/agent/AgentComposer.vue index f798c2ae..915fa7da 100644 --- a/packages/client-ui/src/components/agent/AgentComposer.vue +++ b/packages/client-ui/src/components/agent/AgentComposer.vue @@ -137,7 +137,7 @@ function isRuntimeUnavailableError(error: unknown): boolean { } function errorMessage(error: unknown): string { - return error instanceof Error ? error.message : '操作失败,请稍后重试。' + return error instanceof Error ? error.message : t('common.actionFailed') } const normalizedText = computed(() => normalizePlainText(text.value)) diff --git a/packages/client-ui/src/components/agent/AgentMessageList.vue b/packages/client-ui/src/components/agent/AgentMessageList.vue index a61a2587..628baa46 100644 --- a/packages/client-ui/src/components/agent/AgentMessageList.vue +++ b/packages/client-ui/src/components/agent/AgentMessageList.vue @@ -125,7 +125,7 @@ onMounted(scrollToBottom) watch( () => props.history, (next) => { - statusText.value = deriveAnnouncements(previousHistory, next).join(';') + statusText.value = deriveAnnouncements(previousHistory, next).join(t('agent.chat.announce.separator')) previousHistory = next if (stickToBottom) void nextTick(scrollToBottom) }, @@ -144,20 +144,20 @@ function deriveAnnouncements(previous: AgentHistoryState | null, next: AgentHist const out: string[] = [] for (const [id, call] of next.toolCalls) { const before = previous.toolCalls.get(id) - const label = call.toolName === '' ? '调用' : call.toolName - if (call.status === 'completed' && (before === undefined || before.status === 'running')) out.push(`工具 ${label} 已完成`) - else if (call.status === 'failed' && (before === undefined || before.status === 'running')) out.push(`工具 ${label} 执行失败`) + const label = call.toolName === '' ? t('agent.chat.defaultToolLabel') : call.toolName + if (call.status === 'completed' && (before === undefined || before.status === 'running')) out.push(t('agent.chat.announce.toolCompleted', { label })) + else if (call.status === 'failed' && (before === undefined || before.status === 'running')) out.push(t('agent.chat.announce.toolFailed', { label })) } for (const [id, run] of next.runs) { const before = previous.runs.get(id) - if (run.status === 'finished' && (before === undefined || before.status === 'active')) out.push('运行已完成') - else if (run.status === 'error' && (before === undefined || before.status === 'active')) out.push('运行出错') + if (run.status === 'finished' && (before === undefined || before.status === 'active')) out.push(t('agent.chat.announce.runFinished')) + else if (run.status === 'error' && (before === undefined || before.status === 'active')) out.push(t('agent.chat.announce.runError')) } for (const [id, permission] of next.permissions) { - if (permission.state === 'pending' && !previous.permissions.has(id)) out.push('收到新的审批请求') + if (permission.state === 'pending' && !previous.permissions.has(id)) out.push(t('agent.chat.announce.newApproval')) } const state = next.backend.state - if (state !== null && state !== previous.backend.state) out.push(`后端状态:${state}`) + if (state !== null && state !== previous.backend.state) out.push(t('agent.chat.announce.backendState', { state })) return out } diff --git a/packages/client-ui/src/components/agent/AgentSensitiveReauthDialog.vue b/packages/client-ui/src/components/agent/AgentSensitiveReauthDialog.vue index 449285b0..3d92a432 100644 --- a/packages/client-ui/src/components/agent/AgentSensitiveReauthDialog.vue +++ b/packages/client-ui/src/components/agent/AgentSensitiveReauthDialog.vue @@ -1,37 +1,37 @@