From 8ae68c18054eb942f10c72d8a2a9102078d1ab15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Fri, 17 Apr 2026 20:33:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20ClaudeOfficialLogin=20=E2=80=94?= =?UTF-8?q?=20i18n=E3=80=81=E9=94=99=E8=AF=AF=E5=8F=8D=E9=A6=88=E3=80=81?= =?UTF-8?q?=E5=86=97=E4=BD=99=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code review follow-ups on ae5437a: - I1: 使用 useTranslation 替代硬编码中文, 新增 settings.claudeOfficialLogin.* 双语 key - I2: shellOpen 失败时 console.error + 写入 store.error, 不再静默吞 - M1: disabled={isLoading || false} → disabled={isLoading} - M2: onClick={() => logout()} → onClick={logout} - M3: 首次 fetchStatus 失败时显示 error 而非永远 "加载中…" Co-Authored-By: Claude Opus 4.7 (1M context) --- .../settings/ClaudeOfficialLogin.tsx | 45 ++++++++++++++----- desktop/src/i18n/locales/en.ts | 11 +++++ desktop/src/i18n/locales/zh.ts | 11 +++++ 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/desktop/src/components/settings/ClaudeOfficialLogin.tsx b/desktop/src/components/settings/ClaudeOfficialLogin.tsx index 81c6caf2..c6e1aa00 100644 --- a/desktop/src/components/settings/ClaudeOfficialLogin.tsx +++ b/desktop/src/components/settings/ClaudeOfficialLogin.tsx @@ -7,8 +7,10 @@ import { useEffect } from 'react' import { open as shellOpen } from '@tauri-apps/plugin-shell' import { useHahaOAuthStore } from '../../stores/hahaOAuthStore' +import { useTranslation } from '../../i18n' export function ClaudeOfficialLogin() { + const t = useTranslation() const { status, isLoading, error, fetchStatus, login, logout, stopPolling } = useHahaOAuthStore() @@ -20,34 +22,52 @@ export function ClaudeOfficialLogin() { const handleLogin = async () => { try { const { authorizeUrl } = await login() - await shellOpen(authorizeUrl) + try { + await shellOpen(authorizeUrl) + } catch (err) { + console.error('[ClaudeOfficialLogin] shellOpen failed:', err) + useHahaOAuthStore.setState({ + error: t('settings.claudeOfficialLogin.openBrowserFailed'), + }) + } } catch { - // error 已经在 store 里,不做额外处理 + // store.login() errors are already captured into store.error } } if (status === null) { + if (error) { + return ( +
+ {t('settings.claudeOfficialLogin.errorPrefix')}{error} +
+ ) + } return ( -
加载中…
+
+ {t('common.loading')} +
) } if (status.loggedIn) { const subTypeLabel = status.subscriptionType ? status.subscriptionType.toUpperCase() - : '未知' + : t('settings.claudeOfficialLogin.subTypeUnknown') return (
- ✓ 已登录(Claude {subTypeLabel}) + ✓ {t('settings.claudeOfficialLogin.loggedInPrefix')} {subTypeLabel})
) @@ -56,20 +76,21 @@ export function ClaudeOfficialLogin() { return (
- 使用官方 Claude 模型需要登录你的 Claude.ai 账号。点击下方按钮,浏览器会 - 打开 Claude 官方登录页面,授权后自动回到这里。 + {t('settings.claudeOfficialLogin.intro')}
{error && (
- 错误:{error} + {t('settings.claudeOfficialLogin.errorPrefix')}{error}
)}
diff --git a/desktop/src/i18n/locales/en.ts b/desktop/src/i18n/locales/en.ts index f59cb6c5..316432b6 100644 --- a/desktop/src/i18n/locales/en.ts +++ b/desktop/src/i18n/locales/en.ts @@ -50,6 +50,17 @@ export const en = { 'settings.tab.general': 'General', 'settings.tab.skills': 'Skills', + // Settings > Claude Official Login + 'settings.claudeOfficialLogin.intro': 'Using official Claude models requires signing in to your Claude.ai account. Click the button below to open the official Claude login page in your browser; you\'ll be returned here after authorizing.', + 'settings.claudeOfficialLogin.loginButton': 'Sign in to Claude', + 'settings.claudeOfficialLogin.loginStarting': 'Opening…', + 'settings.claudeOfficialLogin.logoutButton': 'Sign out', + 'settings.claudeOfficialLogin.logoutProcessing': 'Processing…', + 'settings.claudeOfficialLogin.loggedInPrefix': 'Signed in (Claude', + 'settings.claudeOfficialLogin.subTypeUnknown': 'Unknown', + 'settings.claudeOfficialLogin.errorPrefix': 'Error: ', + 'settings.claudeOfficialLogin.openBrowserFailed': 'Failed to open browser; please visit the authorization URL manually.', + // Settings > Providers 'settings.providers.title': 'Providers', 'settings.providers.description': 'Manage API providers for model access.', diff --git a/desktop/src/i18n/locales/zh.ts b/desktop/src/i18n/locales/zh.ts index 2563db46..56401ef8 100644 --- a/desktop/src/i18n/locales/zh.ts +++ b/desktop/src/i18n/locales/zh.ts @@ -52,6 +52,17 @@ export const zh: Record = { 'settings.tab.general': '通用', 'settings.tab.skills': '技能', + // Settings > Claude Official Login + 'settings.claudeOfficialLogin.intro': '使用官方 Claude 模型需要登录你的 Claude.ai 账号。点击下方按钮,浏览器会打开 Claude 官方登录页面,授权后自动回到这里。', + 'settings.claudeOfficialLogin.loginButton': '登录 Claude 账号', + 'settings.claudeOfficialLogin.loginStarting': '正在启动…', + 'settings.claudeOfficialLogin.logoutButton': '登出', + 'settings.claudeOfficialLogin.logoutProcessing': '处理中…', + 'settings.claudeOfficialLogin.loggedInPrefix': '已登录(Claude', + 'settings.claudeOfficialLogin.subTypeUnknown': '未知', + 'settings.claudeOfficialLogin.errorPrefix': '错误:', + 'settings.claudeOfficialLogin.openBrowserFailed': '无法打开浏览器,请手动访问授权链接。', + // Settings > Providers 'settings.providers.title': '服务商', 'settings.providers.description': '管理 API 服务商以访问模型。',