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