mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-26 12:17:14 +00:00
2311 lines
94 KiB
TypeScript
2311 lines
94 KiB
TypeScript
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',
|
||
showSecret: 'Show secret',
|
||
hideSecret: 'Hide secret',
|
||
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 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.',
|
||
eventBindings: 'Event Routes',
|
||
addEventBinding: 'Add Route',
|
||
addBehavior: 'Add behavior',
|
||
behaviorReplyMessages: 'Reply to messages',
|
||
behaviorReplyMessagesDescription:
|
||
'Send incoming messages to an Agent or Pipeline.',
|
||
behaviorWelcomeMembers: 'Welcome new members',
|
||
behaviorWelcomeMembersDescription:
|
||
'Run an Agent when someone joins a group.',
|
||
behaviorHandleDepartures: 'Handle member departures',
|
||
behaviorHandleDeparturesDescription:
|
||
'Run an Agent when someone leaves or is removed.',
|
||
behaviorReviewFriendRequests: 'Review friend requests',
|
||
behaviorReviewFriendRequestsDescription:
|
||
'Let an Agent decide how to handle a new request.',
|
||
behaviorHandleModeration: 'Handle moderation events',
|
||
behaviorHandleModerationDescription:
|
||
'Run an Agent when a group member is restricted.',
|
||
behaviorCustom: 'Configure another event',
|
||
behaviorCustomDescription:
|
||
'Add a route and choose from every event supported by this adapter.',
|
||
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',
|
||
adapterEventsTitle: 'Supported events',
|
||
adapterEventsDescription: '{{count}} event types',
|
||
adapterEventsMore: '{{count}} more',
|
||
advancedEventValues: 'View all',
|
||
eventGroup: 'Group',
|
||
routeConflictTitle: 'Some routes overlap',
|
||
routeConflictShadowed:
|
||
'{{shadowed}} may never run because {{winner}} handles the same events first.',
|
||
routeConflictMore: '{{count}} more route conflicts need attention.',
|
||
routeFallbackCatchAll: '{{route}} is the catch-all route.',
|
||
routeFallbackIgnored:
|
||
'Events that match no route are ignored. Add a catch-all route only when every event needs an explicit outcome.',
|
||
testRoute: 'Test route',
|
||
refreshRouteStatus: 'Refresh status',
|
||
routeStatusIdle: 'No run yet',
|
||
routeStatusRefreshFailed: 'Failed to refresh route status.',
|
||
routeStatus: {
|
||
matched: 'Matched',
|
||
delivered: 'Delivered',
|
||
discarded: 'Discarded',
|
||
failed: 'Failed',
|
||
not_matched: 'Not matched',
|
||
test_started: 'Testing',
|
||
},
|
||
routeStatusDetail: {
|
||
matched: 'This route matched the event.',
|
||
delivered: 'The processor received the event.',
|
||
discarded: 'The event was intentionally discarded.',
|
||
failed: 'The route could not finish.',
|
||
not_matched: 'No configured route matched the event.',
|
||
test_started: 'The saved route is running.',
|
||
},
|
||
routeFailure: {
|
||
binding_disabled: 'This route is disabled.',
|
||
event_pattern_mismatch: 'The event does not match this route.',
|
||
filters_mismatch: 'The sample data does not meet the route conditions.',
|
||
lower_priority: 'Another matching route has higher priority.',
|
||
route_not_found: 'No route matched this event.',
|
||
processor_incompatible:
|
||
'The selected processor cannot handle this event.',
|
||
processor_not_found: 'The selected processor is unavailable.',
|
||
processor_disabled: 'The selected processor is disabled.',
|
||
runner_failed: 'The Agent runner failed while processing the event.',
|
||
delivery_failed: 'The processor finished, but delivery failed.',
|
||
},
|
||
routeTestAction: 'Run saved configuration',
|
||
routeTestRunning: 'Running…',
|
||
routeTestFailed: 'Failed to run the saved route. Try again later.',
|
||
routeTestDispatched:
|
||
'The saved route ran successfully. {{count}} platform actions were blocked.',
|
||
routeTestSideEffectWarning:
|
||
'The processor and tools will run, but replies will not be sent to messaging platforms.',
|
||
dryRunTitle: 'Test route',
|
||
dryRunDescription:
|
||
'Preview the match first. Run the saved configuration only when you need to test the processor.',
|
||
dryRunEventType: 'Event type',
|
||
dryRunSampleReady: 'Sample event is ready',
|
||
dryRunSampleDescription:
|
||
'LangBot prepared example data for {{event}}. Most route tests can use it as-is.',
|
||
dryRunEditPayload: 'Test data',
|
||
dryRunHidePayload: 'Hide data',
|
||
dryRunPayload: 'Test data (JSON)',
|
||
dryRunPayloadHint: 'Use this to test message and conversation conditions.',
|
||
dryRunPayloadJsonError: 'Enter valid JSON.',
|
||
dryRunPayloadObjectError: 'Payload must be a JSON object.',
|
||
dryRunNeedsSavedBot: 'Save the bot before testing routes.',
|
||
dryRunFailed: 'Route test failed. Try again later.',
|
||
dryRunAction: 'Preview match',
|
||
dryRunRunning: 'Testing…',
|
||
dryRunMatched: 'Route matched',
|
||
dryRunNotMatched: 'No route matched',
|
||
dryRunTarget: 'Target processor',
|
||
dryRunNoTarget: 'No target',
|
||
dryRunMatchedRule: 'Matched rule',
|
||
dryRunRuleIndex: 'Route {{index}}',
|
||
dryRunNoRule: 'No matched rule',
|
||
dryRunDiagnostics: 'Diagnostic steps',
|
||
dryRunDiagnosticSelected: '{{route}} was selected.',
|
||
dryRunDiagnosticMatched: '{{route}} matched. {{reason}}',
|
||
dryRunDiagnosticSkipped: '{{route}} was skipped. {{reason}}',
|
||
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',
|
||
},
|
||
eventDescriptions: {
|
||
all: 'Matches every event received by this adapter.',
|
||
namespace: 'Matches several concrete events in the same event group.',
|
||
custom: 'A custom event, or one without a description yet.',
|
||
message_received: 'A user or group sends a new message to the bot.',
|
||
message_edited: 'The platform reports that an existing message changed.',
|
||
message_deleted:
|
||
'The platform reports that an existing message was deleted.',
|
||
message_reaction: 'A user adds or removes a reaction on a message.',
|
||
feedback_received: 'Feedback is received from the platform or user.',
|
||
friend_request_received: 'Someone requests to add the bot as a friend.',
|
||
friend_added: 'A friend relationship was created.',
|
||
group_member_joined: 'A member joins a group where the bot is present.',
|
||
group_member_left: 'A member leaves a group where the bot is present.',
|
||
group_member_banned: 'A group member is banned or removed.',
|
||
bot_invited_to_group: 'The bot is invited to a group.',
|
||
bot_removed_from_group: 'The bot is removed from a group.',
|
||
bot_muted: 'The bot is muted in a group.',
|
||
bot_unmuted: 'The bot is unmuted in a group.',
|
||
platform_specific: 'An adapter-specific platform 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: 'Processors',
|
||
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:
|
||
'Use a visual multi-stage flow to control message preprocessing, AI, postprocessing, extensions, and output. Message events only.',
|
||
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.',
|
||
runnerStatusLoading: 'Checking runner status',
|
||
runnerStatusCheckFailed: 'Runner status could not be checked',
|
||
runnerStatusCheckFailedDescription:
|
||
'Retry the check. If it still fails, verify the backend and plugin runtime.',
|
||
noRunnersAvailable: 'No runners are available',
|
||
noRunnersAvailableDescription:
|
||
'Install and enable an AgentRunner extension before configuring this Agent.',
|
||
selectedRunnerUnavailable: 'Selected runner is unavailable',
|
||
selectedRunnerUnavailableDescription:
|
||
'{{runner}} is not currently registered. Select another runner or restore its extension.',
|
||
noRunnerSelected: 'No runner selected',
|
||
runnerConfigIncomplete: 'Runner configuration incomplete',
|
||
runnerConfigIncompleteDescription: 'Complete required fields: {{fields}}',
|
||
runnerReady: 'Runner ready',
|
||
runnerReadyDescription:
|
||
'{{runner}} is registered and the plugin runtime is connected.',
|
||
debugTab: 'Event Debug',
|
||
debugTitle: 'Agent Event Debug',
|
||
debugDescription:
|
||
'Run the current Agent with a message or platform event and inspect the real output.',
|
||
debugResetSession: 'Reset session',
|
||
debugEventType: 'Event type',
|
||
debugMessageReceived: 'Message received',
|
||
debugGroupMemberJoined: 'Group member joined',
|
||
debugGroupMemberLeft: 'Group member left',
|
||
debugFriendRequested: 'Friend request received',
|
||
debugFeedbackReceived: 'Feedback received',
|
||
debugCustomEvent: 'Custom event',
|
||
debugCustomEventType: 'Custom event name',
|
||
debugMessageInput: 'Conversation input',
|
||
debugEventSummary: 'Event summary',
|
||
debugInputPlaceholder: 'Enter what the Agent should handle',
|
||
debugEventPayload: 'Event payload (JSON)',
|
||
debugSupportedEvents: 'Agent supports',
|
||
debugRun: 'Run test',
|
||
debugSaveAndRun: 'Save and run',
|
||
debugRunning: 'Running',
|
||
debugTranscript: 'Debug transcript',
|
||
debugTranscriptDescription:
|
||
'Inputs and Agent outputs from the current debug session.',
|
||
debugEmptyTitle: 'Verify how this Agent behaves',
|
||
debugEmptyTranscript:
|
||
'Choose an event, enter test content, then select “Run test”. Results stay on this page.',
|
||
debugAgentOutput: 'Agent output',
|
||
debugTestInput: 'Test input',
|
||
debugNoTextOutput: 'The run completed without textual output.',
|
||
debugEventTypeRequired: 'Enter an event type',
|
||
debugInputRequired: 'Enter a conversation input',
|
||
debugInvalidPayload: 'The event payload must be a valid JSON object',
|
||
debugUnsupportedEvent:
|
||
'This event is outside the Agent’s bindable event range',
|
||
debugRunnerConfigInvalidDescription:
|
||
'The runner configuration is incomplete: {{message}}',
|
||
debugRunnerExecutionFailedDescription:
|
||
'This run failed. Check the selected model and runner configuration, then try again.',
|
||
debugRunnerTimeoutDescription:
|
||
'The run timed out. Try again later or adjust the runner timeout.',
|
||
debugApiKeyRequired: 'API Key is missing',
|
||
debugOpenRunnerConfig: 'Open runner configuration',
|
||
debugReviewRunnerConfig: 'Review runner configuration',
|
||
debugErrorDetails: 'View error details',
|
||
debugRunFailed: 'Agent debug run failed',
|
||
},
|
||
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',
|
||
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',
|
||
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: {
|
||
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',
|
||
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',
|
||
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 > Agent Runner.',
|
||
enableAllMCPServersTooltip:
|
||
'When enabled, all configured and enabled MCP servers become candidates for MCP tools and resources in AI Feature.',
|
||
},
|
||
agentRunner: {
|
||
toolsTitle: 'Tools',
|
||
toolsDescription:
|
||
'Select plugin, MCP, skill, and built-in tools available to this Agent Runner.',
|
||
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 Agent Runner.',
|
||
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',
|
||
saveAndSend: 'Save and 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: 'Processor created and linked to the 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',
|
||
scenarioChannel: 'Scenario & Channel',
|
||
botConfig: 'Bot Setup',
|
||
aiEngine: 'AI Engine',
|
||
done: 'Done',
|
||
},
|
||
scenario: {
|
||
title: 'What should this bot do?',
|
||
description:
|
||
'Start with one outcome. You can add more behaviors after the bot is created.',
|
||
messageReply: 'Reply to messages',
|
||
messageReplyDescription:
|
||
'Answer incoming private or group messages with an AI Pipeline.',
|
||
welcomeMembers: 'Welcome new members',
|
||
welcomeMembersDescription: 'Run an Agent when someone joins a group.',
|
||
welcomeMembersPrompt:
|
||
'Welcome new group members with a short, friendly message. Use the available member and group context when present. Do not mention internal event names or system details.',
|
||
handleDepartures: 'Handle member departures',
|
||
handleDeparturesDescription:
|
||
'Run an Agent when someone leaves or is removed.',
|
||
handleDeparturesPrompt:
|
||
'Respond to group member departures with a brief, respectful message when a public response is appropriate. Do not speculate about why the member left or mention internal event names.',
|
||
handleModeration: 'Handle moderation events',
|
||
handleModerationDescription:
|
||
'Run an Agent when a group member is restricted.',
|
||
handleModerationPrompt:
|
||
'Write a concise, neutral group notice about the member restriction using only the available context. Do not invent details or mention internal event names.',
|
||
pipelineBadge: 'Pipeline',
|
||
agentBadge: 'Agent',
|
||
},
|
||
platform: {
|
||
title: 'Select a Channel',
|
||
description:
|
||
'Only channels that support the selected scenario are shown.',
|
||
chooseScenarioFirst: 'Choose a scenario to see compatible channels.',
|
||
noCompatiblePlatforms:
|
||
'No installed channel currently supports this scenario.',
|
||
},
|
||
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.",
|
||
loadingCatalog: 'Loading AgentRunner extensions...',
|
||
catalogUnavailable: 'Runner catalog is unavailable',
|
||
catalogUnavailableDescription:
|
||
'Installed runners are still available. Retry the catalog or browse Extensions.',
|
||
noMarketplaceRunners: 'No AgentRunner extensions are published yet',
|
||
noMarketplaceRunnersDescription:
|
||
'Retry after runner extensions are published to the configured Marketplace.',
|
||
browseRunners: 'Browse Runner Extensions',
|
||
installAndContinue: 'Install & Continue',
|
||
installing: 'Installing...',
|
||
useInstalled: 'Use This Runner',
|
||
installedUnavailable: 'Installed, Runner Unavailable',
|
||
installSuccess: '{{runner}} installed and selected',
|
||
installFailed: 'Failed to install the Runner extension',
|
||
versionUnavailable:
|
||
'The Marketplace did not return an installable version.',
|
||
installTimeout:
|
||
'Runner installation timed out. Check the task in Extensions.',
|
||
registrationTimeout:
|
||
'The extension installed, but its Runner did not register. Check the plugin runtime and retry.',
|
||
},
|
||
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 its processor. 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;
|