fix(frontend): sync with main and finalize i18n & component optimizations
This commit is contained in:
@@ -150,6 +150,9 @@ export default {
|
||||
noOptionsFound: 'No options found',
|
||||
saving: 'Saving...',
|
||||
refresh: 'Refresh',
|
||||
notAvailable: 'N/A',
|
||||
now: 'Now',
|
||||
unknown: 'Unknown',
|
||||
time: {
|
||||
never: 'Never',
|
||||
justNow: 'Just now',
|
||||
@@ -812,11 +815,6 @@ export default {
|
||||
gemini: 'Gemini',
|
||||
antigravity: 'Antigravity'
|
||||
},
|
||||
statuses: {
|
||||
active: 'Active',
|
||||
inactive: 'Inactive',
|
||||
error: 'Error'
|
||||
},
|
||||
deleteConfirm:
|
||||
"Are you sure you want to delete '{name}'? All associated API keys will no longer belong to any group.",
|
||||
deleteConfirmSubscription:
|
||||
@@ -957,6 +955,61 @@ export default {
|
||||
codeAssist: 'Code Assist',
|
||||
antigravityOauth: 'Antigravity OAuth'
|
||||
},
|
||||
status: {
|
||||
active: 'Active',
|
||||
inactive: 'Inactive',
|
||||
error: 'Error',
|
||||
cooldown: 'Cooldown',
|
||||
paused: 'Paused',
|
||||
limited: 'Limited',
|
||||
tempUnschedulable: 'Temp Unschedulable',
|
||||
rateLimitedUntil: 'Rate limited until {time}',
|
||||
overloadedUntil: 'Overloaded until {time}',
|
||||
viewTempUnschedDetails: 'View temp unschedulable details'
|
||||
},
|
||||
tempUnschedulable: {
|
||||
title: 'Temp Unschedulable',
|
||||
statusTitle: 'Temp Unschedulable Status',
|
||||
hint: 'Disable accounts temporarily when error code and keyword both match.',
|
||||
notice: 'Rules are evaluated in order and require both error code and keyword match.',
|
||||
addRule: 'Add Rule',
|
||||
ruleOrder: 'Rule Order',
|
||||
ruleIndex: 'Rule #{index}',
|
||||
errorCode: 'Error Code',
|
||||
errorCodePlaceholder: 'e.g. 429',
|
||||
durationMinutes: 'Duration (minutes)',
|
||||
durationPlaceholder: 'e.g. 30',
|
||||
keywords: 'Keywords',
|
||||
keywordsPlaceholder: 'e.g. overloaded, too many requests',
|
||||
keywordsHint: 'Separate keywords with commas; any keyword match will trigger.',
|
||||
description: 'Description',
|
||||
descriptionPlaceholder: 'Optional note for this rule',
|
||||
rulesInvalid: 'Add at least one rule with error code, keywords, and duration.',
|
||||
viewDetails: 'View temp unschedulable details',
|
||||
accountName: 'Account',
|
||||
triggeredAt: 'Triggered At',
|
||||
until: 'Until',
|
||||
remaining: 'Remaining',
|
||||
matchedKeyword: 'Matched Keyword',
|
||||
errorMessage: 'Error Details',
|
||||
reset: 'Reset Status',
|
||||
resetSuccess: 'Temp unschedulable status reset',
|
||||
resetFailed: 'Failed to reset temp unschedulable status',
|
||||
failedToLoad: 'Failed to load temp unschedulable status',
|
||||
notActive: 'This account is not temporarily unschedulable.',
|
||||
expired: 'Expired',
|
||||
remainingMinutes: 'About {minutes} minutes',
|
||||
remainingHours: 'About {hours} hours',
|
||||
remainingHoursMinutes: 'About {hours} hours {minutes} minutes',
|
||||
presets: {
|
||||
overloadLabel: '529 Overloaded',
|
||||
overloadDesc: 'Overloaded - pause 60 minutes',
|
||||
rateLimitLabel: '429 Rate Limit',
|
||||
rateLimitDesc: 'Rate limited - pause 10 minutes',
|
||||
unavailableLabel: '503 Unavailable',
|
||||
unavailableDesc: 'Unavailable - pause 30 minutes'
|
||||
}
|
||||
},
|
||||
columns: {
|
||||
name: 'Name',
|
||||
platformType: 'Platform/Type',
|
||||
@@ -981,16 +1034,6 @@ export default {
|
||||
tokenRefreshed: 'Token refreshed successfully',
|
||||
accountDeleted: 'Account deleted successfully',
|
||||
rateLimitCleared: 'Rate limit cleared successfully',
|
||||
statuses: {
|
||||
active: 'Active',
|
||||
inactive: 'Inactive',
|
||||
error: 'Error',
|
||||
cooldown: 'Cooldown',
|
||||
paused: 'Paused',
|
||||
limited: 'Limited',
|
||||
rateLimitedUntil: 'Rate limited until {time}',
|
||||
overloadedUntil: 'Overloaded until {time}'
|
||||
},
|
||||
bulkActions: {
|
||||
selected: '{count} account(s) selected',
|
||||
selectCurrentPage: 'Select this page',
|
||||
@@ -1238,11 +1281,35 @@ export default {
|
||||
},
|
||||
// Gemini specific (platform-wide)
|
||||
gemini: {
|
||||
helpButton: 'Help',
|
||||
helpDialog: {
|
||||
title: 'Gemini Usage Guide',
|
||||
apiKeySection: 'API Key Links'
|
||||
},
|
||||
modelPassthrough: 'Gemini Model Passthrough',
|
||||
modelPassthroughDesc:
|
||||
'All model requests are forwarded directly to the Gemini API without model restrictions or mappings.',
|
||||
baseUrlHint: 'Leave default for official Gemini API',
|
||||
apiKeyHint: 'Your Gemini API Key (starts with AIza)',
|
||||
tier: {
|
||||
label: 'Account Tier',
|
||||
hint: 'Tip: The system will try to auto-detect the tier first; if auto-detection is unavailable or fails, your selected tier is used as a fallback (simulated quota).',
|
||||
aiStudioHint:
|
||||
'AI Studio quotas are per-model (Pro/Flash are limited independently). If billing is enabled, choose Pay-as-you-go.',
|
||||
googleOne: {
|
||||
free: 'Google One Free',
|
||||
pro: 'Google One Pro',
|
||||
ultra: 'Google One Ultra'
|
||||
},
|
||||
gcp: {
|
||||
standard: 'GCP Standard',
|
||||
enterprise: 'GCP Enterprise'
|
||||
},
|
||||
aiStudio: {
|
||||
free: 'Google AI Free',
|
||||
paid: 'Google AI Pay-as-you-go'
|
||||
}
|
||||
},
|
||||
accountType: {
|
||||
oauthTitle: 'OAuth (Gemini)',
|
||||
oauthDesc: 'Authorize with your Google account and choose an OAuth type.',
|
||||
@@ -1303,6 +1370,17 @@ export default {
|
||||
},
|
||||
simulatedNote: 'Simulated quota, for reference only',
|
||||
rows: {
|
||||
googleOne: {
|
||||
channel: 'Google One OAuth (Individuals / Code Assist for Individuals)',
|
||||
limitsFree: 'Shared pool: 1000 RPD / 60 RPM',
|
||||
limitsPro: 'Shared pool: 1500 RPD / 120 RPM',
|
||||
limitsUltra: 'Shared pool: 2000 RPD / 120 RPM'
|
||||
},
|
||||
gcp: {
|
||||
channel: 'GCP Code Assist OAuth (Enterprise)',
|
||||
limitsStandard: 'Shared pool: 1500 RPD / 120 RPM',
|
||||
limitsEnterprise: 'Shared pool: 2000 RPD / 120 RPM'
|
||||
},
|
||||
cli: {
|
||||
channel: 'Gemini CLI (Official Google Login / Code Assist)',
|
||||
free: 'Free Google Account',
|
||||
@@ -1320,7 +1398,7 @@ export default {
|
||||
free: 'No billing (free tier)',
|
||||
paid: 'Billing enabled (pay-as-you-go)',
|
||||
limitsFree: 'RPD 50; RPM 2 (Pro) / 15 (Flash)',
|
||||
limitsPaid: 'RPD unlimited; RPM 1000+ (per model quota)'
|
||||
limitsPaid: 'RPD unlimited; RPM 1000 (Pro) / 2000 (Flash) (per model)'
|
||||
},
|
||||
customOAuth: {
|
||||
channel: 'Custom OAuth Client (GCP)',
|
||||
@@ -1333,6 +1411,7 @@ export default {
|
||||
},
|
||||
rateLimit: {
|
||||
ok: 'Not rate limited',
|
||||
unlimited: 'Unlimited',
|
||||
limited: 'Rate limited {time}',
|
||||
now: 'now'
|
||||
}
|
||||
@@ -1439,11 +1518,6 @@ export default {
|
||||
socks5: 'SOCKS5',
|
||||
socks5h: 'SOCKS5H (Remote DNS)'
|
||||
},
|
||||
statuses: {
|
||||
active: 'Active',
|
||||
inactive: 'Inactive',
|
||||
error: 'Error'
|
||||
},
|
||||
columns: {
|
||||
name: 'Name',
|
||||
protocol: 'Protocol',
|
||||
@@ -1561,7 +1635,13 @@ export default {
|
||||
selectGroupPlaceholder: 'Choose a subscription group',
|
||||
validityDays: 'Validity Days',
|
||||
groupRequired: 'Please select a subscription group',
|
||||
days: ' days'
|
||||
days: ' days',
|
||||
status: {
|
||||
unused: 'Unused',
|
||||
used: 'Used',
|
||||
expired: 'Expired',
|
||||
disabled: 'Disabled'
|
||||
}
|
||||
},
|
||||
|
||||
// Usage Records
|
||||
@@ -1612,6 +1692,7 @@ export default {
|
||||
siteKey: 'Site Key',
|
||||
secretKey: 'Secret Key',
|
||||
siteKeyHint: 'Get this from your Cloudflare Dashboard',
|
||||
cloudflareDashboard: 'Cloudflare Dashboard',
|
||||
secretKeyHint: 'Server-side verification key (keep this secret)'
|
||||
},
|
||||
defaults: {
|
||||
@@ -1762,6 +1843,7 @@ export default {
|
||||
noActiveSubscriptions: 'No Active Subscriptions',
|
||||
noActiveSubscriptionsDesc:
|
||||
"You don't have any active subscriptions. Contact administrator to get one.",
|
||||
failedToLoad: 'Failed to load subscriptions',
|
||||
status: {
|
||||
active: 'Active',
|
||||
expired: 'Expired',
|
||||
|
||||
@@ -147,6 +147,9 @@ export default {
|
||||
noOptionsFound: '无匹配选项',
|
||||
saving: '保存中...',
|
||||
refresh: '刷新',
|
||||
notAvailable: '不可用',
|
||||
now: '现在',
|
||||
unknown: '未知',
|
||||
time: {
|
||||
never: '从未',
|
||||
justNow: '刚刚',
|
||||
@@ -868,11 +871,6 @@ export default {
|
||||
gemini: 'Gemini',
|
||||
antigravity: 'Antigravity'
|
||||
},
|
||||
statuses: {
|
||||
active: '正常',
|
||||
inactive: '停用',
|
||||
error: '错误'
|
||||
},
|
||||
saving: '保存中...',
|
||||
noGroups: '暂无分组',
|
||||
noGroupsDescription: '创建分组以更好地管理 API 密钥和费率。',
|
||||
@@ -1072,15 +1070,60 @@ export default {
|
||||
api_key: 'API Key',
|
||||
cookie: 'Cookie'
|
||||
},
|
||||
statuses: {
|
||||
status: {
|
||||
active: '正常',
|
||||
inactive: '停用',
|
||||
error: '错误',
|
||||
cooldown: '冷却中',
|
||||
paused: '暂停',
|
||||
limited: '限流',
|
||||
tempUnschedulable: '临时不可调度',
|
||||
rateLimitedUntil: '限流中,重置时间:{time}',
|
||||
overloadedUntil: '负载过重,重置时间:{time}'
|
||||
overloadedUntil: '负载过重,重置时间:{time}',
|
||||
viewTempUnschedDetails: '查看临时不可调度详情'
|
||||
},
|
||||
tempUnschedulable: {
|
||||
title: '临时不可调度',
|
||||
statusTitle: '临时不可调度状态',
|
||||
hint: '当错误码与关键词同时匹配时,账号会在指定时间内被临时禁用。',
|
||||
notice: '规则按顺序匹配,需同时满足错误码与关键词。',
|
||||
addRule: '添加规则',
|
||||
ruleOrder: '规则序号',
|
||||
ruleIndex: '规则 #{index}',
|
||||
errorCode: '错误码',
|
||||
errorCodePlaceholder: '例如 429',
|
||||
durationMinutes: '持续时间(分钟)',
|
||||
durationPlaceholder: '例如 30',
|
||||
keywords: '关键词',
|
||||
keywordsPlaceholder: '例如 overloaded, too many requests',
|
||||
keywordsHint: '多个关键词用逗号分隔,匹配时必须命中其中之一。',
|
||||
description: '描述',
|
||||
descriptionPlaceholder: '可选,便于记忆规则用途',
|
||||
rulesInvalid: '请至少填写一条包含错误码、关键词和时长的规则。',
|
||||
viewDetails: '查看临时不可调度详情',
|
||||
accountName: '账号',
|
||||
triggeredAt: '触发时间',
|
||||
until: '解除时间',
|
||||
remaining: '剩余时间',
|
||||
matchedKeyword: '匹配关键词',
|
||||
errorMessage: '错误详情',
|
||||
reset: '重置状态',
|
||||
resetSuccess: '临时不可调度已重置',
|
||||
resetFailed: '重置临时不可调度失败',
|
||||
failedToLoad: '加载临时不可调度状态失败',
|
||||
notActive: '当前账号未处于临时不可调度状态。',
|
||||
expired: '已到期',
|
||||
remainingMinutes: '约 {minutes} 分钟',
|
||||
remainingHours: '约 {hours} 小时',
|
||||
remainingHoursMinutes: '约 {hours} 小时 {minutes} 分钟',
|
||||
presets: {
|
||||
overloadLabel: '529 过载',
|
||||
overloadDesc: '服务过载 - 暂停 60 分钟',
|
||||
rateLimitLabel: '429 限流',
|
||||
rateLimitDesc: '触发限流 - 暂停 10 分钟',
|
||||
unavailableLabel: '503 维护',
|
||||
unavailableDesc: '服务不可用 - 暂停 30 分钟'
|
||||
}
|
||||
},
|
||||
usageWindow: {
|
||||
statsTitle: '5小时窗口用量统计',
|
||||
@@ -1366,10 +1409,33 @@ export default {
|
||||
},
|
||||
// Gemini specific (platform-wide)
|
||||
gemini: {
|
||||
helpButton: '使用帮助',
|
||||
helpDialog: {
|
||||
title: 'Gemini 使用指南',
|
||||
apiKeySection: 'API Key 相关链接'
|
||||
},
|
||||
modelPassthrough: 'Gemini 直接转发模型',
|
||||
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API,不进行模型限制或映射。',
|
||||
baseUrlHint: '留空使用官方 Gemini API',
|
||||
apiKeyHint: '您的 Gemini API Key(以 AIza 开头)',
|
||||
tier: {
|
||||
label: '账号等级',
|
||||
hint: '提示:系统会优先尝试自动识别账号等级;若自动识别不可用或失败,则使用你选择的等级作为回退(本地模拟配额)。',
|
||||
aiStudioHint: 'AI Studio 的配额是按模型分别限流(Pro/Flash 独立)。若已绑卡(按量付费),请选 Pay-as-you-go。',
|
||||
googleOne: {
|
||||
free: 'Google One Free',
|
||||
pro: 'Google One Pro',
|
||||
ultra: 'Google One Ultra'
|
||||
},
|
||||
gcp: {
|
||||
standard: 'GCP Standard',
|
||||
enterprise: 'GCP Enterprise'
|
||||
},
|
||||
aiStudio: {
|
||||
free: 'Google AI Free',
|
||||
paid: 'Google AI Pay-as-you-go'
|
||||
}
|
||||
},
|
||||
accountType: {
|
||||
oauthTitle: 'OAuth 授权(Gemini)',
|
||||
oauthDesc: '使用 Google 账号授权,并选择 OAuth 子类型。',
|
||||
@@ -1429,6 +1495,17 @@ export default {
|
||||
},
|
||||
simulatedNote: '本地模拟配额,仅供参考',
|
||||
rows: {
|
||||
googleOne: {
|
||||
channel: 'Google One OAuth(个人版 / Code Assist for Individuals)',
|
||||
limitsFree: '共享池:1000 RPD / 60 RPM(不分模型)',
|
||||
limitsPro: '共享池:1500 RPD / 120 RPM(不分模型)',
|
||||
limitsUltra: '共享池:2000 RPD / 120 RPM(不分模型)'
|
||||
},
|
||||
gcp: {
|
||||
channel: 'GCP Code Assist OAuth(企业版)',
|
||||
limitsStandard: '共享池:1500 RPD / 120 RPM(不分模型)',
|
||||
limitsEnterprise: '共享池:2000 RPD / 120 RPM(不分模型)'
|
||||
},
|
||||
cli: {
|
||||
channel: 'Gemini CLI(官方 Google 登录 / Code Assist)',
|
||||
free: '免费 Google 账号',
|
||||
@@ -1446,7 +1523,7 @@ export default {
|
||||
free: '未绑卡(免费层)',
|
||||
paid: '已绑卡(按量付费)',
|
||||
limitsFree: 'RPD 50;RPM 2(Pro)/ 15(Flash)',
|
||||
limitsPaid: 'RPD 不限;RPM 1000+(按模型配额)'
|
||||
limitsPaid: 'RPD 不限;RPM 1000(Pro)/ 2000(Flash)(按模型配额)'
|
||||
},
|
||||
customOAuth: {
|
||||
channel: 'Custom OAuth Client(GCP)',
|
||||
@@ -1459,6 +1536,7 @@ export default {
|
||||
},
|
||||
rateLimit: {
|
||||
ok: '未限流',
|
||||
unlimited: '无限流',
|
||||
limited: '限流 {time}',
|
||||
now: '现在'
|
||||
}
|
||||
@@ -1549,12 +1627,7 @@ export default {
|
||||
socks5: 'SOCKS5',
|
||||
socks5h: 'SOCKS5H (服务端解析 DNS)'
|
||||
},
|
||||
statuses: {
|
||||
active: '正常',
|
||||
inactive: '停用',
|
||||
error: '错误'
|
||||
},
|
||||
form: {
|
||||
columns: {
|
||||
nameLabel: '名称',
|
||||
namePlaceholder: '请输入代理名称',
|
||||
protocolLabel: '协议',
|
||||
@@ -1693,7 +1766,7 @@ export default {
|
||||
validityDays: '有效天数',
|
||||
groupRequired: '请选择订阅分组',
|
||||
days: '天',
|
||||
statuses: {
|
||||
status: {
|
||||
unused: '未使用',
|
||||
used: '已使用',
|
||||
expired: '已过期',
|
||||
@@ -1787,6 +1860,7 @@ export default {
|
||||
siteKey: '站点密钥',
|
||||
secretKey: '私密密钥',
|
||||
siteKeyHint: '从 Cloudflare Dashboard 获取',
|
||||
cloudflareDashboard: 'Cloudflare Dashboard',
|
||||
secretKeyHint: '服务端验证密钥(请保密)'
|
||||
},
|
||||
defaults: {
|
||||
@@ -1934,6 +2008,7 @@ export default {
|
||||
description: '查看您的订阅计划和用量',
|
||||
noActiveSubscriptions: '暂无有效订阅',
|
||||
noActiveSubscriptionsDesc: '您没有任何有效订阅。请联系管理员获取订阅。',
|
||||
failedToLoad: '加载订阅失败',
|
||||
status: {
|
||||
active: '有效',
|
||||
expired: '已过期',
|
||||
|
||||
Reference in New Issue
Block a user