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 服务商以访问模型。',