From d8995e996dc2a88576111ac78c1bc61a9b554242 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Mon, 20 Jan 2025 11:28:53 +0800 Subject: [PATCH] feat: support i18n --- .../lang/en_US/views/application-workflow.ts | 273 +++++++++++++++++ .../locales/lang/en_US/views/application.ts | 2 +- ui/src/locales/lang/en_US/views/document.ts | 157 ++++++++++ ui/src/locales/lang/en_US/views/index.ts | 45 +-- ui/src/locales/lang/en_US/views/log.ts | 42 +++ ui/src/locales/lang/en_US/views/paragraph.ts | 36 +++ ui/src/locales/lang/en_US/views/problem.ts | 37 +++ .../lang/zh_CN/views/application-workflow.ts | 2 +- .../locales/lang/zh_CN/views/application.ts | 2 +- .../lang/zh_TW/views/application-workflow.ts | 274 ++++++++++++++++++ .../locales/lang/zh_TW/views/application.ts | 2 +- ui/src/locales/lang/zh_TW/views/document.ts | 158 ++++++++++ ui/src/locales/lang/zh_TW/views/index.ts | 45 +-- ui/src/locales/lang/zh_TW/views/log.ts | 42 +++ ui/src/locales/lang/zh_TW/views/paragraph.ts | 36 +++ ui/src/locales/lang/zh_TW/views/problem.ts | 37 +++ .../views/application/ApplicationSetting.vue | 2 +- ui/src/workflow/common/app-node.ts | 2 +- 18 files changed, 1154 insertions(+), 40 deletions(-) create mode 100644 ui/src/locales/lang/en_US/views/application-workflow.ts create mode 100644 ui/src/locales/lang/en_US/views/document.ts create mode 100644 ui/src/locales/lang/en_US/views/log.ts create mode 100644 ui/src/locales/lang/en_US/views/paragraph.ts create mode 100644 ui/src/locales/lang/en_US/views/problem.ts create mode 100644 ui/src/locales/lang/zh_TW/views/application-workflow.ts create mode 100644 ui/src/locales/lang/zh_TW/views/document.ts create mode 100644 ui/src/locales/lang/zh_TW/views/log.ts create mode 100644 ui/src/locales/lang/zh_TW/views/paragraph.ts create mode 100644 ui/src/locales/lang/zh_TW/views/problem.ts diff --git a/ui/src/locales/lang/en_US/views/application-workflow.ts b/ui/src/locales/lang/en_US/views/application-workflow.ts new file mode 100644 index 000000000..2f3773ba7 --- /dev/null +++ b/ui/src/locales/lang/en_US/views/application-workflow.ts @@ -0,0 +1,273 @@ +export default { + node: 'Node', + baseComponent: 'Base Component', + nodeSetting: 'Node Setting', + workflow: 'Workflow', + searchBar: { + placeholder: 'Search by name' + }, + info: { + previewVersion: 'Preview Version:', + saveTime: 'Save Time:' + }, + setting: { + restoreVersion: 'Restore Version', + restoreCurrentVersion: 'Restore This Version', + addComponent: 'Add Component', + public: 'Publish', + releaseHistory: 'Release History', + autoSave: 'Auto Save', + latestRelease: 'Latest Release', + copyParam: 'Copy Parameter' + }, + tip: { + publicSuccess: 'Published Successfully', + noData: 'No related results found', + nameMessage: 'Name cannot be empty!', + onlyRight: 'Only allow connections from the right anchor point', + notRecyclable: 'Cannot create a loop connection', + onlyLeft: 'Only allow connections to the left anchor point', + applicationNodeError: 'This application is unavailable', + functionNodeError: 'This function is unavailable', + repeatedNodeError: 'Node name already exists!', + cannotCopy: 'Cannot be copied', + copyError: 'Node has been copied', + paramErrorMessage: 'Parameter already exists: ' + }, + delete: { + confirmTitle: 'Confirm to delete this node?', + deleteMessage: 'Node cannot be deleted' + }, + control: { + zoomOut: 'Zoom Out', + zoomIn: 'Zoom In', + fitView: 'Fit View', + retract: 'Collapse All Nodes', + extend: 'Expand All Nodes', + beautify: 'One-click Beautification' + }, + variable: { + global: 'Global Variable', + Referencing: 'Reference Variable', + ReferencingRequired: 'Reference Variable Required', + ReferencingError: 'Reference Variable Error', + NoReferencing: 'Non-existent Reference Variable', + fieldMessage: 'Please select a variable' + }, + condition: { + title: 'Execution Condition', + front: 'Precondition', + AND: 'All', + OR: 'Any', + text: 'After the connected node is executed, execute the current node' + }, + validate: { + startNodeRequired: 'Start Node Required', + startNodeOnly: 'There can only be one Start Node', + baseNodeRequired: 'Base Info Node Required', + baseNodeOnly: 'There can only be one Base Info Node', + notInWorkFlowNode: 'Node not in workflow', + noNextNode: 'Non-existent next node', + nodeUnavailable: 'Node unavailable', + needConnect1: 'The branch of the node needs to be connected', + cannotEndNode: 'Node cannot be used as an end node' + }, + nodes: { + startNode: { + label: 'Start', + question: 'User Question', + currentTime: 'Current Time' + }, + baseNode: { + label: 'Base Info', + fileUpload: { + label: 'File Upload', + tooltip: 'When enabled, the Q&A page will display a file upload button.' + }, + FileUploadSetting: { + title: 'File Upload Settings', + maxFiles: 'Maximum number of files per upload', + fileLimit: 'Maximum size per file (MB)', + fileUploadType: { + label: 'File types allowed for upload', + documentText: 'Requires "Document Content Extraction" node to parse document content', + imageText: 'Requires "Image Understanding" node to parse image content', + audioText: 'Requires "Speech-to-Text" node to parse audio content' + } + } + }, + aiChatNode: { + label: 'AI Chat', + text: 'Chat with AI large model', + answer: 'AI Answer Content', + returnContent: { + label: 'Return Content', + tooltip: `If turned off, the content of this node will not be output to the user. + If you want the user to see the output of this node, please turn on the switch.` + }, + defaultPrompt: `Known Information: +{{knowledgeBaseSearch.data}} +Question: +{{start.question}}` + }, + searchDatasetNode: { + label: 'Knowledge Base Search', + text: 'Associate knowledge base and find relevant segments', + paragraph_list: 'List of retrieved paragraphs', + is_hit_handling_method_list: 'List of segments that meet direct response criteria', + result: 'Search Result', + directly_return: 'Content of segments that meet direct response criteria', + selectDatasetText: 'Associated knowledge base displayed here', + searchParam: 'Search Parameters', + searchQuestion: { + label: 'Search Question', + placeholder: 'Please select a search question', + requiredMessage: 'Please select a search question' + } + }, + questionNode: { + label: 'Question Optimization', + text: 'Optimize and improve the current question based on historical chat records to better match knowledge base segments', + result: 'Optimized Question Result', + defaultPrompt: `Optimize and improve the user's question based on context: {{start.question}} +Please output an optimized question.`, + systemDefault: 'You are a question optimization expert' + }, + conditionNode: { + label: 'Conditional Branch', + text: 'Execute different nodes based on different conditions', + branch_name: 'Branch Name', + conditions: { + label: 'Conditions', + info: 'Meets the following', + requiredMessage: 'Please select conditions' + }, + valueMessage: 'Please enter a value', + addCondition: 'Add Condition', + addBranch: 'Add Branch' + }, + replyNode: { + label: 'Specified Reply', + text: 'Specify reply content, referenced variables will be converted to strings for output', + content: 'Content', + replyContent: { + label: 'Reply Content', + custom: 'Custom', + reference: 'Reference Variable' + } + }, + rerankerNode: { + label: 'Multi-path Recall', + text: 'Use re-ranking model to perform secondary recall on retrieval results from multiple knowledge bases', + result_list: 'Re-ranked Results List', + result: 'Re-ranking Result', + rerankerContent: { + label: 'Re-ranking Content', + requiredMessage: 'Please select re-ranking content' + }, + higher: 'Higher', + ScoreTooltip: 'The higher the Score, the stronger the relevance.', + max_paragraph_char_number: 'Maximum number of characters to quote', + reranker_model: { + label: 'Re-ranking Model', + placeholder: 'Please select a re-ranking model' + } + }, + formNode: { + label: 'Form Collection', + text: 'Used to collect user information during Q&A process, subsequent processes can be executed based on collected form data', + form_content_format: `Hello, please fill out the form below: +{{form}} +Click the [Submit] button after filling it out.`, + form_data: 'All Form Content', + formContent: { + label: 'Form Output Content', + requiredMessage: 'Please set the output content of this node, { form } is a placeholder for the form.', + tooltip: 'Set the content output by executing this node, { form } is a placeholder for the form.' + }, + formAllContent: 'All Form Content', + formSetting: 'Form Configuration' + }, + documentExtractNode: { + label: 'Document Content Extraction', + text: 'Extract content from documents', + content: 'Document Content' + }, + imageUnderstandNode: { + label: 'Image Understanding', + text: 'Identify objects, scenes, etc., in images to answer user questions', + answer: 'AI Answer Content', + model: { + label: 'Image Understanding Model', + requiredMessage: 'Please select an image understanding model' + }, + image: { + label: 'Select Image', + requiredMessage: 'Please select an image' + } + }, + imageGenerateNode: { + label: 'Image Generation', + text: 'Generate images based on provided text content', + answer: 'AI Answer Content', + model: { + label: 'Image Generation Model', + requiredMessage: 'Please select an image generation model' + }, + prompt: { + label: 'Positive Prompt', + tooltip: 'Positive prompt words, used to describe elements and visual features expected in the generated image' + }, + negative_prompt: { + label: 'Negative Prompt', + tooltip: 'Negative prompt words, used to describe content that should not appear in the image, which can limit the image.', + placeholder: 'Please describe content you do not want to generate, such as color, bloody content' + } + }, + speechToTextNode: { + label: 'Speech-to-Text', + text: 'Convert audio to text through speech recognition model', + stt_model: { + label: 'Speech Recognition Model' + }, + audio: { + label: 'Select Audio File', + placeholder: 'Please select an audio file' + } + }, + textToSpeechNode: { + label: 'Text-to-Speech', + text: 'Convert text to audio through speech synthesis model', + tts_model: { + label: 'Speech Synthesis Model' + }, + content: { + label: 'Select Text Content' + } + }, + functionNode: { + label: 'Custom Function', + text: 'Execute custom scripts to achieve data processing' + }, + applicationNode: { + label: 'Application Node' + } + }, + compare: { + is_null: 'Is Null', + is_not_null: 'Is Not Null', + contain: 'Contains', + not_contain: 'Does Not Contain', + eq: 'Equals', + ge: 'Greater Than or Equal To', + gt: 'Greater Than', + le: 'Less Than or Equal To', + lt: 'Less Than', + len_eq: 'Length Equals', + len_ge: 'Length Greater Than or Equal To', + len_gt: 'Length Greater Than', + len_le: 'Length Less Than or Equal To', + len_lt: 'Length Less Than' + }, + FileUploadSetting: {} +} diff --git a/ui/src/locales/lang/en_US/views/application.ts b/ui/src/locales/lang/en_US/views/application.ts index 40aed31ed..649f94045 100644 --- a/ui/src/locales/lang/en_US/views/application.ts +++ b/ui/src/locales/lang/en_US/views/application.ts @@ -28,7 +28,7 @@ export default { applicationForm: { title: { info: 'Application Information', - apptest: 'Debug Preview', + appTest: 'Debug Preview', copy: 'copy' }, form: { diff --git a/ui/src/locales/lang/en_US/views/document.ts b/ui/src/locales/lang/en_US/views/document.ts new file mode 100644 index 000000000..df417c18a --- /dev/null +++ b/ui/src/locales/lang/en_US/views/document.ts @@ -0,0 +1,157 @@ +export default { + uploadDocument: 'Upload Document', + importDocument: 'Import Document', + syncDocument: 'Sync Document', + selected: 'Selected', + items: 'Items', + searchBar: { + placeholder: 'Search by Document Name' + }, + setting: { + migration: 'Migration', + generateQuestion: 'Generate Questions', + cancelGenerateQuestion: 'Cancel Generating Questions', + cancelVectorization: 'Cancel Vectorization', + cancelGenerate: 'Cancel Generation' + }, + tip: { + saveMessage: 'Current changes have not been saved. Confirm exit?', + cancelSuccess: 'Batch cancellation successful', + sendMessage: 'Sent successfully', + vectorizationSuccess: 'Batch vectorization successful', + nameMessage: 'File name cannot be empty!', + importMessage: 'Import successful', + migrationSuccess: 'Migration successful' + }, + upload: { + selectFile: 'Select File', + selectFiles: 'Select Folder', + uploadMessage: 'Drag and drop files here to upload or', + formats: 'Supported formats:', + requiredMessage: 'Please upload a file', + errorMessage1: 'Please upload a file', + errorMessage2: 'Unsupported file format', + errorMessage3: 'File cannot be empty', + errorMessage4: 'Up to 50 files can be uploaded at once', + template: 'Template', + download: 'Download' + }, + + fileType: { + txt: { + label: 'Text File', + tip1: '1. It is recommended to standardize the paragraph markers in the file before uploading.', + tip2: '2. Up to 50 files can be uploaded at once, with each file not exceeding 100MB' + }, + table: { + label: 'Table', + tip1: '1. Click to download the corresponding template and complete the information:', + tip2: '2. The first row must be column headers, and the column headers must be meaningful terms. Each record in the table will be treated as a segment.', + tip3: '3. Each sheet in the uploaded spreadsheet file will be treated as a document, with the sheet name as the document name.', + tip4: '4. Up to 50 files can be uploaded at once, with each file not exceeding 100MB' + }, + QA: { + label: 'QA Pairs', + tip1: '1. Click to download the corresponding template and complete the information.', + tip2: '2. Each sheet in the uploaded spreadsheet file will be treated as a document, with the sheet name as the document name.', + tip3: '3. Up to 50 files can be uploaded at once, with each file not exceeding 100MB' + } + }, + setRules: { + title: { + setting: 'Set Segment Rules', + preview: 'Segment Preview' + }, + intelligent: { + label: 'Intelligent Segmentation (Recommended)', + text: 'If you are unsure how to set segmentation rules, it is recommended to use intelligent segmentation.' + }, + advanced: { + label: 'Advanced Segmentation', + text: 'Users can customize segmentation delimiters, segment length, and cleaning rules based on document standards.' + }, + patterns: { + label: 'Segment Delimiters', + tooltip: 'Recursively split according to the selected symbols in order. If the split result exceeds the segment length, it will be truncated to the segment length.', + placeholder: 'Please select' + }, + limit: { + label: 'Segment Length' + }, + with_filter: { + label: 'Auto Clean', + text: 'Remove duplicate extra symbols, spaces, blank lines, and tab characters.' + }, + checkedConnect: { + label: 'Add Segment Titles as Associated Questions During Import (Applicable for QA Pairs where Titles are Questions)' + } + }, + buttons: { + prev: 'Previous', + next: 'Next', + import: 'Start Import', + preview: 'Generate Preview' + }, + table: { + name: 'File Name', + char_length: 'Character Count', + paragraph: 'Segment', + all: 'All', + updateTime: 'Update Time' + }, + fileStatus: { + label: 'File Status', + SUCCESS: 'Success', + FAILURE: 'Failure', + EMBEDDING: 'Indexing', + PENDING: 'Queued', + GENERATE: 'Generating', + SYNC: 'Syncing', + REVOKE: 'Cancelling' + }, + enableStatus: { + label: 'Enable Status', + enable: 'Enabled', + close: 'Disabled' + }, + sync: { + label: 'Sync', + confirmTitle: 'Confirm Sync Document?', + confirmMessage1: 'Syncing will delete existing data and retrieve new data. Please proceed with caution.', + confirmMessage2: 'Cannot sync, please set the document URL first.', + successMessage: 'Document synced successfully' + }, + delete: { + confirmTitle1: 'Confirm Batch Deletion of', + confirmTitle2: 'Documents?', + confirmMessage: 'Segments within the selected documents will also be deleted. Please proceed with caution.', + successMessage: 'Batch deletion successful', + confirmTitle3: 'Confirm Deleting Document:', + confirmMessage1: 'All segments under this document will be deleted. Please proceed with caution.' + }, + form: { + source_url: { + label: 'Document URL', + placeholder: 'Enter document URLs, one per line. Incorrect URLs will cause import failure.', + requiredMessage: 'Please enter a document URL' + }, + selector: { + label: 'Selector', + placeholder: 'Default is body, you can input .classname/#idname/tagname' + }, + hit_handling_method: { + label: 'Hit Handling Method', + tooltip: 'When user asks a question, handle matched segments according to the set method.' + }, + similarity: { + label: 'Similarity Higher Than', + placeholder: 'Directly return segment content', + requiredMessage: 'Please enter similarity value' + }, + selectVectorization: { + label: 'Select Vectorization Content', + error: 'Segments that failed vectorization', + all: 'All Segments' + } + } +} diff --git a/ui/src/locales/lang/en_US/views/index.ts b/ui/src/locales/lang/en_US/views/index.ts index 0c9d7fccd..9db8a9cd5 100644 --- a/ui/src/locales/lang/en_US/views/index.ts +++ b/ui/src/locales/lang/en_US/views/index.ts @@ -1,20 +1,31 @@ import notFound from './404' -import application from './application' -import applicationOverview from './application-overview' -import system from './system' -import functionLib from './function-lib' -import user from './user' -import team from './team' -import template from './template' -import dataset from './dataset' +import application from './application'; +import applicationOverview from './application-overview'; +import dataset from './dataset'; +import system from './system'; +import functionLib from './function-lib'; +import user from './user'; +import team from './team'; +import template from './template'; +import document from './document'; +import paragraph from './paragraph'; +import problem from './problem'; +import log from './log'; +import applicationWorkflow from './application-workflow'; + export default { - notFound, - application, - applicationOverview, - system, - functionLib, - user, - team, - template, - dataset + notFound, + application, + applicationOverview, + system, + functionLib, + user, + team, + template, + dataset, + applicationWorkflow, + document, + paragraph, + problem, + log, } diff --git a/ui/src/locales/lang/en_US/views/log.ts b/ui/src/locales/lang/en_US/views/log.ts new file mode 100644 index 000000000..54391378c --- /dev/null +++ b/ui/src/locales/lang/en_US/views/log.ts @@ -0,0 +1,42 @@ +export default { + title: 'Conversation Logs', + delete: { + confirmTitle: 'Confirm Deletion of Problem:', + confirmMessage1: 'Deleting this problem will cancel the association of', + confirmMessage2: 'paragraphs. Please proceed with caution.' + }, + buttons: { + clearStrategy: 'Clear Strategy', + prev: 'Previous', + next: 'Next' + }, + table: { + abstract: 'Abstract', + chat_record_count: 'Number of Conversation Questions', + feedback: { + label: 'User Feedback', + star: 'Agree', + trample: 'Disagree' + }, + mark: 'Improvement Label', + recenTimes: 'Recent Conversation Time' + }, + addToDataset: 'Add to Knowledge Base', + daysText: 'Conversation records from more than X days ago', + selectDataset: 'Select Knowledge Base', + selectDatasetPlaceholder: 'Please select a knowledge base', + saveToDocument: 'Save to Document', + documentPlaceholder: 'Please select a document', + editContent: 'Edit Content', + editMark: 'Edit Label', + form: { + content: { + label: 'Content', + placeholder: 'Please enter the content' + }, + title: { + label: 'Title', + placeholder: 'Please set a title for the current content for management and viewing' + }, + } +} diff --git a/ui/src/locales/lang/en_US/views/paragraph.ts b/ui/src/locales/lang/en_US/views/paragraph.ts new file mode 100644 index 000000000..6ec15d8ad --- /dev/null +++ b/ui/src/locales/lang/en_US/views/paragraph.ts @@ -0,0 +1,36 @@ +export default { + title: 'Paragraph', + editParagraph: 'Edit Paragraph', + addParagraph: 'Add Paragraph', + paragraphDetail: 'Paragraph Details', + character_count: 'characters', + setting: { + batchSelected: 'Batch Select', + cancelSelected: 'Cancel Selection' + }, + tip: {}, + searchBar: { + title: 'Title', + content: 'Content' + }, + delete: { + confirmTitle: 'Confirm Deletion of Paragraph:', + confirmMessage: 'Deletion cannot be undone. Please proceed with caution.' + }, + relatedProblem: { + title: 'Related Questions', + placeholder: 'Please select a question' + }, + form: { + paragraphTitle: { + label: 'Paragraph Title', + placeholder: 'Please enter the paragraph title' + }, + content: { + label: 'Paragraph Content', + placeholder: 'Please enter the paragraph content', + requiredMessage1: 'Please enter the paragraph content', + requiredMessage2: 'Content must not exceed 100,000 characters' + } + } +} diff --git a/ui/src/locales/lang/en_US/views/problem.ts b/ui/src/locales/lang/en_US/views/problem.ts new file mode 100644 index 000000000..9de9c9961 --- /dev/null +++ b/ui/src/locales/lang/en_US/views/problem.ts @@ -0,0 +1,37 @@ +export default { + title: 'Problem', + createProblem: 'Create Problem', + detailProblem: 'Problem Details', + quickCreateProblem: 'Quick Create Problem', + tip: { + placeholder: 'Enter the problem, support multiple entries, one per line.', + errorMessage: 'Problem cannot be empty!', + requiredMessage: 'Please enter a problem', + relatedSuccess: 'Batch association of paragraphs successful' + }, + + setting: { + batchDelete: 'Batch Delete', + cancelRelated: 'Cancel Association' + }, + searchBar: { + placeholder: 'Search by Name' + }, + table: { + paragraph_count: 'Number of Associated Paragraphs', + updateTime: 'Update Time' + }, + delete: { + confirmTitle: 'Confirm Deletion of Problem:', + confirmMessage1: 'Deleting this problem will cancel the association of', + confirmMessage2: 'paragraphs. Please proceed with caution.' + }, + relateParagraph: { + title: 'Associate Paragraphs', + selectDocument: 'Select Document', + placeholder: 'Search by Document Name', + selectParagraph: 'Select Paragraph', + selectedParagraph: 'Selected Paragraphs', + count: 'Count' + }, +} diff --git a/ui/src/locales/lang/zh_CN/views/application-workflow.ts b/ui/src/locales/lang/zh_CN/views/application-workflow.ts index 2c4ec1f52..dd5e97a4d 100644 --- a/ui/src/locales/lang/zh_CN/views/application-workflow.ts +++ b/ui/src/locales/lang/zh_CN/views/application-workflow.ts @@ -26,7 +26,7 @@ export default { nameMessage: '名字不能为空!', onlyRight: '只允许从右边的锚点连出', notRecyclable: '不可循环连线', - onlylest: '只允许连接左边的锚点', + onlyLeft: '只允许连接左边的锚点', applicationNodeError: '该应用不可用', functionNodeError: '该函数不可用', repeatedNodeError: '节点名称已存在!', diff --git a/ui/src/locales/lang/zh_CN/views/application.ts b/ui/src/locales/lang/zh_CN/views/application.ts index 5bc705b8d..00ee6658d 100644 --- a/ui/src/locales/lang/zh_CN/views/application.ts +++ b/ui/src/locales/lang/zh_CN/views/application.ts @@ -24,7 +24,7 @@ export default { applicationForm: { title: { info: '应用信息', - apptest: '调试预览', + appTest: '调试预览', copy: '副本' }, form: { diff --git a/ui/src/locales/lang/zh_TW/views/application-workflow.ts b/ui/src/locales/lang/zh_TW/views/application-workflow.ts new file mode 100644 index 000000000..6ffa2d921 --- /dev/null +++ b/ui/src/locales/lang/zh_TW/views/application-workflow.ts @@ -0,0 +1,274 @@ +export default { + node: '節點', + baseComponent: '基礎組件', + nodeSetting: '節點設置', + workflow: '工作流', + searchBar: { + placeholder: '按名稱搜索' + }, + info: { + previewVersion: '預覽版本:', + saveTime: '保存時間:' + }, + setting: { + restoreVersion: '恢復版本', + restoreCurrentVersion: '恢復此版本', + addComponent: '添加組件', + public: '發布', + releaseHistory: '發布歷史', + autoSave: '自動保存', + latestRelease: '最近發布', + copyParam: '複製參數' + }, + tip: { + publicSuccess: '發布成功', + noData: '沒有找到相關結果', + nameMessage: '名字不能為空!', + onlyRight: '只允許從右邊的錨點連出', + notRecyclable: '不可循環連線', + onlyLeft: '只允許連接左邊的錨點', + applicationNodeError: '該應用不可用', + functionNodeError: '該函數不可用', + repeatedNodeError: '節點名稱已存在!', + cannotCopy: '不能被複製', + copyError: '已複製節點', + paramErrorMessage: '參數已存在: ' + }, + delete: { + confirmTitle: '確定刪除該節點?', + deleteMessage: '節點不允許刪除' + }, + control: { + zoomOut: '縮小', + zoomIn: '放大', + fitView: '適應', + retract: '收起全部節點', + extend: '展開全部節點', + beautify: '一鍵美化' + }, + variable: { + global: '全局變量', + Referencing: '引用變量', + ReferencingRequired: '引用變量必填', + ReferencingError: '引用變量錯誤', + NoReferencing: '不存在的引用變量', + fieldMessage: '請選擇變量' + }, + condition: { + title: '執行條件', + front: '前置', + AND: '所有', + OR: '任一', + text: '連線節點執行完,執行當前節點' + }, + validate: { + startNodeRequired: '開始節點必填', + startNodeOnly: '開始節點只能有一個', + baseNodeRequired: '基本信息節點必填', + baseNodeOnly: '基本信息節點只能有一個', + notInWorkFlowNode: '未在流程中的節點', + noNextNode: '不存在的下一個節點', + nodeUnavailable: '節點不可用', + needConnect1: '節點的', + needConnect2: '分支需要連接', + cannotEndNode: '節點不能當做結束節點' + }, + nodes: { + startNode: { + label: '開始', + question: '用戶問題', + currentTime: '當前時間' + }, + baseNode: { + label: '基本信息', + fileUpload: { + label: '文件上傳', + tooltip: '開啟後,問答頁面會顯示上傳文件的按鈕。' + }, + FileUploadSetting: { + title: '文件上傳設置', + maxFiles: '單次上傳最多文件數', + fileLimit: '每個文件最大(MB)', + fileUploadType: { + label: '上傳的文件類型', + documentText: '需要使用「文檔內容提取」節點解析文檔內容', + imageText: '需要使用「圖片理解」節點解析圖片內容', + audioText: '需要使用「語音轉文本」節點解析音頻內容' + } + } + }, + aiChatNode: { + label: 'AI 對話', + text: '與 AI 大模型進行對話', + answer: 'AI 回答內容', + returnContent: { + label: '返回內容', + tooltip: `關閉後該節點的內容則不輸出給用戶。 + 如果你想讓用戶看到該節點的輸出內容,請打開開關。` + }, + defaultPrompt: `已知信息: +{{知識庫檢索.data}} +問題: +{{開始.question}}` + }, + searchDatasetNode: { + label: '知識庫檢索', + text: '關聯知識庫,查找與問題相關的分段', + paragraph_list: '檢索結果的分段列表', + is_hit_handling_method_list: '滿足直接回答的分段列表', + result: '檢索結果', + directly_return: '滿足直接回答的分段內容', + selectDatasetText: '關聯的知識庫展示在這裡', + searchParam: '檢索參數', + searchQuestion: { + label: '檢索問題', + placeholder: '請選擇檢索問題', + requiredMessage: '請選擇檢索問題' + } + }, + questionNode: { + label: '問題優化', + text: '根據歷史聊天記錄優化完善當前問題,更利於匹配知識庫分段', + result: '問題優化結果', + defaultPrompt: `根據上下文優化和完善用戶問題:{{開始.question}} +請輸出一個優化後的問題。`, + systemDefault: '你是一個問題優化大師' + }, + conditionNode: { + label: '判斷器', + text: '根據不同條件執行不同的節點', + branch_name: '分支名稱', + conditions: { + label: '條件', + info: '符合以下', + requiredMessage: '請選擇條件' + }, + valueMessage: '請輸入值', + addCondition: '添加條件', + addBranch: '添加分支' + }, + replyNode: { + label: '指定回覆', + text: '指定回覆內容,引用變量會轉換為字符串進行輸出', + content: '內容', + replyContent: { + label: '回覆內容', + custom: '自定義', + reference: '引用變量' + } + }, + rerankerNode: { + label: '多路召回', + text: '使用重排模型對多個知識庫的檢索結果進行二次召回', + result_list: '重排結果列表', + result: '重排結果', + rerankerContent: { + label: '重排內容', + requiredMessage: '請選擇重排內容' + }, + higher: '高於', + ScoreTooltip: 'Score越高相關性越強。', + max_paragraph_char_number: '最大引用字符數', + reranker_model: { + label: '重排模型', + placeholder: '請選擇重排模型' + } + }, + formNode: { + label: '表單收集', + text: '在問答過程中用於收集用戶信息,可以根據收集到表單數據執行後續流程', + form_content_format: `你好,請先填寫下面表單內容: +{{form}} +填寫後請點擊【提交】按鈕進行提交。`, + form_data: '表單全部內容', + formContent: { + label: '表單輸出內容', + requiredMessage: '請表單輸出內容', + tooltip: '設置執行該節點輸出的內容,{ form } 為表單的佔位符。' + }, + formAllContent: '表單全部內容', + formSetting: '表單配置' + }, + documentExtractNode: { + label: '文檔內容提取', + text: '提取文檔中的內容', + content: '文檔內容' + }, + imageUnderstandNode: { + label: '圖片理解', + text: '識別出圖片中的物件、場景等信息回答用戶問題', + answer: 'AI 回答內容', + model: { + label: '圖片理解模型', + requiredMessage: '請選擇圖片理解模型' + }, + image: { + label: '選擇圖片', + requiredMessage: '請選擇圖片' + } + }, + imageGenerateNode: { + label: '圖片生成', + text: '根據提供的文本內容生成圖片', + answer: 'AI 回答內容', + model: { + label: '圖片生成模型', + requiredMessage: '請選擇圖片生成模型' + }, + prompt: { + label: '提示詞(正向)', + tooltip: '正向提示詞,用來描述生成圖像中期望包含的元素和視覺特點' + }, + negative_prompt: { + label: '提示詞(負向)', + tooltip: '反向提示詞,用來描述不希望在畫面中看到的內容,可以對畫面進行限制。', + placeholder: '請描述不想生成的圖片內容,比如:顏色、血腥內容' + } + }, + speechToTextNode: { + label: '語音轉文本', + text: '將音頻通過語音識別模型轉換為文本', + stt_model: { + label: '語音識別模型' + }, + audio: { + label: '選擇語音文件', + placeholder: '請選擇語音文件' + } + }, + textToSpeechNode: { + label: '文本轉語音', + text: '將文本通過語音合成模型轉換為音頻', + tts_model: { + label: '語音合成模型' + }, + content: { + label: '選擇文本內容' + } + }, + functionNode: { + label: '自定義函數', + text: '通過執行自定義腳本,實現數據處理' + }, + applicationNode: { + label: '應用節點' + } + }, + compare: { + is_null: '為空', + is_not_null: '不為空', + contain: '包含', + not_contain: '不包含', + eq: '等於', + ge: '大於等於', + gt: '大於', + le: '小於等於', + lt: '小於', + len_eq: '長度等於', + len_ge: '長度大於等於', + len_gt: '長度大於', + len_le: '長度小於等於', + len_lt: '長度小於' + }, + FileUploadSetting: {} +} diff --git a/ui/src/locales/lang/zh_TW/views/application.ts b/ui/src/locales/lang/zh_TW/views/application.ts index 57fb6bfca..bd43c401c 100644 --- a/ui/src/locales/lang/zh_TW/views/application.ts +++ b/ui/src/locales/lang/zh_TW/views/application.ts @@ -24,7 +24,7 @@ export default { applicationForm: { title: { info: '應用資訊', - apptest: '調試預覽', + appTest: '調試預覽', copy: '副本' }, form: { diff --git a/ui/src/locales/lang/zh_TW/views/document.ts b/ui/src/locales/lang/zh_TW/views/document.ts new file mode 100644 index 000000000..d0818ca8f --- /dev/null +++ b/ui/src/locales/lang/zh_TW/views/document.ts @@ -0,0 +1,158 @@ +export default { + uploadDocument: '上傳文檔', + importDocument: '導入文檔', + syncDocument: '同步文檔', + selected: '已選', + items: '項', + searchBar: { + placeholder: '按 文檔名稱 搜索' + }, + setting: { + migration: '遷移', + generateQuestion: '生成問題', + cancelGenerateQuestion: '取消生成問題', + cancelVectorization: '取消向量化', + cancelGenerate: '取消生成' + }, + tip: { + saveMessage: '當前的更改尚未保存,確認退出嗎?', + cancelSuccess: '批量取消成功', + sendMessage: '發送成功', + vectorizationSuccess: '批量向量化成功', + nameMessage: '文件名稱不能为空!', + importMessage: '導入成功', + migrationSuccess: '遷移成功' + }, + upload: { + selectFile: '選擇文件', + selectFiles: '選擇文件夾', + uploadMessage: '拖拽文件至此上傳或', + formats: '支持格式:', + requiredMessage: '請上傳文件', + errorMessage1: '請上傳文件', + errorMessage2: '文件格式不支持', + errorMessage3: '文件不能为空', + errorMessage4: '每次最多上傳50個文件', + template: '模板', + download: '下載' + }, + + fileType: { + txt: { + label: '文本文件', + tip1: '1、文件上傳前,建議規範文件的分段標識', + tip2: '2、每次最多上傳 50 個文件,每個文件不超过 100MB' + }, + table: { + label: '表格', + tip1: '1、點擊下載對應模板並完善信息:', + tip2: '2、第一行必須是列標題,且列標題必須是有意義的術語,表中每條記錄將作為一個分段', + tip3: '3、上傳的表格文件中每個 sheet 會作為一個文檔,sheet 名稱為文檔名稱', + tip4: '4、每次最多上傳 50 個文件,每個文件不超过 100MB' + }, + QA: { + label: 'QA 問答對', + tip1: '1、點擊下載對應模板並完善信息', + tip2: '2、上傳的表格文件中每個 sheet 會作為一個文檔,sheet 名稱為文檔名稱', + tip3: '3、每次最多上傳 50 個文件,每個文件不超过 100MB' + } + }, + setRules: { + title: { + setting: '設置分段規則', + preview: '分段預覽' + }, + intelligent: { + label: '智能分段(推薦)', + text: '不了解如何設置分段規則推薦使用智能分段' + }, + advanced: { + label: '高級分段', + text: '用戶可根據文檔規範自行設置分段標識符、分段長度以及清洗規則' + }, + patterns: { + label: '分段標識', + tooltip: '按照所選符號先後順序做遞歸分割,分割結果超出分段長度將截取至分段長度。', + placeholder: '請選擇' + }, + limit: { + label: '分段長度' + }, + with_filter: { + label: '自動清洗', + text: '去掉重複多餘符號空格、空行、制表符' + }, + checkedConnect: { + label: '導入時添加分段標題為關聯問題(適用於標題為問題的問答對)' + } + }, + buttons: { + prev: '上一步', + next: '下一步', + import: '開始導入', + preview: '生成預覽' + }, + table: { + name: '文件名稱', + char_length: '字符數', + paragraph: '分段', + all: '全部', + updateTime: '更新時間' + }, + fileStatus: { + label: '文件狀態', + SUCCESS: '成功', + FAILURE: '失敗', + EMBEDDING: '索引中', + PENDING: '排隊中', + GENERATE: '生成中', + SYNC: '同步中', + REVOKE: '取消中' + }, + enableStatus: { + label: '啟用狀態', + enable: '開啟', + close: '關閉' + }, + sync: { + label: '同步', + confirmTitle: '確認同步文檔?', + confirmMessage1: '同步將刪除已有數據重新獲取新數據,請謹慎操作。', + confirmMessage2: '無法同步,請先去設置文檔 URL地址', + successMessage: '同步文檔成功' + }, + delete: { + confirmTitle1: '是否批量刪除', + confirmTitle2: '個文檔?', + confirmMessage: '所選文檔中的分段會跟隨刪除,請謹慎操作。', + successMessage: '批量刪除成功', + confirmTitle3: '是否刪除文檔:', + confirmMessage1: '此文檔下的', + confirmMessage2: '個分段都會被刪除,請謹慎操作。' + }, + form: { + source_url: { + label: '文檔地址', + placeholder: '請輸入文檔地址,一行一個,地址不正確文檔會導入失敗。', + requiredMessage: '請輸入文檔地址' + }, + selector: { + label: '選擇器', + placeholder: '默認為 body,可輸入 .classname/#idname/tagname' + }, + hit_handling_method: { + label: '命中處理方式', + tooltip: '用戶提問時,命中文檔下的分段時按照設置的方式進行處理。' + }, + similarity: { + label: '相似度高于', + placeholder: '直接返回分段内容', + requiredMessage: '请输入相似度' + }, + selectVectorization: { + label: '选择向量化内容', + error: '向量化未成功的分段', + all: '全部分段' + } + } +} diff --git a/ui/src/locales/lang/zh_TW/views/index.ts b/ui/src/locales/lang/zh_TW/views/index.ts index 0c9d7fccd..9db8a9cd5 100644 --- a/ui/src/locales/lang/zh_TW/views/index.ts +++ b/ui/src/locales/lang/zh_TW/views/index.ts @@ -1,20 +1,31 @@ import notFound from './404' -import application from './application' -import applicationOverview from './application-overview' -import system from './system' -import functionLib from './function-lib' -import user from './user' -import team from './team' -import template from './template' -import dataset from './dataset' +import application from './application'; +import applicationOverview from './application-overview'; +import dataset from './dataset'; +import system from './system'; +import functionLib from './function-lib'; +import user from './user'; +import team from './team'; +import template from './template'; +import document from './document'; +import paragraph from './paragraph'; +import problem from './problem'; +import log from './log'; +import applicationWorkflow from './application-workflow'; + export default { - notFound, - application, - applicationOverview, - system, - functionLib, - user, - team, - template, - dataset + notFound, + application, + applicationOverview, + system, + functionLib, + user, + team, + template, + dataset, + applicationWorkflow, + document, + paragraph, + problem, + log, } diff --git a/ui/src/locales/lang/zh_TW/views/log.ts b/ui/src/locales/lang/zh_TW/views/log.ts new file mode 100644 index 000000000..a3c8c70d8 --- /dev/null +++ b/ui/src/locales/lang/zh_TW/views/log.ts @@ -0,0 +1,42 @@ +export default { + title: '對話日誌', + delete: { + confirmTitle: '是否刪除問題:', + confirmMessage1: '刪除問題關聯的', + confirmMessage2: '個分段會被取消關聯,請謹慎操作。' + }, + buttons: { + clearStrategy: '清除策略', + prev: '上一條', + next: '下一條' + }, + table: { + abstract: '摘要', + chat_record_count: '對話提問數', + feedback: { + label: '用戶反饋', + star: '贊同', + trample: '反對' + }, + mark: '改進標註', + recenTimes: '最近對話時間' + }, + addToDataset: '添加至知識庫', + daysText: '天之前的對話記錄', + selectDataset: '選擇知識庫', + selectDatasetPlaceholder: '請選擇知識庫', + saveToDocument: '保存至文件', + documentPlaceholder: '請選擇文件', + editContent: '修改內容', + editMark: '修改標註', + form: { + content: { + label: '內容', + placeholder: '請輸入內容' + }, + title: { + label: '標題', + placeholder: '請給當前內容設定一個標題,以便管理查看' + }, + } +} diff --git a/ui/src/locales/lang/zh_TW/views/paragraph.ts b/ui/src/locales/lang/zh_TW/views/paragraph.ts new file mode 100644 index 000000000..da6120eb5 --- /dev/null +++ b/ui/src/locales/lang/zh_TW/views/paragraph.ts @@ -0,0 +1,36 @@ +export default { + title: '段落', + editParagraph: '編輯分段', + addParagraph: '添加分段', + paragraphDetail: '分段詳情', + character_count: '個字符', + setting: { + batchSelected: '批量選擇', + cancelSelected: '取消選擇' + }, + tip: {}, + searchBar: { + title: '標題', + content: '內容' + }, + delete: { + confirmTitle: '是否刪除段落:', + confirmMessage: '刪除後無法恢復,請謹慎操作。' + }, + relatedProblem: { + title: '關聯問題', + placeholder: '請選擇問題' + }, + form: { + paragraphTitle: { + label: '分段標題', + placeholder: '請輸入分段標題' + }, + content: { + label: '分段內容', + placeholder: '請輸入分段內容', + requiredMessage1: '請輸入分段內容', + requiredMessage2: '內容最多不超過 100000 個字' + } + } +} diff --git a/ui/src/locales/lang/zh_TW/views/problem.ts b/ui/src/locales/lang/zh_TW/views/problem.ts new file mode 100644 index 000000000..cf22427f4 --- /dev/null +++ b/ui/src/locales/lang/zh_TW/views/problem.ts @@ -0,0 +1,37 @@ +export default { + title: '問題', + createProblem: '建立問題', + detailProblem: '問題詳情', + quickCreateProblem: '快速建立問題', + tip: { + placeholder: '請輸入問題,支持輸入多個,一行一個。', + errorMessage: '問題不能為空!', + requiredMessage: '請輸入問題', + relatedSuccess: '批量關聯分段成功' + }, + + setting: { + batchDelete: '批量刪除', + cancelRelated: '取消關聯' + }, + searchBar: { + placeholder: '按名稱搜尋' + }, + table: { + paragraph_count: '關聯分段數', + updateTime: '更新時間' + }, + delete: { + confirmTitle: '是否刪除問題:', + confirmMessage1: '刪除問題關聯的', + confirmMessage2: '個分段會被取消關聯,請謹慎操作。' + }, + relateParagraph: { + title: '關聯分段', + selectDocument: '選擇文件', + placeholder: '按 文件名稱 搜尋', + selectParagraph: '選擇分段', + selectedParagraph: '已選分段', + count: '個' + }, +} diff --git a/ui/src/views/application/ApplicationSetting.vue b/ui/src/views/application/ApplicationSetting.vue index 9bbf46567..db5da457c 100644 --- a/ui/src/views/application/ApplicationSetting.vue +++ b/ui/src/views/application/ApplicationSetting.vue @@ -384,7 +384,7 @@

- {{ $t('views.application.applicationForm.title.apptest') }} + {{ $t('views.application.applicationForm.title.appTest') }}

diff --git a/ui/src/workflow/common/app-node.ts b/ui/src/workflow/common/app-node.ts index 3db2322c3..9df0c7350 100644 --- a/ui/src/workflow/common/app-node.ts +++ b/ui/src/workflow/common/app-node.ts @@ -308,7 +308,7 @@ class AppNodeModel extends HtmlResize.model { this.sourceRules.push(circleOnlyAsTarget) this.targetRules.push({ - message: t('views.applicationWorkflow.tip.onlylest'), + message: t('views.applicationWorkflow.tip.onlyLeft'), validate: (sourceNode: any, targetNode: any, sourceAnchor: any, targetAnchor: any) => { return targetAnchor.type === 'left' }