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"}}\'', }, ], }, }, }