Commit 938ffb00 authored by ianshaw's avatar ianshaw
Browse files

style(frontend): format code with prettier

格式化前端业务代码,符合代码规范
- 统一代码风格
- 修复 ESLint 警告
parent 372a0129
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Handles AI platform account management for administrators * Handles AI platform account management for administrators
*/ */
import { apiClient } from '../client'; import { apiClient } from '../client'
import type { import type {
Account, Account,
CreateAccountRequest, CreateAccountRequest,
...@@ -13,7 +13,7 @@ import type { ...@@ -13,7 +13,7 @@ import type {
WindowStats, WindowStats,
ClaudeModel, ClaudeModel,
AccountUsageStatsResponse, AccountUsageStatsResponse,
} from '@/types'; } from '@/types'
/** /**
* List all accounts with pagination * List all accounts with pagination
...@@ -26,10 +26,10 @@ export async function list( ...@@ -26,10 +26,10 @@ export async function list(
page: number = 1, page: number = 1,
pageSize: number = 20, pageSize: number = 20,
filters?: { filters?: {
platform?: string; platform?: string
type?: string; type?: string
status?: string; status?: string
search?: string; search?: string
} }
): Promise<PaginatedResponse<Account>> { ): Promise<PaginatedResponse<Account>> {
const { data } = await apiClient.get<PaginatedResponse<Account>>('/admin/accounts', { const { data } = await apiClient.get<PaginatedResponse<Account>>('/admin/accounts', {
...@@ -38,8 +38,8 @@ export async function list( ...@@ -38,8 +38,8 @@ export async function list(
page_size: pageSize, page_size: pageSize,
...filters, ...filters,
}, },
}); })
return data; return data
} }
/** /**
...@@ -48,8 +48,8 @@ export async function list( ...@@ -48,8 +48,8 @@ export async function list(
* @returns Account details * @returns Account details
*/ */
export async function getById(id: number): Promise<Account> { export async function getById(id: number): Promise<Account> {
const { data } = await apiClient.get<Account>(`/admin/accounts/${id}`); const { data } = await apiClient.get<Account>(`/admin/accounts/${id}`)
return data; return data
} }
/** /**
...@@ -58,8 +58,8 @@ export async function getById(id: number): Promise<Account> { ...@@ -58,8 +58,8 @@ export async function getById(id: number): Promise<Account> {
* @returns Created account * @returns Created account
*/ */
export async function create(accountData: CreateAccountRequest): Promise<Account> { export async function create(accountData: CreateAccountRequest): Promise<Account> {
const { data } = await apiClient.post<Account>('/admin/accounts', accountData); const { data } = await apiClient.post<Account>('/admin/accounts', accountData)
return data; return data
} }
/** /**
...@@ -69,8 +69,8 @@ export async function create(accountData: CreateAccountRequest): Promise<Account ...@@ -69,8 +69,8 @@ export async function create(accountData: CreateAccountRequest): Promise<Account
* @returns Updated account * @returns Updated account
*/ */
export async function update(id: number, updates: UpdateAccountRequest): Promise<Account> { export async function update(id: number, updates: UpdateAccountRequest): Promise<Account> {
const { data } = await apiClient.put<Account>(`/admin/accounts/${id}`, updates); const { data } = await apiClient.put<Account>(`/admin/accounts/${id}`, updates)
return data; return data
} }
/** /**
...@@ -79,8 +79,8 @@ export async function update(id: number, updates: UpdateAccountRequest): Promise ...@@ -79,8 +79,8 @@ export async function update(id: number, updates: UpdateAccountRequest): Promise
* @returns Success confirmation * @returns Success confirmation
*/ */
export async function deleteAccount(id: number): Promise<{ message: string }> { export async function deleteAccount(id: number): Promise<{ message: string }> {
const { data } = await apiClient.delete<{ message: string }>(`/admin/accounts/${id}`); const { data } = await apiClient.delete<{ message: string }>(`/admin/accounts/${id}`)
return data; return data
} }
/** /**
...@@ -89,11 +89,8 @@ export async function deleteAccount(id: number): Promise<{ message: string }> { ...@@ -89,11 +89,8 @@ export async function deleteAccount(id: number): Promise<{ message: string }> {
* @param status - New status * @param status - New status
* @returns Updated account * @returns Updated account
*/ */
export async function toggleStatus( export async function toggleStatus(id: number, status: 'active' | 'inactive'): Promise<Account> {
id: number, return update(id, { status })
status: 'active' | 'inactive'
): Promise<Account> {
return update(id, { status });
} }
/** /**
...@@ -102,16 +99,16 @@ export async function toggleStatus( ...@@ -102,16 +99,16 @@ export async function toggleStatus(
* @returns Test result * @returns Test result
*/ */
export async function testAccount(id: number): Promise<{ export async function testAccount(id: number): Promise<{
success: boolean; success: boolean
message: string; message: string
latency_ms?: number; latency_ms?: number
}> { }> {
const { data } = await apiClient.post<{ const { data } = await apiClient.post<{
success: boolean; success: boolean
message: string; message: string
latency_ms?: number; latency_ms?: number
}>(`/admin/accounts/${id}/test`); }>(`/admin/accounts/${id}/test`)
return data; return data
} }
/** /**
...@@ -120,8 +117,8 @@ export async function testAccount(id: number): Promise<{ ...@@ -120,8 +117,8 @@ export async function testAccount(id: number): Promise<{
* @returns Updated account * @returns Updated account
*/ */
export async function refreshCredentials(id: number): Promise<Account> { export async function refreshCredentials(id: number): Promise<Account> {
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/refresh`); const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/refresh`)
return data; return data
} }
/** /**
...@@ -133,8 +130,8 @@ export async function refreshCredentials(id: number): Promise<Account> { ...@@ -133,8 +130,8 @@ export async function refreshCredentials(id: number): Promise<Account> {
export async function getStats(id: number, days: number = 30): Promise<AccountUsageStatsResponse> { export async function getStats(id: number, days: number = 30): Promise<AccountUsageStatsResponse> {
const { data } = await apiClient.get<AccountUsageStatsResponse>(`/admin/accounts/${id}/stats`, { const { data } = await apiClient.get<AccountUsageStatsResponse>(`/admin/accounts/${id}/stats`, {
params: { days }, params: { days },
}); })
return data; return data
} }
/** /**
...@@ -143,8 +140,8 @@ export async function getStats(id: number, days: number = 30): Promise<AccountUs ...@@ -143,8 +140,8 @@ export async function getStats(id: number, days: number = 30): Promise<AccountUs
* @returns Updated account * @returns Updated account
*/ */
export async function clearError(id: number): Promise<Account> { export async function clearError(id: number): Promise<Account> {
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/clear-error`); const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/clear-error`)
return data; return data
} }
/** /**
...@@ -153,8 +150,8 @@ export async function clearError(id: number): Promise<Account> { ...@@ -153,8 +150,8 @@ export async function clearError(id: number): Promise<Account> {
* @returns Account usage info * @returns Account usage info
*/ */
export async function getUsage(id: number): Promise<AccountUsageInfo> { export async function getUsage(id: number): Promise<AccountUsageInfo> {
const { data } = await apiClient.get<AccountUsageInfo>(`/admin/accounts/${id}/usage`); const { data } = await apiClient.get<AccountUsageInfo>(`/admin/accounts/${id}/usage`)
return data; return data
} }
/** /**
...@@ -163,8 +160,10 @@ export async function getUsage(id: number): Promise<AccountUsageInfo> { ...@@ -163,8 +160,10 @@ export async function getUsage(id: number): Promise<AccountUsageInfo> {
* @returns Success confirmation * @returns Success confirmation
*/ */
export async function clearRateLimit(id: number): Promise<{ message: string }> { export async function clearRateLimit(id: number): Promise<{ message: string }> {
const { data } = await apiClient.post<{ message: string }>(`/admin/accounts/${id}/clear-rate-limit`); const { data } = await apiClient.post<{ message: string }>(
return data; `/admin/accounts/${id}/clear-rate-limit`
)
return data
} }
/** /**
...@@ -177,8 +176,8 @@ export async function generateAuthUrl( ...@@ -177,8 +176,8 @@ export async function generateAuthUrl(
endpoint: string, endpoint: string,
config: { proxy_id?: number } config: { proxy_id?: number }
): Promise<{ auth_url: string; session_id: string }> { ): Promise<{ auth_url: string; session_id: string }> {
const { data } = await apiClient.post<{ auth_url: string; session_id: string }>(endpoint, config); const { data } = await apiClient.post<{ auth_url: string; session_id: string }>(endpoint, config)
return data; return data
} }
/** /**
...@@ -191,8 +190,8 @@ export async function exchangeCode( ...@@ -191,8 +190,8 @@ export async function exchangeCode(
endpoint: string, endpoint: string,
exchangeData: { session_id: string; code: string; proxy_id?: number } exchangeData: { session_id: string; code: string; proxy_id?: number }
): Promise<Record<string, unknown>> { ): Promise<Record<string, unknown>> {
const { data } = await apiClient.post<Record<string, unknown>>(endpoint, exchangeData); const { data } = await apiClient.post<Record<string, unknown>>(endpoint, exchangeData)
return data; return data
} }
/** /**
...@@ -201,16 +200,16 @@ export async function exchangeCode( ...@@ -201,16 +200,16 @@ export async function exchangeCode(
* @returns Results of batch creation * @returns Results of batch creation
*/ */
export async function batchCreate(accounts: CreateAccountRequest[]): Promise<{ export async function batchCreate(accounts: CreateAccountRequest[]): Promise<{
success: number; success: number
failed: number; failed: number
results: Array<{ success: boolean; account?: Account; error?: string }>; results: Array<{ success: boolean; account?: Account; error?: string }>
}> { }> {
const { data } = await apiClient.post<{ const { data } = await apiClient.post<{
success: number; success: number
failed: number; failed: number
results: Array<{ success: boolean; account?: Account; error?: string }>; results: Array<{ success: boolean; account?: Account; error?: string }>
}>('/admin/accounts/batch', { accounts }); }>('/admin/accounts/batch', { accounts })
return data; return data
} }
/** /**
...@@ -219,20 +218,20 @@ export async function batchCreate(accounts: CreateAccountRequest[]): Promise<{ ...@@ -219,20 +218,20 @@ export async function batchCreate(accounts: CreateAccountRequest[]): Promise<{
* @returns Results of batch update * @returns Results of batch update
*/ */
export async function batchUpdateCredentials(request: { export async function batchUpdateCredentials(request: {
account_ids: number[]; account_ids: number[]
field: string; field: string
value: any; value: any
}): Promise<{ }): Promise<{
success: number; success: number
failed: number; failed: number
results: Array<{ account_id: number; success: boolean; error?: string }>; results: Array<{ account_id: number; success: boolean; error?: string }>
}> { }> {
const { data} = await apiClient.post<{ const { data } = await apiClient.post<{
success: number; success: number
failed: number; failed: number
results: Array<{ account_id: number; success: boolean; error?: string }>; results: Array<{ account_id: number; success: boolean; error?: string }>
}>('/admin/accounts/batch-update-credentials', request); }>('/admin/accounts/batch-update-credentials', request)
return data; return data
} }
/** /**
...@@ -245,19 +244,19 @@ export async function bulkUpdate( ...@@ -245,19 +244,19 @@ export async function bulkUpdate(
accountIds: number[], accountIds: number[],
updates: Record<string, unknown> updates: Record<string, unknown>
): Promise<{ ): Promise<{
success: number; success: number
failed: number; failed: number
results: Array<{ account_id: number; success: boolean; error?: string }>; results: Array<{ account_id: number; success: boolean; error?: string }>
}> { }> {
const { data } = await apiClient.post<{ const { data } = await apiClient.post<{
success: number; success: number
failed: number; failed: number
results: Array<{ account_id: number; success: boolean; error?: string }>; results: Array<{ account_id: number; success: boolean; error?: string }>
}>('/admin/accounts/bulk-update', { }>('/admin/accounts/bulk-update', {
account_ids: accountIds, account_ids: accountIds,
...updates ...updates,
}); })
return data; return data
} }
/** /**
...@@ -266,8 +265,8 @@ export async function bulkUpdate( ...@@ -266,8 +265,8 @@ export async function bulkUpdate(
* @returns Today's stats (requests, tokens, cost) * @returns Today's stats (requests, tokens, cost)
*/ */
export async function getTodayStats(id: number): Promise<WindowStats> { export async function getTodayStats(id: number): Promise<WindowStats> {
const { data } = await apiClient.get<WindowStats>(`/admin/accounts/${id}/today-stats`); const { data } = await apiClient.get<WindowStats>(`/admin/accounts/${id}/today-stats`)
return data; return data
} }
/** /**
...@@ -277,8 +276,10 @@ export async function getTodayStats(id: number): Promise<WindowStats> { ...@@ -277,8 +276,10 @@ export async function getTodayStats(id: number): Promise<WindowStats> {
* @returns Updated account * @returns Updated account
*/ */
export async function setSchedulable(id: number, schedulable: boolean): Promise<Account> { export async function setSchedulable(id: number, schedulable: boolean): Promise<Account> {
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/schedulable`, { schedulable }); const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/schedulable`, {
return data; schedulable,
})
return data
} }
/** /**
...@@ -287,30 +288,30 @@ export async function setSchedulable(id: number, schedulable: boolean): Promise< ...@@ -287,30 +288,30 @@ export async function setSchedulable(id: number, schedulable: boolean): Promise<
* @returns List of available models for this account * @returns List of available models for this account
*/ */
export async function getAvailableModels(id: number): Promise<ClaudeModel[]> { export async function getAvailableModels(id: number): Promise<ClaudeModel[]> {
const { data } = await apiClient.get<ClaudeModel[]>(`/admin/accounts/${id}/models`); const { data } = await apiClient.get<ClaudeModel[]>(`/admin/accounts/${id}/models`)
return data; return data
} }
export async function syncFromCrs(params: { export async function syncFromCrs(params: {
base_url: string; base_url: string
username: string; username: string
password: string; password: string
sync_proxies?: boolean; sync_proxies?: boolean
}): Promise<{ }): Promise<{
created: number; created: number
updated: number; updated: number
skipped: number; skipped: number
failed: number; failed: number
items: Array<{ items: Array<{
crs_account_id: string; crs_account_id: string
kind: string; kind: string
name: string; name: string
action: string; action: string
error?: string; error?: string
}>; }>
}> { }> {
const { data } = await apiClient.post('/admin/accounts/sync/crs', params); const { data } = await apiClient.post('/admin/accounts/sync/crs', params)
return data; return data
} }
export const accountsAPI = { export const accountsAPI = {
...@@ -335,6 +336,6 @@ export const accountsAPI = { ...@@ -335,6 +336,6 @@ export const accountsAPI = {
batchUpdateCredentials, batchUpdateCredentials,
bulkUpdate, bulkUpdate,
syncFromCrs, syncFromCrs,
}; }
export default accountsAPI; export default accountsAPI
...@@ -17,11 +17,14 @@ export default { ...@@ -17,11 +17,14 @@ export default {
}, },
features: { features: {
unifiedGateway: 'Unified API Gateway', unifiedGateway: 'Unified API Gateway',
unifiedGatewayDesc: 'Convert Claude subscriptions to API endpoints. Access AI capabilities through standard /v1/messages interface.', unifiedGatewayDesc:
'Convert Claude subscriptions to API endpoints. Access AI capabilities through standard /v1/messages interface.',
multiAccount: 'Multi-Account Pool', multiAccount: 'Multi-Account Pool',
multiAccountDesc: 'Manage multiple upstream accounts with smart load balancing. Support OAuth and API Key authentication.', multiAccountDesc:
'Manage multiple upstream accounts with smart load balancing. Support OAuth and API Key authentication.',
balanceQuota: 'Balance & Quota', balanceQuota: 'Balance & Quota',
balanceQuotaDesc: 'Token-based billing with precise usage tracking. Manage quotas and recharge with redeem codes.', balanceQuotaDesc:
'Token-based billing with precise usage tracking. Manage quotas and recharge with redeem codes.',
}, },
providers: { providers: {
title: 'Supported Providers', title: 'Supported Providers',
...@@ -235,7 +238,8 @@ export default { ...@@ -235,7 +238,8 @@ export default {
useKey: 'Use Key', useKey: 'Use Key',
useKeyModal: { useKeyModal: {
title: 'Use API Key', title: 'Use API Key',
description: 'Add the following environment variables to your terminal profile or run directly in terminal to configure API access.', description:
'Add the following environment variables to your terminal profile or run directly in terminal to configure API access.',
copy: 'Copy', copy: 'Copy',
copied: 'Copied', copied: 'Copied',
note: 'These environment variables will be active in the current terminal session. For permanent configuration, add them to ~/.bashrc, ~/.zshrc, or the appropriate configuration file.', note: 'These environment variables will be active in the current terminal session. For permanent configuration, add them to ~/.bashrc, ~/.zshrc, or the appropriate configuration file.',
...@@ -517,7 +521,8 @@ export default { ...@@ -517,7 +521,8 @@ export default {
failedToLoadApiKeys: 'Failed to load user API keys', failedToLoadApiKeys: 'Failed to load user API keys',
deleteConfirm: "Are you sure you want to delete '{email}'? This action cannot be undone.", deleteConfirm: "Are you sure you want to delete '{email}'? This action cannot be undone.",
setAllowedGroups: 'Set Allowed Groups', setAllowedGroups: 'Set Allowed Groups',
allowedGroupsHint: 'Select which standard groups this user can use. Subscription groups are managed separately.', allowedGroupsHint:
'Select which standard groups this user can use. Subscription groups are managed separately.',
noStandardGroups: 'No standard groups available', noStandardGroups: 'No standard groups available',
allowAllGroups: 'Allow All Groups', allowAllGroups: 'Allow All Groups',
allowAllGroupsHint: 'User can use any non-exclusive group', allowAllGroupsHint: 'User can use any non-exclusive group',
...@@ -529,8 +534,10 @@ export default { ...@@ -529,8 +534,10 @@ export default {
depositAmount: 'Deposit Amount', depositAmount: 'Deposit Amount',
withdrawAmount: 'Withdraw Amount', withdrawAmount: 'Withdraw Amount',
currentBalance: 'Current Balance', currentBalance: 'Current Balance',
depositNotesPlaceholder: 'e.g., New user registration bonus, promotional credit, compensation, etc.', depositNotesPlaceholder:
withdrawNotesPlaceholder: 'e.g., Service issue refund, incorrect charge reversal, account closure refund, etc.', 'e.g., New user registration bonus, promotional credit, compensation, etc.',
withdrawNotesPlaceholder:
'e.g., Service issue refund, incorrect charge reversal, account closure refund, etc.',
notesOptional: 'Notes are optional but helpful for record keeping', notesOptional: 'Notes are optional but helpful for record keeping',
amountHint: 'Please enter a positive amount', amountHint: 'Please enter a positive amount',
newBalance: 'New Balance', newBalance: 'New Balance',
...@@ -597,12 +604,15 @@ export default { ...@@ -597,12 +604,15 @@ export default {
failedToCreate: 'Failed to create group', failedToCreate: 'Failed to create group',
failedToUpdate: 'Failed to update group', failedToUpdate: 'Failed to update group',
failedToDelete: 'Failed to delete group', failedToDelete: 'Failed to delete group',
deleteConfirm: "Are you sure you want to delete '{name}'? All associated API keys will no longer belong to any group.", deleteConfirm:
deleteConfirmSubscription: "Are you sure you want to delete subscription group '{name}'? This will invalidate all API keys bound to this subscription and delete all related subscription records. This action cannot be undone.", "Are you sure you want to delete '{name}'? All associated API keys will no longer belong to any group.",
deleteConfirmSubscription:
"Are you sure you want to delete subscription group '{name}'? This will invalidate all API keys bound to this subscription and delete all related subscription records. This action cannot be undone.",
subscription: { subscription: {
title: 'Subscription Settings', title: 'Subscription Settings',
type: 'Billing Type', type: 'Billing Type',
typeHint: 'Standard billing deducts from user balance. Subscription mode uses quota limits instead.', typeHint:
'Standard billing deducts from user balance. Subscription mode uses quota limits instead.',
typeNotEditable: 'Billing type cannot be changed after group creation.', typeNotEditable: 'Billing type cannot be changed after group creation.',
standard: 'Standard (Balance)', standard: 'Standard (Balance)',
subscription: 'Subscription (Quota)', subscription: 'Subscription (Quota)',
...@@ -674,7 +684,8 @@ export default { ...@@ -674,7 +684,8 @@ export default {
failedToAssign: 'Failed to assign subscription', failedToAssign: 'Failed to assign subscription',
failedToExtend: 'Failed to extend subscription', failedToExtend: 'Failed to extend subscription',
failedToRevoke: 'Failed to revoke subscription', failedToRevoke: 'Failed to revoke subscription',
revokeConfirm: "Are you sure you want to revoke the subscription for '{user}'? This action cannot be undone.", revokeConfirm:
"Are you sure you want to revoke the subscription for '{user}'? This action cannot be undone.",
}, },
// Accounts // Accounts
...@@ -754,7 +765,8 @@ export default { ...@@ -754,7 +765,8 @@ export default {
}, },
bulkEdit: { bulkEdit: {
title: 'Bulk Edit Accounts', title: 'Bulk Edit Accounts',
selectionInfo: '{count} account(s) selected. Only checked or filled fields will be updated; others stay unchanged.', selectionInfo:
'{count} account(s) selected. Only checked or filled fields will be updated; others stay unchanged.',
baseUrlPlaceholder: 'https://api.anthropic.com or https://api.openai.com', baseUrlPlaceholder: 'https://api.anthropic.com or https://api.openai.com',
baseUrlNotice: 'Applies to API Key accounts only; leave empty to keep existing value', baseUrlNotice: 'Applies to API Key accounts only; leave empty to keep existing value',
submit: 'Update Accounts', submit: 'Update Accounts',
...@@ -797,7 +809,8 @@ export default { ...@@ -797,7 +809,8 @@ export default {
modelWhitelist: 'Model Whitelist', modelWhitelist: 'Model Whitelist',
modelMapping: 'Model Mapping', modelMapping: 'Model Mapping',
selectAllowedModels: 'Select allowed models. Leave empty to support all models.', selectAllowedModels: 'Select allowed models. Leave empty to support all models.',
mapRequestModels: 'Map request models to actual models. Left is the requested model, right is the actual model sent to API.', mapRequestModels:
'Map request models to actual models. Left is the requested model, right is the actual model sent to API.',
selectedModels: 'Selected {count} model(s)', selectedModels: 'Selected {count} model(s)',
supportsAllModels: '(supports all models)', supportsAllModels: '(supports all models)',
requestModel: 'Request model', requestModel: 'Request model',
...@@ -806,14 +819,16 @@ export default { ...@@ -806,14 +819,16 @@ export default {
mappingExists: 'Mapping for {model} already exists', mappingExists: 'Mapping for {model} already exists',
customErrorCodes: 'Custom Error Codes', customErrorCodes: 'Custom Error Codes',
customErrorCodesHint: 'Only stop scheduling for selected error codes', customErrorCodesHint: 'Only stop scheduling for selected error codes',
customErrorCodesWarning: 'Only selected error codes will stop scheduling. Other errors will return 500.', customErrorCodesWarning:
'Only selected error codes will stop scheduling. Other errors will return 500.',
selectedErrorCodes: 'Selected', selectedErrorCodes: 'Selected',
noneSelectedUsesDefault: 'None selected (uses default policy)', noneSelectedUsesDefault: 'None selected (uses default policy)',
enterErrorCode: 'Enter error code (100-599)', enterErrorCode: 'Enter error code (100-599)',
invalidErrorCode: 'Please enter a valid HTTP error code (100-599)', invalidErrorCode: 'Please enter a valid HTTP error code (100-599)',
errorCodeExists: 'This error code is already selected', errorCodeExists: 'This error code is already selected',
interceptWarmupRequests: 'Intercept Warmup Requests', interceptWarmupRequests: 'Intercept Warmup Requests',
interceptWarmupRequestsDesc: 'When enabled, warmup requests like title generation will return mock responses without consuming upstream tokens', interceptWarmupRequestsDesc:
'When enabled, warmup requests like title generation will return mock responses without consuming upstream tokens',
proxy: 'Proxy', proxy: 'Proxy',
noProxy: 'No Proxy', noProxy: 'No Proxy',
concurrency: 'Concurrency', concurrency: 'Concurrency',
...@@ -836,11 +851,13 @@ export default { ...@@ -836,11 +851,13 @@ export default {
authMethod: 'Authorization Method', authMethod: 'Authorization Method',
manualAuth: 'Manual Authorization', manualAuth: 'Manual Authorization',
cookieAutoAuth: 'Cookie Auto-Auth', cookieAutoAuth: 'Cookie Auto-Auth',
cookieAutoAuthDesc: 'Use claude.ai sessionKey to automatically complete OAuth authorization without manually opening browser.', cookieAutoAuthDesc:
'Use claude.ai sessionKey to automatically complete OAuth authorization without manually opening browser.',
sessionKey: 'sessionKey', sessionKey: 'sessionKey',
keysCount: '{count} keys', keysCount: '{count} keys',
batchCreateAccounts: 'Will batch create {count} accounts', batchCreateAccounts: 'Will batch create {count} accounts',
sessionKeyPlaceholder: 'One sessionKey per line, e.g.:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...', sessionKeyPlaceholder:
'One sessionKey per line, e.g.:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...',
sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...', sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...',
howToGetSessionKey: 'How to get sessionKey', howToGetSessionKey: 'How to get sessionKey',
step1: 'Login to <strong>claude.ai</strong> in your browser', step1: 'Login to <strong>claude.ai</strong> in your browser',
...@@ -858,10 +875,13 @@ export default { ...@@ -858,10 +875,13 @@ export default {
generating: 'Generating...', generating: 'Generating...',
regenerate: 'Regenerate', regenerate: 'Regenerate',
step2OpenUrl: 'Open the URL in your browser and complete authorization', step2OpenUrl: 'Open the URL in your browser and complete authorization',
openUrlDesc: 'Open the authorization URL in a new tab, log in to your Claude account and authorize.', openUrlDesc:
proxyWarning: '<strong>Note:</strong> If you configured a proxy, make sure your browser uses the same proxy to access the authorization page.', 'Open the authorization URL in a new tab, log in to your Claude account and authorize.',
proxyWarning:
'<strong>Note:</strong> If you configured a proxy, make sure your browser uses the same proxy to access the authorization page.',
step3EnterCode: 'Enter the Authorization Code', step3EnterCode: 'Enter the Authorization Code',
authCodeDesc: 'After authorization is complete, the page will display an <strong>Authorization Code</strong>. Copy and paste it below:', authCodeDesc:
'After authorization is complete, the page will display an <strong>Authorization Code</strong>. Copy and paste it below:',
authCode: 'Authorization Code', authCode: 'Authorization Code',
authCodePlaceholder: 'Paste the Authorization Code from Claude page...', authCodePlaceholder: 'Paste the Authorization Code from Claude page...',
authCodeHint: 'Paste the Authorization Code copied from the Claude page', authCodeHint: 'Paste the Authorization Code copied from the Claude page',
...@@ -879,13 +899,18 @@ export default { ...@@ -879,13 +899,18 @@ export default {
step1GenerateUrl: 'Click the button below to generate the authorization URL', step1GenerateUrl: 'Click the button below to generate the authorization URL',
generateAuthUrl: 'Generate Auth URL', generateAuthUrl: 'Generate Auth URL',
step2OpenUrl: 'Open the URL in your browser and complete authorization', step2OpenUrl: 'Open the URL in your browser and complete authorization',
openUrlDesc: 'Open the authorization URL in a new tab, log in to your OpenAI account and authorize.', openUrlDesc:
importantNotice: '<strong>Important:</strong> The page may take a while to load after authorization. Please wait patiently. When the browser address bar changes to <code>http://localhost...</code>, the authorization is complete.', 'Open the authorization URL in a new tab, log in to your OpenAI account and authorize.',
importantNotice:
'<strong>Important:</strong> The page may take a while to load after authorization. Please wait patiently. When the browser address bar changes to <code>http://localhost...</code>, the authorization is complete.',
step3EnterCode: 'Enter Authorization URL or Code', step3EnterCode: 'Enter Authorization URL or Code',
authCodeDesc: 'After authorization is complete, when the page URL becomes <code>http://localhost:xxx/auth/callback?code=...</code>:', authCodeDesc:
'After authorization is complete, when the page URL becomes <code>http://localhost:xxx/auth/callback?code=...</code>:',
authCode: 'Authorization URL or Code', authCode: 'Authorization URL or Code',
authCodePlaceholder: 'Option 1: Copy the complete URL\n(http://localhost:xxx/auth/callback?code=...)\nOption 2: Copy only the code parameter value', authCodePlaceholder:
authCodeHint: 'You can copy the entire URL or just the code parameter value, the system will auto-detect', 'Option 1: Copy the complete URL\n(http://localhost:xxx/auth/callback?code=...)\nOption 2: Copy only the code parameter value',
authCodeHint:
'You can copy the entire URL or just the code parameter value, the system will auto-detect',
}, },
}, },
// Re-Auth Modal // Re-Auth Modal
...@@ -985,8 +1010,10 @@ export default { ...@@ -985,8 +1010,10 @@ export default {
standardAdd: 'Standard Add', standardAdd: 'Standard Add',
batchAdd: 'Quick Add', batchAdd: 'Quick Add',
batchInput: 'Proxy List', batchInput: 'Proxy List',
batchInputPlaceholder: "Enter one proxy per line in the following formats:\nsocks5://user:pass{'@'}192.168.1.1:1080\nhttp://192.168.1.1:8080\nhttps://user:pass{'@'}proxy.example.com:443", batchInputPlaceholder:
batchInputHint: "Supports http, https, socks5 protocols. Format: protocol://[user:pass{'@'}]host:port", "Enter one proxy per line in the following formats:\nsocks5://user:pass{'@'}192.168.1.1:1080\nhttp://192.168.1.1:8080\nhttps://user:pass{'@'}proxy.example.com:443",
batchInputHint:
"Supports http, https, socks5 protocols. Format: protocol://[user:pass{'@'}]host:port",
parsedCount: '{count} valid', parsedCount: '{count} valid',
invalidCount: '{count} invalid', invalidCount: '{count} invalid',
duplicateCount: '{count} duplicate', duplicateCount: '{count} duplicate',
...@@ -1009,7 +1036,8 @@ export default { ...@@ -1009,7 +1036,8 @@ export default {
failedToUpdate: 'Failed to update proxy', failedToUpdate: 'Failed to update proxy',
failedToDelete: 'Failed to delete proxy', failedToDelete: 'Failed to delete proxy',
failedToTest: 'Failed to test proxy', failedToTest: 'Failed to test proxy',
deleteConfirm: "Are you sure you want to delete '{name}'? Accounts using this proxy will have their proxy removed.", deleteConfirm:
"Are you sure you want to delete '{name}'? Accounts using this proxy will have their proxy removed.",
}, },
// Redeem Codes // Redeem Codes
...@@ -1038,8 +1066,10 @@ export default { ...@@ -1038,8 +1066,10 @@ export default {
exportCsv: 'Export CSV', exportCsv: 'Export CSV',
deleteAllUnused: 'Delete All Unused Codes', deleteAllUnused: 'Delete All Unused Codes',
deleteCode: 'Delete Redeem Code', deleteCode: 'Delete Redeem Code',
deleteCodeConfirm: 'Are you sure you want to delete this redeem code? This action cannot be undone.', deleteCodeConfirm:
deleteAllUnusedConfirm: 'Are you sure you want to delete all unused (active) redeem codes? This action cannot be undone.', 'Are you sure you want to delete this redeem code? This action cannot be undone.',
deleteAllUnusedConfirm:
'Are you sure you want to delete all unused (active) redeem codes? This action cannot be undone.',
deleteAll: 'Delete All', deleteAll: 'Delete All',
generateCodesTitle: 'Generate Redeem Codes', generateCodesTitle: 'Generate Redeem Codes',
generatedSuccessfully: 'Generated Successfully', generatedSuccessfully: 'Generated Successfully',
...@@ -1119,7 +1149,8 @@ export default { ...@@ -1119,7 +1149,8 @@ export default {
siteSubtitle: 'Site Subtitle', siteSubtitle: 'Site Subtitle',
siteSubtitleHint: 'Displayed on login and register pages', siteSubtitleHint: 'Displayed on login and register pages',
apiBaseUrl: 'API Base URL', apiBaseUrl: 'API Base URL',
apiBaseUrlHint: 'Used for "Use Key" and "Import to CC Switch" features. Leave empty to use current site URL.', apiBaseUrlHint:
'Used for "Use Key" and "Import to CC Switch" features. Leave empty to use current site URL.',
contactInfo: 'Contact Info', contactInfo: 'Contact Info',
contactInfoPlaceholder: 'e.g., QQ: 123456789', contactInfoPlaceholder: 'e.g., QQ: 123456789',
contactInfoHint: 'Customer support contact info, displayed on redeem page, profile, etc.', contactInfoHint: 'Customer support contact info, displayed on redeem page, profile, etc.',
...@@ -1169,7 +1200,8 @@ export default { ...@@ -1169,7 +1200,8 @@ export default {
create: 'Create Key', create: 'Create Key',
creating: 'Creating...', creating: 'Creating...',
regenerateConfirm: 'Are you sure? The current key will be immediately invalidated.', regenerateConfirm: 'Are you sure? The current key will be immediately invalidated.',
deleteConfirm: 'Are you sure you want to delete the admin API key? External integrations will stop working.', deleteConfirm:
'Are you sure you want to delete the admin API key? External integrations will stop working.',
keyGenerated: 'New admin API key generated', keyGenerated: 'New admin API key generated',
keyDeleted: 'Admin API key deleted', keyDeleted: 'Admin API key deleted',
copyKey: 'Copy Key', copyKey: 'Copy Key',
...@@ -1235,7 +1267,8 @@ export default { ...@@ -1235,7 +1267,8 @@ export default {
title: 'My Subscriptions', title: 'My Subscriptions',
description: 'View your subscription plans and usage', description: 'View your subscription plans and usage',
noActiveSubscriptions: 'No Active Subscriptions', noActiveSubscriptions: 'No Active Subscriptions',
noActiveSubscriptionsDesc: 'You don\'t have any active subscriptions. Contact administrator to get one.', noActiveSubscriptionsDesc:
"You don't have any active subscriptions. Contact administrator to get one.",
status: { status: {
active: 'Active', active: 'Active',
expired: 'Expired', expired: 'Expired',
......
...@@ -620,7 +620,8 @@ export default { ...@@ -620,7 +620,8 @@ export default {
editGroup: '编辑分组', editGroup: '编辑分组',
deleteGroup: '删除分组', deleteGroup: '删除分组',
deleteConfirm: "确定要删除分组 '{name}' 吗?所有关联的 API 密钥将不再属于任何分组。", deleteConfirm: "确定要删除分组 '{name}' 吗?所有关联的 API 密钥将不再属于任何分组。",
deleteConfirmSubscription: "确定要删除订阅分组 '{name}' 吗?此操作会让所有绑定此订阅的用户的 API Key 失效,并删除所有相关的订阅记录。此操作无法撤销。", deleteConfirmSubscription:
"确定要删除订阅分组 '{name}' 吗?此操作会让所有绑定此订阅的用户的 API Key 失效,并删除所有相关的订阅记录。此操作无法撤销。",
columns: { columns: {
name: '名称', name: '名称',
platform: '平台', platform: '平台',
...@@ -782,7 +783,8 @@ export default { ...@@ -782,7 +783,8 @@ export default {
createAccount: '添加账号', createAccount: '添加账号',
syncFromCrs: '从 CRS 同步', syncFromCrs: '从 CRS 同步',
syncFromCrsTitle: '从 CRS 同步账号', syncFromCrsTitle: '从 CRS 同步账号',
syncFromCrsDesc: '将 claude-relay-service(CRS)中的账号同步到当前系统(不会在浏览器侧直接请求 CRS)。', syncFromCrsDesc:
'将 claude-relay-service(CRS)中的账号同步到当前系统(不会在浏览器侧直接请求 CRS)。',
crsBaseUrl: 'CRS 服务地址', crsBaseUrl: 'CRS 服务地址',
crsBaseUrlPlaceholder: '例如:http://127.0.0.1:3000', crsBaseUrlPlaceholder: '例如:http://127.0.0.1:3000',
crsUsername: '用户名', crsUsername: '用户名',
...@@ -973,7 +975,8 @@ export default { ...@@ -973,7 +975,8 @@ export default {
sessionKey: 'sessionKey', sessionKey: 'sessionKey',
keysCount: '{count} 个密钥', keysCount: '{count} 个密钥',
batchCreateAccounts: '将批量创建 {count} 个账号', batchCreateAccounts: '将批量创建 {count} 个账号',
sessionKeyPlaceholder: '每行一个 sessionKey,例如:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...', sessionKeyPlaceholder:
'每行一个 sessionKey,例如:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...',
sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...', sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...',
howToGetSessionKey: '如何获取 sessionKey', howToGetSessionKey: '如何获取 sessionKey',
step1: '在浏览器中登录 <strong>claude.ai</strong>', step1: '在浏览器中登录 <strong>claude.ai</strong>',
...@@ -992,7 +995,8 @@ export default { ...@@ -992,7 +995,8 @@ export default {
regenerate: '重新生成', regenerate: '重新生成',
step2OpenUrl: '在浏览器中打开 URL 并完成授权', step2OpenUrl: '在浏览器中打开 URL 并完成授权',
openUrlDesc: '在新标签页中打开授权 URL,登录您的 Claude 账号并授权。', openUrlDesc: '在新标签页中打开授权 URL,登录您的 Claude 账号并授权。',
proxyWarning: '<strong>注意:</strong>如果您配置了代理,请确保浏览器使用相同的代理访问授权页面。', proxyWarning:
'<strong>注意:</strong>如果您配置了代理,请确保浏览器使用相同的代理访问授权页面。',
step3EnterCode: '输入授权码', step3EnterCode: '输入授权码',
authCodeDesc: '授权完成后,页面会显示一个 <strong>授权码</strong>。复制并粘贴到下方:', authCodeDesc: '授权完成后,页面会显示一个 <strong>授权码</strong>。复制并粘贴到下方:',
authCode: '授权码', authCode: '授权码',
...@@ -1013,11 +1017,14 @@ export default { ...@@ -1013,11 +1017,14 @@ export default {
generateAuthUrl: '生成授权链接', generateAuthUrl: '生成授权链接',
step2OpenUrl: '在浏览器中打开链接并完成授权', step2OpenUrl: '在浏览器中打开链接并完成授权',
openUrlDesc: '请在新标签页中打开授权链接,登录您的 OpenAI 账户并授权。', openUrlDesc: '请在新标签页中打开授权链接,登录您的 OpenAI 账户并授权。',
importantNotice: '<strong>重要提示:</strong>授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 <code>http://localhost...</code> 开头时,表示授权已完成。', importantNotice:
'<strong>重要提示:</strong>授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 <code>http://localhost...</code> 开头时,表示授权已完成。',
step3EnterCode: '输入授权链接或 Code', step3EnterCode: '输入授权链接或 Code',
authCodeDesc: '授权完成后,当页面地址变为 <code>http://localhost:xxx/auth/callback?code=...</code> 时:', authCodeDesc:
'授权完成后,当页面地址变为 <code>http://localhost:xxx/auth/callback?code=...</code> 时:',
authCode: '授权链接或 Code', authCode: '授权链接或 Code',
authCodePlaceholder: '方式1:复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2:仅复制 code 参数的值', authCodePlaceholder:
'方式1:复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2:仅复制 code 参数的值',
authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别', authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别',
}, },
}, },
...@@ -1153,7 +1160,8 @@ export default { ...@@ -1153,7 +1160,8 @@ export default {
standardAdd: '标准添加', standardAdd: '标准添加',
batchAdd: '快捷添加', batchAdd: '快捷添加',
batchInput: '代理列表', batchInput: '代理列表',
batchInputPlaceholder: "每行输入一个代理,支持以下格式:\nsocks5://user:pass{'@'}192.168.1.1:1080\nhttp://192.168.1.1:8080\nhttps://user:pass{'@'}proxy.example.com:443", batchInputPlaceholder:
"每行输入一个代理,支持以下格式:\nsocks5://user:pass{'@'}192.168.1.1:1080\nhttp://192.168.1.1:8080\nhttps://user:pass{'@'}proxy.example.com:443",
batchInputHint: "支持 http、https、socks5 协议,格式:协议://[用户名:密码{'@'}]主机:端口", batchInputHint: "支持 http、https、socks5 协议,格式:协议://[用户名:密码{'@'}]主机:端口",
parsedCount: '有效 {count} 个', parsedCount: '有效 {count} 个',
invalidCount: '无效 {count} 个', invalidCount: '无效 {count} 个',
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment