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 LangBot Account',
    spaceLoginRecommended:
      'Recommended: Use official stable model APIs and cloud services',
    loginLocal: 'Login with local account',
    loginWithPassword: 'Login with password',
    spaceLoginTitle: 'Login with LangBot Account',
    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: 'LangBot Account login failed',
    spaceLoginExpired: 'Authorization code expired, please try again',
    spaceLoginCancel: 'Cancel',
    spaceLoginVisitLink: 'Visit link',
    spaceLoginProcessing: 'Logging in with LangBot Account',
    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:
      'LangBot 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.',
    apiKeyStoredSecurely: 'Secret shown only when created',
    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',
    reasoningAbility: 'Reasoning',
    reasoningLevel: 'Reasoning level',
    reasoningLevels: {
      providerDefault: 'Provider default',
      disabled: 'Off',
      enabled: 'On',
      minimal: 'Minimal',
      low: 'Low',
      medium: 'Medium',
      high: 'High',
      xhigh: 'Extra high',
      max: 'Maximum',
    },
    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 LangBot Account',
    spaceDisabledForLocalAccount:
      'Login with LangBot Account 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 LangBot Account',
    loginToUseModels: 'Login with LangBot Account to use cloud models',
    ownerMustBindSpace:
      'The Workspace owner must connect a LangBot Account for LangBot Models.',
    usesOwnerSpaceBilling:
      "Uses the Workspace owner's LangBot Account billing and credits.",
    noModels: 'No models configured',
    langbotModels: 'LangBot Models',
    spaceTrialTooltip:
      'Free trial credits available! Login with LangBot Account 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 enable or modify the bound pipeline',
    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',
    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',
    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',
    },
  },
  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',
    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',
    debugKeyExpires: 'Rotates at {{time}}; each Workspace has a different key',
    noDebugKey: '(Not Set)',
    debugKeyDisabled: 'Debug credential is temporarily unavailable',
    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',
    },
    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: {
      hottest: 'Most Popular',
      recentlyAdded: 'Recently Added',
      recentlyUpdated: 'Recently Updated',
      mostDownloads: 'Most Downloads',
      leastDownloads: 'Least Downloads',
    },
    downloads: 'downloads',
    download: 'Download',
    like: 'Like',
    unlike: 'Unlike',
    likeFailed: 'Failed to update like. Please try again.',
    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',
    },
    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',
    toolCallTimeout: 'Tool call timeout (seconds)',
    toolCallTimeoutDescription:
      'Maximum wait for one tool call. Set to 0 for no timeout. Defaults to 300 seconds.',
    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',
    disabledByPolicy: 'disabled by policy',
    stdioDisabledByPolicy:
      'Stdio MCP is disabled for this deployment. Use a remote MCP server instead.',
    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 LangBot Account',
    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 LangBot 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: 'LangBot Account',
    spaceBound: 'Bound',
    spaceNotBound: 'Not Bound',
    spaceBoundDescription:
      'LangBot Account bound, official model APIs and cloud services available',
    bindSpace: 'Bind LangBot 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 LangBot Account',
    bindSpaceWarning:
      'After binding, your login email will be changed from {{localEmail}} to the LangBot Account email.',
    bindSpaceSuccess: 'LangBot Account bound successfully',
    bindSpaceFailed: 'Failed to bind LangBot Account',
    bindSpaceInvalidState:
      'Invalid bind request. Please try again from account settings.',
    setPasswordHint: 'Set a password to login with email and password',
    spaceEmailMismatch:
      'The LangBot Account login email does not match the local account email.',
    space_account_not_registeredTitle: 'Account not registered',
    space_account_not_registered:
      'No local account is registered for this LangBot Account email. Ask the Workspace owner for an invitation.',
    space_account_binding_requiredTitle: 'LangBot Account connection required',
    space_account_binding_required:
      'This local account must connect a LangBot Account from Account settings before using LangBot Account login.',
  },
  workspace: {
    title: 'Workspace',
    description: 'Manage members, roles, and invitation links',
    selectTitle: 'Choose a Workspace',
    selectDescription: 'Select where you want to continue in LangBot.',
    selectionLoadFailed:
      'Your Workspaces could not be loaded. Please try again.',
    switchWorkspace: 'Switch Workspace',
    settings: 'Workspace Settings',
    currentPlan: 'Current plan',
    planUnavailable: 'Unavailable',
    upgradePlan: 'Change or upgrade plan',
    ossSingletonDescription:
      'This self-hosted instance has one Workspace and can include multiple users.',
    cloudManagedDescription:
      'This Workspace is hosted by LangBot Cloud. Manage members here; billing opens in Cloud.',
    loadFailed: 'Failed to load Workspace information',
    members: 'Members',
    you: 'You',
    inviteMember: 'Invite a member',
    inviteDescription:
      'Create a one-time link to add another user to this Workspace.',
    emailPlaceholder: 'member@example.com',
    createInvitation: 'Create invitation',
    invitationCreated: 'Invitation created',
    delivery: {
      sent: 'Invitation sent',
      link_only: 'Invitation link created',
      failed: 'Invitation link created, but email could not be sent',
    },
    invitationCreateFailed: 'Failed to create invitation',
    oneTimeLinkWarning: 'Copy this link now. It is shown only once.',
    copyInvitation: 'Copy invitation link',
    invitationCopied: 'Invitation link copied',
    pendingInvitations: 'Pending invitations',
    expiresAt: 'Expires {{date}}',
    revokeInvitation: 'Revoke invitation',
    invitationRevoked: 'Invitation revoked',
    invitationRevokeFailed: 'Failed to revoke invitation',
    acceptInvitation: 'Accept invitation',
    invitedToWorkspace: 'You were invited to {{workspace}}',
    checkingInvitation: 'Checking this invitation...',
    invitationMissing: 'This invitation link is missing required information.',
    invitationExpired: 'This invitation has expired.',
    invitationAlreadyRevoked: 'This invitation was revoked.',
    invitationAlreadyUsed: 'This invitation was already used.',
    invitationInvalid: 'This invitation is invalid or no longer available.',
    invitationAccepted: 'Invitation accepted',
    invitationAcceptFailed: 'Failed to accept invitation',
    invitationEmailMismatch:
      'This invitation belongs to a different email address.',
    existingAccountLoginRequired:
      'An account already exists for this email. Sign in to continue.',
    acceptAsCurrentAccount: 'Accept with current account',
    authenticatedInvitationNotice:
      'Sign out first, then sign in with the invited account. Your invitation will be preserved.',
    logoutAndReturn: 'Sign out and return to this invitation',
    switchAccount: 'Switch account',
    registerAndAccept: 'Create account and accept',
    alreadyHaveAccount: 'I already have an account',
    confirmPassword: 'Confirm password',
    passwordMinimum: 'Password must contain at least 8 characters.',
    passwordMismatch: 'The passwords do not match.',
    backToLogin: 'Back to sign in',
    memberUpdated: 'Member role updated',
    memberUpdateFailed: 'Failed to update member role',
    removeMember: 'Remove member',
    removeMemberConfirm: 'Remove this member from the Workspace?',
    memberRemoved: 'Member removed',
    memberRemoveFailed: 'Failed to remove member',
    transferOwnership: 'Transfer ownership',
    types: {
      personal: 'Personal',
      team: 'Team',
    },
    roles: {
      owner: 'Owner',
      admin: 'Admin',
      developer: 'Developer',
      operator: 'Operator',
      viewer: 'Viewer',
    },
  },
  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: {
      workspace: 'Workspace',
      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.',
    quotaLoadingTooltip:
      'Workspace usage is still loading. Please wait before creating a resource.',
    quotaCheckFailed:
      'Unable to verify the current workspace quota. Please try again.',
    createDisabledTooltip:
      'The {{resource}} limit ({{max}}) for this workspace has been reached. Delete one existing item before creating another.',
  },
  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',
    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.',
      waitingForMessage:
        'The bot is enabled. Send it a message from your IM platform to continue.',
      messageReceived:
        'The bot received an IM message. You can continue to the next step.',
      messageReceivedLocalAccountWarning:
        'The bot-side connection is configured correctly and received an IM message. Because you are not signed in with a LangBot Account, model calls may fail; continue to the next step to add your own model.',
      pageBotTestPrompt:
        'Page Bot is enabled. Click the chat bubble in the lower-right corner and send a message to verify the full conversation flow.',
      pageBotTestNotice:
        'For testing only. Embed the code on a real external webpage.',
      webhookTestPrompt:
        'The callback URL is ready. Configure it on the external platform, then send the bot a real message.',
      httpTestPrompt:
        'HTTP Bot is enabled. Send a real inbound message here to verify the connection.',
      httpTestDefaultMessage: 'Hello, this is a connection test message.',
      sendHttpTest: 'Send Test Message',
      httpTestAccepted:
        'The test message was accepted. It will appear in the log shortly.',
      httpTestMissingSecret:
        'Enter an inbound signing secret and save the configuration first.',
      httpTestFailed: 'Failed to send the test message: {{error}}',
      logsTitle: 'Bot Logs',
      logsDescription:
        'Monitor bot activity to verify the platform connection is working.',
    },
    aiEngine: {
      title: 'Configure AI Engine',
      description:
        "Choose the AI engine that will power your bot's intelligence.",
      optionalDescription:
        'This step is optional. Choose how you want to continue with the current agent.',
      externalTitle: 'Connect an External Agent',
      externalDescription:
        'Connect Dify, n8n, Coze, or another platform and replace the bot pipeline.',
      ownModelTitle: 'Use My Own Model',
      ownModelDescription:
        'Add a provider, then scan or manually enter a model to finish setup.',
      ownModelSetupTitle: 'Add Your Own Model',
      ownModelSetupDescription:
        'Add a model provider. Chat models are scanned automatically, or you can enter a model ID manually.',
      addProviderTitle: 'Add Provider',
      addProviderDescription:
        'Enter the provider details and API key used to connect and scan models.',
      selectModelTitle: 'Choose a Model',
      selectScannedModelTitle: 'Choose a Model',
      selectScannedModelDescription:
        'The selected model will be the primary model of a new pipeline, and the bot will switch to it.',
      scanModelMode: 'Scan Models',
      manualModelMode: 'Add Manually',
      scanningModels: 'Scanning available models…',
      noScannedModels:
        'No available chat models were found. Check the provider configuration.',
      scanModelsFailed:
        'Model scanning failed. Check the URL and API key, then try again.',
      manualFallbackFailed:
        'Automatic scanning failed. Enter a model ID supported by the provider.',
      manualFallbackEmpty:
        'No models were found. Enter a model ID supported by the provider.',
      manualModelId: 'Model ID',
      manualModelIdPlaceholder: 'For example: gpt-4o',
      manualModelIdDescription:
        'Enter the model parameter used in model requests.',
      manualModelOptions: 'Optional Model Capabilities',
      editProvider: 'Edit provider',
      rescanModels: 'Scan models again',
      moreFeaturesTitle: 'Add More Agent Features',
      moreFeaturesDescription:
        'Open the workbench to add tools, knowledge bases, and other capabilities to the Agent that was just generated automatically.',
      runnerDescription:
        'Select a runner for the external agent and configure its connection.',
      backToChoices: 'Back to options',
      createExternal: 'Create and Bind',
      finishWithModel: 'Use Selected Model & Finish',
      openWorkbench: 'Open Workbench',
    },
    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',
    connecting: 'Connecting to WeChat service...',
    waitingForScan: 'Waiting for scan',
    retry: 'Retry',
  },
  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;
