diff --git a/frontend/src/i18n/locales/en/admin/overview.ts b/frontend/src/i18n/locales/en/admin/overview.ts index 0d4a0d0455..7012911065 100644 --- a/frontend/src/i18n/locales/en/admin/overview.ts +++ b/frontend/src/i18n/locales/en/admin/overview.ts @@ -4,15 +4,26 @@ export default { title: 'Admin Dashboard', description: 'System overview and real-time statistics', apiKeys: 'API Keys', + totalApiKeys: 'Total API Keys', + activeApiKeys: 'Active Keys', accounts: 'Accounts', + totalAccounts: 'Total Accounts', + activeAccounts: 'Active Accounts', users: 'Users', + totalUsers: 'Total Users', todayRequests: 'Today Requests', + totalRequests: 'Total Requests', + todayCost: 'Today Cost', + totalCost: 'Total Cost', newUsersToday: 'New Users Today', todayTokens: 'Today Tokens', totalTokens: 'Total Tokens', + input: 'Input', + output: 'Output', cacheToday: 'Cache (Today)', performance: 'Performance', avgResponse: 'Avg Response', + averageTime: 'Average Time', active: 'active', ok: 'ok', err: 'err', @@ -33,6 +44,7 @@ export default { noGroup: 'No Group', requests: 'Requests', tokens: 'Tokens', + cache: 'Cache', actual: 'Actual', standard: 'Standard', accountCost: 'Cost', @@ -50,11 +62,21 @@ export default { spendShort: 'Spend', requestsShort: 'Req', tokensShort: 'Tok', + last7Days: 'Last 7 days', + noUsageRecords: 'No usage records', + startUsingApi: 'Once you start using the API, your usage history will appear here.', + viewAllUsage: 'View all', quickActions: 'Quick Actions', + manageUsers: 'Manage Users', + viewUserAccounts: 'View and manage user accounts', + manageAccounts: 'Manage Accounts', + configureAiAccounts: 'Configure AI platform accounts', batchImage: 'Batch Image', batchImageDesc: 'Submit jobs and copy agent instructions', groupPricing: 'Group Pricing', groupPricingDesc: 'Configure batch discount and hold ratio', + systemSettings: 'System Settings', + configureSystem: 'Configure system settings', failedToLoad: 'Failed to load dashboard statistics' }, @@ -398,7 +420,10 @@ export default { createUser: 'Create User', editUser: 'Edit User', deleteUser: 'Delete User', - searchUsers: 'Search by email, username, notes, or API key...', + deleteConfirmMessage: "Are you sure you want to delete user '{email}'? This action cannot be undone.", + searchPlaceholder: 'Search by email, username, notes, or API key...', + searchUsers: 'Search by email, username, notes, or API key', + roleFilter: 'Role Filter', allRoles: 'All Roles', allStatus: 'All Status', allGroups: 'All Groups', @@ -414,6 +439,8 @@ export default { searchAuthorizedGroups: 'Search authorized groups...', allApiKeyGroups: 'All API Key Groups', searchApiKeyGroups: 'Search API Key groups...', + statusFilter: 'Status Filter', + allStatuses: 'All Status', admin: 'Admin', user: 'User', disabled: 'Disabled', @@ -433,7 +460,21 @@ export default { creating: 'Creating...', updating: 'Updating...', form: { + emailLabel: 'Email', + emailPlaceholder: 'Enter email', + usernameLabel: 'Username', + usernamePlaceholder: 'Enter username (optional)', + notesLabel: 'Notes', + notesPlaceholder: 'Enter notes (admin only)', + notesHint: 'This note is only visible to administrators', + passwordLabel: 'Password', + passwordPlaceholder: 'Enter password (leave empty to keep unchanged)', roleLabel: 'Role', + selectRole: 'Select role', + balanceLabel: 'Balance', + concurrencyLabel: 'Concurrency', + statusLabel: 'Status', + selectStatus: 'Select status', rpmLimit: 'Requests Per Minute (RPM)', rpmLimitPlaceholder: '0 = unlimited', rpmLimitHint: 'Max requests per minute for this user; 0 = unlimited. Acts as a fallback only when the group has no rpm_limit set.' @@ -504,6 +545,21 @@ export default { soraStorageQuotaHint: 'In GB, 0 means use group or system default quota', amountRequired: 'Please enter a valid amount', insufficientBalance: 'Insufficient balance', + adjustBalance: 'Adjust Balance', + adjustConcurrency: 'Adjust Concurrency', + adjustmentAmount: 'Adjustment Amount', + adjustmentAmountHint: 'Positive to add, negative to subtract', + currentConcurrency: 'Current Concurrency', + saving: 'Saving...', + noUsers: 'No users yet', + noUsersDescription: 'Create your first user to get started.', + userCreatedSuccess: 'User created successfully', + userUpdatedSuccess: 'User updated successfully', + userDeletedSuccess: 'User deleted successfully', + balanceAdjustedSuccess: 'Balance adjusted successfully', + concurrencyAdjustedSuccess: 'Concurrency adjusted successfully', + failedToSave: 'Failed to save user', + failedToAdjust: 'Adjustment failed', deleteConfirm: "Are you sure you want to delete '{email}'? This action cannot be undone.", setAllowedGroups: 'Set Allowed Groups', allowedGroupsHint: @@ -695,6 +751,7 @@ export default { allPlatforms: 'All Platforms', allStatus: 'All Status', allGroups: 'All Groups', + exclusiveFilter: 'Exclusive', exclusive: 'Exclusive', nonExclusive: 'Non-Exclusive', public: 'Public', @@ -706,7 +763,10 @@ export default { rpmOverrideHint: 'Per-user RPM cap in this group; empty = group default; 0 = unlimited', rateDefault: 'default', rpmDefault: 'default', + exclusive: 'Exclusive', type: 'Type', + priority: 'Priority', + apiKeys: 'API Keys', accounts: 'Accounts', capacity: 'Capacity', usage: 'Usage', @@ -742,14 +802,39 @@ export default { rateMultiplier: 'Rate Multiplier', status: 'Status', exclusive: 'Exclusive Group', + nameLabel: 'Group Name', + namePlaceholder: 'Enter group name', + descriptionLabel: 'Description', + descriptionPlaceholder: 'Enter description (optional)', + rateMultiplierLabel: 'Rate Multiplier', + rateMultiplierHint: '1.0 = standard rate, 0.5 = half price, 2.0 = double', rpmLimit: 'Requests Per Minute (RPM)', rpmLimitPlaceholder: '0 = unlimited', - rpmLimitHint: 'Max requests per minute for each user in this group; 0 = unlimited. Once set, it takes over per-user rate limiting in this group (overrides the user-level rpm_limit fallback).' + rpmLimitHint: 'Max requests per minute for each user in this group; 0 = unlimited. Once set, it takes over per-user rate limiting in this group (overrides the user-level rpm_limit fallback).', + exclusiveLabel: 'Exclusive Group', + exclusiveHint: 'Exclusive group, can be manually assigned to users', + platformLabel: 'Platform Restriction', + platformPlaceholder: 'Select platform (leave empty for no restriction)', + accountsLabel: 'Designated Accounts', + accountsPlaceholder: 'Select accounts (leave empty for no restriction)', + priorityLabel: 'Priority', + priorityHint: 'Lower value means higher priority, used for account scheduling', + statusLabel: 'Status' + }, + exclusiveObj: { + yes: 'Yes', + no: 'No' }, enterGroupName: 'Enter group name', optionalDescription: 'Optional description', platformHint: 'Select the platform this group is associated with', platformNotEditable: 'Platform cannot be changed after creation', + saving: 'Saving...', + noGroups: 'No groups yet', + noGroupsDescription: 'Create a group to better manage API keys and rates.', + groupCreatedSuccess: 'Group created successfully', + groupUpdatedSuccess: 'Group updated successfully', + groupDeletedSuccess: 'Group deleted successfully', rateMultiplierHint: 'Cost multiplier for this group (e.g., 1.5 = 150% of base cost)', exclusiveHint: 'Exclusive group, manually assign to specific users', exclusiveTooltip: { diff --git a/frontend/src/i18n/locales/en/admin/resources.ts b/frontend/src/i18n/locales/en/admin/resources.ts index 8afd35c60a..8e9e34c0ec 100644 --- a/frontend/src/i18n/locales/en/admin/resources.ts +++ b/frontend/src/i18n/locales/en/admin/resources.ts @@ -50,6 +50,8 @@ export default { ad: { inline: 'Need proxy IP?' }, + deleteConfirmMessage: "Are you sure you want to delete proxy '{name}'?", + testProxy: 'Test Proxy', dataImport: 'Import', dataExportSelected: 'Export Selected', dataImportTitle: 'Import Proxies', @@ -93,7 +95,27 @@ export default { latency: 'Latency', expiry: 'Validity', createdAt: 'Created', - actions: 'Actions' + actions: 'Actions', + nameLabel: 'Name', + namePlaceholder: 'Enter proxy name', + protocolLabel: 'Protocol', + selectProtocol: 'Select protocol', + hostLabel: 'Host', + hostPlaceholder: 'Enter host address', + portLabel: 'Port', + portPlaceholder: 'Enter port', + usernameLabel: 'Username (Optional)', + usernamePlaceholder: 'Enter username', + passwordLabel: 'Password (Optional)', + passwordPlaceholder: 'Enter password', + priorityLabel: 'Priority', + statusLabel: 'Status' + }, + filters: { + protocol: 'Protocol', + allProtocols: 'All Protocols', + status: 'Status', + allStatuses: 'All Status' }, testConnection: 'Test Connection', qualityCheck: 'Quality Check', @@ -150,8 +172,12 @@ export default { batchImportAllSkipped: 'All {skipped} proxies already exist, skipped import', failedToImport: 'Failed to batch import', // Other messages + saving: 'Saving...', + testing: 'Testing...', creating: 'Creating...', updating: 'Updating...', + noProxies: 'No proxies yet', + noProxiesDescription: 'Add a proxy server to improve API access stability.', proxyCreated: 'Proxy created successfully', proxyUpdated: 'Proxy updated successfully', proxyDeleted: 'Proxy deleted successfully', @@ -181,7 +207,12 @@ export default { qualityStatusFail: 'Fail', qualityStatusChallenge: 'Challenge', qualityTargetBase: 'Base Connectivity', + proxyCreatedSuccess: 'Proxy created successfully', + proxyUpdatedSuccess: 'Proxy updated successfully', + proxyDeletedSuccess: 'Proxy deleted successfully', + testSuccess: 'Proxy test passed', failedToLoad: 'Failed to load proxies', + failedToSave: 'Failed to save proxy', failedToCreate: 'Failed to create proxy', failedToUpdate: 'Failed to update proxy', failedToDelete: 'Failed to delete proxy', @@ -229,6 +260,7 @@ export default { status: 'Status', usedBy: 'Used By', usedAt: 'Used At', + createdAt: 'Created At', expiresAt: 'Expires At', actions: 'Actions' }, @@ -304,7 +336,39 @@ export default { used: 'Used', expired: 'Expired', disabled: 'Disabled' - } + }, + form: { + typeLabel: 'Type', + selectType: 'Select type', + valueLabel: 'Value', + valuePlaceholder: 'Enter value', + balanceHint: 'Balance amount (USD)', + concurrencyHint: 'Concurrency increment', + countLabel: 'Count', + countPlaceholder: 'Enter count', + countHint: 'Number of redeem codes to generate', + prefixLabel: 'Prefix (Optional)', + prefixPlaceholder: 'e.g., GIFT', + expiresLabel: 'Expires At (Optional)' + }, + filters: { + type: 'Type', + allTypes: 'All Types', + status: 'Status', + allStatuses: 'All Status', + search: 'Search codes' + }, + copyCode: 'Copy', + disableCode: 'Disable', + enableCode: 'Enable', + deleteConfirmMessage: 'Are you sure you want to delete this redeem code?', + noCodes: 'No redeem codes yet', + noCodesDescription: 'Generate redeem codes to distribute balance or concurrency to users.', + codesGeneratedSuccess: 'Redeem codes generated successfully, {count} total', + codeDisabledSuccess: 'Redeem code disabled', + codeEnabledSuccess: 'Redeem code enabled', + codeDeletedSuccess: 'Redeem code deleted successfully', + failedToUpdate: 'Failed to update redeem code' }, // Announcements