Files
Luminary/web/src/i18n/locales/en.ts
T
renjue b1394a2817
CI / docker (push) Successful in 3m49s
Split ingress keys into text/image protocols with Replicate model listing.
Text keys use OpenAI routes; image keys use predictions with ingress Model ID,
OpenAPI input schemas, owner/name or short name resolution, protocol-aware admin
whitelist, and in-app API docs aligned to UI conventions.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 22:36:42 +08:00

316 lines
12 KiB
TypeScript

export default {
common: {
brand: 'Luminary',
cancel: 'Cancel',
confirm: 'Confirm',
save: 'Save',
edit: 'Edit',
create: 'Create',
add: 'Add',
delete: 'Delete',
refresh: 'Refresh',
query: 'Search',
copy: 'Copy',
actions: 'Actions',
name: 'Name',
status: 'Status',
type: 'Type',
enabled: 'Enabled',
disabled: 'Disabled',
yes: 'Yes',
no: 'No',
all: 'All',
loading: 'Loading...',
empty: '(empty)',
dash: '—',
infinity: '∞',
confirmDelete: 'Delete this item?',
auto: 'Auto',
detail: 'Details',
model: 'Model',
requests: 'Requests',
tokens: 'Tokens',
cost: 'Cost ($)',
latencyMs: 'Latency (ms)',
latency: 'Latency',
stream: 'Stream',
error: 'Error',
time: 'Time',
username: 'Username',
password: 'Password',
weight: 'Weight',
priority: 'Priority',
category: 'Category',
budget: 'Budget',
soon: 'Coming soon',
whitelistMore: '{items} and {count} more',
language: 'Language',
zh: '中文',
en: 'English',
},
nav: {
dashboard: 'Dashboard',
providers: 'Egress',
ingress: 'Ingress',
logs: 'Request Logs',
ipRules: 'IP Rules',
settings: 'Settings',
security: 'Security',
logout: 'Sign out',
},
login: {
subtitle: 'AI Gateway Console',
title: 'Sign in',
username: 'Username',
passwordPlaceholder: 'Enter password',
submit: 'Sign in',
footer: 'Luminary Gateway — unified AI egress & ingress management',
success: 'Signed in successfully',
failed: 'Sign in failed. Check username and password.',
rateLimited: 'Too many attempts. Please try again later.',
rateLimitedSec: 'Too many attempts. Try again in {sec} seconds.',
ipBlocked: 'Your IP is not allowed to access the admin console. Check IP rules or contact an administrator.',
},
dashboard: {
title: 'Dashboard',
description: 'Real-time gateway requests, error rate, and provider health',
requests24h: '24h Requests',
tokens24h: '24h Tokens',
errorRate: 'Error Rate',
activeIngressKeys: 'Active Ingress Keys',
requestTrend: '24h Request Trend',
tokenTrend: '24h Token Trend',
seriesRequests: 'Requests',
seriesErrors: 'Errors',
seriesTokens: 'Tokens',
providerHealth: 'Provider Health',
ingressTop5: 'Top 5 Ingress Keys',
providerModelUsage: 'Provider + Model Usage (24h)',
clientIpUsage: 'Client IP Usage (24h)',
clientIp: 'Client IP',
requestCount: 'Requests',
},
providers: {
title: 'Egress Providers',
description: 'Configure upstream providers, API paths, and keys',
addProvider: 'Add Provider',
protocolType: 'Protocol',
baseUrl: 'Base URL',
baseUrlPlaceholder: 'Leave empty for default',
enabledEndpoints: 'Enabled Endpoints',
models: 'Models',
modelsEmpty: 'No models yet. Click Sync Models to pull from upstream.',
displayName: 'Display Name',
syncedAt: 'Synced At',
addDialogTitle: 'Add Provider',
endpointConfig: 'Endpoint Config',
endpointConfigTitle: 'Endpoint Config — {name}',
endpointDivider: 'Endpoints & Paths',
endpointEditDivider: 'Enabled Endpoints & Path Overrides',
pathHint: 'Path can be relative (based on Base URL) or a full http(s) URL',
keysTitle: 'Keys — {name}',
addKey: 'Add Key',
addKeyDialogTitle: 'Add Provider Key',
apiKey: 'API Key',
modelWhitelist: 'Model Whitelist',
modelWhitelistPlaceholder: '["*"] or gpt-4o-mini',
maxRequestsPerDay: 'Max Requests / Day',
maxTokensPerDay: 'Max Tokens / Day',
requestsToday: 'Requests Today',
modelsTitle: 'Models — {name}',
syncModels: 'Sync Models',
addModel: 'Add Model',
addModelDialogTitle: 'Add Model',
modelId: 'Model ID',
ingressModelId: 'Ingress Model ID',
ingressModelIdHint: 'Clients use this name in the version field of /v1/predictions',
ingressModelIdRequired: 'Ingress Model ID is required',
modelAlias: 'Ingress alias',
modelAliasPlaceholder: 'Optional; ingress API uses this name',
modelAliasHint: 'Leave empty to use upstream Model ID at ingress',
upstreamModelId: 'Upstream Model ID',
editModelDialogTitle: 'Edit model',
providerNameExists: 'Provider name already exists',
modelAliasExists: 'Model alias already exists',
modelIdRequired: 'Model ID is required',
modelAdded: 'Model added',
modelDeleted: 'Model deleted',
confirmDeleteModel: 'Delete this model?',
modelsSummary: '{total} models, {enabled} enabled',
modelsAction: 'Models',
endpointsAction: 'Endpoints',
keysAction: 'Keys',
modelNotLoaded: 'Model data not loaded. Refresh and try again.',
modelEnabled: 'Model enabled',
modelDisabled: 'Model disabled',
modelNotFound: 'Model not found. Sync models and try again.',
updateFailed: 'Update failed',
createSuccess: 'Created successfully',
saved: 'Saved',
deleted: 'Deleted',
syncedCount: 'Synced {count} models',
syncFailed: 'Sync failed',
keyAdded: 'Key added',
},
ingress: {
title: 'Ingress Keys',
description: 'Create virtual keys with budget, rate limits, and routing',
createKey: 'Create Ingress Key',
keyPrefix: 'Key Prefix',
providerWhitelist: 'Provider Whitelist',
modelWhitelist: 'Model Whitelist',
budgetLimit: 'Budget Limit',
rpmLimit: 'RPM Limit',
tpmLimit: 'TPM Limit',
whitelistAction: 'Whitelist',
routingAction: 'Routing',
createDialogTitle: 'Create Ingress Key',
providerWhitelistPlaceholder: 'Empty means all providers',
modelWhitelistPlaceholder: 'Empty means all models',
whitelistHint: 'Empty selection allows all',
modelWhitelistHint: 'Empty allows all; sync models in Egress first',
editWhitelistTitle: 'Edit Whitelist',
plainKeyTitle: 'Save your key (shown once)',
plainKeyWarning: 'Copy now — the full key cannot be viewed again after closing',
routingTitle: 'Routing Rules — {name}',
addRule: 'Add Rule',
modelPattern: 'Model Pattern',
modelPatternPlaceholder: 'gpt-4o* or claude-3-5-sonnet',
providerId: 'Provider',
providerIdPlaceholder: 'Select provider',
keyIdOptional: 'Provider key',
keyIdPlaceholder: 'Leave empty for auto load balancing',
providerRequired: 'Please select a provider',
addRuleTitle: 'Add Routing Rule',
whitelistUpdated: 'Whitelist updated',
confirmDeleteKey: 'Delete this key?',
copied: 'Copied',
ruleAdded: 'Rule added',
protocol: 'Protocol',
protocolText: 'Text (OpenAI)',
protocolImage: 'Image (Replicate)',
protocolHint: 'Text keys use /v1/chat/completions etc.; image keys use /v1/predictions and Replicate model listing',
editKeyTitle: 'Edit Key',
protocolUpdated: 'Key updated',
apiDoc: 'API Docs',
},
logs: {
title: 'Request Logs',
description: 'Latest 500 records including inference and admin login',
ingress: 'Ingress',
endpoint: 'Endpoint',
modelOrUser: 'Model / User',
modelOrUserPlaceholder: 'Model / username',
clientIpPlaceholder: 'Client IP',
statusSuccess: 'Success',
statusError: 'Error',
endpointAdminLogin: 'Admin Login',
pagerHint: '{total} total, up to {max} retained',
detailTitle: 'Request Details',
requestBody: 'Request Body',
responseBody: 'Response Body',
predictionStatus: 'Prediction status',
},
ipRules: {
title: 'IP Rules',
description: 'Whitelist / blacklist for admin console and inference API',
addRule: 'Add IP Rule',
cidr: 'CIDR / IP',
cidrPlaceholder: '192.168.1.0/24 or 127.0.0.1',
scope: 'Scope',
typeAllow: 'Allow',
typeDeny: 'Deny',
scopeProxy: 'Inference API',
scopeAdmin: 'Admin Console',
scopeAll: 'All (Admin + API)',
allowWarning: 'Allow rules restrict admin access. Ensure your current IP is included.',
added: 'Added',
},
settings: {
title: 'Settings',
description: 'All runtime parameters are managed here — no config file required',
securitySession: 'Security & Session',
gatewayMonitor: 'Gateway & Monitoring',
changePassword: 'Change Admin Password',
encryptionKey: 'Encryption Key',
encryptionKeyPlaceholder: 'Leave empty to keep unchanged; must match old key to decrypt existing provider keys',
encryptionKeyCurrent: 'Current: {hint}',
sessionTtl: 'Session TTL (seconds)',
loginMaxAttempts: 'Max Login Attempts',
loginLockout: 'Login Lockout (seconds)',
trustedProxies: 'Trusted Proxy IPs / CIDRs',
trustedProxiesPlaceholder: 'One per line, e.g. 127.0.0.1 or 10.0.0.0/8',
usageFlush: 'Usage Flush Interval (seconds)',
healthCheck: 'Health Check Interval (seconds)',
gatewayMaxRetries: 'Gateway Max Retries',
retryBackoff: 'Retry Backoff (ms)',
saveSettings: 'Save Settings',
oldPassword: 'Current Password',
newPassword: 'New Password',
savePassword: 'Save Password',
settingsSaved: 'Settings saved',
passwordUpdated: 'Password updated',
},
apiDocs: {
backToKeys: 'Back to Ingress Keys',
authTitle: 'Authentication',
authDesc: 'Send your ingress key (sk-lum-*) using either header:',
baseUrl: 'Base URL',
endpointsTitle: 'Endpoints',
examplesTitle: 'Examples',
method: 'Method',
path: 'Path',
summary: 'Summary',
text: {
title: 'Text API (OpenAI compatible)',
description: 'For ingress keys with the Text protocol. Compatible with OpenAI SDKs.',
note: 'Available endpoints depend on enabled egress endpoints. Empty whitelist means no provider/model restriction.',
endpointRows: [
{ method: 'GET', path: '/v1/models', summary: 'List models (OpenAI format)', status: 'Supported' },
{ method: 'POST', path: '/v1/chat/completions', summary: 'Chat completions; SSE when stream: true', status: 'Supported' },
{ method: 'POST', path: '/v1/responses', summary: 'OpenAI Responses API', status: 'Supported' },
{ method: 'POST', path: '/v1/completions', summary: 'Legacy text completions', status: 'Supported' },
{ method: 'POST', path: '/v1/embeddings', summary: 'Embeddings', status: 'Supported' },
{ method: 'POST', path: '/v1/rerank', summary: 'Cohere-compatible rerank', status: 'Supported' },
],
exampleRows: [
{
title: 'List models',
code: 'curl {baseURL}/models \\\n -H "Authorization: Bearer sk-lum-..."',
},
{
title: 'Chat completion',
code: 'curl {baseURL}/chat/completions \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}\'',
},
{
title: 'Embeddings',
code: 'curl {baseURL}/embeddings \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"model":"text-embedding-3-small","input":"hello"}\'',
},
],
},
image: {
title: 'Image API (Replicate compatible)',
description: 'For ingress keys with the Image protocol. Async ComfyUI txt2img / img2img workflows.',
note: 'Request field version accepts owner/name or short name (aligned with latest_version.id, owner, and name from the model list). See openapi_schema.components.schemas.Input for input fields. Outputs are signed URLs (/files/:id?exp=&sig=).',
endpointRows: [
{ method: 'GET', path: '/v1/models', summary: 'List workflow models (Replicate format)', status: 'Supported' },
{ method: 'POST', path: '/v1/predictions', summary: 'Create async job; Prefer: wait for sync', status: 'Supported' },
{ method: 'GET', path: '/v1/predictions', summary: 'List jobs (cursor pagination)', status: 'Supported' },
{ method: 'GET', path: '/v1/predictions/:id', summary: 'Get job status and output', status: 'Supported' },
{ method: 'POST', path: '/v1/predictions/:id/cancel', summary: 'Cancel a running job', status: 'Supported' },
{ method: 'GET', path: '/v1/predictions/:id/stream', summary: 'SSE progress stream', status: 'Supported' },
],
exampleRows: [
{
title: 'List workflow models',
code: 'curl {baseURL}/models \\\n -H "Authorization: Bearer sk-lum-..."',
},
{
title: 'Create prediction',
code: 'curl -X POST {baseURL}/predictions \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"version":"luminary/flux-txt2img","input":{"prompt":"a cat"}}\'',
},
],
},
},
}