dashboard-nanobot/frontend/src/i18n/dashboard.en.ts

292 lines
12 KiB
TypeScript

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}?`,
};