export const en = {
  docTitle: 'ESP-Claw Settings',
  pageTitle: 'Device Settings',
  pageSubtitle:
    'View system operation basic information and status',

  statusLoading: 'Loading…',
  statusOnline: 'Wi-Fi Connected',
  statusOffline: 'Wi-Fi Offline',
  statusApActive: 'Captive Portal Active',
  openMenu: 'Open navigation menu',
  toggleSidebar: 'Toggle sidebar',
  closeMenu: 'Close navigation menu',
  externalHome: 'Home',
  externalDocs: 'Documentation',
  externalGithub: 'GitHub',

  navStatus: 'System Status',
  navSystemSettings: 'System Settings',
  navBasic: 'Basic Settings',
  navLlm: 'LLM',
  navIm: 'IM',
  navSearch: 'Web Search',
  navMemory: 'Memory',
  navCapabilities: 'Capabilities',
  navLuaModules: 'Lua Modules',
  navFiles: 'Files',
  navWebIm: 'Web Chat',

  webimDesc: 'Interact with ESP-Claw in real time via WebSocket.',
  webimSend: 'Send',
  webimOnline: 'Online',
  webimPlaceholder: 'Message…',
  webimAttach: 'Image',
  webimNoBind:
    'Web IM is not connected yet (device still starting or local IM disabled). Wait for the agent to finish booting.',
  webimEmpty: 'No messages',
  webimPendingFiles: 'Attachments pending send',
  webimUploaded: 'Image uploaded — click Send to post.',
  webimSendShortcut: 'Ctrl+Enter to send',
  webimWsReconnecting: 'Live channel reconnecting…',
  webimMarkdownPreview: 'Markdown preview',
  webimMarkdownPreviewLoading: 'Loading Markdown…',
  webimMarkdownPreviewLoadFailed: 'Could not load Markdown preview libraries.',
  webimRetrySend: 'Retry sending',

  unsavedIndicator: 'Unsaved',
  unsavedConfirmLeave:
    'You have unsaved changes on this tab. Leave without saving?',
  unsavedConfirmReload:
    'You have unsaved changes. Are you sure you want to leave?',

  saveBtn: 'Save Changes',
  saveTabBtn: 'Save Tab',
  discardBtn: 'Discard',
  saveSuccess: 'Settings saved',
  saveError: 'Failed to save settings',
  restartHint: 'Restart the device after saving to apply new settings',

  sectionWifi: 'Wi-Fi Settings',
  wifiSsid: 'Wi-Fi SSID',
  wifiPassword: 'Wi-Fi Password',
  passwordShow: 'Show password',
  passwordHide: 'Hide password',
  wifiValidationSsidRequired: 'Wi-Fi SSID is required.',
  wifiValidationPasswordLength:
    'Wi-Fi password must be empty or at least 8 characters long.',

  apName: 'AP SSID',
  apPassword: 'AP Password',
  apNameHint: 'Current: {ssid}. Leave empty to keep default name. Changes apply after restart.',
  apPasswordHint: 'Leave empty for open AP. Must be at least 8 characters if set.',
  apValidationNameRequired: 'AP Name is required.',
  apValidationPasswordLength:
    'AP password must be empty or at least 8 characters long.',
  apBehavior: 'AP Behavior',
  apBehaviorKeep: 'Keep On',
  apBehaviorCloseOnSta: 'Turn Off After Wi-Fi Connects',

  sectionStatusNetwork: 'Network',
  sectionStatusStorage: 'Storage',
  sysInfoWifi: 'Wi-Fi',
  sysInfoIp: 'IP Address',
  sysInfoMode: 'Wi-Fi Mode',
  sysInfoApSsid: 'Captive Portal SSID',
  sysInfoApIp: 'Captive Portal IP',
  sysInfoStorage: 'Storage Path',
  sysInfoNone: 'n/a',
  sysInfoReload: 'Reload Status',
  sysInfoRestart: 'Restart Device',
  restartConfirmTitle: 'Confirm Device Restart',
  restartConfirmBody: 'The device will restart immediately and this page will go offline briefly.',
  restartConfirmHint: 'The current connection will drop during restart. You can continue once the device comes back.',
  restartConfirmCancel: 'Cancel',
  restartConfirmAction: 'Restart',
  restartOverlayTitle: 'Waiting For Device Restart',
  restartOverlayRequesting: 'Sending restart request…',
  restartOverlayCooldown: 'The device is shutting down and preparing to reboot…',
  restartOverlayPolling: 'Polling device status and waiting for it to come back online…',
  restartOverlayHint: 'The page will automatically check the restart status. No manual refresh is needed.',
  restartOverlayErrorTitle: 'The device did not come back online in time',
  restartOverlayTimeout: 'The device did not come back online within 30 seconds. Check network reachability or serial logs.',
  restartOverlayClose: 'Close',

  sectionLlm: 'LLM Settings',
  llmProvider: 'LLM Provider',
  llmProviderOpenai: 'OpenAI',
  llmProviderQwen: 'Qwen Compatible',
  llmProviderDeepSeek: 'DeepSeek',
  llmProviderAnthropic: 'Anthropic',
  llmProviderOpenaiCompatible: 'OpenAI Compatible API',
  llmProviderAnthropicCompatible: 'Anthropic Compatible API',
  llmProviderCustom: 'Custom',
  llmFillDefaults: 'Fill Default Config',
  llmProviderDocs: 'Provider Docs',
  llmProviderConsole: 'Get API Key',
  llmApiKey: 'API Key',
  llmModel: 'Model',
  llmTimeout: 'Timeout (ms)',
  llmTimeoutPlaceholder: '120000',
  llmMaxTokens: 'Max Tokens',
  llmMaxTokensPlaceholder: '8192',
  llmAdvanced: 'LLM Advanced Options',
  llmBackend: 'Backend Type',
  llmBackendPlaceholder: 'openai_compatible / anthropic_compatible',
  llmBaseUrl: 'Base URL',
  llmBaseUrlPlaceholder: 'https://api.openai.com/v1',
  llmAuthType: 'Auth Type',
  llmAuthTypePlaceholder: 'bearer / api-key / none',
  llmDefaultImageMaxBytes: 'Default Image Max Bytes',
  llmDefaultImageMaxBytesPlaceholder: '524288',
  llmMaxTokensField: 'Max Tokens Field',
  llmMaxTokensFieldPlaceholder: 'max_tokens / max_completion_tokens / ...',
  llmSupportsTools: '[LLM Model] Supports tool calls',
  llmSupportsVision: '[LLM Model] Supports vision input',
  llmImageRemoteUrlOnly: 'Image input must be remote URL',
  llmValidationRequiredFields: 'Complete required LLM fields before saving: {fields}.',
  llmValidationMaxTokens: 'Max Tokens must be a positive integer.',
  llmValidationImageMaxBytes: 'Default Image Max Bytes must be a positive integer.',

  sectionIm: 'Instant Messaging (IM)',
  imAdd: 'Add',
  imClearConf: 'Clear Config',
  imCancel: 'Cancel',
  imNotConfigured: 'not configured',
  imAdvancedSettings: 'Advanced settings',
  imWechatTitle: 'WeChat',
  imFeishuTitle: 'Feishu',
  imQqTitle: 'QQ',
  imTelegramTitle: 'Telegram',
  imValidationIncompletePlatform:
    'Complete all required fields for {platform} before saving: {fields}.',
  imValidationInvalidField: '{field} for {platform} is not valid.',
  imWechatCredsFilled:
    'Credentials filled from QR login. Review in Advanced settings and click Save to persist.',
  qqAppId: 'QQ App ID',
  qqAppSecret: 'QQ App Secret',
  feishuAppId: 'Feishu App ID',
  feishuAppSecret: 'Feishu App Secret',
  tgBotToken: 'Telegram Bot Token',
  wechatToken: 'WeChat Token',
  wechatBaseUrl: 'WeChat Base URL',
  wechatBaseUrlPlaceholder: 'https://ilinkai.weixin.qq.com',
  wechatCdnBaseUrl: 'WeChat CDN Base URL',
  wechatCdnBaseUrlPlaceholder: 'https://novac2c.cdn.weixin.qq.com/c2c',
  wechatAccountId: 'WeChat Account ID',
  wechatAccountIdPlaceholder: 'default',
  wechatLoginGenerate: 'Generate QR',
  wechatLoginCancel: 'Cancel',
  wechatLoginStatus: 'Status: idle',
  wechatLoginStatusPrefix: 'Status: ',
  wechatLoginCancelledMsg: 'WeChat login cancelled.',
  wechatLoginNote:
    'Scan the QR code with WeChat. Credentials will be filled in Advanced settings below — click Save to store them.',
  wechatLoginOpenLink: 'Open login link',

  sectionSearch: 'Search (Optional)',
  searchNote:
    'If set, ESP-Claw can search online. Tip: Built-in weather skill also relies on online search.',
  searchBraveKey: 'Brave Search API Key',
  searchTavilyKey: 'Tavily API Key',
  searchHttpAllowlist: 'HTTP allowlist (domains/IP, comma-separated)',
  searchHttpAllowlistPlaceholder: 'api.example.com,*.example.org,203.0.113.10',

  sectionCapabilities: 'Capability Groups',
  capabilitiesDescription:
    'Choose which compiled capability groups can be used at runtime. "LLM visible" makes a group always listed in the planner context.',
  capFilterAll: 'All',
  capFilterEnabled: 'Enabled only',
  capFilterLlm: 'LLM-visible only',
  capSearchPlaceholder: 'Search capabilities…',
  capSummary: '{enabled} enabled / {llm} LLM-visible / {total} total',
  capabilitySelectAll: 'Select All',
  capabilityClearAll: 'Clear All',
  capabilityLlmDefaults: 'Restore LLM Defaults',
  capabilityLlmClear: 'Clear LLM',
  capabilityLoading: 'Loading capabilities…',
  capabilityLoadError: 'Failed to load capabilities',
  capabilityNameCol: 'Capability',
  capabilityEnabled: 'Enabled',
  capabilityLlmVisible: 'LLM visible by default',
  capabilityNoResult: 'No capability matches the current filter.',

  sectionLuaModules: 'Lua Modules',
  luaModulesDescription:
    'Select which compiled Lua modules are registered when cap_lua starts. Changes take effect after restart.',
  luaModulesSearchPlaceholder: 'Search modules…',
  luaModulesSummary: '{enabled} enabled / {total} total',
  luaModulesSelectAll: 'Select All',
  luaModulesClearAll: 'Clear All',
  luaModulesLoading: 'Loading Lua modules…',
  luaModulesLoadError: 'Failed to load Lua modules',
  luaModulesCapabilityRequired:
    'Enable the cap_lua capability group before Lua module selection takes effect.',
  luaModulesNameCol: 'Lua Module',
  luaModulesNoResult: 'No Lua module matches the current filter.',
  idCol: 'ID',

  sectionAdvanced: 'Advanced Settings',
  timezone: 'Timezone',
  timezonePlaceholder: 'e.g. CST-8 (Beijing) or UTC0',
  timezoneHelp:
    "POSIX TZ string only. The sign is INVERTED relative to common UTC notation: Beijing (UTC+8) must be written as 'CST-8'; New York (UTC-5) is 'EST5'. Names like 'Asia/Shanghai' will NOT work — please convert manually.",

  memoryTitle: 'Memory Files',
  memoryDescription: 'Manage the device memory files.',
  memoryCardLongTerm: 'Long-term Memory',
  memoryCardSoul: 'Soul',
  memoryCardIdentity: 'Identity',
  memoryCardUserInfo: 'User Info',
  memoryMissing: 'Long-term memory file does not exist yet.',
  memoryRefreshAll: 'Refresh All',
  memoryRefresh: 'Refresh',
  memoryEdit: 'Edit',
  memoryAuxMissing: 'Memory file does not exist yet.',
  memoryRefreshed: 'Memory reloaded',
  memoryLoadError: 'Failed to load memory',
  memorySaveError: 'Failed to save memory',

  fileRefresh: 'Refresh',
  fileUpDir: 'Up One Level',
  fileNewFolder: 'New folder name',
  fileCreateFolder: 'Create Folder',
  fileUploadPath: '/example.txt',
  fileChoose: 'Choose File',
  fileNoFileSelected: 'No file selected',
  fileUpload: 'Upload',
  fileColName: 'Name',
  fileColType: 'Type',
  fileColSize: 'Size',
  fileColActions: 'Actions',
  fileTypeFolder: 'Folder',
  fileTypeFile: 'File',
  fileEmpty: 'This folder is empty.',
  fileOpen: 'Open',
  fileEdit: 'Edit',
  filePreview: 'Preview',
  fileDownload: 'Download',
  fileDelete: 'Delete',
  fileDevMode: 'Dev Mode',
  fileDevModeOn: 'Dev Mode: ON',
  fileDevModeRequired: 'Enable Dev Mode to modify files.',
  fileDevModeConfirm:
    'After entering Dev Mode, you can upload, modify, or delete files. Incorrect changes may cause the system to fail, reboot endlessly, or behave unexpectedly. Please proceed carefully.',
  fileDeleteConfirm: 'Delete {path}?',
  fileUploadComplete: 'Upload completed',
  fileFolderCreated: 'Folder created',
  fileDeleteComplete: 'Delete completed',
  fileEditorTitle: 'Edit File',
  fileEditorRefresh: 'Refresh',
  fileEditorClose: 'Close',
  fileEditorSave: 'Save',
  fileEditorSaved: 'File saved',
  fileEditorLoadError: 'Failed to load file',
  fileEditorSaveError: 'Failed to save file',
  fileUnsupportedAction: '{action} is not supported for this file type.',
  fileSelectAndPath:
    'Select a file and provide a target path that starts with /.',
  fileFolderNameRequired: 'Enter a folder name.',
  setupEyebrow: 'First-Use Wizard',
  setupTitle: 'Finish Initial Device Setup',
  setupIntro: 'Configure LLM, IM, and web search in order. Each step can be skipped and completed later from the settings pages.',
  setupStepLabel: 'Step {index}',
  setupStepLlm: 'Configure LLM',
  setupStepLlmDesc: 'Connect a model backend first. Core agent features become available after reboot.',
  setupStepIm: 'Configure IM',
  setupStepImDesc: 'Fill in WeChat, Feishu, QQ, or Telegram credentials as needed. Leave unused ones blank.',
  setupStepSearch: 'Configure Web Search',
  setupStepSearchDesc: 'Optionally add online search keys to enable web search and built-in skills that depend on it.',
  setupStepDone: 'Finish And Restart',
  setupStepDoneDesc: 'Your configuration has been saved. Restart the device to reload everything.',
  setupSavedStep: 'Step saved',
  setupBack: 'Back',
  setupSkip: 'Skip',
  setupSkipHint: 'Skipping does not save changes on the current step.',
  setupSaveAndNext: 'Save and Continue',
  setupFinish: 'Save and Finish',
  setupLlmProviderBailian: 'Aliyun Bailian',
  setupLlmProviderClaude: 'Anthropic Claude',
  setupImAdd: 'Add',
  setupImAddPlatform: 'Add {platform}',
  setupImRemove: 'Remove',
  setupImEmpty: 'No IM platform added yet',
  setupImPickerHint:
    'Use the plus button to add the platforms you want to configure. The same platform cannot be added twice.',
  setupImAdded: 'All available platforms have been added.',
  setupWechatConfigured: 'WeChat is configured',
  setupWechatLoginRequired: 'WeChat was added. Complete the QR login before continuing.',
  setupRestartBanner: 'Setup is complete. A device restart is required for all changes to take effect.',
  setupRestartNow: 'Restart Now',
};

export type Dict = typeof en;
