noBalanceHistory:'No records found for this user',
allTypes:'All Types',
typeBalance:'Balance (Redeem)',
typeAdminBalance:'Balance (Admin)',
typeConcurrency:'Concurrency (Redeem)',
typeAdminConcurrency:'Concurrency (Admin)',
typeSubscription:'Subscription',
failedToLoadBalanceHistory:'Failed to load balance history',
createdAt:'Created',
totalRecharged:'Total Recharged',
roles:{
roles:{
admin:'Admin',
admin:'Admin',
user:'User'
user:'User'
...
@@ -929,6 +1026,14 @@ export default {
...
@@ -929,6 +1026,14 @@ export default {
fallbackHint:'Non-Claude Code requests will use this group. Leave empty to reject directly.',
fallbackHint:'Non-Claude Code requests will use this group. Leave empty to reject directly.',
noFallback:'No Fallback (Reject)'
noFallback:'No Fallback (Reject)'
},
},
copyAccounts:{
title:'Copy Accounts from Groups',
tooltip:'Select one or more groups of the same platform. After creation, all accounts from these groups will be automatically bound to the new group (deduplicated).',
tooltipEdit:'Select one or more groups of the same platform. After saving, current group accounts will be replaced with accounts from these groups (deduplicated).',
selectPlaceholder:'Select groups to copy accounts from...',
hint:'Multiple groups can be selected, accounts will be deduplicated',
hintEdit:'⚠️ Warning: This will replace all existing account bindings'
},
modelRouting:{
modelRouting:{
title:'Model Routing',
title:'Model Routing',
tooltip:'Configure specific model requests to be routed to designated accounts. Supports wildcard matching, e.g., claude-opus-* matches all opus models.',
tooltip:'Configure specific model requests to be routed to designated accounts. Supports wildcard matching, e.g., claude-opus-* matches all opus models.',
...
@@ -1100,6 +1205,7 @@ export default {
...
@@ -1100,6 +1205,7 @@ export default {
overloaded:'Overloaded',
overloaded:'Overloaded',
tempUnschedulable:'Temp Unschedulable',
tempUnschedulable:'Temp Unschedulable',
rateLimitedUntil:'Rate limited until {time}',
rateLimitedUntil:'Rate limited until {time}',
scopeRateLimitedUntil:'{scope} rate limited until {time}',
mixedChannelWarning:'Warning: Group "{groupName}" contains both {currentPlatform} and {otherPlatform} accounts. Mixing different channels may cause thinking block signature validation issues, which will fallback to non-thinking mode. Are you sure you want to continue?',
pleaseEnterAccountName:'Please enter account name',
pleaseEnterAccountName:'Please enter account name',
pleaseEnterApiKey:'Please enter API Key',
pleaseEnterApiKey:'Please enter API Key',
apiKeyIsRequired:'API Key is required',
apiKeyIsRequired:'API Key is required',
...
@@ -1816,6 +1924,8 @@ export default {
...
@@ -1816,6 +1924,8 @@ export default {
balance:'Balance',
balance:'Balance',
concurrency:'Concurrency',
concurrency:'Concurrency',
subscription:'Subscription',
subscription:'Subscription',
invitation:'Invitation',
invitationHint:'Invitation codes are used to restrict user registration. They are automatically marked as used after use.',
unused:'Unused',
unused:'Unused',
used:'Used',
used:'Used',
columns:{
columns:{
...
@@ -1862,6 +1972,7 @@ export default {
...
@@ -1862,6 +1972,7 @@ export default {
balance:'Balance',
balance:'Balance',
concurrency:'Concurrency',
concurrency:'Concurrency',
subscription:'Subscription',
subscription:'Subscription',
invitation:'Invitation',
// Admin adjustment types (created when admin modifies user balance/concurrency)
// Admin adjustment types (created when admin modifies user balance/concurrency)
admin_balance:'Balance (Admin)',
admin_balance:'Balance (Admin)',
admin_concurrency:'Concurrency (Admin)'
admin_concurrency:'Concurrency (Admin)'
...
@@ -1879,6 +1990,73 @@ export default {
...
@@ -1879,6 +1990,73 @@ export default {
}
}
},
},
// Announcements
announcements:{
title:'Announcements',
description:'Create announcements and target by conditions',
failedToLoadReadStatus:'Failed to load read status',
deleteConfirm:'Are you sure you want to delete this announcement? This action cannot be undone.'
},
// Promo Codes
// Promo Codes
promo:{
promo:{
title:'Promo Code Management',
title:'Promo Code Management',
...
@@ -2650,6 +2828,8 @@ export default {
...
@@ -2650,6 +2828,8 @@ export default {
ignoreContextCanceledHint:'When enabled, client disconnect (context canceled) errors will not be written to the error log.',
ignoreContextCanceledHint:'When enabled, client disconnect (context canceled) errors will not be written to the error log.',
ignoreNoAvailableAccounts:'Ignore no available accounts errors',
ignoreNoAvailableAccounts:'Ignore no available accounts errors',
ignoreNoAvailableAccountsHint:'When enabled, "No available accounts" errors will not be written to the error log (not recommended; usually a config issue).',
ignoreNoAvailableAccountsHint:'When enabled, "No available accounts" errors will not be written to the error log (not recommended; usually a config issue).',
ignoreInvalidApiKeyErrors:'Ignore invalid API key errors',
ignoreInvalidApiKeyErrorsHint:'When enabled, invalid or missing API key errors (INVALID_API_KEY, API_KEY_REQUIRED) will not be written to the error log.',
autoRefresh:'Auto Refresh',
autoRefresh:'Auto Refresh',
enableAutoRefresh:'Enable auto refresh',
enableAutoRefresh:'Enable auto refresh',
enableAutoRefreshHint:'Automatically refresh dashboard data at a fixed interval.',
enableAutoRefreshHint:'Automatically refresh dashboard data at a fixed interval.',
emailVerificationHint:'Require email verification for new registrations',
emailVerificationHint:'Require email verification for new registrations',
promoCode:'Promo Code',
promoCode:'Promo Code',
promoCodeHint:'Allow users to use promo codes during registration'
promoCodeHint:'Allow users to use promo codes during registration',
invitationCode:'Invitation Code Registration',
invitationCodeHint:'When enabled, users must enter a valid invitation code to register',
passwordReset:'Password Reset',
passwordResetHint:'Allow users to reset their password via email',
totp:'Two-Factor Authentication (2FA)',
totpHint:'Allow users to use authenticator apps like Google Authenticator',
totpKeyNotConfigured:
'Please configure TOTP_ENCRYPTION_KEY in environment variables first. Generate a key with: openssl rand -hex 32'
},
},
turnstile:{
turnstile:{
title:'Cloudflare Turnstile',
title:'Cloudflare Turnstile',
...
@@ -2817,6 +3006,17 @@ export default {
...
@@ -2817,6 +3006,17 @@ export default {
hideCcsImportButton:'Hide CCS Import Button',
hideCcsImportButton:'Hide CCS Import Button',
hideCcsImportButtonHint:'When enabled, the "Import to CCS" button will be hidden on the API Keys page'
hideCcsImportButtonHint:'When enabled, the "Import to CCS" button will be hidden on the API Keys page'
},
},
purchase:{
title:'Purchase Page',
description:'Show a "Purchase Subscription" entry in the sidebar and open the configured URL in an iframe',
enabled:'Show Purchase Entry',
enabledHint:'Only shown in standard mode (not simple mode)',
url:'Purchase URL',
urlPlaceholder:'https://example.com/purchase',
urlHint:'Must be an absolute http(s) URL',
iframeWarning:
'⚠️ iframe note: Some websites block embedding via X-Frame-Options or CSP (frame-ancestors). If the page is blank, provide an "Open in new tab" alternative.'
},
smtp:{
smtp:{
title:'SMTP Settings',
title:'SMTP Settings',
description:'Configure email sending for verification codes',
description:'Configure email sending for verification codes',
...
@@ -2962,6 +3162,42 @@ export default {
...
@@ -2962,6 +3162,42 @@ export default {
retry:'Retry'
retry:'Retry'
},
},
// Purchase Subscription Page
purchase:{
title:'Purchase Subscription',
description:'Purchase a subscription via the embedded page',
openInNewTab:'Open in new tab',
notEnabledTitle:'Feature not enabled',
notEnabledDesc:'The administrator has not enabled the purchase page. Please contact admin.',
notConfiguredTitle:'Purchase URL not configured',
notConfiguredDesc:
'The administrator enabled the entry but has not configured a purchase URL. Please contact admin.'
},
// Announcements Page
announcements:{
title:'Announcements',
description:'View system announcements',
unreadOnly:'Show unread only',
markRead:'Mark as read',
markAllRead:'Mark all as read',
viewAll:'View all announcements',
markedAsRead:'Marked as read',
allMarkedAsRead:'All announcements marked as read',
newCount:'{count} new announcement | {count} new announcements',
readAt:'Read at',
read:'Read',
unread:'Unread',
startsAt:'Starts at',
endsAt:'Ends at',
empty:'No announcements',
emptyUnread:'No unread announcements',
total:'announcements',
emptyDescription:'There are no system announcements at this time',
readStatus:'You have read this announcement',
markReadHint:'Click "Mark as read" to mark this announcement'