소스 검색

fix: 修改节点库多语言内容

jiaxing.liao 3 일 전
부모
커밋
a39ac84566

+ 1 - 1
apps/web/src/features/nodeLibary/index.vue

@@ -106,7 +106,7 @@ const materials = computed<NodeGroup[]>(() => {
 			groupMap.get(groupId)!.nodes.push({
 				id: node.name,
 				type: node.schema.nodeType,
-				name: node.displayName,
+				name: getNodeDisplayName(node.schema.nodeType),
 				description: getNodeDescription(node.schema.nodeType),
 				icon: node.icon,
 				isImageIcon: isImageIcon(node.icon),

+ 4 - 1
apps/web/src/features/toolbar/index.vue

@@ -51,7 +51,10 @@
 			</template>
 		</el-popover>
 
-		<el-tooltip :content="t('pages.toolbar.chat')" placement="left">
+		<el-tooltip
+			:content="!props.canChat ? '需要用户输入节点' : t('pages.toolbar.chat')"
+			placement="left"
+		>
 			<IconButton
 				icon="lucide:message-circle"
 				:class="{ 'is-disabled': !props.canChat }"

+ 12 - 1
apps/web/src/i18n/locales/en-us.ts

@@ -2801,7 +2801,8 @@ export default {
 			data: 'Data Processing',
 			logic: 'Logic',
 			tool: 'Tool',
-			other: 'Other'
+			other: 'Other',
+			custom: 'Custom'
 		},
 		meta: {
 			start: {
@@ -2840,6 +2841,10 @@ export default {
 				displayName: 'View Data',
 				description: 'Read data from a configured view'
 			},
+			llm: {
+				displayName: 'LLM',
+				description: 'Call a large language model to answer questions or process natural language'
+			},
 			iteration: { displayName: 'Iteration', description: 'Iteration node' },
 			loop: { displayName: 'Loop', description: 'Loop node' },
 			'list-operator': { displayName: 'List Operations', description: 'List operation node' },
@@ -2898,6 +2903,12 @@ export default {
 				text: 'Generated content',
 				think: 'Reasoning content'
 			},
+			llm: {
+				text: 'Generated content',
+				reasoningContent: 'Reasoning content',
+				usage: 'Model usage information',
+				structuredOutput: 'Structured object'
+			},
 			list: {
 				result: 'Filtered results',
 				firstRecord: 'First record',

+ 98 - 87
apps/web/src/i18n/locales/zh-cn.ts

@@ -2699,94 +2699,105 @@ export default {
 					german: '德语'
 				}
 			}
+		}
+	},
+	nodes: {
+	groups: {
+		start: '开始',
+		data: '数据处理',
+		logic: '业务逻辑',
+		tool: '工具',
+		other: '其他',
+		custom: '自定义'
+	},
+	meta: {
+		'module-invoke': { displayName: '模块调用', description: '通过接口代码调用模块能力' },
+		'basic-dataset': {
+			displayName: '基础数据集',
+			description: '从配置好的基础数据集中读取数据'
 		},
-		nodes: {
-			groups: {
-				start: '开始',
-				data: '数据处理',
-				logic: '业务逻辑',
-				tool: '工具',
-				other: '其他'
-			},
-			meta: {
-				'module-invoke': { displayName: '模块调用', description: '通过接口代码调用模块能力' },
-				'basic-dataset': {
-					displayName: '基础数据集',
-					description: '从配置好的基础数据集中读取数据'
-				},
-				'knowledge-retrieval': {
-					displayName: '知识检索',
-					description: '从知识库或指定知识文件中检索相关文本片段'
-				},
-				'ai-agent': {
-					displayName: '智能体',
-					description: '通过智能体配置执行问答与推理'
-				},
-				'view-data': { displayName: '视图数据', description: '从配置好的视图中读取数据' },
-				start: { displayName: '用户输入', description: '用户输入节点,用于接收用户输入' },
-				end: { displayName: '输出', description: '流程结束并输出节点' },
-				'http-request': { displayName: 'HTTP 请求', description: '通过 HTTP 请求获取数据' },
-				'if-else': { displayName: '条件判断', description: '根据条件判断' },
-				database: { displayName: '数据查询', description: '通过数据库查询数据' },
-				code: { displayName: '代码', description: '通过代码处理数据' },
-				iteration: { displayName: '迭代', description: '迭代节点' },
-				loop: { displayName: '循环', description: '循环节点' },
-				'list-operator': { displayName: '列表操作', description: '列表操作节点' },
-				'question-classifier': { displayName: '问题分类', description: '将问题划分到预设分类中' },
-				'loop-end': { displayName: '退出循环', description: '用于退出迭代或者循环' },
-				'trigger-schedule': { displayName: '定时触发', description: '基于时间配置触发工作流' },
-				'trigger-webhook': {
-					displayName: 'Webhook 触发',
-					description: '通过 Webhook 接收第三方系统请求并触发工作流'
-				},
-				'loop-start': { displayName: '循环开始' },
-				'iteration-start': { displayName: '迭代开始' },
-				stickyNote: { displayName: '注释', description: 'Markdown 注释块' },
-				'mail-sender': { displayName: '邮件发送', description: '通过邮件发送信息' },
-				'sms-sender': { displayName: '短信发送', description: '通过短信发送信息' },
-				'workflow-approval': {
-					displayName: '流程审批',
-					description: '根据用户和岗位信息发起流程审批'
-				}
-			},
-			outputs: {
-				http: {
-					body: '响应内容',
-					statusCode: '响应状态码',
-					headers: '响应头列表 JSON'
-				},
-				webhook: {
-					rawRequestBody: 'Webhook 原始请求体'
-				},
-				database: {
-					rows: '查询结果行',
-					rowCount: '查询结果总行数'
-				},
-				'view-data': {
-					viewTable: '视图数据结果',
-					viewName: '视图名称',
-					totalCount: '总数量'
-				},
-				'knowledge-retrieval': {
-					result: '检索命中的文本片段列表',
-					content: '拼接后的检索内容'
-				},
-				'ai-agent': {
-					text: '生成内容',
-					think: '推理内容'
-				},
-				list: {
-					result: '过滤结果',
-					firstRecord: '第一条记录',
-					lastRecord: '最后一条记录'
-				},
-				condition: {
-					casePrefix: '条件_'
-				},
-				'question-classifier': {
-					classPrefix: '分类'
-				}
-			}
+		'knowledge-retrieval': {
+			displayName: '知识检索',
+			description: '从知识库或指定知识文件中检索相关文本片段'
+		},
+		'ai-agent': {
+			displayName: '智能体',
+			description: '通过智能体配置执行问答与推理'
+		},
+		'view-data': { displayName: '视图数据', description: '从配置好的视图中读取数据' },
+		llm: {
+			displayName: 'LLM',
+			description: '调用大语言模型回答问题或处理自然语言'
+		},
+		start: { displayName: '用户输入', description: '用户输入节点,用于接收用户输入' },
+		end: { displayName: '输出', description: '流程结束并输出节点' },
+		'http-request': { displayName: 'HTTP 请求', description: '通过 HTTP 请求获取数据' },
+		'if-else': { displayName: '条件判断', description: '根据条件判断' },
+		database: { displayName: '数据查询', description: '通过数据库查询数据' },
+		code: { displayName: '代码', description: '通过代码处理数据' },
+		iteration: { displayName: '迭代', description: '迭代节点' },
+		loop: { displayName: '循环', description: '循环节点' },
+		'list-operator': { displayName: '列表操作', description: '列表操作节点' },
+		'question-classifier': { displayName: '问题分类', description: '将问题划分到预设分类中' },
+		'loop-end': { displayName: '退出循环', description: '用于退出迭代或者循环' },
+		'trigger-schedule': { displayName: '定时触发', description: '基于时间配置触发工作流' },
+		'trigger-webhook': {
+			displayName: 'Webhook 触发',
+			description: '通过 Webhook 接收第三方系统请求并触发工作流'
+		},
+		'loop-start': { displayName: '循环开始' },
+		'iteration-start': { displayName: '迭代开始' },
+		stickyNote: { displayName: '注释', description: 'Markdown 注释块' },
+		'mail-sender': { displayName: '邮件发送', description: '通过邮件发送信息' },
+		'sms-sender': { displayName: '短信发送', description: '通过短信发送信息' },
+		'workflow-approval': {
+			displayName: '流程审批',
+			description: '根据用户和岗位信息发起流程审批'
+		}
+	},
+	outputs: {
+		http: {
+			body: '响应内容',
+			statusCode: '响应状态码',
+			headers: '响应头列表 JSON'
+		},
+		webhook: {
+			rawRequestBody: 'Webhook 原始请求体'
+		},
+		database: {
+			rows: '查询结果行',
+			rowCount: '查询结果总行数'
+		},
+		'view-data': {
+			viewTable: '视图数据结果',
+			viewName: '视图名称',
+			totalCount: '总数量'
+		},
+		'knowledge-retrieval': {
+			result: '检索命中的文本片段列表',
+			content: '拼接后的检索内容'
+		},
+		'ai-agent': {
+			text: '生成内容',
+			think: '推理内容'
+		},
+		llm: {
+			text: '生成内容',
+			reasoningContent: '推理内容',
+			usage: '模型用量信息',
+			structuredOutput: '结构化对象'
+		},
+		list: {
+			result: '过滤结果',
+			firstRecord: '第一条记录',
+			lastRecord: '最后一条记录'
+		},
+		condition: {
+			casePrefix: '条件_'
+		},
+		'question-classifier': {
+			classPrefix: '分类'
 		}
 	}
+	}
 }

+ 1 - 0
apps/web/src/nodes/i18n.ts

@@ -8,6 +8,7 @@ const NODE_GROUP_KEYS: Record<string, 'start' | 'logic' | 'data' | 'tool' | 'oth
 	database: 'data',
 	'database-query': 'data',
 	code: 'data',
+	llm: 'data',
 	'module-invoke': 'tool',
 	'basic-dataset': 'data',
 	'view-data': 'data',

+ 7 - 6
apps/web/src/nodes/src/llm/index.ts

@@ -1,5 +1,6 @@
 import { NodeConnectionTypes, type INodeType, type INodeDataBaseSchema } from '../../Interface'
 import Setter from './setter.vue'
+import { getNodeDescription, getNodeDisplayName, getNodeOutputText } from '@/nodes/i18n'
 
 export type LLMPromptRole = 'system' | 'user' | 'assistant'
 
@@ -40,22 +41,22 @@ export type LLMData = INodeDataBaseSchema & {
 export const DEFAULT_LLM_OUTPUTS: LLMData['outputs'] = [
 	{
 		name: 'text',
-		describe: '生成内容',
+		describe: getNodeOutputText('llm', 'text'),
 		type: 'string'
 	},
 	{
 		name: 'reasoning_content',
-		describe: '推理内容',
+		describe: getNodeOutputText('llm', 'reasoningContent'),
 		type: 'string'
 	},
 	{
 		name: 'usage',
-		describe: '模型用量信息',
+		describe: getNodeOutputText('llm', 'usage'),
 		type: 'object'
 	},
 	{
 		name: 'structured_output',
-		describe: '结构化对象',
+		describe: getNodeOutputText('llm', 'structuredOutput'),
 		type: 'object'
 	}
 ]
@@ -90,10 +91,10 @@ export const DEFAULT_PROMPT_TEMPLATE: LLMPromptItem[] = [
 
 export const llmNode: INodeType = {
 	version: ['1'],
-	displayName: 'LLM',
+	displayName: getNodeDisplayName('llm'),
 	name: 'llm',
 	Setter,
-	description: '调用大语言模型回答问题或者对自然语言进行处理',
+	description: getNodeDescription('llm'),
 	group: 'data',
 	icon: 'lucide:brain-circuit',
 	iconColor: '#6172F3',

+ 10 - 3
apps/web/src/views/editor/NodeView.vue

@@ -857,8 +857,10 @@ const handleNodeCreate = (value: { type: string; position?: XYPosition } | strin
 		return
 	}
 
-	const nodeToAdd = nodeMap[value.type]?.schema
-	const viewport = workflowRef.value?.getVueFlow()?.viewport
+		const nodeToAdd = nodeMap[value.type]?.schema
+		const nodeType = nodeToAdd?.nodeType || nodeToAdd?.data?.nodeType || value.type
+		const defaultNodeTitle = getNodeDisplayName(nodeType)
+		const viewport = workflowRef.value?.getVueFlow()?.viewport
 	const parentNodeType = getNodeTypeById(peddingHandlePayload.value?.parentId)
 	const isLoopContainer = ['loop', 'iteration'].includes(parentNodeType)
 
@@ -879,7 +881,12 @@ const handleNodeCreate = (value: { type: string; position?: XYPosition } | strin
 		const newNodeParam: any = {
 			...nodeToAdd,
 			appAgentId: props.workflow?.id || '',
-			position: value.position
+			position: value.position,
+			name: defaultNodeTitle,
+			data: {
+				...(nodeToAdd.data || {}),
+				title: nodeToAdd.data?.title || defaultNodeTitle
+			}
 		}
 
 		if (!hasExplicitPosition && !peddingHandlePayload.value && viewport) {