mirror of
https://github.com/Tencent/WeKnora.git
synced 2026-06-04 13:30:32 +08:00
- Introduced new components: AgentCreateContextualGuide, KbCreateContextualGuide, TenantModelsGuide, and SpotlightGuide to enhance user onboarding. - Implemented dynamic step configurations for each guide, allowing tailored user experiences based on context. - Enhanced the existing NewUserGuide component to utilize the new SpotlightGuide for improved visual guidance. - Updated localization files to include new strings for contextual guides, ensuring a comprehensive user experience across languages. - Refactored existing components to integrate with the new guide system, improving maintainability and user interaction.
5313 lines
232 KiB
TypeScript
Executable File
5313 lines
232 KiB
TypeScript
Executable File
export default {
|
||
menu: {
|
||
knowledgeBase: 'Knowledge Base',
|
||
agents: 'Agents',
|
||
organizations: 'Shared Spaces',
|
||
chat: 'Chat',
|
||
createChat: 'Create Chat',
|
||
tenant: 'Account Info',
|
||
settings: 'System Settings',
|
||
logout: 'Logout',
|
||
uploadKnowledge: 'Upload Knowledge',
|
||
deleteRecord: 'Delete Record',
|
||
clearMessages: 'Clear Messages',
|
||
clearMessagesSuccess: 'Messages cleared',
|
||
clearMessagesFailed: 'Failed to clear messages, please try again later',
|
||
batchManage: 'Batch Manage',
|
||
newSession: 'New Chat',
|
||
pin: 'Pin',
|
||
unpin: 'Unpin',
|
||
pinned: 'Pinned',
|
||
pinFailed: 'Failed to pin, please try again later',
|
||
unpinFailed: 'Failed to unpin, please try again later',
|
||
confirmLogout: 'Are you sure you want to logout?',
|
||
systemInfo: 'System Information',
|
||
search: 'Search',
|
||
collapseSidebar: 'Collapse Sidebar',
|
||
expandSidebar: 'Expand Sidebar',
|
||
logoutSuccess: 'Logged out successfully',
|
||
},
|
||
newUserGuide: {
|
||
stepOf: '{current} / {total}',
|
||
skip: 'Skip',
|
||
prev: 'Back',
|
||
next: 'Next',
|
||
done: 'Done',
|
||
reopen: 'Product tour',
|
||
steps: {
|
||
welcome: {
|
||
title: 'Welcome to WeKnora',
|
||
desc: 'A few quick steps to get you familiar with knowledge bases, chat and agents. Click "Next" to begin.',
|
||
},
|
||
knowledge: {
|
||
title: 'Create your knowledge base',
|
||
desc: 'Everything starts here: upload documents, web pages or FAQs and WeKnora parses and indexes them automatically. Click here to open knowledge bases.',
|
||
},
|
||
chat: {
|
||
title: 'Start an AI chat',
|
||
desc: 'Ask questions grounded in your knowledge base and get accurate answers with cited sources. Click here to start a new chat.',
|
||
},
|
||
agents: {
|
||
title: 'Build dedicated agents',
|
||
desc: 'Combine knowledge bases, prompts and tools into reusable agents that capture your expertise.',
|
||
},
|
||
settings: {
|
||
title: 'Account & settings',
|
||
desc: 'Open this to manage your account, members and system settings. You can also reopen this tour from here anytime.',
|
||
},
|
||
models: {
|
||
title: 'Configure your models',
|
||
desc: 'A key step: add chat, embedding and other models in Model Management so knowledge bases and chat can work. Click "Add model" to get started.',
|
||
},
|
||
done: {
|
||
title: 'You are all set',
|
||
desc: 'You now know the essentials — start building your knowledge assistant! You can revisit this tour from the user menu anytime.',
|
||
},
|
||
},
|
||
},
|
||
contextualGuide: {
|
||
stepOf: '{current} / {total}',
|
||
skip: 'Skip',
|
||
prev: 'Back',
|
||
next: 'Next',
|
||
done: 'Got it',
|
||
interactHint: 'Click the highlighted area to continue',
|
||
kbList: {
|
||
steps: {
|
||
create: {
|
||
title: 'Create your first knowledge base',
|
||
desc: 'Knowledge bases hold documents and FAQs. Click the highlighted "New knowledge base" button below and we will walk you through the form.',
|
||
},
|
||
},
|
||
},
|
||
tenantModels: {
|
||
needModelsFirst: 'Add a chat model and an Embedding model before creating a knowledge base.',
|
||
needChatModelFirst: 'Add a chat model (KnowledgeQA) before creating an agent.',
|
||
steps: {
|
||
intro: {
|
||
title: 'Configure models first',
|
||
desc: 'A document knowledge base needs at least one chat model (summaries and Q&A) and one Embedding model (vector search). Add them in system settings.',
|
||
},
|
||
addModel: {
|
||
title: 'Add models',
|
||
desc: 'Click "Add model" and configure KnowledgeQA (chat) and Embedding types. Lite users can pull local models via Ollama.',
|
||
},
|
||
done: {
|
||
title: 'Then continue',
|
||
desc: 'After saving models, close settings and click "New knowledge base". The wizard will walk you through type, indexing, and model binding.',
|
||
},
|
||
},
|
||
stepsAgent: {
|
||
intro: {
|
||
title: 'Configure a chat model first',
|
||
desc: 'Creating an agent requires at least one KnowledgeQA model. Add it in system settings (Embedding is only required for knowledge bases).',
|
||
},
|
||
addModel: {
|
||
title: 'Add a chat model',
|
||
desc: 'Click "Add model" and configure a KnowledgeQA type.',
|
||
},
|
||
done: {
|
||
title: 'Then create an agent',
|
||
desc: 'After saving, close settings and click "Create agent". The wizard covers mode, knowledge bases, and multimodal options.',
|
||
},
|
||
},
|
||
},
|
||
kbCreate: {
|
||
steps: {
|
||
type: {
|
||
title: 'Choose a type',
|
||
desc: 'Document bases are for PDFs, Word files, and similar uploads. FAQ bases are for question–answer pairs. The type cannot be changed later.',
|
||
},
|
||
name: {
|
||
title: 'Enter a name',
|
||
desc: 'Pick a clear name such as "Product manual" or "Support FAQ". Description is optional.',
|
||
},
|
||
indexing: {
|
||
title: 'Indexing capabilities',
|
||
desc: 'Vector and keyword search are on by default. You can also enable Wiki or knowledge-graph indexing. Keep at least one search mode enabled.',
|
||
},
|
||
navModels: {
|
||
title: 'Model setup (required)',
|
||
desc: 'Every knowledge base needs a chat model; retrieval also requires an Embedding model. Open "Model configuration" on the left.',
|
||
},
|
||
llm: {
|
||
title: 'Chat / summary model',
|
||
desc: 'Used for summaries and answers. If the list is empty, use the dropdown to open settings and add a model.',
|
||
},
|
||
embedding: {
|
||
title: 'Embedding model',
|
||
desc: 'Turns text into vectors for semantic search. Works with vector/keyword indexing above.',
|
||
},
|
||
parser: {
|
||
title: 'Parser engine (optional)',
|
||
desc: 'How PDFs and Office files are parsed. Defaults work for most cases; adjust if you need OCR or special layouts.',
|
||
},
|
||
chunking: {
|
||
title: 'Chunking (optional)',
|
||
desc: 'How documents are split for retrieval. Default chunk sizes are tuned for RAG and rarely need changes.',
|
||
},
|
||
storage: {
|
||
title: 'Storage (optional)',
|
||
desc: 'Where raw files are stored (local or object storage). The tenant default is usually fine.',
|
||
},
|
||
navMultimodal: {
|
||
title: 'Multimodal / images (optional)',
|
||
desc: 'Enable this if documents contain charts, scans, or image-heavy content that needs vision understanding.',
|
||
},
|
||
multimodalToggle: {
|
||
title: 'Enable multimodal parsing',
|
||
desc: 'When on, image-bearing uploads are processed with a vision-language model for better retrieval.',
|
||
},
|
||
multimodalVllm: {
|
||
title: 'Choose a VLM model',
|
||
desc: 'Multimodal requires a VLM. Add one in system settings if the list is empty.',
|
||
},
|
||
faq: {
|
||
title: 'FAQ indexing',
|
||
desc: 'Choose how Q&A pairs are indexed. You can add FAQ entries after creation.',
|
||
},
|
||
submit: {
|
||
title: 'Create the knowledge base',
|
||
desc: 'When type, name, and models look correct, click the highlighted Create button. You will then be guided to upload your first document.',
|
||
},
|
||
},
|
||
},
|
||
agentList: {
|
||
steps: {
|
||
create: {
|
||
title: 'Create your agent',
|
||
desc: 'Agents combine models, knowledge bases, tools, and prompts into reusable assistants. Click the highlighted "Create agent" button.',
|
||
},
|
||
},
|
||
},
|
||
agentCreate: {
|
||
steps: {
|
||
mode: {
|
||
title: 'Choose run mode',
|
||
desc: '"Quick answer" for straightforward Q&A; "Smart reasoning" uses tools and multi-step thinking for complex tasks.',
|
||
},
|
||
agentType: {
|
||
title: 'Choose an agent type',
|
||
desc: 'Presets fill in the system prompt, recommended tools, and knowledge scope (e.g. Wiki builder, data analysis). Switch by scenario—name and description update accordingly.',
|
||
},
|
||
name: {
|
||
title: 'Name and description',
|
||
desc: 'Pick a recognizable name. Smart-reasoning mode may pre-fill a default you can edit.',
|
||
},
|
||
navModel: {
|
||
title: 'Bind a chat model',
|
||
desc: 'Every agent needs a KnowledgeQA model as its reasoning engine.',
|
||
},
|
||
model: {
|
||
title: 'Select model',
|
||
desc: 'Choose from configured chat models, or add one in system settings first.',
|
||
},
|
||
navKnowledge: {
|
||
title: 'Link knowledge bases',
|
||
desc: 'Control which knowledge the agent can retrieve. Default is all knowledge bases.',
|
||
},
|
||
knowledge: {
|
||
title: 'Knowledge scope',
|
||
desc: '"All" for general assistants; "Selected" for a domain; "None" relies on the model alone or web search.',
|
||
},
|
||
navWebsearch: {
|
||
title: 'Web search (optional)',
|
||
desc: 'Allow the agent to call external search for up-to-date information.',
|
||
},
|
||
navMultimodal: {
|
||
title: 'Image upload (optional)',
|
||
desc: 'Lets users send images in chat; requires a VLM model in system settings.',
|
||
},
|
||
multimodal: {
|
||
title: 'Enable image understanding',
|
||
desc: 'Turn on the switch and select a VLM below when enabled.',
|
||
},
|
||
navTools: {
|
||
title: 'Tools & MCP (optional)',
|
||
desc: 'In smart-reasoning mode, enable built-in tools and MCP services for search, code, and more.',
|
||
},
|
||
submit: {
|
||
title: 'Save the agent',
|
||
desc: 'Click the highlighted confirm button to finish. You can then select this agent in chat.',
|
||
},
|
||
},
|
||
},
|
||
kbDetail: {
|
||
steps: {
|
||
intro: {
|
||
title: 'This knowledge base is empty',
|
||
desc: 'Add your first item so you can search and chat over it. You can also drag and drop supported file types.',
|
||
},
|
||
upload: {
|
||
title: 'Add documents',
|
||
desc: 'Use this menu to upload files or folders, import a URL, or create content online.',
|
||
},
|
||
done: {
|
||
title: 'Ready after parsing',
|
||
desc: 'Once documents are indexed, mention this knowledge base in chat with @ to get answers with citations.',
|
||
},
|
||
},
|
||
},
|
||
chat: {
|
||
steps: {
|
||
kb: {
|
||
title: 'Choose knowledge scope',
|
||
desc: 'Click @ to pick one or more knowledge bases or files. Answers use only the selection; otherwise the current agent settings apply.',
|
||
},
|
||
input: {
|
||
title: 'Type your question',
|
||
desc: 'Describe what you want to know, or click a suggested question above to get started quickly.',
|
||
},
|
||
send: {
|
||
title: 'Send to start chatting',
|
||
desc: 'Sending creates a new session. The AI answers using your knowledge base and shows cited passages.',
|
||
},
|
||
done: {
|
||
title: 'You are ready to explore',
|
||
desc: 'Try a question related to your uploaded documents and see grounded answers with references.',
|
||
},
|
||
},
|
||
},
|
||
},
|
||
batchManage: {
|
||
title: 'Manage Conversations',
|
||
selectAll: 'Select All',
|
||
cancel: 'Cancel',
|
||
delete: 'Delete Conversations',
|
||
deleteConfirmTitle: 'Delete Conversations',
|
||
deleteConfirmBody: 'Are you sure you want to delete the selected {count} conversation(s)? This action cannot be undone.',
|
||
deleteAllConfirmBody: 'Are you sure you want to delete all conversations? This action cannot be undone.',
|
||
deleteSuccess: 'Deleted successfully',
|
||
deleteFailed: 'Delete failed, please try again later',
|
||
noSelection: 'Please select at least one conversation',
|
||
loadFailed: 'Failed to load conversations',
|
||
},
|
||
listSpaceSidebar: {
|
||
title: 'Filter',
|
||
all: 'All',
|
||
workspace: 'Workspace',
|
||
mine: 'Mine',
|
||
spaces: 'Shared with me',
|
||
favorites: 'Starred',
|
||
recents: 'Recent'
|
||
},
|
||
listFilter: {
|
||
creator: 'Creator',
|
||
allCreators: 'All',
|
||
createdByMe: 'Created by me',
|
||
createdByOthers: 'Created by others'
|
||
},
|
||
resourceOrigin: {
|
||
mine: 'Mine',
|
||
mineTooltip: 'Created by you',
|
||
tenant: 'Workspace',
|
||
tenantTooltip: 'Created by another member of this workspace',
|
||
tenantTooltipWithCreator: 'Created by {creator}',
|
||
space: 'Space',
|
||
spaceTooltip: 'Shared via space "{space}"',
|
||
spaceTooltipWithTenant: 'Shared via space "{space}" · from {tenant}',
|
||
shared: 'External',
|
||
sharedTooltip: 'Accessed from an external tenant via a shared space'
|
||
},
|
||
knowledgeBase: {
|
||
title: 'Knowledge Base',
|
||
list: 'Knowledge Base List',
|
||
fileContent: 'File Content',
|
||
detail: 'Knowledge Base Details',
|
||
accessInfo: {
|
||
myRole: 'My role',
|
||
roleOwner: 'Owner',
|
||
permissionOwner: 'Edit, manage settings, delete knowledge base',
|
||
permissionAdmin: 'Edit, manage sharing',
|
||
permissionEditor: 'Edit documents and categories',
|
||
permissionViewer: 'View and search only',
|
||
fromOrg: 'From space',
|
||
sharedAt: 'Shared at',
|
||
lastUpdated: 'Last updated',
|
||
},
|
||
infoCard: {
|
||
tooltip: 'View knowledge base info',
|
||
title: 'Knowledge Base Info',
|
||
basic: 'Basic',
|
||
access: 'Access',
|
||
binding: 'Storage Binding',
|
||
capabilities: 'Capabilities',
|
||
stats: 'Statistics',
|
||
type: 'Type',
|
||
createdAt: 'Created at',
|
||
source: 'Source',
|
||
sharedTo: 'Shared to',
|
||
enabled: 'Enabled',
|
||
vectorStore: 'Vector store',
|
||
fileStorage: 'File storage',
|
||
documentCount: 'Documents',
|
||
faqCount: 'FAQs',
|
||
supportedFileTypes: 'Accepted formats',
|
||
chunking: 'Chunking',
|
||
parentShort: 'parent',
|
||
childShort: 'child',
|
||
},
|
||
create: 'Create Knowledge Base',
|
||
edit: 'Edit Knowledge Base',
|
||
delete: 'Delete Knowledge Base',
|
||
name: 'Name',
|
||
description: 'Description',
|
||
files: 'Files',
|
||
settings: 'Settings',
|
||
documentCategoryTitle: 'Document Categories',
|
||
tagUpdateSuccess: 'Tag updated successfully',
|
||
category: 'Category',
|
||
faqCategoryTitle: 'FAQ Categories',
|
||
untagged: 'Uncategorized',
|
||
tagClearAction: 'Clear category',
|
||
tagSearchTooltip: 'Search tags',
|
||
tagCreateAction: 'Create tag',
|
||
tagSearchPlaceholder: 'Type to filter tags',
|
||
tagNamePlaceholder: 'Enter tag name',
|
||
tagNameRequired: 'Please provide a tag name',
|
||
tagCreateSuccess: 'Tag created',
|
||
tagEditSuccess: 'Tag updated',
|
||
tagDeleteTitle: 'Delete tag',
|
||
tagDeleteDesc: 'Delete tag "{name}"? All FAQ entries under this tag will also be deleted.',
|
||
tagDeleteDescDoc: 'Delete tag "{name}"? All documents under this tag will also be deleted.',
|
||
tagDeleteSuccess: 'Tag deleted',
|
||
tagEditAction: 'Rename',
|
||
tagDeleteAction: 'Delete',
|
||
tagEmptyResult: 'No matching tags',
|
||
tagLabel: 'Category',
|
||
tagPlaceholder: 'Please select a category',
|
||
noTags: 'No categories',
|
||
upload: 'Upload File',
|
||
uploadSuccess: 'File uploaded successfully!',
|
||
uploadFailed: 'File upload failed!',
|
||
docActionUnsupported: 'This knowledge base type does not support this action',
|
||
fileExists: 'File already exists',
|
||
uploadingMultiple: 'Uploading {total} files...',
|
||
uploadAllSuccess: 'Successfully uploaded {count} files!',
|
||
uploadPartialSuccess: 'Upload completed: {success} succeeded, {fail} failed',
|
||
uploadAllFailed: 'All files failed to upload',
|
||
uploadingFolder: 'Uploading {total} files from folder...',
|
||
uploadingValidFiles: 'Uploading {valid}/{total} valid files...',
|
||
noValidFiles: 'No valid files',
|
||
noValidFilesInFolder: 'All {total} files in folder are unsupported',
|
||
noValidFilesSelected: 'All selected files are unsupported',
|
||
hiddenFilesFiltered: 'Filtered {count} hidden files',
|
||
imagesFilteredNoVLM: 'Filtered {count} image files (VLM not enabled)',
|
||
videosFilteredNoVLM: 'Skipped {count} video file(s) (video upload is not supported)',
|
||
audiosFilteredNoASR: 'Filtered {count} audio files (ASR not enabled)',
|
||
invalidFilesFiltered: 'Filtered {count} unsupported files',
|
||
unsupportedFileType: 'Unsupported file type',
|
||
unsupportedTypesHint: 'Some document types ({types}) have no available parser engine and cannot be processed',
|
||
goToParserSettings: 'Configure',
|
||
failedFilesList: 'Failed files:',
|
||
andMoreFiles: '...and {count} more files',
|
||
duplicateFilesSkipped: '{count} duplicate files skipped',
|
||
uploadFile: 'Upload File',
|
||
uploadFileDesc: 'Supports PDF, Word, TXT, images, audio, etc.',
|
||
importURL: 'Import from URL',
|
||
addDocument: 'Add Document',
|
||
importURLDesc: 'Import via URL link',
|
||
importURLTitle: 'Import from URL',
|
||
manualCreate: 'Manual Create',
|
||
manualCreateDesc: 'Write document content directly',
|
||
urlRequired: 'Please enter a URL',
|
||
invalidURL: 'Please enter a valid URL',
|
||
urlImportSuccess: 'URL imported successfully!',
|
||
urlImportFailed: 'URL import failed!',
|
||
urlExists: 'This URL already exists',
|
||
urlLabel: 'URL Address',
|
||
urlPlaceholder: 'Enter webpage URL, e.g., https://example.com',
|
||
urlTip: 'Supports importing various webpage contents. The system will automatically extract and parse text content from the webpage',
|
||
typeURL: 'URL',
|
||
typeManual: 'Manual',
|
||
typeFile: 'File',
|
||
channelLabel: 'Source Channel',
|
||
channelWeb: 'Web',
|
||
channelApi: 'API',
|
||
channelBrowserExtension: 'Browser Extension',
|
||
channelWechat: 'WeChat',
|
||
channelWecom: 'WeCom',
|
||
channelFeishu: 'Feishu',
|
||
channelDingtalk: 'DingTalk',
|
||
channelSlack: 'Slack',
|
||
channelIm: 'IM Channel',
|
||
channelNotion: 'Notion',
|
||
channelYuque: 'Yuque',
|
||
channelUpload: 'Upload',
|
||
channelManual: 'Manual',
|
||
channelUrl: 'Web',
|
||
channelUnknown: 'Unknown',
|
||
urlSource: 'Source URL',
|
||
documentTitle: 'Document Title',
|
||
webContent: 'Web Content',
|
||
documentContent: 'Document Content',
|
||
importTime: 'Import Time',
|
||
createTime: 'Create Time',
|
||
createdAt: 'Created',
|
||
updatedAt: 'Updated',
|
||
clickToViewFull: 'Click card to view full text and chunks',
|
||
characters: 'chars',
|
||
segment: 'Segment',
|
||
chunkCount: 'Total {count} segments',
|
||
viewOriginal: 'View Original File',
|
||
viewChunks: 'View Chunks',
|
||
viewMerged: 'Full Text',
|
||
originalFileNotSupported: 'This file type does not support original file view. Please download to view.',
|
||
loadOriginalFailed: 'Failed to load original file content',
|
||
questions: 'Questions',
|
||
generatedQuestions: 'Generated Questions',
|
||
childChunk: 'Child Chunk',
|
||
viewParentContext: 'View Parent Context',
|
||
parentContextLoadFailed: 'Failed to load parent context',
|
||
confirmDeleteQuestion: 'Are you sure you want to delete this question? The corresponding vector index will also be removed.',
|
||
legacyQuestionCannotDelete: 'Legacy format questions cannot be deleted. Please regenerate questions.',
|
||
notInitialized: 'Knowledge base is not initialized. Please configure models in settings before uploading files',
|
||
missingStorageEngine: 'This knowledge base has no storage engine selected. Please configure a storage engine in settings before uploading content.',
|
||
missingStorageEngineUpload: 'Please configure a storage engine before uploading content',
|
||
goToStorageSettings: 'Go to Settings',
|
||
getInfoFailed: 'Failed to get knowledge base information, file upload is not possible',
|
||
missingId: 'Knowledge base ID is missing',
|
||
deleteFailed: 'Delete failed. Please try again later!',
|
||
quickActions: 'Quick Actions',
|
||
createKnowledgeBase: 'Create Knowledge Base',
|
||
knowledgeBaseName: 'Knowledge Base Name',
|
||
enterName: 'Enter knowledge base name',
|
||
embeddingModel: 'Embedding Model',
|
||
selectEmbeddingModel: 'Select embedding model',
|
||
summaryModel: 'Summary Model',
|
||
selectSummaryModel: 'Select summary model',
|
||
rerankModel: 'Rerank Model',
|
||
selectRerankModel: 'Select rerank model (optional)',
|
||
createSuccess: 'Knowledge base created successfully',
|
||
createFailed: 'Failed to create knowledge base',
|
||
updateSuccess: 'Knowledge base updated successfully',
|
||
updateFailed: 'Failed to update knowledge base',
|
||
deleteConfirm: 'Are you sure you want to delete this knowledge base?',
|
||
fileName: 'File Name',
|
||
fileSize: 'File Size',
|
||
uploadTime: 'Upload Time',
|
||
status: 'Status',
|
||
actions: 'Actions',
|
||
processing: 'Processing',
|
||
completed: 'Completed',
|
||
failed: 'Failed',
|
||
noFiles: 'No files',
|
||
dragFilesHere: 'Drag files here or',
|
||
clickToUpload: 'click to upload',
|
||
supportedFormats: 'Supported formats',
|
||
maxFileSize: 'Max file size',
|
||
viewDetails: 'View Details',
|
||
downloadFile: 'Download File',
|
||
deleteFile: 'Delete File',
|
||
confirmDeleteFile: 'Are you sure you want to delete this file?',
|
||
totalFiles: 'Total files',
|
||
totalSize: 'Total size',
|
||
// Additional translations for KnowledgeBase.vue
|
||
newSession: 'New Chat',
|
||
editDocument: 'Edit Document',
|
||
rebuildDocument: 'Rebuild Document',
|
||
rebuildConfirm: 'Rebuild document "{fileName}"? This will clear existing chunks and parse it again.',
|
||
rebuildSubmitted: 'Rebuild task submitted',
|
||
rebuildFailed: 'Rebuild failed. Please try again later',
|
||
rebuildInProgress: 'This document is currently being parsed. Please try again later',
|
||
cancelParse: 'Stop parsing',
|
||
cancelParseConfirmBody: 'Stop parsing "{title}"? Already-written chunks are kept and can be re-parsed later via "Rebuild"; pending optimization tasks (summary / Q&A / knowledge graph) will be dropped immediately.',
|
||
cancelParseSubmitted: 'Parsing stopped',
|
||
cancelParseFailed: 'Failed to stop, please try again later',
|
||
draft: 'Draft',
|
||
draftTip: 'Temporarily saved and not included in retrieval',
|
||
untitledDocument: 'Untitled Document',
|
||
deleteDocument: 'Delete Document',
|
||
moveDocument: 'Move to...',
|
||
moveToKnowledgeBase: 'Move to Knowledge Base',
|
||
moveSelectTarget: 'Select target knowledge base',
|
||
moveNoTargets: 'No compatible knowledge bases found (same type and embedding model required)',
|
||
moveMode: 'Move Mode',
|
||
moveModeReuseVectors: 'Reuse Vectors (Fast)',
|
||
moveModeReuseVectorsDesc: 'Directly move chunks and vector indices. Use when chunking config is the same.',
|
||
moveModeReparse: 'Re-parse',
|
||
moveModeReparseDesc: "Re-parse documents using the target knowledge base's chunking config.",
|
||
moveConfirm: 'Confirm Move',
|
||
moveConfirmTitle: 'Confirm move settings',
|
||
moveStarted: 'Move task submitted',
|
||
moveFailed: 'Move failed',
|
||
moveCompleted: 'Move completed',
|
||
moveCompletedWithErrors: 'Move completed: {success} succeeded, {failed} failed',
|
||
moveProgress: 'Moving...',
|
||
parsingFailed: 'Parsing failed',
|
||
parsingInProgress: 'Parsing...',
|
||
generatingSummary: 'Generating summary...',
|
||
documentSummary: 'Summary',
|
||
deleteConfirmation: 'Delete Confirmation',
|
||
confirmDeleteDocument: 'Confirm deletion of document "{fileName}", recovery will be impossible after deletion',
|
||
cancel: 'Cancel',
|
||
confirmDelete: 'Confirm Delete',
|
||
viewModeGrid: 'Grid view',
|
||
viewModeList: 'List view',
|
||
viewModeToggle: 'Toggle view',
|
||
columnName: 'Name',
|
||
columnTag: 'Tag',
|
||
columnSize: 'Size',
|
||
columnType: 'Type',
|
||
columnSource: 'Source',
|
||
columnStatus: 'Status',
|
||
columnUpdatedAt: 'Updated',
|
||
columnActions: 'Actions',
|
||
selectAll: 'Select all',
|
||
selectedCount: '{count} selected',
|
||
clearSelection: 'Deselect all',
|
||
batchDelete: 'Delete selected',
|
||
batchDeleteConfirmation: 'Confirm Batch Delete',
|
||
confirmBatchDeleteDocument: 'Delete {count} selected documents? This action cannot be undone.',
|
||
batchDeleteSuccess: 'Deleted {count} documents',
|
||
batchDeleteFailed: 'Batch delete failed',
|
||
statusCompleted: 'Completed',
|
||
statusProcessing: 'Processing',
|
||
statusFinalizing: 'Optimizing',
|
||
statusPending: 'Pending',
|
||
statusFailed: 'Failed',
|
||
statusCancelled: 'Cancelled',
|
||
statusDraft: 'Draft',
|
||
selectKnowledgeBaseFirst: 'Please select a knowledge base first',
|
||
sessionCreationFailed: 'Failed to create chat session',
|
||
sessionCreationError: 'Chat session creation error',
|
||
settingsParsingFailed: 'Failed to parse settings',
|
||
fileUploadEventReceived: 'File upload event received, uploaded knowledge base ID: {uploadedKbId}, current knowledge base ID: {currentKbId}',
|
||
matchingKnowledgeBase: 'Matching knowledge base, starting file list update',
|
||
routeParamChange: 'Route parameter change, re-fetching knowledge base content',
|
||
fileUploadEventListening: 'Listening for file upload events',
|
||
apiCallKnowledgeFiles: 'Direct API call to get knowledge base file list',
|
||
responseInterceptorData: 'Since the response interceptor has already returned data, result is part of the response data',
|
||
hookProcessing: 'Processing according to useKnowledgeBase hook method',
|
||
errorHandling: 'Error handling',
|
||
priorityCurrentPageKbId: 'Priority to use knowledge base ID of current page',
|
||
fallbackLocalStorageKbId: 'If current page has no knowledge base ID, attempt to get knowledge base ID from settings in localStorage',
|
||
// Additional translations for KnowledgeBaseList.vue
|
||
createNewKnowledgeBase: 'Create Knowledge Base',
|
||
uninitializedWarning: 'Some knowledge bases are not initialized, you need to configure model information in settings first to add knowledge documents',
|
||
initializedStatus: 'Initialized',
|
||
notInitializedStatus: 'Not Initialized',
|
||
needSettingsFirst: 'You need to configure model information in settings first to add knowledge',
|
||
documents: 'Documents',
|
||
configureModelsFirst: 'Please configure model information in settings first',
|
||
confirmDeleteKnowledgeBase: 'Confirm deletion of this knowledge base?',
|
||
createKnowledgeBaseDialog: 'Create Knowledge Base',
|
||
enterNameKb: 'Enter name',
|
||
enterDescriptionKb: 'Enter description',
|
||
createKb: 'Create',
|
||
deleted: 'Deleted',
|
||
deleteFailedKb: 'Delete failed',
|
||
noDescription: 'No description',
|
||
emptyKnowledgeDragDrop: 'Knowledge is empty, drag and drop to upload',
|
||
pdfDocFormat: 'pdf, doc format files, max 10M',
|
||
textMarkdownFormat: 'text, markdown format files, max 200K',
|
||
dragFileNotText: 'Please drag files instead of text or links',
|
||
searchPlaceholder: 'Search knowledge bases...',
|
||
docSearchPlaceholder: 'Search document names...',
|
||
fileTypeFilter: 'File Type',
|
||
allFileTypes: 'All Types',
|
||
parseStatusFilter: 'Status',
|
||
allParseStatuses: 'All Statuses',
|
||
parseStatusPending: 'Pending',
|
||
parseStatusProcessing: 'Processing',
|
||
parseStatusCompleted: 'Completed',
|
||
parseStatusFailed: 'Failed',
|
||
sourceFilter: 'Source',
|
||
allSources: 'All Sources',
|
||
sourceWeb: 'Web',
|
||
sourceApi: 'API',
|
||
sourceBrowserExtension: 'Browser Extension',
|
||
sourceUpload: 'Upload',
|
||
sourceUrl: 'URL Import',
|
||
sourceManual: 'Manual',
|
||
updatedTimeFilter: 'Updated',
|
||
updatedTimeFrom: 'From',
|
||
updatedTimeTo: 'To',
|
||
noMatch: 'No matching knowledge base found',
|
||
noKnowledge: 'No knowledge bases available',
|
||
loadingFailed: 'Failed to load knowledge bases',
|
||
operationNotSupportedForType: 'This operation is not supported for the current knowledge base type',
|
||
allFilesSkippedNoEngine: 'All selected files were skipped due to no available parser engine',
|
||
filesSkippedNoEngine: '{count} file(s) skipped due to no available parser engine',
|
||
allUploadSuccess: 'All files uploaded successfully ({count} files)',
|
||
partialUploadSuccess: 'Partial upload success (success: {success}, failed: {fail})',
|
||
allUploadFailed: 'All files failed to upload ({count} files)',
|
||
deleteSuccess: 'Knowledge deleted successfully!',
|
||
chunkLoadFailed: 'Failed to load chunks',
|
||
},
|
||
|
||
knowledgeStages: {
|
||
title: 'Processing pipeline',
|
||
root: 'Knowledge processing',
|
||
attempt: 'Attempt {n}',
|
||
attemptLatest: 'Attempt {n} (latest)',
|
||
retry: 'Retry parsing',
|
||
refresh: 'Refresh now',
|
||
copy: 'Copy',
|
||
copyDetails: 'Copy details',
|
||
copied: 'Copied to clipboard',
|
||
close: 'Close',
|
||
live: 'LIVE',
|
||
liveTooltip: 'Parsing in progress — auto-refreshes every 2s',
|
||
autoRefreshOn: 'Auto-refreshing',
|
||
autoRefreshOff: 'Auto-refresh stopped',
|
||
fetchFailed: 'Last {n} refreshes failed — data may be stale, click refresh to retry',
|
||
fetchFailedShort: 'fetch failed',
|
||
viewTrace: 'View trace',
|
||
traceBtn: 'Trace',
|
||
expandBranch: 'Expand children',
|
||
collapseBranch: 'Collapse children',
|
||
rowSelectHint: 'Click to view details; use the arrow to expand or collapse children',
|
||
resizeDrawer: 'Drag to resize panel width',
|
||
justNow: 'just now',
|
||
secondsAgo: '{n}s ago',
|
||
minutesAgo: '{n}m ago',
|
||
noActivity: 'No parsing activity yet',
|
||
totalDuration: 'Total: {d}',
|
||
total: 'Total {d}',
|
||
head: {
|
||
duration: 'Duration',
|
||
stages: 'Stages',
|
||
stagesDone: 'Stages completed',
|
||
stagesProgress: 'Current stage',
|
||
stage: 'Stage',
|
||
status: 'Status',
|
||
attempt: 'Attempt',
|
||
updated: 'Updated',
|
||
},
|
||
tab: {
|
||
overview: 'Overview',
|
||
raw: 'Raw JSON',
|
||
},
|
||
detail: {
|
||
started: 'Started',
|
||
finished: 'Finished',
|
||
duration: 'Duration',
|
||
offset: 'Offset',
|
||
timing: 'Timing',
|
||
identity: 'Identity',
|
||
stageBreakdown: 'Stage breakdown',
|
||
stageOrder: 'Stage order',
|
||
childCount: 'Child spans',
|
||
kind: 'Kind',
|
||
status: 'Status',
|
||
name: 'Name',
|
||
input: 'Input',
|
||
output: 'Output',
|
||
metadata: 'Metadata',
|
||
traceMetadata: 'Trace metadata',
|
||
metadataHint: 'Auxiliary fields for observability (e.g. Langfuse trace ID). Stage/subspan payloads live under Input and Output.',
|
||
metadataEmpty: 'This span has no metadata. Use Input/Output for stage payloads; trace-level fields appear in Overview when Langfuse is connected.',
|
||
error: 'Error',
|
||
empty: 'No data',
|
||
inProgress: 'In progress',
|
||
elapsed: 'Elapsed',
|
||
placeholderHint: 'This stage has no detailed span record; only the inferred state is shown.',
|
||
showJson: 'Expand JSON',
|
||
hideJson: 'Collapse JSON',
|
||
includingChildren: 'incl. children',
|
||
},
|
||
stage: {
|
||
docreader: 'Document parsing',
|
||
chunking: 'Chunking',
|
||
embedding: 'Vectorization',
|
||
multimodal: 'Multimodal recognition',
|
||
postprocess: 'Post-processing',
|
||
},
|
||
status: {
|
||
pending: 'Pending',
|
||
running: 'Running',
|
||
finalizing: 'Finalizing',
|
||
done: 'Done',
|
||
failed: 'Failed',
|
||
skipped: 'Skipped',
|
||
cancelled: 'Cancelled',
|
||
},
|
||
errorCode: {
|
||
DOCREADER_TIMEOUT: 'Document parser timed out',
|
||
DOCREADER_TIMEOUT_SUGGESTION: 'The file may be too large or the parser service is busy. Try again later or split the document.',
|
||
DOCREADER_UNAVAILABLE: 'Document parser unavailable',
|
||
DOCREADER_UNAVAILABLE_SUGGESTION: 'The parsing service is offline. Contact your administrator.',
|
||
DOCREADER_PARSE_FAILED: 'Document parsing failed',
|
||
DOCREADER_PARSE_FAILED_SUGGESTION: 'The file could not be parsed. Verify it is not corrupted.',
|
||
CHUNKING_FAILED: 'Chunking failed',
|
||
CHUNKING_FAILED_SUGGESTION: 'Try adjusting the chunking configuration of the knowledge base.',
|
||
EMBEDDING_RATE_LIMIT: 'Embedding service rate-limited',
|
||
EMBEDDING_RATE_LIMIT_SUGGESTION: 'The embedding provider is throttling requests. Retry shortly.',
|
||
EMBEDDING_PROVIDER_FAIL: 'Embedding provider error',
|
||
EMBEDDING_PROVIDER_FAIL_SUGGESTION: 'The embedding provider returned an error. Check provider configuration.',
|
||
VECTORSTORE_WRITE_FAILED: 'Vector store write failed',
|
||
VECTORSTORE_WRITE_FAILED_SUGGESTION: 'The vector store rejected the write. Check store availability.',
|
||
MULTIMODAL_VLM_FAILED: 'Image understanding failed',
|
||
MULTIMODAL_VLM_FAILED_SUGGESTION: 'A subset of images could not be processed. Document may still be usable.',
|
||
MULTIMODAL_ALL_FAILED: 'All images failed multimodal processing',
|
||
MULTIMODAL_ALL_FAILED_SUGGESTION: 'Verify the multimodal model configuration.',
|
||
TASK_TIMEOUT: 'Task exceeded maximum runtime',
|
||
TASK_TIMEOUT_SUGGESTION: 'The task ran longer than allowed. Retry or contact support.',
|
||
UPSTREAM_FAILED: 'Stopped because an upstream stage failed',
|
||
UPSTREAM_FAILED_SUGGESTION: 'A previous stage failed and prevented this step from running.',
|
||
UNKNOWN: 'Unknown error',
|
||
UNKNOWN_SUGGESTION: 'Check the application logs for details.',
|
||
},
|
||
},
|
||
|
||
agent: {
|
||
taskLabel: 'Task:',
|
||
think: 'Thinking',
|
||
copy: 'Copy',
|
||
addToKnowledgeBase: 'Add to Knowledge Base',
|
||
updatePlan: 'Update Plan',
|
||
webSearchFound: 'Found <strong>{count}</strong> web search result(s)',
|
||
argumentsLabel: 'Arguments',
|
||
toolFallback: 'Tool',
|
||
stepsCompleted: 'Completed <strong>{steps}</strong> step(s)',
|
||
stepsCompletedWithDuration: 'Completed <strong>{steps}</strong> step(s) in <strong>{duration}</strong>',
|
||
title: 'Agents',
|
||
subtitle: 'Configure and manage your agents to customize conversation behavior and capabilities',
|
||
createAgent: 'Create Agent',
|
||
createAgentShort: 'New',
|
||
builtin: 'Built-in',
|
||
disabled: 'Disabled',
|
||
disable: 'Disable',
|
||
enable: 'Enable',
|
||
noDescription: 'No description',
|
||
selectAgent: 'Select Agent',
|
||
noAgents: 'No agents',
|
||
manageAgents: 'Manage',
|
||
builtinAgents: 'Built-in Agents',
|
||
customAgents: 'Custom Agents',
|
||
capabilities: {
|
||
normal: 'Quick response, direct answers',
|
||
agent: 'Multi-step thinking, deep analysis for complex questions',
|
||
modelSpecified: 'Model specified',
|
||
kbCount: '{count} knowledge base(s) specified',
|
||
kbAll: 'Access to all knowledge bases',
|
||
kbDisabled: 'Knowledge base disabled',
|
||
rerankSpecified: 'ReRank model specified',
|
||
webSearchOn: 'Web search enabled',
|
||
webSearchOff: 'Web search disabled',
|
||
hasPrompt: 'Custom prompt',
|
||
default: 'Default configuration',
|
||
mcpEnabled: 'MCP services enabled',
|
||
multiTurn: 'Multi-turn conversation',
|
||
},
|
||
type: {
|
||
normal: 'Quick Answer',
|
||
agent: 'Smart Reasoning',
|
||
custom: 'Custom',
|
||
},
|
||
mode: {
|
||
normal: 'Quick Answer',
|
||
agent: 'Smart Reasoning',
|
||
},
|
||
features: {
|
||
webSearch: 'Web Search Enabled',
|
||
knowledgeBase: 'Knowledge Base Linked',
|
||
mcp: 'MCP Services Enabled',
|
||
multiTurn: 'Multi-turn Conversation',
|
||
},
|
||
tabs: {
|
||
all: 'All',
|
||
mine: 'My Agents',
|
||
sharedToMe: 'Shared to Me',
|
||
},
|
||
sections: {
|
||
builtin: 'Built-in',
|
||
mine: 'Created by me',
|
||
tenantReadonly: 'Workspace · View only',
|
||
tenantOthers: 'Workspace · Other members',
|
||
sharedByMe: 'Shared by me',
|
||
sharedEditable: 'Shared with me · Can edit',
|
||
sharedReadonly: 'Shared with me · View only',
|
||
},
|
||
empty: {
|
||
title: 'No Custom Agents',
|
||
description: 'Click the button in the top right to create your first agent',
|
||
sharedTitle: 'No shared agents yet',
|
||
sharedDescription: 'You can join a space or ask others to share agents with you',
|
||
favoritesTitle: 'No favorites yet',
|
||
favoritesDescription: 'Star an agent from its card to add it here',
|
||
recentsTitle: 'Nothing here yet',
|
||
recentsDescription: 'Agents you recently used will show up here',
|
||
},
|
||
detail: {
|
||
title: 'Agent Details',
|
||
useInChat: 'Use in Chat',
|
||
},
|
||
shareScope: {
|
||
title: 'Share Scope',
|
||
desc: 'Space members have read-only access to this agent and will use it according to your current configuration; your changes to the agent will sync to shared spaces. To allow space members to edit knowledge base content, share the knowledge base to the space.',
|
||
knowledgeBase: 'Knowledge bases',
|
||
chatModel: 'Chat model',
|
||
rerankModel: 'Rerank model',
|
||
webSearch: 'Web search',
|
||
mcp: 'MCP services',
|
||
kbAll: 'All knowledge bases',
|
||
kbSelected: '{count} selected',
|
||
kbNone: 'None',
|
||
modelConfigured: 'Configured',
|
||
modelNotSet: 'Not set',
|
||
enabled: 'On',
|
||
disabled: 'Off',
|
||
mcpAll: 'All services',
|
||
mcpSelected: '{count} selected',
|
||
mcpNone: 'None',
|
||
},
|
||
delete: {
|
||
confirmTitle: 'Delete Agent',
|
||
confirmMessage: 'Are you sure you want to delete agent "{name}"? This action cannot be undone.',
|
||
confirmButton: 'Confirm Delete',
|
||
},
|
||
messages: {
|
||
created: 'Agent created successfully',
|
||
updated: 'Agent updated successfully',
|
||
deleted: 'Agent deleted',
|
||
deleteFailed: 'Delete failed',
|
||
saveFailed: 'Save failed',
|
||
builtinReadonly: 'Built-in agents cannot be edited',
|
||
copied: 'Agent copied successfully',
|
||
copyFailed: 'Copy failed',
|
||
disabled: 'Agent disabled',
|
||
enabled: 'Agent enabled',
|
||
},
|
||
editor: {
|
||
createTitle: 'Create Agent',
|
||
editTitle: 'Edit Agent',
|
||
basicInfo: 'Basic Info',
|
||
basicInfoDesc: 'Configure agent basic information',
|
||
modelConfig: 'Model Config',
|
||
modelConfigDesc: 'Configure agent model parameters',
|
||
capabilities: 'Capabilities',
|
||
capabilitiesDesc: 'Configure agent capabilities and tools',
|
||
toolsConfig: 'Tools',
|
||
toolsConfigDesc: 'Configure tools available to the Agent',
|
||
knowledgeConfig: 'Knowledge Base',
|
||
knowledgeConfigDesc: 'Configure knowledge bases for the agent',
|
||
webSearchConfig: 'Web Search',
|
||
webSearchConfigDesc: 'Configure web search capabilities for the agent',
|
||
configuration: 'Configuration',
|
||
agentId: 'Agent ID',
|
||
agentIdDesc: 'Use this ID to target the agent in API integrations',
|
||
name: 'Name',
|
||
namePlaceholder: 'Enter agent name',
|
||
nameRequired: 'Agent name is required',
|
||
disabled: 'Disable',
|
||
disabledDesc: 'When disabled, this agent will not appear in the conversation agent dropdown',
|
||
systemPromptRequired: 'System prompt is required',
|
||
modelRequired: 'Please select a model',
|
||
rerankModelRequired: 'ReRank model is required when using knowledge bases',
|
||
contextsMissing: "Context template must contain {'{{'}contexts{'}}'} placeholder when knowledge base is enabled",
|
||
queryMissingInContext: "Context template must contain {'{{'}query{'}}'} placeholder",
|
||
knowledgeBasesMissing: "It is recommended to include {'{{'}knowledge_bases{'}}'} placeholder in system prompt so the model knows available knowledge bases",
|
||
queryMissingInRewrite: "Rewrite user prompt must contain {'{{'}query{'}}'} placeholder",
|
||
conversationMissing: "Rewrite user prompt must contain {'{{'}conversation{'}}'} placeholder",
|
||
queryMissingInFallback: "Fallback prompt must contain {'{{'}query{'}}'} placeholder",
|
||
avatar: 'Avatar',
|
||
avatarPlaceholder: 'Enter Emoji or select',
|
||
description: 'Description',
|
||
descriptionPlaceholder: 'Enter agent description',
|
||
baseType: 'Base Type',
|
||
normalDesc: 'Quick response, direct answers',
|
||
agentDesc: 'Multi-step thinking, deep analysis for complex questions',
|
||
model: 'Model',
|
||
modelPlaceholder: 'Select Model',
|
||
systemPrompt: 'System Prompt',
|
||
systemPromptPlaceholder: "Custom system prompt to define agent behavior and role (use {'{{'}web_search_status{'}}'} placeholder for dynamic web search behavior)",
|
||
defaultPromptHint: 'Leave empty to use the following default system prompt:',
|
||
defaultContextTemplateHint: 'Leave empty to use the following default context template:',
|
||
contextTemplateRequired: 'Context template is required',
|
||
availablePlaceholders: 'Available Placeholders',
|
||
placeholderHint: "Type {'{{'} to trigger autocomplete",
|
||
temperature: 'Temperature',
|
||
thinking: 'Thinking Mode',
|
||
welcomeMessage: 'Welcome Message',
|
||
welcomeMessagePlaceholder: 'Message displayed when this agent is selected',
|
||
suggestedPrompts: 'Suggested Prompts',
|
||
mode: 'Running Mode',
|
||
webSearch: 'Web Search',
|
||
webSearchProvider: 'Search Engine',
|
||
webSearchProviderPlaceholder: 'Use default search engine',
|
||
webSearchMaxResults: 'Max Search Results',
|
||
webFetchEnabled: 'Auto-Fetch Page Content',
|
||
webFetchTopN: 'Pages to Fetch',
|
||
knowledgeBases: 'Knowledge Bases',
|
||
allKnowledgeBases: 'All Knowledge Bases',
|
||
allKnowledgeBasesDesc: 'Agent can access all knowledge bases',
|
||
selectedKnowledgeBases: 'Selected Knowledge Bases',
|
||
selectedKnowledgeBasesDesc: 'Only access selected knowledge bases',
|
||
noKnowledgeBase: 'No Knowledge Base',
|
||
noKnowledgeBaseDesc: 'Pure model conversation, no knowledge retrieval',
|
||
selectKnowledgeBases: 'Select Knowledge Bases',
|
||
selectKnowledgeBasesDesc: 'Select knowledge bases to associate (including collaborative ones)',
|
||
myKnowledgeBases: 'My Knowledge Bases',
|
||
sharedKnowledgeBases: 'Collaborative Knowledge Bases',
|
||
retrieveKBOnlyWhenMentioned: 'Retrieve Only When Mentioned',
|
||
retrieveKBOnlyWhenMentionedDesc: "Off: auto-retrieve configured KBs; On: retrieve only when user {'@'} mentions",
|
||
retrievalSectionTitle: 'Retrieval Strategy',
|
||
rerankModel: 'ReRank Model',
|
||
rerankModelDesc: 'Used to rerank knowledge base retrieval results for better accuracy',
|
||
rerankModelPlaceholder: 'Select ReRank Model',
|
||
rerankModelOptionalHint: 'No RAG knowledge base in current scope, so this is optional. If a RAG knowledge base is added later, the tenant default rerank model will be used as a fallback. Configuring it explicitly is still recommended.',
|
||
maxIterations: 'Max Iterations',
|
||
allowedTools: 'Allowed Tools',
|
||
multiTurn: 'Multi-turn Conversation',
|
||
historyTurns: 'History Turns',
|
||
// Retrieval Strategy
|
||
retrievalStrategy: 'Retrieval Strategy',
|
||
embeddingTopK: 'Embedding Top K',
|
||
keywordThreshold: 'Keyword Threshold',
|
||
vectorThreshold: 'Vector Threshold',
|
||
rerankTopK: 'Rerank Top K',
|
||
rerankThreshold: 'Rerank Threshold',
|
||
// Conversation Settings
|
||
conversationSettings: 'Conversation',
|
||
// Advanced Settings
|
||
advancedSettings: 'Advanced Settings',
|
||
contextTemplate: 'Context Template',
|
||
contextTemplatePlaceholder: 'Custom context template...',
|
||
availableContextPlaceholders: 'Available Placeholders',
|
||
placeholderQuery: 'User query',
|
||
placeholderContexts: 'Retrieved content list',
|
||
placeholderCurrentTime: 'Current time (format: 2006-01-02 15:04:05)',
|
||
placeholderCurrentWeek: 'Current weekday (e.g., Monday)',
|
||
enableQueryExpansion: 'Query Expansion',
|
||
enableRewrite: 'Query Rewrite',
|
||
queryUnderstandModel: 'Query Understand Model',
|
||
queryUnderstandModelPlaceholder: 'Leave empty to reuse the main chat model',
|
||
rewritePromptSystem: 'Rewrite System Prompt',
|
||
rewritePromptSystemPlaceholder: 'Leave empty to use default prompt',
|
||
rewritePromptUser: 'Rewrite User Prompt',
|
||
rewritePromptUserPlaceholder: 'Leave empty to use default prompt',
|
||
maxCompletionTokens: 'Max Completion Tokens',
|
||
fallbackStrategy: 'Fallback Strategy',
|
||
fallbackResponse: 'Fixed Response',
|
||
fallbackResponsePlaceholder: 'Sorry, I cannot answer this question.',
|
||
fallbackPrompt: 'Fallback Prompt',
|
||
fallbackPromptPlaceholder: 'Leave empty to use default prompt',
|
||
// Skills Config
|
||
skillsConfig: 'Skills',
|
||
skillsConfigDesc: 'Configure preloaded Skills available to the Agent for specialized domain knowledge and workflows',
|
||
skillsSelection: 'Skills Selection',
|
||
skillsSelectionDesc: 'Select the scope of Skills available to the Agent',
|
||
skillsAll: 'All',
|
||
skillsSelected: 'Selected',
|
||
skillsNone: 'Disabled',
|
||
selectSkills: 'Select Skills',
|
||
selectSkillsDesc: 'Choose which Skills to enable',
|
||
noSkillsAvailable: 'No preloaded Skills available',
|
||
skillsInfoTitle: 'What are Skills?',
|
||
skillsInfoContent: 'Skills are preloaded professional knowledge modules that provide domain-specific instructions, workflows, and tool support for the Agent. When enabled, the Agent will automatically load relevant knowledge when needed.',
|
||
},
|
||
selector: {
|
||
title: 'Select Agent',
|
||
builtinSection: 'Built-in Agents',
|
||
customSection: 'My Agents',
|
||
addNew: 'Add New Agent',
|
||
current: 'Current',
|
||
goToSettings: 'Settings',
|
||
sharedLabel: 'Shared',
|
||
},
|
||
// Built-in agent information
|
||
builtinInfo: {
|
||
quickAnswer: {
|
||
name: 'Quick Answer',
|
||
description: 'Knowledge base RAG Q&A for fast and accurate answers',
|
||
},
|
||
smartReasoning: {
|
||
name: 'Smart Reasoning',
|
||
description: 'ReAct reasoning framework with multi-step thinking and tool calling',
|
||
},
|
||
deepResearcher: {
|
||
name: 'Deep Researcher',
|
||
description: 'Focused on in-depth research and comprehensive analysis, capable of creating research plans, multi-dimensional information retrieval, deep thinking and providing thorough analysis reports',
|
||
},
|
||
dataAnalyst: {
|
||
name: 'Data Analyst',
|
||
description: 'Focused on database queries and data analysis, capable of understanding business needs, building SQL queries, analyzing data and providing insights',
|
||
},
|
||
knowledgeGraphExpert: {
|
||
name: 'Knowledge Graph Expert',
|
||
description: 'Focused on knowledge graph queries and relationship analysis, capable of exploring entity relationships, discovering hidden connections and building knowledge networks',
|
||
},
|
||
documentAssistant: {
|
||
name: 'Document Assistant',
|
||
description: 'Focused on document retrieval and content organization, capable of quickly locating documents, extracting key information and generating summaries',
|
||
},
|
||
},
|
||
},
|
||
settings: {
|
||
title: 'Settings',
|
||
modelConfig: 'Model Settings',
|
||
modelManagement: 'Model Management',
|
||
agentConfig: 'Agent Settings',
|
||
conversationConfig: 'Conversation Settings',
|
||
conversationStrategy: 'Conversation Strategy',
|
||
webSearchConfig: 'Web Search',
|
||
enableMemory: 'Enable Memory',
|
||
enableMemoryDesc: 'When enabled, the system will record your conversation history and automatically recall relevant content in future conversations to provide more personalized answers.',
|
||
autoCheckUpdate: 'Auto Download Updates',
|
||
autoCheckUpdateDesc: 'When enabled, automatically check and download the latest version in the background.',
|
||
memoryRequiresNeo4j: 'Memory feature requires Neo4j graph database. Please configure and enable Neo4j (set NEO4J_ENABLE=true) before enabling this feature.',
|
||
memoryHowToEnable: 'View Neo4j Configuration Guide',
|
||
vectorStoreEngine: 'Vector DB Engine',
|
||
parserEngine: 'Parser Engine',
|
||
storageEngine: 'Storage Engine',
|
||
mcpService: 'MCP Service',
|
||
versionInfo: 'Version Info',
|
||
tenantInfo: 'Tenant Info',
|
||
apiInfo: 'API Info',
|
||
navGroups: {
|
||
account: 'Account',
|
||
workspace: 'Workspace',
|
||
modelsRuntime: 'Models',
|
||
dataExtensions: 'Data & Extensions',
|
||
platform: 'Platform',
|
||
},
|
||
roleDenied: {
|
||
title: 'Insufficient permissions',
|
||
desc: "Your role can't access this settings page. Ask an admin of this tenant to grant the required role.",
|
||
},
|
||
weknoraCloud: {
|
||
title: 'WeKnora Cloud',
|
||
description: 'Configure WeKnora Cloud APPID and APPSECRET credentials. Credentials are used for model services and document parsing engine.',
|
||
viewDocs: 'View Docs',
|
||
unconfigured: 'Credentials not configured. Please fill in APPID and APPSECRET.',
|
||
configured: 'Credentials configured and working.',
|
||
expired: 'WeKnora Cloud credentials expired',
|
||
expiredDefault: 'Encryption key changed after service restart. Saved credentials cannot be decrypted. Please re-enter credentials.',
|
||
reconfigure: 'Reconfigure',
|
||
appIdLabel: 'APPID',
|
||
appIdDesc: 'WeKnora Cloud application ID',
|
||
appIdPlaceholder: 'Enter APPID',
|
||
appSecretLabel: 'APPSECRET',
|
||
appSecretDesc: 'WeKnora Cloud application secret',
|
||
appSecretPlaceholder: 'Enter APPSECRET',
|
||
saveHint: 'Credentials will be validated and encrypted before saving.',
|
||
saveBtn: 'Save Credentials',
|
||
usageTitle: 'Usage Guide',
|
||
usageSteps: '1. Fill in and save APPID and APPSECRET on this page\n2. Model services: Go to Model Management, add a model with Remote API source, select WeKnoraCloud as provider\n3. Document parsing: Go to Knowledge Base Settings → Parser Engine, select WeKnora Cloud engine for desired file types',
|
||
fillRequired: 'Please fill in APPID and APPSECRET',
|
||
saveSuccess: 'Credentials saved successfully',
|
||
saveFailed: 'Failed to save credentials',
|
||
credentialConfigured: 'WeKnoraCloud credentials configured.',
|
||
credentialExpired: 'Credentials expired. Please reconfigure.',
|
||
credentialUnconfigured: 'WeKnoraCloud credentials not configured. Please set up APPID and APPSECRET first.',
|
||
checkingStatus: 'Checking credential status...',
|
||
goToSettings: 'Go to Settings',
|
||
modelHintConfigured: 'WeKnoraCloud credentials configured. See supported models in',
|
||
modelHintDocsLink: 'API docs',
|
||
},
|
||
system: 'System Settings',
|
||
systemConfig: 'System Configuration',
|
||
knowledgeBaseSettings: 'Knowledge Base Settings',
|
||
configureKbModels: 'Configure models and document splitting parameters for this knowledge base',
|
||
manageSystemModels: 'Manage and update system models and service configurations',
|
||
basicInfo: 'Basic Information',
|
||
documentSplitting: 'Document Splitting',
|
||
apiEndpoint: 'API Endpoint',
|
||
enterApiEndpoint: 'Enter API endpoint, e.g.: http://localhost',
|
||
enterApiKey: 'Enter API key',
|
||
enterKnowledgeBaseId: 'Enter knowledge base ID',
|
||
saveConfig: 'Save Configuration',
|
||
reset: 'Reset',
|
||
configSaved: 'Configuration saved successfully',
|
||
enterApiEndpointRequired: 'Enter API endpoint',
|
||
enterApiKeyRequired: 'Enter API key',
|
||
enterKnowledgeBaseIdRequired: 'Enter knowledge base ID',
|
||
name: 'Name',
|
||
enterName: 'Enter name',
|
||
description: 'Description',
|
||
chunkSize: 'Chunk Size',
|
||
chunkOverlap: 'Chunk Overlap',
|
||
save: 'Save',
|
||
saving: 'Saving...',
|
||
saveSuccess: 'Saved successfully',
|
||
saveFailed: 'Failed to save',
|
||
model: 'Model',
|
||
llmModel: 'LLM Model',
|
||
embeddingModel: 'Embedding Model',
|
||
rerankModel: 'Rerank Model',
|
||
vlmModel: 'Multimodal Model',
|
||
modelName: 'Model Name',
|
||
modelUrl: 'Model URL',
|
||
apiKey: 'API Key',
|
||
cancel: 'Cancel',
|
||
saveFailedSettings: 'Failed to save settings',
|
||
enterNameRequired: 'Enter name',
|
||
parser: {
|
||
title: 'Parser Engine',
|
||
description: 'Document parser engine status and configuration. Settings here take priority over server environment variables. Leave empty to use environment variable defaults.',
|
||
// Section / label keys for the redesigned drawer
|
||
supportedFileTypes: 'Supported Formats',
|
||
statusSection: 'Status',
|
||
configSection: 'Configuration',
|
||
featuresLabel: 'Features',
|
||
loading: 'Loading...',
|
||
retry: 'Retry',
|
||
noEngineDetected: 'No parser engine detected. Please ensure the DocReader service is running properly.',
|
||
disconnected: 'Disconnected',
|
||
connected: 'Connected',
|
||
available: 'Available',
|
||
unavailable: 'Unavailable',
|
||
builtinDesc: 'DocReader built-in parser engine (docx/pdf/xlsx and other complex formats)',
|
||
currentAddr: 'Current',
|
||
envVarHint: 'To modify, set environment variables DOCREADER_ADDR and DOCREADER_TRANSPORT (grpc/http), then restart the service.',
|
||
selfHostedEndpoint: 'Self-hosted Endpoint',
|
||
formulaRecognition: 'Formula Recognition',
|
||
tableRecognition: 'Table Recognition',
|
||
sealRecognition: 'Seal Recognition',
|
||
chartRecognition: 'Chart Recognition',
|
||
language: 'Language',
|
||
testConnection: 'Test Connection',
|
||
saveConfig: 'Save Configuration',
|
||
docs: 'Docs',
|
||
loadFailed: 'Failed to load parser engine list',
|
||
ensureDocreaderConnected: 'Please ensure the DocReader service is configured via environment variables and connected',
|
||
checkDoneStatusUpdated: 'Checked with current parameters. Status above has been updated.',
|
||
checkSuccess: 'Test Connection Successful',
|
||
checkFailed: 'Check failed',
|
||
saveSuccess: 'Saved successfully',
|
||
saveFailed: 'Save failed',
|
||
mineruEndpointPlaceholder: 'e.g. https://your-mineru.example.com',
|
||
defaultPipeline: 'Default pipeline',
|
||
languagePlaceholder: 'e.g. ch, en, ja (default ch)',
|
||
mineruCloudApiKeyPlaceholder: 'MinerU Cloud API Key',
|
||
vlmLabel: 'vlm (Visual Language Model)',
|
||
mineruHtmlLabel: 'MinerU-HTML (HTML Parsing)',
|
||
serverUrl: 'Server URL',
|
||
vlmServerUrlPlaceholder: 'e.g. http://your-vllm-server:8000',
|
||
vlmServerUrlHint: 'Required when Backend is vlm-http-client or hybrid-http-client',
|
||
paddleocrVlEndpointPlaceholder: 'e.g. http://your-paddleocr-vl:8080',
|
||
paddleocrVlEndpointHint: 'Base URL of the full PaddleOCR-VL pipeline service; no /layout-parsing suffix needed',
|
||
paddleocrVlCloudTokenPlaceholder: 'PaddleOCR-VL AI Studio Token',
|
||
},
|
||
storage: {
|
||
title: 'Storage Engine',
|
||
description: 'Configure document and image storage. Set engine parameters here; knowledge bases only select which engine to use.',
|
||
// Section / label keys for the redesigned drawer
|
||
basicSection: 'Basic',
|
||
modeSection: 'Deployment Mode',
|
||
credentialsSection: 'Credentials',
|
||
bucketSection: 'Bucket',
|
||
useSslDesc: 'Connect to MinIO over HTTPS',
|
||
loading: 'Loading...',
|
||
retry: 'Retry',
|
||
defaultEngine: 'Default Engine',
|
||
defaultEngineDesc: 'The default storage engine when creating new knowledge bases',
|
||
engineLocal: 'Local',
|
||
engineCos: 'Tencent Cloud COS',
|
||
engineTos: 'Volcengine TOS',
|
||
engineOss: 'Alibaba Cloud OSS',
|
||
engineS3: 'AWS S3',
|
||
localTitle: 'Local Storage',
|
||
localDesc: 'Store files on the server local filesystem, suitable for single-node deployment only.',
|
||
available: 'Available',
|
||
needsConfig: 'Needs Configuration',
|
||
configurable: 'Configurable',
|
||
pathPrefix: 'Path Prefix (optional)',
|
||
pathPrefixPlaceholder: 'e.g. weknora/images',
|
||
prefixPlaceholder: 'e.g. weknora',
|
||
bucketName: 'Bucket Name',
|
||
bucketSelectPlaceholder: 'Select or enter bucket name',
|
||
bucketPlaceholder: 'Bucket name',
|
||
minioDesc: 'S3-compatible self-hosted object storage, suitable for private networks and private cloud deployment.',
|
||
minioDocker: 'Docker Deployment',
|
||
minioRemote: 'Remote MinIO',
|
||
detected: 'Detected',
|
||
notDetected: 'Not Detected',
|
||
minioDockerDetected: 'Docker-deployed MinIO environment variables detected. Connection info is provided by env vars, no manual input needed.',
|
||
minioDockerNotDetected: 'MinIO environment variables (MINIO_ENDPOINT, etc.) not detected. Please verify your Docker Compose configuration.',
|
||
minioRemoteHint: 'Connect to a remote MinIO service. Manual connection info required.',
|
||
cosTitle: 'Tencent Cloud COS',
|
||
cosDesc: 'Tencent Cloud Object Storage, suitable for public cloud deployment with CDN acceleration.',
|
||
cosSecretIdPlaceholder: 'Tencent Cloud API SecretId',
|
||
cosSecretKeyPlaceholder: 'Tencent Cloud API SecretKey',
|
||
cosAppIdPlaceholder: 'Tencent Cloud Account AppID',
|
||
tosTitle: 'Volcengine TOS',
|
||
tosDesc: 'Volcengine Object Storage Service (TOS), suitable for public cloud deployment.',
|
||
tosAccessKeyPlaceholder: 'Volcengine Access Key',
|
||
tosSecretKeyPlaceholder: 'Volcengine Secret Key',
|
||
s3Title: 'AWS S3',
|
||
s3Desc: 'AWS S3 and S3-compatible object storage services, suitable for public cloud deployment.',
|
||
s3AccessKeyPlaceholder: 'AWS Access Key',
|
||
s3SecretKeyPlaceholder: 'AWS Secret Key',
|
||
ks3Title: 'Kingsoft Cloud KS3',
|
||
ks3Desc: 'Kingsoft Cloud Object Storage Service (KS3), suitable for public cloud deployment.',
|
||
ks3AccessKeyPlaceholder: 'Kingsoft Cloud Access Key',
|
||
ks3SecretKeyPlaceholder: 'Kingsoft Cloud Secret Key',
|
||
ks3EndpointPlaceholder: 'e.g. ks3-cn-beijing.ksyuncs.com',
|
||
ks3RegionPlaceholder: 'e.g. BEIJING',
|
||
engineKs3: 'Kingsoft Cloud KS3',
|
||
obsTitle: 'Huawei Cloud OBS',
|
||
obsDesc: 'Huawei Cloud Object Storage Service (OBS), suitable for public cloud deployment.',
|
||
obsAccessKeyPlaceholder: 'Huawei Cloud Access Key',
|
||
obsSecretKeyPlaceholder: 'Huawei Cloud Secret Key',
|
||
obsEndpointPlaceholder: 'e.g. obs.cn-north-4.myhuaweicloud.com',
|
||
obsRegionPlaceholder: 'e.g. cn-north-4',
|
||
engineObs: 'Huawei Cloud OBS',
|
||
ossTitle: 'Alibaba Cloud OSS',
|
||
ossDesc: 'Alibaba Cloud Object Storage Service (OSS), suitable for public cloud deployment.',
|
||
ossAccessKeyPlaceholder: 'Alibaba Cloud Access Key',
|
||
ossSecretKeyPlaceholder: 'Alibaba Cloud Secret Key',
|
||
console: 'Console',
|
||
docs: 'Docs',
|
||
testConnection: 'Test Connection',
|
||
saveConfig: 'Save Configuration',
|
||
loadFailed: 'Failed to load',
|
||
saveSuccess: 'Saved successfully',
|
||
saveFailed: 'Save failed',
|
||
unknownError: 'Unknown error',
|
||
requestFailed: 'Request failed',
|
||
cos: 'Tencent Cloud COS',
|
||
tos: 'Volcengine TOS',
|
||
oss: 'Alibaba Cloud OSS',
|
||
ks3: 'Kingsoft Cloud KS3',
|
||
obs: 'Huawei Cloud OBS',
|
||
},
|
||
},
|
||
webSearchSettings: {
|
||
title: 'Web Search Configuration',
|
||
description: 'Configure web search so answers can include up-to-date information from the internet.',
|
||
// Section keys for the redesigned drawer
|
||
basicSection: 'Basic',
|
||
credentialsSection: 'Connection',
|
||
optionsSection: 'Options',
|
||
// Provider entity management
|
||
providersTitle: 'Search Engine Providers',
|
||
addProvider: 'Add Provider',
|
||
editProvider: 'Edit Provider',
|
||
noProviders: 'No search engine providers configured. Click "Add Provider" to get started.',
|
||
deleteConfirm: 'Are you sure you want to delete this provider?',
|
||
default: 'Default',
|
||
providerNameLabel: 'Name',
|
||
providerNamePlaceholder: 'e.g., Production Bing Search',
|
||
providerTypeLabel: 'Provider Type',
|
||
providerDescLabel: 'Notes',
|
||
providerDescPlaceholder: 'Optional, e.g., for testing',
|
||
engineIdLabel: 'Engine ID',
|
||
setAsDefault: 'Set as default',
|
||
testConnection: 'Test Connection',
|
||
testing: 'Testing...',
|
||
free: 'Free',
|
||
viewDocs: 'View docs for API key',
|
||
apiKeyUnchanged: 'Leave empty to keep current key',
|
||
noDescription: "No description provided",
|
||
noProvidersDesc: "Add a web search provider to enable your agents to retrieve real-time information from the internet.",
|
||
basicInfo: "Basic Information",
|
||
credentials: "Credentials",
|
||
setAsDefaultDesc: "This provider will be used by default when an agent doesn't specify one",
|
||
// Search behavior
|
||
searchBehaviorTitle: 'Search Behavior',
|
||
defaultProviderLabel: 'Default Provider',
|
||
defaultProviderDescription: 'Select the default search provider for agents that do not specify their own.',
|
||
providerLabel: 'Search Provider',
|
||
providerDescription: 'Choose the search engine service used for web search',
|
||
providerPlaceholder: 'Select a search engine...',
|
||
proxyUrlLabel: 'HTTP proxy',
|
||
proxyUrlPlaceholder: 'e.g. http://proxy.example.com:3128 (optional; http/https only)',
|
||
proxyUrlHelp: 'Use when outbound access to the search API requires a proxy; leave empty to rely on HTTP_PROXY/HTTPS_PROXY environment variables.',
|
||
apiKeyLabel: 'API Key',
|
||
baseUrlLabel: 'Instance URL',
|
||
baseUrlPlaceholder: 'https://searxng.example.com',
|
||
apiKeyDescription: 'Enter the API key for the selected search provider',
|
||
apiKeyPlaceholder: 'Enter API key',
|
||
maxResultsLabel: 'Maximum Results',
|
||
maxResultsDescription: 'Maximum number of results returned per search (1-50)',
|
||
includeDateLabel: 'Include Publish Date',
|
||
includeDateDescription: 'Include publish date information in search results',
|
||
compressionLabel: 'Compression Method',
|
||
compressionDescription: 'Choose how to compress content from search results',
|
||
compressionNone: 'No Compression',
|
||
compressionSummary: 'LLM Summary',
|
||
blacklistLabel: 'URL Blacklist',
|
||
blacklistDescription: 'Exclude specific domains or URLs from search results. One per line. Supports wildcards (*) and regular expressions (/pattern/).',
|
||
blacklistPlaceholder: 'For example:\n*://*.example.com/*\n/example\\.(net|org)/',
|
||
errors: {
|
||
unknown: 'Unknown error'
|
||
},
|
||
toasts: {
|
||
loadProvidersFailed: 'Failed to load search providers: {message}',
|
||
saveSuccess: 'Web search configuration saved',
|
||
saveFailed: 'Failed to save configuration: {message}',
|
||
providerCreated: 'Search provider created',
|
||
providerUpdated: 'Search provider updated',
|
||
providerDeleted: 'Search provider deleted',
|
||
testSuccess: 'Connection test succeeded',
|
||
testFailed: 'Connection test failed',
|
||
}
|
||
},
|
||
vectorStoreSettings: {
|
||
title: 'Vector Database Engine',
|
||
description: 'Register and manage vector database instances for knowledge base search.',
|
||
// Section key for the redesigned drawer
|
||
basicSection: 'Basic',
|
||
storesTitle: 'Vector Databases',
|
||
addStore: 'Add Database',
|
||
editStore: 'Edit Database',
|
||
deleteConfirm: 'Are you sure you want to delete this vector database?',
|
||
emptyDesc: 'No vector databases configured. Click "Add Database" to get started.',
|
||
engineTypeLabel: 'Engine Type',
|
||
nameLabel: 'Name',
|
||
namePlaceholder: 'e.g., my-vector-store',
|
||
connectionInfo: 'Connection Info',
|
||
advancedIndexConfig: 'Advanced Settings',
|
||
fields: {
|
||
addr: 'URL',
|
||
host: 'Host',
|
||
port: 'Port',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
api_key: 'API Key',
|
||
use_tls: 'Use TLS',
|
||
scheme: 'Scheme',
|
||
grpc_address: 'gRPC Address',
|
||
use_default_connection: 'Use Default Connection',
|
||
index_name: 'Index Name',
|
||
number_of_shards: 'Shards',
|
||
number_of_replicas: 'Replicas',
|
||
collection_prefix: 'Collection Prefix',
|
||
collection_name: 'Collection Name',
|
||
shard_number: 'Shard Number',
|
||
replication_factor: 'Replication Factor',
|
||
shards_num: 'Shards',
|
||
replica_number: 'In-memory Replicas',
|
||
desired_shard_count: 'Shard Count',
|
||
insecure_skip_verify: 'Skip TLS Verification',
|
||
hnsw_m: 'HNSW M (graph degree)',
|
||
hnsw_ef_construction: 'HNSW ef_construction',
|
||
hnsw_ef_search: 'HNSW ef_search',
|
||
knn_engine: 'k-NN Engine',
|
||
},
|
||
envTag: 'DEFAULT',
|
||
testConnection: 'Test Connection',
|
||
testing: 'Testing...',
|
||
immutableNotice: 'Engine type, connection, and index settings cannot be changed after creation.\nTo change these, delete and recreate.',
|
||
insecureSkipVerifyWarning: 'Disabling TLS certificate verification exposes the connection to man-in-the-middle attacks. Use only for self-signed development clusters — never in production.',
|
||
validation: {
|
||
nameRequired: 'Name is required',
|
||
engineTypeRequired: 'Engine type is required',
|
||
fieldRequired: '{field} is required',
|
||
indexNamePattern: 'Must start with a letter. Only letters, numbers, underscore, and hyphen allowed (max 128)',
|
||
},
|
||
toasts: {
|
||
storeCreated: 'Vector database created',
|
||
storeUpdated: 'Vector database updated',
|
||
storeDeleted: 'Vector database deleted',
|
||
testSuccess: 'Connection test succeeded',
|
||
testFailed: 'Connection test failed',
|
||
duplicateName: 'A vector database with this name already exists',
|
||
errorGeneric: 'An error occurred. Please try again.',
|
||
},
|
||
},
|
||
chatHistorySettings: {
|
||
title: 'Message Management',
|
||
description: 'Configure chat history knowledge base to automatically index conversation messages for semantic search',
|
||
enableLabel: 'Enable Message Indexing',
|
||
enableDescription: 'When enabled, new conversation messages will be automatically indexed into the knowledge base for vector search',
|
||
embeddingModelLabel: 'Embedding Model',
|
||
embeddingModelDescription: 'Select the embedding model for vectorizing chat messages',
|
||
embeddingModelLocked: 'Messages have been indexed; the embedding model cannot be changed (clearing indexed data is required)',
|
||
statsTitle: 'Index Statistics',
|
||
statsIndexedMessages: 'Indexed Messages',
|
||
statsNotConfigured: 'Message indexing not configured',
|
||
statsNotConfiguredDesc: 'Enable and select an embedding model to start auto-indexing conversation messages',
|
||
toasts: {
|
||
saveSuccess: 'Message management configuration saved',
|
||
saveFailed: 'Failed to save configuration: {message}',
|
||
loadFailed: 'Failed to load configuration: {message}',
|
||
},
|
||
},
|
||
retrievalSettings: {
|
||
title: 'Search Settings',
|
||
description: 'Configure global retrieval parameters for knowledge search and message search',
|
||
embeddingTopKLabel: 'Vector Search Top K',
|
||
embeddingTopKDescription: 'Maximum number of results returned by vector search',
|
||
vectorThresholdLabel: 'Vector Similarity Threshold',
|
||
vectorThresholdDescription: 'Minimum similarity score for vector search (0-1, higher is more precise)',
|
||
keywordThresholdLabel: 'Keyword Match Threshold',
|
||
keywordThresholdDescription: 'Minimum match score for keyword search (0-1)',
|
||
rerankTopKLabel: 'Rerank Top K',
|
||
rerankTopKDescription: 'Maximum number of results kept after reranking',
|
||
rerankThresholdLabel: 'Rerank Threshold',
|
||
rerankThresholdDescription: 'Minimum score threshold for reranking (-10 to 10)',
|
||
rerankModelLabel: 'Rerank Model',
|
||
rerankModelDescription: 'Select the model for reranking search results',
|
||
rerankModelRequired: 'Please select a Rerank model. Search requires this model to rerank results.',
|
||
toasts: {
|
||
saveSuccess: 'Retrieval configuration saved',
|
||
saveFailed: 'Failed to save configuration: {message}',
|
||
},
|
||
},
|
||
graphSettings: {
|
||
title: 'Knowledge Graph Configuration',
|
||
description: 'Configure entity-relationship extraction to automatically build a knowledge graph from text (note: this is different from the "page-link graph" inside the Wiki — that one shows references between Wiki pages, while this one is an LLM-extracted entity-relationship graph)',
|
||
enableLabel: 'Enable Entity-Relationship Extraction',
|
||
enableDescription: 'Automatically extract entities and relationships from text when enabled',
|
||
tagsLabel: 'Relationship Types',
|
||
tagsDescription: 'Define relationship type tags to extract, separated by commas',
|
||
tagsPlaceholder: 'Enter relationship types, e.g., works_at, colleague, friend',
|
||
generateRandomTags: 'Generate Random Tags',
|
||
sampleTextLabel: 'Sample Text',
|
||
sampleTextDescription: 'Sample text for testing entity-relationship extraction',
|
||
sampleTextPlaceholder: 'Enter text containing entities and relationships...',
|
||
generateRandomText: 'Generate Random Text',
|
||
entityListLabel: 'Entity List',
|
||
entityListDescription: 'Entities and their attributes extracted from text',
|
||
nodeNamePlaceholder: 'Enter entity name',
|
||
attributePlaceholder: 'Enter attribute value',
|
||
addAttribute: 'Add Attribute',
|
||
manageEntitiesLabel: 'Manage Entities',
|
||
manageEntitiesDescription: 'Add or remove entity nodes',
|
||
addEntity: 'Add Entity',
|
||
relationListLabel: 'Relationship List',
|
||
relationListDescription: 'Define relationship connections between entities',
|
||
selectEntity: 'Select Entity',
|
||
selectRelationType: 'Select Relationship Type',
|
||
manageRelationsLabel: 'Manage Relationships',
|
||
manageRelationsDescription: 'Add or remove relationships between entities',
|
||
addRelation: 'Add Relationship',
|
||
extractActionsLabel: 'Extraction Actions',
|
||
extractActionsDescription: 'Perform entity-relationship extraction or manage sample data',
|
||
startExtraction: 'Start Extraction',
|
||
extracting: 'Extracting...',
|
||
defaultExample: 'Default Example',
|
||
clearExample: 'Clear Example',
|
||
completeModelConfig: 'Please complete model configuration first',
|
||
tagsGenerated: 'Tags generated successfully',
|
||
tagsGenerateFailed: 'Failed to generate tags',
|
||
textGenerated: 'Text generated successfully',
|
||
textGenerateFailed: 'Failed to generate text',
|
||
pleaseInputText: 'Please enter sample text first',
|
||
extractSuccess: 'Entity-relationship extraction successful',
|
||
extractFailed: 'Entity-relationship extraction failed',
|
||
exampleLoaded: 'Example loaded',
|
||
exampleCleared: 'Example cleared',
|
||
disabledWarning: 'Knowledge graph database is not enabled, entity-relationship extraction will not be available',
|
||
howToEnable: 'How to enable knowledge graph?',
|
||
saveSuccess: 'Graph configuration saved',
|
||
saveFailed: 'Failed to save configuration: {message}',
|
||
errors: {
|
||
unknown: 'Unknown error',
|
||
},
|
||
},
|
||
initialization: {
|
||
title: 'Initialization',
|
||
welcome: 'Welcome to WeKnora',
|
||
description: 'Please configure the system before starting',
|
||
step1: 'Step 1: Configure LLM Model',
|
||
step2: 'Step 2: Configure Embedding Model',
|
||
step3: 'Step 3: Configure Additional Models',
|
||
complete: 'Complete Initialization',
|
||
skip: 'Skip',
|
||
next: 'Next',
|
||
previous: 'Previous',
|
||
// Ollama service
|
||
ollamaServiceStatus: 'Ollama Service Status',
|
||
refreshStatus: 'Refresh Status',
|
||
ollamaServiceAddress: 'Ollama Service Address',
|
||
notConfigured: 'Not Configured',
|
||
notRunning: 'Not Running',
|
||
normal: 'Normal',
|
||
installedModels: 'Installed Models',
|
||
none: 'None temporarily',
|
||
// Knowledge base
|
||
knowledgeBaseInfo: 'Knowledge Base Information',
|
||
knowledgeBaseName: 'Knowledge Base Name',
|
||
knowledgeBaseNamePlaceholder: 'Enter knowledge base name',
|
||
knowledgeBaseDescription: 'Knowledge Base Description',
|
||
knowledgeBaseDescriptionPlaceholder: 'Enter knowledge base description',
|
||
// LLM model
|
||
llmModelConfig: 'LLM Large Language Model Configuration',
|
||
modelSource: 'Model Source',
|
||
local: 'Ollama (Local)',
|
||
remote: 'Remote API (Remote)',
|
||
modelName: 'Model Name',
|
||
modelNamePlaceholder: 'E.g.: qwen3:0.6b',
|
||
baseUrl: 'Base URL',
|
||
baseUrlPlaceholder: 'E.g.: https://api.openai.com/v1, remove /chat/completions from the end of URL',
|
||
apiKey: 'API Key (Optional)',
|
||
apiKeyPlaceholder: 'Enter API Key (Optional)',
|
||
downloadModel: 'Download Model',
|
||
installed: 'Installed',
|
||
notInstalled: 'Not Installed',
|
||
notChecked: 'Not Checked',
|
||
checkConnection: 'Check Connection',
|
||
connectionNormal: 'Connection Normal',
|
||
connectionFailed: 'Connection Failed',
|
||
checkingConnection: 'Checking Connection',
|
||
// Embedding model
|
||
embeddingModelConfig: 'Embedding Model Configuration',
|
||
embeddingWarning: 'Knowledge base already has files, cannot change embedding model configuration',
|
||
dimension: 'Dimension',
|
||
dimensionPlaceholder: 'Enter vector dimension',
|
||
detectDimension: 'Detect Dimension',
|
||
// Rerank model
|
||
rerankModelConfig: 'Rerank Model Configuration',
|
||
enableRerank: 'Enable Rerank Model',
|
||
// Multimodal settings
|
||
multimodalConfig: 'Multimodal Configuration',
|
||
enableMultimodal: 'Enable image information extraction',
|
||
visualLanguageModelConfig: 'Visual Language Model Configuration',
|
||
interfaceType: 'Interface Type',
|
||
openaiCompatible: 'OpenAI Compatible Interface',
|
||
// Storage settings
|
||
storageServiceConfig: 'Storage Service Configuration',
|
||
storageType: 'Storage Type',
|
||
bucketName: 'Bucket Name',
|
||
bucketNamePlaceholder: 'Enter Bucket name',
|
||
pathPrefix: 'Path Prefix',
|
||
pathPrefixPlaceholder: 'E.g.: images',
|
||
secretId: 'Secret ID',
|
||
secretIdPlaceholder: 'Enter COS Secret ID',
|
||
secretKey: 'Secret Key',
|
||
secretKeyPlaceholder: 'Enter COS Secret Key',
|
||
region: 'Region',
|
||
regionPlaceholder: 'E.g.: ap-beijing',
|
||
appId: 'App ID',
|
||
appIdPlaceholder: 'Enter App ID',
|
||
// Multimodal function testing
|
||
functionTest: 'Function Test',
|
||
testDescription: 'Upload an image to test the model\'s image description and text recognition functions',
|
||
selectImage: 'Select Image',
|
||
startTest: 'Start Test',
|
||
testResult: 'Test Result',
|
||
imageDescription: 'Image Description:',
|
||
textRecognition: 'Text Recognition:',
|
||
processingTime: 'Processing Time:',
|
||
testFailed: 'Test Failed',
|
||
multimodalProcessingFailed: 'Multimodal processing failed',
|
||
// Document splitting
|
||
documentSplittingConfig: 'Document Splitting Configuration',
|
||
splittingStrategy: 'Splitting Strategy',
|
||
balancedMode: 'Balanced Mode',
|
||
balancedModeDesc: 'Chunk size: 1000 / Overlap: 200',
|
||
precisionMode: 'Precision Mode',
|
||
precisionModeDesc: 'Chunk size: 512 / Overlap: 100',
|
||
contextMode: 'Context Mode',
|
||
contextModeDesc: 'Chunk size: 2048 / Overlap: 400',
|
||
custom: 'Custom',
|
||
customDesc: 'Configure parameters manually',
|
||
chunkSize: 'Chunk Size',
|
||
chunkOverlap: 'Chunk Overlap',
|
||
separatorSettings: 'Separator Settings',
|
||
selectOrCustomSeparators: 'Select or customize separators',
|
||
characters: 'characters',
|
||
separatorParagraph: 'Paragraph separator (\\n\\n)',
|
||
separatorNewline: 'Newline (\\n)',
|
||
separatorPeriod: 'Period (。)',
|
||
separatorExclamation: 'Exclamation mark (!)',
|
||
separatorQuestion: 'Question mark (?)',
|
||
separatorSemicolon: 'Semicolon (;)',
|
||
separatorChineseSemicolon: 'Chinese semicolon (;)',
|
||
separatorComma: 'Comma (,)',
|
||
separatorChineseComma: 'Chinese comma (,)',
|
||
// Entity and relation extraction
|
||
entityRelationExtraction: 'Entity and Relation Extraction',
|
||
enableEntityRelationExtraction: 'Enable entity and relation extraction',
|
||
relationTypeConfig: 'Relation Type Configuration',
|
||
relationType: 'Relation Type',
|
||
generateRandomTags: 'Generate Random Tags',
|
||
completeModelConfig: 'Please complete model configuration',
|
||
systemWillExtract: 'The system will extract corresponding entities and relations from the text according to the selected relation types',
|
||
extractionExample: 'Extraction Example',
|
||
sampleText: 'Sample Text',
|
||
sampleTextPlaceholder: 'Enter text for analysis, e.g.: "Red Mansion", also known as "Dream of the Red Chamber", is one of the four great classical novels of Chinese literature, written by Cao Xueqin during the Qing Dynasty...',
|
||
generateRandomText: 'Generate Random Text',
|
||
entityList: 'Entity List',
|
||
nodeName: 'Node Name',
|
||
nodeNamePlaceholder: 'Node name',
|
||
addAttribute: 'Add Attribute',
|
||
attributeValue: 'Attribute Value',
|
||
attributeValuePlaceholder: 'Attribute value',
|
||
addEntity: 'Add Entity',
|
||
completeEntityInfo: 'Please complete entity information',
|
||
relationConnection: 'Relation Connection',
|
||
selectEntity: 'Select Entity',
|
||
addRelation: 'Add Relation',
|
||
completeRelationInfo: 'Please complete relation information',
|
||
startExtraction: 'Start Extraction',
|
||
extracting: 'Extracting...',
|
||
defaultExample: 'Default Example',
|
||
clearExample: 'Clear Example',
|
||
// Buttons and messages
|
||
updateKnowledgeBaseSettings: 'Update Knowledge Base Settings',
|
||
updateConfigInfo: 'Update Configuration Information',
|
||
completeConfig: 'Complete Configuration',
|
||
waitForDownloads: 'Please wait for all Ollama models to finish downloading before updating configuration',
|
||
completeModelConfigInfo: 'Please complete model configuration information',
|
||
knowledgeBaseIdMissing: 'Knowledge base ID is missing',
|
||
knowledgeBaseSettingsUpdateSuccess: 'Knowledge base settings updated successfully',
|
||
configUpdateSuccess: 'Configuration updated successfully',
|
||
systemInitComplete: 'System initialization completed',
|
||
operationFailed: 'Operation failed',
|
||
updateKnowledgeBaseInfoFailed: 'Failed to update knowledge base basic information',
|
||
knowledgeBaseIdMissingCannotSave: 'Knowledge base ID is missing, cannot save configuration',
|
||
operationFailedCheckNetwork: 'Operation failed, please check network connection',
|
||
imageUploadSuccess: 'Image uploaded successfully, testing can begin',
|
||
multimodalConfigIncomplete: 'Multimodal configuration incomplete, please complete multimodal configuration before uploading images',
|
||
pleaseSelectImage: 'Please select an image',
|
||
multimodalTestSuccess: 'Multimodal test successful',
|
||
multimodalTestFailed: 'Multimodal test failed',
|
||
pleaseEnterSampleText: 'Please enter sample text',
|
||
pleaseEnterRelationType: 'Please enter relation type',
|
||
pleaseEnterLLMModelConfig: 'Please enter LLM large language model configuration',
|
||
noValidNodesExtracted: 'No valid nodes extracted',
|
||
noValidRelationsExtracted: 'No valid relations extracted',
|
||
extractionFailedCheckNetwork: 'Extraction failed, please check network or text format',
|
||
generateFailedRetry: 'Generation failed, please try again',
|
||
pleaseCheckForm: 'Please check form correctness',
|
||
detectionSuccessful: 'Detection successful, dimension automatically filled as',
|
||
detectionFailed: 'Detection failed',
|
||
detectionFailedCheckConfig: 'Detection failed, please check configuration',
|
||
modelDownloadSuccess: 'Model downloaded successfully',
|
||
modelDownloadFailed: 'Model download failed',
|
||
downloadStartFailed: 'Download start failed',
|
||
queryProgressFailed: 'Progress query failed',
|
||
checkOllamaStatusFailed: 'Ollama status check failed',
|
||
getKnowledgeBaseInfoFailed: 'Failed to get knowledge base information',
|
||
textRelationExtractionFailed: 'Text relation extraction failed',
|
||
// Validation
|
||
pleaseEnterKnowledgeBaseName: 'Please enter knowledge base name',
|
||
knowledgeBaseNameLength: 'Knowledge base name length must be 1-50 characters',
|
||
knowledgeBaseDescriptionLength: 'Knowledge base description cannot exceed 200 characters',
|
||
pleaseEnterLLMModelName: 'Please enter LLM model name',
|
||
pleaseEnterBaseURL: 'Please enter BaseURL',
|
||
pleaseEnterEmbeddingModelName: 'Please enter embedding model name',
|
||
pleaseEnterEmbeddingDimension: 'Please enter embedding dimension',
|
||
dimensionMustBeInteger: 'Dimension must be a valid integer, usually 768, 1024, 1536, 3584, etc.',
|
||
pleaseEnterTextContent: 'Please enter text content',
|
||
textContentMinLength: 'Text content must contain at least 10 characters',
|
||
pleaseEnterValidTag: 'Please enter a valid tag',
|
||
tagAlreadyExists: 'This tag already exists',
|
||
// Additional translations for InitializationContent.vue
|
||
checkFailed: 'Check failed',
|
||
startingDownload: 'Starting download...',
|
||
downloadStarted: 'Download started',
|
||
model: 'Model',
|
||
startModelDownloadFailed: 'Failed to start model download',
|
||
downloadCompleted: 'Download completed',
|
||
downloadFailed: 'Download failed',
|
||
knowledgeBaseSettingsModeMissingId: 'Knowledge base settings mode missing ID',
|
||
completeEmbeddingConfig: 'Please complete embedding configuration first',
|
||
detectionSuccess: 'Detection successful,',
|
||
dimensionAutoFilled: 'dimension automatically filled:',
|
||
checkFormCorrectness: 'Please check form correctness',
|
||
systemInitializationCompleted: 'System initialization completed',
|
||
generationFailedRetry: 'Generation failed, please try again',
|
||
chunkSizeDesc: 'Size of each text chunk. Larger chunks preserve more context but may reduce search accuracy.',
|
||
chunkOverlapDesc: 'Number of characters overlapping between adjacent chunks. Helps maintain context at chunk boundaries.',
|
||
selectRelationType: 'Select relation type'
|
||
},
|
||
inviteRegister: {
|
||
bannerTitle: 'You have been invited to join "{tenant}"',
|
||
bannerHint: 'Fill in the details below to register. You will join the team automatically once registration completes.',
|
||
loading: 'Verifying invitation link…',
|
||
invalidTitle: 'Invitation link is invalid or revoked',
|
||
invalidBody: 'Ask your inviter to send a new link, or sign in with an existing account.',
|
||
backToLogin: 'Back to login',
|
||
title: 'Complete registration',
|
||
subtitle: "You've been invited to join “{tenant}”",
|
||
email: 'Email',
|
||
emailPlaceholder: 'your@example.com',
|
||
emailHint: 'Use any email address you control.',
|
||
emailInvalid: 'Please enter a valid email address',
|
||
username: 'Display name',
|
||
usernamePlaceholder: 'Enter your display name',
|
||
password: 'Set a password',
|
||
passwordPlaceholder: 'At least 6 characters',
|
||
confirmPassword: 'Confirm password',
|
||
submit: 'Complete registration',
|
||
submitting: 'Submitting…',
|
||
success: 'Registration successful — entering workspace…',
|
||
failed: 'Registration failed; please try again later',
|
||
usernameRequired: 'Display name is required',
|
||
passwordTooShort: 'Password must be at least 6 characters',
|
||
passwordMismatch: 'Passwords do not match',
|
||
},
|
||
auth: {
|
||
login: 'Login',
|
||
logout: 'Logout',
|
||
oidcLogin: 'Sign in with OIDC',
|
||
oidcLoginWithProvider: 'Sign in with {provider}',
|
||
redirectingToOIDC: 'Redirecting to identity provider...',
|
||
orContinueWith: 'Or continue with',
|
||
oidcLoginFailed: 'OIDC login failed',
|
||
oidcStateMismatch: 'OIDC state verification failed, please try again',
|
||
username: 'Username',
|
||
email: 'Email',
|
||
password: 'Password',
|
||
confirmPassword: 'Confirm Password',
|
||
rememberMe: 'Remember Me',
|
||
forgotPassword: 'Forgot Password?',
|
||
loginSuccess: 'Login successful!',
|
||
loginSuccessTitle: 'Login successful',
|
||
loginSuccessContent: 'Welcome back. You are now in {name}',
|
||
loginSuccessContentWithRole: 'Welcome back. You are now in {name} · as {role}',
|
||
loginFailed: 'Login failed',
|
||
loggingIn: 'Logging in...',
|
||
register: 'Register',
|
||
registering: 'Registering...',
|
||
createAccount: 'Create Account',
|
||
haveAccount: 'Already have an account?',
|
||
noAccount: 'Don\'t have an account?',
|
||
backToLogin: 'Back to Login',
|
||
registerNow: 'Register Now',
|
||
loginHint: 'Sign in to continue, or create an account below if this is your first time.',
|
||
firstTime: 'New to WeKnora?',
|
||
registerSuccess: 'Registration successful! The system has created an exclusive tenant for you, please login',
|
||
registerFailed: 'Registration failed',
|
||
subtitle: 'Document understanding and semantic search framework based on large models',
|
||
registerSubtitle: 'The system will create an exclusive tenant for you after registration',
|
||
emailPlaceholder: 'Enter email address',
|
||
passwordPlaceholder: 'Enter password (8-32 characters, including letters and numbers)',
|
||
confirmPasswordPlaceholder: 'Enter password again',
|
||
usernamePlaceholder: 'Enter username',
|
||
emailRequired: 'Enter email address',
|
||
emailInvalid: 'Enter correct email format',
|
||
passwordRequired: 'Enter password',
|
||
passwordMinLength: 'Password must be at least 8 characters',
|
||
passwordMaxLength: 'Password cannot exceed 32 characters',
|
||
passwordMustContainLetter: 'Password must contain letters',
|
||
passwordMustContainNumber: 'Password must contain numbers',
|
||
usernameRequired: 'Enter username',
|
||
usernameMinLength: 'Username must be at least 2 characters',
|
||
usernameMaxLength: 'Username cannot exceed 20 characters',
|
||
usernameInvalid: 'Username can only contain letters, numbers, underscores and Chinese characters',
|
||
confirmPasswordRequired: 'Confirm password',
|
||
passwordMismatch: 'Entered passwords do not match',
|
||
loginError: 'Login error, please check email or password',
|
||
loginErrorRetry: 'Login error, please try again later',
|
||
registerError: 'Registration error, please try again later',
|
||
forgotPasswordNotAvailable: 'Password recovery function is temporarily unavailable, please contact administrator'
|
||
},
|
||
authStore: {
|
||
errors: {
|
||
parseUserFailed: 'Failed to parse user information',
|
||
parseTenantFailed: 'Failed to parse tenant information',
|
||
parseKnowledgeBasesFailed: 'Failed to parse knowledge base list',
|
||
parseCurrentKnowledgeBaseFailed: 'Failed to parse current knowledge base'
|
||
}
|
||
},
|
||
common: {
|
||
me: 'Me',
|
||
confirm: 'Confirm',
|
||
cancel: 'Cancel',
|
||
save: 'Save',
|
||
delete: 'Delete',
|
||
edit: 'Edit',
|
||
copy: 'Copy',
|
||
copied: 'Copied',
|
||
default: 'Default',
|
||
create: 'Create',
|
||
search: 'Search',
|
||
filter: 'Filter',
|
||
export: 'Export',
|
||
import: 'Import',
|
||
upload: 'Upload',
|
||
download: 'Download',
|
||
refresh: 'Refresh',
|
||
loading: 'Loading...',
|
||
noData: 'No data',
|
||
noMoreData: 'All content loaded',
|
||
error: 'Error',
|
||
success: 'Success',
|
||
failed: 'Failed',
|
||
warning: 'Warning',
|
||
info: 'Information',
|
||
selectAll: 'Select All',
|
||
yes: 'Yes',
|
||
no: 'No',
|
||
ok: 'OK',
|
||
close: 'Close',
|
||
back: 'Back',
|
||
next: 'Next',
|
||
finish: 'Finish',
|
||
all: 'All',
|
||
reset: 'Reset',
|
||
clear: 'Clear',
|
||
website: 'Official Website',
|
||
chromeExtension: 'Chrome extension',
|
||
clawhubSkill: 'Claw Skill',
|
||
newBadge: 'New',
|
||
github: 'GitHub',
|
||
githubStarTip: 'Open the repo on GitHub — star it if you find it useful',
|
||
on: 'On',
|
||
off: 'Off',
|
||
resetToDefault: 'Reset to default',
|
||
confirmDelete: 'Confirm Delete',
|
||
deleteSuccess: 'Deleted successfully',
|
||
deleteFailed: 'Delete failed',
|
||
saveSuccess: 'Saved successfully',
|
||
saveFailed: 'Save failed',
|
||
file: 'File',
|
||
knowledgeBase: 'Knowledge Base',
|
||
noResult: 'No results',
|
||
remove: 'Remove',
|
||
defaultUser: 'User',
|
||
copyFailed: 'Copy failed',
|
||
retry: 'Retry',
|
||
expand: 'Expand',
|
||
collapse: 'Collapse',
|
||
},
|
||
mentionDetail: {
|
||
readOnlyFromAgent: 'Read-only in this conversation; not shown in Knowledge Base list',
|
||
faqCount: '{count} Q&A entries',
|
||
kbCount: '{count} documents',
|
||
belongsToKb: 'Knowledge base: ',
|
||
belongsToOrg: 'Space: ',
|
||
noCompatibleKbForAgent: "This agent's tools don't match any knowledge base's capabilities in scope, so nothing can be referenced.",
|
||
},
|
||
file: {
|
||
upload: 'Upload File',
|
||
uploadSuccess: 'File uploaded successfully',
|
||
uploadFailed: 'File upload failed',
|
||
delete: 'Delete File',
|
||
deleteSuccess: 'File deleted successfully',
|
||
deleteFailed: 'File deletion failed',
|
||
download: 'Download File',
|
||
preview: 'Preview',
|
||
unsupportedFormat: 'Unsupported file format',
|
||
maxSizeExceeded: 'Maximum file size exceeded',
|
||
selectFile: 'Select File'
|
||
},
|
||
manualEditor: {
|
||
placeholders: {
|
||
heading: 'Heading {level}',
|
||
listItem: 'List item',
|
||
taskItem: 'Task item',
|
||
quote: 'Quoted text',
|
||
code: 'Code content',
|
||
linkText: 'Link text',
|
||
imageAlt: 'Description',
|
||
bold: 'Bold text',
|
||
italic: 'Italic text',
|
||
strike: 'Strikethrough',
|
||
inlineCode: 'code'
|
||
},
|
||
table: {
|
||
column1: 'Column 1',
|
||
column2: 'Column 2',
|
||
cell: 'Content'
|
||
},
|
||
toolbar: {
|
||
bold: 'Bold',
|
||
italic: 'Italic',
|
||
strike: 'Strikethrough',
|
||
inlineCode: 'Inline code',
|
||
heading1: 'Heading 1',
|
||
heading2: 'Heading 2',
|
||
heading3: 'Heading 3',
|
||
bulletList: 'Bullet list',
|
||
orderedList: 'Numbered list',
|
||
taskList: 'Task list',
|
||
blockquote: 'Blockquote',
|
||
codeBlock: 'Code block',
|
||
link: 'Insert link',
|
||
image: 'Insert image',
|
||
table: 'Insert table',
|
||
horizontalRule: 'Horizontal rule'
|
||
},
|
||
view: {
|
||
toggleToEdit: 'Switch to edit view',
|
||
toggleToPreview: 'Switch to preview view',
|
||
editLabel: 'Back to edit',
|
||
previewLabel: 'Preview content'
|
||
},
|
||
preview: {
|
||
empty: 'No content yet'
|
||
},
|
||
title: {
|
||
edit: 'Edit Markdown Knowledge',
|
||
create: 'Create Markdown Knowledge'
|
||
},
|
||
labels: {
|
||
currentKnowledgeBase: 'Current knowledge base'
|
||
},
|
||
defaultTitlePrefix: 'New Document',
|
||
error: {
|
||
fetchDetailFailed: 'Failed to fetch knowledge details',
|
||
saveFailed: 'Save failed, please try again later'
|
||
},
|
||
warning: {
|
||
selectKnowledgeBase: 'Please select a target knowledge base',
|
||
enterTitle: 'Please enter a knowledge title',
|
||
enterContent: 'Please enter knowledge content',
|
||
contentTooShort: 'Content is too short. Please add more information before publishing'
|
||
},
|
||
success: {
|
||
draftSaved: 'Draft saved',
|
||
published: 'Knowledge published and indexing started'
|
||
},
|
||
form: {
|
||
knowledgeBaseLabel: 'Target knowledge base',
|
||
knowledgeBasePlaceholder: 'Select knowledge base',
|
||
titleLabel: 'Knowledge title',
|
||
titlePlaceholder: 'Enter title',
|
||
contentPlaceholder: 'Supports Markdown. Use # headings, lists, code blocks, etc.'
|
||
},
|
||
noDocumentKnowledgeBases: 'No document-type knowledge bases available. Please create one first',
|
||
status: {
|
||
draftTag: 'Status: Draft',
|
||
publishedTag: 'Status: Published',
|
||
lastUpdated: 'Last updated: {time}'
|
||
},
|
||
loading: {
|
||
content: 'Loading content...',
|
||
preparing: 'Preparing editor...'
|
||
},
|
||
actions: {
|
||
cancel: 'Cancel',
|
||
saveDraft: 'Save Draft',
|
||
publish: 'Publish'
|
||
}
|
||
},
|
||
input: {
|
||
addModel: 'Add Model',
|
||
placeholder: 'Ask questions directly to the model',
|
||
placeholderWithContext: 'Enter your question, will answer based on selected knowledge bases/files above',
|
||
placeholderWebOnly: 'Enter your question, will answer with web search',
|
||
placeholderKbAndWeb: 'Enter your question, will answer based on knowledge base and web search',
|
||
placeholderAgent: 'Ask {name}',
|
||
agentMode: 'Smart Reasoning',
|
||
normalMode: 'Quick Answer',
|
||
normalModeDesc: 'Knowledge base RAG Q&A',
|
||
agentModeDesc: 'Multi-step thinking, deep analysis',
|
||
agentNotReadyTooltip: 'Agent is not ready. Please finish configuration first.',
|
||
agentMissingAllowedTools: 'Allowed tools',
|
||
agentMissingSummaryModel: 'Chat Model (Summary Model)',
|
||
agentMissingRerankModel: 'Rerank Model',
|
||
goToSettings: 'Go to settings →',
|
||
customAgentNotReadyTooltip: 'Agent is not ready. Please finish configuration first.',
|
||
customAgentNotReadyDetail: 'Agent is not ready. Please configure the following: {reasons}',
|
||
customAgentMissingSummaryModel: 'Chat Model (Summary Model)',
|
||
customAgentMissingRerankModel: 'Rerank Model',
|
||
goToAgentEditor: 'Go to configure →',
|
||
agentNotReadyDetail: 'Agent "{agentName}" is not ready. Please configure: {reasons}',
|
||
builtinAgentNotReadyDetail: 'Built-in agent "{agentName}" is not ready. Please configure: {reasons}',
|
||
builtinAgentSettingName: 'Intelligent Reasoning',
|
||
builtinNormalSettingName: 'Quick Q&A',
|
||
webSearch: {
|
||
toggleOn: 'Enable Web Search',
|
||
toggleOff: 'Disable Web Search',
|
||
notConfigured: 'Web search engine not configured'
|
||
},
|
||
knowledgeBase: 'Knowledge Base',
|
||
knowledgeBaseWithCount: 'Knowledge Base ({count})',
|
||
notConfigured: 'Not configured',
|
||
sharedAgentModelLabel: 'Model from shared agent',
|
||
model: 'Model',
|
||
remote: 'Remote',
|
||
noModel: 'No available models',
|
||
stopGeneration: 'Stop Generation',
|
||
send: 'Send',
|
||
thinkingLabel: 'Thinking:',
|
||
messages: {
|
||
enterContent: 'Please enter content first!',
|
||
selectKnowledge: 'Please select a knowledge base first!',
|
||
replying: 'Currently replying, please try again later!',
|
||
agentSwitchedOn: 'Switched to Intelligent Reasoning',
|
||
agentSwitchedOff: 'Switched to Quick Q&A',
|
||
agentSelected: 'Selected agent "{name}"',
|
||
agentEnabled: 'Agent Mode enabled',
|
||
agentDisabled: 'Agent Mode disabled',
|
||
agentNotReadyDetail: 'Agent is not ready. Please configure the following: {reasons}',
|
||
webSearchNotConfigured: 'Web search engine is not configured. Please configure a provider and credentials in settings.',
|
||
webSearchEnabled: 'Web search enabled',
|
||
webSearchDisabled: 'Web search disabled',
|
||
sessionMissing: 'Session ID does not exist',
|
||
messageMissing: 'Unable to get message ID. Please refresh the page and try again.',
|
||
stopSuccess: 'Generation stopped',
|
||
stopFailed: 'Failed to stop. Please try again.'
|
||
},
|
||
webSearchDisabledByAgent: 'Web search is disabled by the current agent',
|
||
webSearchForcedByAgent: 'Web search is enabled by the current agent and cannot be turned off',
|
||
kbLockedByAgent: 'Knowledge base configuration is locked by the current agent',
|
||
kbDisabledByAgent: 'Knowledge base is disabled by the current agent',
|
||
cannotRemoveAgentKb: 'Cannot remove knowledge base configured by agent',
|
||
agentConfiguredKb: 'Configured by agent, cannot be removed',
|
||
modelLockedByAgent: 'Model selection is locked by the current agent',
|
||
imageUploadDisabledByAgent: 'Image upload is not enabled for this agent',
|
||
goToAgentSettings: 'Go to agent settings'
|
||
},
|
||
createChat: {
|
||
title: 'Hi, I am WeKnora — your knowledge, within reach',
|
||
newSessionTitle: 'New Session',
|
||
messages: {
|
||
selectKnowledgeBase: 'Please select a knowledge base first',
|
||
createFailed: 'Failed to create session',
|
||
createError: 'Failed to create session, please try again later'
|
||
}
|
||
},
|
||
knowledgeList: {
|
||
create: 'Create Knowledge Base',
|
||
createShort: 'New',
|
||
createFAQ: 'Create FAQ Knowledge Base',
|
||
subtitle: 'Manage and organize your knowledge bases, supporting document-based and FAQ-based knowledge bases',
|
||
myKnowledgeBases: 'My Knowledge Bases',
|
||
sharedKnowledgeBases: 'Shared Knowledge Bases',
|
||
sharedToOrgs: 'Shared to {count} space(s)',
|
||
sharedLabel: 'Shared',
|
||
myLabel: 'Mine',
|
||
fromAgent: 'From agent {name}',
|
||
fromAgentShort: 'Agent: {name}',
|
||
tabs: {
|
||
all: 'All',
|
||
myKnowledgeBases: 'My Knowledge Bases',
|
||
sharedToMe: 'Shared with me',
|
||
},
|
||
uninitializedBanner: 'Some knowledge bases are not initialized. Configure model information in settings before adding documents.',
|
||
emptyShared: 'No collaborative knowledge bases yet. Join a shared space to access knowledge bases from others.',
|
||
empty: {
|
||
title: 'No knowledge bases yet',
|
||
description: 'Click "Create Knowledge Base" in the top-right corner to add your first one.',
|
||
sharedTitle: 'No shared knowledge bases',
|
||
sharedDescription: 'You can join a shared space or request others to share knowledge bases with you',
|
||
favoritesTitle: 'No favorites yet',
|
||
favoritesDescription: 'Star a knowledge base from its card to add it here',
|
||
recentsTitle: 'Nothing here yet',
|
||
recentsDescription: 'Knowledge bases you recently opened will show up here',
|
||
},
|
||
delete: {
|
||
confirmTitle: 'Delete Confirmation',
|
||
confirmMessage: 'Are you sure you want to delete the knowledge base "{name}"? This action cannot be undone.',
|
||
confirmButton: 'Delete'
|
||
},
|
||
menu: {
|
||
viewDetails: 'View Details',
|
||
},
|
||
pin: {
|
||
pin: 'Pin to Top',
|
||
unpin: 'Unpin',
|
||
pinSuccess: 'Pinned',
|
||
unpinSuccess: 'Unpinned',
|
||
failed: 'Operation failed',
|
||
},
|
||
sections: {
|
||
pinned: 'Pinned',
|
||
mine: 'Created by me',
|
||
tenantReadonly: 'Workspace · View only',
|
||
tenantOthers: 'Workspace · Other members',
|
||
sharedByMe: 'Shared by me',
|
||
sharedEditable: 'Shared with me · Can edit',
|
||
sharedReadonly: 'Shared with me · View only',
|
||
},
|
||
messages: {
|
||
deleted: 'Knowledge base deleted',
|
||
deleteFailed: 'Failed to delete knowledge base',
|
||
file: 'File',
|
||
knowledgeBase: 'Knowledge Base',
|
||
noResult: 'No results',
|
||
},
|
||
detail: {
|
||
title: 'Shared Knowledge Base',
|
||
overview: 'Overview',
|
||
overviewDesc: 'View knowledge base information and source',
|
||
permission: 'Permission',
|
||
permissionDesc: 'View your permissions for this knowledge base',
|
||
sourceType: 'Source',
|
||
sourceTypeKbShare: 'KB shared directly to this space',
|
||
sourceTypeAgent: 'Visible via shared agent',
|
||
sourceOrg: 'Space',
|
||
sourceFromAgent: 'Agent',
|
||
agentKbStrategy: 'Agent KB strategy',
|
||
agentKbStrategyAll: 'All knowledge bases',
|
||
agentKbStrategySelected: 'Selected knowledge bases',
|
||
agentKbStrategyNone: 'No knowledge bases',
|
||
sharedAt: 'Shared At',
|
||
myPermission: 'My Permission',
|
||
canEdit: 'Can edit knowledge base content',
|
||
canView: 'Can view knowledge base content',
|
||
canSearch: 'Can search and use knowledge base',
|
||
goToKb: 'Go to Knowledge Base',
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
},
|
||
features: {
|
||
knowledgeGraph: 'Knowledge Graph',
|
||
multimodal: 'Multimodal',
|
||
questionGeneration: 'Question Generation',
|
||
},
|
||
processing: 'Processing import task',
|
||
processingDocuments: 'Processing {count} documents',
|
||
stats: {
|
||
documents: 'Document Count',
|
||
faqEntries: 'FAQ Entries',
|
||
chunks: 'Chunk Count'
|
||
},
|
||
uploadProgress: {
|
||
uploadingTitle: 'Uploading folder documents to "{name}"',
|
||
detail: '{completed}/{total} files finished',
|
||
keepPageOpen: 'Please keep this page open while files upload.',
|
||
completedTitle: 'Upload finished for "{name}"',
|
||
completedDetail: 'All {total} files uploaded. Refreshing list to show parsing status...',
|
||
refreshing: 'Refreshing list to show parsing status...',
|
||
errorTip: 'Some files failed to upload. Please check the notifications.',
|
||
unknownKb: 'Knowledge Base {id}',
|
||
}
|
||
},
|
||
knowledgeEditor: {
|
||
titleCreate: 'Create Knowledge Base',
|
||
titleEdit: 'Knowledge Base Settings',
|
||
sidebar: {
|
||
basic: 'Basic Information',
|
||
models: 'Model Configuration',
|
||
vectorStore: 'Vector Store',
|
||
chunking: 'Chunking Settings',
|
||
storage: 'Storage Engine',
|
||
advanced: 'Advanced Settings',
|
||
faq: 'FAQ Settings',
|
||
wiki: 'Wiki Settings',
|
||
graph: 'Knowledge Graph',
|
||
multimodal: 'Image Processing',
|
||
asr: 'Audio',
|
||
datasource: 'Data Sources',
|
||
share: 'Sharing',
|
||
indexing: 'Indexing Strategy',
|
||
},
|
||
errors: {
|
||
vectorStoreBindingInvalid:
|
||
'The selected vector store cannot be used. Choose a different store or use the system default.',
|
||
vectorStoreUnavailable:
|
||
'The selected vector store is currently unavailable. Check its connection configuration in Settings → Vector Stores.',
|
||
},
|
||
basic: {
|
||
title: 'Basic Information',
|
||
description: 'Configure the knowledge base name and description',
|
||
kbId: 'Knowledge Base ID',
|
||
kbIdDesc: 'Use this ID to target the knowledge base in API integrations',
|
||
typeLabel: 'Knowledge Base Type',
|
||
typeDocument: 'Document-based',
|
||
typeFAQ: 'FAQ Q&A',
|
||
typeDescription: 'FAQ suits structured Q&A datasets; document type supports file parsing and chunking; Wiki type auto-builds interlinked knowledge pages via LLM.',
|
||
nameLabel: 'Knowledge Base Name',
|
||
namePlaceholder: 'Enter knowledge base name',
|
||
descriptionLabel: 'Knowledge Base Description',
|
||
descriptionPlaceholder: 'Enter knowledge base description (optional)'
|
||
},
|
||
wiki: {
|
||
title: 'Wiki Settings',
|
||
description: 'Configure Wiki auto-generation preferences',
|
||
synthesisModelLabel: 'Wiki Synthesis Model',
|
||
synthesisModelPlaceholder: 'Select the LLM model for Wiki generation',
|
||
synthesisModelTip: 'Falls back to the summary model if not set',
|
||
languageLabel: 'Wiki Language',
|
||
maxPagesLabel: 'Max Pages Per Ingest',
|
||
maxPagesTip: 'Maximum number of pages to create/update per ingest (0 = no limit)',
|
||
extractionGranularityLabel: 'Extraction Granularity',
|
||
extractionGranularityTip: 'Controls how many Wiki entities/concepts are extracted per document. Finer = tighter index, coarser = more comprehensive',
|
||
granularityFocused: 'Focused',
|
||
granularityStandard: 'Standard',
|
||
granularityExhaustive: 'Exhaustive',
|
||
granularityFocusedHint: 'Extract only the document\u2019s main subjects (e.g. a resume yields the person and their projects). Cleanest, may miss secondary entities.',
|
||
granularityStandardHint: 'Main subjects plus secondary entities/concepts that receive substantial discussion. Skips name-dropped terms. Recommended default.',
|
||
granularityExhaustiveHint: 'Extract every named entity and concept, including passing mentions of stacks/tools. Use when the KB serves as a glossary.',
|
||
},
|
||
indexing: {
|
||
title: 'Indexing Strategy',
|
||
description: 'Configure document processing pipelines. Each indexing method can be enabled or disabled independently.',
|
||
searchTitle: 'RAG Search',
|
||
searchDesc: 'Chunk, vectorize and keyword-index documents for hybrid retrieval',
|
||
wikiTitle: 'Wiki Knowledge Base',
|
||
wikiDesc: 'Auto-generate interlinked wiki pages to build a structured knowledge system',
|
||
graphTitle: 'Knowledge Graph',
|
||
graphDesc: 'Extract entities and relationships to build a knowledge graph for graph-based retrieval',
|
||
atLeastOne: 'At least one indexing strategy must be enabled',
|
||
embeddingRequired: 'RAG search requires an Embedding model',
|
||
wikiModelRequired: 'Wiki requires a synthesis model to be configured',
|
||
lockedTip: 'The indexing strategy cannot be changed once the knowledge base contains content. Please clear the knowledge base first.',
|
||
rebuildConfirmTitle: 'Rebuild Index',
|
||
rebuildConfirmBody: 'Indexing strategy has changed. Re-process {count} existing documents? This may take some time.',
|
||
rebuildSuccess: 'Rebuild task submitted for {count} documents',
|
||
rebuildSkip: 'You can manually trigger a rebuild later from Data Sources',
|
||
},
|
||
wikiBrowser: {
|
||
viewInGraph: 'View in Graph',
|
||
tabDocuments: 'Documents',
|
||
tabWiki: 'Wiki',
|
||
tabGraph: 'Graph',
|
||
tabGraphTip: 'A graph of links between Wiki pages (page-link graph). This is NOT the same as the LLM-extracted entity-relationship Knowledge Graph configured under "KB Settings → Knowledge Graph".',
|
||
searchPlaceholder: 'Search wiki pages...',
|
||
searchNoResults: 'No matching pages found',
|
||
loadMore: 'Load more ({remaining} remaining)',
|
||
filterAll: 'All Types',
|
||
filterSummary: 'Summaries',
|
||
filterEntity: 'Entities',
|
||
filterConcept: 'Concepts',
|
||
filterSynthesis: 'Synthesis',
|
||
filterComparison: 'Comparisons',
|
||
viewReader: 'Reader',
|
||
viewGraph: 'Graph',
|
||
stats: '{pages} pages · {links} links',
|
||
emptyTitle: 'No wiki pages yet',
|
||
emptyDesc: 'Upload documents with Wiki enabled to auto-generate knowledge pages',
|
||
selectPageHint: 'Select a page from the left to view its content',
|
||
version: 'v{ver}',
|
||
aliases: 'Aliases',
|
||
linksTo: 'Links to',
|
||
linkedFrom: 'Linked from',
|
||
sources: 'Source documents',
|
||
recentActivity: 'Recent Activity',
|
||
graphEmpty: 'Loading graph...',
|
||
fitView: 'Fit to View',
|
||
logTitle: 'Activity Log',
|
||
indexTitle: 'Index',
|
||
logFeedTag: 'Event feed',
|
||
logEmpty: 'No log entries yet',
|
||
logLoading: 'Loading…',
|
||
logLoadMore: 'Load more',
|
||
indexOverviewTag: 'Directory',
|
||
indexEmpty: 'No wiki pages yet. Upload documents first.',
|
||
graphNoData: 'No graph data yet. Upload documents first. (This view shows links between Wiki pages, which is different from the entity-relationship graph configured under "KB Settings → Knowledge Graph".)',
|
||
showArrows: 'Show arrows',
|
||
hideArrows: 'Hide arrows',
|
||
expandNeighbors: 'Expand neighbors',
|
||
bloomNeighbors: 'Bloom neighbors',
|
||
growFrontier: 'Grow frontier ({count})',
|
||
growFrontierTitle: 'Expand all {count} dashed-ring nodes in one click',
|
||
cardEgoTitle: 'Current focus',
|
||
cardOverviewTitle: 'KB overview',
|
||
cardOverviewPrimary: '{returned} / {total} nodes',
|
||
cardOverviewHintTruncated: 'Double-click any node to focus on its subgraph',
|
||
cardOverviewHintFull: 'Showing every node in the knowledge base',
|
||
cardRelatedNodes: '{count} related nodes',
|
||
helpButtonTitle: 'Help',
|
||
helpTitle: 'Canvas actions',
|
||
helpClickAction: 'Click',
|
||
helpClickDesc: 'Open node details',
|
||
helpDblClickAction: 'Double-click',
|
||
helpDblClickDesc: 'Focus on this node',
|
||
helpShiftClickAction: 'Shift + click',
|
||
helpShiftClickDesc: 'Bloom neighbors onto canvas',
|
||
helpHoverPlusAction: 'Hover → ⊕',
|
||
helpHoverPlusDesc: 'Same as Shift + click',
|
||
helpDragAction: 'Drag node',
|
||
helpDragDesc: 'Reposition the node',
|
||
helpPanAction: 'Drag empty space',
|
||
helpPanDesc: 'Pan the canvas',
|
||
helpZoomAction: 'Scroll wheel',
|
||
helpZoomDesc: 'Zoom the canvas',
|
||
neighborsProgress: 'Showing {visible} of {total} neighbors ({hidden} not loaded)',
|
||
neighborsAllShown: 'All {total} neighbors are already on the canvas (click Expand to focus on this node’s subgraph)',
|
||
neighborsNone: 'This page has no linked neighbors',
|
||
neighborsCenterUnreachable: 'Showing {visible} of {total} neighbors ({hidden} unreachable: dead links, filtered, or deleted)',
|
||
neighborsOverviewHidden: 'Showing {visible} of {total} neighbors ({hidden} outside the overview — click Expand to pivot here)',
|
||
backToOverview: 'Back to overview',
|
||
healthCheck: 'Health Check',
|
||
queueStatus: '{count} pending tasks in Wiki queue',
|
||
issueTitle: 'This page has {count} pending knowledge conflicts or errors',
|
||
issueFixBtn: 'AI Auto-Fix',
|
||
issueMixed: 'Mixed Info',
|
||
issueConflict: 'Factual Conflict',
|
||
issueOutdated: 'Outdated',
|
||
issueAttention: 'Needs Attention',
|
||
issueReportedBy: 'Reported by {reporter}',
|
||
issueAiLinter: 'AI Linter',
|
||
issueIgnore: 'Ignore False Alarm',
|
||
globalIssuesTitle: 'Global Pending Content Issues',
|
||
globalIssuesCount: '{count} Pending Content Issues',
|
||
globalIssuesEmpty: 'No pending content issues',
|
||
issuePagePrefix: 'Page: ',
|
||
issueGoFix: 'Go to fix',
|
||
fixAssistantTitle: 'Wiki Smart Fix Assistant',
|
||
issueFixSuggestions: 'Content Optimization Suggestions ({count})',
|
||
issueFixSingle: 'Fix',
|
||
fixStartError: 'Failed to start fix assistant',
|
||
issueFixPromptSingle: 'Please fix the issue (ID: {id}) on page [[{slug}]].',
|
||
issueFixPromptAutoStart: 'Please fix the following issues on page [[{slug}]]:',
|
||
issueFixPromptAutoEnd: '',
|
||
},
|
||
buttons: {
|
||
create: 'Create Knowledge Base',
|
||
save: 'Save Configuration'
|
||
},
|
||
share: {
|
||
description: 'Share the knowledge base with spaces so members can access and use it',
|
||
addShare: 'Share',
|
||
unshareConfirm: 'Are you sure you want to unshare from "{name}"?',
|
||
tip1: 'After sharing, space members will access this knowledge base based on the assigned permissions',
|
||
tip2: 'Editable permission allows members to modify content; Read-only permission only allows retrieval and Q&A'
|
||
},
|
||
messages: {
|
||
loadModelsFailed: 'Failed to load model list',
|
||
loadDataFailed: 'Failed to load knowledge base data',
|
||
notFound: 'Knowledge base not found',
|
||
nameRequired: 'Please enter the knowledge base name',
|
||
embeddingRequired: 'Please select an embedding model',
|
||
summaryRequired: 'Please select a summary model',
|
||
multimodalInvalid: 'Multimodal configuration validation failed',
|
||
createSuccess: 'Knowledge base created successfully',
|
||
createFailed: 'Failed to create knowledge base',
|
||
missingId: 'Knowledge base ID is missing',
|
||
buildDataFailed: 'Failed to construct submission data',
|
||
updateSuccess: 'Configuration saved successfully',
|
||
indexModeRequired: 'Please select an indexing mode for FAQ knowledge bases',
|
||
storageChangeConfirm: 'This knowledge base already has files. Changing the storage engine may make old files inaccessible. Do you want to proceed?'
|
||
},
|
||
document: {
|
||
title: 'Document Management',
|
||
subtitle: 'Click or drag-and-drop to upload documents; multiple formats are parsed automatically with intelligent chunking for a searchable knowledge base',
|
||
},
|
||
faq: {
|
||
title: 'FAQ Configuration',
|
||
subtitle: 'Manage FAQ entries with batch import, edit, and search testing',
|
||
description: 'Configure indexing strategy and guidance for FAQ-style knowledge bases',
|
||
indexModeLabel: 'Indexing Mode',
|
||
indexModeDescription: 'Question-only indexing improves precision, question+answer improves recall.',
|
||
questionIndexModeLabel: 'Question Indexing Mode',
|
||
questionIndexModeDescription: 'Combined: Standard and similar questions are indexed together. Separate: Each question is indexed independently for more precise retrieval but requires more storage.',
|
||
entryGuide: 'Each FAQ entry contains a primary question, similar questions, negative examples, and multiple answers. Manage them in the FAQ knowledge base detail view.',
|
||
tagDesc: 'Select category for FAQ entries',
|
||
tagPlaceholder: 'Please select a category',
|
||
modes: {
|
||
questionOnly: 'Questions only',
|
||
questionAnswer: 'Question + answer',
|
||
combined: 'Combined',
|
||
separate: 'Separate'
|
||
},
|
||
standardQuestion: 'Primary Question',
|
||
standardQuestionDesc: 'Set the standard phrasing of the question — this is the most common way users ask it.',
|
||
answers: 'Answers',
|
||
answersDesc: 'Provide complete and accurate answer content. Multiple answers can be added to cover different scenarios.',
|
||
similarQuestions: 'Similar Questions',
|
||
similarQuestionsDesc: 'Add questions with the same meaning but different phrasing to help the system better match user queries.',
|
||
negativeQuestions: 'Negative Examples',
|
||
negativeQuestionsDesc: 'Add questions that should not match this answer, to exclude false positives.',
|
||
categoryLabel: 'FAQ Category',
|
||
categoryButton: 'Switch Category',
|
||
editorCreate: 'Create FAQ Entry',
|
||
editorEdit: 'Edit FAQ Entry',
|
||
addAnswer: 'Add Answer',
|
||
answerPlaceholder: 'Enter answer content, supports multi-line text, press Ctrl+Enter or click button to add',
|
||
similarPlaceholder: 'Enter similar question and click plus icon to add',
|
||
negativePlaceholder: 'Enter negative example and click plus icon to add',
|
||
answerRequired: 'Please provide at least one answer',
|
||
noAnswer: 'No answers',
|
||
noSimilar: 'No similar questions',
|
||
noNegative: 'No negative examples',
|
||
emptyTitle: 'No FAQ entries',
|
||
emptyDesc: 'Click "Create FAQ Entry" above to get started',
|
||
searchPlaceholder: 'Search standard questions...',
|
||
searchTest: 'Search Test',
|
||
addFaq: 'Add FAQ',
|
||
manageFaq: 'FAQ Actions',
|
||
createGroup: 'New',
|
||
searchTestTitle: 'FAQ Search Test',
|
||
queryLabel: 'Query',
|
||
queryPlaceholder: 'Enter a question to search',
|
||
vectorThresholdLabel: 'Vector Similarity Threshold',
|
||
vectorThresholdDesc: 'Range 0-1, default 0.7',
|
||
keywordThresholdLabel: 'Keyword Match Threshold',
|
||
keywordThresholdDesc: 'Range 0-1, default 0.5',
|
||
matchCountLabel: 'Result Count',
|
||
matchCountDesc: 'Range 1-50, default 10',
|
||
searchButton: 'Search',
|
||
searching: 'Searching...',
|
||
searchResults: 'Search Results',
|
||
noResults: 'No matching FAQ entries found',
|
||
score: 'Similarity',
|
||
matchType: 'Match Type',
|
||
matchedQuestion: 'Matched',
|
||
matchTypeEmbedding: 'Vector Match',
|
||
matchTypeKeywords: 'Keyword Match',
|
||
similarityThresholdLabel: 'Similarity Threshold',
|
||
statusEnabled: 'Enabled',
|
||
statusDisabled: 'Disabled',
|
||
statusEnableSuccess: 'FAQ entry enabled',
|
||
statusDisableSuccess: 'FAQ entry disabled',
|
||
statusUpdateFailed: 'Failed to update status',
|
||
recommended: 'Recommend',
|
||
recommendedEnabled: 'Recommendation enabled',
|
||
recommendedDisabled: 'Recommendation disabled',
|
||
recommendedEnableSuccess: 'FAQ entry recommendation enabled',
|
||
recommendedDisableSuccess: 'FAQ entry recommendation disabled',
|
||
recommendedUpdateFailed: 'Failed to update recommendation status',
|
||
batchOperations: 'Batch Operations',
|
||
batchUpdateTag: 'Batch Update Category',
|
||
batchUpdateTagTip: 'Set category for {count} selected entries',
|
||
batchEnable: 'Batch Enable',
|
||
batchDisable: 'Batch Disable',
|
||
batchEnableRecommended: 'Batch Enable Recommendation',
|
||
batchDisableRecommended: 'Batch Disable Recommendation',
|
||
},
|
||
faqImport: {
|
||
title: 'Batch Import FAQ',
|
||
modeLabel: 'Import Mode',
|
||
appendMode: 'Append',
|
||
replaceMode: 'Replace existing entries',
|
||
fileLabel: 'Select File',
|
||
fileTip: 'Supports JSON / CSV / Excel. CSV/Excel headers: Category (required), Question (required), Similar Questions (optional, separate with ##), Negative Questions (optional, separate with ##), Bot Answers (required, separate with ##), Reply All (optional, default FALSE), Disabled (optional, default FALSE), Exclude from Recommendations (optional, default FALSE). Also supports old format: standard_question, answers, similar_questions, negative_questions',
|
||
clickToUpload: 'Click to upload file',
|
||
dragDropTip: 'or drag and drop file here',
|
||
importButton: 'Import FAQ',
|
||
deleteSelected: 'Delete Selected',
|
||
deleteSuccess: 'Selected entries deleted',
|
||
previewCount: '{count} entries parsed',
|
||
previewMore: '{count} more entries not shown',
|
||
importSuccess: 'Import completed',
|
||
parseFailed: 'Failed to parse file',
|
||
invalidJSON: 'Invalid JSON format',
|
||
unsupportedFormat: 'Unsupported file format',
|
||
selectFile: 'Please select a file to import first',
|
||
downloadExample: 'Download Example',
|
||
downloadExampleJSON: 'Download JSON Example',
|
||
downloadExampleCSV: 'Download CSV Example',
|
||
downloadExampleExcel: 'Download Excel Example',
|
||
},
|
||
faqExport: {
|
||
exportButton: 'Export CSV',
|
||
exportSuccess: 'Export successful',
|
||
exportFailed: 'Export failed',
|
||
},
|
||
models: {
|
||
title: 'Model Configuration',
|
||
description: 'Select appropriate AI models for the knowledge base',
|
||
llmLabel: 'LLM Model',
|
||
llmDesc: 'Large language model used for summarization and abstract generation (optional)',
|
||
llmPlaceholder: 'Select an LLM model (optional)',
|
||
embeddingLabel: 'Embedding Model',
|
||
embeddingDesc: 'Embedding model used for text vectorization',
|
||
embeddingPlaceholder: 'Select an embedding model',
|
||
embeddingLocked: 'Knowledge base already has files. Embedding model cannot be modified',
|
||
rerankLabel: 'ReRank Model',
|
||
rerankDesc: 'Model for re-ranking search results (optional)',
|
||
rerankPlaceholder: 'Select a ReRank model (optional)'
|
||
},
|
||
chunking: {
|
||
title: 'Chunking Settings',
|
||
description: 'Controls how uploaded documents are split before embedding. Defaults work for most cases — tune only when retrieval quality is off.',
|
||
sizeLabel: 'Chunk Size',
|
||
sizeDescription: 'Maximum characters per chunk (100–4000). Default 512 ≈ 100–130 English tokens. Smaller for FAQs (200–400), larger for narrative documents (1000–2000).',
|
||
characters: 'characters',
|
||
overlapLabel: 'Chunk Overlap',
|
||
overlapDescription: 'Characters shared between adjacent chunks (0–500). Default 80 ≈ 15% of size — sweet spot per current research. Use 0 for FAQs/structured data, 150–200 for long-form narratives.',
|
||
separatorsLabel: 'Separators',
|
||
separatorsDescription: 'Characters or strings the splitter prefers when cutting. Higher-priority separators are tried first; the default order favors paragraph → sentence → punctuation breaks.',
|
||
separatorsPlaceholder: 'Select or customize separators',
|
||
separators: {
|
||
doubleNewline: 'Double newline (\
|
||
\
|
||
)',
|
||
singleNewline: 'Single newline (\
|
||
)',
|
||
periodCn: 'Chinese period (。)',
|
||
exclamationCn: 'Exclamation mark (!)',
|
||
questionCn: 'Question mark (?)',
|
||
semicolonCn: 'Chinese semicolon (;)',
|
||
semicolonEn: 'Semicolon (;)',
|
||
space: 'Space ( )'
|
||
},
|
||
parentChildLabel: 'Parent-Child Chunking',
|
||
parentChildDescription: 'Two-level chunking: small child chunks are vector-matched (precise hits) but the larger parent chunk is returned to the LLM (richer context). Recommended for long documents (>10 pages); skip for short FAQs to save storage.',
|
||
parentChunkSizeLabel: 'Parent Chunk Size',
|
||
parentChunkSizeDescription: 'Size of the context chunk returned to the LLM (512–8192). Default 4096 ≈ 1000 English tokens, fits comfortably in any modern LLM context window.',
|
||
childChunkSizeLabel: 'Child Chunk Size',
|
||
childChunkSizeDescription: 'Size of the embedded chunk used for vector match (64–2048). Default 384 ≈ 80 tokens — sweet spot for sentence-transformer / BGE-style embedders.',
|
||
strategyLabel: 'Chunking Strategy',
|
||
strategyDescription: 'Choose how documents are split into chunks. The Automatic mode profiles each document and picks the best strategy.',
|
||
strategyPlaceholder: 'Select a chunking strategy (splits by length if left empty)',
|
||
strategies: {
|
||
auto: {
|
||
label: 'Automatic',
|
||
tooltip: 'A document profiler picks between heading-aware, structure-aware and length-based splitting per upload.'
|
||
},
|
||
heading: {
|
||
label: 'Heading-aware',
|
||
tooltip: 'Splits at Markdown heading boundaries (#, ##, ###); each chunk carries its heading path. Best for well-structured Markdown.'
|
||
},
|
||
heuristic: {
|
||
label: 'Structure-aware',
|
||
tooltip: 'Splits on detected structural cues: page-breaks, numbered sections, multilingual chapter markers (DE/EN/ZH), all-caps titles. Ideal for PDFs without Markdown headings.'
|
||
},
|
||
legacy: {
|
||
label: 'Length-based',
|
||
tooltip: 'Ignores structure; splits recursively by character count and separators — the original behavior. Use when the structure-aware strategies misbehave on your content.'
|
||
}
|
||
},
|
||
overlapWarning: 'Overlap is large compared to chunk size — chunks will share most of their content.',
|
||
advancedLabel: 'Advanced options',
|
||
tokenLimitLabel: 'Token limit per chunk',
|
||
tokenLimitDescription: 'Hard token cap per chunk (0–8192). 0 = off (chunk size in characters only). Activate when your embedding model has a small token limit: 200 for MiniLM (256 tok), 400 for BGE/Cohere (512 tok). Modern embedders (OpenAI, Voyage, Jina-v3) accept >2000 tokens — leave at 0.',
|
||
languagesLabel: 'Language hints',
|
||
languagesDescription: 'Restricts heuristic patterns to the chosen languages (DE/EN/ZH). Empty = auto-detect from sample. Set explicitly for homogeneous corpora to avoid false-positive matches across languages.',
|
||
languagesPlaceholder: 'Auto-detect',
|
||
languageOptions: {
|
||
de: 'German',
|
||
en: 'English',
|
||
zh: 'Chinese'
|
||
},
|
||
debug: {
|
||
toggle: 'Preview chunking',
|
||
toggleHint: 'Run the chunker against sample text without re-uploading',
|
||
sampleLabel: 'Sample text',
|
||
samplePlaceholder: 'Paste a Markdown / plain-text snippet to see how the current configuration would chunk it…',
|
||
presetLabel: 'Load sample:',
|
||
samples: {
|
||
markdown: 'Markdown doc',
|
||
faq: 'FAQ list',
|
||
chapter: 'PDF chapters',
|
||
plain: 'Plain prose'
|
||
},
|
||
runButton: 'Run preview',
|
||
loading: 'Running chunker on sample…',
|
||
errorPrefix: 'Preview failed',
|
||
selectedTier: 'Selected strategy',
|
||
rejected: 'Rejected tiers',
|
||
contextHeader: 'Context header',
|
||
fallbackWarning: 'Strategy chain fell through — content does not split intelligently with current settings',
|
||
profile: {
|
||
lines: 'lines',
|
||
chars: 'chars',
|
||
headings: 'Markdown headings',
|
||
pageBreaks: 'page breaks',
|
||
chapterMarkers: 'chapter markers',
|
||
languages: 'languages'
|
||
},
|
||
stats: {
|
||
chunks: 'chunks',
|
||
truncated: 'truncated; total {total}'
|
||
}
|
||
}
|
||
},
|
||
multimodal: {
|
||
title: 'Image Processing Configuration',
|
||
description: 'Configure image content understanding for parsing and retrieving non-text content like images',
|
||
},
|
||
asr: {
|
||
title: 'Audio Speech Recognition',
|
||
description:
|
||
'Configure ASR (speech-to-text). When enabled, you can upload audio files and transcribe them to text (e.g. mp3, wav, m4a, flac, ogg). Video upload is not supported.',
|
||
label: 'Enable audio speech recognition',
|
||
desc: 'When enabled, audio can be uploaded to the knowledge base; speech is transcribed to text for parsing and retrieval.',
|
||
modelLabel: 'ASR Model',
|
||
modelDescription: 'Speech-to-text model for audio (e.g. OpenAI Whisper)',
|
||
modelPlaceholder: 'Select an ASR model',
|
||
},
|
||
advanced: {
|
||
title: 'Advanced Settings',
|
||
description: 'Configure question generation and other advanced features',
|
||
questionGeneration: {
|
||
label: 'AI Question Generation',
|
||
description: 'Generate related questions for each chunk using LLM during document parsing to improve retrieval recall. Enabling this will increase document parsing time.',
|
||
countLabel: 'Question Count',
|
||
countDescription: 'Number of questions to generate per document chunk (1-10)',
|
||
},
|
||
multimodal: {
|
||
label: 'Multimodal Feature',
|
||
description: 'Enable understanding of multimodal content such as images',
|
||
vllmLabel: 'VLLM Vision Model',
|
||
vllmDescription: 'Vision-language model required for multimodal understanding',
|
||
vllmPlaceholder: 'Select a VLLM model (required)',
|
||
storageTitle: 'Storage Configuration',
|
||
storageTypeLabel: 'Storage Type',
|
||
storageTypeDescription: 'Choose the storage solution for multimodal files (MinIO or Tencent Cloud COS)',
|
||
storageTypeOptions: {
|
||
minio: 'MinIO',
|
||
cos: 'Tencent Cloud COS'
|
||
},
|
||
minioDisabledWarning: 'MinIO is not enabled. Automatically switched to Tencent Cloud COS. To use MinIO, please enable it in system configuration first.',
|
||
minio: {
|
||
bucketLabel: 'Bucket Name',
|
||
bucketDescription: 'Name of the MinIO bucket (required)',
|
||
bucketPlaceholder: 'Select or enter bucket name',
|
||
bucketHint: 'Select an existing bucket with public read access, or enter a new name to create automatically',
|
||
policyLabels: {
|
||
public: 'Public Read',
|
||
private: 'Private',
|
||
custom: 'Custom'
|
||
},
|
||
useSslLabel: 'Use SSL',
|
||
useSslDescription: 'Whether to use SSL connection',
|
||
pathPrefixLabel: 'Path Prefix',
|
||
pathPrefixDescription: 'Optional prefix for stored file paths',
|
||
pathPrefixPlaceholder: 'Enter path prefix'
|
||
},
|
||
cos: {
|
||
secretIdLabel: 'SecretId',
|
||
secretIdDescription: 'Tencent Cloud API secret ID (required)',
|
||
secretIdPlaceholder: 'Enter SecretId (required)',
|
||
secretKeyLabel: 'SecretKey',
|
||
secretKeyDescription: 'Tencent Cloud API secret key (required)',
|
||
secretKeyPlaceholder: 'Enter SecretKey (required)',
|
||
regionLabel: 'Region',
|
||
regionDescription: 'Region where the COS bucket is located (required)',
|
||
regionPlaceholder: 'e.g. ap-guangzhou (required)',
|
||
bucketLabel: 'Bucket Name',
|
||
bucketDescription: 'COS bucket name (required)',
|
||
bucketPlaceholder: 'Enter bucket name (required)',
|
||
appIdLabel: 'AppId',
|
||
appIdDescription: 'Tencent Cloud application ID (required)',
|
||
appIdPlaceholder: 'Enter AppId (required)',
|
||
pathPrefixLabel: 'Path Prefix',
|
||
pathPrefixDescription: 'Optional prefix for stored file paths',
|
||
pathPrefixPlaceholder: 'Enter path prefix'
|
||
}
|
||
}
|
||
}
|
||
},
|
||
chat: {
|
||
title: 'Chat',
|
||
newChat: 'New Chat',
|
||
suggestedQuestions: 'You can ask me',
|
||
suggestedQuestionsLoading: 'Loading suggestions...',
|
||
inputPlaceholder: 'Enter your message...',
|
||
send: 'Send',
|
||
thinking: 'Thinking...',
|
||
regenerate: 'Regenerate',
|
||
copy: 'Copy',
|
||
delete: 'Delete',
|
||
reference: 'Reference',
|
||
noMessages: 'No messages',
|
||
// Additional translations for chat components
|
||
waitingForAnswer: 'Waiting for answer...',
|
||
cannotAnswer: 'Sorry, I cannot answer this question.',
|
||
summarizingAnswer: 'Summarizing answer...',
|
||
loading: 'Loading...',
|
||
referencedContent: '{count} related materials used',
|
||
deepThinking: 'Deep thinking completed',
|
||
knowledgeBaseQandA: 'Knowledge Base Q&A',
|
||
askKnowledgeBase: 'Ask the knowledge base',
|
||
sourcesCount: '{count} sources',
|
||
pleaseEnterContent: 'Please enter content!',
|
||
pleaseUploadKnowledgeBase: 'Please upload knowledge base first!',
|
||
replyingPleaseWait: 'Replying, please try again later!',
|
||
createSessionFailed: 'Failed to create session',
|
||
createSessionError: 'Session creation error',
|
||
unableToGetKnowledgeBaseId: 'Unable to get knowledge base ID',
|
||
summaryInProgress: 'Summarizing answer…',
|
||
thinkingAlt: 'Thinking in progress',
|
||
deepThoughtCompleted: 'Deep thinking completed',
|
||
deepThoughtAlt: 'Deep thinking finished',
|
||
referencesTitle: 'Referenced {count} related item(s)',
|
||
referencesDocCount: 'Referenced {count} document(s)',
|
||
referencesDocAndWebCount: 'Referenced {docCount} document(s) and {webCount} web page(s)',
|
||
referenceChunkCount: '{count} chunk(s)',
|
||
fallbackHint: 'No relevant content found in knowledge base. Above is a direct response from the model.',
|
||
channelWeb: 'Web',
|
||
channelApi: 'API',
|
||
channelIm: 'IM',
|
||
chunkLabel: 'Chunk {index}:',
|
||
navigateToDocument: 'View document details',
|
||
referenceIconAlt: 'Reference materials icon',
|
||
chunkIdLabel: 'Chunk ID:',
|
||
documentIdLabel: 'Document ID:',
|
||
noPlanSteps: 'No detailed steps provided',
|
||
chunkIndexLabel: 'Chunk #{index}',
|
||
chunkPositionLabel: '(Position: {position})',
|
||
noRelatedChunks: 'No related chunks found',
|
||
noSearchResults: 'No search results found',
|
||
relevanceHigh: 'High relevance',
|
||
relevanceMedium: 'Medium relevance',
|
||
relevanceLow: 'Low relevance',
|
||
relevanceWeak: 'Weak relevance',
|
||
webSearchNoResults: 'No web search results found',
|
||
otherSource: 'Other sources',
|
||
webGroupIntro: 'The following {count} items are from',
|
||
graphConfigTitle: 'Graph Configuration',
|
||
entityTypesLabel: 'Entity types:',
|
||
relationTypesLabel: 'Relation types:',
|
||
graphResultsHeader: '{count} related results found',
|
||
graphNoResults: 'No related graph information found',
|
||
unknownLink: 'Unknown link',
|
||
contentLengthLabel: 'Length {value}',
|
||
notProvided: 'Not provided',
|
||
promptLabel: 'Prompt',
|
||
errorMessageLabel: 'Error message',
|
||
summaryLabel: 'Summary',
|
||
rawTextLabel: 'Raw text',
|
||
collapseRaw: 'Collapse original',
|
||
expandRaw: 'Expand original',
|
||
noWebContent: 'No web content fetched',
|
||
lengthChars: '{value} characters',
|
||
lengthThousands: '{value}k characters',
|
||
lengthTenThousands: '{value} ten-thousand characters',
|
||
sqlQueryExecuted: 'Executed SQL query:',
|
||
sqlResultsLabel: 'Results:',
|
||
rowsLabel: 'rows',
|
||
columnsLabel: 'columns',
|
||
noDatabaseRecords: 'No matching records found',
|
||
nullValuePlaceholder: '<NULL>',
|
||
documentTitleLabel: 'Document title:',
|
||
chunkCountLabel: 'Chunk count:',
|
||
chunkCountValue: '{count} chunks',
|
||
documentDescriptionLabel: 'Description:',
|
||
documentStatusLabel: 'Status:',
|
||
documentSourceLabel: 'Source:',
|
||
documentFileLabel: 'File:',
|
||
documentMetadataLabel: 'Metadata',
|
||
documentInfoSummaryLabel: 'Document info',
|
||
documentInfoCount: '{count} of {requested} documents retrieved',
|
||
documentInfoErrors: 'Errors',
|
||
documentInfoEmpty: 'No document information available',
|
||
statusDescription: 'Status notes',
|
||
statusIndexed: 'Document is indexed and searchable',
|
||
statusSearchable: 'Search tools can locate document content',
|
||
statusChunkDetailAvailable: 'Use get_chunk_detail to view chunk details',
|
||
positionLabel: 'Position:',
|
||
chunkPositionValue: 'Chunk #{index}',
|
||
contentLengthLabelSimple: 'Content length:',
|
||
fullContentLabel: 'Full content',
|
||
copyContent: 'Copy content',
|
||
knowledgeBaseCount: '{count} knowledge bases',
|
||
noKnowledgeBases: 'No knowledge bases available',
|
||
enterDescription: 'Enter description',
|
||
rawOutputLabel: 'Raw output',
|
||
wikiWritePageTitle: 'Wiki Page Write',
|
||
wikiReplaceTextTitle: 'Wiki Text Replace',
|
||
wikiRenamePageTitle: 'Wiki Page Rename',
|
||
wikiDeletePageTitle: 'Wiki Page Delete',
|
||
wikiActionCreated: 'Created',
|
||
wikiActionUpdated: 'Updated',
|
||
wikiActionRenamed: 'Renamed',
|
||
wikiActionDeleted: 'Deleted',
|
||
wikiFieldSlug: 'Slug',
|
||
wikiFieldTitle: 'Title',
|
||
wikiFieldPageType: 'Type',
|
||
wikiFieldSummary: 'Summary',
|
||
wikiFieldOldText: 'Old text',
|
||
wikiFieldNewText: 'New text',
|
||
wikiFieldOldSlug: 'Old slug',
|
||
wikiFieldNewSlug: 'New slug',
|
||
wikiFieldAffectedPages: 'Affected pages',
|
||
wikiAffectedCount: '{count} page link(s) updated',
|
||
selectKnowledgeBaseWarning: 'Please select at least one knowledge base',
|
||
processError: 'Processing error',
|
||
sessionExcerpt: 'Session Excerpt',
|
||
noAnswerContent: '(No answer content)',
|
||
noMatchFound: 'No matching content found',
|
||
deleteSessionFailed: 'Delete failed, please try again later!',
|
||
imageTooMany: 'Maximum 5 images allowed',
|
||
imageTypeSizeError: 'Only JPG/PNG/GIF/WEBP under 10MB supported',
|
||
imageUploadTooltip: 'Upload image (paste/drop supported)',
|
||
attachmentUploadTooltip: 'Upload attachment (documents, audio, etc.)',
|
||
attachmentWithCount: '{count} attachment(s) uploaded',
|
||
attachmentTooMany: 'Maximum {max} attachments allowed',
|
||
attachmentTooLarge: 'File {name} exceeds {max}MB limit',
|
||
attachmentTypeNotSupported: 'Unsupported file type: {name}',
|
||
},
|
||
tenant: {
|
||
title: 'Tenant Information',
|
||
currentTenant: 'Current Tenant',
|
||
switchTenant: 'Switch workspace',
|
||
switcher: {
|
||
menuLabel: 'Switch workspace',
|
||
currentBadge: 'Current',
|
||
homeBadge: 'Home',
|
||
homeTooltip: 'Your home workspace',
|
||
empty: 'You only belong to one workspace',
|
||
},
|
||
currentChip: {
|
||
home: 'Home tenant',
|
||
},
|
||
sectionDescription: 'View detailed configuration for the tenant',
|
||
apiDocument: 'API Document',
|
||
name: 'Tenant Name',
|
||
id: 'Tenant ID',
|
||
createdAt: 'Created At',
|
||
updatedAt: 'Updated At',
|
||
status: 'Status',
|
||
active: 'Active',
|
||
inactive: 'Inactive',
|
||
// Additional translations for TenantInfo.vue
|
||
systemInfo: 'System Information',
|
||
viewSystemInfo: 'View system version and user account configuration information',
|
||
version: 'Version',
|
||
buildTime: 'Build Time',
|
||
goVersion: 'Go Version',
|
||
userInfo: 'User Information',
|
||
userId: 'User ID',
|
||
username: 'Username',
|
||
email: 'Email',
|
||
tenantInfo: 'Tenant Information',
|
||
tenantId: 'Tenant ID',
|
||
tenantName: 'Tenant Name',
|
||
description: 'Description',
|
||
business: 'Business',
|
||
noDescription: 'No description',
|
||
noBusiness: 'None',
|
||
statusActive: 'Active',
|
||
statusInactive: 'Not activated',
|
||
statusSuspended: 'Suspended',
|
||
statusUnknown: 'Unknown',
|
||
apiKey: 'API Key',
|
||
keepApiKeySafe: 'Please keep your API Key safe, do not disclose it in public places or code repositories',
|
||
storageInfo: 'Storage Information',
|
||
storageQuota: 'Storage Quota',
|
||
used: 'Used',
|
||
usage: 'Usage',
|
||
apiDevDocs: 'API Developer Documentation',
|
||
useApiKey: 'Use your API Key to start development, view complete API documentation and code examples.',
|
||
viewApiDoc: 'View API Documentation',
|
||
loadingAccountInfo: 'Loading account information...',
|
||
loadingInfo: 'Loading information...',
|
||
loadFailed: 'Load failed',
|
||
retry: 'Retry',
|
||
apiKeyCopied: 'API Key copied to clipboard',
|
||
unknown: 'Unknown',
|
||
formatError: 'Format error',
|
||
searchPlaceholder: 'Search by name or enter tenant ID...',
|
||
searchHint: 'Search by name or enter tenant ID directly',
|
||
noMatch: 'No matching tenants found',
|
||
switchSuccessTitle: 'Workspace switched',
|
||
switchSuccessContent: 'You are now in {name}',
|
||
switchSuccessContentWithRole: 'You are now in {name} · as {role}',
|
||
loadTenantsFailed: 'Failed to load tenant list',
|
||
loading: 'Loading...',
|
||
loadMore: 'Load more',
|
||
create: {
|
||
action: 'Create new workspace',
|
||
dialogTitle: 'Create new workspace',
|
||
dialogSubtitle: 'A workspace has its own knowledge bases and members. You will become the owner of the new workspace.',
|
||
nameLabel: 'Workspace name',
|
||
namePlaceholder: 'e.g. My new project',
|
||
nameRequired: 'Please enter a workspace name',
|
||
descriptionLabel: 'Description (optional)',
|
||
descriptionPlaceholder: 'Briefly describe what this workspace is for',
|
||
submit: 'Create',
|
||
cancel: 'Cancel',
|
||
success: 'Workspace created successfully',
|
||
failed: 'Failed to create workspace',
|
||
},
|
||
details: {
|
||
idLabel: 'Tenant ID',
|
||
idDescription: 'Unique identifier of your tenant',
|
||
nameLabel: 'Tenant Name',
|
||
nameDescription: 'Name of your tenant',
|
||
descriptionLabel: 'Tenant Description',
|
||
descriptionDescription: 'Detailed description of the tenant',
|
||
businessLabel: 'Tenant Business',
|
||
businessDescription: 'Business domain that the tenant belongs to',
|
||
statusLabel: 'Tenant Status',
|
||
statusDescription: 'Current operational status of the tenant',
|
||
createdAtLabel: 'Tenant Creation Time',
|
||
createdAtDescription: 'Time when the tenant was created',
|
||
editName: 'Edit name',
|
||
editNamePlaceholder: 'Enter the new tenant name',
|
||
editNameConfirm: 'Save',
|
||
editNameCancel: 'Cancel',
|
||
editNameRequired: 'Tenant name cannot be empty',
|
||
editNameSuccess: 'Tenant name updated',
|
||
editNameFailed: 'Failed to update tenant name',
|
||
editDescription: 'Edit description',
|
||
editDescriptionPlaceholder: 'Enter the new tenant description',
|
||
editDescriptionSuccess: 'Tenant description updated',
|
||
editDescriptionFailed: 'Failed to update tenant description',
|
||
descriptionEmptyPlaceholder: 'Not set'
|
||
},
|
||
storage: {
|
||
quotaLabel: 'Storage Quota',
|
||
quotaDescription: 'Total storage capacity allocated to the tenant',
|
||
usedLabel: 'Used Storage',
|
||
usedDescription: 'Storage space that has been used',
|
||
usageLabel: 'Storage Usage',
|
||
usageDescription: 'Percentage of storage capacity used'
|
||
},
|
||
leaveDangerZone: {
|
||
title: 'Leave this workspace',
|
||
desc: 'Ends your membership in this workspace. You will lose access to its knowledge bases and agents. You can be invited again later.',
|
||
button: 'Leave workspace',
|
||
},
|
||
messages: {
|
||
fetchFailed: 'Failed to fetch tenant information',
|
||
networkError: 'Network error, please try again later'
|
||
},
|
||
api: {
|
||
title: 'API Information',
|
||
description: 'View and manage your API key',
|
||
keyLabel: 'API Key',
|
||
keyDescription: 'Secret used for API requests. Keep it safe.',
|
||
urlLabel: 'API URL',
|
||
urlDescription: 'Base path for REST API requests; append the specific endpoint when calling.',
|
||
copyUrlTitle: 'Copy API URL',
|
||
urlCopySuccess: 'API URL copied to clipboard',
|
||
copyTitle: 'Copy API Key',
|
||
resetTitle: 'Reset API Key',
|
||
resetConfirmTitle: 'Reset API Key?',
|
||
resetConfirmBody: 'After reset, the old API Key is revoked immediately. Every app, SDK, and script using the old key must switch to the new key to keep working. This action cannot be undone.',
|
||
resetConfirmOk: 'Reset',
|
||
resetConfirmCancel: 'Cancel',
|
||
resetSuccess: 'API Key reset; the new key is shown in the field above',
|
||
resetFailed: 'Failed to reset API Key',
|
||
docLabel: 'API Documentation',
|
||
docDescription: 'View complete API documentation and examples,',
|
||
openDoc: 'Open documentation',
|
||
userSectionTitle: 'User Information',
|
||
userIdLabel: 'User ID',
|
||
userIdDescription: 'Your unique user identifier',
|
||
usernameLabel: 'Username',
|
||
usernameDescription: 'Your login username',
|
||
emailLabel: 'Email',
|
||
emailDescription: 'Your registered email address',
|
||
createdAtLabel: 'Registration Time',
|
||
createdAtDescription: 'Time when the account was created',
|
||
noKey: 'No API Key available',
|
||
copySuccess: 'API Key copied to clipboard',
|
||
copyFailed: 'Copy failed, please copy manually',
|
||
desktopPortLabel: 'Local API port (desktop)',
|
||
desktopPortDescription:
|
||
'Use a fixed port (e.g. 37841) so tools like the Chrome extension can keep the same API URL. 0 means a random port each launch. Restart the app after saving.',
|
||
desktopPortSave: 'Save',
|
||
desktopPortSaved: 'Saved. Restart the app for it to take effect.',
|
||
desktopPortSaveFailed: 'Save failed',
|
||
desktopPortInvalid: 'Enter a port between 0 and 65535',
|
||
desktopBindPublicLabel: 'Allow LAN access to the API',
|
||
desktopBindPublicDescription:
|
||
'When enabled, the embedded server listens on 0.0.0.0 so other devices on your LAN can reach the API via the address below. This increases exposure—use host firewalls and routing rules as needed. Restart the app after changing this.',
|
||
desktopBindPublicSaved: 'Saved. Restart the app for it to take effect.',
|
||
desktopBindPublicSaveFailed: 'Save failed',
|
||
lanUrlLabel: 'LAN API base URL',
|
||
lanUrlDescription:
|
||
'Shown after “Allow LAN access” is on and the app has restarted. If the IP is wrong, replace the host with your machine’s IPv4 from system network settings.',
|
||
lanUrlCopyTitle: 'Copy LAN API URL',
|
||
lanUrlCopySuccess: 'LAN API URL copied',
|
||
lanUrlUnavailable:
|
||
'The API is listening on all interfaces, but no LAN IPv4 could be detected automatically. Find your IPv4 in network settings and build http://YOUR_IP:PORT/api/v1 manually.',
|
||
}
|
||
},
|
||
system: {
|
||
title: 'System Information',
|
||
sectionDescription: 'View system version information and user account configuration',
|
||
loadingInfo: 'Loading information...',
|
||
retry: 'Retry',
|
||
versionLabel: 'App Version',
|
||
versionDescription: 'Version of the application service (weknora-app)',
|
||
frontendVersionLabel: 'UI Version',
|
||
frontendVersionDescription: 'Build version of the UI (weknora-ui)',
|
||
versionMismatch: 'Mismatch with app version',
|
||
buildTimeLabel: 'Build Time',
|
||
buildTimeDescription: 'Time when the system was built',
|
||
goVersionLabel: 'Go Version',
|
||
goVersionDescription: 'Go language version used by the backend',
|
||
dbVersionLabel: 'Database Version',
|
||
dbVersionDescription: 'Current database migration version',
|
||
dbMigrationFailedTag: 'Migration failed',
|
||
dbMigrationFailedTitle: 'Database migration failed',
|
||
dbMigrationFailedDesc: 'The startup database migration did not complete successfully. Some tables or indexes may be missing, which can break Wiki ingest, the knowledge graph, and other features. Check the troubleshooting guide below first; if the issue persists, report it via the link.',
|
||
dbMigrationViewDocs: 'View troubleshooting guide',
|
||
dbMigrationReportIssue: "Can't fix it? Report an issue",
|
||
keywordIndexEngineLabel: 'Keyword Index Engine',
|
||
keywordIndexEngineDescription: 'Currently used keyword index engine',
|
||
vectorStoreEngineLabel: 'Vector Store Engine',
|
||
vectorStoreEngineDescription: 'Currently used vector store engine',
|
||
graphDatabaseEngineLabel: 'Graph Database Engine',
|
||
graphDatabaseEngineDescription: 'Currently used graph database engine',
|
||
unknown: 'Unknown',
|
||
messages: {
|
||
fetchFailed: 'Failed to fetch system information',
|
||
networkError: 'Network error, please try again later'
|
||
},
|
||
globalSettings: {
|
||
title: 'System Settings',
|
||
description: 'Platform-wide runtime configuration. Saves take effect immediately for every tenant. Visible and editable by system administrators only.',
|
||
loading: 'Loading...',
|
||
empty: 'No configurable system settings available',
|
||
badgeRequiresRestart: 'Restart required',
|
||
badgeSecret: 'Secret',
|
||
badgeOverride: 'Overridden',
|
||
badgeOverrideTooltip: 'This value has been saved to the database by an administrator, overriding the environment variable and built-in default.',
|
||
modifiedAt: 'Last modified: {value}',
|
||
tagInputPlaceholder: 'Press Enter to add an entry, e.g. example.com / *.foo.com / 10.0.0.0/8',
|
||
priorityHint: {
|
||
title: 'About priority',
|
||
tier1: 'Items saved on this page (marked "Overridden") always win — the environment variable is ignored for them.',
|
||
tier2: 'Items not saved here fall back to the environment variable, or to the built-in default if no env var is set.',
|
||
tier3: 'To put an item back under environment-variable control, click the "Reset" button on its row.',
|
||
},
|
||
keyLabels: {
|
||
auth: {
|
||
registration_mode: 'Self-service registration mode',
|
||
},
|
||
ssrf: {
|
||
whitelist: 'SSRF protection allowlist',
|
||
},
|
||
tenant: {
|
||
max_owned_per_user: 'Max tenants owned per user',
|
||
default_storage_quota_gb: 'Default storage quota for new tenants (GB)',
|
||
},
|
||
asynq: {
|
||
concurrency: 'Async task worker concurrency',
|
||
},
|
||
},
|
||
enumLabels: {
|
||
auth: {
|
||
registration_mode: {
|
||
self_serve: 'Self-service (anyone can register)',
|
||
invite_only: 'Invite only (public registration disabled)',
|
||
},
|
||
},
|
||
},
|
||
confirm: {
|
||
header: 'Confirm high-risk action',
|
||
confirmBtn: 'Confirm save',
|
||
cancelBtn: 'Cancel',
|
||
emptyValue: '(empty)',
|
||
defaultBody: 'About to change "{label}" to: {value}',
|
||
bodyAuthRegistrationMode: 'About to change "{label}" to: {value}\n\nIf switched to self_serve, anyone on the public internet can register an account — please confirm this is intended.',
|
||
},
|
||
listConfirm: {
|
||
ssrf: {
|
||
whitelist: {
|
||
add: {
|
||
header: 'Add SSRF allowlist entry',
|
||
body: 'Add {entry} to the SSRF allowlist? Hosts / IPs / CIDRs that match this entry will bypass SSRF protection and may let agents reach internal services. Only add entries you fully trust.',
|
||
confirmBtn: 'Add',
|
||
},
|
||
remove: {
|
||
header: 'Remove SSRF allowlist entry',
|
||
body: 'Remove {entry} from the SSRF allowlist? After removal this entry will be blocked by SSRF protection again.',
|
||
confirmBtn: 'Remove',
|
||
},
|
||
},
|
||
},
|
||
},
|
||
messages: {
|
||
loadFailed: 'Failed to load system settings',
|
||
saveSuccess: 'Saved',
|
||
saveFailed: 'Save failed',
|
||
},
|
||
reset: {
|
||
label: 'Reset',
|
||
tooltip: 'Clear the UI override and fall back to the environment variable or the built-in default',
|
||
confirmBtn: 'Confirm reset',
|
||
confirmBody: 'Reset "{label}"? This deletes the database override and falls back to the environment variable or the built-in default.',
|
||
success: 'Reset to default',
|
||
failed: 'Reset failed',
|
||
},
|
||
admins: {
|
||
label: 'System administrators',
|
||
description: 'Users with platform-level privileges. Type an email and press Enter to promote a user; click × on a tag to revoke. You (yourself) are an administrator and are not shown in the list — you cannot revoke your own access.',
|
||
placeholder: 'Type a user email and press Enter',
|
||
loadFailed: 'Failed to load system administrators',
|
||
saveSuccess: 'System administrators updated',
|
||
saveFailed: 'Failed to update system administrators',
|
||
confirm: {
|
||
promote: {
|
||
header: 'Promote to system administrator',
|
||
body: 'Promote {email} to system administrator? This user will gain platform-level privileges: access to every tenant, system settings, and the admin roster itself.',
|
||
confirmBtn: 'Promote',
|
||
},
|
||
revoke: {
|
||
header: 'Revoke system administrator',
|
||
body: 'Revoke system-administrator privileges from {email}? They will lose access to all system-level features.',
|
||
confirmBtn: 'Revoke',
|
||
},
|
||
},
|
||
},
|
||
bulkApply: {
|
||
label: 'Apply to all existing tenants',
|
||
tooltip: 'Saving the value only affects new tenants by default; click here to also overwrite every existing tenant.',
|
||
confirmBtn: 'Confirm apply',
|
||
confirmBody: 'Overwrite the storage quota of every existing tenant to {value} GB. Tenants whose quota was tuned manually by operations will also be overwritten. Continue?',
|
||
success: 'Updated storage quota for {count} tenants to {gb} GB',
|
||
failed: 'Failed to apply to all tenants',
|
||
},
|
||
audit: {
|
||
tabLabel: 'Audit log',
|
||
description:
|
||
'Platform-level events: system setting changes, system admin grants/revocations, bulk quota syncs. Newest first.',
|
||
refresh: 'Refresh',
|
||
retry: 'Retry',
|
||
loading: 'Loading…',
|
||
end: 'End of feed.',
|
||
empty: 'No platform-level audit events yet.',
|
||
forbidden: 'Not allowed to view the platform audit log.',
|
||
systemActor: 'System',
|
||
errors: {
|
||
generic: 'Failed to load audit log',
|
||
},
|
||
actorRole: {
|
||
system_admin: 'System Admin',
|
||
},
|
||
columns: {
|
||
time: 'Time',
|
||
actor: 'Actor',
|
||
action: 'Event',
|
||
target: 'Target',
|
||
path: 'Request',
|
||
outcome: 'Result',
|
||
},
|
||
action: {
|
||
'system.setting_changed': 'System setting changed',
|
||
'system.admin_promoted': 'System admin granted',
|
||
'system.admin_revoked': 'System admin revoked',
|
||
},
|
||
outcome: {
|
||
success: 'Success',
|
||
denied: 'Denied',
|
||
},
|
||
target: {
|
||
bulkQuota: 'Bulk sync: default storage quota',
|
||
bulkQuotaDiff: 'Applied to {count} tenants ({gb} GB)',
|
||
promoteIdempotent: 'Target was already a system admin (idempotent)',
|
||
revokeNoop: 'Target was not a system admin (idempotent)',
|
||
requiredRole: 'Required role: {role}',
|
||
valueNull: '(unset)',
|
||
},
|
||
expanded: {
|
||
actorId: 'Actor ID',
|
||
targetUserId: 'Target user ID',
|
||
targetType: 'Target type',
|
||
targetId: 'Target ID',
|
||
details: 'Raw details',
|
||
},
|
||
},
|
||
}
|
||
},
|
||
mcp: {
|
||
testResult: {
|
||
title: 'Test Result: {name}',
|
||
connectionSuccess: 'Connection successful',
|
||
connectionFailed: 'Connection failed',
|
||
toolsTitle: 'Available tools',
|
||
resourcesTitle: 'Available resources',
|
||
descriptionLabel: 'Description',
|
||
schemaLabel: 'Parameter schema',
|
||
emptyDescription: 'This service did not provide tools or resources',
|
||
requireApproval: 'Require human approval',
|
||
requireApprovalTip:
|
||
'When enabled, the agent pauses before calling this tool until you approve — use for DB writes, deletes, etc.',
|
||
approvalSaveFailed: 'Failed to save approval setting'
|
||
}
|
||
},
|
||
error: {
|
||
network: 'Network error',
|
||
server: 'Server error',
|
||
notFound: 'Not found',
|
||
unauthorized: 'Unauthorized',
|
||
forbidden: 'Access forbidden',
|
||
unknown: 'Unknown error',
|
||
tryAgain: 'Please try again',
|
||
networkError: 'Network error, please check your connection',
|
||
invalidCredentials: 'Invalid username or password',
|
||
tokenRefreshFailed: 'Token refresh failed',
|
||
pleaseRelogin: 'Please log in again',
|
||
fileSizeExceeded: 'File size cannot exceed {size}MB!',
|
||
unsupportedFileType: 'Unsupported file type!',
|
||
invalidFileType: 'Invalid file type!',
|
||
invalidImageLink: 'Invalid image link',
|
||
missingKbId: 'Missing knowledge base ID',
|
||
tokenNotFound: 'Login token not found, please log in again',
|
||
streamFailed: 'Stream connection failed',
|
||
auth: {
|
||
loginFailed: 'Login failed',
|
||
registerFailed: 'Registration failed',
|
||
getUserFailed: 'Failed to get user info',
|
||
getTenantFailed: 'Failed to get tenant info',
|
||
updatePreferencesFailed: 'Failed to update preferences',
|
||
refreshTokenFailed: 'Token refresh failed',
|
||
logoutFailed: 'Logout failed',
|
||
validateTokenFailed: 'Token validation failed',
|
||
},
|
||
model: {
|
||
createFailed: 'Failed to create model',
|
||
getFailed: 'Failed to get model',
|
||
updateFailed: 'Failed to update model',
|
||
deleteFailed: 'Failed to delete model',
|
||
},
|
||
tenant: {
|
||
listFailed: 'Failed to list tenants',
|
||
searchFailed: 'Failed to search tenants',
|
||
resetApiKeyFailed: 'Failed to reset API Key',
|
||
updateFailed: 'Failed to update tenant information',
|
||
},
|
||
initialization: {
|
||
checkFailed: 'Check failed',
|
||
testFailed: 'Test failed',
|
||
},
|
||
},
|
||
model: {
|
||
llmModel: 'LLM Model',
|
||
embeddingModel: 'Embedding Model',
|
||
rerankModel: 'Rerank Model',
|
||
vlmModel: 'Multimodal Model',
|
||
modelName: 'Model Name',
|
||
modelProvider: 'Model Provider',
|
||
modelUrl: 'Model URL',
|
||
apiKey: 'API Key',
|
||
testConnection: 'Test Connection',
|
||
connectionSuccess: 'Connection successful',
|
||
connectionFailed: 'Connection failed',
|
||
dimension: 'Dimension',
|
||
maxTokens: 'Max Tokens',
|
||
temperature: 'Temperature',
|
||
topP: 'Top P',
|
||
selectModel: 'Select Model',
|
||
customModel: 'Custom Model',
|
||
builtinModel: 'Built-in Model',
|
||
defaultTag: 'Default',
|
||
addModelInSettings: 'Go to global settings to add models',
|
||
loadFailed: 'Failed to load model list',
|
||
selectModelPlaceholder: 'Select a model',
|
||
searchPlaceholder: 'Search models...',
|
||
editor: {
|
||
addTitle: 'Add Model',
|
||
editTitle: 'Edit Model',
|
||
sectionSource: 'Source',
|
||
sectionProvider: 'Provider Settings',
|
||
sectionAdvanced: 'Advanced Options',
|
||
sourceLabel: 'Model Source',
|
||
sourceLocal: 'Ollama',
|
||
sourceRemote: 'API',
|
||
description: {
|
||
chat: 'Configure large language models for conversations',
|
||
embedding: 'Configure embedding models for text vectorization',
|
||
rerank: 'Configure models for result re-ranking',
|
||
vllm: 'Configure vision-language models for multimodal understanding',
|
||
asr: 'Configure speech-to-text models for audio transcription',
|
||
default: 'Configure model information'
|
||
},
|
||
modelNamePlaceholder: {
|
||
local: 'e.g. llama2:latest',
|
||
remote: 'e.g. gpt-4, claude-3-opus',
|
||
localVllm: 'e.g. llava:latest',
|
||
remoteVllm: 'e.g. gpt-4-vision-preview',
|
||
remoteAsr: 'e.g. whisper-1'
|
||
},
|
||
baseUrlLabel: 'Base URL',
|
||
displayNameLabel: 'Display name (optional)',
|
||
displayNamePlaceholder: 'e.g. Support QA model',
|
||
displayNameDesc: 'Used only in the UI. Runtime calls still use the model name above.',
|
||
baseUrlPlaceholder: 'e.g. https://api.openai.com/v1',
|
||
baseUrlPlaceholderVllm: 'e.g. http://localhost:11434/v1',
|
||
baseUrlPlaceholderAsr: 'e.g. https://api.openai.com/v1',
|
||
apiKeyOptional: 'API Key (optional)',
|
||
apiKeyPlaceholder: 'Enter API Key',
|
||
customHeadersLabel: 'Custom Request Headers (optional)',
|
||
customHeadersDesc: 'Extra HTTP headers appended to requests to the remote model API (e.g. for enterprise gateway auth or tracing). Reserved headers like Authorization / Content-Type are ignored.',
|
||
customHeadersAdd: 'Add Header',
|
||
customHeadersKeyPlaceholder: 'Header name',
|
||
customHeadersValuePlaceholder: 'Header value',
|
||
connectionTest: 'Connection Test',
|
||
testing: 'Testing...',
|
||
testConnection: 'Test Connection',
|
||
searchPlaceholder: 'Search models...',
|
||
downloadLabel: 'Download: {keyword}',
|
||
refreshList: 'Refresh List',
|
||
dimensionLabel: 'Vector Dimension',
|
||
dimensionPlaceholder: 'e.g. 1536',
|
||
checkDimension: 'Detect Dimension',
|
||
dimensionDetected: 'Detection succeeded. Vector dimension: {value}',
|
||
dimensionFailed: 'Detection failed, please enter the dimension manually',
|
||
remoteDimensionDetected: 'Detected vector dimension: {value}',
|
||
supportsVisionLabel: 'Supports Vision / Multimodal',
|
||
supportsVisionDesc: 'Whether the model accepts image and multimodal input',
|
||
dimensionHint: 'Model selected. Click "Detect Dimension" to fetch the vector dimension automatically.',
|
||
loadModelListFailed: 'Failed to load model list',
|
||
listRefreshed: 'List refreshed',
|
||
fillModelAndUrl: 'Please fill in the model identifier and Base URL first',
|
||
remoteBaseUrlRequired: 'Remote API type requires a Base URL',
|
||
unsupportedModelType: 'Unsupported model type',
|
||
connectionSuccess: 'Connection succeeded',
|
||
connectionFailed: 'Connection failed',
|
||
connectionConfigError: 'Connection failed, please check the configuration',
|
||
downloadStarted: 'Started downloading {name}',
|
||
downloadCompleted: '{name} downloaded successfully',
|
||
downloadFailed: 'Failed to download {name}',
|
||
downloadStartFailed: 'Failed to start download',
|
||
ollamaUnavailable: 'Ollama service is unavailable, local models cannot be selected',
|
||
ollamaNotSupportRerank: 'Ollama does not support ReRank models, please use a remote API instead',
|
||
goToOllamaSettings: 'Open Settings',
|
||
validation: {
|
||
modelNameRequired: 'Please enter the model name',
|
||
modelNameEmpty: 'Model name cannot be empty',
|
||
modelNameMax: 'Model name cannot exceed 100 characters',
|
||
baseUrlRequired: 'Please enter the Base URL',
|
||
baseUrlEmpty: 'Base URL cannot be empty',
|
||
baseUrlInvalid: 'Invalid Base URL, please enter a valid URL'
|
||
},
|
||
// Provider related translations
|
||
providerLabel: 'Provider',
|
||
providerPlaceholder: 'Select model provider',
|
||
providers: {
|
||
openai: {
|
||
label: 'OpenAI',
|
||
description: 'gpt-5.2, gpt-5-mini, etc.',
|
||
},
|
||
anthropic: {
|
||
label: 'Anthropic',
|
||
description: 'Claude models via native Anthropic Messages API',
|
||
},
|
||
azure_openai: {
|
||
label: 'Azure OpenAI',
|
||
description: 'OpenAI service hosted on Microsoft Azure',
|
||
},
|
||
aliyun: {
|
||
label: 'Aliyun DashScope',
|
||
description: 'qwen-plus, tongyi-embedding-vision-plus, qwen3-rerank, etc.',
|
||
},
|
||
zhipu: {
|
||
label: 'Zhipu BigModel',
|
||
description: 'glm-4.7, embedding-3, rerank, etc.',
|
||
},
|
||
openrouter: {
|
||
label: 'OpenRouter',
|
||
description: 'openai/gpt-5.2-chat, google/gemini-3-flash-preview, etc.',
|
||
},
|
||
generic: {
|
||
label: 'Custom (OpenAI-compatible)',
|
||
description: 'Generic API endpoint',
|
||
},
|
||
siliconflow: {
|
||
label: 'SiliconFlow',
|
||
description: 'deepseek-ai/DeepSeek-V3.1, etc.',
|
||
},
|
||
jina: {
|
||
label: 'Jina',
|
||
description: 'jina-clip-v1, jina-embeddings-v2-base-zh, etc.',
|
||
},
|
||
volcengine: {
|
||
label: 'Volcengine',
|
||
description: 'doubao-1-5-pro-32k-250115, doubao-embedding-vision-250615, etc.',
|
||
},
|
||
deepseek: {
|
||
label: 'DeepSeek',
|
||
description: 'deepseek-chat, deepseek-reasoner, etc.',
|
||
},
|
||
hunyuan: {
|
||
label: 'Hunyuan',
|
||
description: 'hunyuan-pro, hunyuan-standard, hunyuan-embedding, etc.',
|
||
},
|
||
minimax: {
|
||
label: 'MiniMax',
|
||
description: 'MiniMax-M3, MiniMax-M2.7, MiniMax-M2.7-highspeed, etc.',
|
||
},
|
||
mimo: {
|
||
label: 'MiMo',
|
||
description: 'mimo-v2-flash',
|
||
},
|
||
gemini: {
|
||
label: 'Google Gemini',
|
||
description: 'gemini-3-flash-preview, gemini-2.5-pro, etc.',
|
||
},
|
||
gpustack: {
|
||
label: 'GPUStack',
|
||
description: 'Choose your deployed model on GPUStack',
|
||
},
|
||
modelscope: {
|
||
label: 'ModelScope',
|
||
description: 'Qwen/Qwen3-8B, Qwen/Qwen3-Embedding-8B, etc.',
|
||
},
|
||
qiniu: {
|
||
label: 'Qiniu Cloud',
|
||
description: 'deepseek/deepseek-v3.2-251201, z-ai/glm-4.7, etc.',
|
||
},
|
||
moonshot: {
|
||
label: 'Moonshot',
|
||
description: 'kimi-k2-turbo-preview, moonshot-v1-8k-vision-preview, etc.',
|
||
},
|
||
qianfan: {
|
||
label: 'Baidu Qianfan',
|
||
description: 'ernie-5.0-thinking-preview, embedding-v1, bce-reranker-base, etc.',
|
||
},
|
||
longcat: {
|
||
label: 'LongCat AI',
|
||
description: 'LongCat-Flash-Chat, LongCat-Flash-Thinking, etc.',
|
||
},
|
||
lkeap: {
|
||
label: 'Tencent Cloud LKEAP',
|
||
description: 'DeepSeek-R1, DeepSeek-V3 series with chain-of-thought',
|
||
},
|
||
nvidia: {
|
||
label: "NVIDIA",
|
||
description: "deepseek-ai-deepseek-v3_1, nv-embed-v1, rerank-qa-mistral-4b, etc.",
|
||
},
|
||
novita: {
|
||
label: "Novita AI",
|
||
description: "moonshotai/kimi-k2.5, zai-org/glm-5, minimax/minimax-m2.7, qwen/qwen3-embedding-0.6b, etc.",
|
||
},
|
||
},
|
||
},
|
||
builtinTag: 'Built-in',
|
||
},
|
||
language: {
|
||
zhCN: '简体中文',
|
||
enUS: 'English',
|
||
ruRU: 'Русский',
|
||
koKR: '한국어',
|
||
selectLanguage: 'Select Language',
|
||
language: 'Language',
|
||
languageDescription: 'Select interface display language',
|
||
languageSaved: 'Language settings saved'
|
||
},
|
||
general: {
|
||
title: 'General Settings',
|
||
allSettings: 'All Settings',
|
||
description: 'Configure language, appearance and other basic options',
|
||
settings: 'Settings',
|
||
close: 'Close Settings'
|
||
},
|
||
theme: {
|
||
theme: 'Theme',
|
||
themeDescription: 'Choose the display theme for the interface, supports automatic switching with system settings',
|
||
light: 'Light',
|
||
dark: 'Dark',
|
||
system: 'Follow System',
|
||
selectTheme: 'Select theme',
|
||
},
|
||
font: {
|
||
uiFont: 'Interface Font',
|
||
uiFontDescription: 'Font used for menus, body text, buttons, and most UI text',
|
||
monoFont: 'Code Font',
|
||
monoFontDescription: 'Used for code blocks, terminal commands, API keys, file paths and other technical text. Every character has the same width so you can tell 0 from O and 1 from l.',
|
||
selectFont: 'Select font',
|
||
sansPreview: 'The quick brown fox jumps — Aa Gg Oo 0123',
|
||
monoPreview: "const msg = 'Hello'; // 0O1l",
|
||
sans: {
|
||
system: 'System Default',
|
||
// macOS
|
||
pingfang: 'PingFang SC',
|
||
georgia: 'Georgia (Serif)',
|
||
// Windows
|
||
yahei: 'Microsoft YaHei',
|
||
times: 'Times New Roman (Serif)',
|
||
// Linux
|
||
'noto-cjk': 'Noto Sans CJK',
|
||
'dejavu-serif': 'DejaVu Serif (Serif)',
|
||
// cross-platform
|
||
'sans-serif': 'Generic Sans-Serif',
|
||
},
|
||
mono: {
|
||
system: 'System Default',
|
||
// macOS
|
||
menlo: 'Menlo',
|
||
monaco: 'Monaco',
|
||
// Windows
|
||
consolas: 'Consolas',
|
||
cascadia: 'Cascadia Code',
|
||
// Linux
|
||
'dejavu-mono': 'DejaVu Sans Mono',
|
||
'liberation-mono': 'Liberation Mono',
|
||
// cross-platform
|
||
monospace: 'Generic Monospace',
|
||
},
|
||
fontSize: 'Font Size',
|
||
fontSizeDescription: 'Scales the entire interface (text, icons, spacing) and applies immediately',
|
||
size: {
|
||
small: 'Small',
|
||
normal: 'Normal',
|
||
large: 'Large',
|
||
},
|
||
},
|
||
platform: {
|
||
subtitle: 'Enterprise-level Intelligent Document Retrieval Framework',
|
||
description: 'Making complex document understanding and precise retrieval simple',
|
||
rag: 'RAG Enhanced Generation',
|
||
hybridSearch: 'Hybrid Search',
|
||
localDeploy: 'Local Deployment',
|
||
multimodalParsing: 'Multimodal Document Parsing',
|
||
hybridSearchEngine: 'Hybrid Search Engine',
|
||
ragQandA: 'RAG Intelligent Q&A',
|
||
independentTenant: 'Independent Tenant Space',
|
||
fullApiAccess: 'Full API Access',
|
||
knowledgeBaseManagement: 'Knowledge Base Management',
|
||
carousel: {
|
||
agenticRagTitle: 'Agentic RAG',
|
||
agenticRagDesc: 'Query rewriting + smart recall + re-ranking',
|
||
hybridSearchTitle: 'Hybrid search strategy',
|
||
hybridSearchDesc: 'BM25 + Vector + Knowledge Graph',
|
||
smartDocRetrievalTitle: 'Intelligent document retrieval',
|
||
smartDocRetrievalDesc: 'PDF/Word/Image multi-format parsing'
|
||
}
|
||
},
|
||
time: {
|
||
today: 'Today',
|
||
yesterday: 'Yesterday',
|
||
last7Days: 'Last 7 Days',
|
||
last30Days: 'Last 30 Days',
|
||
lastYear: 'Last Year',
|
||
earlier: 'Earlier',
|
||
pinned: 'Pinned',
|
||
},
|
||
upload: {
|
||
uploadDocument: 'Upload Document',
|
||
uploadFolder: 'Upload Folder',
|
||
onlineEdit: 'Online Edit',
|
||
deleteRecord: 'Delete Record'
|
||
},
|
||
agentSettings: {
|
||
title: 'Agent Settings',
|
||
description: 'Configure the default behavior and parameters for the AI Agent. These settings apply to all chats with Agent mode enabled.',
|
||
modelRecommendation: {
|
||
title: 'Model Recommendation',
|
||
content: 'For better Agent experience, we recommend using large language models with FunctionCalling support and long context windows, such as deepseek-v3.1-terminus',
|
||
},
|
||
status: {
|
||
label: 'Agent Status',
|
||
ready: 'Ready',
|
||
notReady: 'Not Ready',
|
||
hint: 'Once configuration is complete, the status will change to "Ready". You can then enable Agent mode in the chat.',
|
||
missingThinkingModel: 'Thinking model',
|
||
missingSummaryModel: 'Chat Model (Summary Model)',
|
||
missingRerankModel: 'Rerank model',
|
||
missingAllowedTools: 'Allowed tools',
|
||
pleaseConfigure: 'Please configure {items}',
|
||
goToConfig: 'Go to configure chat model',
|
||
goConfigureModels: 'Configure models →'
|
||
},
|
||
maxIterations: {
|
||
label: 'Max Iterations',
|
||
desc: 'Maximum reasoning steps when the Agent executes tasks'
|
||
},
|
||
thinkingModel: {
|
||
label: 'Thinking Model',
|
||
desc: 'LLM used for Agent reasoning and planning',
|
||
hint: 'Requires a function-call-capable model'
|
||
},
|
||
rerankModel: {
|
||
label: 'Rerank Model',
|
||
desc: 'Re-rank search results and normalize relevance scores'
|
||
},
|
||
model: {
|
||
placeholder: 'Search models...',
|
||
addChat: 'Add a new chat model',
|
||
addRerank: 'Add a new Rerank model'
|
||
},
|
||
temperature: {
|
||
label: 'Temperature',
|
||
desc: 'Controls randomness in outputs. 0 is most deterministic; 1 is most random'
|
||
},
|
||
allowedTools: {
|
||
label: 'Allowed Tools',
|
||
desc: 'Tools currently enabled for the Agent',
|
||
placeholder: 'Select tools...',
|
||
empty: 'No tools configured'
|
||
},
|
||
systemPrompt: {
|
||
label: 'System Prompt',
|
||
desc: 'Configure the Agent’s system prompt with placeholders that are resolved at runtime.',
|
||
availablePlaceholders: 'Available placeholders:',
|
||
hintPrefix: 'Tip: typing',
|
||
hintSuffix: 'will show available placeholders automatically',
|
||
custom: 'Custom Prompt',
|
||
disabledHint: 'Currently using the default prompt. Enable custom to apply the content below.',
|
||
placeholder: 'Enter the system prompt, or leave blank to use the default...',
|
||
tabHint: "Unified system prompt using {'{{'}web_search_status{'}}'} placeholder for dynamic web search behavior",
|
||
tabHintDetail: "Unified system prompt (leave empty for system default, use {'{{'}web_search_status{'}}'} placeholder to dynamically control web search behavior)",
|
||
},
|
||
reset: {
|
||
header: 'Reset to Default Prompt',
|
||
body: 'Are you sure you want to reset to the default prompt? Your custom prompt will be overwritten.'
|
||
},
|
||
globalConfigNotice: 'These are global default settings. New agents will inherit these settings. You can also configure each agent individually in the agent list.',
|
||
loadConfigFailed: 'Failed to load Agent configuration',
|
||
loadModelsFailed: 'Failed to load model list',
|
||
errors: {
|
||
selectThinkingModel: 'Please select a thinking model before enabling Agent mode',
|
||
selectAtLeastOneTool: 'Please select at least one tool',
|
||
iterationsRange: 'Max iterations must be between 1 and 20',
|
||
temperatureRange: 'Temperature must be between 0 and 2',
|
||
validationFailed: 'Configuration validation failed'
|
||
},
|
||
toasts: {
|
||
iterationsSaved: 'Max iterations saved',
|
||
thinkingModelSaved: 'Thinking model saved',
|
||
rerankModelSaved: 'Rerank model saved',
|
||
temperatureSaved: 'Temperature saved',
|
||
toolsUpdated: 'Tools updated',
|
||
customPromptEnabled: 'Custom prompt enabled',
|
||
defaultPromptEnabled: 'Switched to default prompt',
|
||
resetToDefault: 'Reset to default prompt',
|
||
systemPromptSaved: 'System prompt saved',
|
||
autoDisabled: 'Agent configuration incomplete. Agent mode has been disabled automatically'
|
||
}
|
||
},
|
||
conversationSettings: {
|
||
description: 'Configure default behavior and parameters for conversation modes, including prompts for Agent and normal modes',
|
||
agentMode: 'Agent Mode',
|
||
normalMode: 'Normal Mode',
|
||
menus: {
|
||
modes: 'Mode Settings',
|
||
models: 'Model Mapping',
|
||
thresholds: 'Retrieval Thresholds',
|
||
advanced: 'Advanced Settings'
|
||
},
|
||
models: {
|
||
description: 'Manage thinking/chat models and re-rank models for both Agent and normal modes',
|
||
chatGroupLabel: 'Thinking / Chat Models',
|
||
chatGroupDesc: 'Includes Agent reasoning/planning model and the default chat/summary model for normal mode',
|
||
chatModel: {
|
||
label: 'Default chat model (normal mode)',
|
||
desc: 'Used when a conversation does not specify its own model',
|
||
placeholder: 'Select default chat model'
|
||
},
|
||
rerankModel: {
|
||
label: 'Default ReRank model (normal mode)',
|
||
desc: 'Used for re-ranking when a session does not override it',
|
||
placeholder: 'Select default rerank model'
|
||
},
|
||
rerankGroupLabel: 'ReRank Models',
|
||
rerankGroupDesc: 'Includes Agent rerank model and the default rerank model for normal mode'
|
||
},
|
||
thresholds: {
|
||
description: 'Tune retrieval and re-ranking thresholds to balance accuracy and performance'
|
||
},
|
||
maxRounds: {
|
||
label: 'History Rounds',
|
||
desc: 'Number of rounds kept for context and query rewrite'
|
||
},
|
||
embeddingTopK: {
|
||
label: 'Embedding TopK',
|
||
desc: 'Number of documents kept after vector retrieval'
|
||
},
|
||
keywordThreshold: {
|
||
label: 'Keyword Threshold',
|
||
desc: 'Minimum score for keyword retrieval'
|
||
},
|
||
vectorThreshold: {
|
||
label: 'Vector Threshold',
|
||
desc: 'Minimum similarity for vector retrieval'
|
||
},
|
||
rerankTopK: {
|
||
label: 'ReRank TopK',
|
||
desc: 'Documents kept after re-ranking'
|
||
},
|
||
rerankThreshold: {
|
||
label: 'ReRank Threshold',
|
||
desc: 'Minimum score required after re-ranking'
|
||
},
|
||
enableRewrite: {
|
||
label: 'Enable Query Rewrite',
|
||
desc: 'Automatically rewrite multi-turn queries for better recall'
|
||
},
|
||
enableQueryExpansion: {
|
||
label: 'Enable LLM Query Expansion',
|
||
desc: 'When recall is low, call a reasoning model to generate expansion queries (adds latency & cost)'
|
||
},
|
||
fallbackStrategy: {
|
||
label: 'Fallback Strategy',
|
||
desc: 'How to respond when no relevant documents are found',
|
||
fixed: 'Fixed response',
|
||
model: 'Let the model continue answering'
|
||
},
|
||
fallbackResponse: {
|
||
label: 'Fixed fallback response',
|
||
desc: 'Text returned when using the fixed fallback strategy'
|
||
},
|
||
fallbackPrompt: {
|
||
label: 'Fallback Prompt',
|
||
desc: 'Prompt used when fallback strategy is "model"'
|
||
},
|
||
advanced: {
|
||
description: 'Configure query rewrite, fallback strategy and other advanced settings'
|
||
},
|
||
rewritePrompt: {
|
||
system: 'Rewrite System Prompt',
|
||
user: 'Rewrite User Prompt',
|
||
desc: 'System prompt used during query rewrite',
|
||
userDesc: 'User prompt used during query rewrite'
|
||
},
|
||
chatModel: {
|
||
label: 'LLM Model',
|
||
desc: 'Large language model used for summarization and abstract generation'
|
||
},
|
||
rerankModel: {
|
||
label: 'ReRank Model',
|
||
desc: 'Model for re-ranking search results (optional)'
|
||
},
|
||
contextTemplate: {
|
||
label: 'Retrieval Result Summary Prompt',
|
||
desc: 'Prompt template for generating answers based on retrieval results in normal mode',
|
||
descWithDefault: 'Prompt template for generating answers based on retrieval results in normal mode (leave empty for system default)',
|
||
placeholder: 'Enter the prompt template for retrieval result summary...',
|
||
custom: 'Custom template',
|
||
disabledHint: 'Currently using the default summary prompt. Enable custom to edit below.',
|
||
},
|
||
systemPrompt: {
|
||
label: 'System Prompt',
|
||
desc: 'System-level prompt for normal mode conversations',
|
||
descWithDefault: 'System-level prompt for normal mode conversations (leave empty for system default)',
|
||
placeholder: 'Enter the system prompt...',
|
||
custom: 'Custom prompt',
|
||
disabledHint: 'Currently using the default prompt. Enable custom to edit below.',
|
||
},
|
||
temperature: {
|
||
label: 'Temperature',
|
||
desc: 'Controls randomness in outputs. 0 is most deterministic; 1 is most random'
|
||
},
|
||
maxTokens: {
|
||
label: 'Max Tokens',
|
||
desc: 'Maximum number of tokens to generate in the response'
|
||
},
|
||
resetSystemPrompt: {
|
||
header: 'Reset to Default System Prompt',
|
||
body: 'Are you sure you want to reset to the default system prompt?'
|
||
},
|
||
resetContextTemplate: {
|
||
header: 'Reset to Default Summary Prompt',
|
||
body: 'Are you sure you want to reset to the default summary prompt?'
|
||
},
|
||
toasts: {
|
||
chatModelSaved: 'LLM model saved',
|
||
rerankModelSaved: 'ReRank model saved',
|
||
contextTemplateSaved: 'Retrieval result summary prompt saved',
|
||
systemPromptSaved: 'System prompt saved',
|
||
temperatureSaved: 'Temperature saved',
|
||
maxTokensSaved: 'Max tokens saved',
|
||
maxRoundsSaved: 'History rounds saved',
|
||
embeddingSaved: 'Embedding TopK saved',
|
||
keywordThresholdSaved: 'Keyword threshold saved',
|
||
vectorThresholdSaved: 'Vector threshold saved',
|
||
rerankTopKSaved: 'ReRank TopK saved',
|
||
rerankThresholdSaved: 'ReRank threshold saved',
|
||
enableRewriteSaved: 'Query rewrite preference saved',
|
||
enableQueryExpansionSaved: 'Query expansion preference saved',
|
||
fallbackStrategySaved: 'Fallback strategy saved',
|
||
fallbackResponseSaved: 'Fallback response saved',
|
||
fallbackPromptSaved: 'Fallback prompt saved',
|
||
rewritePromptSystemSaved: 'Rewrite system prompt saved',
|
||
rewritePromptUserSaved: 'Rewrite user prompt saved',
|
||
customPromptEnabled: 'Custom prompt enabled',
|
||
defaultPromptEnabled: 'Using default prompt',
|
||
customContextTemplateEnabled: 'Custom summary prompt enabled',
|
||
defaultContextTemplateEnabled: 'Using default summary prompt',
|
||
resetSystemPromptSuccess: 'Reset to default system prompt',
|
||
resetContextTemplateSuccess: 'Reset to default summary prompt'
|
||
}
|
||
},
|
||
// New: MCP Settings
|
||
mcpSettings: {
|
||
title: 'MCP Services',
|
||
description: 'Manage external MCP (Model Context Protocol) services for tools/resources in Agent mode',
|
||
// Drawer subtitle chip
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
configuredServices: 'Configured Services',
|
||
manageAndTest: 'Manage and test MCP service connections',
|
||
addService: 'Add Service',
|
||
empty: 'No MCP services',
|
||
addFirst: 'Add the first MCP service',
|
||
actions: {
|
||
test: 'Test Connection'
|
||
},
|
||
toasts: {
|
||
loadFailed: 'Failed to load MCP services',
|
||
enabled: 'MCP service enabled',
|
||
disabled: 'MCP service disabled',
|
||
updateStateFailed: 'Failed to update MCP service status',
|
||
testing: 'Testing {name}...',
|
||
noResponse: 'Test failed: no response from server',
|
||
testFailed: 'Failed to test MCP service',
|
||
deleted: 'MCP service deleted',
|
||
deleteFailed: 'Failed to delete MCP service'
|
||
},
|
||
deleteConfirmBody: 'Delete MCP service "{name}"? This action cannot be undone.',
|
||
unnamed: 'Unnamed',
|
||
builtin: 'Built-in'
|
||
},
|
||
// New: Model Settings
|
||
modelSettings: {
|
||
title: 'Model Settings',
|
||
description: 'Manage different types of AI models, including local Ollama and remote APIs',
|
||
typeShort: {
|
||
chat: 'Chat',
|
||
embedding: 'Embedding',
|
||
rerank: 'ReRank',
|
||
vllm: 'Vision',
|
||
asr: 'Speech',
|
||
},
|
||
actions: {
|
||
addModel: 'Add Model',
|
||
setDefault: 'Set as Default'
|
||
},
|
||
source: {
|
||
remote: 'Remote',
|
||
openaiCompatible: 'OpenAI-compatible',
|
||
custom: 'Custom',
|
||
},
|
||
rawModelName: 'Model name',
|
||
chat: {
|
||
title: 'Chat Models',
|
||
desc: 'Configure large language models for chatting',
|
||
empty: 'No chat models'
|
||
},
|
||
embedding: {
|
||
title: 'Embedding Models',
|
||
desc: 'Configure embedding models for text vectorization',
|
||
empty: 'No embedding models'
|
||
},
|
||
rerank: {
|
||
title: 'ReRank Models',
|
||
desc: 'Configure models for result re-ranking',
|
||
empty: 'No re-rank models'
|
||
},
|
||
vllm: {
|
||
title: 'VLLM Vision Models',
|
||
desc: 'Configure vision-language models for multimodal understanding',
|
||
empty: 'No VLLM models'
|
||
},
|
||
asr: {
|
||
title: 'ASR Speech Models',
|
||
desc: 'Configure speech-to-text models for audio transcription (e.g. OpenAI Whisper)',
|
||
empty: 'No ASR models'
|
||
},
|
||
toasts: {
|
||
nameRequired: 'Model name cannot be empty',
|
||
nameTooLong: 'Model name cannot exceed 100 characters',
|
||
displayNameTooLong: 'Display name cannot exceed 100 characters',
|
||
baseUrlRequired: 'Base URL is required for remote APIs',
|
||
baseUrlInvalid: 'Invalid Base URL, please enter a valid URL',
|
||
dimensionInvalid: 'Embedding dimension must be between 128 and 4096',
|
||
updated: 'Model updated',
|
||
added: 'Model added',
|
||
saveFailed: 'Failed to save model',
|
||
deleted: 'Model deleted',
|
||
deleteFailed: 'Failed to delete model',
|
||
setDefault: 'Set as default',
|
||
setDefaultFailed: 'Failed to set default model',
|
||
builtinCannotEdit: 'Built-in models cannot be edited',
|
||
builtinCannotDelete: 'Built-in models cannot be deleted',
|
||
builtinCannotCopy: 'Built-in models cannot be copied',
|
||
copied: 'Model copied',
|
||
copyFailed: 'Failed to copy model',
|
||
},
|
||
copySuffix: ' Copy',
|
||
builtinModels: {
|
||
title: 'Built-in Models',
|
||
description: 'Built-in models are visible to all tenants. Sensitive information is hidden, and they cannot be edited or deleted.',
|
||
viewGuide: 'View Built-in Models Guide',
|
||
},
|
||
builtinTag: 'Built-in',
|
||
confirmDelete: 'Are you sure you want to delete this model?',
|
||
},
|
||
// New: Ollama Settings
|
||
ollamaSettings: {
|
||
title: 'Ollama Settings',
|
||
description: 'Manage local Ollama service and view/download models',
|
||
status: {
|
||
label: 'Ollama Service Status',
|
||
desc: 'Automatically detect local Ollama service availability. If the service is down or the URL is incorrect, status will be "Unavailable".',
|
||
testing: 'Testing',
|
||
available: 'Available',
|
||
unavailable: 'Unavailable',
|
||
untested: 'Not Tested',
|
||
retest: 'Retest'
|
||
},
|
||
address: {
|
||
label: 'Service URL',
|
||
desc: 'The API address of the local Ollama service, auto-detected by the system. To modify, set it in the .env file.',
|
||
placeholder: 'http://localhost:11434',
|
||
failed: 'Connection failed. Please check whether Ollama is running or the URL is correct'
|
||
},
|
||
download: {
|
||
title: 'Download Models',
|
||
descPrefix: 'Enter a model name to download,',
|
||
browse: 'Browse Ollama model library',
|
||
placeholder: 'e.g. qwen2.5:0.5b',
|
||
download: 'Download',
|
||
downloading: 'Downloading: {name}'
|
||
},
|
||
installed: {
|
||
title: 'Installed Models',
|
||
desc: 'Models installed in Ollama',
|
||
empty: 'No installed models'
|
||
},
|
||
toasts: {
|
||
connected: 'Connected successfully',
|
||
connectFailed: 'Connection failed. Please check whether Ollama is running',
|
||
listFailed: 'Failed to get model list',
|
||
downloadFailed: 'Download failed. Please try again later',
|
||
downloadStarted: 'Started downloading model {name}',
|
||
downloadCompleted: 'Model {name} downloaded successfully',
|
||
progressFailed: 'Failed to query download progress',
|
||
},
|
||
unknown: 'Unknown',
|
||
today: 'Today',
|
||
yesterday: 'Yesterday',
|
||
daysAgo: '{days} days ago',
|
||
},
|
||
// New: MCP Service Dialog
|
||
mcpServiceDialog: {
|
||
addTitle: 'Add MCP Service',
|
||
editTitle: 'Edit MCP Service',
|
||
// Section + drawer-only keys
|
||
basicSection: 'Basic',
|
||
connectionSection: 'Connection',
|
||
enableServiceDesc: 'When off, this service will not be invoked',
|
||
testAfterSaveHint: 'Save first to test the connection',
|
||
unitSecond: 's',
|
||
unitTimes: '×',
|
||
name: 'Service Name',
|
||
namePlaceholder: 'Enter service name',
|
||
description: 'Description',
|
||
descriptionPlaceholder: 'Enter service description',
|
||
transportType: 'Transport Type',
|
||
transport: {
|
||
sse: 'SSE (Server-Sent Events)',
|
||
httpStreamable: 'HTTP Streamable',
|
||
stdio: 'Stdio'
|
||
},
|
||
serviceUrl: 'Service URL',
|
||
serviceUrlPlaceholder: 'https://example.com/mcp',
|
||
command: 'Command',
|
||
args: 'Arguments',
|
||
argPlaceholder: 'Argument {index}',
|
||
addArg: 'Add Argument',
|
||
envVars: 'Environment Variables',
|
||
envKeyPlaceholder: 'Key',
|
||
envValuePlaceholder: 'Value',
|
||
addEnvVar: 'Add Environment Variable',
|
||
enableService: 'Enable Service',
|
||
authConfig: 'Authentication',
|
||
apiKey: 'API Key',
|
||
bearerToken: 'Bearer Token',
|
||
optional: 'Optional',
|
||
advancedConfig: 'Advanced',
|
||
timeoutSec: 'Timeout (s)',
|
||
retryCount: 'Retry Count',
|
||
retryDelaySec: 'Retry Delay (s)',
|
||
rules: {
|
||
nameRequired: 'Please enter the service name',
|
||
transportRequired: 'Please select a transport type',
|
||
urlRequired: 'Please enter the service URL',
|
||
urlInvalid: 'Please enter a valid URL',
|
||
commandRequired: 'Please select a command (uvx or npx)',
|
||
argsRequired: 'Please enter at least one argument'
|
||
},
|
||
toasts: {
|
||
created: 'MCP service created',
|
||
updated: 'MCP service updated',
|
||
createFailed: 'Failed to create MCP service',
|
||
updateFailed: 'Failed to update MCP service'
|
||
}
|
||
},
|
||
promptTemplate: {
|
||
noTemplates: 'No templates available',
|
||
selectTemplate: 'Select Template',
|
||
useTemplate: 'Use Template',
|
||
resetDefault: 'Reset Default',
|
||
default: 'Default',
|
||
withKnowledgeBase: 'KB',
|
||
withWebSearch: 'Web Search',
|
||
},
|
||
organization: {
|
||
title: 'Shared Spaces',
|
||
subtitle: 'Create or join shared spaces so multiple workspaces can collaborate and share knowledge bases and agents',
|
||
createOrg: 'Create Space',
|
||
createOrgShort: 'New',
|
||
joinOrg: 'Join Space',
|
||
joinOrgShort: 'Join',
|
||
name: 'Space Name',
|
||
namePlaceholder: 'Enter space name',
|
||
nameRequired: 'Please enter space name',
|
||
avatar: 'Space Avatar',
|
||
avatarClear: 'Clear',
|
||
avatarPickerHint: 'Choose an emoji as space avatar',
|
||
description: 'Description',
|
||
descriptionPlaceholder: 'Enter space description (optional)',
|
||
noDescription: 'No description',
|
||
members: 'members',
|
||
memberCount: 'Member count',
|
||
owner: 'Creator',
|
||
inviteCode: 'Invite Code',
|
||
inviteCodePlaceholder: 'Enter invite code',
|
||
inviteCodeRequired: 'Please enter invite code',
|
||
inviteCodeTip: 'Share this invite code with others to let them join your space',
|
||
refreshInviteCode: 'Refresh Invite Code',
|
||
inviteCodeRefreshed: 'Invite code refreshed',
|
||
inviteCodeRefreshFailed: 'Failed to refresh invite code',
|
||
rbac: {
|
||
needTenantAdmin: 'Tenant admin role required',
|
||
needTenantAdminTip: 'This action requires the admin role (or higher) in the current tenant. Please contact the tenant owner.',
|
||
cannotCreate: 'Your tenant role is insufficient to create a shared space',
|
||
cannotJoin: 'Your tenant role is insufficient to join or request to join a shared space',
|
||
cannotManage: 'Your tenant role is insufficient to manage this shared space',
|
||
},
|
||
join: {
|
||
title: 'Join Space',
|
||
joining: 'Joining space...',
|
||
success: 'Successfully joined space!',
|
||
failed: 'Failed to join space',
|
||
noCode: 'Invite code not found',
|
||
goToOrganizations: 'Go to Spaces',
|
||
confirmTitle: 'Confirm Join Space',
|
||
confirm: 'Confirm Join',
|
||
preview: 'Preview & Join',
|
||
memberCount: '{count} members',
|
||
shareCount: '{count} shared knowledge bases',
|
||
agentShareCount: '{count} agents',
|
||
alreadyMember: 'You are already a member of this space',
|
||
invalidCode: 'Invalid invite code',
|
||
byInviteCode: 'Enter invite code',
|
||
searchSpaces: 'Search spaces',
|
||
searchSpacesDesc: 'Browse or search spaces that are open for discovery; join without an invite code',
|
||
searchSpacesPlaceholder: 'Search by space name, description or space ID',
|
||
spaceId: 'Space ID',
|
||
noSearchResult: 'No matching spaces',
|
||
noSearchableSpaces: 'No discoverable spaces yet, or try a search',
|
||
membersWithLimit: '{current}/{limit} members',
|
||
memberLimitReached: 'Full',
|
||
backToSearch: 'Back to search',
|
||
},
|
||
invite: {
|
||
loading: 'Loading...',
|
||
previewTitle: 'Join Space',
|
||
previewInfo: 'Space Overview',
|
||
inputDesc: 'Enter the invite code (or paste from an invite link) to view the space and join',
|
||
previewAction: 'View',
|
||
primaryJoin: 'Join',
|
||
invalidTitle: 'Invalid Invitation',
|
||
invalidCode: 'Invite code is invalid or expired',
|
||
previewFailed: 'Preview failed, please try again',
|
||
members: 'Members',
|
||
knowledgeBases: 'Knowledge Bases',
|
||
agents: 'Agents',
|
||
alreadyMember: 'You are already a member of this space',
|
||
confirmJoin: 'Confirm Join',
|
||
submitRequest: 'Request to Join',
|
||
requireApprovalTip: 'This space requires admin approval to join',
|
||
approvalLabel: 'Join method',
|
||
needApproval: 'Requires approval',
|
||
noApproval: 'No approval required',
|
||
defaultRoleAfterJoin: 'Default role after joining: {role}',
|
||
requestRole: 'Requested role',
|
||
selectRole: 'Select role',
|
||
messagePlaceholder: 'Optional: message (e.g. intro or reason to join)',
|
||
applicationNote: 'Application note (optional)',
|
||
joinSuccess: 'Successfully joined space!',
|
||
joinFailed: 'Failed to join, please try again',
|
||
requestSubmitted: 'Request submitted, please wait for admin approval',
|
||
requestFailed: 'Failed to submit request, please try again',
|
||
viewOrganization: 'View Space',
|
||
},
|
||
leave: 'Leave Space',
|
||
leaveConfirm: 'Are you sure you want to leave this space?',
|
||
leaveConfirmTitle: 'Leave Space',
|
||
leaveConfirmMessage: 'Are you sure you want to leave "{name}"? You will lose access to shared knowledge bases.',
|
||
leaveSuccess: 'Left space successfully',
|
||
leaveFailed: 'Failed to leave space',
|
||
deleteConfirm: 'Are you sure you want to delete this space? This action cannot be undone.',
|
||
deleteConfirmTitle: 'Delete Space',
|
||
deleteConfirmMessage: 'Are you sure you want to delete "{name}"? All members will be removed. This action cannot be undone.',
|
||
deleteSuccess: 'Space deleted',
|
||
deleteFailed: 'Failed to delete space',
|
||
createSuccess: 'Space created successfully',
|
||
createFailed: 'Failed to create space',
|
||
joinSuccess: 'Joined space successfully',
|
||
joinFailed: 'Failed to join space',
|
||
manageMembers: 'Manage Members',
|
||
noMembers: 'No members',
|
||
roleUpdated: 'Role updated',
|
||
roleUpdateFailed: 'Failed to update role',
|
||
memberRemoved: 'Member removed',
|
||
memberRemoveFailed: 'Failed to remove member',
|
||
empty: 'You have not joined any shared space yet',
|
||
emptyDesc: 'Create a space or join an existing one with an invite code',
|
||
all: 'All',
|
||
createdByMe: 'Created by me',
|
||
joinedByMe: 'Joined',
|
||
createdTag: 'Created',
|
||
joinedTag: 'Joined',
|
||
joinedLabel: 'Joined',
|
||
emptyCreated: 'You have not created any space yet',
|
||
emptyCreatedDesc: 'Click "Create Space" to create one',
|
||
emptyJoined: 'You have not joined any space yet',
|
||
emptyJoinedDesc: 'Join an existing space with an invite code',
|
||
role: {
|
||
admin: 'Admin',
|
||
editor: 'Editor',
|
||
viewer: 'Viewer',
|
||
},
|
||
detail: {
|
||
myRole: 'My Role',
|
||
removeMemberTitle: 'Remove Member',
|
||
removeMemberConfirm: 'Are you sure you want to remove "{name}"?',
|
||
removeMember: 'Remove Member',
|
||
shareKBTip: 'Go to knowledge base list, select a knowledge base and click share to share it to this space',
|
||
},
|
||
settings: {
|
||
editTitle: 'Space Settings',
|
||
detailTitle: 'Space Details',
|
||
myRoleDesc: 'Your role in this space determines your permissions',
|
||
membersDesc: 'View and manage space members and their roles. Each member represents a tenant — all users in the same tenant share access to this space.',
|
||
sharedDesc: 'View all knowledge bases shared to this space',
|
||
noSharedKB: 'No shared knowledge bases yet',
|
||
noSharedKBTip: 'Knowledge base owners can share their knowledge bases to this space in KB settings',
|
||
sharedAgents: 'Shared Agents',
|
||
noSharedAgents: 'No shared agents yet',
|
||
sharedAgentsDesc: 'Agents shared to this space; members can use them in chat',
|
||
sharedAgentsKbHint: 'Knowledge bases linked to an agent are only available (read-only) when members use that agent in a conversation (via {\'@\'}). They do not appear in the Knowledge Base list. To let members see or edit a knowledge base in the list, share that knowledge base to this space separately.',
|
||
sharedAgentsKbHintShort: 'Agent-linked knowledge is read-only in chat; share the KB to this space if members should see or edit it in the list.',
|
||
noSharedAgentsTip: 'Admins can share agents to this space from agent settings',
|
||
sharePermissionLabel: 'Space permission',
|
||
myPermissionLabel: 'My actual permission',
|
||
permissionCalcFormula: 'Space permission is what was set when the KB was shared to this space; my actual permission = min(space permission, my role in this space)',
|
||
permissionCalcTip: 'My actual permission = min(space permission, my role in this space). As a viewer in the space, I have at most read-only on this KB; as editor or admin, my permission is capped by the space permission.',
|
||
inviteMembers: 'Invite Members',
|
||
inviteMembersDesc: 'Invite others to join the space via code or link',
|
||
inviteLink: 'Invite Link',
|
||
inviteLinkValidity: 'Invite link validity',
|
||
inviteLinkValidityDesc: 'Validity period for newly generated invite links',
|
||
validity1Day: '1 day',
|
||
validity7Days: '7 days',
|
||
validity30Days: '30 days',
|
||
validityNever: 'Never expire',
|
||
remainingValidity: 'Expires in {n} days',
|
||
remainingValidityNever: 'Never expire',
|
||
remainingValidityExpired: 'Expired',
|
||
removeShareFromOrg: 'Remove from space',
|
||
removeShareConfirm: 'Remove "{name}" from this space? Members will no longer have access to this knowledge base.',
|
||
removeAgentShareConfirm: 'Remove "{name}" from this space? Members will no longer have access to this agent.',
|
||
removeShareSuccess: 'Removed from space',
|
||
removeShareFailed: 'Failed to remove, please try again',
|
||
requireApproval: 'Require Approval',
|
||
requireApprovalDesc: 'When enabled, new members need admin approval to join',
|
||
searchable: 'Open for search',
|
||
searchableDesc: 'When enabled, this space appears in the "Join Space" search list; others can search and request to join without an invite code',
|
||
memberLimit: 'Member limit',
|
||
memberLimitDesc: 'No new members can be added when the limit is reached; 0 means unlimited',
|
||
memberLimitPlaceholder: '0 = unlimited',
|
||
memberLimitHint: 'Current members: {count}',
|
||
joinRequests: 'Join Requests',
|
||
joinRequestsDesc: 'Review pending requests to join the space',
|
||
noPendingRequests: 'No pending requests',
|
||
pendingJoinRequestsBadge: 'Pending join requests to review',
|
||
pendingReview: 'Pending',
|
||
assignRole: 'Assign role',
|
||
approve: 'Approve',
|
||
reject: 'Reject',
|
||
approveSuccess: 'Request approved',
|
||
rejectSuccess: 'Request rejected',
|
||
reviewFailed: 'Operation failed, please try again',
|
||
},
|
||
editor: {
|
||
navBasic: 'Basic Info',
|
||
navPermissions: 'Permissions',
|
||
navJoin: 'Join Space',
|
||
basicTitle: 'Basic Information',
|
||
basicDesc: 'Set the space name and description for easy identification',
|
||
nameTip: 'Use your team or project name for easy identification',
|
||
descriptionTip: 'Describe the purpose and goals of the space',
|
||
permissionsTitle: 'Member Permissions',
|
||
permissionsDesc: 'Understand the permission scope of different roles for knowledge bases and agents in the space',
|
||
permissionFeature: 'Permission Feature',
|
||
fullAccess: 'Full Access',
|
||
editAccess: 'Edit Access',
|
||
viewAccess: 'View Only',
|
||
adminPerm1: 'Manage space settings, members, and knowledge base & agent sharing',
|
||
adminPerm2: 'Share and manage knowledge bases and agents',
|
||
adminPerm3: 'Edit shared knowledge base content',
|
||
adminPerm4: 'View and search knowledge bases',
|
||
useSharedAgentsPerm: 'Use shared agents',
|
||
shareKBPerm: 'Share knowledge bases to space',
|
||
editorPerm1: 'Edit shared knowledge base content',
|
||
editorPerm2: 'View and search knowledge bases',
|
||
editorPerm3: 'Manage space settings and members',
|
||
viewerPerm1: 'View and search knowledge bases',
|
||
viewerPerm2: 'Edit knowledge base content',
|
||
viewerPerm3: 'Manage space settings',
|
||
ownerNote: 'As the space creator, you will automatically become an admin with full permissions.',
|
||
joinTitle: 'Join Space',
|
||
joinDesc: 'Join an existing space with an invite code to access shared knowledge bases and agents',
|
||
joinIllustration: 'Enter the invite code provided by the space admin to join',
|
||
inviteCodeTip: 'The invite code is generated by space admins, please ask them for it',
|
||
howToGetCode: 'How to get an invite code?',
|
||
step1: 'Contact the admin of the space you want to join',
|
||
step2: 'Ask them to share the space invite code',
|
||
step3: 'Paste the invite code in the input field above',
|
||
},
|
||
upgrade: {
|
||
requestUpgrade: 'Request Permission Upgrade',
|
||
pending: 'Request Submitted',
|
||
dialogTitle: 'Request Permission Upgrade',
|
||
currentRole: 'Current Role',
|
||
selectRole: 'Request Role',
|
||
reason: 'Reason (Optional)',
|
||
reasonPlaceholder: 'Please briefly explain why you need higher permissions...',
|
||
submitSuccess: 'Upgrade request submitted, waiting for admin approval',
|
||
submitFailed: 'Failed to submit request',
|
||
upgradeRequest: 'Permission Upgrade',
|
||
},
|
||
addMember: {
|
||
button: 'Add Member',
|
||
dialogTitle: 'Add Member',
|
||
tip: 'Added users will immediately become space members and can access shared knowledge bases.',
|
||
tipTenant: 'Membership is at the tenant level: once a tenant joins, all of its users share access to this space. Results below are deduplicated by tenant.',
|
||
searchUser: 'Select User',
|
||
searchTenant: 'Select Tenant',
|
||
searchPlaceholder: 'Search by username or email...',
|
||
searchTenantPlaceholder: 'Search by tenant name, username or email...',
|
||
searchHint: 'Type at least 2 characters to search',
|
||
searchTenantHint: 'Type at least 2 characters; results are deduplicated by tenant and exclude tenants already in this space',
|
||
selectRole: 'Assign Role',
|
||
confirmBtn: 'Add',
|
||
success: 'Member added successfully',
|
||
failed: 'Failed to add member',
|
||
roleHint: {
|
||
viewer: 'Can view and search',
|
||
editor: 'Can edit content',
|
||
admin: 'Full management access',
|
||
},
|
||
},
|
||
share: {
|
||
title: 'Share Knowledge Base',
|
||
selectOrg: 'Select Space',
|
||
selectOrgPlaceholder: 'Select a space to share with',
|
||
permission: 'Permission',
|
||
permissionTip: 'Editable permission allows members to modify knowledge base content, Read-only permission only allows search and Q&A',
|
||
shareSuccess: 'Knowledge base shared',
|
||
shareFailed: 'Failed to share',
|
||
unshareSuccess: 'Share cancelled',
|
||
unshareFailed: 'Failed to cancel share',
|
||
sharedTo: 'Shared to',
|
||
noShares: 'Not shared to any space yet',
|
||
sharedKnowledgeBase: 'Shared Knowledge Base',
|
||
shareToSpace: 'Share to space',
|
||
shareModelToSpace: 'Share "{name}" to space',
|
||
shareAgentToSpace: 'Share "{name}" to space',
|
||
modelShareDesc: 'Share this model to a space so members can use it',
|
||
agentShareDesc: 'Share this agent to a space so members can use it',
|
||
spaceAgentShareCountTip: 'Number of agents shared to this space',
|
||
sharedFrom: 'From',
|
||
sharedBadge: 'Shared',
|
||
permissionReadonly: 'Read-only',
|
||
permissionEditable: 'Editable',
|
||
sharedKBs: ' knowledge bases',
|
||
sharedAgents: ' agents',
|
||
},
|
||
},
|
||
preview: {
|
||
tab: 'Preview',
|
||
loading: 'Loading document preview...',
|
||
loadFailed: 'Failed to load document preview',
|
||
retry: 'Retry',
|
||
unsupported: 'This file type does not support online preview',
|
||
unsupportedHint: 'Please download and open with a local application',
|
||
fullscreen: 'Fullscreen',
|
||
exitFullscreen: 'Exit Fullscreen',
|
||
audioLoading: 'Loading audio…',
|
||
audioNotSupported: 'Your browser does not support audio playback',
|
||
},
|
||
commandPalette: {
|
||
placeholder: 'Search knowledge bases, files, conversations…',
|
||
searching: 'Searching…',
|
||
clearRecent: 'Clear',
|
||
retrieval: 'Retrieval settings',
|
||
untitledSession: 'Untitled conversation',
|
||
scope: {
|
||
placeholder: 'Search within this knowledge base…',
|
||
remove: 'Remove scope (Backspace)',
|
||
},
|
||
group: {
|
||
chunks: 'Files',
|
||
messages: 'Messages',
|
||
kbs: 'Knowledge bases',
|
||
agents: 'Agents',
|
||
sessionsByTitle: 'Chats (by title)',
|
||
commands: 'Commands',
|
||
recent: 'Recent',
|
||
quickActions: 'Quick actions',
|
||
},
|
||
match: {
|
||
vector: 'Vector',
|
||
keyword: 'Keyword',
|
||
},
|
||
quick: {
|
||
newChat: 'New conversation',
|
||
knowledgeBases: 'Open knowledge bases',
|
||
agents: 'Open agents',
|
||
organizations: 'Open shared spaces',
|
||
settings: 'Open settings',
|
||
},
|
||
empty: {
|
||
noResults: 'No matches found',
|
||
askAi: 'Ask the AI directly',
|
||
adjustRetrieval: 'Adjust retrieval',
|
||
},
|
||
hotkey: {
|
||
select: 'Navigate',
|
||
enter: 'Open',
|
||
cmdNumber: 'Jump to',
|
||
cmdEnter: 'Start chat',
|
||
esc: 'Close',
|
||
},
|
||
},
|
||
knowledgeSearch: {
|
||
title: 'Search',
|
||
subtitle: 'Semantic search across knowledge bases and chat history to find relevant content',
|
||
tabKnowledge: 'Knowledge',
|
||
tabMessages: 'Messages',
|
||
placeholder: 'Enter search query...',
|
||
messagePlaceholder: 'Search chat history...',
|
||
searchBtn: 'Search',
|
||
selectKb: 'Select Knowledge Base',
|
||
allKb: 'All Knowledge Bases',
|
||
noResults: 'No results found',
|
||
resultCount: '{count} results found',
|
||
score: 'Relevance',
|
||
matchType: 'Match Type',
|
||
matchTypeVector: 'Vector Match',
|
||
matchTypeKeyword: 'Keyword Match',
|
||
untitledSession: 'Untitled Session',
|
||
matchCount: 'matches',
|
||
emptyHint: 'Enter keywords to search for relevant content chunks in knowledge bases',
|
||
messageEmptyHint: 'Enter keywords to search chat history messages',
|
||
searching: 'Searching...',
|
||
source: 'Source',
|
||
chunk: 'chunks',
|
||
expand: 'Expand',
|
||
collapse: 'Collapse',
|
||
fileCount: 'files',
|
||
viewDetail: 'View Detail',
|
||
startChat: 'Start Chat',
|
||
chatWithFile: 'Chat',
|
||
newChatTitle: 'Search: {query}',
|
||
},
|
||
// ---- i18n keys for hardcoded Chinese extraction ----
|
||
tools: {
|
||
multiKbSearch: 'Cross-KB Search',
|
||
knowledgeSearch: 'Knowledge Search',
|
||
grepChunks: 'Text Pattern Search',
|
||
getChunkDetail: 'Get Chunk Detail',
|
||
listKnowledgeChunks: 'List Knowledge Chunks',
|
||
listKnowledgeBases: 'List Knowledge Bases',
|
||
getDocumentInfo: 'Get Document Info',
|
||
queryKnowledgeGraph: 'Query Knowledge Graph',
|
||
think: 'Deep Thinking',
|
||
todoWrite: 'Make Plan',
|
||
},
|
||
vectorStoreBadge: {
|
||
systemDefault: 'System default',
|
||
sharedFromOrg: 'Shared from another organization',
|
||
unknownStore: 'Unknown store',
|
||
unavailable: 'Unavailable',
|
||
},
|
||
kbSettings: {
|
||
vectorStore: {
|
||
title: 'Vector Store',
|
||
description:
|
||
'Choose which vector store this knowledge base writes to. The binding is permanent — to move an existing KB to a different store, create a new KB and re-index.',
|
||
loading: 'Loading vector stores...',
|
||
engineLabel: 'Vector store',
|
||
engineDesc:
|
||
'Pick a store from the global Vector Stores configuration, or leave as System default to use the tenant-wide RETRIEVE_DRIVER engine.',
|
||
boundLabel: 'Bound vector store',
|
||
systemDefault: 'System default',
|
||
immutableHint:
|
||
'Cannot be changed after creation. To migrate later, create a new KB bound to the desired store and re-index.',
|
||
immutableEdit: 'Vector store binding cannot be changed after creation.',
|
||
unavailableHint:
|
||
'The bound vector store is currently unavailable; check its connection configuration in Settings → Vector Stores.',
|
||
goGlobalSettings: 'Go to Vector Store Settings',
|
||
},
|
||
storage: {
|
||
title: 'Storage Engine',
|
||
description: 'Select the file storage engine. This affects how uploaded documents and images within documents are stored. Parameters are configured in global settings.',
|
||
loading: 'Loading...',
|
||
engineLabel: 'Storage Engine',
|
||
engineDesc: 'Select the storage engine for this knowledge base. The corresponding engine must be configured in global settings.',
|
||
selectPlaceholder: 'Select a storage engine',
|
||
notConfigured: 'Not Configured',
|
||
unavailable: 'Unavailable',
|
||
lockedHint: 'This knowledge base already has files. Cannot switch storage engine. To change, please clear all files first.',
|
||
changeWarning: 'Changing the storage engine only affects newly uploaded files. Existing files will still be read from the original storage engine, but some old files may become inaccessible if their paths cannot be automatically recognized.',
|
||
goGlobalSettings: 'Go to Global Settings',
|
||
engineLocal: 'Local Storage',
|
||
engineLocalDesc: 'For single-node deployment, simple and lightweight',
|
||
engineMinioDesc: 'S3 compatible, for private networks or private cloud',
|
||
engineCos: 'Tencent Cloud COS',
|
||
engineCosDesc: 'Public cloud deployment, supports CDN acceleration',
|
||
engineTos: 'Volcengine TOS',
|
||
engineTosDesc: 'Volcengine object storage, for public cloud deployment',
|
||
engineS3: 'AWS S3',
|
||
engineS3Desc: 'AWS S3 and compatible storage, for public cloud deployment',
|
||
engineOss: 'Alibaba Cloud OSS',
|
||
engineOssDesc: 'Alibaba Cloud Object Storage Service, for public cloud deployment',
|
||
engineKs3: 'Kingsoft Cloud KS3',
|
||
engineKs3Desc: 'Kingsoft Cloud Object Storage Service, for public cloud deployment',
|
||
engineObs: 'Huawei Cloud OBS',
|
||
engineObsDesc: 'Huawei Cloud Object Storage Service, for public cloud deployment',
|
||
},
|
||
parser: {
|
||
title: 'Parser Engine',
|
||
description: 'Select document parser engines for different file types. Unconfigured file types will use the built-in parser.',
|
||
loading: 'Loading...',
|
||
noEngineAvailable: 'No parser engine available, or the document parsing service is not configured.',
|
||
default: 'Default',
|
||
unavailable: 'Unavailable',
|
||
goSettings: 'Go to Settings →',
|
||
goConfig: 'Go to Config →',
|
||
noEngine: 'No available engine',
|
||
fileTypePdf: 'PDF Documents',
|
||
fileTypeWord: 'Word Documents',
|
||
fileTypePpt: 'Presentations',
|
||
fileTypeExcel: 'Excel Spreadsheets',
|
||
fileTypeCsv: 'CSV Files',
|
||
fileTypeText: 'Plain Text',
|
||
fileTypeJson: 'JSON Files',
|
||
fileTypeImage: 'Images',
|
||
fileTypeAudiovisual: 'Audio',
|
||
engines: {
|
||
builtin: {
|
||
name: 'Built-in',
|
||
desc: 'DocReader built-in parser engine (docx/pdf/xlsx and other complex formats)',
|
||
},
|
||
simple: {
|
||
name: 'Simple',
|
||
desc: 'Simple format & image parsing (no external service required)',
|
||
},
|
||
mineru: {
|
||
name: 'MinerU',
|
||
desc: 'MinerU self-hosted service',
|
||
},
|
||
mineru_cloud: {
|
||
name: 'MinerU Cloud',
|
||
desc: 'MinerU Cloud API',
|
||
},
|
||
paddleocr_vl: {
|
||
name: 'PaddleOCR-VL',
|
||
desc: 'PaddleOCR-VL self-hosted service',
|
||
},
|
||
paddleocr_vl_cloud: {
|
||
name: 'PaddleOCR-VL Cloud',
|
||
desc: 'PaddleOCR-VL Cloud API',
|
||
},
|
||
weknoracloud: {
|
||
name: 'WeKnora Cloud',
|
||
desc: 'Document parsing via WeKnora Cloud',
|
||
},
|
||
markitdown: {
|
||
name: 'MarkItDown',
|
||
desc: "Microsoft MarkItDown converter (PDF/Office/HTML and more)",
|
||
},
|
||
},
|
||
},
|
||
supportedFormats: 'Supported formats',
|
||
},
|
||
agentStream: {
|
||
toolApproval: {
|
||
banner: 'This MCP tool requires human approval. Review parameters before execution.',
|
||
service: 'Service',
|
||
tool: 'Tool',
|
||
argsLabel: 'Arguments',
|
||
argsModified: 'Modified',
|
||
countdown: 'About {seconds}s remaining',
|
||
approve: 'Approve & run',
|
||
reject: 'Reject',
|
||
approvedTag: 'Approved',
|
||
rejectedTag: 'Rejected',
|
||
invalidJson: 'Arguments must be valid JSON',
|
||
submitted: 'Submitted',
|
||
submitFailed: 'Submit failed',
|
||
userRejected: 'User rejected',
|
||
},
|
||
tools: {
|
||
searchKnowledge: 'Knowledge Search',
|
||
grepChunks: 'Text Pattern Search',
|
||
webSearch: 'Web Search',
|
||
webFetch: 'Web Fetch',
|
||
getDocumentInfo: 'Get Document Info',
|
||
listKnowledgeChunks: 'List Knowledge Chunks',
|
||
getRelatedDocuments: 'Find Related Documents',
|
||
getDocumentContent: 'Get Document Content',
|
||
todoWrite: 'Plan Management',
|
||
knowledgeGraphExtract: 'Knowledge Graph Extraction',
|
||
thinking: 'Thinking',
|
||
imageAnalysis: 'Image Analysis',
|
||
queryKnowledgeGraph: 'Knowledge Graph Query',
|
||
finalAnswer: 'Generate Answer',
|
||
readSkill: 'Read Skill',
|
||
executeSkillScript: 'Execute Skill Script',
|
||
dataAnalysis: 'Data Analysis',
|
||
dataSchema: 'Data Schema',
|
||
databaseQuery: 'Database Query',
|
||
},
|
||
summary: {
|
||
searchKb: 'Searched knowledge base <strong>{count}</strong> time(s)',
|
||
thinking: 'Thought <strong>{count}</strong> time(s)',
|
||
callTool: 'Called {name}',
|
||
callTools: 'Called tools {names}',
|
||
intermediateSteps: '<strong>{count}</strong> intermediate step(s)',
|
||
separator: ', ',
|
||
comma: ', ',
|
||
},
|
||
citation: {
|
||
loading: 'Loading...',
|
||
notFound: 'Content not found',
|
||
loadFailed: 'Failed to load',
|
||
chunkId: 'Chunk ID',
|
||
noKbForWiki: 'Unable to identify associated knowledge base. Cannot open Wiki.',
|
||
},
|
||
toolSummary: {
|
||
getDocument: 'Get document: {title}',
|
||
document: 'Document',
|
||
listChunks: 'View {title}',
|
||
deepThinking: 'Deep Thinking',
|
||
},
|
||
plan: {
|
||
inProgress: 'In Progress',
|
||
pending: 'Pending',
|
||
completed: 'Completed',
|
||
},
|
||
search: {
|
||
noResults: 'No matching content found',
|
||
foundResultsFromFiles: 'Found {count} result(s) from {files} file(s)',
|
||
foundResults: 'Found {count} result(s)',
|
||
webResults: 'Found {count} web search result(s)',
|
||
foundMatches: 'Found {count} match(es)',
|
||
showingCount: '(showing {count})',
|
||
},
|
||
toolStatus: {
|
||
calling: 'Calling {name}...',
|
||
searchKb: 'Searching knowledge base',
|
||
searchKbFailed: 'Knowledge base search failed',
|
||
webSearch: 'Web search',
|
||
webSearchFailed: 'Web search failed',
|
||
grepSearch: 'Keyword search',
|
||
grepSearchFailed: 'Keyword search failed',
|
||
getDocInfo: 'Getting document info',
|
||
getDocInfoFailed: 'Failed to get document info',
|
||
thinkingDone: 'Thinking complete',
|
||
thinkingFailed: 'Thinking failed',
|
||
updateTodos: 'Updating task list',
|
||
updateTodosFailed: 'Failed to update task list',
|
||
imageAnalyzing: 'Viewing image content...',
|
||
imageAnalysisDone: 'Image content viewed',
|
||
imageAnalysisFailed: 'Image viewing failed',
|
||
called: 'Called {name}',
|
||
calledFailed: 'Failed to call {name}',
|
||
},
|
||
copy: {
|
||
emptyContent: 'Current response is empty, cannot copy',
|
||
success: 'Copied to clipboard',
|
||
failed: 'Copy failed, please copy manually',
|
||
},
|
||
saveToKb: {
|
||
emptyContent: 'Current response is empty, cannot save to knowledge base',
|
||
editorOpened: 'Editor opened, please select a knowledge base and save',
|
||
},
|
||
},
|
||
agentEditor: {
|
||
builtinHint: 'This is a built-in agent. Name and description cannot be modified, but configuration parameters can be adjusted.',
|
||
placeholders: {
|
||
available: 'Available variables: ',
|
||
clickToInsert: '(click to insert)',
|
||
hint: "(click to insert, or type {'{{'} to show list)",
|
||
},
|
||
intentPrompts: {
|
||
title: 'Intent Prompts',
|
||
sectionDesc: 'Configure intent-specific system prompts; defaults apply when not customized',
|
||
intentLabel: 'Intent',
|
||
intentDescription: 'Select the intent-specific system prompt to edit',
|
||
promptPlaceholder: 'Enter a custom system prompt...',
|
||
customized: 'Customized',
|
||
empty: 'No intent templates available',
|
||
},
|
||
selection: {
|
||
all: 'All',
|
||
selected: 'Selected',
|
||
disabled: 'Disabled',
|
||
},
|
||
desc: {
|
||
name: 'Set an easily identifiable name for the agent',
|
||
description: 'Briefly describe the purpose and features of the agent',
|
||
systemPrompt: 'Custom system prompt to define the agent behavior and role',
|
||
leaveEmptyDefault: '(leave empty to use system default)',
|
||
contextTemplate: 'Define how retrieved content is formatted before passing to the model',
|
||
model: 'Select the LLM used by the agent',
|
||
temperature: 'Control output randomness, 0 is most deterministic, 1 is most random',
|
||
maxTokens: 'Maximum number of tokens for model-generated responses',
|
||
thinking: 'Enable extended thinking capability (requires model support)',
|
||
conversationSection: 'Configure multi-turn conversation and query rewriting parameters',
|
||
multiTurn: 'When enabled, historical conversation context will be preserved',
|
||
historyRounds: 'Number of recent conversation rounds to keep as context',
|
||
rewrite: 'Automatically rewrite user questions in multi-turn conversations to resolve references and omissions',
|
||
queryUnderstandModel: 'Model used for query understanding (rewriting and intent detection). Leave empty to reuse the main chat model.',
|
||
rewriteSystemPrompt: 'System prompt for question rewriting (leave empty for default)',
|
||
rewriteUserPrompt: 'User prompt template for question rewriting (leave empty for default)',
|
||
selectTools: 'Select tools available to the Agent',
|
||
maxIterations: 'Maximum reasoning steps when the Agent executes tasks',
|
||
kbScope: 'Select the scope of knowledge bases accessible to the agent',
|
||
webSearch: 'When enabled, the agent can search the internet for information',
|
||
webSearchProvider: 'Specify a search engine for this agent. Leave empty to use the default.',
|
||
webSearchMaxResults: 'Maximum number of results returned per search',
|
||
webFetchEnabled: 'After reranking, auto-fetch full page content from top web results for better answers',
|
||
webFetchTopN: 'Maximum number of web pages to fetch after reranking',
|
||
retrievalSection: 'Configure knowledge base retrieval and ranking parameters',
|
||
queryExpansion: 'Automatically expand query terms to improve recall',
|
||
embeddingTopK: 'Maximum number of results from vector retrieval',
|
||
keywordThreshold: 'Minimum relevance score for keyword retrieval',
|
||
vectorThreshold: 'Minimum similarity score for vector retrieval',
|
||
rerankTopK: 'Maximum number of results retained after reranking',
|
||
rerankThreshold: 'Minimum relevance score for reranking',
|
||
fallbackStrategy: 'How to handle when no relevant content is found in the knowledge base',
|
||
fallbackResponse: 'Fixed text returned when unable to answer',
|
||
fallbackPrompt: 'Prompt to guide model response when no answer is found in knowledge base',
|
||
},
|
||
tools: {
|
||
thinking: 'Thinking',
|
||
thinkingDesc: 'Dynamic and reflective problem-solving thinking tool',
|
||
todoWrite: 'Plan',
|
||
todoWriteDesc: 'Create structured research plans',
|
||
grepChunks: 'Keyword Search',
|
||
grepChunksDesc: 'Quickly locate documents and chunks containing specific keywords',
|
||
knowledgeSearch: 'Semantic Search',
|
||
knowledgeSearchDesc: 'Understand questions and find semantically relevant content',
|
||
listChunks: 'View Document Chunks',
|
||
listChunksDesc: 'Get complete chunk content of a document',
|
||
queryGraph: 'Query Knowledge Graph',
|
||
queryGraphDesc: 'Query relationships from knowledge graph',
|
||
getDocInfo: 'Get Document Info',
|
||
getDocInfoDesc: 'View document metadata',
|
||
dbQuery: 'Query Database',
|
||
dbQueryDesc: 'Query information from the database',
|
||
dataAnalysis: 'Data Analysis',
|
||
dataAnalysisDesc: 'Understand data files and perform data analysis',
|
||
dataSchema: 'View Data Schema',
|
||
dataSchemaDesc: 'Get metadata of tabular files',
|
||
requiresKb: '(requires knowledge base configuration)',
|
||
requiresRagKb: '(requires a KB with vector/keyword indexing enabled)',
|
||
requiresWikiKb: '(requires a Wiki-enabled knowledge base)',
|
||
// Wiki read tools
|
||
wikiSearch: 'Search Wiki',
|
||
wikiSearchDesc: 'Keyword / semantic search over Wiki pages',
|
||
wikiReadPage: 'Read Wiki Page',
|
||
wikiReadPageDesc: 'Read the full content of a specific Wiki page',
|
||
wikiReadSourceDoc: 'Deep-read Source Doc',
|
||
wikiReadSourceDocDesc: 'Dive into the original documents that a Wiki page is built from',
|
||
wikiFlagIssue: 'Flag Wiki Issue',
|
||
wikiFlagIssueDesc: 'Flag factual errors or merge conflicts on a Wiki page',
|
||
// Wiki write tools (destructive)
|
||
wikiWritePage: 'Create / Overwrite Wiki',
|
||
wikiWritePageDesc: 'Create a new page or fully overwrite an existing one',
|
||
wikiReplaceText: 'Replace Text in Wiki',
|
||
wikiReplaceTextDesc: 'Replace specific text in a Wiki page',
|
||
wikiRenamePage: 'Rename Wiki Page',
|
||
wikiRenamePageDesc: 'Rename a Wiki page and auto-update cross-links',
|
||
wikiDeletePage: 'Delete Wiki Page',
|
||
wikiDeletePageDesc: 'Delete a Wiki page and clean up dead links',
|
||
// Wiki issue tools
|
||
wikiReadIssue: 'View Wiki Issue',
|
||
wikiReadIssueDesc: 'View details of a Wiki page issue',
|
||
wikiUpdateIssue: 'Update Wiki Issue',
|
||
wikiUpdateIssueDesc: 'Update the status of a Wiki page issue',
|
||
// Runtime system-injected tools (preview only)
|
||
webSearch: 'Web Search',
|
||
webFetch: 'Web Fetch',
|
||
finalAnswer: 'Submit Final Answer',
|
||
// Groups
|
||
groupBase: 'Basic',
|
||
groupRag: 'Knowledge Retrieval (RAG)',
|
||
groupWikiRead: 'Wiki Read',
|
||
groupWikiEdit: 'Wiki Edit',
|
||
groupWikiIssue: 'Wiki Review',
|
||
groupData: 'Data Analysis',
|
||
writeWarning: 'Mutates Wiki content',
|
||
dangerTag: 'Write',
|
||
// Status bar
|
||
statusNoKb: 'No knowledge base is linked',
|
||
statusKb: 'In scope: {rag} RAG KBs · {wiki} Wiki KBs',
|
||
kbMetricRag: 'RAG KBs',
|
||
kbMetricWiki: 'Wiki KBs',
|
||
statusInactive: '{count} ticked tool(s) cannot take effect with the current config',
|
||
// Effective tools preview
|
||
effectiveLabel: 'Effective Tools',
|
||
effectiveDesc: 'Computed from the current config — these are the tools the agent will actually be able to call',
|
||
effectiveEmpty: 'No tool available — the agent will fall back to plain model chat',
|
||
},
|
||
im: {
|
||
title: 'IM Integration',
|
||
description: 'Connect agent to instant messaging platforms like WeCom, Feishu, Slack, Telegram, DingTalk, Mattermost and WeChat',
|
||
feishu: 'Feishu',
|
||
slack: 'Slack',
|
||
telegram: 'Telegram',
|
||
dingtalk: 'DingTalk',
|
||
mattermost: 'Mattermost',
|
||
wecom: 'WeCom',
|
||
wechat: 'WeChat',
|
||
addChannel: 'Add Channel',
|
||
editChannel: 'Edit Channel',
|
||
deleteConfirm: 'Are you sure you want to delete this channel? This action cannot be undone.',
|
||
channelName: 'Channel Name',
|
||
channelNamePlaceholder: 'Enter a name for easy identification',
|
||
platform: 'Platform',
|
||
mode: 'Connection Mode',
|
||
outputMode: 'Output Mode',
|
||
outputStream: 'Streaming',
|
||
outputFull: 'Full Response',
|
||
callbackUrl: 'Callback URL',
|
||
empty: 'No IM channels yet. Click the button below to add one.',
|
||
unnamed: 'Unnamed Channel',
|
||
docLink: 'Integration Guide',
|
||
feishuConsole: 'Feishu Open Platform',
|
||
slackConsole: 'Slack API Console',
|
||
telegramConsole: 'Telegram BotFather',
|
||
dingtalkConsole: 'DingTalk Open Platform',
|
||
dingtalkCardTemplateId: 'Card Template ID (optional)',
|
||
dingtalkCardTemplateIdHint: 'Create an AI Card template at open-dev.dingtalk.com/fe/card to enable streaming output with typewriter effect',
|
||
mattermostConsole: 'Mattermost integrations',
|
||
mattermostModeHint: 'Mattermost only supports Webhook mode (outgoing webhook + bot token).',
|
||
mattermostPostToMain: 'Post replies in channel timeline',
|
||
mattermostPostToMainHint:
|
||
'When on, bot replies are new top-level posts in the channel. When off (default), they stay in the thread and the main view only shows “N replies”.',
|
||
modeHint: 'WebSocket is recommended for easier setup',
|
||
consoleTip: 'to get credentials',
|
||
wecomWSEndpointHint: 'Optional. For private WeCom deployments, enter a custom WebSocket address. Leave empty to use the default public cloud endpoint. For internal network addresses, add the hostname to the SSRF_WHITELIST env var.',
|
||
wecomAPIBaseURLHint: 'Optional. For private WeCom deployments, enter a custom API base URL. Leave empty to use the default public cloud endpoint. For internal network addresses, add the hostname to the SSRF_WHITELIST env var.',
|
||
fileKnowledgeBase: 'File Storage Knowledge Base',
|
||
fileKnowledgeBasePlaceholder: 'Select a knowledge base (optional)',
|
||
fileKnowledgeBaseHint: 'When configured, files sent by users will be automatically saved to this knowledge base',
|
||
sessionMode: 'Session Mode',
|
||
sessionModeUser: 'Per User (default)',
|
||
sessionModeThread: 'Per Thread',
|
||
sessionModeHint: 'User mode: each person has their own conversation. Use /clear to start fresh. Thread mode: each message thread is a separate conversation. Multiple people can collaborate in the same thread.',
|
||
wechatScanBind: 'Scan to bind WeChat',
|
||
wechatScanning: 'Scan the QR code with WeChat',
|
||
wechatBindSuccess: 'WeChat bound successfully',
|
||
wechatRebind: 'Rebind',
|
||
wechatHint: 'Requires iOS WeChat 8.0.70+, direct messages only',
|
||
wechatQRExpired: 'QR code expired, please try again',
|
||
wechatBinding: 'Binding...',
|
||
},
|
||
agentType: {
|
||
label: 'Agent Type',
|
||
desc: 'Picking a preset auto-fills the system prompt, tool list and recommended KB scope.',
|
||
defaultNamePattern: 'My {label}',
|
||
kbMismatch: {
|
||
ragQa: 'RAG retrieval not enabled',
|
||
wikiQa: 'Wiki not enabled',
|
||
hybridRagWiki: 'No retrieval surface enabled',
|
||
dataAnalysis: 'Requires RAG (FAQ not supported)',
|
||
quickAnswer: 'Quick Answer mode requires RAG retrieval',
|
||
generic: 'Not compatible with current type',
|
||
},
|
||
kbIncompatibleWarn: '{count} selected KB(s) are not compatible with this type, please adjust manually.',
|
||
},
|
||
mcp: {
|
||
label: 'MCP Services',
|
||
desc: 'Select MCP services available to the Agent',
|
||
selectLabel: 'Select MCP Services',
|
||
selectDesc: 'Select MCP services to enable',
|
||
selectPlaceholder: 'Select MCP services',
|
||
},
|
||
llmCallTimeout: {
|
||
label: "LLM Call Timeout",
|
||
desc: "Maximum waiting time for a single LLM call (seconds). Call will be terminated if this time is exceeded",
|
||
hint: "Leave empty or 0 to use the default (120 seconds)",
|
||
placeholder: "Enter seconds, recommended range 60-1800",
|
||
},
|
||
imageUpload: {
|
||
navLabel: 'Multimodal',
|
||
sectionTitle: 'Multimodal Configuration',
|
||
sectionDesc: 'Configure image upload and vision-language model for multimodal conversations',
|
||
label: 'Image Upload',
|
||
desc: 'Allow users to upload images for multimodal Q&A in conversations',
|
||
vlmModel: 'VLM Model',
|
||
vlmModelDesc: 'Vision language model for image analysis',
|
||
vlmModelPlaceholder: 'Select VLM model',
|
||
vlmModelRequired: 'VLM model is required when image upload is enabled',
|
||
storageProvider: 'Image Storage',
|
||
storageProviderDesc: 'Storage engine for uploaded images. Leave empty to use system default',
|
||
storageProviderPlaceholder: 'Select storage engine',
|
||
storageDefault: 'System Default',
|
||
notConfigured: 'Not Configured',
|
||
goStorageSettings: 'Go to Storage Settings',
|
||
},
|
||
audioUpload: {
|
||
label: 'Audio Upload',
|
||
desc: 'When enabled, users can upload audio files in conversations. The system will automatically transcribe them using the ASR model.',
|
||
asrModel: 'ASR Model',
|
||
asrModelDesc: 'Speech recognition model for audio transcription. If not configured, audio files will be passed as placeholders.',
|
||
asrModelPlaceholder: 'Select ASR Model',
|
||
},
|
||
faq: {
|
||
title: 'FAQ Priority Strategy',
|
||
tooltip: 'When the knowledge base contains FAQ (Q&A pairs), enable this strategy to prioritize FAQ answers over regular documents',
|
||
enableLabel: 'Enable FAQ Priority',
|
||
enableDesc: 'FAQ answers will be prioritized over regular documents, improving response accuracy',
|
||
thresholdLabel: 'Direct Answer Threshold',
|
||
thresholdDesc: 'When the similarity between the question and FAQ exceeds this value, use the FAQ answer directly',
|
||
boostLabel: 'FAQ Score Boost',
|
||
boostDesc: 'Multiply FAQ relevance scores by this factor to rank them higher',
|
||
},
|
||
dataAnalysis: {
|
||
enableLabel: 'Enable Tabular Data Analysis',
|
||
enableDesc: 'When the retrieved chunks come from a CSV/Excel file, ask the LLM to generate a DuckDB SQL query before answering. This adds one extra LLM call and several seconds of latency, so only enable it when you actually need SQL-style analysis.',
|
||
},
|
||
fallback: {
|
||
fixed: 'Fixed Response',
|
||
model: 'Model Generated',
|
||
},
|
||
fileTypes: {
|
||
label: 'Supported File Types',
|
||
desc: 'Restrict selectable file types, leave empty to support all types',
|
||
allTypes: 'All Types',
|
||
pdf: 'PDF Documents',
|
||
word: 'Word Documents (.docx/.doc)',
|
||
textLabel: 'Text',
|
||
text: 'Plain Text Files (.txt)',
|
||
markdown: 'Markdown Documents',
|
||
csv: 'Comma-Separated Value Files',
|
||
excel: 'Excel Spreadsheets (.xlsx/.xls)',
|
||
imageLabel: 'Images',
|
||
image: 'Image Files (.jpg/.jpeg/.png)',
|
||
},
|
||
},
|
||
faqManager: {
|
||
import: {
|
||
recentResult: 'Recent Import Results',
|
||
totalData: 'Total Data',
|
||
success: 'Successful',
|
||
failed: 'Failed',
|
||
skipped: 'Skipped',
|
||
unit: 'record(s)',
|
||
downloadReasons: 'Download Reasons',
|
||
appendMode: 'Append Mode',
|
||
replaceMode: 'Replace Mode',
|
||
importing: 'Importing...',
|
||
importDone: 'Import Complete',
|
||
importFailed: 'Import Failed',
|
||
waiting: 'Waiting...',
|
||
importInProgress: 'Import is in progress, please wait for it to complete',
|
||
noFailedRecords: 'No failed records available for download',
|
||
},
|
||
retry: 'Retry',
|
||
},
|
||
mermaid: {
|
||
zoomIn: 'Zoom In',
|
||
zoomOut: 'Zoom Out',
|
||
reset: 'Reset',
|
||
download: 'Download Image',
|
||
close: 'Close',
|
||
downloading: 'Downloading...',
|
||
},
|
||
ollama: {
|
||
unknown: 'Unknown',
|
||
today: 'Today',
|
||
yesterday: 'Yesterday',
|
||
daysAgo: '{days} days ago',
|
||
},
|
||
datasource: {
|
||
title: 'Data Sources',
|
||
description: 'Configure external data sources to sync content into this knowledge base',
|
||
add: 'Add Data Source',
|
||
addFirst: 'Add your first data source',
|
||
empty: 'No data sources configured',
|
||
edit: 'Edit',
|
||
delete: 'Delete',
|
||
deleteConfirm: 'Delete this data source? Synced knowledge will not be removed.',
|
||
deleteSuccess: 'Data source deleted',
|
||
deleteFailed: 'Failed to delete',
|
||
syncNow: 'Sync Now',
|
||
syncTriggered: 'Sync task submitted',
|
||
syncFailed: 'Failed to trigger sync',
|
||
pause: 'Pause',
|
||
resume: 'Resume',
|
||
paused: 'Paused',
|
||
resumed: 'Resumed',
|
||
pauseFailed: 'Failed to pause',
|
||
logs: 'Logs',
|
||
lastSync: 'Last sync',
|
||
lastStatus: 'Result',
|
||
schedule: 'Schedule',
|
||
syncModeLabel: 'Sync mode',
|
||
syncMode: {
|
||
incremental: 'Incremental',
|
||
full: 'Full',
|
||
},
|
||
status: {
|
||
active: 'Connected',
|
||
paused: 'Paused',
|
||
error: 'Error',
|
||
},
|
||
createTitle: 'Add Data Source',
|
||
editTitle: 'Edit Data Source',
|
||
nameLabel: 'Name',
|
||
namePlaceholder: 'Enter data source name',
|
||
testConnection: 'Test Connection',
|
||
testSuccess: 'Connection successful',
|
||
testFailed: 'Connection failed',
|
||
connected: 'Connected',
|
||
connectionFailed: 'Connection failed',
|
||
isRequired: 'is required',
|
||
credentialsLabel: 'credentials',
|
||
resourceHint: 'Select the spaces or folders to sync',
|
||
untitled: 'Untitled',
|
||
resourceLoadFailed: 'Failed to load resources',
|
||
noResources: 'No wiki spaces found',
|
||
noResourcesDesc: 'The app needs wiki access via a group chat to fetch content',
|
||
noResourcesDesc_notion: 'The app needs Notion page access permissions to fetch content',
|
||
retryLoadResources: 'Retry',
|
||
guideStep1: 'Create a group chat in Feishu, then add your app as a bot in the group settings',
|
||
guideStep2: 'Open wiki "Settings" > "Member Settings" > "Add Member", search for the group chat and add it',
|
||
guideStep3: 'Ensure the group chat role is at least "Can Read", then come back and click Retry',
|
||
guideStep1_notion: 'Open the page or database you want to sync in Notion',
|
||
guideStep2_notion: 'Click the "···" menu at the top right, select "Connect to" or "Add connections"',
|
||
guideStep3_notion: 'Search and select your Integration app, then come back and click Retry',
|
||
permissionDocLink: 'View Feishu wiki permission docs',
|
||
syncScheduleLabel: 'Sync schedule',
|
||
conflictLabel: 'Conflict strategy',
|
||
conflict: {
|
||
overwrite: 'Overwrite',
|
||
skip: 'Skip existing',
|
||
},
|
||
syncDeletions: 'Sync deletions (remove knowledge when deleted at source)',
|
||
createAndSync: 'Create & Sync Now',
|
||
createSuccess: 'Data source created',
|
||
createAndSyncSuccess: 'Data source created and sync task submitted',
|
||
createButSyncFailed: 'Data source created, but failed to trigger sync',
|
||
updateSuccess: 'Data source updated',
|
||
saveFailed: 'Failed to save',
|
||
step: {
|
||
selectType: 'Select Type',
|
||
credentials: 'Credentials',
|
||
resources: 'Resources',
|
||
strategy: 'Strategy',
|
||
},
|
||
syncHistory: 'Sync History',
|
||
refreshLogs: 'Refresh logs',
|
||
noLogs: 'No sync records yet',
|
||
logStatus: {
|
||
running: 'Syncing',
|
||
success: 'Success',
|
||
partial: 'Partial',
|
||
failed: 'Failed',
|
||
canceled: 'Canceled',
|
||
},
|
||
logMetric: {
|
||
total: 'Total',
|
||
created: 'created',
|
||
updated: 'updated',
|
||
deleted: 'deleted',
|
||
skipped: 'skipped',
|
||
failed: 'failed',
|
||
},
|
||
logSummary: {
|
||
total: 'Runs',
|
||
success: 'Success',
|
||
failed: 'Failed',
|
||
items: 'Items',
|
||
},
|
||
logLatest: 'Latest',
|
||
logDetail: {
|
||
startTime: 'Started',
|
||
endTime: 'Finished',
|
||
duration: 'Duration',
|
||
},
|
||
connector: {
|
||
feishu: 'Feishu',
|
||
notion: 'Notion',
|
||
yuque: 'Yuque',
|
||
},
|
||
connectorDesc: {
|
||
feishu: 'Sync documents, spreadsheets and files from Feishu Wiki',
|
||
notion: 'Sync pages and databases from Notion',
|
||
yuque: 'Sync documents from Yuque knowledge bases',
|
||
},
|
||
field: {
|
||
appId: 'App ID',
|
||
appSecret: 'App Secret',
|
||
integrationToken: 'Integration Token',
|
||
apiToken: 'API Token',
|
||
baseUrl: 'Base URL (optional)',
|
||
baseUrlHint: 'Leave empty to use the Yuque public cloud (https://www.yuque.com). For Yuque Enterprise or self-hosted deployments, enter your company domain (e.g. https://your-company.yuque.com).',
|
||
},
|
||
comingSoon: 'Coming soon',
|
||
docHint: 'Get credentials at:',
|
||
copyUrl: 'Copy URL',
|
||
copied: 'Copied',
|
||
pleaseTestFirst: 'Please test connection first',
|
||
prereqTitle: 'Complete these steps before connecting (all required)',
|
||
prereqBarText: 'First time? Click to see Feishu app setup guide',
|
||
prereqBarText_yuque: 'First time? Click to see the Yuque token setup guide',
|
||
prereqStep1Brief_yuque: 'Create a Yuque personal token',
|
||
prereqStep1Desc_yuque: 'Sign in to Yuque → avatar → Settings → Token → New Token',
|
||
prereqStep2Brief_yuque: 'Grant the token required permissions',
|
||
prereqStep2Desc_yuque: 'Check at least repo:read and doc:read (read knowledge base and document content)',
|
||
prereqStep3Brief_yuque: '(Optional) Enter Base URL for enterprise deployments',
|
||
prereqStep3Desc_yuque: 'Leave empty for public cloud; for Yuque Enterprise or self-hosted, enter your company domain.',
|
||
prereqOpenConsole_yuque: 'Open Yuque Token settings',
|
||
prereqBotBrief: 'Add "Bot" capability to your app',
|
||
prereqBotDesc: 'Open Platform > Add App Capability > Bot > create version and publish',
|
||
prereqBotLabel: '1. Add "Bot" capability to your app (otherwise the app won\'t appear in wiki member search):',
|
||
prereqBotStep1: 'Open your app in Feishu Open Platform, click "Add App Capability" in the left menu',
|
||
prereqBotStep2: 'Select "Bot" and confirm',
|
||
prereqBotStep3: 'Create a new version and publish (or test in your test organization)',
|
||
prereqPermBrief: 'Grant API permissions',
|
||
prereqPermLabel: '2. Grant these API permissions:',
|
||
prereqOpenConsole: 'Open Feishu Developer Console',
|
||
prereqMemberBrief: 'Add app to wiki via group chat',
|
||
prereqMemberDesc: 'Create group chat > add app as bot > add group chat as wiki member',
|
||
prereqMemberLabel: '3. Add the app to a wiki space via group chat (wiki cannot search for apps directly):',
|
||
back: 'Back',
|
||
next: 'Next',
|
||
save: 'Save',
|
||
schedule30min: 'Every 30 min',
|
||
schedule1h: 'Every hour',
|
||
schedule6h: 'Every 6 hours',
|
||
schedule12h: 'Every 12 hours',
|
||
schedule24h: 'Daily',
|
||
scheduleHuman: {
|
||
'30min': 'Every 30 min',
|
||
'1h': 'Hourly',
|
||
'6h': 'Every 6 hours',
|
||
'12h': 'Every 12 hours',
|
||
'24h': 'Daily',
|
||
},
|
||
addCard: 'Add Data Source',
|
||
wikiSpace: 'Wiki Space',
|
||
resourceType: {
|
||
wikiSpace: 'Wiki Space',
|
||
docCategory: 'Document Category',
|
||
book: 'Yuque Book',
|
||
},
|
||
neverSynced: 'Never synced',
|
||
justNow: 'Just now',
|
||
minutesAgo: '{n}m ago',
|
||
hoursAgo: '{n}h ago',
|
||
daysAgo: '{n}d ago',
|
||
syncResultCreated: '+{n}',
|
||
syncResultUpdated: '~{n}',
|
||
syncResultDeleted: '-{n}',
|
||
moreActions: 'More',
|
||
},
|
||
imOverview: {
|
||
menuTitle: 'Connected IMs',
|
||
pageTitle: 'Connected IMs',
|
||
subtitle: 'All IM channels connected to agents in this tenant — toggle state or jump to the owning agent',
|
||
totalCount: '{count} total',
|
||
empty: 'This tenant has no IM bots configured yet',
|
||
loadFailed: 'Failed to load IM bots',
|
||
builtinAgent: 'Built-in agent',
|
||
liveIndicator: 'IM channels are live',
|
||
detailsTitle: 'IM Bot Details',
|
||
gotoAgentEditor: 'Open in agent editor',
|
||
outputMode: 'Output mode',
|
||
sessionMode: 'Session mode',
|
||
updatedAt: 'Updated at',
|
||
channelId: 'Channel ID',
|
||
columns: {
|
||
platform: 'Platform',
|
||
name: 'Name',
|
||
agent: 'Agent',
|
||
mode: 'Mode',
|
||
enabled: 'Enabled',
|
||
botIdentity: 'Bot identity',
|
||
createdAt: 'Created at',
|
||
},
|
||
},
|
||
// Shared credential resource UI (CredentialResource.vue). Keep keys
|
||
// generic so the same component can drive MCP / Model / WebSearch /
|
||
// DataSource credential surfaces without per-resource overrides.
|
||
credential: {
|
||
configured: 'Configured',
|
||
unconfigured: 'Not configured',
|
||
configure: 'Configure',
|
||
update: 'Replace',
|
||
remove: 'Remove',
|
||
inputPlaceholder: 'Enter value',
|
||
savedToast: 'Credential saved',
|
||
saveFailed: 'Failed to save credential',
|
||
removedToast: 'Credential removed',
|
||
removeFailed: 'Failed to remove credential',
|
||
confirmRemovePrompt: 'Remove this credential? This cannot be undone.',
|
||
confirmRemove: 'Confirm remove',
|
||
confirmRemoveTitle: 'Remove {field}?',
|
||
confirmRemoveBody:
|
||
'This permanently deletes the stored credential. Integrations using it will stop working until you configure a new value.',
|
||
},
|
||
userProfile: {
|
||
title: 'User Profile',
|
||
description: 'View your account info (user ID, username, email, registration time).',
|
||
},
|
||
tenantMember: {
|
||
title: 'Members',
|
||
sectionDescription: 'Invite teammates to the tenant and manage their roles. Only Owner can add or remove members.',
|
||
learnRbacGuide: 'Learn about RBAC',
|
||
totalCount: '{n} members',
|
||
listTitle: 'Workspace members',
|
||
filterMatched: '{n} matched',
|
||
loading: 'Loading members…',
|
||
retry: 'Retry',
|
||
empty: 'No members yet. Invite a teammate to get started.',
|
||
emptySearch: 'No members match "{q}".',
|
||
searchPlaceholder: 'Search by name or email',
|
||
permissions: {
|
||
title: 'Role permissions',
|
||
desc: 'What each role can do inside this tenant. Server-enforced; UI controls reflect the rules but are not the source of truth.',
|
||
iconHint: 'Hover to view role permission details',
|
||
manageMembers: 'Manage members',
|
||
manageTenantConfig: 'Edit tenant settings',
|
||
manageInfra: 'Configure models / vector stores / IM channels',
|
||
createOwnKB: 'Create and edit own KBs and agents',
|
||
readAll: 'Read tenant content',
|
||
},
|
||
columns: {
|
||
member: 'Name & email',
|
||
username: 'Name',
|
||
email: 'Email',
|
||
role: 'Role',
|
||
joinedAt: 'Joined',
|
||
operations: 'Actions',
|
||
},
|
||
role: {
|
||
owner: 'Owner',
|
||
admin: 'Admin',
|
||
contributor: 'Contributor',
|
||
viewer: 'Viewer',
|
||
},
|
||
add: {
|
||
button: 'Add Member',
|
||
dialogTitle: 'Invite Member',
|
||
emailLabel: 'Email',
|
||
emailPlaceholder: "invitee{'@'}example.com",
|
||
roleLabel: 'Role',
|
||
submit: 'Invite',
|
||
success: 'Member added',
|
||
},
|
||
remove: {
|
||
button: 'Remove',
|
||
confirmTitle: 'Remove member?',
|
||
confirmBody: 'Are you sure you want to remove {name} from this tenant? They will lose access immediately.',
|
||
confirm: 'Remove',
|
||
success: 'Member removed',
|
||
},
|
||
leave: {
|
||
button: 'Leave Tenant',
|
||
confirmTitle: 'Leave this tenant?',
|
||
confirmBody: 'You will lose access to all knowledge bases and agents in this tenant. You can be re-invited later.',
|
||
confirm: 'Leave',
|
||
success: 'You have left the tenant',
|
||
},
|
||
roleChange: {
|
||
success: 'Role updated',
|
||
},
|
||
errors: {
|
||
emailRequired: 'Email is required',
|
||
emailFormat: 'Invalid email address',
|
||
roleRequired: 'Role is required',
|
||
userNotFound: 'No registered user with this email. Ask them to sign up first.',
|
||
alreadyMember: 'This user is already a member of the tenant.',
|
||
lastOwner: 'Cannot demote, remove, or leave as the last Owner. Promote another member to Owner first.',
|
||
notFound: 'Membership not found.',
|
||
noTenant: 'No active tenant.',
|
||
invalidRole: 'Role must be one of owner / admin / contributor / viewer.',
|
||
generic: 'Something went wrong. Please try again.',
|
||
},
|
||
tabs: {
|
||
members: 'Members',
|
||
audit: 'Audit log',
|
||
},
|
||
audit: {
|
||
tabLabel: 'Audit log',
|
||
description:
|
||
'Records every membership change and access denial in this tenant. Newest first. Repeated denials within a minute are deduplicated.',
|
||
refresh: 'Refresh',
|
||
loadMore: 'Load older',
|
||
end: 'End of log.',
|
||
empty: 'No audit events yet.',
|
||
forbidden: 'You do not have permission to view the audit log.',
|
||
systemActor: 'System',
|
||
requiredRole: 'Required role: {role}',
|
||
columns: {
|
||
time: 'Time',
|
||
actor: 'Actor',
|
||
action: 'Action',
|
||
target: 'Target',
|
||
path: 'Request',
|
||
outcome: 'Outcome',
|
||
},
|
||
action: {
|
||
'rbac.member_added': 'Member added',
|
||
'rbac.member_removed': 'Member removed',
|
||
'rbac.member_role_changed': 'Role changed',
|
||
'rbac.member_left': 'Member left',
|
||
'rbac.access_denied': 'Access denied',
|
||
'rbac.invitation_sent': 'Invitation sent',
|
||
'rbac.invitation_accepted': 'Invitation accepted',
|
||
'rbac.invitation_declined': 'Invitation declined',
|
||
'rbac.invitation_revoked': 'Invitation revoked',
|
||
'rbac.invitation_expired': 'Invitation expired',
|
||
},
|
||
outcome: {
|
||
success: 'Success',
|
||
denied: 'Denied',
|
||
},
|
||
expanded: {
|
||
actorId: 'Actor ID',
|
||
targetUserId: 'Target user ID',
|
||
targetType: 'Target type',
|
||
targetId: 'Target ID',
|
||
details: 'Raw details',
|
||
},
|
||
},
|
||
},
|
||
tenantInvitation: {
|
||
inboxTooltip: 'View pending invitations',
|
||
pendingSectionTitle: 'Pending invitations',
|
||
pendingSectionCount: '{n}',
|
||
pendingSectionDesc:
|
||
'Awaiting the invitee to accept in their inbox. Auto-expires after {days} days.',
|
||
pendingEmpty: 'No pending invitations.',
|
||
inviteSubmit: 'Send invitation',
|
||
inviteSuccess: 'Invitation sent. Waiting for the invitee to accept.',
|
||
confirmInviteTitle: 'Send invitation?',
|
||
confirmInviteBody:
|
||
'Send an invitation to {email} (role: {role}). They will join the tenant only after accepting.',
|
||
confirmSend: 'Send',
|
||
copyLink: 'Copy invite link',
|
||
copied: 'Copied to clipboard',
|
||
copyFailed: 'Copy failed; please select the text manually',
|
||
shareLink: {
|
||
button: 'Generate share link',
|
||
label: 'Share link',
|
||
cellTitle: 'Invite via link',
|
||
cellAccepted: '{count} joined',
|
||
cellEmpty: 'No one has joined yet',
|
||
dialogTitle: 'Generate share invitation link',
|
||
description:
|
||
"Generate a multi-use registration link you can drop in a group chat. Anyone who opens it registers with their own email and joins this workspace. Expires in {days} days, or revoke it any time from the list.",
|
||
generate: 'Generate link',
|
||
resultTitle: 'Invitation link ready',
|
||
resultBody: "Copy the link below and share it via any private channel. It's also saved in the list — you can re-copy or revoke it later.",
|
||
revokeConfirm: "Revoking will block anyone who hasn't registered yet from using this link. Generate a new one to re-share.",
|
||
},
|
||
revoke: {
|
||
button: 'Revoke',
|
||
confirmTitle: 'Revoke invitation?',
|
||
confirmBody:
|
||
"After revoke, {email} can no longer accept this invitation. You can send a new one if needed.",
|
||
confirm: 'Revoke',
|
||
success: 'Invitation revoked.',
|
||
},
|
||
columns: {
|
||
invitee: 'Invitee',
|
||
role: 'Role',
|
||
inviter: 'Inviter',
|
||
expiresAt: 'Expires',
|
||
status: 'Status',
|
||
operations: 'Actions',
|
||
},
|
||
status: {
|
||
pending: 'Pending',
|
||
shareLinkActive: 'Active',
|
||
accepted: 'Accepted',
|
||
declined: 'Declined',
|
||
revoked: 'Revoked',
|
||
expired: 'Expired',
|
||
},
|
||
myInbox: {
|
||
title: 'My invitations',
|
||
description:
|
||
'Invitations from other tenants. Accept to join with the assigned role.',
|
||
empty: 'No pending invitations.',
|
||
acceptButton: 'Accept',
|
||
declineButton: 'Decline',
|
||
acceptSuccess: 'Joined "{tenant}".',
|
||
declineSuccess: 'Invitation declined.',
|
||
from: 'From',
|
||
tenantLabel: 'Tenant',
|
||
expiresIn: 'Expires: {date}',
|
||
messageLabel: 'Message',
|
||
gotoLink: 'Open inbox',
|
||
},
|
||
errors: {
|
||
pendingExists: 'A pending invitation for this user already exists.',
|
||
alreadyMember: 'This user is already an active member of the tenant.',
|
||
notPending: 'The invitation is no longer pending.',
|
||
expired: 'The invitation has expired.',
|
||
forbidden: 'Only the invitee can accept or decline this invitation.',
|
||
notFound: 'Invitation not found or already withdrawn.',
|
||
generic: 'Something went wrong. Please try again.',
|
||
},
|
||
},
|
||
}
|