const enUS = { sidebar: { home: 'Home', extensions: 'Extensions', installedPlugins: 'Installed', pluginMarket: 'Extension Market', mcpServers: 'MCP Servers', addExtension: 'Add Extension', pluginPages: 'Plugin Pages', pluginPagesTooltip: 'Visual pages provided by installed plugins', quickStart: 'Quick Start', scrollToBottom: 'Scroll to bottom', editionCommunity: 'Community', editionCloud: 'Cloud', }, common: { login: 'Login', logout: 'Logout', accountOptions: 'Settings', account: 'Account', integration: 'Integration', email: 'Email', password: 'Password', welcome: 'Welcome back to LangBot 👋', continueToLogin: 'Login to continue', loginSuccess: 'Login successful', loginFailed: 'Login failed, please check your email and password', loginLoadError: 'Unable to connect to server', loginLoadErrorDesc: 'Unable to connect to the LangBot backend. Please make sure the service is running and try again.', retry: 'Retry', enterEmail: 'Enter email address', enterPassword: 'Enter password', invalidEmail: 'Please enter a valid email address', emptyPassword: 'Please enter your password', language: 'Language', helpDocs: 'Get Help', featureRequest: 'Feedback', starOnGitHub: 'Star on GitHub', joinDiscord: 'Join our Discord', create: 'Create', edit: 'Edit', delete: 'Delete', add: 'Add', select: 'Select', skill: 'Skill', cancel: 'Cancel', submit: 'Submit', error: 'Error', success: 'Success', save: 'Save', saving: 'Saving...', recommend: 'Recommended', start: 'Start', confirm: 'Confirm', confirmDelete: 'Confirm Delete', deleteConfirmation: 'Are you sure you want to delete this?', selectOption: 'Select an option', selectPreset: 'Select Preset', required: 'Required', enable: 'Enable', name: 'Name', description: 'Description', icon: 'Icon', close: 'Close', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', addRound: 'Add Round', copy: 'Copy', copySuccess: 'Copy Successfully', copyFailed: 'Copy Failed', test: 'Test', forgotPassword: 'Forgot Password?', agreementNotice: 'By continuing, you agree to our', termsOfService: 'Terms of Service', privacyPolicy: 'Privacy Policy', and: 'and', dataCollectionPolicy: 'Data Collection Policy', dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy', loading: 'Loading...', fieldRequired: 'This field is required', or: 'or', loginWithSpace: 'Login with Space', spaceLoginRecommended: 'Recommended: Use official stable model APIs and cloud services', loginLocal: 'Login with local account', loginWithPassword: 'Login with password', spaceLoginTitle: 'Login with Space', spaceLoginDescription: 'Scan the QR code or visit the link below to authorize', spaceLoginUserCode: 'Your code', spaceLoginExpires: 'Code expires in {{seconds}} seconds', spaceLoginWaiting: 'Waiting for authorization...', spaceLoginSuccess: 'Authorization successful', spaceLoginFailed: 'Space login failed', spaceLoginExpired: 'Authorization code expired, please try again', spaceLoginCancel: 'Cancel', spaceLoginVisitLink: 'Visit link', spaceLoginProcessing: 'Logging in with Space', spaceLoginProcessingDescription: 'Please wait while we complete your login...', spaceLoginSuccessDescription: 'Redirecting to LangBot...', spaceLoginError: 'Login Failed', spaceLoginNoCode: 'Missing authorization code', backToLogin: 'Back to Login', backToHome: 'Back to Home', spaceAccountCannotChangePassword: 'Space accounts cannot change password here', theme: 'Theme', changePassword: 'Change Password', currentPassword: 'Current Password', newPassword: 'New Password', confirmNewPassword: 'Confirm New Password', enterCurrentPassword: 'Enter current password', enterNewPassword: 'Enter new password', enterConfirmPassword: 'Confirm new password', currentPasswordRequired: 'Current password is required', newPasswordRequired: 'New password is required', confirmPasswordRequired: 'Confirm password is required', passwordsDoNotMatch: 'Passwords do not match', changePasswordSuccess: 'Password changed successfully', changePasswordFailed: 'Failed to change password, please check your current password', apiIntegration: 'API Integration', apiIntegrationDescription: 'Manage API keys and webhooks for external access', apiKeys: 'API Keys', manageApiIntegration: 'Manage API Integration', manageApiKeys: 'Manage API Keys', createApiKey: 'Create API Key', apiKeyName: 'API Key Name', apiKeyDescription: 'API Key Description', apiKeyValue: 'API Key Value', apiKeyCreated: 'API key created successfully', apiKeyDeleted: 'API key deleted successfully', apiKeyDeleteConfirm: 'Are you sure you want to delete this API key?', apiKeyNameRequired: 'API key name is required', copyApiKey: 'Copy API Key', apiKeyCopied: 'API key copied to clipboard', noApiKeys: 'No API keys configured', apiKeyHint: 'API keys allow external systems to access LangBot Service APIs', mcpTab: 'MCP', mcpHint: 'LangBot exposes an MCP (Model Context Protocol) server so AI agents can manage this instance. It uses the same API keys as the Service API.', mcpEndpoint: 'MCP Endpoint', mcpAuthTitle: 'Authentication', mcpAuthDesc: 'Authenticate with any API key from the API Keys tab, sent as a header:', mcpGlobalKeyNote: 'You can also set a global API key in config.yaml (api.global_api_key) to use without logging in.', mcpClientConfigTitle: 'Example MCP client config', webhooks: 'Webhooks', createWebhook: 'Create Webhook', webhookName: 'Webhook Name', webhookUrl: 'Webhook URL', webhookDescription: 'Webhook Description', webhookEnabled: 'Enabled', webhookCreated: 'Webhook created successfully', webhookDeleted: 'Webhook deleted successfully', webhookDeleteConfirm: 'Are you sure you want to delete this webhook?', webhookNameRequired: 'Webhook name is required', webhookUrlRequired: 'Webhook URL is required', noWebhooks: 'No webhooks configured', webhookHint: 'Webhooks allow LangBot to push person and group message events to external systems', actions: 'Actions', apiKeyCreatedMessage: 'Please copy this API key, if the button is invalid, please copy manually.', none: 'None', more: 'More ({{count}})', less: 'Less', noItems: 'No items', }, notFound: { title: 'Page not found', description: 'The page you are looking for does not exist.', back: 'Back', home: 'Home', help: 'Get Help', }, models: { title: 'Models', description: 'Configure and manage models that can be used in pipelines', createModel: 'Create Model', editModel: 'Edit Model', getModelListError: 'Failed to get model list: ', modelName: 'Model Name', modelProvider: 'Model Provider', modelBaseURL: 'Base URL', modelAbilities: 'Model Abilities', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', createSuccess: 'Created successfully', createError: 'Creation failed: ', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', deleteConfirmation: 'Are you sure you want to delete this model?', modelNameRequired: 'Model name cannot be empty', modelProviderRequired: 'Model provider cannot be empty', requestURLRequired: 'Request URL cannot be empty', apiKeyRequired: 'API Key cannot be empty', keyNameRequired: 'Key name cannot be empty', mustBeValidNumber: 'Must be a valid number', mustBeTrueOrFalse: 'Must be true or false', requestURL: 'Request URL', scanURL: 'Scan Models URL', scanURLPlaceholder: 'Leave empty to use Request URL + /models', scanURLDescription: 'Fill in the actual model-list endpoint when model scanning does not use the same address as model invocation.', apiKey: 'API Key', abilities: 'Abilities', selectModelAbilities: 'Select model abilities', visionAbility: 'Vision Ability', functionCallAbility: 'Function Call', contextLength: 'Context Window', contextLengthPlaceholder: 'Unknown', contextLengthInvalid: 'Context window must be a positive integer', extraParameters: 'Extra Parameters', addParameter: 'Add Parameter', keyName: 'Key Name', type: 'Type', value: 'Value', string: 'String', number: 'Number', boolean: 'Boolean', object: 'Object', objectJsonPlaceholder: '{ "type": "disabled" }', invalidJsonObject: 'Value must be a valid JSON object', selectModelProvider: 'Select Model Provider', modelProviderDescription: 'Please fill in the model name provided by the provider', modelManufacturer: 'Model Manufacturer', aggregationPlatform: 'Aggregation Platform', selfDeployed: 'Self-deployed', builtin: 'Built-in', selectModel: 'Select Model', testSuccess: 'Test successful', testError: 'Test failed, please check your model configuration', llmModels: 'LLM Models', localProvider: 'Local', localProviderDescription: 'Models configured and managed locally', spaceProviderDescription: 'Models synced from your Space account', spaceDisabledForLocalAccount: 'Login with Space to use cloud models', syncModels: 'Sync', syncSuccess: 'Sync complete: {{created}} created, {{updated}} updated', syncError: 'Sync failed: ', spaceModelReadOnly: 'Space models are read-only', noSpaceModels: 'No Space models. Click Sync to fetch models from Space.', noLocalModels: 'No local models. Click Create to add a model.', providerCount: '{{count}} providers', // New keys for provider-based structure addModel: 'Add Model', manualAdd: 'Manual', scanAdd: 'Scan', scanModels: 'Scan Models', scanModelsHint: 'Read available models from the current provider, then select which ones to add.', scannedModels: 'Scanned Models', scanDebug: 'Debug Info', searchScannedModels: 'Search scanned models', noScannedModels: 'No scan results yet. Click the button above to scan.', noScannedModelsMatch: 'No matching models', addSelectedModels: 'Add Selected', addSelectedModelsSuccess: '{{count}} model(s) added', selectAll: 'Select All', alreadyAdded: 'Already added', addLLMModel: 'Add LLM Model', addEmbeddingModel: 'Add Embedding Model', provider: 'Provider', existingProvider: 'Existing Provider', newProvider: 'New Provider', selectProvider: 'Select Provider', requester: 'Provider Type', selectRequester: 'Select Provider Type', searchProviders: 'Search providers...', langbotModelsDescription: 'Cloud models powered by LangBot Space', credits: 'Credits', loginWithSpace: 'Login with Space', loginToUseModels: 'Login with Space to use cloud models', noModels: 'No models configured', langbotModels: 'LangBot Models', spaceTrialTooltip: 'Free trial credits available! Login with Space to access cloud models with zero configuration.', unlockModels: 'Login to use', editProvider: 'Edit Provider', addProvider: 'Add Provider', addProviderHint: 'Add providers to use models from other sources', addProviderHintSimple: 'Add providers to use models', noProviders: 'No providers yet', providerName: 'Provider Name', providerNameRequired: 'Provider name is required', requesterRequired: 'Provider type is required', providerSaved: 'Provider saved', providerCreated: 'Provider created', providerSaveError: 'Failed to save provider: ', providerDeleted: 'Provider deleted', providerDeleteError: 'Failed to delete provider: ', deleteProviderConfirmation: 'Are you sure you want to delete this provider?', loadError: 'Failed to load data', chat: 'Chat', embedding: 'Embedding', rerank: 'Rerank', rerankUrlTooltip: 'Full URL override for rerank endpoint (e.g. https://dashscope.aliyuncs.com/compatible-api/v1/reranks)', rerankPathTooltip: 'Path appended to base URL (default: rerank)', modelsCount: '{{count}} model(s)', expandModels: 'Expand', collapseModels: 'Collapse', fallback: { primary: 'Primary Model', fallbackList: 'Fallback Models', addFallback: 'Add Fallback Model', }, }, bots: { title: 'Bots', description: 'Create and manage bots, which are the entry points for LangBot to connect with various platforms', createBot: 'Create Bot', selectFromSidebar: 'Select a bot from the sidebar', editBot: 'Edit Bot', getBotListError: 'Failed to get bot list: ', botName: 'Bot Name', botDescription: 'Bot Description', botNameRequired: 'Bot name cannot be empty', botDescriptionRequired: 'Bot description cannot be empty', adapterRequired: 'Adapter cannot be empty', defaultDescription: 'A bot', getBotConfigError: 'Failed to get bot configuration: ', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', createSuccess: 'Created successfully. Please configure event routing', createError: 'Creation failed: ', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', deleteConfirmation: 'Are you sure you want to delete this bot?', platformAdapter: 'Platform/Adapter Selection', selectAdapter: 'Select Adapter', legacyAdapters: 'Legacy adapters', legacyAdapterBadge: 'Legacy', legacyAdaptersHint: 'These adapters have newer event-driven counterparts. They are kept only for existing configurations and are not recommended for new bots.', adapterConfig: 'Adapter Configuration', viewAdapterDocs: 'View Docs', bindPipeline: 'Bind Pipeline', selectPipeline: 'Select Pipeline', selectBot: 'Select Bot', botLogTitle: 'Bot Log', enableAutoRefresh: 'Enable Auto Refresh', session: 'Session', yesterday: 'Yesterday', earlier: 'Earlier', dateFormat: '{{month}}/{{day}}', setBotEnableError: 'Failed to set bot enable status', log: 'Log', configuration: 'Configuration', logs: 'Logs', basicInfo: 'Basic Information', basicInfoDescription: 'Set the bot name and description', routingConnection: 'Routing & Connection', routingConnectionDescription: 'Bind the pipeline that processes messages for this bot', eventRouting: 'Event Routing', eventRoutingDescription: 'Choose which processor handles each event received by this bot. Edit the processing logic on the Agent page. Pipelines only support message events.', eventBindings: 'Event Routes', addEventBinding: 'Add Route', eventPattern: 'Event', eventPatternPlaceholder: 'Select event', targetType: 'Target Type', target: 'Processor', targetAgent: 'Agent', targetPipeline: 'Pipeline', targetDiscard: 'Discard', selectTarget: 'Select processor', searchTarget: 'Search processors…', noTargetFound: 'No compatible processors found', priority: 'Priority', enabled: 'Enabled', eventBindingDescriptionPlaceholder: 'Rule description', noEventBindings: 'No event routes', unsupportedPipelineEvent: 'Pipelines can only be used for message.* events', disable: 'Disable', enable: 'Enable', disabledBindings: 'Disabled', eventCustom: 'Custom event', eventWildcard: 'All events', eventNamespaceWildcard: '{{namespace}}.*', eventNames: { message_received: 'Message received', message_edited: 'Message edited', message_deleted: 'Message deleted', message_reaction: 'Message reaction', feedback_received: 'Feedback received', friend_request_received: 'Friend request received', friend_added: 'Friend added', group_member_joined: 'Member joined group', group_member_left: 'Member left group', group_member_banned: 'Member banned', bot_invited_to_group: 'Bot invited to group', bot_removed_from_group: 'Bot removed from group', bot_muted: 'Bot muted', bot_unmuted: 'Bot unmuted', platform_specific: 'Platform-specific event', }, conditions: 'Conditions', conditionsDescription: 'All conditions must match to trigger this binding. Leave empty to always trigger.', conditionsEmpty: 'No conditions — always triggers.', addFilter: 'Add condition', filterChatType: 'Session type', filterChatId: 'Session ID', filterMessageText: 'Message text', filterMessageElement: 'Message element', operator_eq: 'equals', operator_neq: 'not equals', operator_contains: 'contains', operator_not_contains: 'not contains', operator_starts_with: 'starts with', operator_regex: 'regex', routingRules: 'Conditional Routing Rules', routingRulesDescription: 'Rules are evaluated in order; first match routes to its pipeline. Fallback to the default pipeline above if none match.', addRoutingRule: 'Add Rule', ruleTypeLauncherType: 'Session Type', ruleTypeLauncherId: 'Session ID', ruleTypeMessageContent: 'Message Content', operatorEq: 'Equals', operatorNeq: 'Not Equals', operatorContains: 'Contains', operatorNotContains: 'Not Contains', operatorStartsWith: 'Starts With', operatorRegex: 'Regex', operatorHas: 'Has', operatorNotHas: 'Does not have', ruleTypeMessageHasElement: 'Message Element', ruleValueElementPlaceholder: 'Select element type', elementImage: 'Image', elementVoice: 'Voice', elementFile: 'File', elementForward: 'Forward', elementFace: 'Emoji', elementAt: '@Mention', elementAtAll: '@All', elementQuote: 'Quote', ruleValuePlaceholder: 'Match value', ruleValueLauncherIdPlaceholder: 'Group or user ID', ruleValueMessagePlaceholder: 'Message text', ruleValuePrefixPlaceholder: 'e.g. !draw', ruleValueRegexpPlaceholder: 'e.g. ^/help', pipelineDiscard: 'Discard Message', sessionTypePerson: 'Private Chat', sessionTypeGroup: 'Group Chat', adapterConfigDescription: 'Configure the selected platform adapter', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', deleteBotAction: 'Delete this bot', deleteBotHint: 'Once deleted, all associated configuration will be permanently removed.', webhookUrl: 'Webhook Callback URL', webhookUrlCopied: 'Webhook URL copied', webhookUrlHint: 'Click the input to select all, then press Ctrl+C (Mac: Cmd+C) to copy, or click the button', webhookUrlHintEither: 'Use either of the two URLs above in your platform configuration', webhookSaasHint: 'Webhook requires a publicly accessible domain. LangBot Cloud provides a ready-to-use public endpoint for your bot.', webhookSaasLink: 'Learn more about LangBot Cloud', adapterCategory: { popular: 'Popular', china: 'China', global: 'Global', protocol: 'Protocol', }, logLevel: 'Log Level', allLevels: 'All Levels', selectLevel: 'Select Level', levelsSelected: 'levels selected', viewDetailedLogs: 'View Detailed Logs', viewDetails: 'Details', collapse: 'Collapse', imagesAttached: 'image(s) attached', noLogs: 'No logs yet', sessionMonitor: { title: 'Sessions', sessions: 'Sessions', noSessions: 'No sessions found', selectSession: 'Select a session to view messages', noMessages: 'No messages in this session', messages: 'messages', messageCount: '{{count}} messages', loading: 'Loading...', loadingSessions: 'Loading sessions...', loadingMessages: 'Loading messages...', user: 'User', variables: 'Variables', platform: 'Platform', lastActive: 'Last active', refresh: 'Refresh', active: 'Active', inactive: 'Inactive', discarded: 'Discarded', userMessage: 'User', botMessage: 'Assistant', }, admins: { title: 'Admins', description: "Launchers (person/group IDs) that have admin privilege for this bot's commands", addAdmin: 'Add Admin', launcherType: 'Type', launcherId: 'ID', typePerson: 'Person', typeGroup: 'Group', placeholderId: 'User or group ID', addSuccess: 'Admin added', addError: 'Failed to add admin: ', deleteSuccess: 'Admin removed', deleteError: 'Failed to remove admin: ', noAdmins: 'No admins configured', setAdminTitle: 'Set as admin', adminBadge: 'Admin', configureAdmins: 'Manage Admins', removeAdminTitle: 'Remove admin', }, }, agents: { title: 'Agent', description: 'Create reusable processors and use them in bot event routing', create: 'Create Processor', editAgent: 'Edit Agent', selectFromSidebar: 'Select an Agent or Pipeline from the sidebar', agentType: 'Agent', agentTypeDescription: 'Use a runner to handle messages, group members, friends, feedback, and other platform events.', pipelineType: 'Pipeline', kindBadgeAgent: 'Agent', kindBadgePipeline: 'Pipeline', groupByKind: 'Group by type', groupByKindShort: 'Group', pipelineTypeDescription: 'Keep the existing no-code message pipeline for backward compatibility. It only handles message events.', allEvents: 'Supports all events', messageEventsOnly: 'Message events only', basicInfo: 'Basic Information', basicInfoDescription: 'Set the name, icon, description and enabled state', runnerSettings: 'Runner', advanced: 'Advanced', bindableEvents: 'Bindable Event Range', bindableEventsDescription: 'Limit which bot event routes can select this Agent. The default is suitable for most cases.', supportedEvents: 'Event Range', supportedEventsDescription: 'Use one event pattern per line, for example *, message.received, group.*. Pipelines are fixed to message.*.', enabled: 'Enable Agent', enabledDescription: 'When disabled, this Agent should not be selected by event routing.', nameRequired: 'Name cannot be empty', createSuccess: 'Created successfully', createError: 'Creation failed: ', loadError: 'Load failed: ', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', deleteConfirmation: 'Are you sure you want to delete this Agent?', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', deleteAgentAction: 'Delete this Agent', deleteAgentHint: 'Once deleted, events bound to it can no longer be executed.', noRunnerMetadata: 'No AgentRunner metadata is currently available.', }, plugins: { title: 'Extensions', description: 'Install and configure plugins to extend functionality, please select them in the pipeline configuration', createPlugin: 'Create Plugin', editPlugin: 'Edit Plugin', installed: 'Installed', marketplace: 'Extension Market', arrange: 'Sort Plugins', install: 'Install', installPlugin: 'Install Plugin', newPlugin: 'New Plugin', onlySupportGithub: 'Currently only supports installation from GitHub', enterGithubLink: 'Enter GitHub link of the plugin', installing: 'Installing plugin...', installSuccess: 'Plugin installed successfully', installFailed: 'Plugin installation failed:', searchPlugin: 'Search plugins', sortBy: 'Sort by', mostStars: 'Most stars', recentlyAdded: 'Recently added', recentlyUpdated: 'Recently updated', noMatchingPlugins: 'No matching plugins found', loading: 'Loading...', getPluginListError: 'Failed to get plugin list:', noPluginInstalled: 'No plugins installed', noExtensionInstalled: 'No extensions installed', loadingExtensions: 'Loading extensions...', groupByType: 'Group by format', groupByTypeShort: 'Group', pluginConfig: 'Plugin Configuration', pluginSort: 'Plugin Sort', pluginSortDescription: 'Plugin order affects the processing order within the same event, please drag the plugin card to sort', pluginSortSuccess: 'Plugin sort successful', pluginSortError: 'Plugin sort failed: ', pluginNoConfig: 'The plugin has no configuration items.', systemDisabled: 'Plugin System Disabled', systemDisabledDesc: 'Plugin system is not enabled, please modify the configuration according to the documentation', connectionError: 'Plugin System Connection Error', connectionErrorDesc: 'Please check the plugin system configuration or contact the administrator.', errorDetails: 'Error Details', loadingStatus: 'Checking plugin system status...', failedToGetStatus: 'Failed to get plugin system status', pluginSystemNotReady: 'Plugin system is not ready, cannot perform this operation', debugInfo: 'Debug Info', debugInfoTitle: 'Plugin Debug Information', debugUrl: 'Debug URL', debugKey: 'Debug Key', noDebugKey: '(Not Set)', debugKeyDisabled: 'Debug key is not set, plugin debugging does not require authentication', boxStatusTitle: 'Box Runtime', boxStatus: 'Status', boxConnected: 'Connected', boxUnavailable: 'Unavailable', boxBackend: 'Backend', boxProfile: 'Profile', boxSandboxes: 'Sandboxes', boxErrors: 'Errors', boxSessionImage: 'Image', boxSessionBackend: 'Backend', boxSessionResources: 'Resources', boxSessionNetwork: 'Network', boxStatusLoadFailed: 'Failed to load Box status', failedToGetDebugInfo: 'Failed to get debug information', copiedToClipboard: 'Copied to clipboard', deleting: 'Deleting...', deletePlugin: 'Delete Plugin', cancel: 'Cancel', saveConfig: 'Save Config', saving: 'Saving...', confirmDeletePlugin: 'Are you sure you want to delete the plugin ({{author}}/{{name}})?', deleteDataCheckbox: 'Also delete plugin configuration and persistence storage', confirmDelete: 'Confirm Delete', deleteError: 'Delete failed: ', close: 'Close', deleteConfirm: 'Delete Confirmation', deleteSuccess: 'Delete successful', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', modifyFailed: 'Modify failed: ', componentName: { Tool: 'Tool', EventListener: 'Event Listener', Command: 'Command', KnowledgeEngine: 'Knowledge Engine', Parser: 'Parser', Page: 'Page', AgentRunner: 'Agent Runner', }, uploadLocal: 'Upload Local', debugging: 'Debugging', uploadLocalPlugin: 'Upload Local Plugin', localPreview: { title: 'Preview Local Plugin Package', unpacking: 'Unpacking package preview...', unpackComplete: 'Package preview ready', failed: 'Failed to preview package', pluginInfo: 'Plugin Info', packageInfo: 'Package Info', name: 'Name', author: 'Author', version: 'Version', fileCount: 'Files', dependencies: 'Dependencies', components: 'Components', ready: 'The plugin package is unpacked. Confirm to start installation.', }, uploadPluginOnly: 'Only .lbpkg files are supported', dragToUpload: 'Drag plugin file here to upload', unsupportedFileType: 'Unsupported file type, only .lbpkg files are supported', uploadingPlugin: 'Uploading plugin...', uploadSuccess: 'Upload successful', uploadFailed: 'Upload failed', selectFileToUpload: 'Select plugin file to upload', askConfirm: 'Are you sure to install plugin "{{name}}" ({{version}})?', askConfirmNoVersion: 'Are you sure to install plugin "{{name}}"?', fromGithub: 'From GitHub', fromLocal: 'From Local', fromMarketplace: 'From Marketplace', componentsList: 'Components: ', noComponents: 'No components', delete: 'Delete Plugin', update: 'Update Plugin', new: 'New', updateConfirm: 'Update Confirmation', confirmUpdatePlugin: 'Are you sure you want to update the plugin ({{author}}/{{name}})?', confirmUpdate: 'Confirm Update', updating: 'Updating...', updateSuccess: 'Plugin updated successfully', updateError: 'Update failed: ', saveConfigSuccessNormal: 'Configuration saved successfully', saveConfigError: 'Configuration save failed: ', config: 'Configuration', readme: 'Documentation', viewSource: 'View Source', loadingReadme: 'Loading documentation...', noReadme: 'This plugin does not provide README documentation', tabDocs: 'Documentation', tabLogs: 'Logs', logsLevelAll: 'All levels', logsRefresh: 'Refresh', logsAutoRefresh: 'Auto-refresh', logsEmpty: 'No logs yet. Logs printed by the plugin via logger will appear here.', fileUpload: { tooLarge: 'File size exceeds 10MB limit', success: 'File uploaded successfully', failed: 'File upload failed', uploading: 'Uploading...', chooseFile: 'Choose File', addFile: 'Add File', }, installFromGithub: 'From GitHub', enterRepoUrl: 'Enter GitHub repository URL', repoUrlPlaceholder: 'e.g., https://github.com/owner/repo', fetchingReleases: 'Fetching releases...', selectRelease: 'Select Release', noReleasesFound: 'No releases found', fetchReleasesError: 'Failed to fetch releases: ', selectAsset: 'Select file to install', noAssetsFound: 'No .lbpkg files available in this release', fetchAssetsError: 'Failed to fetch assets: ', backToReleases: 'Back to releases', backToRepoUrl: 'Back to repository URL', backToAssets: 'Back to assets', releaseTag: 'Tag: {{tag}}', releaseName: 'Name: {{name}}', publishedAt: 'Published at: {{date}}', prerelease: 'Pre-release', assetSize: 'Size: {{size}}', confirmInstall: 'Confirm Install', installFromGithubDesc: 'Install plugin from GitHub Release', goToMarketplace: 'Go to Extension Market', installProgress: { title: 'Installing {{name}}', titleGeneric: 'Extension Installation', titlePlugin: 'Installing Plugin {{name}}', titleMCP: 'Installing MCP Server {{name}}', titleSkill: 'Installing Skill {{name}}', overallProgress: 'Overall Progress', downloading: 'Downloading', installingDeps: 'Installing Dependencies', initializing: 'Initializing Settings', launching: 'Launching', completed: 'Completed', failed: 'Failed', downloadSize: 'Package size: {{size}}', depsInfo: '{{count}} dependencies to install', depsProgress: '{{installed}}/{{total}} installed · {{remaining}} remaining', installComplete: 'Installation successful', installCompletePlugin: 'Plugin installed successfully', installCompleteMCP: 'MCP Server installed successfully', installCompleteSkill: 'Skill installed successfully', dismiss: 'Dismiss', background: 'Run in Background', taskQueue: 'Install Tasks', clearCompleted: 'Clear Completed', noTasks: 'No install tasks', }, }, market: { searchPlaceholder: 'Search plugins...', searchPlaceholderCount: 'Search {{count}} extensions, capabilities, or use cases...', searchResults: 'Found {{count}} extensions', totalPlugins: 'Total {{count}} extensions', noPlugins: 'No plugins available', noResults: 'No relevant plugins found', loadingMore: 'Loading more...', loading: 'Loading...', allLoaded: 'All plugins displayed', allLoadedCount: 'All {{count}} extensions displayed', install: 'Install', installCard: 'Install {{name}}', installConfirm: 'Are you sure you want to install plugin "{{name}}" ({{version}})?', downloadComplete: 'Plugin "{{name}}" download completed', installFailed: 'Installation failed, please try again later', loadFailed: 'Failed to get plugin list, please try again later', noDescription: 'No description available', recommendation: { pause: 'Pause auto-rotation', resume: 'Resume auto-rotation', }, notFound: 'Plugin information not found', sortBy: 'Sort by', sort: { recentlyAdded: 'Recently Added', recentlyUpdated: 'Recently Updated', mostDownloads: 'Most Downloads', leastDownloads: 'Least Downloads', }, downloads: 'downloads', download: 'Download', repository: 'Repository', downloadFailed: 'Download failed', noReadme: 'This plugin does not provide README documentation', description: 'Description', tagLabel: 'Tags', submissionTitle: 'You have a plugin submission under review: {{name}}', submissionPending: 'Your plugin submission is under review: {{name}}', submissionApproved: 'Your plugin submission has been approved: {{name}}', submissionRejected: 'Your plugin submission has been rejected: {{name}}', clickToRevoke: 'Revoke', revokeSuccess: 'Revoke success', revokeFailed: 'Revoke failed', submissionDetails: 'Plugin Submission Details', markAsRead: 'Mark as Read', markAsReadSuccess: 'Marked as read', markAsReadFailed: 'Mark as read failed', filterByComponent: 'Plugin Component', filterByComponentHint: 'The capability types a plugin provides — Tool, Command, EventListener, etc. — used to extend LangBot in various ways. Filter by component to show only plugins offering that capability.', allComponents: 'All Components', componentName: { Tool: 'Tool', EventListener: 'Event Listener', Command: 'Command', KnowledgeEngine: 'Knowledge Engine', Parser: 'Parser', Page: 'Page', AgentRunner: 'Agent Runner', }, filterByType: 'Type', allTypes: 'All Types', typePlugin: 'Plugin', typeMCP: 'MCP', typeSkill: 'Skill', requestPlugin: 'Request Plugin', viewDetails: 'View Details', deprecated: 'Deprecated', deprecatedTooltip: 'Please install the corresponding Knowledge Engine plugin.', filters: { allFormats: 'All formats', more: 'Filters', advancedTitle: 'Advanced filters', advancedDescription: 'Most users do not need these. Use them only when you know the extension format you want.', technicalType: 'Extension format', }, allExtensions: 'All Extensions', tags: { filterByTags: 'Filter by Tags', selected: 'selected', selectTags: 'Select Tags', clearAll: 'Clear All', noTags: 'No tags available', }, }, mcp: { title: 'MCP', createServer: 'Add MCP Server', addMCPServer: 'Add MCP Server', editServer: 'Edit MCP Server', deleteServer: 'Delete MCP Server', confirmDeleteServer: 'Are you sure you want to delete this MCP server?', confirmDeleteTitle: 'Delete MCP Server', getServerListError: 'Failed to get MCP server list: ', serverName: 'Server Name', serverMode: 'Connection Mode', selectMode: 'Select Mode', stdio: 'Stdio Mode', sse: 'SSE Mode', http: 'HTTP Mode', local: 'Local (Stdio)', remote: 'Remote', localModeDescription: 'Run an MCP server locally as a subprocess inside the Box sandbox.', remoteModeDescription: 'Connect to a remote MCP server by URL. The transport (Streamable HTTP or SSE) is detected automatically.', remoteUrlPlaceholder: 'https://example.com/mcp', remoteUrlDescription: 'Paste the MCP server URL. Both Streamable HTTP and legacy SSE endpoints are supported.', noServerInstalled: 'No MCP servers configured', serverNameRequired: 'Server name cannot be empty', commandRequired: 'Command cannot be empty', urlRequired: 'URL cannot be empty', timeoutMustBePositive: 'Timeout must be a positive number', command: 'Command', args: 'Arguments', env: 'Environment Variables', url: 'URL', headers: 'Headers', timeout: 'Timeout', addArgument: 'Add Argument', addEnvVar: 'Add Environment Variable', addHeader: 'Add Header', keyName: 'Key Name', value: 'Value', testing: 'Testing...', connecting: 'Connecting...', testSuccess: 'Test successful', testFailed: 'Test failed: ', testError: 'Test error', refreshSuccess: 'Refresh successful', refreshFailed: 'Refresh failed: ', connectionSuccess: 'Connection successful', connectionFailed: 'Connection failed, please check URL', connectionFailedStatus: 'Connection Failed', boxDisabledStdioRefused: 'Stdio MCP servers require the Box sandbox, which is disabled in config (box.enabled = false).', boxUnavailableStdioRefused: 'Stdio MCP servers require the Box sandbox, which is currently unreachable.', boxStdioRefusedSuggestion: 'Enable Box (box.enabled = true) and ensure the runtime is healthy, or switch this server to http/sse mode.', boxRequired: 'requires Box', stdioBlockedByBoxToast: 'Stdio MCP cannot be saved while the Box sandbox is disabled or unreachable. Enable Box or pick http/sse.', toolsFound: 'tools', unknownError: 'Unknown error', noToolsFound: 'No tools found', noResourcesFound: 'No resources found', tabTools: 'Tools', tabResources: 'Resources', tabDocs: 'Docs', tabLogs: 'Logs', logsLevelAll: 'All levels', logsRefresh: 'Refresh', logsAutoRefresh: 'Auto refresh', logsEmpty: 'No logs yet. Runtime logs from the MCP server will appear here.', noReadme: 'No documentation available', parseResultFailed: 'Failed to parse test result', noResultReturned: 'Test returned no result', getTaskFailed: 'Failed to get task status', noTaskId: 'No task ID obtained', deleteSuccess: 'Deleted successfully', deleteFailed: 'Delete failed: ', deleteError: 'Delete failed: ', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', createSuccess: 'Created successfully', createFailed: 'Creation failed: ', createError: 'Creation failed: ', loadFailed: 'Load failed', modifyFailed: 'Modify failed: ', toolCount: 'Tools: {{count}}', parameterCount: 'Parameters: {{count}}', noParameters: 'No parameters', resourceCount: 'Resources: {{count}}', resourceBinaryContent: 'Binary content (cannot be displayed)', resourceBinaryOmitted: 'Binary content omitted by resource safety policy', resourceTruncated: 'Content truncated by byte or token limits', resourceReadFailed: 'Failed to read resource content', statusConnected: 'Connected', statusDisconnected: 'Disconnected', statusError: 'Connection Error', statusDisabled: 'Disabled', loading: 'Loading...', starCount: 'Stars: {{count}}', install: 'Install', installFromGithub: 'Install MCP Server from GitHub', add: 'Add', name: 'Name', nameRequired: 'Name cannot be empty', sseTimeout: 'SSE Timeout', sseTimeoutDescription: 'Timeout for establishing SSE connection', extraParametersDescription: 'Additional parameters for configuring specific MCP server behavior', timeoutMustBeNumber: 'Timeout must be a number', timeoutNonNegative: 'Timeout cannot be negative', sseTimeoutMustBeNumber: 'SSE timeout must be a number', sseTimeoutNonNegative: 'SSE timeout cannot be negative', updateSuccess: 'Updated successfully', updateFailed: 'Update failed: ', selectFromSidebar: 'Select an MCP server from the sidebar', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions for this MCP server.', deleteMCPAction: 'Delete this MCP server', deleteMCPHint: 'Once deleted, this MCP server configuration cannot be recovered.', }, pipelines: { title: 'Pipelines', description: 'Pipelines define the processing flow for message events, used to bind to bots', createPipeline: 'Create Pipeline', selectFromSidebar: 'Select a pipeline from the sidebar', editPipeline: 'Edit Pipeline', chat: 'Chat', configuration: 'Configuration', debugChat: 'Debug Chat', getPipelineListError: 'Failed to get pipeline list: ', daysAgo: 'days ago', today: 'Today', updateTime: 'Updated ', defaultBadge: 'Default', sortBy: 'Sort by', newestCreated: 'Newest Created', earliestCreated: 'Earliest Created', recentlyEdited: 'Recently Edited', earliestEdited: 'Earliest Edited', basicInfo: 'Basic Information', basicInfoDescription: 'Set the pipeline name, icon and description', aiCapabilities: 'AI', triggerConditions: 'Trigger', safetyControls: 'Safety', outputProcessing: 'Output', nameRequired: 'Name cannot be empty', descriptionRequired: 'Description cannot be empty', createSuccess: 'Created successfully. Please edit pipeline parameters', createError: 'Creation failed: ', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', copySuffix: ' Copy', deleteConfirmation: 'Are you sure you want to delete this pipeline? Bots bound to this pipeline will not work.', defaultPipelineCannotDelete: 'Default pipeline cannot be deleted', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', copyConfirmTitle: 'Confirm Copy', copyConfirmation: 'Are you sure you want to copy this pipeline? This will create a new pipeline with all configurations.', unsavedChanges: 'You have unsaved changes', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', deletePipelineAction: 'Delete this pipeline', deletePipelineHint: 'Once deleted, bots bound to this pipeline will stop working.', copyPipelineAction: 'Copy this pipeline', copyPipelineHint: 'Create a new pipeline with all configurations duplicated.', extensions: { title: 'Extensions', loadError: 'Failed to load plugins', saveSuccess: 'Saved successfully', saveError: 'Save failed', noPluginsAvailable: 'No plugins available', disabled: 'Disabled', noPluginsSelected: 'No plugins selected', addPlugin: 'Add Plugin', selectPlugins: 'Select Plugins', pluginsTitle: 'Plugins', mcpServersTitle: 'MCP Servers', mcpResourcesTitle: 'MCP Resources', noMCPServersSelected: 'No MCP servers selected', noMCPResourcesAvailable: 'No MCP resources available', addMCPServer: 'Add MCP Server', selectMCPServers: 'Select MCP Servers', enableMCPResourceAgentRead: 'Agent read', toolCount: '{{count}} tools', noPluginsInstalled: 'No installed plugins', noMCPServersConfigured: 'No configured MCP servers', selectAll: 'Select All', enableAllPlugins: 'Enable All Plugins', enableAllMCPServers: 'Enable All MCP Servers', enableAllSkills: 'Enable All Skills', allPluginsEnabled: 'All plugins enabled', allMCPServersEnabled: 'All MCP servers enabled', allSkillsEnabled: 'All skills enabled', skillsTitle: 'Skills', noSkillsSelected: 'No skills selected', addSkill: 'Add Skill', selectSkills: 'Select Skills', noSkillsAvailable: 'No skills available', mcpServersScopeTooltip: 'This only controls which MCP servers are bound to the pipeline. Choose exact MCP tools and resources in AI Feature > Local Agent.', enableAllMCPServersTooltip: 'When enabled, all configured and enabled MCP servers become candidates for MCP tools and resources in AI Feature.', }, localAgent: { toolsTitle: 'Tools', toolsDescription: 'Select plugin, MCP, skill, and built-in tools available to this Local Agent.', toolsScopeTooltip: 'MCP tools only come from MCP servers bound in Extensions. Bind another MCP server there to make its tools selectable here.', enableAllTools: 'Enable all tools', allToolsEnabled: 'All available tools are enabled', noToolsSelected: 'No tools selected', editTools: 'Edit tools', builtinTools: 'Built-in tools', pluginTools: 'Plugin tools', skillTools: 'Skill tools', mcpTools: 'MCP tools', mcpToolsScopeTooltip: 'Only tools from MCP servers currently allowed in Extensions are shown here.', skillToolsScopeTooltip: 'Skill tools are available when LangBot skill service and the Box sandbox backend are ready. They let the agent activate or register skills.', selectTools: 'Select tools', resourcesTitle: 'Resources', resourcesDescription: 'Select MCP resources and knowledge bases available to this Local Agent.', knowledgeBases: 'Knowledge bases', mcpResources: 'MCP resources', mcpResourcesScopeTooltip: 'Only resources exposed by MCP servers currently allowed in Extensions are shown here.', enableMCPResourceRead: 'Allow model to read MCP resources', mcpResourceReadTooltip: 'When disabled, selected MCP resources are not injected into model context.', noMCPResourcesAvailable: 'No MCP resources available', selectKnowledgeBases: 'Select knowledge bases', }, debugDialog: { title: 'Pipeline Chat', selectPipeline: 'Select Pipeline', sessionType: 'Session Type', privateChat: 'Private Chat', groupChat: 'Group Chat', send: 'Send', reset: 'Reset Conversation', inputPlaceholder: 'Send {{type}} message...', noMessages: 'No messages', userMessage: 'User', botMessage: 'Bot', sendFailed: 'Send failed', resetSuccess: 'Conversation reset successfully', resetFailed: 'Reset failed', loadMessagesFailed: 'Failed to load messages', loadPipelinesFailed: 'Failed to load pipelines', atTips: 'Mention the bot', streaming: 'Streaming', streamOutput: 'Stream', connected: 'WebSocket connected', disconnected: 'WebSocket disconnected', connectionError: 'WebSocket connection error', connectionFailed: 'WebSocket connection failed', notConnected: 'WebSocket not connected, please try again later', imageUploadFailed: 'Image upload failed', reply: 'Reply', replyTo: 'Reply to', showMarkdown: 'Show Markdown', showRaw: 'Show Raw', allMembers: 'All Members', file: 'File', voice: 'Voice', uploadImage: 'Upload Image', uploading: 'Uploading...', }, monitoring: { title: 'Dashboard', description: 'View execution logs and errors for this pipeline (last 24 hours)', detailedLogs: 'Detailed Logs', }, }, knowledge: { title: 'Knowledge', createKnowledgeBase: 'Create Knowledge Base', selectFromSidebar: 'Select a knowledge base from the sidebar', editKnowledgeBase: 'Edit Knowledge Base', selectKnowledgeBase: 'Select Knowledge Base', selectKnowledgeBases: 'Select Knowledge Bases', addKnowledgeBase: 'Add Knowledge Base', noKnowledgeBaseSelected: 'No knowledge bases selected', empty: 'Empty', editDocument: 'Documents', description: 'Configuring knowledge bases for improved LLM responses', metadata: 'Metadata', documents: 'Documents', kbNameRequired: 'Knowledge base name cannot be empty', kbDescriptionRequired: 'Knowledge base description cannot be empty', embeddingModelUUIDRequired: 'Embedding model cannot be empty', daysAgo: 'days ago', today: 'Today', kbName: 'Knowledge Base Name', kbDescription: 'Knowledge Base Description', topK: 'Top K', topKRequired: 'Top K cannot be empty', topKMax: 'Top K maximum value is 30', topKdescription: 'Used to specify the number of relevant documents to retrieve, ranging from 1 to 30.', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', embeddingModelDescription: 'Used to vectorize the text, you can configure it in the Models page', updateTime: 'Updated ', cannotChangeEmbeddingModel: 'Knowledge base created cannot be modified embedding model', updateKnowledgeBaseSuccess: 'Knowledge base updated successfully', updateKnowledgeBaseFailed: 'Knowledge base update failed: ', documentsTab: { name: 'Name', status: 'Status', noResults: 'No documents', dragAndDrop: 'Drag and drop files here or click to upload', uploading: 'Uploading...', supportedFormats: 'Supports PDF, Word, TXT, Markdown, HTML, ZIP and other document formats', uploadSuccess: 'File uploaded successfully!', uploadError: 'File upload failed: ', uploadingFile: 'Uploading file...', fileSizeExceeded: 'File size exceeds 10MB limit. Please split into smaller files.', actions: 'Actions', delete: 'Delete File', fileDeleteSuccess: 'File deleted successfully', fileDeleteFailed: 'File deletion failed: ', processing: 'Processing', completed: 'Completed', failed: 'Failed', selectParser: 'Select Parser', builtInParser: 'Provided by Knowledge engine', noParserAvailable: 'No parser supports this file type. Please install a parser plugin that can handle this format.', installParserHint: 'Browse parser plugins in Extension Market →', confirmUpload: 'Upload', cancelUpload: 'Cancel', }, deleteKnowledgeBaseConfirmation: 'Are you sure you want to delete this knowledge base? All documents in this knowledge base will be deleted.', retrieve: 'Retrieve Test', retrieveTest: 'Retrieve Test', query: 'Query', queryPlaceholder: 'Enter query text...', distance: 'Distance', content: 'Content', fileName: 'File Name', noResults: 'No results', retrieveError: 'Retrieve failed: ', unknownEngine: 'Unknown Engine', knowledgeEngine: 'Knowledge Engine', knowledgeEngineRequired: 'Knowledge engine is required', selectKnowledgeEngine: 'Select Knowledge Engine', builtInEngine: 'Built-in Engine', cannotChangeKnowledgeEngine: 'Knowledge engine cannot be changed after creation', basicInfo: 'Basic Information', basicInfoDescription: 'Set the knowledge base name, icon and description', engineSettings: 'Engine Settings', engineSettingsDescription: 'Configuration for the selected knowledge engine', engineSettingsReadonly: 'read-only in edit mode', engineSettingsInvalid: 'Engine settings validation failed, please check required fields', retrievalSettingsInvalid: 'Retrieval settings validation failed, please check required fields', retrievalSettings: 'Retrieval Settings', retrievalSettingsDescription: 'Configure how documents are retrieved from this knowledge base', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', deleteKbAction: 'Delete this knowledge base', deleteKbHint: 'Once deleted, all documents and data in this knowledge base will be permanently removed.', noEnginesAvailable: 'No knowledge base engines available', installEngineHint: 'Please install a "Knowledge Engine" plugin first', createKnowledgeBaseFailed: 'Failed to create knowledge base: ', loadKnowledgeBaseFailed: 'Failed to load knowledge base: ', deleteKnowledgeBaseFailed: 'Failed to delete knowledge base: ', getKnowledgeBaseListError: 'Failed to get knowledge base list: ', embeddingModel: 'Embedding Model', embeddingModelRequired: 'Embedding model is required for this engine', addExternal: 'Add External Knowledge Base', createExternalSuccess: 'External knowledge base created successfully', updateExternalSuccess: 'External knowledge base updated successfully', deleteExternalSuccess: 'External knowledge base deleted successfully', retriever: 'Retriever', selectRetriever: 'Select a retriever...', retrieverConfiguration: 'Retriever Configuration', retrieverInstallInfo: 'You can install Knowledge Retriever plugins from', retrieverMarketLink: 'here', migration: { title: 'Knowledge Base Migration', description: 'The new version has refactored the knowledge base into a plugin-based architecture, unifying built-in and external knowledge bases as "Knowledge Engine" plugins. Migration of legacy knowledge base data is required. Your old data has been automatically backed up in the database.', detected: 'Found {{total}} knowledge base(s) to migrate ({{internal}} internal, {{external}} external).', startWithInstall: 'Auto-install Plugin & Migrate', startDataOnly: 'Migrate Data Only', dataOnlyHint: '"Migrate Data Only" is for offline/intranet environments. Please install the corresponding plugin manually after migration.', dismiss: 'Discard Original Data', running: 'Migrating knowledge bases, please wait...', success: 'Knowledge base migration completed', error: 'Knowledge base migration failed: ', dismissError: 'Operation failed', retry: 'Retry', }, }, register: { title: 'Initialize LangBot 👋', description: 'This is your first time starting LangBot', adminAccountNote: 'The account you use here will be set as the administrator account', register: 'Register', initWithSpace: 'Initialize with Space', spaceRecommended: 'Recommended: Use official stable model APIs and cloud services', spaceInfoTip1: 'Space provides unified account authentication services without uploading any of your sensitive information.', spaceInfoTip2: 'Logging in with a Space account gives you access to LangBot Models and other cloud services, including free model call credits to help you get started quickly.', spaceInfoTip3: 'Your login method does not affect other features. You can configure and use models from other sources at any time.', registerLocal: 'Register local account', registerWithPassword: 'Register with email and password', initSuccess: 'Initialization successful, please login', initFailed: 'Initialization failed: ', }, resetPassword: { title: 'Reset Password 🔐', description: 'Enter your recovery key and new password to reset your account password', recoveryKey: 'Recovery Key', recoveryKeyDescription: 'Stored in `system.recovery_key` of config file `data/config.yaml`', newPassword: 'New Password', enterRecoveryKey: 'Enter recovery key', enterNewPassword: 'Enter new password', recoveryKeyRequired: 'Recovery key cannot be empty', newPasswordRequired: 'New password cannot be empty', resetPassword: 'Reset Password', resetting: 'Resetting...', resetSuccess: 'Password reset successfully, please login', resetFailed: 'Password reset failed, please check your email and recovery key', backToLogin: 'Back to Login', }, embedding: { description: 'Manage Embedding models for text vectorization', createModel: 'Create Embedding Model', editModel: 'Edit Embedding Model', getModelListError: 'Failed to get Embedding model list: ', embeddingModels: 'Embedding', extraParametersDescription: 'Will be attached to the request body, such as encoding_format, dimensions, etc.', }, llm: { description: 'Manage LLM models for conversation generation', llmModels: 'LLM', extraParametersDescription: 'Will be attached to the request body, such as max_tokens, temperature, top_p, etc.', }, version: { newVersionAvailable: 'New Version Available', viewUpdateGuide: 'View Update Guide', noReleaseNotes: 'No release notes available', }, account: { settings: 'Account Settings', settingsDescription: 'Manage your password and linked accounts', setPassword: 'Set Password', passwordSetSuccess: 'Password set successfully', passwordStatus: 'Local Password', passwordSet: 'Set', passwordNotSet: 'Not Set', passwordSetDescription: 'Password is set, you can login with email and password', spaceStatus: 'Space Account', spaceBound: 'Bound', spaceNotBound: 'Not Bound', spaceBoundDescription: 'Space account bound, official model APIs and cloud services available', bindSpace: 'Bind Space Account', bindSpaceDescription: 'Bind to use official model APIs and cloud services', bindSpaceButton: 'Bind', bindSpaceConfirmTitle: 'Confirm Binding', bindSpaceConfirmDescription: 'You are about to bind your local instance to a Space account', bindSpaceWarning: 'After binding, your login email will be changed from {{localEmail}} to the Space account email.', bindSpaceSuccess: 'Space account bound successfully', bindSpaceFailed: 'Failed to bind Space account', bindSpaceInvalidState: 'Invalid bind request. Please try again from account settings.', setPasswordHint: 'Set a password to login with email and password', spaceEmailMismatch: 'Space login email does not match the local account email', }, monitoring: { title: 'Dashboard', description: 'Monitor bot activities, LLM calls, and system performance', overview: 'Overview', totalMessages: 'Total Messages', llmCallsCount: 'LLM Calls', modelCallsCount: 'Model Calls', successRate: 'Success Rate', activeSessions: 'Active Sessions', last24Hours: 'Last 24 hours', filters: { title: 'Filters', bot: 'Bot', pipeline: 'Pipeline', allBots: 'All Bots', selectBot: 'Select Bot', allPipelines: 'All Pipelines', selectPipeline: 'Select Pipeline', loading: 'Loading...', timeRange: 'Time Range', customRange: 'Custom Range', from: 'From', to: 'To', apply: 'Apply', reset: 'Reset Filters', lastHour: 'Last 1 hour', last6Hours: 'Last 6 hours', last24Hours: 'Last 24 hours', last7Days: 'Last 7 days', last30Days: 'Last 30 days', }, tabs: { messages: 'Message Records', llmCalls: 'LLM Calls', embeddingCalls: 'Embedding Calls', modelCalls: 'Model Calls', tokens: 'Token Monitoring', feedback: 'User Feedback', sessions: 'Session Analysis', errors: 'Error Logs', }, messageList: { timestamp: 'Timestamp', bot: 'Bot', pipeline: 'Pipeline', message: 'Message', sessionId: 'Session ID', status: 'Status', actions: 'Actions', viewDetails: 'View Details', copyId: 'Copy ID', noMessages: 'No messages found', noMessagesDescription: 'Try adjusting your filters or check back later', loading: 'Loading messages...', loadMore: 'Load More', autoRefresh: 'Auto Refresh', platform: 'Role', user: 'User', level: 'Level', runner: 'Runner', viewConversation: 'View Conversation', turns: '{{count}} conversation turns', userMessage: 'User', noUserMessage: 'No user input recorded', assistantMessage: 'Assistant', assistantMessageCount: 'Assistant +{{count}}', noAssistantMessage: 'No assistant reply recorded', messageCount: 'Messages', conversationTrace: 'Conversation Trace', noLlmCalls: 'No model calls recorded', roles: { user: 'User', assistant: 'Assistant', message: 'Message', }, }, llmCalls: { title: 'LLM Calls', model: 'Model', tokens: 'Tokens', duration: 'Duration', cost: 'Cost', noData: 'No LLM calls found', inputTokens: 'Input Tokens', outputTokens: 'Output Tokens', totalTokens: 'Total Tokens', avgDuration: 'Avg Duration', calls: 'Calls', }, toolCalls: { title: 'Tool Calls', totalCalls: 'Calls', duration: 'Tool Duration', errorCalls: 'Failed Calls', arguments: 'Arguments', result: 'Result', noToolCalls: 'No tool calls recorded', }, tokens: { totalTokens: 'Total Tokens', inputTokens: 'Input Tokens', outputTokens: 'Output Tokens', avgPerCall: 'Avg / Call', throughput: 'Throughput', tokensPerSec: 'tokens/sec', errorCalls: 'Failed Calls', acrossCalls: 'across {{count}} calls', ofTotal: 'of {{count}} total', usageOverTime: 'Token Usage Over Time', byModel: 'By Model', model: 'Model', calls: 'Calls', avgLatency: 'Avg Latency', noData: 'No token usage in the selected time range', loadError: 'Failed to load token statistics: {{error}}', zeroTokenWarning: '{{count}} successful call(s) reported zero token usage. This usually means the upstream provider did not return usage info — check the model provider configuration.', bucket: { hour: 'Hourly', day: 'Daily', }, }, embeddingCalls: { title: 'Embedding Calls', model: 'Model', tokens: 'Tokens', duration: 'Duration', noData: 'No embedding calls found', promptTokens: 'Prompt Tokens', totalTokens: 'Total Tokens', inputCount: 'Input Count', knowledgeBase: 'Knowledge Base', queryText: 'Query', }, modelCalls: { title: 'Model Calls', llmModel: 'LLM', embeddingModel: 'Embedding', embeddingCall: 'Embedding', retrieveCall: 'Retrieve', noData: 'No model calls found', }, sessions: { sessionId: 'Session ID', messageCount: 'Messages', duration: 'Duration', lastActivity: 'Last Activity', noSessions: 'No sessions found', startTime: 'Start Time', messageStats: 'Message Statistics', totalMessages: 'Total Messages', successMessages: 'Successful', errorMessages: 'Failed', llmStats: 'LLM Statistics', noData: 'Session not found', }, errors: { title: 'Errors', errorType: 'Error Type', errorMessage: 'Error Message', occurredAt: 'Occurred At', noErrors: 'No errors found', stackTrace: 'Stack Trace', }, feedback: { title: 'User Feedback', totalFeedback: 'Total Feedback', totalLikes: 'Likes', totalDislikes: 'Dislikes', satisfactionRate: 'Satisfaction Rate', like: 'Like', dislike: 'Dislike', noFeedback: 'No feedback yet', noFeedbackDescription: 'User feedback will appear here', feedbackList: 'Feedback List', feedbackContent: 'Feedback Content', contextInfo: 'Context Info', userId: 'User ID', messageId: 'Message ID', streamId: 'Related Query ID', inaccurateReasons: 'Inaccurate Reasons', platform: 'Platform', exportFeedback: 'Export Feedback', description: 'Tell us what went wrong or what could be better. Instance UUID and login account are included for diagnosis.', placeholder: 'Describe your suggestion, issue, or reproduction steps...', attachImage: 'Add image', screenshot: 'Screenshot', submit: 'Submit feedback', privacyHint: 'Do not include secrets, passwords, or private chat content.', contentRequired: 'Please enter feedback first', imageOnly: 'Only image attachments are supported', imageTooLarge: 'Each image must be under 1MB', tooManyImages: 'You can attach up to 3 images', screenshotFailed: 'Screenshot failed. Try pasting or uploading an image.', submitSuccess: 'Feedback submitted. Thanks!', submitFailed: 'Failed to submit feedback. Please try again later.', removeImage: 'Remove image', }, queries: { title: 'Queries', }, messageDetails: { noData: 'No LLM calls or errors for this query', }, queryVariables: { title: 'Query Variables', }, trafficChart: { title: 'Traffic Overview', messages: 'Messages', llmCalls: 'LLM Calls', noData: 'No traffic data available', }, viewMonitoring: 'View Monitoring', refreshData: 'Refresh Data', exportData: 'Export Data', export: { title: 'Export Data', exporting: 'Exporting...', messages: 'Messages', llmCalls: 'LLM Calls', embeddingCalls: 'Embedding Calls', errors: 'Error Logs', sessions: 'Sessions', feedback: 'User Feedback', }, systemStatus: 'System Status', pluginRuntime: 'Plugin Runtime', boxRuntime: 'Box Runtime', connected: 'Connected', disconnected: 'Disconnected', disabled: 'Disabled', statusDetail: 'Status', pluginDisabled: 'Plugin system is disabled', boxDisabled: 'Box sandbox is disabled in config — sandbox tools, skill add/edit, and stdio MCP are unavailable', boxUnavailable: 'Box sandbox is unavailable — sandbox tools, skill add/edit, and stdio MCP are unavailable', boxRequiredHint: 'This feature requires the Box runtime. Enable it in config (box.enabled = true) and ensure the runtime is healthy.', boxBackend: 'Backend', boxProfile: 'Profile', boxSandboxes: 'Sandboxes', boxSessionCreated: 'Created', boxSessionLastUsed: 'Last used', }, settingsDialog: { title: 'Settings', nav: { models: 'Models', api: 'API', storage: 'Storage', account: 'Account', }, }, storageAnalysis: { title: 'Storage Analysis', description: 'Inspect storage usage and cleanup candidates', openDialog: 'View Analysis', dialogTitle: 'Storage Analysis', generatedAt: 'Generated at {{time}}', loading: 'Loading...', refresh: 'Refresh', totalSize: 'Total size', binaryStorage: 'Binary storage', uploadCleanup: 'Expired uploads', logCleanup: 'Expired logs', sections: 'Storage sections', monitoringTables: 'Monitoring tables', runtimeTasks: 'Runtime tasks', cleanupPolicy: 'Cleanup policy', uploadRetention: 'Upload retention', logRetention: 'Log retention', databaseType: 'Database type', days: 'days', missing: 'Missing', expiredUploads: 'Expired uploads', expiredLogs: 'Expired logs', noExpiredUploads: 'No expired uploaded files', noExpiredLogs: 'No expired log files', sectionNames: { database: 'Database', logs: 'Logs', storage: 'Uploaded files', vector_store: 'Vector store', plugins: 'Plugins', mcp: 'MCP', temp: 'Temporary files', }, }, limitation: { maxBotsReached: 'Maximum number of bots ({{max}}) reached. Please remove an existing bot before creating a new one.', maxPipelinesReached: 'Maximum number of pipelines ({{max}}) reached. Please remove an existing pipeline before creating a new one.', maxExtensionsReached: 'Maximum number of extensions ({{max}}) reached. Please remove an existing extension before adding a new one.', }, skills: { title: 'Skills', description: 'Create and manage skills that can be activated during conversations', createSkill: 'Create Skill', createSkillDescription: 'Import a local directory or create one by filling in details', editSkill: 'Edit Skill', getSkillListError: 'Failed to get skill list: ', skillName: 'Skill Name', displayName: 'Skill Name', displayNamePlaceholder: 'Display name (supports any language)', skillSlug: 'Directory Name', skillSlugPlaceholder: 'english-name-only', skillSlugHelp: 'Used as the skill directory name. Only letters, numbers, hyphens and underscores.', skillDescription: 'Skill Description', skillInstructions: 'Instructions', saveSuccess: 'Saved successfully', saveError: 'Save failed: ', createSuccess: 'Created successfully', createError: 'Creation failed: ', deleteSuccess: 'Deleted successfully', deleteError: 'Delete failed: ', deleteConfirmation: 'Are you sure you want to delete this skill?', delete: 'Delete Skill', skillNameRequired: 'Skill name cannot be empty', skillDescriptionRequired: 'Skill description cannot be empty', packageRootRequired: 'Package root path cannot be empty', scan: 'Scan', scanSuccess: 'Directory scanned successfully', scanError: 'Failed to scan directory: ', noSkills: 'No skills configured', preview: 'Preview', previewInstructions: 'SKILL.md Content Preview', instructionsPlaceholder: 'Enter skill instructions in Markdown format...', descriptionPlaceholder: 'A brief description of what this skill does (shown to the LLM)', packageRoot: 'Package Directory', packageRootHelp: 'Optional. Only needed when importing an existing skill directory. Leave empty for new skills. Scanning checks the current directory and subdirectories up to 2 levels deep.', importLocalDirectory: 'Import Local Skill Directory', chooseSkillDirectory: 'Choose SKILL.md Directory', chooseAnotherDirectory: 'Choose Another Directory', importingDirectory: 'Previewing...', clearDirectoryPreview: 'Clear Selected Directory', noSkillMdInDirectory: 'No SKILL.md was found in the selected directory', multipleSkillMdInDirectory: 'The selected directory contains multiple SKILL.md files. Choose a single skill directory directly.', importDirectoryError: 'Failed to import directory: ', advancedSettings: 'Advanced Settings', searchSkills: 'Search skills...', selectSkills: 'Select Skills', addSkill: 'Add Skill', builtin: 'Built-in', importFromGithub: 'Install Skill from GitHub', createManually: 'Create Manually', uploadZip: 'Upload ZIP Package', uploadZipOnly: 'Only .zip skill packages are supported', installSuccess: 'Skill installed successfully', installError: 'Failed to install skill: ', enterRepoUrl: 'Enter GitHub repository URL', repoUrlPlaceholder: 'e.g., https://github.com/owner/repo', fetchingReleases: 'Fetching releases...', selectRelease: 'Select Release', noReleasesFound: 'No releases found', fetchReleasesError: 'Failed to fetch releases: ', selectAsset: 'Select file to install', sourceArchive: 'Source code (zip)', noAssetsFound: 'No installable files available in this release', fetchAssetsError: 'Failed to fetch assets: ', backToReleases: 'Back to releases', backToRepoUrl: 'Back to repository URL', backToAssets: 'Back to assets', releaseTag: 'Tag: {{tag}}', publishedAt: 'Published at: {{date}}', prerelease: 'Pre-release', assetSize: 'Size: {{size}}', confirmInstall: 'Confirm Install', installing: 'Installing skill...', loading: 'Loading...', previewLoadError: 'Failed to load preview', selectFromSidebar: 'Select a skill from the sidebar', dangerZone: 'Danger Zone', dangerZoneDescription: 'Irreversible and destructive actions', files: 'Files', noFiles: 'No files found', loadFilesError: 'Failed to load files: ', readFileError: 'Failed to read file: ', saveFile: 'Save File', saveFileSuccess: 'File saved successfully', saveFileError: 'Failed to save file: ', }, wizard: { sidebarDescription: 'Create a bot with guided steps', loading: 'Loading wizard...', loadError: 'Failed to load wizard data', skip: 'Skip', skipConfirmMessage: 'You can re-enter the Quick Start wizard from the account menu later, or create a bot manually.', skipConfirmOk: 'OK', prev: 'Previous', next: 'Next', finish: 'Create & Deploy', confirmCreateBot: 'Confirm, Create Bot', createSuccess: 'Pipeline created and linked to bot successfully!', botCreateSuccess: 'Bot created successfully!', botSaveSuccess: 'Bot configuration saved and enabled!', createError: 'Failed to create resources', spaceAuthError: 'Failed to initiate Space authorization', skipSaveError: 'Failed to save skip status. Please try again.', completeSaveError: 'Failed to save completion status. Please try again.', step: { platform: 'Platform', botConfig: 'Bot Setup', aiEngine: 'AI Engine', done: 'Done', }, platform: { title: 'Select a Platform', description: 'Choose the messaging platform your bot will connect to.', }, botConfig: { title: 'Configure Your Bot', description: 'Set up your bot and verify it works before continuing.', saveBot: 'Save & Enable Bot', resaveBot: 'Re-save Configuration', botSaved: 'Bot configuration saved and enabled. Check the logs to verify the connection.', logsTitle: 'Bot Logs', logsDescription: 'Monitor bot activity to verify the platform connection is working.', }, aiEngine: { title: 'Select an AI Engine', description: "Choose the AI engine that will power your bot's intelligence.", }, spaceBanner: { message: 'Connect to LangBot Space for free trial model credits and zero-config instant setup!', action: 'Authorize with Space', }, config: { botInfo: 'Bot Information', botNamePlaceholder: 'Enter bot name', botDescPlaceholder: 'Enter bot description (optional)', platformConfig: '{{platform}} Configuration', aiConfig: '{{engine}} Configuration', }, done: { title: 'All Set!', description: 'Your bot has been created and connected to the AI pipeline. You can now manage it from the workbench.', backToWorkbench: 'Back to Workbench', }, }, addExtension: { installTitle: 'Install {{type}}', installConfirm: 'Install {{type}} "{{name}}"?', installInfoType: 'Type', installInfoId: 'ID', installInfoVersion: 'Version', installSuccess: 'Installed successfully', installStage: { mcpInstalling: 'Adding and connecting the MCP server…', skillInstalling: 'Installing the skill…', installed: 'Done', }, manualAdd: 'Manual Add', uploadExtension: 'Drag & drop or click to upload', uploadHint: 'Supports .zip (skills) and .lbpkg (plugins) files', orContinueWith: 'or choose an action below', addMCPServerHint: 'Connect an MCP tool server extension', installFromGithub: 'Install from GitHub', installFromGithubHint: 'Plugin package or Skill (SKILL.md)', githubUrlHelp: 'Paste a GitHub URL', githubUrlTooltip: 'Plugin: paste a repository, Release, or Tag URL. Skill: paste the SKILL.md page URL inside the skill directory.', githubUrlPlaceholder: 'GitHub repository, Release, or SKILL.md link', githubUrlRequired: 'Enter a GitHub URL', previewSkill: 'Preview Skill', noSkillPreviewFound: 'No importable Skill found', createSkill: 'Create New Skill', createSkillHint: 'Import from a local directory or create manually', unsupportedFileType: 'Unsupported file type. Only .zip and .lbpkg files are supported', }, errorPage: { unexpectedError: 'Something went wrong', unexpectedErrorDescription: 'An unexpected error occurred. Please try again later.', notFound: 'Page not found', notFoundDescription: 'The page you are looking for does not exist or has been moved.', backendUnavailableStatus: 'Backend unavailable', goBack: 'Go Back', backToHome: 'Back to Home', backToLogin: 'Back to Login', retrying: 'Retrying', retryFailed: 'Still cannot connect to the backend. Start the service and try again.', }, feishu: { createApp: 'One-Click Create Feishu App', scanQRCode: 'Scan the QR code below with Feishu to authorize and automatically create the app', waitingForScan: 'Waiting for scan', createSuccess: 'App created successfully! Credentials have been filled in', createFailed: 'Creation failed', connecting: 'Connecting to Feishu service...', expired: 'QR code expired, please try again', denied: 'Authorization denied by user', connectionLost: 'Connection lost, please try again', reconnecting: 'Reconnecting...', retry: 'Retry', }, weixin: { scanLogin: 'Scan QR Login', scanQRCode: 'Scan the QR code below with WeChat to authorize and automatically fill in the token', loginSuccess: 'Login successful! Token has been filled in', loginFailed: 'Login failed', }, dingtalk: { createApp: 'One-Click Create DingTalk App', scanQRCode: 'Scan the QR code below with DingTalk to authorize and automatically create the app', waitingForScan: 'Waiting for scan', createSuccess: 'App created successfully! Credentials have been filled in', createFailed: 'Creation failed', connecting: 'Connecting to DingTalk service...', retry: 'Retry', robotCodeNote: 'Robot Code cannot be obtained automatically. Please go to DingTalk Developer Backend > Robot Configuration to copy it manually. It is required for features like image recognition and file upload.', }, wecombot: { createBot: 'One-Click Create WeCom Bot', scanQRCode: 'Scan the QR code below with WeCom to authorize and automatically create the bot', waitingForScan: 'Waiting for scan', createSuccess: 'Bot created successfully! Credentials have been filled in', createFailed: 'Creation failed', connecting: 'Connecting to WeCom service...', retry: 'Retry', robotNameNote: 'Robot Name cannot be obtained automatically. Please fill it in manually.', }, qqofficial: { createBinding: 'One-Click QR Binding for QQ Official Bot', scanQRCode: 'Scan the QR code below with mobile QQ and authorize the binding in QQ Bot Assistant', waitingForScan: 'Waiting for scan', bindSuccess: 'Bound successfully! AppID and Secret have been filled in', bindFailed: 'Binding failed', connecting: 'Connecting to QQ service...', retry: 'Retry', tokenNote: 'The Token field is not used by the current adapter — you can leave it blank.', boundBy: 'Bound by QQ user {{openid}}', }, pluginPages: { selectFromSidebar: 'Select a plugin page from the sidebar', invalidPage: 'Invalid plugin page', }, }; export default enUS;