import type { TranslationKey } from "./zh"; export const enTranslations: Record = { // App / global appTitle: "Kimi Switch", loading: "Loading...", loadTimeout: "Loading is taking a while. Try restarting the app if it stays stuck.", loadFailed: "Failed to load:", retry: "Retry", saveConfig: "Save Config", reloadConfig: "Reload Config", openConfigDir: "Open Config Dir", unsavedConfirm: "You have unsaved changes. Are you sure you want to reload?", validationNoApiKey: "Missing API key", validationNoBaseUrl: "Missing base URL", validationNoModels: "No models configured", validationBlankModels: "Model entries with empty model id: {aliases}", saveValidationConfirm: "The following providers are not fully configured. Save anyway?\n\n{details}\n\n(Click OK to save to config.toml as-is; click Cancel to keep editing.)", providerNotFound: "Provider not found", backToList: "Back to list", syncToOmp: "Sync to OMP", syncedToOmp: "Synced to OMP: ", ompOverwriteConfirm: "OMP already has provider \"{existing}\". Replace with \"{name}\"?", deleteProviderConfirm: "Delete provider {name}?", // Provider list providers: "Providers", dashboard: "Dashboard", sessions: "Sessions", addProvider: "Add Provider", noProviders: "No providers yet", addFirstProvider: "Add first provider", noUrl: "No URL", modelCount: "{count} models", ompActive: "OMP Active", defaultModel: "Default: {name}", edit: "Edit", delete: "Delete", copyProvider: "Duplicate provider", testConnectivity: "Test connectivity", testing: "Testing...", connectivityOk: "{name} reachable ({latency}ms)", connectivitySlow: "{name} reachable but slow ({latency}ms)", connectivityFail: "{name} unreachable: {error}", copiedProvider: "Duplicated as {name}", // Provider edit editProvider: "Edit Provider", back: "Back", basicInfo: "Basic Info", modelMapping: "Model Mapping", configJson: "Config JSON", providerName: "Provider Name", note: "Note", notePlaceholder: "e.g. company account", officialUrl: "Official URL", managedProvider: "Managed provider (no credentials needed)", kimiOAuthLogin: "Sign in with Kimi", kimiOAuthOpenPage: "Open authorization page", kimiOAuthCopyCode: "Copy code", kimiOAuthCodeCopied: "Copied", kimiOAuthWaiting: "Enter the code on the page that opens, waiting for authorization…", kimiOAuthSuccess: "Authorized — credentials written for Kimi login", kimiOAuthExpired: "Code expired, please start over", kimiOAuthDenied: "Authorization denied", kimiOAuthTimeout: "Authorization timed out, please start over", kimiOAuthRetry: "Restart", kimiOAuthCancel: "Cancel", kimiOAuthNetworkError: "Network error, retrying…", kimiOAuthRegionLabel: "Sign-in region", kimiOAuthRegionCn: "Mainland China (auth.kimi.com)", kimiOAuthRegionGlobal: "International (auth.kimi.ai)", kimiOAuthStart: "Start sign-in", apiSettings: "API Settings", apiFormat: "API Format", apiFormatUnknown: "Unknown format ({type}, kept verbatim)", authField: "Auth Field", apiKey: "API Key", getApiKeyLink: "Get API Key", show: "Show", hide: "Hide", requestUrl: "Request URL", fullUrl: "Full URL", baseUrlHint: "Enter a {type} API-compatible endpoint without a trailing slash.", envPairs: "Env pairs", addEnv: "+ Add", modelMappingDesc: "Display name only affects the /model menu; 1M declares context capability for Kimi Code.", oneClickSetup: "One-click setup", fetchModels: "Fetch models", fetchingModels: "Fetching...", discoveredModels: "Discovered {count} models", addSelected: "Add selected", alreadyAdded: "Added", displayName: "Display name", actualModel: "Actual model", contextSize: "Context size", supports1M: "Supports 1M", default: "Default", operation: "Operation", isDefault: "Default", setDefault: "Set default", deleteModelConfirm: "Delete model {alias}?", noModelMappings: "No model mappings", addModelMapping: "+ Add model mapping", readOnlyPreview: "Editable JSON", apply: "Apply", invalidJson: "Invalid JSON: {message}", clickToSelectIcon: "Click to select icon", clickToChangeIcon: "Click to change icon", selectIcon: "Select icon", clearIcon: "Clear icon", iconPickerSearch: "Search icons", iconPickerSearchPlaceholder: "Type an icon name...", iconPickerNoResults: "No matching icons found", // Agent / target target: "Target", targetKimi: "Kimi Code", targetOmp: "OMP", targetQwen: "Qwen Code", agent: "Agent", agentKimiCode: "Kimi Code", agentPi: "Pi", activate: "Activate", activated: "Activated", disabled: "Disabled", switchTo: "Switch to", inUse: "In use", switchReloadHint: "After switching providers, run /reload in Kimi Code to apply the change.", reloadCopiedHint: "Provider switched. /reload copied to clipboard; paste it in Kimi Code.", unsavedChanges: "Unsaved changes", qwenActivateNotImplemented: "Qwen Code activation will be implemented in a follow-up.", agentSettings: "Global Settings", enableThinking: "Enable thinking", thinkingLevel: "Thinking level", thinkingKeep: "Keep thinking content", thinkingLow: "Low", thinkingMedium: "Medium", thinkingHigh: "High", thinkingContextHint: "Thinking uses more context. Ensure the model context length and reserved size are sufficient.", loopControlSettings: "Loop Control", maxAttemptsPerStep: "Max attempts per step", reservedContextSize: "Reserved context size", backgroundSettings: "Background Tasks", maxRunningTasks: "Max running tasks", keepAliveOnExit: "Keep alive on exit", permissionRules: "Permission Rules", permissionDecision: "Decision", permissionPattern: "Pattern", permissionAllow: "Allow", permissionDeny: "Deny", permissionAsk: "Ask", permissionDangerousGuard: "Dangerous Command Guard", permissionDangerousGuardDesc: "When on (default): Manual/YOLO modes force a prompt for dangerous commands (rm -rf, shutdown, dd of=, ...) and commands that cannot be statically analyzed; Auto (never-ask) mode no longer intercepts them since kimi-code 0.41.0. Turning it off restores the previous behavior. Env KIMI_CODE_DANGEROUS_COMMAND_GUARD overrides this config", addRule: "+ Add rule", addCommonRules: "Add common rules", hooks: "Lifecycle Hooks", hookEvent: "Event", hookMatcher: "Matcher", hookCommand: "Command", hookTimeout: "Timeout", addHook: "+ Add hook", importConfig: "Import current config", importConfigConfirm: "Importing will overwrite unsaved changes. Continue?", importConfigFailed: "Import failed: {message}", capabilities: "Capabilities", fetchEnableThinking: "Enable thinking for fetched models", capThinking: "Thinking", capAlwaysThinking: "Always Thinking", capImageIn: "Image Input", capImageInHint: "Text models actually need the plugin-kimi-eyes:kimi-eyes plugin for image recognition", capVideoIn: "Video Input", capToolUse: "Tool Use", customCapabilities: "Other capabilities (comma-separated)", // Sessions sessionsTitle: "Sessions", sessionsSubtitle: "Browse, preview, archive, or delete Kimi Code sessions by workspace. Archiving keeps data on disk.", workspaces: "Workspaces", workspaceIsolatedHint: "Sessions are isolated per workspace", allWorkspaces: "All workspaces", emptyWorkspace: "Empty", deleteWorkspace: "Delete workspace", noSessions: "No sessions", statusActive: "Active", statusArchived: "Archived", statusAll: "All", selectAll: "Select all", deselectAll: "Deselect all", selectedCount: "{n} selected", archive: "Archive", unarchive: "Unarchive", sessionTitle: "Session", workspace: "Workspace", status: "Status", size: "Size", updated: "Updated", actions: "Actions", sessionsInView: "{n} sessions", isolatedToWorkspace: "this workspace only", openPreview: "Open preview", scanning: "Scanning…", refresh: "Refresh", refreshing: "Refreshing…", loadStats: "Loaded in {ms} ms · {kb} KB payload", refreshed: "Refreshed", cancel: "Cancel", confirmDeleteTitle: "Delete session forever?", confirmDeleteSession: "This cannot be undone. Prefer archive if you only want it out of the way.", confirmBulkTitle: "Delete selected forever?", confirmBulkDelete: "Permanently delete {n} sessions. This cannot be undone.", confirmDeleteWorkspaceTitle: "Delete empty workspace?", confirmDeleteWorkspace: "Only workspaces with no sessions can be removed.", deleteForever: "Delete forever", previewTitle: "Session preview", previewHint: "Roles and truncated text only — secrets and raw tool dumps are omitted.", previewEmpty: "No previewable messages", previewTruncated: "Preview truncated", roleUser: "User", roleAssistant: "Assistant", roleSystem: "System", // Heatmap noData: "No data", heatLess: "Less", heatMore: "More", requests: "Requests", cacheHitRate: "Cache hit rate", // Daily detail modal dayDetail: "Daily usage detail", dayDetailNoData: "No usage data for {date}", close: "Close", totalTokens: "Total tokens", cost: "Cost", modelDistribution: "Model distribution", providerDistribution: "Provider distribution", modalEscHint: "Press Esc or click outside to close", doubleClickHint: "Double-click for details", // Languages language: "Language", zh: "中文", en: "English", // Theme & Settings themeLight: "Light", themeDark: "Dark", themeAuto: "Auto", settings: "Settings", settingsTitle: "Settings", settingsAppearance: "Appearance", settingsUpdates: "Updates", settingsAbout: "About", checkUpdate: "Check for updates", checking: "Checking…", upToDate: "You're up to date", updateAvailable: "Update available", currentVersion: "Current version", latestVersion: "Latest version", downloadUpdate: "Download update", downloading: "Downloading…", downloadComplete: "Download complete, click to install", install: "Install", updateCheckFailed: "Update check failed", lastChecked: "Last checked", appDescription: "Windows desktop LLM provider config manager", settingsWebsite: "Official website", kimiEyesSite: "Kimi Eyes plugin site", referenceProject: "Reference project", // Validation errors emptyProviderName: "Provider name is empty", duplicateProviderName: "Duplicate provider name: {0}", missingCredentials: "Provider '{0}' is missing credentials (api_key or env key)", ambiguousCredentials: "Provider '{0}' has both direct and env credentials; only one source is allowed", missingVertexProject: "Vertex provider '{0}' is missing GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_LOCATION", emptyModelAlias: "Model alias is empty", duplicateModelAlias: "Duplicate model alias: {0}", unknownModelProvider: "Model '{0}' references unknown provider '{1}'", emptyModelId: "Model '{0}' has an empty model ID", invalidMaxContextSize: "Model '{0}' has an invalid max_context_size", // Dashboard — ranges / status rangeToday: "Today", rangeYesterday: "Yesterday", range7d: "7d", range30d: "30d", rangeAll: "All", dashLoadFailed: "Failed to load", // Dashboard — KPI labels kpiRequests: "Requests", kpiInputOther: "Non-cached input", kpiOutput: "Output", kpiCacheRead: "Cache read", kpiCacheCreation: "Cache creation", kpiCacheHit: "Cache hit", kpiCost: "Est. cost", // Dashboard — cards cardHeatmap: "Full-year heatmap", cardHeatmapSub: "Coloured by token volume", cardDailyTrend: "Usage trend", cardDailyTrendSubCapped: "Last 30 days · {n} days total", tabModelTrend: "Model usage trend", tabProviderTrend: "Provider–model usage trend", tabModelTotals: "Model usage totals", tabDailyTrend: "Daily usage trend", providerUnknown: "Unknown provider", cardDailyTrendSub: "{n} days", cardModelUsage: "Model usage", cardModelUsageSub: "{n} models", cardRecent: "Recent requests", cardRecentCapped: "Showing first {n} / {m}", cardRecentCount: "{n} entries", // Dashboard — table columns / units colModel: "Model", colTokens: "Tokens", colCacheHit: "Cache hit", colTime: "Time", colInput: "Input", colOutput: "Output", colCacheRead: "Cache read", unitTimes: "requests", estimate: "est.", subagentModel: "Subagent model", collapse: "Collapse", expandAll: "Expand all ({n})", // Dashboard — pagination paginationPage: "Page {x} / {y}", paginationRange: "{x}–{y}", paginationPerPage: "{n} per page", pageFirst: "First", pagePrev: "Previous", pageNext: "Next", pageLast: "Last", // Dashboard — footer / attribution footerScanned: "Scanned {n} files · {m} records", attributionPorted: "Dashboard & session manager ported from", attributionSuffix: "(MIT, © JochenYang)", modelDataSourcePrefix: "Model & pricing data referenced from", // Sessions — preview previewCollapseChars: "Collapse · {n} chars", previewExpandChars: "Expand · {n} chars", // Provider presets presetPickerTitle: "Choose a provider preset", presetSearchPlaceholder: "Search presets...", presetSortOriginal: "Default", presetSortAlpha: "A-Z", presetNoResults: "No matching presets", presetCustomConfig: "+ Custom configuration", presetFooterHint: "Presets only pre-fill the form; every field stays editable afterwards.", presetCategoryOfficial: "Official", presetCategoryCnOfficial: "China", presetCategoryThirdParty: "Third-party", presetCategoryAggregator: "Aggregator", presetNameAnthropic: "Anthropic", presetNameKimiCoding: "Kimi For Coding", presetNameMoonshot: "Moonshot Platform", presetNameDeepseek: "DeepSeek", presetNameZhipuApi: "Zhipu GLM (Pay-as-you-go)", presetNameZhipuCoding: "Zhipu GLM Coding Plan", presetNameZaiApi: "z.ai (Pay-as-you-go)", presetNameZaiCoding: "z.ai Coding Plan", presetNameBailian: "Alibaba Bailian", presetNameMinimax: "MiniMax", presetNameMinimaxTokenPlan: "MiniMax Token Plan", presetNameStepfun: "StepFun", presetNameStepfunPlan: "StepFun Plan", presetNameSiliconflow: "SiliconFlow", presetNameNovita: "Novita AI", presetNameOpenrouter: "OpenRouter", presetNameTokenRhythm: "TokenRhythm", presetNameOpenai: "OpenAI", presetNameGoogleGenai: "Google AI Studio", presetNameVolcengine: "Volcengine Ark", presetNameOpencodeGo: "OpenCode Go", presetNameOpencodeZen: "OpenCode Zen", // Provider usage usageBalance: "Balance", usageUsed: "used", usageRemaining: "left", usageRefresh: "Refresh", usageRetry: "Retry", usageQueryFailed: "Query failed", usageNetworkError: "Network error", usageInvalidKey: "Invalid API key", usageResetIn: "resets in {time}", usageResetDone: "reset", usageLoading: "Querying…", usageQueryOk: "Query succeeded", // Usage config panel (cc-switch style) usageConfigTitle: "Configure Usage Query - {name}", usageConfigBtn: "Configure usage query", usageEnable: "Enable usage query", usageTemplate: "Query template", usageTemplateAuto: "Auto-detect", usageTemplateNewapi: "NewAPI gateway", usageAutoDetectHint: "Query balance / plan with the provider's API Key and Base URL", usageNewapiHint: "Query a NewAPI / OneAPI gateway balance (requires a web-console Access Token, not the sk- inference key)", usageOAuthManagedHint: "Official OAuth managed: queries the subscription with your Kimi Code login credentials", usageDetectedKinds: "Detected query kinds", usageNoKinds: "Not detected (switch to the NewAPI template to configure manually)", usageBaseUrl: "Query URL (Base URL)", usageAccessToken: "Access Token", usageAccessTokenPlaceholder: "Access Token from the web console", usageAccessTokenHint: "Generated in the NewAPI web console (Personal Settings → Access Token) — NOT the sk- inference key", usageUserId: "User ID", usageUserIdPlaceholder: "NewAPI user id (numeric)", usageUserIdHint: "User id from the web console profile page, sent as the New-Api-User header", usageAutoInterval: "Auto query interval (minutes)", usageAutoIntervalHint: "0 = query only on page open or manual refresh", usageTimeout: "Timeout (seconds)", usageTimeoutHint: "0 = use the default (8 seconds)", usageSupportedVars: "Supported variables", usageBack: "Back", usageNoKindsHint: "No auto-detected query type for this provider. Switch to the NewAPI template to configure manually, or add a custom query script (coming soon).", usageSwitchToNewapi: "Switch to NewAPI template", usageUnsupportedProvider: "This provider is not supported by auto query", usageTier5h: "5-hour", usageTierWeekly: "Weekly", usageTierMonthly: "Monthly", usageErrNoKey: "No API key configured", usageErrDisabled: "Usage query is disabled in the config panel", usageErrLoginExpired: "Kimi Code login expired and auto-refresh failed; run `kimi login` again", usageErrNoOauth: "No Kimi Code OAuth credentials found; run `kimi login` first", usageErrNewapiCreds: "The NewAPI template requires Access Token and User ID", usageTestQuery: "Test query", usageUpdatedAgo: "{time} ago", usageMinAgo: "{n} min ago", usageHourAgo: "{n} h ago", usageDayAgo: "{n} d ago", // Billing mode (subscription / pay-as-you-go) billingTabSubscription: "Subscription", billingTabPayAsYouGo: "Pay-as-you-go", billingTabAll: "All", billingBadgeSubscription: "Plan", billingBadgePayAsYouGo: "PAYG", // Usage trend line chart trendLineTitle: "Usage Trend", trendLineSub: "last {n} days", trendLineLegendTokens: "Token usage", trendLineLegendCacheHit: "Cache hit rate", trendLineLegendRequests: "Requests", trendLineShowRequests: "Show requests", trendLineTooltip: "{date}\nTokens: {tokens}\nCache hit: {cache}\nRequests: {req}", trendLineNoData: "No data", // Advanced settings page (WebUI quick open + experimental flags + secondary model) subagentSettings: "Advanced Settings", experimentalFlags: "Experimental Features", otherExperimentalFlags: "Other Experimental Features", experimentalFlagsHint: "Toggles are written to the [experimental] section of config.toml; env vars take precedence and locked toggles cannot be changed here", flagSecondaryModel: "Subagent Secondary Model", flagSecondaryModelDesc: "Newly spawned subagents bind a second (usually cheaper) model config", flagToolSelect: "Tool Select", flagToolSelectDesc: "Enable the experimental tool selection feature", flagMinidbReadmodel: "MiniDB Read Model", flagMinidbReadmodelDesc: "Enable the v2 engine MiniDB read-model backend", flagTower: "Tower Mode", flagTowerDesc: "Enable tower mode: coordinate multiple agents on a shared objective (/tower command)", flagSubagentFork: "Subagent Fork Context", flagSubagentForkDesc: "Agent/AgentSwarm tools can start a subagent with a snapshot of the calling agent's history (fork parameter)", flagWaitFor: "WaitFor Tool", flagWaitForDesc: "The agent can wait for background tasks to finish within the current turn", flagAutoSessionTitle: "Auto Session Title", flagAutoSessionTitleDesc: "Generate session titles automatically via the managed chat_title tool", flagRemoteControl: "Remote Control", flagRemoteControlDesc: "Enable the experimental remote control feature", flagSearchWorker: "Search Worker", flagSearchWorkerDesc: "Run the kap-server global search backend in a background worker host", flagDefaultOn: "On by default", lockedByEnv: "Locked by env var", masterEnvOnHint: "KIMI_CODE_EXPERIMENTAL_FLAG is set: flags without an explicit [experimental] entry are forced on; explicit entries in config.toml still win", secondaryModelSection: "Subagent Model (Secondary Model)", secondaryModelDisabledHint: "The experimental flag \"Subagent Secondary Model\" is off and this config will not take effect — enable the toggle above first", secondaryModelLabel: "Secondary model", secondaryModelUnset: "Not configured", secondaryModelInheritedContext: "Inherited context", secondaryModelInheritedEffort: "Inherited effort", secondaryModelInheritedHint: "Subagents bind the selected model directly and inherit its context size and effort — no patch needed", secondaryModelHint: "Second model config bound to subagents by default; when unset, subagents inherit the primary model. Only the model reference is stored; subagents inherit all of that model's settings", secondaryModelPriorityHint: "Priority (v2): tool model param (pool alias or primary) > default_model > inherit primary; (v1 legacy): tool param > model_preference > model > inherit primary", // Subagent model pool (secondary_model v2 keys) secondaryPoolUpgrade: "Upgrade to model pool", secondaryPoolUpgradeDesc: "Writes default_model in sync with model (dual-write for both engines); more pool entries can be added afterwards", secondaryPoolAddLabel: "Add pool entry", secondaryPoolAddPlaceholder: "Select a model to add to the pool…", secondaryPoolRemove: "Remove", secondaryPoolDescPlaceholder: "Subagent routing description for this model…", secondaryPoolDescHint: "The description is rendered into the main agent's tool description (Agent/AgentSwarm) and directly affects how well the main model routes to subagent models", secondaryPoolForce: "Force default model", secondaryPoolForceDesc: "When enabled, all subagents are forced onto the default model; force excludes pool entries, which are removed", secondaryPoolForceOn: "Force is on: subagents always use \"{alias}\"", secondaryPoolForceConfirm: "Enabling force removes every pool entry, keeping only the default model. Continue?", secondaryModelClear: "Clear subagent config", secondaryModelForceBadge: "Force on: subagents always use this model", secondaryPoolErrorPrimaryReserved: "\"{alias}\" is a reserved alias and cannot be a pool entry", secondaryPoolErrorDefaultRequired: "default_model is required when pool entries exist", secondaryPoolErrorDefaultNotInPool: "Default model \"{alias}\" is not in the pool", secondaryPoolErrorAliasNotInModels: "Model \"{alias}\" is not registered in [models]", secondaryPoolErrorForceRequiresDefault: "A default model is required before enabling force", secondaryPoolErrorForceExcludesModels: "force is mutually exclusive with pool entries", // Kimi Code WebUI quick open webuiSection: "Kimi Code WebUI", webuiDesc: "Open the new Web UI in an independent in-app window, or in your system browser (built into kimi-code 0.33+). Requires the kimi CLI on PATH.", openWebUIEmbedded: "Open in App", openWebUIBrowser: "Open in Browser", webuiOpening: "Opening...", // Plugin marketplace pluginMarketplace: "Plugin Marketplace", pluginMarketplaceSubtitle: "Browse and install Kimi Code plugins — official and community, with install, update, and enable/disable management.", pluginSearchPlaceholder: "Search by name, description, keyword, or ID…", pluginSectionInstalled: "Installed", pluginSectionOfficial: "Official", pluginSectionCommunity: "Community", pluginCustomInstall: "Custom", pluginUpdateAvailable: "Update available", pluginCapabilityRequired: "Install inside kimi-code (/plugins)", pluginInstall: "Install", pluginUpdate: "Update", pluginEnable: "Enable", pluginDisable: "Disable", pluginRemove: "Remove", pluginInstalling: "Installing…", pluginUpdating: "Updating…", pluginToggling: "Switching…", pluginRemoving: "Removing…", pluginTrustTitle: "Install third-party plugin?", pluginTrustDesc: "This plugin comes from {source}. Plugins can contribute MCP tools, hooks, and commands, and may access your sessions and files. Only install from sources you trust.", pluginTrustInstall: "Trust & install", pluginRemoveTitle: "Remove plugin?", pluginRemoveConfirm: "Remove \"{name}\"? Run /reload in kimi-code or start a new session afterwards to apply.", pluginInstalledMsg: "\"{name}\" installed. Run /reload in kimi-code or start a new session to apply.", pluginUpdatedMsg: "\"{name}\" updated. Run /reload in kimi-code or start a new session to apply.", pluginEnabledMsg: "\"{name}\" enabled. Run /reload in kimi-code or start a new session to apply.", pluginDisabledMsg: "\"{name}\" disabled. Run /reload in kimi-code or start a new session to apply.", pluginRemovedMsg: "\"{name}\" removed. Run /reload in kimi-code or start a new session to apply.", pluginCopyReload: "Copy /reload", pluginReloadCopied: "Copied", pluginCacheNotice: "Showing cached data (fetched {time})", pluginCatalogFailed: "Failed to load the plugin catalog; showing locally installed plugins", pluginInstalledListFailed: "Failed to load the installed plugin list", pluginEmptyResults: "No matching plugins", pluginNoPlugins: "No plugins available", pluginHomepage: "Homepage", };