From 27034997a6e6ce3835af28ad25669291ed1f6163 Mon Sep 17 00:00:00 2001 From: Wangnov Date: Tue, 9 Sep 2025 11:22:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=BB=84=E4=BB=B6=E7=9A=84=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 扩展语言文件新增用户功能翻译键 - 新增 user.dashboard、user.login、user.management 翻译组 - 涵盖三语言支持(zh-cn/zh-tw/en) - 包含120+翻译键covering用户仪表板、登录、管理功能 * UserDashboardView.vue 完整国际化 - 集成useI18n composable - 国际化导航标签、统计卡片、账户信息 - 响应式翻译Toast消息和错误处理 * UserLoginView.vue 完整国际化 - 国际化登录表单标签、占位符、按钮文本 - 响应式验证消息和状态提示 - 支持动态语言切换 * UserManagementView.vue 完整国际化 - 国际化用户列表、搜索过滤器、操作按钮 - 响应式确认对话框和Toast通知 - 支持参数化翻译消息(用户名、数量等) Technical implementation: - 遵循Vue 3 Composition API最佳实践 - 保持响应式设计和暗黑模式兼容性 - 统一错误处理和用户体验 --- web/admin-spa/src/i18n/locales/en.js | 128 ++++++++++++++++++ web/admin-spa/src/i18n/locales/zh-cn.js | 128 ++++++++++++++++++ web/admin-spa/src/i18n/locales/zh-tw.js | 128 ++++++++++++++++++ web/admin-spa/src/views/UserDashboardView.vue | 52 +++---- web/admin-spa/src/views/UserLoginView.vue | 24 ++-- .../src/views/UserManagementView.vue | 80 +++++------ 6 files changed, 465 insertions(+), 75 deletions(-) diff --git a/web/admin-spa/src/i18n/locales/en.js b/web/admin-spa/src/i18n/locales/en.js index a5425e7e..7932a1a3 100644 --- a/web/admin-spa/src/i18n/locales/en.js +++ b/web/admin-spa/src/i18n/locales/en.js @@ -664,6 +664,134 @@ export default { batchAllFailed: 'All items failed to process' }, + // User-related translations + user: { + // User Dashboard + dashboard: { + title: 'Dashboard Overview', + welcomeMessage: 'Welcome to your Claude Relay dashboard', + + // Navigation tabs + overview: 'Overview', + apiKeys: 'API Keys', + usageStats: 'Usage Stats', + + // Welcome section + welcome: 'Welcome', + + // Stats cards + activeApiKeys: 'Active API Keys', + deletedApiKeys: 'Deleted API Keys', + totalRequests: 'Total Requests', + inputTokens: 'Input Tokens', + totalCost: 'Total Cost', + + // Account information section + accountInformation: 'Account Information', + username: 'Username', + displayName: 'Display Name', + email: 'Email', + role: 'Role', + memberSince: 'Member Since', + lastLogin: 'Last Login', + notAvailable: 'N/A', + + // Messages + logout: 'Logout', + logoutSuccess: 'Logged out successfully', + logoutFailed: 'Logout failed', + loadProfileFailed: 'Failed to load user profile', + loadStatsFailed: 'Failed to load API keys stats' + }, + + // User Login + login: { + title: 'User Sign In', + subtitle: 'Sign in to your account to manage your API keys', + username: 'Username', + password: 'Password', + usernamePlaceholder: 'Enter your username', + passwordPlaceholder: 'Enter your password', + signIn: 'Sign In', + signingIn: 'Signing In...', + adminLogin: 'Admin Login', + + // Validation and error messages + requiredFields: 'Please enter both username and password', + loginSuccess: 'Login successful!', + loginFailed: 'Login failed' + }, + + // User Management + management: { + title: 'User Management', + description: 'Manage users, their API keys, and view usage statistics', + refresh: 'Refresh', + + // Stats cards + totalUsers: 'Total Users', + activeUsers: 'Active Users', + totalApiKeys: 'Total API Keys', + totalCost: 'Total Cost', + + // Search and filters + searchPlaceholder: 'Search users...', + allRoles: 'All Roles', + user: 'User', + admin: 'Admin', + allStatus: 'All Status', + active: 'Active', + disabled: 'Disabled', + + // User list + users: 'Users', + loadingUsers: 'Loading users...', + noUsersFound: 'No users found', + noUsersMatch: 'No users match your search criteria.', + noUsersCreated: 'No users have been created yet.', + + // User info and actions + displayName: 'Display Name', + email: 'Email', + role: 'Role', + username: 'Username', + apiKeysCount: 'API keys', + lastLogin: 'Last login', + neverLoggedIn: 'Never logged in', + requests: 'requests', + totalCostLabel: 'total cost', + + // Action buttons and tooltips + viewUsageStats: 'View Usage Stats', + disableAllApiKeys: 'Disable All API Keys', + disableUser: 'Disable User', + enableUser: 'Enable User', + changeRole: 'Change Role', + + // Confirmation dialogs + disableUserTitle: 'Disable User', + enableUserTitle: 'Enable User', + disableUserMessage: 'Are you sure you want to disable user "{username}"? This will prevent them from logging in.', + enableUserMessage: 'Are you sure you want to enable user "{username}"?', + disable: 'Disable', + enable: 'Enable', + + disableAllKeysTitle: 'Disable All API Keys', + disableAllKeysMessage: 'Are you sure you want to disable all {count} API keys for user "{username}"? This will prevent them from using the service.', + disableKeys: 'Disable Keys', + + // Success messages + userDisabledSuccess: 'User disabled successfully', + userEnabledSuccess: 'User enabled successfully', + keysDisabledSuccess: 'Disabled {count} API keys', + + // Error messages + loadUsersError: 'Failed to load users', + toggleStatusError: 'Failed to toggleStatus', + disableKeysError: 'Failed to disableKeys' + } + }, + // Settings settings: { title: 'System Settings', diff --git a/web/admin-spa/src/i18n/locales/zh-cn.js b/web/admin-spa/src/i18n/locales/zh-cn.js index f9c5e781..774815cb 100644 --- a/web/admin-spa/src/i18n/locales/zh-cn.js +++ b/web/admin-spa/src/i18n/locales/zh-cn.js @@ -664,6 +664,134 @@ export default { batchAllFailed: '所有项目处理失败' }, + // User-related translations + user: { + // User Dashboard + dashboard: { + title: 'Dashboard Overview', + welcomeMessage: 'Welcome to your Claude Relay dashboard', + + // Navigation tabs + overview: 'Overview', + apiKeys: 'API Keys', + usageStats: 'Usage Stats', + + // Welcome section + welcome: 'Welcome', + + // Stats cards + activeApiKeys: 'Active API Keys', + deletedApiKeys: 'Deleted API Keys', + totalRequests: 'Total Requests', + inputTokens: 'Input Tokens', + totalCost: 'Total Cost', + + // Account information section + accountInformation: 'Account Information', + username: 'Username', + displayName: 'Display Name', + email: 'Email', + role: 'Role', + memberSince: 'Member Since', + lastLogin: 'Last Login', + notAvailable: 'N/A', + + // Messages + logout: 'Logout', + logoutSuccess: 'Logged out successfully', + logoutFailed: 'Logout failed', + loadProfileFailed: 'Failed to load user profile', + loadStatsFailed: 'Failed to load API keys stats' + }, + + // User Login + login: { + title: 'User Sign In', + subtitle: 'Sign in to your account to manage your API keys', + username: 'Username', + password: 'Password', + usernamePlaceholder: 'Enter your username', + passwordPlaceholder: 'Enter your password', + signIn: 'Sign In', + signingIn: 'Signing In...', + adminLogin: 'Admin Login', + + // Validation and error messages + requiredFields: 'Please enter both username and password', + loginSuccess: 'Login successful!', + loginFailed: 'Login failed' + }, + + // User Management + management: { + title: 'User Management', + description: 'Manage users, their API keys, and view usage statistics', + refresh: 'Refresh', + + // Stats cards + totalUsers: 'Total Users', + activeUsers: 'Active Users', + totalApiKeys: 'Total API Keys', + totalCost: 'Total Cost', + + // Search and filters + searchPlaceholder: 'Search users...', + allRoles: 'All Roles', + user: 'User', + admin: 'Admin', + allStatus: 'All Status', + active: 'Active', + disabled: 'Disabled', + + // User list + users: 'Users', + loadingUsers: 'Loading users...', + noUsersFound: 'No users found', + noUsersMatch: 'No users match your search criteria.', + noUsersCreated: 'No users have been created yet.', + + // User info and actions + displayName: 'Display Name', + email: 'Email', + role: 'Role', + username: 'Username', + apiKeysCount: 'API keys', + lastLogin: 'Last login', + neverLoggedIn: 'Never logged in', + requests: 'requests', + totalCostLabel: 'total cost', + + // Action buttons and tooltips + viewUsageStats: 'View Usage Stats', + disableAllApiKeys: 'Disable All API Keys', + disableUser: 'Disable User', + enableUser: 'Enable User', + changeRole: 'Change Role', + + // Confirmation dialogs + disableUserTitle: 'Disable User', + enableUserTitle: 'Enable User', + disableUserMessage: 'Are you sure you want to disable user "{username}"? This will prevent them from logging in.', + enableUserMessage: 'Are you sure you want to enable user "{username}"?', + disable: 'Disable', + enable: 'Enable', + + disableAllKeysTitle: 'Disable All API Keys', + disableAllKeysMessage: 'Are you sure you want to disable all {count} API keys for user "{username}"? This will prevent them from using the service.', + disableKeys: 'Disable Keys', + + // Success messages + userDisabledSuccess: 'User disabled successfully', + userEnabledSuccess: 'User enabled successfully', + keysDisabledSuccess: 'Disabled {count} API keys', + + // Error messages + loadUsersError: 'Failed to load users', + toggleStatusError: 'Failed to toggleStatus', + disableKeysError: 'Failed to disableKeys' + } + }, + // Settings 设置页面 settings: { title: '系统设置', diff --git a/web/admin-spa/src/i18n/locales/zh-tw.js b/web/admin-spa/src/i18n/locales/zh-tw.js index 2a80c177..1d6fc820 100644 --- a/web/admin-spa/src/i18n/locales/zh-tw.js +++ b/web/admin-spa/src/i18n/locales/zh-tw.js @@ -664,6 +664,134 @@ export default { batchAllFailed: '所有項目處理失敗' }, + // User-related translations + user: { + // User Dashboard + dashboard: { + title: 'Dashboard Overview', + welcomeMessage: 'Welcome to your Claude Relay dashboard', + + // Navigation tabs + overview: 'Overview', + apiKeys: 'API Keys', + usageStats: 'Usage Stats', + + // Welcome section + welcome: 'Welcome', + + // Stats cards + activeApiKeys: 'Active API Keys', + deletedApiKeys: 'Deleted API Keys', + totalRequests: 'Total Requests', + inputTokens: 'Input Tokens', + totalCost: 'Total Cost', + + // Account information section + accountInformation: 'Account Information', + username: 'Username', + displayName: 'Display Name', + email: 'Email', + role: 'Role', + memberSince: 'Member Since', + lastLogin: 'Last Login', + notAvailable: 'N/A', + + // Messages + logout: 'Logout', + logoutSuccess: 'Logged out successfully', + logoutFailed: 'Logout failed', + loadProfileFailed: 'Failed to load user profile', + loadStatsFailed: 'Failed to load API keys stats' + }, + + // User Login + login: { + title: 'User Sign In', + subtitle: 'Sign in to your account to manage your API keys', + username: 'Username', + password: 'Password', + usernamePlaceholder: 'Enter your username', + passwordPlaceholder: 'Enter your password', + signIn: 'Sign In', + signingIn: 'Signing In...', + adminLogin: 'Admin Login', + + // Validation and error messages + requiredFields: 'Please enter both username and password', + loginSuccess: 'Login successful!', + loginFailed: 'Login failed' + }, + + // User Management + management: { + title: 'User Management', + description: 'Manage users, their API keys, and view usage statistics', + refresh: 'Refresh', + + // Stats cards + totalUsers: 'Total Users', + activeUsers: 'Active Users', + totalApiKeys: 'Total API Keys', + totalCost: 'Total Cost', + + // Search and filters + searchPlaceholder: 'Search users...', + allRoles: 'All Roles', + user: 'User', + admin: 'Admin', + allStatus: 'All Status', + active: 'Active', + disabled: 'Disabled', + + // User list + users: 'Users', + loadingUsers: 'Loading users...', + noUsersFound: 'No users found', + noUsersMatch: 'No users match your search criteria.', + noUsersCreated: 'No users have been created yet.', + + // User info and actions + displayName: 'Display Name', + email: 'Email', + role: 'Role', + username: 'Username', + apiKeysCount: 'API keys', + lastLogin: 'Last login', + neverLoggedIn: 'Never logged in', + requests: 'requests', + totalCostLabel: 'total cost', + + // Action buttons and tooltips + viewUsageStats: 'View Usage Stats', + disableAllApiKeys: 'Disable All API Keys', + disableUser: 'Disable User', + enableUser: 'Enable User', + changeRole: 'Change Role', + + // Confirmation dialogs + disableUserTitle: 'Disable User', + enableUserTitle: 'Enable User', + disableUserMessage: 'Are you sure you want to disable user "{username}"? This will prevent them from logging in.', + enableUserMessage: 'Are you sure you want to enable user "{username}"?', + disable: 'Disable', + enable: 'Enable', + + disableAllKeysTitle: 'Disable All API Keys', + disableAllKeysMessage: 'Are you sure you want to disable all {count} API keys for user "{username}"? This will prevent them from using the service.', + disableKeys: 'Disable Keys', + + // Success messages + userDisabledSuccess: 'User disabled successfully', + userEnabledSuccess: 'User enabled successfully', + keysDisabledSuccess: 'Disabled {count} API keys', + + // Error messages + loadUsersError: 'Failed to load users', + toggleStatusError: 'Failed to toggleStatus', + disableKeysError: 'Failed to disableKeys' + } + }, + // Settings 設置頁面 settings: { title: '系統設置', diff --git a/web/admin-spa/src/views/UserDashboardView.vue b/web/admin-spa/src/views/UserDashboardView.vue index 92b2ed4d..5f847e15 100644 --- a/web/admin-spa/src/views/UserDashboardView.vue +++ b/web/admin-spa/src/views/UserDashboardView.vue @@ -32,7 +32,7 @@ ]" @click="handleTabChange('overview')" > - Overview + {{ t('user.dashboard.overview') }} @@ -94,9 +94,9 @@
-

