import type { Translations } from "./types"; export const en: Translations = { common: { save: "Save", saving: "Saving...", cancel: "Cancel", close: "Close", confirm: "Confirm", delete: "Delete", refresh: "Refresh", retry: "Retry", search: "Search...", loading: "Loading...", create: "Create", creating: "Creating...", set: "Set", replace: "Replace", clear: "Clear", live: "Live", off: "Off", enabled: "enabled", disabled: "disabled", active: "active", inactive: "inactive", unknown: "unknown", untitled: "Untitled", none: "None", form: "Form", noResults: "No results", of: "of", page: "Page", msgs: "msgs", tools: "tools", match: "match", other: "Other", configured: "configured", removed: "removed", failedToToggle: "Failed to toggle", failedToRemove: "Failed to remove", failedToReveal: "Failed to reveal", collapse: "Collapse", expand: "Expand", general: "General", messaging: "Messaging", pluginLoadFailed: "Could not load this plugin’s script. Check the Network tab (dashboard-plugins/…) and the server’s plugin path.", pluginNotRegistered: "The plugin’s script did not call register(), or the script errored. Open the browser console for details.", }, app: { brand: "Hermes Agent", brandShort: "HA", closeNavigation: "Close navigation", closeModelTools: "Close model and tools", footer: { org: "Nous Research", }, activeSessionsLabel: "Active Sessions:", gatewayStatusLabel: "Gateway Status:", gatewayStrip: { failed: "Start failed", off: "Off", running: "Running", starting: "Starting", stopped: "Stopped", }, nav: { analytics: "Analytics", chat: "Chat", config: "Config", cron: "Cron", documentation: "Documentation", keys: "Keys", logs: "Logs", models: "Models", profiles: "Profiles", plugins: "Plugins", sessions: "Sessions", skills: "Skills", }, modelToolsSheetSubtitle: "& tools", modelToolsSheetTitle: "Model", navigation: "Navigation", openDocumentation: "Open documentation in a new tab", openNavigation: "Open navigation", pluginNavSection: "Plugins", sessionsActiveCount: "{count} active", statusOverview: "Status overview", system: "System", webUi: "Web UI", }, status: { actionFailed: "Action failed", actionFinished: "Finished", actions: "Actions", agent: "Agent", activeSessions: "Active Sessions", connected: "Connected", connectedPlatforms: "Connected Platforms", disconnected: "Disconnected", error: "Error", failed: "Failed", gateway: "Gateway", gatewayFailedToStart: "Gateway failed to start", lastUpdate: "Last update", noneRunning: "None", notRunning: "Not running", pid: "PID", platformDisconnected: "disconnected", platformError: "error", recentSessions: "Recent Sessions", restartGateway: "Restart Gateway", restartingGateway: "Restarting gateway…", running: "Running", runningRemote: "Running (remote)", startFailed: "Start failed", starting: "Starting", startedInBackground: "Started in background — check logs for progress", stopped: "Stopped", updateHermes: "Update Hermes", updatingHermes: "Updating Hermes…", waitingForOutput: "Waiting for output…", }, sessions: { title: "Sessions", searchPlaceholder: "Search message content...", noSessions: "No sessions yet", noMatch: "No sessions match your search", startConversation: "Start a conversation to see it here", noMessages: "No messages", untitledSession: "Untitled session", deleteSession: "Delete session", confirmDeleteTitle: "Delete session?", confirmDeleteMessage: "This permanently removes the conversation and all of its messages. This cannot be undone.", sessionDeleted: "Session deleted", failedToDelete: "Failed to delete session", resumeInChat: "Resume in Chat", previousPage: "Previous page", nextPage: "Next page", roles: { user: "User", assistant: "Assistant", system: "System", tool: "Tool", }, }, analytics: { period: "Period:", totalTokens: "Total Tokens", totalSessions: "Total Sessions", apiCalls: "API Calls", dailyTokenUsage: "Daily Token Usage", dailyBreakdown: "Daily Breakdown", perModelBreakdown: "Per-Model Breakdown", topSkills: "Top Skills", skill: "Skill", loads: "Agent Loaded", edits: "Agent Managed", lastUsed: "Last Used", input: "Input", output: "Output", total: "Total", noUsageData: "No usage data for this period", startSession: "Start a session to see analytics here", date: "Date", model: "Model", tokens: "Tokens", perDayAvg: "/day avg", acrossModels: "across {count} models", inOut: "{input} in / {output} out", }, models: { modelsUsed: "Models Used", estimatedCost: "Est. Cost", tokens: "tokens", sessions: "sessions", avgPerSession: "avg/session", apiCalls: "API calls", toolCalls: "tool calls", noModelsData: "No model usage data for this period", startSession: "Start a session to see model data here", }, logs: { title: "Logs", autoRefresh: "Auto-refresh", file: "File", level: "Level", component: "Component", lines: "Lines", noLogLines: "No log lines found", }, cron: { confirmDeleteMessage: "This removes the job from the schedule. This cannot be undone.", confirmDeleteTitle: "Delete scheduled job?", newJob: "New Cron Job", nameOptional: "Name (optional)", namePlaceholder: "e.g. Daily summary", prompt: "Prompt", promptPlaceholder: "What should the agent do on each run?", schedule: "Schedule (cron expression)", schedulePlaceholder: "0 9 * * *", deliverTo: "Deliver to", scheduledJobs: "Scheduled Jobs", noJobs: "No cron jobs configured. Create one above.", last: "Last", next: "Next", pause: "Pause", resume: "Resume", triggerNow: "Trigger now", delivery: { local: "Local", telegram: "Telegram", discord: "Discord", slack: "Slack", email: "Email", }, }, profiles: { newProfile: "New Profile", name: "Name", namePlaceholder: "e.g. coder, writer, etc.", nameRequired: "Name is required", nameRule: "Lowercase letters, digits, _ and - only; must start with a letter or digit; up to 64 characters.", invalidName: "Invalid profile name", cloneFromDefault: "Clone config from default profile", allProfiles: "Profiles", noProfiles: "No profiles found.", defaultBadge: "default", hasEnv: "env", model: "Model", skills: "Skills", rename: "Rename", editSoul: "Edit SOUL.md", soulSection: "SOUL.md (personality / system prompt)", soulPlaceholder: "# How this agent should behave…", saveSoul: "Save SOUL", soulSaved: "SOUL.md saved", openInTerminal: "Copy CLI command", commandCopied: "Copied to clipboard", copyFailed: "Could not copy", confirmDeleteTitle: "Delete profile?", confirmDeleteMessage: "This permanently deletes profile '{name}' — config, keys, memories, sessions, skills, cron jobs. Cannot be undone.", created: "Created", deleted: "Deleted", renamed: "Renamed", }, pluginsPage: { contextEngineLabel: "Context engine", dashboardSlots: "Dashboard slots", disableRuntime: "Disable", enableAfterInstall: "Enable after install", enableRuntime: "Enable", forceReinstall: "Force reinstall (delete existing folder first)", headline: "Discover, install, enable, and update Hermes plugins (`hermes plugins` parity).", identifierLabel: "Git URL or owner/repo", inactive: "inactive", installBtn: "Install from Git", installHeading: "Install from GitHub / Git URL", installHint: "Use owner/repo shorthand or a full https:// or git@ clone URL.", memoryProviderLabel: "Memory provider", missingEnvWarn: "Set these in Keys before the plugin can run:", noDashboardTab: "No dashboard tab", openTab: "Open", orphanHeading: "Dashboard-only extensions (no agent plugin.yaml match)", pluginListHeading: "Installed plugins", providerDefaults: "built-in / default", providersHeading: "Runtime provider plugins", providersHint: "Writes memory.provider (empty = built-in) and context.engine to config.yaml. Takes effect next session.", refreshDashboard: "Rescan dashboard extensions", removeConfirm: "Remove this plugin from ~/.hermes/plugins/?", removeHint: "Only user-installed plugins under ~/.hermes/plugins can be removed.", rescanHeading: "SPA plugin registry", rescanHint: "Rescan after adding files on disk so the dashboard sidebar picks up new manifests.", runtimeHeading: "Gateway runtime (YAML plugins)", saveProviders: "Save provider settings", savedProviders: "Provider settings saved.", sourceBadge: "Source", authRequired: "Auth required", authRequiredHint: "Run this command to authenticate:", updateGit: "Git pull", versionBadge: "Version", showInSidebar: "Show in sidebar", hideFromSidebar: "Hide from sidebar", }, skills: { title: "Skills", searchPlaceholder: "Search skills and toolsets...", enabledOf: "{enabled}/{total} enabled", all: "All", categories: "Categories", filters: "Filters", noSkills: "No skills found. Skills are loaded from ~/.hermes/skills/", noSkillsMatch: "No skills match your search or filter.", skillCount: "{count} skill{s}", resultCount: "{count} result{s}", noDescription: "No description available.", toolsets: "Toolsets", toolsetLabel: "{name} toolset", noToolsetsMatch: "No toolsets match the search.", setupNeeded: "Setup needed", disabledForCli: "Disabled for CLI", more: "+{count} more", }, config: { configPath: "~/.hermes/config.yaml", filters: "Filters", sections: "Sections", exportConfig: "Export config as JSON", importConfig: "Import config from JSON", resetDefaults: "Reset to defaults", resetScopeTooltip: "Reset {scope} to defaults", confirmResetScope: "Reset all {scope} settings to their defaults? This only updates the form — changes aren't written to config.yaml until you press Save.", resetScopeToast: "{scope} reset to defaults — review and Save to persist", rawYaml: "Raw YAML Configuration", searchResults: "Search Results", fields: "field{s}", noFieldsMatch: 'No fields match "{query}"', configSaved: "Configuration saved", yamlConfigSaved: "YAML config saved", failedToSave: "Failed to save", failedToSaveYaml: "Failed to save YAML", failedToLoadRaw: "Failed to load raw config", configImported: "Config imported — review and save", invalidJson: "Invalid JSON file", categories: { general: "General", agent: "Agent", terminal: "Terminal", display: "Display", delegation: "Delegation", memory: "Memory", compression: "Compression", security: "Security", browser: "Browser", voice: "Voice", tts: "Text-to-Speech", stt: "Speech-to-Text", logging: "Logging", discord: "Discord", auxiliary: "Auxiliary", }, }, env: { changesNote: "Changes are saved to disk immediately. Active sessions pick up new keys automatically.", confirmClearMessage: "The stored value for this variable will be removed from your .env file. This cannot be undone from the UI.", confirmClearTitle: "Clear this key?", description: "Manage API keys and secrets stored in", hideAdvanced: "Hide Advanced", showAdvanced: "Show Advanced", llmProviders: "LLM Providers", providersConfigured: "{configured} of {total} providers configured", getKey: "Get key", notConfigured: "{count} not configured", notSet: "Not set", keysCount: "{count} key{s}", enterValue: "Enter value...", replaceCurrentValue: "Replace current value ({preview})", showValue: "Show real value", hideValue: "Hide value", }, oauth: { title: "Provider Logins (OAuth)", providerLogins: "Provider Logins (OAuth)", description: "{connected} of {total} OAuth providers connected. Login flows currently run via the CLI; click Copy command and paste into a terminal to set up.", connected: "Connected", expired: "Expired", notConnected: "Not connected. Run {command} in a terminal.", runInTerminal: "in a terminal.", noProviders: "No OAuth-capable providers detected.", login: "Login", disconnect: "Disconnect", managedExternally: "Managed externally", copied: "Copied ✓", cli: "CLI", copyCliCommand: "Copy CLI command (for external / fallback)", connect: "Connect", sessionExpires: "Session expires in {time}", initiatingLogin: "Initiating login flow…", exchangingCode: "Exchanging code for tokens…", connectedClosing: "Connected! Closing…", loginFailed: "Login failed.", sessionExpired: "Session expired. Click Retry to start a new login.", reOpenAuth: "Re-open auth page", reOpenVerification: "Re-open verification page", submitCode: "Submit code", pasteCode: "Paste authorization code (with #state suffix is fine)", waitingAuth: "Waiting for you to authorize in the browser…", enterCodePrompt: "A new tab opened. Enter this code if prompted:", pkceStep1: "A new tab opened to claude.ai. Sign in and click Authorize.", pkceStep2: "Copy the authorization code shown after authorizing.", pkceStep3: "Paste it below and submit.", flowLabels: { pkce: "Browser login (PKCE)", device_code: "Device code", external: "External CLI", }, expiresIn: "expires in {time}", }, language: { switchTo: "Switch to Chinese", }, theme: { title: "Theme", switchTheme: "Switch theme", }, achievements: { hero: { kicker: "Agentic Gamerscore", title: "Hermes Achievements", subtitle: "Collectible Hermes badges earned from real session history. Known unfinished achievements are shown as Discovered; Secret achievements stay hidden until the first matching behavior appears.", scan_subtitle: "Scanning Hermes session history. First scan can take 5–10 seconds on large histories.", }, actions: { rescan: "Rescan", }, stats: { unlocked: "Unlocked", unlocked_hint: "earned badges", discovered: "Discovered", discovered_hint: "known, not earned yet", secrets: "Secrets", secrets_hint: "hidden until first signal", highest_tier: "Highest tier", highest_tier_hint: "Copper → Silver → Gold → Diamond → Olympian", latest: "Latest", latest_hint_empty: "run Hermes more", none_yet: "None yet", }, state: { unlocked: "Unlocked", discovered: "Discovered", secret: "Secret", }, tier: { target: "Target {tier}", hidden: "Hidden", complete: "Complete", objective: "Objective", }, progress: { hidden: "hidden", }, scan: { building_headline: "Building achievement profile…", building_detail: "Reading sessions, tool calls, model metadata, and unlock state.", starting_headline: "Starting achievement scan…", progress_detail: "Scanned {scanned} of {total} sessions · {pct}%. Badges unlock as more history streams in.", idle_detail: "Reading sessions, tool calls, model metadata, and unlock state. Badges appear here as they unlock.", }, guide: { tiers_header: "Tiers", secret_header: "Secret achievements", secret_body: "Secrets hide their exact trigger. Once Hermes sees a related signal, the card becomes Discovered and shows its requirement.", scan_status_header: "Scan status", scan_status_body: "Hermes is scanning local history once, then cards will appear automatically. Nothing is stuck if this takes a few seconds.", what_scanned_header: "What is scanned", what_scanned_body: "Sessions, tool calls, model metadata, errors, achievements, and local unlock state.", }, card: { share_title: "Share this achievement", share_label: "Share {name}", share_text: "Share", how_to_reveal: "How to reveal", what_counts: "What counts", evidence_label: "Evidence", evidence_session_fallback: "session", no_evidence: "No evidence yet", }, latest: { header: "Recent unlocks", }, empty: { no_secrets_header: "No hidden secrets left in this scan.", no_secrets_body: "Clue: secrets usually start from unusual failure or power-user patterns — port conflicts, permission walls, missing env vars, YAML mistakes, Docker collisions, rollback/checkpoint use, cache hits, or tiny fixes after lots of red text.", }, filters: { all_categories: "All", visibility_all: "all", visibility_unlocked: "unlocked", visibility_discovered: "discovered", visibility_secret: "secret", }, share: { dialog_label: "Share achievement", header: "Share: {name}", close: "Close", rendering: "Rendering…", card_alt: "{name} share card", error_generic: "Something went wrong.", x_title: "Opens X with a pre-filled post", x_button: "Share on X", copy_title: "Copy the image to paste into your post", copy_button: "Copy image", copied: "Copied ✓", download_button: "Download PNG", hint: "Share on X opens a pre-filled post in a new tab. Click Copy image first if you want the 1200×630 badge attached — X lets you paste it right into the tweet composer. Download PNG saves the file for use anywhere.", clipboard_unsupported: "Clipboard image copy not supported in this browser — use Download instead.", tweet_text: "Just unlocked {tier_part}\"{name}\" in Hermes Agent ☤", }, }, kanban: { loading: "Loading Kanban board…", loadFailed: "Failed to load Kanban board: ", loadFailedHint: "The backend auto-creates kanban.db on first read. If this persists, check the dashboard logs.", board: "Board", newBoard: "+ New board", newBoardTitle: "New board", newBoardDescription: "Boards let you separate unrelated streams of work — one per project, repo, or domain. Workers on one board never see another board's tasks.", slug: "Slug", slugHint: "— lowercase, hyphens, e.g. atm10-server", displayName: "Display name", displayNameHint: "(optional)", description: "Description", descriptionHint: "(optional)", icon: "Icon", iconHint: "(single character or emoji)", switchAfterCreate: "Switch to this board after creating it", cancel: "Cancel", creating: "Creating…", createBoard: "Create board", search: "Search", filterCards: "Filter cards…", tenant: "Tenant", allTenants: "All tenants", assignee: "Assignee", allProfiles: "All profiles", showArchived: "Show archived", lanesByProfile: "Lanes by profile", nudgeDispatcher: "Nudge dispatcher", refresh: "Refresh", selected: "selected", complete: "Complete", archive: "Archive", apply: "Apply", clear: "Clear", createTask: "Create task in this column", noTasks: "— no tasks —", unassigned: "unassigned", untitled: "(untitled)", loadingDetail: "Loading…", addComment: "Add a comment… (Enter to submit)", comment: "Comment", status: "Status", workspace: "Workspace", skills: "Skills", createdBy: "Created by", result: "Result", comments: "Comments", events: "Events", runHistory: "Run history", workerLog: "Worker log", loadingLog: "Loading log…", noWorkerLog: "— no worker log yet (task hasn't spawned or log was rotated away) —", noDescription: "— no description —", noComments: "— no comments —", edit: "edit", save: "Save", dependencies: "Dependencies", parents: "Parents:", children: "Children:", none: "none", addParent: "— add parent —", addChild: "— add child —", removeDependency: "Remove dependency", block: "Block", unblock: "Unblock", notifyHomeChannels: "Notify home channels", diagnostics: "Diagnostics", hide: "Hide", show: "Show", attention: "Attention", tasksNeedAttention: "tasks need attention", taskNeedsAttention: "1 task needs attention", diagnostic: "diagnostic", open: "Open", close: "Close (Esc)", reassignTo: "Reassign to:", copied: "Copied", copyCommand: "Copy command to clipboard", reclaim: "Reclaim", reassign: "Reassign", renderingError: "Kanban tab hit a rendering error", reloadView: "Reload view", wsAuthFailed: "WebSocket auth failed — reload the page to refresh the session token.", markDone: "Mark {n} task(s) as done?", markArchived: "Archive {n} task(s)?", warning: "Warning", phantomIds: "Phantom ids:", active: "active", ended: "ended", noProfile: "(no profile)", showAllAttempts: "Show all attempts", sendingUpdates: "Sending updates to", sendNotifications: "Send completed / blocked / gave_up notifications to", archiveBoardConfirm: "Archive board '{name}'? It will be moved to boards/_archived/ so you can recover it later. Tasks on this board will no longer appear anywhere in the UI.", archiveBoardTitle: "Archive this board", boardSwitcherHint: "Boards let you separate unrelated streams of work", taskCreatedWarning: "Task created, but: ", moveFailed: "Move failed: ", bulkFailed: "Bulk: ", completionBlockedHallucination: "⚠ Completion blocked — phantom card ids", suspectedHallucinatedReferences: "⚠ Prose referenced phantom card ids", pickProfileFirst: "Pick a profile first.", unblockedMessage: "Unblocked {id}. Task is ready for the next tick.", unblockFailed: "Unblock failed: ", reclaimedMessage: "Reclaimed {id}. Task is back to ready.", reclaimFailed: "Reclaim failed: ", reassignedMessage: "Reassigned {id} to {profile}.", reassignFailed: "Reassign failed: ", selectForBulk: "Select for bulk actions", clickToEdit: "Click to edit", clickToEditAssignee: "Click to edit assignee", emptyAssignee: "(empty = unassign)", columnLabels: { triage: "Triage", todo: "Todo", ready: "Ready", running: "In Progress", blocked: "Blocked", done: "Done", archived: "Archived", }, columnHelp: { triage: "Raw ideas — a specifier will flesh out the spec", todo: "Waiting on dependencies or unassigned", ready: "Assigned and waiting for a dispatcher tick", running: "Claimed by a worker — in-flight", blocked: "Worker asked for human input", done: "Completed", archived: "Archived", }, confirmDone: "Mark this task as done? The worker's claim is released and dependent children become ready.", confirmArchive: "Archive this task? It disappears from the default board view.", confirmBlocked: "Mark this task as blocked? The worker's claim is released.", completionSummary: "Completion summary for {label}. This is stored as the task result.", completionSummaryRequired: "Completion summary is required before marking a task done.", triagePlaceholder: "Rough idea — AI will spec it…", taskTitlePlaceholder: "New task title…", specifier: "specifier", assigneePlaceholder: "assignee", priority: "Priority", skillsPlaceholder: "skills (optional, comma-separated): translation, github-code-review", noParent: "— no parent —", workspacePathDir: "workspace path (required, e.g. ~/projects/my-app)", workspacePathOptional: "workspace path (optional, derived from assignee if blank)", logTruncated: "(showing last 100 KB — full log at ", logAt: ")", }, };