From 30279728fa62459c52d4e5d0364e9cb28ee01e2e Mon Sep 17 00:00:00 2001 From: zephyrq-z Date: Thu, 25 Jun 2026 15:39:43 +0800 Subject: [PATCH 1/5] feat(i18n): add localization support for Chinese and update description in package.json --- extensions/vscode/package.json | 18 +++++++++--------- extensions/vscode/package.nls.json | 11 +++++++++++ extensions/vscode/package.nls.zh-cn.json | 11 +++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 extensions/vscode/package.nls.json create mode 100644 extensions/vscode/package.nls.zh-cn.json diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 9005778..6d8ebd5 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -1,7 +1,7 @@ { "name": "open-code-review-vscode", "displayName": "Open Code Review", - "description": "AI 代码审查 —— 基于 open-code-review CLI", + "description": "%ocr.description%", "version": "0.1.0", "publisher": "open-code-review", "license": "Apache-2.0", @@ -25,7 +25,7 @@ "activitybar": [ { "id": "ocr-container", - "title": "Open Code Review", + "title": "%ocr.activitybar.title%", "icon": "resources/icon.svg" } ] @@ -35,34 +35,34 @@ { "id": "ocr.sidebar", "type": "webview", - "name": "Code Review" + "name": "%ocr.sidebar.name%" } ] }, "commands": [ { "command": "ocr.review.start", - "title": "OCR: 开始代码审查" + "title": "%ocr.review.start%" }, { "command": "ocr.review.cancel", - "title": "OCR: 取消审查" + "title": "%ocr.review.cancel%" }, { "command": "ocr.config.open", - "title": "OCR: 打开配置" + "title": "%ocr.config.open%" }, { "command": "ocr.comment.apply", - "title": "应用" + "title": "%ocr.comment.apply%" }, { "command": "ocr.comment.discard", - "title": "忽略" + "title": "%ocr.comment.discard%" }, { "command": "ocr.comment.falsePositive", - "title": "误报" + "title": "%ocr.comment.falsePositive%" } ], "menus": { diff --git a/extensions/vscode/package.nls.json b/extensions/vscode/package.nls.json new file mode 100644 index 0000000..94c0761 --- /dev/null +++ b/extensions/vscode/package.nls.json @@ -0,0 +1,11 @@ +{ + "ocr.activitybar.title": "Open Code Review", + "ocr.sidebar.name": "Code Review", + "ocr.review.start": "OCR: Start Code Review", + "ocr.review.cancel": "OCR: Cancel Review", + "ocr.config.open": "OCR: Open Configuration", + "ocr.comment.apply": "Apply", + "ocr.comment.discard": "Discard", + "ocr.comment.falsePositive": "False Positive", + "ocr.description": "AI Code Review — powered by open-code-review CLI" +} \ No newline at end of file diff --git a/extensions/vscode/package.nls.zh-cn.json b/extensions/vscode/package.nls.zh-cn.json new file mode 100644 index 0000000..33766f7 --- /dev/null +++ b/extensions/vscode/package.nls.zh-cn.json @@ -0,0 +1,11 @@ +{ + "ocr.activitybar.title": "Open Code Review", + "ocr.sidebar.name": "Code Review", + "ocr.review.start": "OCR: 开始代码审查", + "ocr.review.cancel": "OCR: 取消审查", + "ocr.config.open": "OCR: 打开配置", + "ocr.comment.apply": "应用", + "ocr.comment.discard": "忽略", + "ocr.comment.falsePositive": "误报", + "ocr.description": "AI 代码审查 —— 基于 open-code-review CLI" +} \ No newline at end of file From 3ab668ae967886f9ee45dc741c6047b9494958f3 Mon Sep 17 00:00:00 2001 From: zephyrq-z Date: Thu, 25 Jun 2026 16:09:55 +0800 Subject: [PATCH 2/5] feat: add internationalization support to various components and views - Integrated translation functionality using `useT` from `I18nProvider` across multiple components including CustomProviderManager, EnvSetupGuide, FileList, LogViewer, PasswordInput, Select, and various views (CancelledView, ConfigView, DoneView, EmptyView, FailedView, IdleView, RunningView). - Replaced hardcoded strings with localized strings to enhance user experience for different languages. - Updated button labels, titles, and hints to reflect the new translation implementation. --- .../vscode/open-code-review-vscode-0.1.0.vsix | Bin 38209 -> 96108 bytes .../extension/providers/CommentProvider.ts | 25 +- .../providers/ConfigPanelProvider.ts | 16 +- .../extension/providers/SidebarProvider.ts | 8 +- .../src/extension/services/CliService.ts | 3 +- .../src/extension/services/GitService.ts | 12 +- extensions/vscode/src/shared/i18n.ts | 320 ++++++++++++++++++ extensions/vscode/src/shared/messages.ts | 6 +- extensions/vscode/src/webview/App.tsx | 3 + .../vscode/src/webview/ConfigPanelApp.tsx | 3 + .../vscode/src/webview/I18nProvider.tsx | 13 + .../src/webview/components/CommentCard.tsx | 6 +- .../components/CustomProviderManager.tsx | 24 +- .../src/webview/components/EnvSetupGuide.tsx | 44 +-- .../src/webview/components/FileList.tsx | 8 +- .../src/webview/components/LogViewer.tsx | 4 +- .../src/webview/components/PasswordInput.tsx | 4 +- .../vscode/src/webview/components/Select.tsx | 7 +- extensions/vscode/src/webview/configStore.ts | 6 +- extensions/vscode/src/webview/store.ts | 3 + .../src/webview/views/CancelledView.tsx | 4 +- .../vscode/src/webview/views/ConfigView.tsx | 97 +++--- .../vscode/src/webview/views/DoneView.tsx | 8 +- .../vscode/src/webview/views/EmptyView.tsx | 8 +- .../vscode/src/webview/views/FailedView.tsx | 7 +- .../vscode/src/webview/views/IdleView.tsx | 47 ++- .../vscode/src/webview/views/RunningView.tsx | 6 +- 27 files changed, 547 insertions(+), 145 deletions(-) create mode 100644 extensions/vscode/src/shared/i18n.ts create mode 100644 extensions/vscode/src/webview/I18nProvider.tsx diff --git a/extensions/vscode/open-code-review-vscode-0.1.0.vsix b/extensions/vscode/open-code-review-vscode-0.1.0.vsix index 5f008a177750438ebf5ade264edb9d22a2413879..6d90046f8362f012d3a48239c365e854064ce73c 100644 GIT binary patch literal 96108 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

i~$7zg#gc@=xKL$VMru0Vf6*La8sTfYBXsR))Q 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 G)_(z$%#a8G diff --git a/extensions/vscode/src/extension/providers/CommentProvider.ts b/extensions/vscode/src/extension/providers/CommentProvider.ts index bea8f30..02d1dba 100644 --- a/extensions/vscode/src/extension/providers/CommentProvider.ts +++ b/extensions/vscode/src/extension/providers/CommentProvider.ts @@ -1,3 +1,4 @@ +import { t, resolveLocale, SupportedLocale } from '../../shared/i18n'; import * as vscode from 'vscode'; import { ReviewComment, CommentStatus, CommentSyncState } from '../../shared/types'; import { COMMENT_CONTROLLER_ID } from '../../shared/constants'; @@ -13,8 +14,11 @@ export class CommentProvider { private offsets = new LineOffsetTracker(); private syncListeners: Array<(s: CommentSyncState[]) => void> = []; + private locale: SupportedLocale; + constructor(private extensionUri: vscode.Uri) { - this.controller = vscode.comments.createCommentController(COMMENT_CONTROLLER_ID, 'Open Code Review'); + this.locale = resolveLocale(vscode.env.language); + this.controller = vscode.comments.createCommentController(COMMENT_CONTROLLER_ID, t(this.locale, 'ext.commentController')); } onSync(fn: (s: CommentSyncState[]) => void): void { @@ -58,10 +62,10 @@ export class CommentProvider { const body = this.renderBody(c, i, 'pending'); const thread = this.controller.createCommentThread(doc.uri, range, [{ body, mode: vscode.CommentMode.Preview, - author: { name: '⏳ [未处理]' }, + author: { name: t(this.locale, 'ext.comment.pending') }, }]); thread.canReply = false; - thread.label = `Code Review (${i + 1} / ${this.comments.length})`; + thread.label = `${t(this.locale, 'ext.comment.threadLabel')} (${i + 1} / ${this.comments.length})`; // 有代码建议 → 'pending'(显示应用+忽略);无建议 → 'pendingNoSuggestion'(仅忽略) thread.contextValue = this.hasSuggestion(c) ? 'pending' : 'pendingNoSuggestion'; thread.collapsibleState = vscode.CommentThreadCollapsibleState.Expanded; @@ -82,7 +86,7 @@ export class CommentProvider { if (this.hasSuggestion(c)) { md += `\n***\n\`\`\`diff\n${c.suggestionCode}\n\`\`\``; } else { - md += `\n***\n_💡 无代码建议,请手动处理_`; + md += `\n***\n${t(this.locale, 'ext.comment.noSuggestion')}`; } const s = new vscode.MarkdownString(md); s.isTrusted = true; @@ -100,7 +104,7 @@ export class CommentProvider { const start = Math.max(0, this.offsets.adjusted(c.path, c.startLine) - 1); const end = Math.min(doc.lineCount - 1, this.offsets.adjusted(c.path, c.endLine) - 1); if (end < start) { - vscode.window.showErrorMessage('应用失败:代码位置已失效,请刷新后重试。'); + vscode.window.showErrorMessage(t(this.locale, 'ext.comment.applyFailedStale')); return; } const range = new vscode.Range(start, 0, end, doc.lineAt(end).text.length); @@ -113,7 +117,7 @@ export class CommentProvider { else edit.delete(uri, range); const ok = await vscode.workspace.applyEdit(edit); if (!ok) { - vscode.window.showErrorMessage('应用失败:无法修改文件,请检查文件是否被占用或处于只读状态。'); + vscode.window.showErrorMessage(t(this.locale, 'ext.comment.applyFailedLocked')); return; } await doc.save(); @@ -129,7 +133,12 @@ export class CommentProvider { this.status.set(index, status); const thread = this.threads.get(index); if (thread) { - const label = { applied: '✅ [已应用]', discarded: '✅ [已忽略]', falsePositive: '✅ [已误报]', pending: '⏳ [未处理]' }[status]; + const label = { + applied: t(this.locale, 'ext.comment.statusApplied'), + discarded: t(this.locale, 'ext.comment.statusDiscarded'), + falsePositive: t(this.locale, 'ext.comment.statusFalsePositive'), + pending: t(this.locale, 'ext.comment.pending'), + }[status]; thread.comments = [{ ...thread.comments[0], author: { name: label }, body: this.renderBody(this.comments[index], index, status) }] as any; thread.contextValue = status; thread.collapsibleState = vscode.CommentThreadCollapsibleState.Collapsed; @@ -141,7 +150,7 @@ export class CommentProvider { const thread = this.threads.get(index); if (!thread) { const c = this.comments[index]; - if (c) vscode.window.showWarningMessage(`无法定位到 ${c.path}:该路径不是可打开的文件。`); + if (c) vscode.window.showWarningMessage(`${t(this.locale, 'ext.comment.jumpFailed')}${c.path}${t(this.locale, 'ext.comment.jumpNotAFile')}`); return; } await vscode.window.showTextDocument(thread.uri, { selection: thread.range, preview: false }); diff --git a/extensions/vscode/src/extension/providers/ConfigPanelProvider.ts b/extensions/vscode/src/extension/providers/ConfigPanelProvider.ts index 2be41d8..b0af30b 100644 --- a/extensions/vscode/src/extension/providers/ConfigPanelProvider.ts +++ b/extensions/vscode/src/extension/providers/ConfigPanelProvider.ts @@ -1,3 +1,4 @@ +import { resolveLocale, t } from '../../shared/i18n'; import * as vscode from 'vscode'; import { ConfigPanelFocus, isConfigReady } from '../../shared/configUtils'; import { ConfigPanelHostToWebview, WebviewToHost } from '../../shared/messages'; @@ -30,7 +31,7 @@ export class ConfigPanelProvider implements vscode.Disposable { this.panel = vscode.window.createWebviewPanel( PANEL_VIEW_TYPE, - '模型配置', + t(resolveLocale(vscode.env.language), 'ext.configPanelTitle'), vscode.ViewColumn.One, { enableScripts: true, retainContextWhenHidden: true, localResourceRoots: [this.extensionUri] }, ); @@ -80,12 +81,14 @@ export class ConfigPanelProvider implements vscode.Disposable { const config = this.config.read(); const cached = this.cli.getCachedEnvironment(); const skipEnvCheck = focus?.step === 2 || isConfigReady(config); + const locale = resolveLocale(vscode.env.language); this.post({ type: 'configPanelInit', config, focus: focus ?? null, env: cached, skipEnvCheck, + locale, }); break; } @@ -106,12 +109,13 @@ export class ConfigPanelProvider implements vscode.Disposable { break; } case 'deleteCustomProvider': { + const locale = resolveLocale(vscode.env.language); const confirmed = await vscode.window.showWarningMessage( - `确定删除自定义 Provider「${msg.name}」?`, + t(locale, 'ext.deleteProviderConfirm').replace('{name}', msg.name), { modal: true }, - '删除', + t(locale, 'ext.deleteProviderConfirmBtn'), ); - if (confirmed !== '删除') break; + if (confirmed !== t(locale, 'ext.deleteProviderConfirmBtn')) break; this.notifyConfig(this.config.deleteCustomProvider(msg.name)); break; } @@ -144,8 +148,10 @@ export class ConfigPanelProvider implements vscode.Disposable { private html(webview: vscode.Webview): string { const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this.extensionUri, 'out', 'configPanel.js')); const nonce = String(Date.now()); + const resolved = resolveLocale(vscode.env.language); + const lang = resolved === 'zh-cn' ? 'zh-CN' : resolved; return ` - +

diff --git a/extensions/vscode/src/extension/providers/SidebarProvider.ts b/extensions/vscode/src/extension/providers/SidebarProvider.ts index f17de1d..fee67d2 100644 --- a/extensions/vscode/src/extension/providers/SidebarProvider.ts +++ b/extensions/vscode/src/extension/providers/SidebarProvider.ts @@ -1,3 +1,4 @@ +import { resolveLocale } from '../../shared/i18n'; import * as vscode from 'vscode'; import { ConfigPanelFocus } from '../../shared/configUtils'; import { HostToWebview, WebviewToHost } from '../../shared/messages'; @@ -48,7 +49,8 @@ export class SidebarProvider implements vscode.WebviewViewProvider { case 'ready': { const config = this.config.read(); const gitState = await this.git.getState('workspace'); - this.post({ type: 'init', config, gitState }); + const locale = resolveLocale(vscode.env.language); + this.post({ type: 'init', config, gitState, locale }); break; } case 'getGitState': { @@ -108,8 +110,10 @@ export class SidebarProvider implements vscode.WebviewViewProvider { private html(webview: vscode.Webview): string { const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this.extensionUri, 'out', 'webview.js')); const nonce = String(Date.now()); + const resolved = resolveLocale(vscode.env.language); + const lang = resolved === 'zh-cn' ? 'zh-CN' : resolved; return ` - +
diff --git a/extensions/vscode/src/extension/services/CliService.ts b/extensions/vscode/src/extension/services/CliService.ts index 291385f..d263ef6 100644 --- a/extensions/vscode/src/extension/services/CliService.ts +++ b/extensions/vscode/src/extension/services/CliService.ts @@ -1,3 +1,4 @@ +import { t } from '../../shared/i18n'; import { spawn } from 'child_process'; import { CliResult, CliRunOptions, EnvCheckResult, LogLine } from '../../shared/types'; import { buildReviewArgs, extractCliError, parseCliResult, parseLogLine } from './cliParse'; @@ -90,7 +91,7 @@ export class CliService { proc.on('error', (err) => { onLog({ text: String(err), level: 'error' }); resolve(false); }); proc.on('close', (code) => { emitLines('', 'info', true); - onLog({ text: code === 0 ? '✓ 安装完成' : `✗ 安装失败 (exit ${code})`, level: code === 0 ? 'info' : 'error' }); + onLog({ text: code === 0 ? t('en', 'ext.cli.installOk') : `${t('en', 'ext.cli.installFail')}${code})`, level: code === 0 ? 'info' : 'error' }); if (code === 0) this.invalidateEnvironmentCache(); resolve(code === 0); }); diff --git a/extensions/vscode/src/extension/services/GitService.ts b/extensions/vscode/src/extension/services/GitService.ts index 2751035..62ddd68 100644 --- a/extensions/vscode/src/extension/services/GitService.ts +++ b/extensions/vscode/src/extension/services/GitService.ts @@ -1,3 +1,4 @@ +import { t, resolveLocale } from '../../shared/i18n'; import * as vscode from 'vscode'; import { execFile } from 'child_process'; import { GitState, CommitInfo, FileChange, ReviewMode } from '../../shared/types'; @@ -167,7 +168,7 @@ export class GitService { if (opts.mode === 'workspace') { left = api.toGitUri(fileUri, opts.status === 'added' ? emptyRef : 'HEAD'); right = opts.status === 'deleted' ? api.toGitUri(fileUri, emptyRef) : fileUri; - label = '工作区 ↔ HEAD'; + label = t(resolveLocale(vscode.env.language), 'ext.git.workspaceVsHead'); } else if (opts.mode === 'commit' && opts.commit) { left = api.toGitUri(fileUri, opts.status === 'added' ? emptyRef : `${opts.commit}^`); right = opts.status === 'deleted' ? api.toGitUri(fileUri, emptyRef) : api.toGitUri(fileUri, opts.commit); @@ -211,11 +212,12 @@ function runGit(cwd: string, args: string[]): Promise { function formatRelative(date?: Date): string { if (!date) return ''; + const locale = resolveLocale(vscode.env.language); const diff = Date.now() - date.getTime(); const h = Math.floor(diff / 3.6e6); - if (h < 1) return '刚刚'; - if (h < 24) return `${h} 小时前`; + if (h < 1) return t(locale, 'ext.git.justNow'); + if (h < 24) return t(locale, 'ext.git.hoursAgo').replace('{h}', String(h)); const d = Math.floor(h / 24); - if (d === 1) return '昨天'; - return `${d} 天前`; + if (d === 1) return t(locale, 'ext.git.yesterday'); + return t(locale, 'ext.git.daysAgo').replace('{d}', String(d)); } diff --git a/extensions/vscode/src/shared/i18n.ts b/extensions/vscode/src/shared/i18n.ts new file mode 100644 index 0000000..b140a43 --- /dev/null +++ b/extensions/vscode/src/shared/i18n.ts @@ -0,0 +1,320 @@ +/** + * Supported display locales for the extension UI. + * Add new entries here and in the `messages` dictionary below to extend. + * + * - `en` — English (default, fallback for all unrecognized locales) + * - `zh-cn` — Simplified Chinese (matches VS Code `zh-cn` / `zh-CN`) + */ +export type SupportedLocale = 'en' | 'zh-cn'; + +const messages: Record> = { + en: { + // ── IdleView ── + 'view.idle.configFirst': 'Configure model first', + 'view.idle.reviewing': 'Reviewing…', + 'view.idle.selectBranch': 'Select comparison branch', + 'view.idle.selectCommit': 'Select a commit', + 'view.idle.noFiles': 'No files to review', + 'view.idle.reviewAll': 'Review all changes', + 'view.idle.workspace': 'Workspace', + 'view.idle.branch': 'Branch Compare', + 'view.idle.commit': 'Single Commit', + 'view.idle.baseRef': 'Base ref', + 'view.idle.targetRef': 'Target ref', + 'view.idle.chooseBranch': 'Choose branch', + 'view.idle.commitHistory': 'Commit history', + 'view.idle.customPrompt': 'Custom review prompt (optional)', + 'view.idle.manageCustom': 'Manage custom providers', + 'view.idle.modelConfig': 'Model config', + + // ── RunningView ── + 'view.running.reviewLog': 'Review log', + 'view.running.cancel': 'Cancel', + + // ── DoneView ── + 'view.done.comments': 'comments', + 'view.done.files': 'files', + 'view.done.processLog': 'Process log', + + // ── EmptyView ── + 'view.empty.noIssues': 'No issues found · Passed', + 'view.empty.processLog': 'Process log', + + // ── CancelledView ── + 'view.cancelled.title': 'Review cancelled', + + // ── FailedView ── + 'view.failed.title': 'Review failed.', + 'view.failed.checkConfig': 'Please check model configuration and retry.', + 'view.failed.checkApiKey': 'Please check API key and network connection.', + 'view.failed.retry': 'Retry', + + // ── ConfigView ── + 'view.config.title': 'Model Configuration', + 'view.config.desc': 'Connect an LLM provider to start code review', + 'view.config.close': 'Close', + 'view.config.step1': 'Environment Setup', + 'view.config.step2': 'Provider Config', + 'view.config.checking': 'ocr checking…', + 'view.config.notInstalled': 'ocr not installed', + 'view.config.official': 'Official Provider', + 'view.config.custom': 'Custom Provider', + 'view.config.currentUse': 'Currently using', + 'view.config.notConfigured': 'No provider configured', + 'view.config.officialLabel': 'Official', + 'view.config.customLabel': 'Custom', + 'view.config.legacyLabel': 'Legacy', + 'view.config.model': 'Model', + 'view.config.customModel': 'Enter custom model…', + 'view.config.apiKey': 'API Key', + 'view.config.apiKeyEnvHint': 'Also available via env var', + 'view.config.apiKeySaved': 'Saved (leave blank to keep)', + 'view.config.testing': 'Testing connection…', + 'view.config.testOk': '✓ Connected', + 'view.config.testFail': '✗ Connection failed', + 'view.config.previous': 'Previous', + 'view.config.test': 'Test Connection', + 'view.config.save': 'Save', + 'view.config.continueProvider': 'Continue to Provider Config', + 'view.config.providerName': 'Provider Name', + 'view.config.protocol': 'Protocol', + 'view.config.baseUrl': 'Base URL', + 'view.config.modelList': 'Model list', + 'view.config.modelListPlaceholder': 'Comma-separated, e.g. model-a, model-b', + 'view.config.authHeader': 'Auth Header', + 'view.config.authHeaderHint': 'Optional x-api-key or authorization for Anthropic protocol', + 'view.config.authHeaderDefault': 'Default (Authorization)', + 'view.config.backToList': '← Back to list', + 'view.config.optional': '(optional)', + 'view.config.ocrVersionTooltip': 'Open Code Review CLI Version', + + // ── EnvSetupGuide ── + 'view.env.installing': 'Installing ocr CLI…', + 'view.env.checking': 'Checking, please wait…', + 'view.env.ready': 'Environment is ready. Continue to Provider Config.', + 'view.env.stepLead': 'Complete each step in order. Move to the next after each passes.', + 'view.env.nodeHint': 'Node.js not detected. Visit nodejs.org to install the LTS version, then restart VS Code.', + 'view.env.npmHint': 'npm not detected. npm is usually bundled with Node.js — verify your Node installation.', + 'view.env.ocrHint': 'Install open-code-review globally in your terminal, or click "One-Click Install" below.', + 'view.env.oneClickInstall': 'One-Click Install', + 'view.env.redetect': 'Re-detect', + 'view.env.checkingStatus': 'Checking', + 'view.env.readyStatus': 'Ready', + 'view.env.notReady': 'Not ready', + 'view.env.pass': 'Pass', + 'view.env.fail': 'Fail', + 'view.env.waitPrev': 'Waiting for previous', + 'view.env.copy': 'Copy', + 'view.env.copiedToast': 'Copied ✓', + + // ── CustomProviderManager ── + 'cmp.custom.title': 'Custom Providers', + 'cmp.custom.desc': 'Manage self-hosted LLM gateways and compatible endpoints. Switch the active review model.', + 'cmp.custom.add': 'Add', + 'cmp.custom.empty': 'No custom providers', + 'cmp.custom.addFirst': 'Add custom provider', + 'cmp.custom.currentUse': 'Currently using', + 'cmp.custom.model': 'Model', + 'cmp.custom.edit': 'Edit', + 'cmp.custom.setCurrent': 'Set as current', + 'cmp.custom.delete': 'Delete', + + // ── FileList ── + 'cmp.fileList.pending': 'Pending files', + 'cmp.fileList.noChanges': 'No changed files', + 'cmp.fileList.viewDiff': 'Click to view diff', + + // ── LogViewer ── + 'cmp.log.waiting': 'Waiting for output', + + // ── CommentCard ── + 'cmp.comment.view': 'View', + 'cmp.comment.discard': 'Discard', + + // ── PasswordInput ── + 'cmp.password.hideSecret': 'Hide secret', + 'cmp.password.showSecret': 'Show secret', + + // ── Select ── + 'cmp.select.placeholder': 'Select', + + // ── Extension ── + 'ext.commentController': 'Open Code Review', + 'ext.configPanelTitle': 'Model Configuration', + 'ext.config.legacyDisplayName': 'Legacy LLM Endpoint', + 'ext.comment.threadLabel': 'Code Review', + 'ext.comment.pending': '⏳ [Pending]', + 'ext.comment.noSuggestion': '_💡 No code suggestion, please handle manually_', + 'ext.comment.applyFailedStale': 'Apply failed: code location is stale, please refresh and retry.', + 'ext.comment.applyFailedLocked': 'Apply failed: cannot modify file, check if it is read-only or locked.', + 'ext.comment.statusApplied': '✅ [Applied]', + 'ext.comment.statusDiscarded': '✅ [Discarded]', + 'ext.comment.statusFalsePositive': '✅ [False Positive]', + 'ext.comment.jumpFailed': 'Cannot locate ', + 'ext.comment.jumpNotAFile': ': is not an openable file.', + 'ext.deleteProviderConfirm': 'Delete custom provider "{name}"?', + 'ext.deleteProviderConfirmBtn': 'Delete', + 'ext.git.justNow': 'just now', + 'ext.git.hoursAgo': '{h} hours ago', + 'ext.git.yesterday': 'yesterday', + 'ext.git.daysAgo': '{d} days ago', + 'ext.git.workspaceVsHead': 'Workspace ↔ HEAD', + 'ext.cli.installOk': '✓ Install complete', + 'ext.cli.installFail': '✗ Install failed (exit ', + }, + + 'zh-cn': { + 'view.idle.configFirst': '请先配置模型', + 'view.idle.reviewing': '审查中…', + 'view.idle.selectBranch': '请选择对比分支', + 'view.idle.selectCommit': '请选择提交', + 'view.idle.noFiles': '无可审查文件', + 'view.idle.reviewAll': '审查所有变更', + 'view.idle.workspace': '工作区', + 'view.idle.branch': '分支对比', + 'view.idle.commit': '单次提交', + 'view.idle.baseRef': '基础引用', + 'view.idle.targetRef': '目标引用', + 'view.idle.chooseBranch': '选择分支', + 'view.idle.commitHistory': '提交历史', + 'view.idle.customPrompt': '自定义审查提示词(可选)', + 'view.idle.manageCustom': '管理自定义 Provider', + 'view.idle.modelConfig': '模型配置', + + 'view.running.reviewLog': '审查日志', + 'view.running.cancel': '取消', + + 'view.done.comments': '条评论', + 'view.done.files': '个文件', + 'view.done.processLog': '过程日志', + + 'view.empty.noIssues': '未发现问题 · 已通过', + 'view.empty.processLog': '过程日志', + + 'view.cancelled.title': '审查已取消', + + 'view.failed.title': '审查失败。', + 'view.failed.checkConfig': '请检查模型配置后重试。', + 'view.failed.checkApiKey': '请检查 API Key 和网络连接。', + 'view.failed.retry': '重试', + + 'view.config.title': '模型配置', + 'view.config.desc': '连接 LLM Provider 以开始代码审查', + 'view.config.close': '关闭', + 'view.config.step1': '环境检测', + 'view.config.step2': 'Provider 配置', + 'view.config.checking': 'ocr 检测中…', + 'view.config.notInstalled': 'ocr 未安装', + 'view.config.official': '官方 Provider', + 'view.config.custom': '自定义 Provider', + 'view.config.currentUse': '当前使用', + 'view.config.notConfigured': '尚未配置 Provider', + 'view.config.officialLabel': '官方', + 'view.config.customLabel': '自定义', + 'view.config.legacyLabel': 'Legacy', + 'view.config.model': '模型', + 'view.config.customModel': '输入自定义模型…', + 'view.config.apiKey': 'API 密钥', + 'view.config.apiKeyEnvHint': '也可通过环境变量', + 'view.config.apiKeySaved': '已保存(留空保持不变)', + 'view.config.testing': '正在测试连接…', + 'view.config.testOk': '✓ 连接成功', + 'view.config.testFail': '✗ 连接失败', + 'view.config.previous': '上一步', + 'view.config.test': '测试连接', + 'view.config.save': '保存', + 'view.config.continueProvider': '继续配置 Provider', + 'view.config.providerName': 'Provider 名称', + 'view.config.protocol': '协议', + 'view.config.baseUrl': 'Base URL', + 'view.config.modelList': '模型列表', + 'view.config.modelListPlaceholder': '逗号分隔,如 model-a, model-b', + 'view.config.authHeader': 'Auth Header', + 'view.config.authHeaderHint': 'Anthropic 协议下可选 x-api-key 或 authorization', + 'view.config.authHeaderDefault': '默认 (Authorization)', + 'view.config.backToList': '← 返回列表', + 'view.config.optional': '(可选)', + 'view.config.ocrVersionTooltip': 'Open Code Review CLI 版本', + + 'view.env.installing': '正在安装 ocr CLI…', + 'view.env.checking': '正在检测,请稍候…', + 'view.env.ready': '环境已就绪,可继续配置 Provider。', + 'view.env.stepLead': '按顺序完成环境准备,通过一项后再进行下一项。', + 'view.env.nodeHint': '未检测到 Node.js。请前往 nodejs.org 安装 LTS 版本,完成后重启 VS Code。', + 'view.env.npmHint': '未检测到 npm。npm 通常随 Node 一起安装,请确认 Node 安装完整。', + 'view.env.ocrHint': '在终端全局安装 open-code-review,或点击下方「一键安装」。', + 'view.env.oneClickInstall': '一键安装', + 'view.env.redetect': '重新检测', + 'view.env.checkingStatus': '检测中', + 'view.env.readyStatus': '就绪', + 'view.env.notReady': '未就绪', + 'view.env.pass': '通过', + 'view.env.fail': '未通过', + 'view.env.waitPrev': '等待上一步', + 'view.env.copy': '复制', + 'view.env.copiedToast': '已复制到剪贴板 ✓', + + 'cmp.custom.title': '自定义 Provider', + 'cmp.custom.desc': '管理自建 LLM 网关与兼容端点,可切换为当前审查模型。', + 'cmp.custom.add': '添加', + 'cmp.custom.empty': '暂无自定义 Provider', + 'cmp.custom.addFirst': '添加自定义 Provider', + 'cmp.custom.currentUse': '当前使用', + 'cmp.custom.model': '模型', + 'cmp.custom.edit': '编辑', + 'cmp.custom.setCurrent': '设为当前', + 'cmp.custom.delete': '删除', + + 'cmp.fileList.pending': '待审查文件', + 'cmp.fileList.noChanges': '无变更文件', + 'cmp.fileList.viewDiff': '点击查看 diff', + + 'cmp.log.waiting': '等待输出', + + 'cmp.comment.view': '查看', + 'cmp.comment.discard': '忽略', + + 'cmp.password.hideSecret': '隐藏密钥', + 'cmp.password.showSecret': '显示密钥', + + 'cmp.select.placeholder': '请选择', + + 'ext.commentController': 'Open Code Review', + 'ext.configPanelTitle': '模型配置', + 'ext.config.legacyDisplayName': 'Legacy LLM 端点', + 'ext.comment.threadLabel': 'Code Review', + 'ext.comment.pending': '⏳ [未处理]', + 'ext.comment.noSuggestion': '_💡 无代码建议,请手动处理_', + 'ext.comment.applyFailedStale': '应用失败:代码位置已失效,请刷新后重试。', + 'ext.comment.applyFailedLocked': '应用失败:无法修改文件,请检查文件是否被占用或处于只读状态。', + 'ext.comment.statusApplied': '✅ [已应用]', + 'ext.comment.statusDiscarded': '✅ [已忽略]', + 'ext.comment.statusFalsePositive': '✅ [已误报]', + 'ext.comment.jumpFailed': '无法定位到 ', + 'ext.comment.jumpNotAFile': ':该路径不是可打开的文件。', + 'ext.deleteProviderConfirm': '确定删除自定义 Provider「{name}」?', + 'ext.deleteProviderConfirmBtn': '删除', + 'ext.git.justNow': '刚刚', + 'ext.git.hoursAgo': '{h} 小时前', + 'ext.git.yesterday': '昨天', + 'ext.git.daysAgo': '{d} 天前', + 'ext.git.workspaceVsHead': '工作区 ↔ HEAD', + 'ext.cli.installOk': '✓ 安装完成', + 'ext.cli.installFail': '✗ 安装失败 (exit ', + }, +}; + +export function t(locale: SupportedLocale, key: string): string { + return messages[locale]?.[key] ?? messages.en[key] ?? key; +} + +/** + * Resolve a VS Code locale string to a {@link SupportedLocale}. + * Only `zh-cn` (case-insensitive) maps to Simplified Chinese; + * other Chinese variants like `zh-tw` / `zh-hk` fall back to English + * until their translations are added. + */ +export function resolveLocale(raw: string): SupportedLocale { + if (raw.toLowerCase() === 'zh-cn') return 'zh-cn'; + return 'en'; +} \ No newline at end of file diff --git a/extensions/vscode/src/shared/messages.ts b/extensions/vscode/src/shared/messages.ts index a868c48..f9239c3 100644 --- a/extensions/vscode/src/shared/messages.ts +++ b/extensions/vscode/src/shared/messages.ts @@ -28,7 +28,7 @@ export type WebviewToHost = | { type: 'commentAction'; index: number; action: 'apply' | 'discard' | 'falsePositive' }; export type HostToWebview = - | { type: 'init'; config: OcrConfig | null; gitState: GitState } + | { type: 'init'; config: OcrConfig | null; gitState: GitState; locale: string } | { type: 'gitState'; gitState: GitState } | { type: 'modeFiles'; mode: ReviewMode; files: FileChange[] } | { type: 'logLine'; line: LogLine } @@ -38,7 +38,7 @@ export type HostToWebview = | { type: 'commentSync'; comments: CommentSyncState[] }; export type ConfigPanelHostToWebview = - | { type: 'configPanelInit'; config: OcrConfig | null; focus?: ConfigPanelFocus | null; env?: EnvCheckResult | null; skipEnvCheck?: boolean } + | { type: 'configPanelInit'; config: OcrConfig | null; focus?: ConfigPanelFocus | null; env?: EnvCheckResult | null; skipEnvCheck?: boolean; locale: string } | { type: 'configPanelFocus'; focus?: ConfigPanelFocus | null } | { type: 'config'; config: OcrConfig | null } | { type: 'connectionResult'; ok: boolean; message?: string } @@ -47,4 +47,4 @@ export type ConfigPanelHostToWebview = | { type: 'copyDone' } | { type: 'panelError'; message: string } | { type: 'installLog'; line: LogLine } - | { type: 'installDone'; ok: boolean }; + | { type: 'installDone'; ok: boolean }; \ No newline at end of file diff --git a/extensions/vscode/src/webview/App.tsx b/extensions/vscode/src/webview/App.tsx index 3236268..58fcd75 100644 --- a/extensions/vscode/src/webview/App.tsx +++ b/extensions/vscode/src/webview/App.tsx @@ -1,3 +1,4 @@ +import { I18nContext, resolveLocale } from './I18nProvider'; import { useEffect, useReducer } from 'preact/hooks'; import { reducer, initialState } from './store'; import { bridge } from './bridge'; @@ -38,6 +39,7 @@ export function App() { }; return ( +
+ ); } diff --git a/extensions/vscode/src/webview/ConfigPanelApp.tsx b/extensions/vscode/src/webview/ConfigPanelApp.tsx index 9721c15..1439a12 100644 --- a/extensions/vscode/src/webview/ConfigPanelApp.tsx +++ b/extensions/vscode/src/webview/ConfigPanelApp.tsx @@ -1,3 +1,4 @@ +import { I18nContext, resolveLocale } from './I18nProvider'; import { useEffect, useReducer } from 'preact/hooks'; import { bridge } from './bridge'; import { ConfigView } from './views/ConfigView'; @@ -38,6 +39,7 @@ export function ConfigPanelApp() { }, [state.errorHint]); return ( +
{state.copyHint &&
{state.copyHint}
} {state.errorHint &&
{state.errorHint}
} @@ -63,5 +65,6 @@ export function ConfigPanelApp() { onClose={() => bridge.post({ type: 'closeConfigPanel' })} />
+
); } diff --git a/extensions/vscode/src/webview/I18nProvider.tsx b/extensions/vscode/src/webview/I18nProvider.tsx new file mode 100644 index 0000000..b0a5b76 --- /dev/null +++ b/extensions/vscode/src/webview/I18nProvider.tsx @@ -0,0 +1,13 @@ +import { createContext } from 'preact'; +import { useContext } from 'preact/hooks'; +import { t, resolveLocale, SupportedLocale } from '../shared/i18n'; + +export const I18nContext = createContext('en'); + +export function useT(): (key: string) => string { + const locale = useContext(I18nContext); + return (key: string) => t(locale, key); +} + +export { resolveLocale, t }; +export type { SupportedLocale }; \ No newline at end of file diff --git a/extensions/vscode/src/webview/components/CommentCard.tsx b/extensions/vscode/src/webview/components/CommentCard.tsx index 59a5150..2e6b9d2 100644 --- a/extensions/vscode/src/webview/components/CommentCard.tsx +++ b/extensions/vscode/src/webview/components/CommentCard.tsx @@ -1,3 +1,4 @@ +import { useT } from '../I18nProvider'; import { ReviewComment, CommentStatus } from '../../shared/types'; interface Props { @@ -10,6 +11,7 @@ interface Props { } export function CommentCard({ comment, index, status, canJump, onOpen, onAction }: Props) { + const t = useT(); return (
@@ -18,8 +20,8 @@ export function CommentCard({ comment, index, status, canJump, onOpen, onAction
{comment.content}
- {canJump && } - + {canJump && } +
); diff --git a/extensions/vscode/src/webview/components/CustomProviderManager.tsx b/extensions/vscode/src/webview/components/CustomProviderManager.tsx index ef1317a..f43ecc8 100644 --- a/extensions/vscode/src/webview/components/CustomProviderManager.tsx +++ b/extensions/vscode/src/webview/components/CustomProviderManager.tsx @@ -1,5 +1,6 @@ import { listCustomProviderNames } from '../../shared/configUtils'; import { OcrConfig, ProviderEntry } from '../../shared/types'; +import { useT } from '../I18nProvider'; interface Props { config: OcrConfig | null; @@ -16,6 +17,7 @@ function formatModels(entry: ProviderEntry): string { } export function CustomProviderManager({ config, onAdd, onEdit, onActivate, onDelete }: Props) { + const t = useT(); const names = listCustomProviderNames(config); const activeProvider = config?.provider ?? ''; @@ -23,16 +25,16 @@ export function CustomProviderManager({ config, onAdd, onEdit, onActivate, onDel
-

自定义 Provider

-

管理自建 LLM 网关与兼容端点,可切换为当前审查模型。

+

{t('cmp.custom.title')}

+

{t('cmp.custom.desc')}

- +
{names.length === 0 ? (
-

暂无自定义 Provider

- +

{t('cmp.custom.empty')}

+
) : (
@@ -45,21 +47,21 @@ export function CustomProviderManager({ config, onAdd, onEdit, onActivate, onDel
{name} - {isActive && 当前使用} + {isActive && {t('cmp.custom.currentUse')}}
{entry.protocol || '—'} · {entry.url || '—'}
-
模型:{formatModels(entry)}
+
{t('cmp.custom.model')}: {formatModels(entry)}
- + {!isActive && ( - + )} - +
); @@ -68,4 +70,4 @@ export function CustomProviderManager({ config, onAdd, onEdit, onActivate, onDel )}
); -} +} \ No newline at end of file diff --git a/extensions/vscode/src/webview/components/EnvSetupGuide.tsx b/extensions/vscode/src/webview/components/EnvSetupGuide.tsx index 72af1f5..93266db 100644 --- a/extensions/vscode/src/webview/components/EnvSetupGuide.tsx +++ b/extensions/vscode/src/webview/components/EnvSetupGuide.tsx @@ -1,6 +1,7 @@ import { EnvCheckResult, LogLine } from '../../shared/types'; import { CliStatus } from '../configStore'; import { LogViewer } from './LogViewer'; +import { useT } from '../I18nProvider'; export const OCR_INSTALL_CMD = 'npm install -g @alibaba-group/open-code-review'; @@ -40,12 +41,13 @@ export function EnvSetupGuide({ layout, cliStatus, envCheck, skipEnvCheck = false, installing, installLogs, onInstall, onCheckEnv, onCopy, onNext, }: Props) { + const t = useT(); const checking = cliStatus === 'checking' || cliStatus === 'unknown'; if (installing) { return (
- +
); @@ -54,7 +56,7 @@ export function EnvSetupGuide({ if (checking) { return (
- +
); @@ -66,7 +68,7 @@ export function EnvSetupGuide({
- +
@@ -76,10 +78,10 @@ export function EnvSetupGuide({ if (cliStatus === 'installed' && skipEnvCheck) { return (
-

环境已就绪,可继续配置 Provider。

+

{t('view.env.ready')}

- +
@@ -92,7 +94,7 @@ export function EnvSetupGuide({ return (
-

按顺序完成环境准备,通过一项后再进行下一项。

+

{t('view.env.stepLead')}

@@ -124,9 +126,9 @@ export function EnvSetupGuide({
- + {ocrActive && !envCheck?.ocr.ok && ( - + )}
@@ -144,6 +146,7 @@ function EnvCheckingBanner({ label }: { label: string }) { } function EnvChecklist({ checking, env }: { checking?: boolean; env?: EnvCheckResult }) { + const t = useT(); return (
    {CHECK_ITEMS.map(({ key, label }, i) => { @@ -155,9 +158,9 @@ function EnvChecklist({ checking, env }: { checking?: boolean; env?: EnvCheckRes
); -} +} \ No newline at end of file diff --git a/extensions/vscode/src/webview/components/FileList.tsx b/extensions/vscode/src/webview/components/FileList.tsx index 7c6c68e..7f592f9 100644 --- a/extensions/vscode/src/webview/components/FileList.tsx +++ b/extensions/vscode/src/webview/components/FileList.tsx @@ -1,3 +1,4 @@ +import { useT } from '../I18nProvider'; import { FileChange } from '../../shared/types'; const BADGE: Record = { @@ -7,9 +8,10 @@ const BADGE: Record = { interface Props { files: FileChange[]; loading?: boolean; onOpenFile?: (file: FileChange) => void; } export function FileList({ files, loading, onOpenFile }: Props) { + const t = useT(); return (
-
待审查文件 {loading ? '' : `(${files.length})`}
+
{t('cmp.fileList.pending')} {loading ? '' : `(${files.length})`}
{loading ? (
{[68, 52, 60].map((w, i) => ( @@ -19,11 +21,11 @@ export function FileList({ files, loading, onOpenFile }: Props) { ))}
) : files.length === 0 ? ( -
无变更文件
+
{t('cmp.fileList.noChanges')}
) : (
{files.map((f) => ( -
onOpenFile(f) : undefined}> {f.path} {BADGE[f.status]} diff --git a/extensions/vscode/src/webview/components/LogViewer.tsx b/extensions/vscode/src/webview/components/LogViewer.tsx index dc6fc9e..f73a110 100644 --- a/extensions/vscode/src/webview/components/LogViewer.tsx +++ b/extensions/vscode/src/webview/components/LogViewer.tsx @@ -1,3 +1,4 @@ +import { useT } from '../I18nProvider'; import { useRef, useEffect } from 'preact/hooks'; import { LogLine } from '../../shared/types'; @@ -5,6 +6,7 @@ interface Props { logs: LogLine[]; } export function LogViewer({ logs }: Props) { const ref = useRef(null); + const t = useT(); useEffect(() => { if (ref.current) ref.current.scrollTop = ref.current.scrollHeight; @@ -13,7 +15,7 @@ export function LogViewer({ logs }: Props) { return (
{logs.length === 0 ? ( -
等待输出
+
{t('cmp.log.waiting')}
) : ( logs.map((l, i) => (
{l.text}
diff --git a/extensions/vscode/src/webview/components/PasswordInput.tsx b/extensions/vscode/src/webview/components/PasswordInput.tsx index a3381c7..aa5ae06 100644 --- a/extensions/vscode/src/webview/components/PasswordInput.tsx +++ b/extensions/vscode/src/webview/components/PasswordInput.tsx @@ -1,3 +1,4 @@ +import { useT } from '../I18nProvider'; import { useState } from 'preact/hooks'; interface Props { @@ -29,6 +30,7 @@ function EyeOffIcon() { export function PasswordInput({ value, placeholder, className, onInput }: Props) { const [visible, setVisible] = useState(false); + const t = useT(); return (
@@ -43,7 +45,7 @@ export function PasswordInput({ value, placeholder, className, onInput }: Props) type="button" class="password-toggle" onClick={() => setVisible(!visible)} - aria-label={visible ? '隐藏密钥' : '显示密钥'} + aria-label={visible ? t('cmp.password.hideSecret') : t('cmp.password.showSecret')} tabIndex={-1} > {visible ? : } diff --git a/extensions/vscode/src/webview/components/Select.tsx b/extensions/vscode/src/webview/components/Select.tsx index bfea967..74014ad 100644 --- a/extensions/vscode/src/webview/components/Select.tsx +++ b/extensions/vscode/src/webview/components/Select.tsx @@ -1,3 +1,4 @@ +import { useT } from '../I18nProvider'; import { useState, useRef, useEffect } from 'preact/hooks'; export interface SelectOption { @@ -12,7 +13,9 @@ interface Props { onChange: (value: string) => void; } -export function Select({ value, options, placeholder = '请选择', onChange }: Props) { +export function Select({ value, options, placeholder, onChange }: Props) { + const t = useT(); + const resolvedPlaceholder = placeholder ?? t('cmp.select.placeholder'); const [open, setOpen] = useState(false); const ref = useRef(null); @@ -33,7 +36,7 @@ export function Select({ value, options, placeholder = '请选择', onChange }:
diff --git a/extensions/vscode/src/webview/configStore.ts b/extensions/vscode/src/webview/configStore.ts index 0602a51..fdf2b3b 100644 --- a/extensions/vscode/src/webview/configStore.ts +++ b/extensions/vscode/src/webview/configStore.ts @@ -1,6 +1,7 @@ import { ConfigPanelFocus, isConfigReady } from '../shared/configUtils'; import { ConfigPanelHostToWebview, HostToWebview } from '../shared/messages'; import { EnvCheckResult, OcrConfig, LogLine } from '../shared/types'; +import { resolveLocale, t } from '../shared/i18n'; export type CliStatus = 'unknown' | 'checking' | 'installed' | 'missing'; export type ConnTest = { status: 'idle' | 'testing' | 'ok' | 'fail'; message?: string }; @@ -16,6 +17,7 @@ export interface ConfigPanelState { connTest: ConnTest; copyHint: string; errorHint: string; + locale: string; } export const configPanelInitialState: ConfigPanelState = { @@ -29,6 +31,7 @@ export const configPanelInitialState: ConfigPanelState = { connTest: { status: 'idle' }, copyHint: '', errorHint: '', + locale: 'en', }; export type ConfigPanelLocalAction = @@ -66,6 +69,7 @@ export function configPanelReducer( skipEnvCheck, envCheck: env, cliStatus: env ? envToCliStatus(env) : (skipEnvCheck ? 'installed' : 'unknown'), + locale: msg.locale, }; } case 'configPanelFocus': @@ -90,7 +94,7 @@ export function configPanelReducer( case 'installDone': return { ...state, installing: false }; case 'copyDone': - return { ...state, copyHint: '已复制到剪贴板' }; + return { ...state, copyHint: t(resolveLocale(state.locale), 'view.env.copiedToast') }; case 'clearCopyHint': return { ...state, copyHint: '' }; case 'clearErrorHint': diff --git a/extensions/vscode/src/webview/store.ts b/extensions/vscode/src/webview/store.ts index 64d57d9..47b9a82 100644 --- a/extensions/vscode/src/webview/store.ts +++ b/extensions/vscode/src/webview/store.ts @@ -13,6 +13,7 @@ export interface AppState { session: { state: ReviewState; result: CliResult | null; error?: string }; commentStatus: Record; reviewMode: ReviewMode; + locale: string; } export const initialState: AppState = { @@ -25,6 +26,7 @@ export const initialState: AppState = { session: { state: 'idle', result: null }, commentStatus: {}, reviewMode: 'workspace', + locale: 'en', }; const STATE_TO_VIEW: Record = { @@ -49,6 +51,7 @@ export function reducer(state: AppState, msg: HostToWebview | LocalAction): AppS gitState: msg.gitState, view: 'idle', filesLoading: false, + locale: msg.locale, }; case 'gitState': return { ...state, gitState: msg.gitState, filesLoading: false }; diff --git a/extensions/vscode/src/webview/views/CancelledView.tsx b/extensions/vscode/src/webview/views/CancelledView.tsx index 4314dc4..932ac0c 100644 --- a/extensions/vscode/src/webview/views/CancelledView.tsx +++ b/extensions/vscode/src/webview/views/CancelledView.tsx @@ -1,7 +1,9 @@ +import { useT } from '../I18nProvider'; export function CancelledView() { + const t = useT(); return (
-
审查已取消
+
{t('view.cancelled.title')}
); } diff --git a/extensions/vscode/src/webview/views/ConfigView.tsx b/extensions/vscode/src/webview/views/ConfigView.tsx index 4246248..383e91e 100644 --- a/extensions/vscode/src/webview/views/ConfigView.tsx +++ b/extensions/vscode/src/webview/views/ConfigView.tsx @@ -6,9 +6,9 @@ import { EnvCheckResult, LogLine, OcrConfig } from '../../shared/types'; import { CliStatus, ConnTest } from '../configStore'; import { CustomProviderManager } from '../components/CustomProviderManager'; import { EnvSetupGuide } from '../components/EnvSetupGuide'; -import { LogViewer } from '../components/LogViewer'; import { PasswordInput } from '../components/PasswordInput'; import { Select } from '../components/Select'; +import { useT } from '../I18nProvider'; interface Props { layout?: 'modal' | 'panel'; @@ -71,15 +71,16 @@ export function ConfigView({ }, [panelFocus, config, onClearConnTest]); const wide = layout === 'panel'; + const t = useT(); const stepper = (
1 - 环境检测 + {t('view.config.step1')}
2 - Provider 配置 + {t('view.config.step2')}
); @@ -129,8 +130,8 @@ export function ConfigView({
-

模型配置

-

连接 LLM Provider 以开始代码审查

+

{t('view.config.title')}

+

{t('view.config.desc')}

@@ -147,10 +148,10 @@ export function ConfigView({ <>
- 模型配置 - 连接 LLM Provider 以开始代码审查 + {t('view.config.title')} + {t('view.config.desc')}
- +
{stepper} {stepContent} @@ -167,16 +168,17 @@ export function ConfigView({ } function OcrVersionMeta({ envCheck, cliStatus }: { envCheck: EnvCheckResult | null; cliStatus: CliStatus }) { - let label = 'ocr 检测中…'; + const t = useT(); + let label = t('view.config.checking'); if (envCheck?.ocr.ok && envCheck.ocr.version) { label = envCheck.ocr.version.startsWith('v') ? envCheck.ocr.version : `v${envCheck.ocr.version}`; } else if (envCheck && !envCheck.ocr.ok) { - label = 'ocr 未安装'; + label = t('view.config.notInstalled'); } else if (cliStatus !== 'checking' && cliStatus === 'missing') { - label = 'ocr 未安装'; + label = t('view.config.notInstalled'); } return ( -
+
OCR {label}
@@ -184,21 +186,23 @@ function OcrVersionMeta({ envCheck, cliStatus }: { envCheck: EnvCheckResult | nu } function ActiveProviderBanner({ config }: { config: OcrConfig | null }) { + const t = useT(); const active = describeActiveProvider(config); if (!active) { return (
- 当前使用 - 尚未配置 Provider + {t('view.config.currentUse')} + {t('view.config.notConfigured')}
); } - const kindLabel = active.kind === 'official' ? '官方' : active.kind === 'custom' ? '自定义' : 'Legacy'; + const kindLabel = active.kind === 'official' ? t('view.config.officialLabel') : active.kind === 'custom' ? t('view.config.customLabel') : t('view.config.legacyLabel'); + const displayName = active.kind === 'legacy' ? t('ext.config.legacyDisplayName') : active.displayName; return (
- 当前使用 + {t('view.config.currentUse')} {kindLabel} - {active.displayName} + {displayName} · {active.model} {active.detail && ( @@ -231,12 +235,13 @@ function ProviderStep({ onActivateCustomProvider?: (name: string) => void; onClearConnTest?: () => void; }) { + const t = useT(); return (
{([ - ['official', '官方 Provider'], - ['custom', '自定义 Provider'], + ['official', t('view.config.official')], + ['custom', t('view.config.custom')], ] as const).map(([id, label]) => ( - - + + +
); -} +} \ No newline at end of file diff --git a/extensions/vscode/src/webview/views/DoneView.tsx b/extensions/vscode/src/webview/views/DoneView.tsx index 8b555f3..41b92d2 100644 --- a/extensions/vscode/src/webview/views/DoneView.tsx +++ b/extensions/vscode/src/webview/views/DoneView.tsx @@ -2,6 +2,7 @@ import { useState } from 'preact/hooks'; import { CliResult, CommentStatus, LogLine } from '../../shared/types'; import { CommentCard } from '../components/CommentCard'; import { LogViewer } from '../components/LogViewer'; +import { useT } from '../I18nProvider'; interface Props { result: CliResult; @@ -14,19 +15,20 @@ interface Props { export function DoneView({ result, commentStatus, logs, canJump, onOpen, onAction }: Props) { const [showLogs, setShowLogs] = useState(false); + const t = useT(); const s = result.summary; return (
- {result.comments.length} 条评论 · {s?.filesReviewed ?? 0} 个文件 · {s?.elapsed ?? ''} + {result.comments.length} {t('view.done.comments')} · {s?.filesReviewed ?? 0} {t('view.done.files')} · {s?.elapsed ?? ''}
{logs.length > 0 && (
{showLogs && }
@@ -38,4 +40,4 @@ export function DoneView({ result, commentStatus, logs, canJump, onOpen, onActio ))}
); -} +} \ No newline at end of file diff --git a/extensions/vscode/src/webview/views/EmptyView.tsx b/extensions/vscode/src/webview/views/EmptyView.tsx index e0f2eb2..2218853 100644 --- a/extensions/vscode/src/webview/views/EmptyView.tsx +++ b/extensions/vscode/src/webview/views/EmptyView.tsx @@ -1,27 +1,29 @@ import { useState } from 'preact/hooks'; import { LogLine } from '../../shared/types'; import { LogViewer } from '../components/LogViewer'; +import { useT } from '../I18nProvider'; interface Props { logs?: LogLine[]; } export function EmptyView({ logs = [] }: Props) { const [showLogs, setShowLogs] = useState(false); + const t = useT(); return (
-
未发现问题 · 已通过
+
{t('view.empty.noIssues')}
{logs.length > 0 && (
{showLogs && }
)}
); -} +} \ No newline at end of file diff --git a/extensions/vscode/src/webview/views/FailedView.tsx b/extensions/vscode/src/webview/views/FailedView.tsx index 60b490d..f7a88cf 100644 --- a/extensions/vscode/src/webview/views/FailedView.tsx +++ b/extensions/vscode/src/webview/views/FailedView.tsx @@ -1,11 +1,14 @@ +import { useT } from '../I18nProvider'; + interface Props { onRetry: () => void; error?: string; } export function FailedView({ onRetry, error }: Props) { + const t = useT(); return (
-
审查失败。
{error ? '请检查模型配置后重试。' : '请检查 API Key 和网络连接。'}
+
{t('view.failed.title')}
{error ? t('view.failed.checkConfig') : t('view.failed.checkApiKey')}
{error &&
{error}
} - +
); diff --git a/extensions/vscode/src/webview/views/IdleView.tsx b/extensions/vscode/src/webview/views/IdleView.tsx index 5f9503d..7de4974 100644 --- a/extensions/vscode/src/webview/views/IdleView.tsx +++ b/extensions/vscode/src/webview/views/IdleView.tsx @@ -1,23 +1,9 @@ import { useState, useEffect } from 'preact/hooks'; +import { useT } from '../I18nProvider'; import { GitState, ReviewMode, CliRunOptions, FileChange } from '../../shared/types'; import { FileList } from '../components/FileList'; import { Select } from '../components/Select'; -function getPrimaryLabel(params: { - configured: boolean; - running?: boolean; - selectionReady: boolean; - mode: ReviewMode; - filesCount: number; -}): string { - if (!params.configured) return '请先配置模型'; - if (params.running) return '审查中…'; - if (!params.selectionReady) { - return params.mode === 'branch' ? '请选择对比分支' : '请选择提交'; - } - if (params.filesCount === 0) return '无可审查文件'; - return '审查所有变更'; -} interface Props { gitState: GitState; @@ -39,6 +25,17 @@ export function IdleView({ gitState, modeFiles, filesLoading, configured, onMode const [to, setTo] = useState(''); const [commit, setCommit] = useState(''); const [prompt, setPrompt] = useState(''); + const t = useT(); + + const getPrimaryLabel = () => { + if (!configured) return t('view.idle.configFirst'); + if (running) return t('view.idle.reviewing'); + if (!selectionReady) { + return mode === 'branch' ? t('view.idle.selectBranch') : t('view.idle.selectCommit'); + } + if (files.length === 0) return t('view.idle.noFiles'); + return t('view.idle.reviewAll'); + }; const switchMode = (m: ReviewMode) => { setMode(m); onModeChange(m); }; @@ -75,25 +72,25 @@ export function IdleView({ gitState, modeFiles, filesLoading, configured, onMode
{(['workspace', 'branch', 'commit'] as ReviewMode[]).map((m) => ( ))}
{mode === 'branch' && (
-
基础引用
- ({ value: b, label: b }))} /> -
目标引用
- ({ value: b, label: b }))} />
)} {mode === 'commit' && (
-
提交历史
+
{t('view.idle.commitHistory')}
{gitState.recentCommits.map((c) => (