export const dashboardEn = { processing: 'Processing...', executingWith: (action: string) => `Executing: ${action}`, executing: 'Nanobot is executing tools...', thinkingWith: (action: string) => `Thinking: ${action}`, thinking: 'Nanobot is thinking...', fileReadFail: 'Failed to read file.', workspaceLoadFail: 'Failed to load workspace tree.', channelSaved: 'Channel saved (effective after bot restart).', channelSaveFail: 'Failed to save channel.', channelAddFail: 'Failed to add channel.', channelDeleteConfirm: (channelType: string) => `Delete channel ${channelType}?`, channelDeleteFail: 'Failed to delete channel.', stopFail: 'Stop failed. Check backend logs.', startFail: 'Start failed. Check backend logs.', backendDeliverFail: 'Backend failed to deliver command.', sendFail: 'Send failed.', uploadFile: 'Upload file', uploadingFile: 'Uploading...', uploadFail: 'File upload failed.', attachmentAdded: (count: number) => `${count} attachment(s) added.`, uploadTooLarge: (files: string, limitMb: number) => `These files exceed the upload limit (${limitMb}MB): ${files}`, uploadTypeNotAllowed: (files: string, allowed: string) => `These files are not allowed to upload: ${files}. Allowed extensions: ${allowed}`, attachmentMessage: '[attachment message]', removeAttachment: 'Remove attachment', copyPrompt: 'Copy prompt', editPrompt: 'Edit prompt', copyPromptDone: 'Prompt copied.', copyPromptFail: 'Failed to copy prompt.', editPromptDone: 'Inserted into composer.', voiceInput: 'Voice input', textInput: 'Text input', voiceUnavailable: 'Speech recognition is disabled.', voiceUnsupported: 'Your browser does not support audio recording.', voicePermissionDenied: 'Microphone permission denied. Please allow access in browser settings.', voiceRecordFail: 'Audio recording failed. Please retry.', voiceReady: 'Click the mic to start recording', voiceRecording: 'Recording...', voiceTranscribing: 'Transcribing...', voiceStart: 'Start recording', voiceStop: 'Stop recording', voiceTranscribeDone: 'Voice converted to text.', voiceTranscribeEmpty: 'No valid speech detected.', voiceTranscribeFail: 'Speech transcription failed.', copyReply: 'Copy reply', copyReplyDone: 'Reply copied.', copyReplyFail: 'Failed to copy reply.', quoteReply: 'Quote reply', quotedReplyLabel: 'Quoted reply', clearQuote: 'Clear quote', quoteOnlyMessage: '[quoted reply]', goodReply: 'Good reply', badReply: 'Bad reply', feedbackUpSaved: 'Marked as good reply.', feedbackDownSaved: 'Marked as bad reply.', feedbackCleared: 'Feedback removed.', feedbackSaveFail: 'Failed to save feedback.', feedbackMessagePending: 'Message is not synced yet. Please retry in a moment.', sendFailMsg: (msg: string) => `Command delivery failed: ${msg}`, providerRequired: 'Set provider/model/new API key before testing.', connOk: (preview: string) => (preview ? `Connection passed, models: ${preview}` : 'Connection passed'), connFail: (msg: string) => `Failed: ${msg}`, configUpdated: 'Configuration updated (effective after bot restart).', saveFail: 'Save failed.', deleteBotConfirm: (id: string) => `Delete bot ${id}? Workspace will be removed.`, deleteBotDone: 'Bot and workspace deleted.', deleteFail: 'Delete failed.', titleBots: 'Bots', botSearchPlaceholder: 'Search by bot name or ID', botSearchNoResult: 'No matching bots.', workspaceSearchPlaceholder: 'Search by file name or path', workspaceSearchNoResult: 'No matching files or folders.', searchAction: 'Search', clearSearch: 'Clear search', syncingPageSize: 'Syncing page size...', paginationPrev: 'Prev', paginationNext: 'Next', paginationPage: (current: number, total: number) => `${current} / ${total}`, newBot: 'New Bot', manageImages: 'Image Manager', extensions: 'Extensions', templateManager: 'Template Manager', templateManagerTitle: 'Template Manager', templateTabAgent: 'Agent Templates', templateTabTopic: 'Topic Presets', templateAgentFile: 'Agent Templates (5 MD files)', templateTopicFile: 'Topic Presets Template (3 presets)', templateJsonHint: 'Edit JSON and save. New configurations will use the latest templates.', templateLoadFail: 'Failed to load templates.', templateSaveFail: 'Failed to save templates.', templateSaved: 'Templates saved.', batchStart: 'Batch Start', batchStop: 'Batch Stop', batchStartNone: 'No bots available for batch start.', batchStopNone: 'No bots available for batch stop.', batchStartConfirm: (count: number) => `Start ${count} bots in batch?`, batchStopConfirm: (count: number) => `Stop ${count} bots in batch?`, batchStartDone: (ok: number, fail: number) => `Batch start finished: ${ok} succeeded, ${fail} failed`, batchStopDone: (ok: number, fail: number) => `Batch stop finished: ${ok} succeeded, ${fail} failed`, templateAgentInvalid: 'Invalid agent template JSON.', templateTopicInvalid: 'Invalid topic preset JSON.', templateParseFail: 'Template JSON parse failed.', image: 'Image', disabled: 'Disabled', stop: 'Stop', start: 'Start', enable: 'Enable', disable: 'Disable', disableConfirm: (id: string) => `Disable bot ${id}? It will be stopped and locked from operations.`, enableDone: 'Bot enabled.', disableDone: 'Bot disabled and stopped.', enableFail: 'Enable failed. Check backend logs.', disableFail: 'Disable failed. Check backend logs.', restart: 'Restart Bot', restartConfirm: (id: string) => `Restart bot ${id}?`, restartFail: 'Restart failed. Check backend logs.', delete: 'Delete', noConversation: 'No conversation yet. Send a command and bot replies will appear here.', clearHistory: 'Clear history', clearHistoryConfirm: (name: string) => `Clear dashboard conversation history for ${name}?`, clearHistoryDone: 'Conversation history cleared.', clearHistoryFail: 'Failed to clear conversation history.', exportHistory: 'Export JSON', exportHistoryFail: 'Failed to export conversation.', you: 'You', user: 'User', inputPlaceholder: 'Type a command and press Enter (Shift+Enter for newline)', disabledPlaceholder: 'Bot is not running. Command input is disabled.', controlCommands: 'Control Commands', controlCommandsDesc: 'Send built-in nanobot slash commands', controlCommandNew: 'New session', controlCommandStop: 'Stop task', controlCommandRestart: 'Restart bot', controlCommandHelp: 'Show commands', controlCommandsShow: 'Show control commands', controlCommandsHide: 'Hide control commands', controlCommandSent: (command: string) => `Control command sent: ${command}`, sending: 'Sending...', send: 'Send', interrupt: 'Interrupt', interruptSent: 'Interrupt command sent.', botStarting: 'Bot is starting...', botStopping: 'Bot is stopping...', botDisabledHint: 'Bot is disabled. Enable it before operating.', chatDisabled: 'Bot is stopped. Chat area is disabled.', selectBot: 'Select a bot to inspect', runtime: 'Runtime Status', base: 'Base', params: 'Model', channels: 'Channels', topic: 'Topic', topicPanel: 'Topic Management', topicPanelDesc: 'Manage Topic routing targets. Only active topics receive deliveries; no topic means no feed.', topicActive: 'Active', topicName: 'Topic Name', topicDescription: 'Topic Description', topicPurpose: 'Purpose', topicIncludeWhen: 'Include When', topicExcludeWhen: 'Exclude When', topicExamplesPositive: 'Positive Examples', topicExamplesNegative: 'Negative Examples', topicPriority: 'Priority', topicListHint: 'One rule/example per line', topicFilterProgress: 'Filter progress system messages', topicFilterToolHint: 'Filter tool-hint system messages', topicSystemFilterHint: 'Recommended to keep enabled to avoid feed noise.', topicEmpty: 'No topics configured.', topicAdd: 'Add Topic', topicAddHint: 'Topic key must use lowercase letters, numbers, dot, underscore, or hyphen.', topicKey: 'Topic Key', topicKeyPlaceholder: 'e.g. finance_market', topicKeyRequired: 'Topic key is required.', topicSaved: 'Topic configuration saved.', topicSaveFail: 'Failed to save topic configuration.', topicDeleted: 'Topic deleted.', topicDeleteFail: 'Failed to delete topic.', topicDeleteConfirm: (topicKey: string) => `Delete topic ${topicKey}?`, topicPresetPolitics: 'Preset: Politics', topicPresetFinance: 'Preset: Finance', topicPresetTech: 'Preset: Tech', topicPresetBlank: 'Blank Topic', topicPresetPoliticsApplied: 'Applied preset: Politics News.', topicPresetFinanceApplied: 'Applied preset: Finance & Market.', topicPresetTechApplied: 'Applied preset: Tech Updates.', skills: 'Skills', mcp: 'MCP', tools: 'Tools', skillsPanel: 'Skills Panel', skillsEmpty: 'No skills.', addSkill: 'Add skill', removeSkill: 'Remove skill', uploadZipSkill: 'Upload ZIP Skill Pack', zipOnlyHint: 'Only .zip files are supported', invalidZipFile: 'Only .zip files are allowed', envParams: 'Env Params', envParamsDesc: 'Configure runtime env vars for this bot container.', noEnvParams: 'No env vars configured.', envKey: 'Key (e.g. BRAVE_API_KEY)', envValue: 'Value', showEnvValue: 'Show value', hideEnvValue: 'Hide value', addEnvParam: 'Add env var', removeEnvParam: 'Remove env var', envParamsSaved: 'Env params saved.', envParamsSaveFail: 'Failed to save env params.', envParamsHint: 'Restart bot to apply updated env vars.', mcpPanel: 'MCP Configuration', mcpPanelDesc: 'Configure MCP servers (HTTP/SSE) for this bot. Use dedicated X-Bot-Id / X-Bot-Secret per bot.', mcpEmpty: 'No MCP servers configured.', mcpServer: 'MCP Server', mcpName: 'Server Name', mcpNamePlaceholder: 'e.g. biz_mcp', mcpType: 'Transport Type', mcpUrlPlaceholder: 'e.g. http://mcp.internal:9001/mcp', mcpBotIdPlaceholder: 'e.g. mula_bot_b02', mcpBotSecretPlaceholder: 'Secret for this bot identity', mcpToolTimeout: 'Tool Timeout (seconds)', mcpDraftRequired: 'MCP server name and URL are required.', mcpDraftAdded: 'Added to the MCP list. Save config to apply.', addMcpServer: 'Add MCP Server', saveMcpConfig: 'Save MCP Config', mcpSaved: 'MCP config saved.', mcpSaveFail: 'Failed to save MCP config.', mcpHint: 'Restart bot to apply MCP changes.', toolsLoadFail: 'Failed to load tool skills.', toolsAddFail: 'Failed to add tool.', toolsRemoveFail: 'Failed to remove tool.', toolsRemoveConfirm: (name: string) => `Remove skill ${name}? This action cannot be undone.`, agent: 'Agent', container: 'Container', current: 'Current', lastAction: 'Last action', workspaceOutputs: 'Workspace', autoRefresh: 'Auto refresh', loadingDir: 'Loading directory...', emptyDir: 'Current directory is empty.', openingPreview: 'Opening file preview...', workspaceHint: 'Click folder to enter; click .md/.json to preview.', noPreviewFile: 'No previewable files in this directory.', noTelemetry: 'No telemetry selected', goUpTitle: 'Click to go up', goUp: 'Go up', openFolderTitle: 'Click to open folder', folder: 'Folder', previewTitle: 'Click to preview', fileNotPreviewable: 'File type not previewable', baseConfig: 'Base Configuration', accessPassword: 'Access Password', accessPasswordPlaceholder: 'Leave blank to disable password', botIdReadonly: 'Bot ID (Read-only)', botName: 'Bot Name', botNamePlaceholder: 'Bot name', baseImageReadonly: 'Base Image', modelName: 'Model Name', modelNamePlaceholder: 'e.g. qwen-plus', newApiKey: 'New API Key (optional)', newApiKeyPlaceholder: 'Only updated when filled', testing: 'Testing...', testModelConnection: 'Test model connection', cancel: 'Cancel', save: 'Save', modelParams: 'Model', saveParams: 'Save Params', agentFiles: 'Agent Files', saveFiles: 'Save Files', filePreview: 'File Preview', editFile: 'Edit Markdown', previewMode: 'Preview Mode', fileTruncated: 'Large file: preview is truncated.', fileEditDisabled: 'Truncated previews cannot be edited directly.', fileSaved: 'Markdown saved.', fileSaveFail: 'Failed to save markdown.', download: 'Download', copyAddress: 'Copy URL', urlCopied: 'URL copied.', urlCopyFail: 'Failed to copy URL.', close: 'Close', cronViewer: 'Scheduled Jobs', cronReload: 'Reload jobs', cronLoading: 'Loading jobs...', cronEmpty: 'No scheduled jobs.', cronEnabled: 'Enabled', cronDisabled: 'Disabled', cronStart: 'Enable job', cronStop: 'Stop job', cronDelete: 'Delete job', cronStartFail: 'Failed to enable job.', cronStopFail: 'Failed to stop job.', cronDeleteFail: 'Failed to delete job.', cronDeleteConfirm: (id: string) => `Delete scheduled job ${id}?`, };