import type { TranslationMap } from "../lib/types.ts";

export const en: TranslationMap = {
  common: {
    health: "Health",
    ok: "OK",
    online: "Online",
    offline: "Offline",
    connect: "Connect",
    refresh: "Refresh",
    enabled: "Enabled",
    disabled: "Disabled",
    na: "n/a",
    version: "Version",
    docs: "Docs",
    theme: "Theme",
    resources: "Resources",
    search: "Search",
  },
  nav: {
    chat: "Chat",
    control: "Control",
    agent: "Agent",
    settings: "Settings",
    expand: "Expand sidebar",
    collapse: "Collapse sidebar",
    resize: "Resize sidebar",
  },
  tabs: {
    agents: "Agents",
    overview: "Overview",
    channels: "Channels",
    instances: "Instances",
    sessions: "Sessions",
    usage: "Usage",
    cron: "Cron Jobs",
    skills: "Skills",
    nodes: "Nodes",
    chat: "Chat",
    config: "Config",
    communications: "Communications",
    appearance: "Appearance",
    automation: "Automation",
    infrastructure: "Infrastructure",
    aiAgents: "AI & Agents",
    debug: "Debug",
    logs: "Logs",
  },
  subtitles: {
    agents: "Workspaces, tools, identities.",
    overview: "Status, entry points, health.",
    channels: "Channels and settings.",
    instances: "Connected clients and nodes.",
    sessions: "Active sessions and defaults.",
    usage: "API usage and costs.",
    cron: "Wakeups and recurring runs.",
    skills: "Skills and API keys.",
    nodes: "Paired devices and commands.",
    chat: "Gateway chat for quick interventions.",
    config: "Edit openclaw.json.",
    communications: "Channels, messages, and audio settings.",
    appearance: "Theme, UI, and setup wizard settings.",
    automation: "Commands, hooks, cron, and plugins.",
    infrastructure: "Gateway, web, browser, and media settings.",
    aiAgents: "Agents, models, skills, tools, memory, session.",
    debug: "Snapshots, events, RPC.",
    logs: "Live gateway logs.",
  },
  overview: {
    access: {
      title: "Gateway Access",
      subtitle: "Where the dashboard connects and how it authenticates.",
      wsUrl: "WebSocket URL",
      token: "Gateway Token",
      password: "Password (not stored)",
      sessionKey: "Default Session Key",
      language: "Language",
      connectHint: "Click Connect to apply connection changes.",
      trustedProxy: "Authenticated via trusted proxy.",
    },
    snapshot: {
      title: "Snapshot",
      subtitle: "Latest gateway handshake information.",
      status: "Status",
      uptime: "Uptime",
      tickInterval: "Tick Interval",
      lastChannelsRefresh: "Last Channels Refresh",
      channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.",
    },
    stats: {
      instances: "Instances",
      instancesHint: "Presence beacons in the last 5 minutes.",
      sessions: "Sessions",
      sessionsHint: "Recent session keys tracked by the gateway.",
      cron: "Cron",
      cronNext: "Next wake {time}",
    },
    notes: {
      title: "Notes",
      subtitle: "Quick reminders for remote control setups.",
      tailscaleTitle: "Tailscale serve",
      tailscaleText: "Prefer serve mode to keep the gateway on loopback with tailnet auth.",
      sessionTitle: "Session hygiene",
      sessionText: "Use /new or sessions.patch to reset context.",
      cronTitle: "Cron reminders",
      cronText: "Use isolated sessions for recurring runs.",
    },
    auth: {
      required: "This gateway requires auth. Add a token or password, then click Connect.",
      failed:
        "Auth failed. Re-copy a tokenized URL with {command}, or update the token, then click Connect.",
    },
    pairing: {
      hint: "This device needs pairing approval from the gateway host.",
      mobileHint:
        "On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
    },
    insecure: {
      hint: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open {url} on the gateway host.",
      stayHttp: "If you must stay on HTTP, set {config} (token-only).",
    },
    connection: {
      title: "How to connect",
      step1: "Start the gateway on your host machine:",
      step2: "Get a tokenized dashboard URL:",
      step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.",
      step4: "Or generate a reusable token:",
      docsHint: "For remote access, Tailscale Serve is recommended. ",
      docsLink: "Read the docs →",
    },
    cards: {
      cost: "Cost",
      skills: "Skills",
      recentSessions: "Recent Sessions",
    },
    attention: {
      title: "Attention",
    },
    eventLog: {
      title: "Event Log",
    },
    logTail: {
      title: "Gateway Logs",
    },
    quickActions: {
      newSession: "New Session",
      automation: "Automation",
      refreshAll: "Refresh All",
      terminal: "Terminal",
    },
    palette: {
      placeholder: "Type a command…",
      noResults: "No results",
    },
  },
  usage: {
    page: {
      subtitle: "See where tokens go, when sessions spike, and what drives cost.",
    },
    common: {
      emptyValue: "—",
      unknown: "unknown",
    },
    loading: {
      title: "Usage Overview",
      badge: "Loading",
    },
    metrics: {
      tokens: "Tokens",
      cost: "Cost",
      session: "session",
      sessions: "sessions",
    },
    presets: {
      today: "Today",
      last7d: "7d",
      last30d: "30d",
    },
    filters: {
      title: "Filters",
      to: "to",
      startDate: "Start date",
      endDate: "End date",
      timeZone: "Time zone",
      timeZoneLocal: "Local",
      timeZoneUtc: "UTC",
      pin: "Pin",
      pinned: "Pinned",
      unpin: "Unpin filters",
      selectAll: "Select All",
      clear: "Clear",
      clearAll: "Clear All",
      remove: "Remove filter",
      all: "All",
      days: "Days",
      hours: "Hours",
      session: "Session",
      agent: "Agent",
      channel: "Channel",
      provider: "Provider",
      model: "Model",
      tool: "Tool",
      daysCount: "{count} days",
      hoursCount: "{count} hours",
      sessionsCount: "{count} sessions",
    },
    query: {
      placeholder:
        "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)",
      apply: "Filter (client-side)",
      matching: "{shown} of {total} sessions match",
      inRange: "{total} sessions in range",
      tip: "Tip: use filters or click bars to refine days.",
    },
    export: {
      label: "Export",
      sessionsCsv: "Sessions CSV",
      dailyCsv: "Daily CSV",
      json: "JSON",
    },
    empty: {
      title: "Start with a date range",
      subtitle:
        "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.",
      hint: "Select a date range and click Refresh to load usage.",
      noData: "No data",
      featureOverview: "Overview cards",
      featureSessions: "Session ranking",
      featureTimeline: "Timeline drilldown",
    },
    daily: {
      title: "Daily Usage",
      total: "Total",
      byType: "By Type",
      tokensTitle: "Daily Token Usage",
      costTitle: "Daily Cost",
    },
    breakdown: {
      output: "Output",
      input: "Input",
      cacheWrite: "Cache Write",
      cacheRead: "Cache Read",
      total: "Total",
      tokensByType: "Tokens by Type",
      costByType: "Cost by Type",
    },
    overview: {
      title: "Usage Overview",
      messages: "Messages",
      messagesHint: "Total user and assistant messages in range.",
      messagesAbbrev: "msgs",
      user: "user",
      assistant: "assistant",
      toolCalls: "Tool Calls",
      toolCallsHint: "Total tool call count across sessions.",
      toolsUsed: "tools used",
      errors: "Errors",
      errorsHint: "Total message and tool errors in range.",
      toolResults: "tool results",
      avgTokens: "Avg Tokens / Msg",
      avgTokensHint: "Average tokens per message in this range.",
      avgCost: "Avg Cost / Msg",
      avgCostHint: "Average cost per message when providers report costs.",
      avgCostHintMissing:
        "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.",
      acrossMessages: "Across {count} messages",
      sessions: "Sessions",
      sessionsHint: "Distinct sessions in the range.",
      sessionsInRange: "of {count} in range",
      throughput: "Throughput",
      throughputHint: "Throughput shows tokens per minute over active time. Higher is better.",
      tokensPerMinute: "tok/min",
      perMinute: "/ min",
      errorRate: "Error Rate",
      errorHint: "Error rate = errors / total messages. Lower is better.",
      avgSession: "avg session",
      cacheHitRate: "Cache Hit Rate",
      cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.",
      cached: "cached",
      prompt: "prompt",
      calls: "calls",
      topModels: "Top Models",
      topProviders: "Top Providers",
      topTools: "Top Tools",
      topAgents: "Top Agents",
      topChannels: "Top Channels",
      peakErrorDays: "Peak Error Days",
      peakErrorHours: "Peak Error Hours",
      noModelData: "No model data",
      noProviderData: "No provider data",
      noToolCalls: "No tool calls",
      noAgentData: "No agent data",
      noChannelData: "No channel data",
      noErrorData: "No error data",
    },
    sessions: {
      title: "Sessions",
      shown: "{count} shown",
      total: "{count} total",
      avg: "avg",
      all: "All",
      recent: "Recently viewed",
      recentShort: "Recent",
      sort: "Sort",
      ascending: "Ascending",
      descending: "Descending",
      clearSelection: "Clear Selection",
      noRecent: "No recent sessions",
      noneInRange: "No sessions in range",
      more: "+{count} more",
      selected: "Selected ({count})",
      copy: "Copy",
      copyName: "Copy session name",
      limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.",
    },
    details: {
      noUsageData: "No usage data for this session.",
      duration: "Duration",
      modelMix: "Model Mix",
      filtered: "(filtered)",
      close: "Close session details",
      noTimeline: "No timeline data",
      noDataInRange: "No data in range",
      usageOverTime: "Usage Over Time",
      reset: "Reset",
      perTurn: "Per Turn",
      cumulative: "Cumulative",
      turnRange: "Turns {start}–{end} of {total}",
      assistantOutputTokens: "Assistant output tokens",
      userToolInputTokens: "User + tool input tokens",
      tokensWrittenToCache: "Tokens written to cache",
      tokensReadFromCache: "Tokens read from cache",
      noContextData: "No context data",
      systemPromptBreakdown: "System Prompt Breakdown",
      collapse: "Collapse",
      collapseAll: "Collapse All",
      expandAll: "Expand All",
      baseContextPerMessage: "Base context per message",
      system: "System",
      systemShort: "Sys",
      skills: "Skills",
      tools: "Tools",
      files: "Files",
      ofInput: "of input",
      of: "of",
      timelineFiltered: "timeline filtered",
      conversation: "Conversation",
      noMessages: "No messages",
      tool: "Tool",
      toolResult: "Tool result",
      hasTools: "Has tools",
      searchConversation: "Search conversation",
      you: "You",
      noMessagesMatch: "No messages match the filters.",
    },
    mosaic: {
      title: "Activity by Time",
      subtitleEmpty: "Estimates require session timestamps.",
      subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.",
      noTimelineData: "No timeline data yet.",
      dayOfWeek: "Day of Week",
      midnight: "Midnight",
      fourAm: "4am",
      eightAm: "8am",
      noon: "Noon",
      fourPm: "4pm",
      eightPm: "8pm",
      legend: "Low → High token density",
      sun: "Sun",
      mon: "Mon",
      tue: "Tue",
      wed: "Wed",
      thu: "Thu",
      fri: "Fri",
      sat: "Sat",
    },
  },
  login: {
    subtitle: "Gateway Dashboard",
    passwordPlaceholder: "optional",
  },
  chat: {
    disconnected: "Disconnected from gateway.",
    refreshTitle: "Refresh chat data",
    thinkingToggle: "Toggle assistant thinking/working output",
    toolCallsToggle: "Toggle tool calls and tool results",
    focusToggle: "Toggle focus mode (hide sidebar + page header)",
    hideCronSessions: "Hide cron sessions",
    showCronSessions: "Show cron sessions",
    showCronSessionsHidden: "Show cron sessions ({count} hidden)",
    onboardingDisabled: "Disabled during setup",
  },
  languages: {
    en: "English",
    zhCN: "简体中文 (Simplified Chinese)",
    zhTW: "繁體中文 (Traditional Chinese)",
    ptBR: "Português (Brazilian Portuguese)",
    de: "Deutsch (German)",
    es: "Español (Spanish)",
  },
  cron: {
    summary: {
      enabled: "Enabled",
      yes: "Yes",
      no: "No",
      jobs: "Jobs",
      nextWake: "Next wake",
      refreshing: "Refreshing...",
      refresh: "Refresh",
    },
    jobs: {
      title: "Jobs",
      subtitle: "All scheduled jobs stored in the gateway.",
      shownOf: "{shown} shown of {total}",
      searchJobs: "Search jobs",
      searchPlaceholder: "Name, description, or agent",
      enabled: "Enabled",
      schedule: "Schedule",
      lastRun: "Last run",
      all: "All",
      sort: "Sort",
      nextRun: "Next run",
      recentlyUpdated: "Recently updated",
      name: "Name",
      direction: "Direction",
      ascending: "Ascending",
      descending: "Descending",
      reset: "Reset",
      noMatching: "No matching jobs.",
      loading: "Loading...",
      loadMore: "Load more jobs",
    },
    runs: {
      title: "Run history",
      subtitleAll: "Latest runs across all jobs.",
      subtitleJob: "Latest runs for {title}.",
      scope: "Scope",
      allJobs: "All jobs",
      selectedJob: "Selected job",
      searchRuns: "Search runs",
      searchPlaceholder: "Summary, error, or job",
      newestFirst: "Newest first",
      oldestFirst: "Oldest first",
      status: "Status",
      delivery: "Delivery",
      clear: "Clear",
      allStatuses: "All statuses",
      allDelivery: "All delivery",
      selectJobHint: "Select a job to inspect run history.",
      noMatching: "No matching runs.",
      loadMore: "Load more runs",
      runStatusOk: "OK",
      runStatusError: "Error",
      runStatusSkipped: "Skipped",
      runStatusUnknown: "Unknown",
      deliveryDelivered: "Delivered",
      deliveryNotDelivered: "Not delivered",
      deliveryUnknown: "Unknown",
      deliveryNotRequested: "Not requested",
    },
    form: {
      editJob: "Edit Job",
      newJob: "New Job",
      updateSubtitle: "Update the selected scheduled job.",
      createSubtitle: "Create a scheduled wakeup or agent run.",
      required: "Required",
      requiredSr: "required",
      basics: "Basics",
      basicsSub: "Name it, choose the assistant, and set enabled state.",
      fieldName: "Name",
      description: "Description",
      agentId: "Agent ID",
      namePlaceholder: "Morning brief",
      descriptionPlaceholder: "Optional context for this job",
      agentPlaceholder: "main or ops",
      agentHelp: "Start typing to pick a known agent, or enter a custom one.",
      schedule: "Schedule",
      scheduleSub: "Control when this job runs.",
      every: "Every",
      at: "At",
      cronOption: "Cron",
      runAt: "Run at",
      unit: "Unit",
      minutes: "Minutes",
      hours: "Hours",
      days: "Days",
      expression: "Expression",
      expressionPlaceholder: "0 7 * * *",
      everyAmountPlaceholder: "30",
      timezoneOptional: "Timezone (optional)",
      timezonePlaceholder: "America/Los_Angeles",
      timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.",
      jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.",
      execution: "Execution",
      executionSub: "Choose when to wake, and what this job should do.",
      session: "Session",
      main: "Main",
      isolated: "Isolated",
      sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.",
      wakeMode: "Wake mode",
      now: "Now",
      nextHeartbeat: "Next heartbeat",
      wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.",
      payloadKind: "What should run?",
      systemEvent: "Post message to main timeline",
      agentTurn: "Run assistant task (isolated)",
      systemEventHelp:
        "Sends your text to the gateway main timeline (good for reminders/triggers).",
      agentTurnHelp: "Starts an assistant run in its own session using your prompt.",
      timeoutSeconds: "Timeout (seconds)",
      timeoutPlaceholder: "Optional, e.g. 90",
      timeoutHelp:
        "Optional. Leave blank to use the gateway default timeout behavior for this run.",
      mainTimelineMessage: "Main timeline message",
      assistantTaskPrompt: "Assistant task prompt",
      deliverySection: "Delivery",
      deliverySub: "Choose where run summaries are sent.",
      resultDelivery: "Result delivery",
      announceDefault: "Announce summary (default)",
      webhookPost: "Webhook POST",
      noneInternal: "None (internal)",
      deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.",
      webhookUrl: "Webhook URL",
      channel: "Channel",
      webhookPlaceholder: "https://example.com/cron",
      channelHelp: "Choose which connected channel receives the summary.",
      webhookHelp: "Send run summaries to a webhook endpoint.",
      to: "To",
      toPlaceholder: "+1555... or chat id",
      toHelp: "Optional recipient override (chat id, phone, or user id).",
      advanced: "Advanced",
      advancedHelp:
        "Optional overrides for delivery guarantees, schedule jitter, and model controls.",
      deleteAfterRun: "Delete after run",
      deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.",
      clearAgentOverride: "Clear agent override",
      clearAgentHelp: "Force this job to use the gateway default assistant.",
      exactTiming: "Exact timing (no stagger)",
      exactTimingHelp: "Run on exact cron boundaries with no spread.",
      staggerWindow: "Stagger window",
      staggerUnit: "Stagger unit",
      staggerPlaceholder: "30",
      seconds: "Seconds",
      model: "Model",
      modelPlaceholder: "openai/gpt-5.2",
      modelHelp: "Start typing to pick a known model, or enter a custom one.",
      thinking: "Thinking",
      thinkingPlaceholder: "low",
      thinkingHelp: "Use a suggested level or enter a provider-specific value.",
      bestEffortDelivery: "Best effort delivery",
      bestEffortHelp: "Do not fail the job if delivery itself fails.",
      cantAddYet: "Can't add job yet",
      fillRequired: "Fill the required fields below to enable submit.",
      fixFields: "Fix {count} field to continue.",
      fixFieldsPlural: "Fix {count} fields to continue.",
      saving: "Saving...",
      saveChanges: "Save changes",
      addJob: "Add job",
      cancel: "Cancel",
    },
    jobList: {
      allJobs: "all jobs",
      selectJob: "(select a job)",
      enabled: "enabled",
      disabled: "disabled",
      edit: "Edit",
      clone: "Clone",
      disable: "Disable",
      enable: "Enable",
      run: "Run",
      history: "History",
      remove: "Remove",
    },
    jobDetail: {
      system: "System",
      prompt: "Prompt",
      delivery: "Delivery",
      agent: "Agent",
    },
    jobState: {
      status: "Status",
      next: "Next",
      last: "Last",
    },
    runEntry: {
      noSummary: "No summary.",
      runAt: "Run at",
      openRunChat: "Open run chat",
      next: "Next {rel}",
      due: "Due {rel}",
    },
    errors: {
      nameRequired: "Name is required.",
      scheduleAtInvalid: "Enter a valid date/time.",
      everyAmountInvalid: "Interval must be greater than 0.",
      cronExprRequired: "Cron expression is required.",
      staggerAmountInvalid: "Stagger must be greater than 0.",
      systemTextRequired: "System text is required.",
      agentMessageRequired: "Agent message is required.",
      timeoutInvalid: "If set, timeout must be greater than 0 seconds.",
      webhookUrlRequired: "Webhook URL is required.",
      webhookUrlInvalid: "Webhook URL must start with http:// or https://.",
      invalidRunTime: "Invalid run time.",
      invalidIntervalAmount: "Invalid interval amount.",
      cronExprRequiredShort: "Cron expression required.",
      invalidStaggerAmount: "Invalid stagger amount.",
      systemEventTextRequired: "System event text required.",
      agentMessageRequiredShort: "Agent message required.",
      nameRequiredShort: "Name required.",
    },
  },
};