Dashboard Overview

+

{{ t('user.dashboard.title') }}

- Welcome to your Claude Relay dashboard + {{ t('user.dashboard.welcomeMessage') }}

@@ -123,7 +123,7 @@
- Active API Keys + {{ t('user.dashboard.activeApiKeys') }}
{{ apiKeysStats.active }} @@ -155,7 +155,7 @@
- Deleted API Keys + {{ t('user.dashboard.deletedApiKeys') }}
{{ apiKeysStats.deleted }} @@ -187,7 +187,7 @@
- Total Requests + {{ t('user.dashboard.totalRequests') }}
{{ formatNumber(userProfile?.totalUsage?.requests || 0) }} @@ -219,7 +219,7 @@
- Input Tokens + {{ t('user.dashboard.inputTokens') }}
{{ formatNumber(userProfile?.totalUsage?.inputTokens || 0) }} @@ -251,7 +251,7 @@
- Total Cost + {{ t('user.dashboard.totalCost') }}
${{ (userProfile?.totalUsage?.totalCost || 0).toFixed(4) }} @@ -267,30 +267,30 @@

- Account Information + {{ t('user.dashboard.accountInformation') }}

-
Username
+
{{ t('user.dashboard.username') }}
{{ userProfile?.username }}
-
Display Name
+
{{ t('user.dashboard.displayName') }}
- {{ userProfile?.displayName || 'N/A' }} + {{ userProfile?.displayName || t('user.dashboard.notAvailable') }}
-
Email
+
{{ t('user.dashboard.email') }}
- {{ userProfile?.email || 'N/A' }} + {{ userProfile?.email || t('user.dashboard.notAvailable') }}
-
Role
+
{{ t('user.dashboard.role') }}
-
Member Since
+
{{ t('user.dashboard.memberSince') }}
{{ formatDate(userProfile?.createdAt) }}
-
Last Login
+
{{ t('user.dashboard.lastLogin') }}
- {{ formatDate(userProfile?.lastLoginAt) || 'N/A' }} + {{ formatDate(userProfile?.lastLoginAt) || t('user.dashboard.notAvailable') }}
@@ -338,6 +338,7 @@