{
  "login.title": "Sign in",
  "login.subtitle": "Enter admin password to continue",
  "login.password": "Admin Password",
  "login.passwordPlaceholder": "Enter password",
  "login.submit": "Login",
  "login.remember": "Remember password",
  "login.error": "Wrong password",
  "login.connectError": "Connection failed",
  "status.running": "Running",
  "footer.status": "Status",
  "footer.resources": "Resources",
  "stats.accounts": "Accounts",
  "stats.requests": "Requests",
  "stats.success": "Success",
  "stats.failed": "Failed",
  "stats.completed": "Completed",
  "stats.errors": "Errors",
  "stats.tokens": "Tokens",
  "stats.credits": "Credits",
  "stats.kiroCredits": "Kiro Credits",
  "stats.capacity": "Capacity",
  "stats.traffic": "Traffic",
  "stats.reliability": "Reliability",
  "tabs.accounts": "Accounts",
  "tabs.settings": "Settings",
  "tabs.api": "API Keys",
  "tabs.requests": "Requests",
  "accounts.title": "Account List",
  "accounts.add": "Add Account",
  "accounts.empty": "No accounts",
  "accounts.refresh": "Refresh",
  "accounts.selectAccount": "Select account {0}",
  "accounts.detail": "Details",
  "accounts.enable": "Enable",
  "accounts.disable": "Disable",
  "accounts.delete": "Delete",
  "accounts.requests": "Requests",
  "accounts.tokens": "Tokens",
  "accounts.credits": "Credits",
  "accounts.expiry": "Expiry",
  "accounts.noToken": "No Token",
  "accounts.expired": "Expired",
  "accounts.disabled": "Disabled",
  "accounts.normal": "Active",
  "accounts.enabled": "Enabled",
  "accounts.banned": "Banned",
  "accounts.dead": "Dead (needs re-import)",
  "accounts.suspended": "Suspended",
  "accounts.refreshFailed": "Refresh failed",
  "accounts.confirmDelete": "Confirm delete?",
  "accounts.deleteSuccess": "Account deleted",
  "accounts.mainQuota": "Main Quota",
  "accounts.trialQuota": "Trial Quota",
  "accounts.trial": "Trial",
  "accounts.trialExpired": "expired",
  "accounts.trialToday": "today",
  "accounts.trialDays": "d left",
  "accounts.copyJSON": "Copy JSON",
  "accounts.copyJSONSuccess": "JSON copied to clipboard",
  "accounts.overage": "Overage",
  "accounts.overageOn": "Overage:ON",
  "accounts.overageOff": "Overage:OFF",
  "accounts.overageSwitchFailed": "Overage switch failed",
  "accounts.export": "Export",
  "accounts.weight": "Weight",
  "accounts.test": "Test",
  "accounts.testing": "Testing...",
  "accounts.testSuccess": "Test OK",
  "accounts.testFailed": "Test Failed",
  "accounts.testModalTitle": "Account Test",
  "accounts.selectModel": "Select Test Model",
  "accounts.testModelsLoading": "Loading models...",
  "accounts.testModelsReady": "Cached models: {0}",
  "accounts.testModelsFallback": "Model list unavailable",
  "accounts.testLog.title": "Test Log",
  "accounts.testLog.clear": "Clear",
  "accounts.testLog.hide": "Hide",
  "accounts.testLog.empty": "No test run yet",
  "accounts.testLog.globalProxy": "Global Proxy",
  "accounts.testLog.start": "Testing {0} | Model: {1} | Proxy: {2}",
  "accounts.testLog.success": "✓ {0} OK ({1}s) Reply: {2}",
  "accounts.testLog.failed": "✗ {0} Failed ({1}s): {2}",
  "accounts.testLog.error": "✗ {0} Error: {1}",
  "time.expired": "Expired",
  "time.minutes": "min",
  "time.hours": "hr",
  "time.days": "d",
  "settings.usageSettings": "Usage Control",
  "settings.allowOverUsage": "Allow Over-Usage",
  "settings.allowOverUsageHint": "When enabled, accounts will continue to serve requests even after their quota is exhausted",
  "settings.saveUsage": "Save Usage Changes",
  "settings.overUsageSaved": "Over-usage settings saved",
  "settings.endpointSettings": "Upstream Endpoint",
  "settings.endpointMode": "Endpoint Mode",
  "settings.endpointModeKiroCli": "Kiro CLI (runtime.kiro.dev)",
  "settings.endpointModeVibe": "Vibe (generateAssistantResponse)",
  "settings.endpointModeAuto": "Auto (try both, remember the one that works)",
  "settings.endpointModeHint": "Which upstream chat endpoint to use. Kiro CLI and Vibe draw from separate quotas; Auto probes both per account and persists whichever succeeds.",
  "settings.endpointOrigin": "Payload Origin",
  "settings.endpointOriginAuto": "Auto (per endpoint: Kiro CLI → KIRO_CLI, Vibe → AI_EDITOR)",
  "settings.endpointOriginKiroCli": "KIRO_CLI (force on every endpoint)",
  "settings.endpointOriginAiEditor": "AI_EDITOR (force on every endpoint)",
  "settings.endpointOriginHint": "The conversationState origin sent upstream, independent of the endpoint. This changes model behavior, not just client identity: GPT-family models return encrypted reasoning (reasoning.encrypted_content on /v1/responses, needed for stateless multi-turn reasoning) only under KIRO_CLI. Under AI_EDITOR the upstream sends plaintext reasoning and no encrypted blob — so pick KIRO_CLI if you use the Responses API statelessly on Vibe.",
  "settings.sendTelemetry": "Send CLI Telemetry",
  "settings.sendTelemetryHint": "Off by default. Mirrors the SendTelemetryEvent call the real Kiro CLI makes after every answer (timings, response length, model id — no prompt or response text). The genuine CLI sends it even when opted out, so enabling this makes traffic harder to distinguish, at the cost of one extra request per answer. Kiro CLI endpoint only.",
  "settings.saveEndpoint": "Save Endpoint Changes",
  "settings.endpointModeSaved": "Endpoint mode saved",
  "settings.thinkingSettings": "Thinking Mode Settings",
  "settings.nativeThinkingMode": "Native Thinking Mode",
  "settings.nativeThinkingModeOff": "Off (only when pinned on the model name)",
  "settings.nativeThinkingModeAuto": "Auto (when the request asks for an effort)",
  "settings.nativeThinkingModeForce": "Force (always on, defaults to high)",
  "settings.nativeThinkingModeHint": "Applies when the request does not pin an effort itself. A model-name variant such as claude-opus-5-high always wins over this setting.",
  "settings.nativeThinkingDisplay": "Thinking Text Display",
  "settings.nativeThinkingDisplaySummarized": "Summarized (upstream returns reasoning text)",
  "settings.nativeThinkingDisplayOmitted": "Omitted (reasoning is hidden upstream)",
  "settings.nativeThinkingDisplayHint": "Controls whether the upstream returns the reasoning text alongside the answer.",
  "settings.thinkingEffortHint": "Pick the effort per request by appending it to the model name: -low, -medium, -high, -xhigh, -max (or -none to opt out), e.g. claude-opus-5-high. Which models support reasoning and which levels each accepts is read from the upstream model list; unsupported levels are clamped to the nearest one the model does allow.",
  "settings.openaiFormat": "OpenAI API Output Format",
  "settings.claudeFormat": "Claude API Output Format",
  "settings.noTag": "Direct output (no tag)",
  "settings.saveThinking": "Save Thinking Settings",
  "settings.thinkingSaved": "Thinking settings saved",
  "settings.adminPassword": "Admin Password",
  "settings.newPassword": "New Password",
  "settings.newPasswordPlaceholder": "Enter new password",
  "settings.changePassword": "Change Password",
  "settings.passwordRequired": "Please enter new password",
  "settings.passwordChanged": "Password changed",
  "settings.statistics": "Statistics",
  "settings.resetStats": "Reset Statistics",
  "settings.confirmReset": "Confirm reset statistics?",
  "settings.statsReset": "Statistics reset",
  "settings.proxySettings": "Outbound Proxy Settings",
  "settings.proxyType": "Proxy Type",
  "settings.proxyNone": "Direct (no proxy)",
  "settings.proxyHost": "Host / Port",
  "settings.proxyAuth": "Authentication (optional)",
  "settings.proxyUsername": "Username",
  "settings.proxyPassword": "Password",
  "settings.proxyHostRequired": "Please enter proxy host and port",
  "settings.saveProxy": "Save Proxy Settings",
  "settings.proxySaved": "Proxy settings saved",
  "settings.promptFilter": "System Prompt Filter",
  "settings.builtinFilters": "Built-in Filters",
  "settings.filterClaudeCode": "Replace Claude Code CLI system prompts",
  "settings.filterClaudeCodeHint": "Detects Claude Code built-in system prompts and replaces them with a compact backend prompt.",
  "settings.filterEnvNoise": "Strip environment noise lines",
  "settings.filterEnvNoiseHint": "Removes injected env vars, git status, recent commits and similar noise from system prompts.",
  "settings.filterStripBoundaries": "Remove boundary markers",
  "settings.filterStripBoundariesHint": "Strips --- SYSTEM PROMPT --- / --- END SYSTEM PROMPT --- marker lines.",
  "settings.savePromptFilter": "Save Filter Settings",
  "settings.promptFilterSaved": "Filter settings saved",
  "settings.customRules": "Custom Filter Rules",
  "api.endpoints": "API Endpoints",
  "api.modelList": "Model List",
  "api.stats": "Statistics",
  "api.statsHint": "Requires an API key in the header (Authorization: Bearer sk-xxx or X-Api-Key). Each request is charged against that key's credit balance.",
  "detail.title": "Account Details",
  "detail.basicInfo": "Basic Info",
  "detail.email": "Email",
  "detail.userId": "User ID",
  "detail.authMethod": "Auth Method",
  "detail.region": "Region",
  "detail.oidcRegion": "OIDC Region",
  "detail.machineId": "Machine ID",
  "detail.generate": "Generate",
  "detail.subscription": "Subscription",
  "detail.subscriptionType": "Type",
  "detail.tokenExpiry": "Token Expiry",
  "detail.usage": "Usage",
  "detail.mainQuota": "Main Quota",
  "detail.trialQuota": "Trial Quota",
  "detail.trialStatus": "Trial Status",
  "detail.trialExpiry": "Trial Expiry",
  "detail.resetDate": "Reset Date",
  "detail.statistics": "Statistics",
  "detail.requestCount": "Requests",
  "detail.errorCount": "Errors",
  "detail.totalTokens": "Total Tokens",
  "detail.totalCredits": "Total Credits",
  "detail.models": "Available Models",
  "detail.loadModels": "Load",
  "detail.refreshModelCache": "Refresh Route Cache",
  "detail.loading": "Loading...",
  "detail.noModels": "No models available",
  "detail.loadFailed": "Load failed",
  "detail.machineIdError": "Invalid machine ID format",
  "detail.saved": "Saved",
  "detail.saveFailed": "Save failed",
  "detail.generateFailed": "Generate failed",
  "detail.weight": "Request Weight",
  "detail.weightHint": "0-1 = normal, 2+ = higher priority",
  "detail.priority": "Priority Tier",
  "detail.priorityHint": "Higher = served first; the next tier down is used only after every account above is unavailable (0 = lowest)",
  "detail.overage": "Overages (Upstream)",
  "detail.overageHint": "Toggling calls AWS Q setUserPreference and flips Overages in your Kiro account immediately",
  "detail.overageStatus": "Current status",
  "detail.overageEnabled": "Enabled (continues billing at overage rate when quota is exhausted)",
  "detail.overageDisabled": "Disabled (stops once quota is exhausted)",
  "detail.overageUnknown": "Unknown (please refresh)",
  "detail.overageRefresh": "Pull from AWS",
  "detail.overageCap": "Overage cap",
  "detail.overageRate": "Overage rate",
  "detail.overageCurrent": "Current overages",
  "detail.overageCheckedAt": "Last synced",
  "detail.overageNotCapable": "This subscription does not support Overages",
  "detail.overageSwitching": "Calling AWS...",
  "detail.proxyURL": "Account Proxy",
  "detail.proxyHint": "Leave empty to use global proxy. Format: socks5://host:port or http://host:port",
  "detail.proxySaved": "Proxy saved",
  "detail.save": "Save",
  "modal.addAccount": "Add Account",
  "modal.apikeyTitle": "API Key",
  "modal.apikeyDesc": "Add account via Kiro API key (ksk_...) for headless integration",
  "modal.portalTitle": "Browser SSO (Automatic)",
  "modal.portalDesc": "Sign in through the Kiro hosted portal (Google / GitHub, or Microsoft 365 / Entra ID). No manual tokens — paste back the redirect URL. Works on remote/headless deployments.",
  "portal.intro": "Sign in through the Kiro hosted portal in your own browser, then paste the redirect URL(s) back here. Because a remote deployment cannot capture the localhost:3128 redirect, you copy each redirect URL from your browser's address bar and paste it below.",
  "portal.signinUrl": "Sign-in URL",
  "portal.step2Instr": "1. Open the sign-in URL in a GUEST / INCOGNITO window. 2. Sign in (Google/GitHub, or your Microsoft 365 work account). 3. The browser will try to open a localhost:3128 URL that fails to load — copy that URL from the address bar and paste it below.",
  "portal.pasteRedirect": "Paste the redirect URL",
  "portal.pasteRedirectHint": "The full localhost:3128 URL your browser landed on (dead page is expected).",
  "portal.step3Instr": "Enterprise IdP detected. 1. Open the login URL below and sign in with your organization account. 2. Copy the localhost:3128/oauth/callback URL the browser lands on and paste it below.",
  "portal.pasteIdpCallback": "Paste the IdP callback URL",
  "portal.success": "Browser SSO account added",
  "modal.externalIdpTitle": "Enterprise SSO (External IdP)",
  "modal.externalIdpDesc": "Sign in automatically through your browser (Microsoft 365 / Entra ID / Azure AD, or Google / GitHub). No manual tokens — just paste back the redirect URL. Works on remote/headless deployments.",
  "externalIdp.manualDesc": "Manually add an enterprise account via Microsoft 365 / Entra ID / Azure AD. Tokens refresh automatically against the IdP token endpoint.",
  "portal.manualEntry": "Advanced: enter tokens manually instead",
  "modal.builderIdTitle": "AWS Builder ID",
  "modal.builderIdDesc": "Add personal account via AWS Builder ID authorization",
  "modal.iamTitle": "IAM Identity Center (Enterprise SSO)",
  "modal.iamDesc": "Add enterprise account via IAM Identity Center SSO",
  "modal.ssoTitle": "SSO Token",
  "modal.ssoDesc": "Add account via browser x-amz-sso_authn token",
  "modal.localTitle": "Kiro Local Cache",
  "modal.localDesc": "Add account via Kiro IDE local cache files",
  "modal.credentialsTitle": "Credentials JSON",
  "modal.credentialsDesc": "Add account via Kiro Account Manager exported credentials",
  "modal.cookieTitle": "Kiro Web Cookie",
  "modal.cookieDesc": "Add account via RefreshToken obtained from Kiro Web Cookie",
  "cookie.howToGet": "How to get the RefreshToken?",
  "cookie.step1": "Open your browser and sign in at",
  "cookie.step2": "Right-click on blank area → Inspect → Application → Cookies → https://app.kiro.dev",
  "cookie.step3": "Find RefreshToken in the list, double-click its Value and copy it",
  "cookie.refreshToken": "RefreshToken",
  "cookie.provider": "Login Provider",
  "cookie.github": "GitHub",
  "cookie.google": "Google",
  "cookie.refreshTokenPlaceholder": "Paste the RefreshToken cookie value here",
  "cookie.refreshTokenMissing": "RefreshToken is required",
  "cookie.importSuccess": "Account added successfully",
  "cookie.link": "https://app.kiro.dev/account/usage",
  "apikey.keyLabel": "API Key",
  "apikey.keyPlaceholder": "ksk_...",
  "apikey.keyRequired": "API key is required",
  "apikey.nicknameLabel": "Nickname (optional)",
  "apikey.nicknamePlaceholder": "e.g., My API Key",
  "apikey.regionLabel": "Region (optional)",
  "apikey.regionPlaceholder": "e.g., us-east-1",
  "apikey.success": "API key account added successfully",
  "externalIdp.refreshTokenLabel": "Refresh Token",
  "externalIdp.refreshTokenPlaceholder": "Paste the IdP refresh token",
  "externalIdp.refreshTokenRequired": "Refresh token is required",
  "externalIdp.accessTokenLabel": "Access Token",
  "externalIdp.accessTokenPlaceholder": "Optional; a new one will be fetched on first refresh if empty",
  "externalIdp.clientIdLabel": "Client ID (Application ID)",
  "externalIdp.clientIdPlaceholder": "00000003-0000-0000-c000-0ee0edd11c11 (or your app's client ID)",
  "externalIdp.clientIdRequired": "Client ID is required",
  "externalIdp.tokenEndpointLabel": "Token Endpoint",
  "externalIdp.tokenEndpointPlaceholder": "https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token",
  "externalIdp.tokenEndpointHint": "Must be an https URL on a supported enterprise IdP host (microsoftonline.com / .us / .cn)",
  "externalIdp.tokenEndpointRequired": "Token endpoint is required",
  "externalIdp.issuerLabel": "OIDC Issuer URL",
  "externalIdp.issuerPlaceholder": "https://login.microsoftonline.com/<tenant>/v2.0",
  "externalIdp.scopesLabel": "Scopes",
  "externalIdp.scopesPlaceholder": "e.g. api://<app-id>/codewhisperer:conversations offline_access",
  "externalIdp.scopesHint": "Must include offline_access so the IdP issues a refresh token",
  "externalIdp.optional": "(optional)",
  "builderid.startLogin": "Start Login",
  "builderid.verifyCode": "Enter the code above in your browser",
  "builderid.verifyUrl": "Verification URL",
  "builderid.open": "Open",
  "builderid.waiting": "Waiting for authorization...",
  "builderid.success": "Login successful",
  "iam.startUrl": "Start URL",
  "iam.loginUrl": "Login URL",
  "iam.completeLogin": "Complete login in browser, then paste callback URL",
  "iam.callbackUrl": "Callback URL",
  "iam.complete": "Complete Login",
  "sso.howToGet": "How to get Token?",
  "sso.step1": "Visit and login to",
  "sso.step2": "Press F12 to open DevTools → Application → Cookies",
  "sso.step3": "Find and copy",
  "sso.tokenLabel": "x-amz-sso_authn",
  "sso.tokenHint": "*Supports batch import, one token per line",
  "sso.tokenPlaceholder": "Paste x-amz-sso_authn value",
  "sso.importSuccess": "Successfully added {0} accounts",
  "sso.importPartial": ", {0} failed",
  "local.fileLocation": "File Location",
  "local.windows": "Windows",
  "local.macosLinux": "macOS/Linux",
  "local.loginChannel": "Login Channel",
  "local.providerBuilderId": "AWS Builder ID",
  "local.providerEnterprise": "IAM Identity Center (Enterprise SSO)",
  "local.providerGoogle": "Google",
  "local.providerGithub": "GitHub",
  "local.tokenFile": "kiro-auth-token.json",
  "local.tokenRequired": "*Required",
  "local.clientFile": "{hash}.json",
  "local.clientRequired": "*Required for IdC login",
  "local.pasteOrUpload": "Paste content or upload file",
  "local.upload": "Upload",
  "local.tokenMissing": "Please provide kiro-auth-token.json content",
  "local.tokenInvalid": "Invalid kiro-auth-token.json format",
  "local.refreshTokenMissing": "Missing refreshToken",
  "local.clientMissing": "IdC login requires {hash}.json content",
  "local.clientInvalid": "Invalid {hash}.json format",
  "local.clientSecretMissing": "Missing clientId or clientSecret",
  "local.importSuccess": "Import successful",
  "credentials.label": "Credentials JSON",
  "credentials.jsonError": "Invalid JSON format",
  "credentials.lineParseSkipped": ", skipped {0} malformed line(s)",
  "credentials.lineParseAllSkipped": "{0} line(s) were malformed; no accounts could be parsed (each line needs 5 fields: email----password----refreshToken----clientId----clientSecret)",
  "credentials.batchHint": "Supports JSON (single object, array, or Kiro Account Manager export), or line format: email----password----refreshToken----clientId----clientSecret, one account per line, delimiter auto-detected (----, Tab, space). Required: refreshToken. Optional: provider (BuilderID/Enterprise/GitHub/Google), clientId, clientSecret",
  "externalIdp.success": "External IdP account added successfully",
  "auth.apikey": "API Key",
  "auth.externalIdp": "Enterprise SSO",
  "auth.idc": "AWS IdC",
  "auth.social": "Social",
  "common.save": "Save Settings",
  "common.saved": "Saved",
  "common.copy": "Copy",
  "common.copied": "Copied",
  "common.cancel": "Cancel",
  "common.confirm": "Confirm",
  "common.back": "Back",
  "common.add": "Add",
  "common.continue": "Continue",
  "common.failed": "Failed",
  "common.saveFailed": "Save failed",
  "common.logout": "Logout",
  "models.refreshAll": "Refresh Models",
  "models.confirmRefreshAll": "Refresh models for all enabled accounts?",
  "models.refreshAllDone": "Models refreshed, {0} models available",
  "export.title": "Export Accounts",
  "export.selectAll": "Select All",
  "export.deselectAll": "Deselect All",
  "export.selected": "{0} selected",
  "export.downloadJson": "Download JSON",
  "export.showJson": "Show JSON",
  "export.copyJson": "Copy JSON",
  "export.copied": "Copied to clipboard",
  "export.noSelection": "Please select at least one account",
  "privacy.label": "Privacy Mode",
  "privacy.tooltip": "Mask email addresses when enabled",
  "batch.enable": "Batch Enable",
  "batch.disable": "Batch Disable",
  "batch.refresh": "Batch Refresh",
  "batch.refreshModels": "Refresh Models",
  "batch.delete": "Batch Delete",
  "batch.selected": "{0} selected",
  "batch.selectAll": "Select All",
  "batch.processing": "Processing selected accounts...",
  "batch.enableResult": "Enabled {0} accounts",
  "batch.disableResult": "Disabled {0} accounts",
  "batch.confirmEnable": "Enable {0} accounts?",
  "batch.confirmDisable": "Disable {0} accounts?",
  "batch.confirmRefresh": "Refresh {0} accounts?",
  "batch.refreshResult": "Refresh done: {0} success, {1} failed",
  "batch.confirmRefreshModels": "Refresh models for {0} selected accounts?",
  "batch.refreshModelsResult": "Refresh models done: {0} success, {1} failed",
  "batch.confirmDelete": "Delete {0} selected accounts? This cannot be undone.",
  "batch.deleteResult": "Delete done: {0} success, {1} failed",
  "batch.deleting": "Deleting selected accounts...",
  "batch.done": "Done",
  "filter.search": "Search email/nickname...",
  "filter.status": "Account status",
  "filter.all": "All",
  "filter.enabled": "Enabled",
  "filter.disabled": "Disabled",
  "filter.banned": "Banned",
  "filter.dead": "Dead",
  "promptFilter.noRules": "No custom rules yet",
  "promptFilter.unnamed": "Unnamed",
  "promptFilter.typeRegex": "Regex Replace",
  "promptFilter.typeContains": "Line Filter",
  "promptFilter.match": "Match",
  "promptFilter.replace": "Replace",
  "promptFilter.matchPlaceholderRegex": "e.g. \\bsecret\\b",
  "promptFilter.matchPlaceholderContains": "Text contained in lines to remove",
  "promptFilter.emptyRemove": "Leave empty to remove matches",
  "promptFilter.addRegex": "+ Regex Replace Rule",
  "promptFilter.addContains": "+ Line Filter Rule",
  "theme.toggle": "Toggle theme",
  "lang.label": "Language",
  "app.title": "Kiro-Go",
  "common.close": "Close",
  "common.remove": "Remove",
  "common.unknownError": "Unknown error",
  "login.showPassword": "Show password",
  "login.hidePassword": "Hide password",
  "api.copyClaude": "Copy Claude API endpoint",
  "api.copyOpenAI": "Copy OpenAI API endpoint",
  "api.copyOpenAIResponses": "Copy OpenAI Responses API endpoint",
  "api.copyModels": "Copy model list endpoint",
  "api.copyStats": "Copy statistics endpoint",
  "aria.sections": "Sections",
  "aria.footer": "Footer",
  "aria.currentVersion": "Current version",
  "aria.resources": "Resources",
  "accounts.weightShort": "W",
  "detail.creditMultiplier": "{0}x credit",
  "detail.proxyFormatError": "Format: socks5://host:port or http://host:port",
  "theme.system": "system",
  "theme.light": "light",
  "theme.dark": "dark",
  "theme.status": "Theme: {0}",
  "lang.zh": "中文",
  "lang.en": "EN",
  "api.claude": "Claude API",
  "api.openai": "OpenAI API",
  "api.openaiResponses": "OpenAI Responses API",
  "api.protocolHttp": "HTTP",
  "api.methodPost": "POST",
  "api.methodGet": "GET",
  "settings.thinkingFormatHint": "Native thinking is the only mode. The upstream emits genuine reasoning content blocks; on the wire it surfaces as the structured `reasoning_content` / `thinking` field — no inlined tag wrapping.",
  "settings.proxySocks5": "SOCKS5",
  "settings.proxyHttp": "HTTP",
  "footer.github": "GitHub",
  "subscription.power": "Power",
  "subscription.proPlus": "Pro+",
  "subscription.pro": "Pro",
  "subscription.free": "Free",
  "apiKeys.listTitle": "API Keys",
  "apiKeys.refresh": "Refresh",
  "apiKeys.exportBalances": "Export CSV",
  "apiKeys.batchImport": "Import Keys",
  "apiKeys.batchGenerate": "Batch Generate",
  "apiKeys.create": "Create Key",
  "apiKeys.totalKeys": "Keys",
  "apiKeys.totalBalance": "Total balance",
  "apiKeys.totalSpent": "Total spent",
  "apiKeys.overdraft": "Overdraft bound",
  "apiKeys.overdraftHint": "How far a balance may legitimately go negative",
  "apiKeys.filterSearch": "Search",
  "apiKeys.filterSearchPlaceholder": "Name, prefix or note...",
  "apiKeys.filterStatus": "Status",
  "apiKeys.statusAll": "All",
  "apiKeys.statusEnabled": "Enabled",
  "apiKeys.statusDisabled": "Disabled",
  "apiKeys.statusExpired": "Expired",
  "apiKeys.statusUnused": "Unused",
  "apiKeys.filterExpiring": "Expiring within (days)",
  "apiKeys.filterExpiringPlaceholder": "e.g. 7",
  "apiKeys.filterBelow": "Balance below",
  "apiKeys.filterBelowPlaceholder": "e.g. 10",
  "apiKeys.filterBatch": "Batch",
  "apiKeys.batchAll": "All batches",
  "apiKeys.batchOption": "{0} ({1} keys)",
  "apiKeys.batchSelected": "{0} selected",
  "apiKeys.batchEnable": "Enable",
  "apiKeys.batchDisable": "Disable",
  "apiKeys.batchExtend": "Extend expiry",
  "apiKeys.batchSetExpiry": "Set expiry",
  "apiKeys.batchGrant": "Top up",
  "apiKeys.batchSetBalance": "Set balance",
  "apiKeys.batchDelete": "Delete",
  "apiKeys.colName": "Name",
  "apiKeys.colKey": "Key",
  "apiKeys.colStatus": "Status",
  "apiKeys.colBalance": "Balance",
  "apiKeys.colSpent": "Spent",
  "apiKeys.colRequests": "Requests",
  "apiKeys.colTimeLeft": "Time left",
  "apiKeys.colInFlight": "In flight",
  "apiKeys.colBatch": "Batch",
  "apiKeys.colActions": "Actions",
  "apiKeys.selectKey": "Select key {0}",
  "apiKeys.unnamed": "(unnamed)",
  "apiKeys.unlimited": "Unlimited",
  "apiKeys.never": "Never",
  "apiKeys.neverExpires": "Never expires",
  "apiKeys.badgeEnabled": "Enabled",
  "apiKeys.badgeDisabled": "Disabled",
  "apiKeys.badgeExpired": "Expired",
  "apiKeys.badgeUnused": "Unused",
  "apiKeys.empty": "No API keys yet. Create one or generate a batch.",
  "apiKeys.loadFailed": "Failed to load API keys",
  "apiKeys.actionDetail": "Details",
  "apiKeys.actionEdit": "Edit",
  "apiKeys.actionRotate": "Rotate secret",
  "apiKeys.actionTopUp": "Top up",
  "apiKeys.actionDelete": "Delete",
  "apiKeys.createTitle": "Create API Key",
  "apiKeys.createSubmit": "Create",
  "apiKeys.editTitle": "Edit API Key",
  "apiKeys.editExpiryHint": "Clear the date to remove the expiry.",
  "apiKeys.editValidForPlaceholder": "Or a lifetime from now",
  "apiKeys.fieldName": "Name",
  "apiKeys.fieldNamePlaceholder": "Buyer or reference",
  "apiKeys.fieldCredits": "Credits",
  "apiKeys.fieldCreditsHint": "Starting balance loaded onto the key.",
  "apiKeys.fieldUnlimited": "Unlimited credits",
  "apiKeys.fieldValidFor": "Valid for",
  "apiKeys.fieldValidForHint": "Expiry relative to now, in the unit you pick. Ignored when an absolute date is set.",
  "apiKeys.fieldValidForUnit": "Unit",
  "apiKeys.unitMinutes": "Minutes",
  "apiKeys.unitHours": "Hours",
  "apiKeys.unitDays": "Days",
  "apiKeys.fieldExpiresAt": "Expiry date",
  "apiKeys.fieldExpiresAtHint": "Absolute expiry. Leave empty for never.",
  "apiKeys.fieldEnabled": "Enabled",
  "apiKeys.fieldNote": "Note",
  "apiKeys.fieldNotePlaceholder": "Recorded in the credit ledger",
  "apiKeys.fieldBatchId": "Batch",
  "apiKeys.fieldBatchIdPlaceholder": "Batch id (optional)",
  "apiKeys.generateTitle": "Batch Generate Keys",
  "apiKeys.fieldCount": "Count",
  "apiKeys.fieldCountHint": "Up to 1000 keys in one batch.",
  "apiKeys.fieldNamePrefix": "Name prefix",
  "apiKeys.fieldNamePrefixPlaceholder": "e.g. sale-2026-03",
  "apiKeys.generateSubmit": "Generate",
  "apiKeys.generateCsvSubmit": "Generate + CSV",
  "apiKeys.generateDone": "Generated {0} keys",
  "apiKeys.importTitle": "Import Existing Keys",
  "apiKeys.fieldRawKeys": "Key values",
  "apiKeys.fieldRawKeysPlaceholder": "sk-aaaa\nsk-bbbb",
  "apiKeys.fieldRawKeysHint": "One key per line. Values are hashed on import and cannot be read back.",
  "apiKeys.importSubmit": "Import",
  "apiKeys.importDone": "Imported {0} keys",
  "apiKeys.importRequired": "Paste at least one key value",
  "apiKeys.secretTitle": "New Key Secrets",
  "apiKeys.secretWarning": "Copy these values now. Only a SHA-256 hash is stored, so they can never be shown again.",
  "apiKeys.secretCount": "{0} key(s) issued",
  "apiKeys.copyAll": "Copy all",
  "apiKeys.downloadCsv": "Download CSV",
  "apiKeys.secretDone": "I saved them",
  "apiKeys.copySuccess": "Copied to clipboard",
  "apiKeys.detailTitle": "API Key Detail",
  "apiKeys.detailSummary": "Summary",
  "apiKeys.detailHistory": "Ledger history",
  "apiKeys.detailDaily": "Daily usage",
  "apiKeys.detailEmptyHistory": "No ledger entries yet",
  "apiKeys.detailEmptyDaily": "No usage recorded yet",
  "apiKeys.detailId": "Key id",
  "apiKeys.detailCreatedAt": "Created",
  "apiKeys.detailLastUsedAt": "Last used",
  "apiKeys.detailExpiresAt": "Expires",
  "apiKeys.detailTokens": "Tokens used",
  "apiKeys.detailNote": "Note",
  "apiKeys.colTs": "Time",
  "apiKeys.colKind": "Kind",
  "apiKeys.colDelta": "Delta",
  "apiKeys.colBalanceAfter": "Balance",
  "apiKeys.colModel": "Model",
  "apiKeys.colTokens": "Tokens",
  "apiKeys.colNote": "Note",
  "apiKeys.colDay": "Day",
  "apiKeys.colCredits": "Credits",
  "apiKeys.kindGrant": "Grant",
  "apiKeys.kindCharge": "Charge",
  "apiKeys.kindRefund": "Refund",
  "apiKeys.kindAdjust": "Adjust",
  "apiKeys.kindExpire": "Expire",
  "apiKeys.topUpTitle": "Top up credits",
  "apiKeys.topUpMessage": "Add credits to \"{0}\".",
  "apiKeys.topUpAmount": "Credits to add",
  "apiKeys.setBalanceTitle": "Set balance",
  "apiKeys.setBalanceMessage": "Overwrite the balance of \"{0}\". The difference is written to the ledger.",
  "apiKeys.setBalanceAmount": "New balance",
  "apiKeys.extendTitle": "Extend expiry",
  "apiKeys.extendMessage": "Shift the expiry of {0} key(s) by a lifetime you pick.",
  "apiKeys.extendBy": "Extend by",
  "apiKeys.setExpiryTitle": "Set expiry",
  "apiKeys.setExpiryMessage": "Set an absolute expiry for {0} key(s). Leave the date empty to use a lifetime from now.",
  "apiKeys.setExpiryDate": "Expiry date",
  "apiKeys.setExpiryIn": "Or a lifetime from now",
  "apiKeys.batchGrantMessage": "Add credits to {0} key(s).",
  "apiKeys.batchSetBalanceMessage": "Set the balance of {0} key(s). The difference is written to the ledger.",
  "apiKeys.ledgerNotePlaceholder": "Why (recorded in the ledger)",
  "apiKeys.amountRequired": "Enter a positive amount",
  "apiKeys.amountInvalid": "Enter a valid amount",
  "apiKeys.durationRequired": "Enter an amount of time",
  "apiKeys.expiryRequired": "Pick a date or enter a lifetime",
  "apiKeys.confirmDelete": "Delete key \"{0}\"? Its ledger history goes with it.",
  "apiKeys.confirmBatchDelete": "Delete {0} selected key(s)? This cannot be undone.",
  "apiKeys.confirmRotate": "Rotate the secret for \"{0}\"? The current value stops working immediately.",
  "apiKeys.confirmSetBalance": "Set the balance of \"{0}\" to {1} credits?",
  "apiKeys.confirmBatchSetBalance": "Set the balance of {0} key(s) to {1} credits?",
  "apiKeys.created": "Key created",
  "apiKeys.updated": "Key updated",
  "apiKeys.deleted": "Key deleted",
  "apiKeys.rotated": "Secret rotated",
  "apiKeys.toppedUp": "Credits added",
  "apiKeys.balanceSet": "Balance updated",
  "apiKeys.batchDone": "{0} succeeded, {1} failed",
  "apiKeys.batchFailedDetail": "Failed: {0}",
  "apiKeys.noSelection": "Select at least one key",
  "apiKeys.exported": "CSV downloaded",
  "apiKeys.limitsTitle": "Credit Limits",
  "apiKeys.limitsHint": "Admission bounds applied to every keyed request.",
  "apiKeys.maxInFlight": "Max in-flight per key",
  "apiKeys.maxInFlightHint": "Concurrent requests allowed for one key. 0 means unlimited.",
  "apiKeys.maxSingleRequest": "Max credits per request",
  "apiKeys.maxSingleRequestHint": "A single request estimated above this is rejected. 0 means unlimited.",
  "apiKeys.mcpToolCallCredits": "MCP tool call credits",
  "apiKeys.mcpToolCallCreditsHint": "Credits charged for one MCP tool call.",
  "apiKeys.saveLimits": "Save Limits",
  "apiKeys.limitsSaved": "Limits saved",
  "apiKeys.restartRequired": "Admission bounds are read when the credits store opens: restart the service before the new in-flight / per-request caps take effect.",
  "requests.title": "Request Log",
  "requests.refresh": "Refresh",
  "requests.cleanup": "Clean logs",
  "requests.cleanupConfirm": "Delete all request logs and shrink the database file? This cannot be undone.",
  "requests.cleanupDone": "Deleted {0} log entries",
  "requests.filterRange": "Range",
  "requests.filterEndpoint": "Endpoint",
  "requests.filterStatus": "Status",
  "requests.range1d": "Last 24h",
  "requests.range7d": "Last 7 days",
  "requests.range30d": "Last 30 days",
  "requests.rangeAll": "All time",
  "requests.epAll": "All endpoints",
  "requests.epClaude": "Claude",
  "requests.epOpenAIChat": "OpenAI Chat",
  "requests.epOpenAIResponses": "OpenAI Responses",
  "requests.statusAll": "All",
  "requests.statusSuccess": "Success",
  "requests.statusFailure": "Failure",
  "requests.sumTotal": "Total requests",
  "requests.sumCredits": "Credits",
  "requests.sumTokens": "Tokens",
  "requests.sumInput": "Input",
  "requests.sumOutput": "Output",
  "requests.sumCache": "Cache R/W",
  "requests.sumOkErr": "{0} ok / {1} err",
  "requests.colTime": "Time",
  "requests.colEndpoint": "Endpoint",
  "requests.colModel": "Model",
  "requests.colApiKey": "API Key",
  "requests.colAccount": "Account",
  "requests.colStatus": "Status",
  "requests.colTokens": "Tokens",
  "requests.colInput": "In",
  "requests.colOutput": "Out",
  "requests.colCacheRead": "Cache R",
  "requests.colCacheWrite": "Cache W",
  "requests.colCredits": "Credits",
  "requests.colError": "Error",
  "requests.keyNone": "—",
  "requests.empty": "No requests in this range",
  "requests.unavailable": "Request log is not available",
  "requests.loadError": "Failed to load request log",
  "requests.prev": "Prev",
  "requests.next": "Next",
  "requests.pageInfo": "{0}-{1} of {2}",
  "apiKeys.fieldMaxInFlight": "Max in-flight",
  "apiKeys.fieldRpmLimit": "Requests/minute",
  "apiKeys.fieldTpmLimit": "Tokens/minute",
  "apiKeys.limitHint": "0 = use global default",
  "apiKeys.effectiveLimits": "Effective limits",
  "apiKeys.pausedSeconds": "Paused (compensated)",
  "apiKeys.rateUsage": "Current minute",
  "apiKeys.rateUsageRequests": "Requests",
  "apiKeys.rateUsageTokens": "Tokens",
  "apiKeys.globalRpmLimit": "Default requests/minute",
  "apiKeys.globalRpmLimitHint": "Applied to keys with no override. 0 = unlimited.",
  "apiKeys.globalTpmLimit": "Default tokens/minute",
  "apiKeys.globalTpmLimitHint": "Applied to keys with no override. 0 = unlimited.",
  "apiKeys.outagePaused": "Key validity is paused for every key: no upstream account can serve requests right now. Paused for {0} so far, and that time is credited back to each key once an account answers.",
  "apiKeys.batchSetLimits": "Set limits",
  "apiKeys.batchSetLimitsMessage": "Apply throughput caps to {0} selected key(s).",
  "apiKeys.limitPromptHint": "Leave blank to keep, 0 for the global default",
  "apiKeys.limitRequired": "Set at least one limit",
  "accounts.overageRatePerCredit": "${0}/credit",
  "accounts.overageMarker": "Included quota ends here; spend past this line is billed as overage",
  "apiKeys.rpmShort": "rpm",
  "apiKeys.tpmShort": "tpm"
}
