diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 95d5449..7f48feb 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -85,14 +85,15 @@ "submit_button": "Login", "submitting": "Connecting...", "error_title": "Login Failed", + "error_backend_detail": "Backend response", "error_required": "Please fill in complete connection information", - "error_invalid": "Connection failed, please check address and key", + "error_invalid": "Connection failed, please check the server address, Management API, and management key", "error_network": "Network connection failed, please check your network or server address", "error_timeout": "Connection timed out, server not responding", - "error_unauthorized": "Authentication failed, invalid management key", - "error_forbidden": "Access denied, insufficient permissions", - "error_not_found": "Server address invalid or management API not enabled", - "error_server": "Internal server error, please try again later", + "error_unauthorized": "Authentication failed, management key is missing or invalid", + "error_forbidden": "Access denied, remote management is disabled, the management key is not configured, or this IP is temporarily banned", + "error_not_found": "Management API not found, confirm the server address points to the CLIProxyAPI backend", + "error_server": "Backend failed while handling the management request, check the server logs", "error_cors": "Cross-origin request blocked, please check server configuration", "error_ssl": "SSL/TLS certificate verification failed" }, diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 6cf6082..66a18fa 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -85,14 +85,15 @@ "submit_button": "Войти", "submitting": "Подключение...", "error_title": "Ошибка входа", + "error_backend_detail": "Ответ сервера", "error_required": "Пожалуйста, заполните все данные подключения", - "error_invalid": "Подключение не удалось, проверьте адрес и ключ", + "error_invalid": "Подключение не удалось, проверьте адрес сервера, Management API и ключ управления", "error_network": "Сетевая ошибка, проверьте подключение или адрес сервера", "error_timeout": "Время ожидания истекло, сервер не отвечает", - "error_unauthorized": "Аутентификация не удалась, неверный ключ управления", - "error_forbidden": "Доступ запрещён, недостаточно прав", - "error_not_found": "Неверный адрес сервера или интерфейс управления не включён", - "error_server": "Внутренняя ошибка сервера, попробуйте позже", + "error_unauthorized": "Аутентификация не удалась, ключ управления отсутствует или неверен", + "error_forbidden": "Доступ запрещён: удалённое управление отключено, ключ управления не настроен или IP временно заблокирован", + "error_not_found": "Management API не найден, проверьте, что адрес указывает на backend CLIProxyAPI", + "error_server": "Backend не смог обработать запрос управления, проверьте журналы сервера", "error_cors": "Блокировка CORS, проверьте конфигурацию сервера", "error_ssl": "Ошибка проверки SSL/TLS сертификата" }, diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index d7c8204..6a0d1ce 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -85,14 +85,15 @@ "submit_button": "登录", "submitting": "连接中...", "error_title": "登录失败", + "error_backend_detail": "后端返回", "error_required": "请填写完整的连接信息", - "error_invalid": "连接失败,请检查地址和密钥", + "error_invalid": "连接失败,请检查服务地址、管理接口和管理密钥", "error_network": "网络连接失败,请检查网络或服务器地址", "error_timeout": "连接超时,服务器无响应", - "error_unauthorized": "认证失败,管理密钥无效", - "error_forbidden": "访问被拒绝,权限不足", - "error_not_found": "服务器地址无效或管理接口未启用", - "error_server": "服务器内部错误,请稍后重试", + "error_unauthorized": "认证失败,管理密钥缺失或无效", + "error_forbidden": "访问被拒绝,远程管理未启用、管理密钥未配置或 IP 被临时封禁", + "error_not_found": "未找到 Management API,请确认服务地址指向 CLIProxyAPI 后端", + "error_server": "后端处理管理接口时发生错误,请查看服务日志", "error_cors": "跨域请求被阻止,请检查服务器配置", "error_ssl": "SSL/TLS 证书验证失败" }, diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index ffdc69a..15ea873 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -85,14 +85,15 @@ "submit_button": "登入", "submitting": "連線中...", "error_title": "登入失敗", + "error_backend_detail": "後端返回", "error_required": "請填寫完整的連線資訊", - "error_invalid": "連線失敗,請檢查位址和金鑰", + "error_invalid": "連線失敗,請檢查服務位址、管理介面和管理金鑰", "error_network": "網路連線失敗,請檢查網路或伺服器位址", "error_timeout": "連線逾時,伺服器無回應", - "error_unauthorized": "驗證失敗,管理金鑰無效", - "error_forbidden": "存取被拒絕,權限不足", - "error_not_found": "伺服器位址無效或管理介面未啟用", - "error_server": "伺服器內部錯誤,請稍後再試", + "error_unauthorized": "驗證失敗,管理金鑰缺失或無效", + "error_forbidden": "存取被拒絕,遠端管理未啟用、管理金鑰未設定或 IP 被暫時封鎖", + "error_not_found": "找不到 Management API,請確認服務位址指向 CLIProxyAPI 後端", + "error_server": "後端處理管理介面時發生錯誤,請查看服務日誌", "error_cors": "跨域請求被阻擋,請檢查伺服器設定", "error_ssl": "SSL/TLS 憑證驗證失敗" }, diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index 6a15197..bf610a1 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -32,18 +32,33 @@ function getLocalizedErrorMessage(error: unknown, t: (key: string) => string): s ? error : ''; + const withHttpStatus = (summary: string) => { + if (!status) { + return summary; + } + + const genericAxiosMessage = `Request failed with status code ${status}`; + const detail = message.trim(); + const backendDetail = + detail && detail !== genericAxiosMessage + ? ` (${t('login.error_backend_detail')}: ${detail})` + : ''; + + return `HTTP ${status}: ${summary}${backendDetail}`; + }; + // 根据 HTTP 状态码判断 if (status === 401) { - return t('login.error_unauthorized'); + return withHttpStatus(t('login.error_unauthorized')); } if (status === 403) { - return t('login.error_forbidden'); + return withHttpStatus(t('login.error_forbidden')); } if (status === 404) { - return t('login.error_not_found'); + return withHttpStatus(t('login.error_not_found')); } if (status && status >= 500) { - return t('login.error_server'); + return withHttpStatus(t('login.error_server')); } // 根据 axios 错误码判断 @@ -63,7 +78,7 @@ function getLocalizedErrorMessage(error: unknown, t: (key: string) => string): s } // 默认错误消息 - return t('login.error_invalid'); + return withHttpStatus(t('login.error_invalid')); } export function LoginPage() {