From 37c74b0622d1bdd41725fd67ac73787ad0dbc466 Mon Sep 17 00:00:00 2001 From: Typer_Body Date: Fri, 15 May 2026 01:05:29 +0800 Subject: [PATCH] update icon i18n --- plans/translation-analysis-report.txt | 3791 +++++++++++ .../pkg/workflow/nodes/call_pipeline.py | 2 +- .../pkg/workflow/nodes/code_executor.py | 2 +- src/langbot/pkg/workflow/nodes/condition.py | 2 +- .../pkg/workflow/nodes/cron_trigger.py | 2 +- .../pkg/workflow/nodes/data_transform.py | 2 +- src/langbot/pkg/workflow/nodes/end.py | 2 +- .../pkg/workflow/nodes/event_trigger.py | 2 +- .../pkg/workflow/nodes/http_request.py | 2 +- src/langbot/pkg/workflow/nodes/iterator.py | 2 +- .../pkg/workflow/nodes/knowledge_retrieval.py | 2 +- src/langbot/pkg/workflow/nodes/llm_call.py | 2 +- src/langbot/pkg/workflow/nodes/loop.py | 2 +- src/langbot/pkg/workflow/nodes/merge.py | 2 +- .../pkg/workflow/nodes/message_trigger.py | 2 +- .../pkg/workflow/nodes/opening_statement.py | 2 +- src/langbot/pkg/workflow/nodes/parallel.py | 2 +- .../pkg/workflow/nodes/parameter_extractor.py | 2 +- .../pkg/workflow/nodes/question_classifier.py | 2 +- .../pkg/workflow/nodes/reply_message.py | 2 +- .../pkg/workflow/nodes/send_message.py | 2 +- .../pkg/workflow/nodes/set_variable.py | 2 +- src/langbot/pkg/workflow/nodes/store_data.py | 2 +- src/langbot/pkg/workflow/nodes/switch.py | 2 +- .../pkg/workflow/nodes/variable_aggregator.py | 2 +- src/langbot/pkg/workflow/nodes/wait.py | 2 +- .../pkg/workflow/nodes/webhook_trigger.py | 2 +- web/ai_translate_workflows.py | 151 + web/analyze_missing_translations.py | 141 + web/apply_workflows_translations.py | 262 + web/batch_translate_workflows.py | 351 + web/batch_translate_zh_hant.py | 280 + web/check_ru_ts_file.py | 56 + web/check_russian_translations.py | 44 + web/check_translation_progress.py | 202 + web/fix_i18n_keys.py | 160 + web/fix_ru_mixed_text.py | 237 + web/fix_ru_workflows.py | 108 + web/fix_russian_translations.py | 150 + web/replace_ru_workflows.py | 250 + .../workflow-editor/NodePalette.tsx | 4 +- .../workflow-editor/WorkflowNodeComponent.tsx | 4 +- .../workflow-editor/workflow-constants.ts | 58 + web/src/i18n/locales/en-US.ts | 39 +- web/src/i18n/locales/es-ES.ts | 1184 ++-- web/src/i18n/locales/ja-JP.ts | 1154 ++-- web/src/i18n/locales/ru-RU.ts | 1194 ++-- web/src/i18n/locales/th-TH.ts | 1194 ++-- web/src/i18n/locales/vi-VN.ts | 1190 ++-- web/src/i18n/locales/zh-Hant.ts | 1156 ++-- web/todo_translations.json | 1450 +++++ web/translate_i18n_keys.py | 265 + web/translation_template.json | 23 + web/workflows_chinese_texts.json | 629 ++ web/workflows_section.txt | 831 +++ web/workflows_translation_guide.md | 265 + web/workflows_translations.json | 5676 +++++++++++++++++ 57 files changed, 19037 insertions(+), 3514 deletions(-) create mode 100644 plans/translation-analysis-report.txt create mode 100644 web/ai_translate_workflows.py create mode 100644 web/analyze_missing_translations.py create mode 100644 web/apply_workflows_translations.py create mode 100644 web/batch_translate_workflows.py create mode 100644 web/batch_translate_zh_hant.py create mode 100644 web/check_ru_ts_file.py create mode 100644 web/check_russian_translations.py create mode 100644 web/check_translation_progress.py create mode 100644 web/fix_i18n_keys.py create mode 100644 web/fix_ru_mixed_text.py create mode 100644 web/fix_ru_workflows.py create mode 100644 web/fix_russian_translations.py create mode 100644 web/replace_ru_workflows.py create mode 100644 web/todo_translations.json create mode 100644 web/translate_i18n_keys.py create mode 100644 web/translation_template.json create mode 100644 web/workflows_chinese_texts.json create mode 100644 web/workflows_section.txt create mode 100644 web/workflows_translation_guide.md create mode 100644 web/workflows_translations.json diff --git a/plans/translation-analysis-report.txt b/plans/translation-analysis-report.txt new file mode 100644 index 00000000..417d8480 --- /dev/null +++ b/plans/translation-analysis-report.txt @@ -0,0 +1,3791 @@ +翻译分析报告 +============================================================ + + +文件: ja-JP.ts +总键数: 1406 +英文键数: 76 +缺失键数: 69 + +英文键列表: + starOnGitHub: 'GitHubでStarする' + dataCollectionPolicyUrl: 'https://link.langbot.app/ja/docs/data-policy' + apiIntegration: 'API統合' + apiKeys: 'API キー' + webhooks: 'Webhooks' + createWebhook: 'Webhook を作成' + webhookName: 'Webhook 名' + webhookUrl: 'Webhook コールバック URL' + webhookDescription: 'Webhook の説明' + webhookNameRequired: 'Webhook 名は必須です' + webhookUrlRequired: 'Webhook URL は必須です' + apiKey: 'APIキー' + syncSuccess: '同期完了:{{created}} 件作成、{{updated}} 件更新' + langbotModels: 'LangBot モデル' + rerankUrlTooltip: '再順位付けエンドポイントの完全URL(例: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + dateFormat: '{{month}}月{{day}}日' + ruleValuePrefixPlaceholder: '例: !draw' + ruleValueRegexpPlaceholder: '例: ^/help' + webhookUrlCopied: 'Webhook URL をコピーしました' + webhookSaasLink: 'LangBot Cloud の詳細はこちら' + connectionError: 'WebSocket接続エラー' + fromGithub: 'GitHubから' + new: 'New' + repoUrlPlaceholder: '例: https://github.com/owner/repo' + releaseTag: 'タグ: {{tag}}' + releaseName: '名前: {{name}}' + publishedAt: '公開日: {{date}}' + assetSize: 'サイズ: {{size}}' + depsProgress: '{{installed}}/{{total}} インストール済み · 残り {{remaining}} 個' + stdio: 'Stdioモード' + http: 'HTTPモード' + connectionFailed: 'WebSocket接続失敗' + starCount: 'スター:{{count}}' + extraParametersDescription: 'リクエストボディに追加されるパラメータ(max_tokens、temperature、top_p など)' + copySuffix: ' Copy' + connected: 'WebSocket接続済み' + disconnected: 'WebSocket未接続' + topK: 'Top K' + initWithSpace: 'Space で初期化' + recoveryKeyDescription: '設定ファイル `data/config.yaml` の `system.recovery_key` に保存されています' + embeddingCalls: 'Embedding コール' + llmStats: 'LLM統計' + mcp: 'MCP' + skipConfirmOk: 'OK' + platformConfig: '{{platform}} 設定' + aiConfig: '{{engine}} 設定' + uuid: 'UUID' + successfulCount: '成功{{count}}件' + conditionPlaceholder: '条件式を入力してください。例: output.success == true' + webhookTrigger: 'Webhookトリガー' + codeExecutorDescription: 'Python/JavaScriptコードを実行' + jsonTransform: 'JSON変換' + callPipeline: 'Pipeline呼び出し' + langflowFlow: 'Langflowフロー' + cozeBot: 'Coze Bot' + cozeBotDescription: 'Coze Botを呼び出し' + redisOperation: 'Redis操作' + conversationIdPlaceholder: 'Conversation unique identifier' + showingExecutions: '{{shown}} / {{total}}件の実行を表示中' + cron: 'Cron式' + path: 'Webhookパス' + content_type: 'Content-Type' + temperature: 'Temperature' + top_p: 'Top P' + pipeline_uuid: 'Pipeline' + connection_url: '接続URL' + webhook_body: 'Webhookボディ' + webhook_headers: 'Webhookヘッダー' + webhook_query: 'Webhookクエリ' + webhook_method: 'Webhookメソッド' + http_body: 'HTTPボディ' + http_response: 'HTTP応答' + pipeline_response: 'Pipeline応答' + redis_key: 'Redisキー' + redis_value: 'Redis値' + answer: 'Dify回答' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ + +文件: zh-Hant.ts +总键数: 1406 +英文键数: 553 +缺失键数: 69 + +英文键列表: + integration: 'Integration' + welcome: '歡迎回到 LangBot 👋' + retry: 'Retry' + language: 'Programming Language' + starOnGitHub: '在 GitHub 上 Star' + cancel: 'Cancel Execution' + name: 'Name' + dataCollectionPolicyUrl: 'https://link.langbot.app/zh/docs/data-policy' + loading: 'Loading...' + loginWithSpace: '使用 Space 登入' + spaceLoginTitle: '透過 Space 登入' + spaceLoginFailed: 'Space 登入失敗' + spaceLoginSuccessDescription: '正在跳轉到 LangBot...' + apiIntegration: 'API 整合' + apiKeys: 'API 金鑰' + apiKeyHint: 'API 金鑰允許外部系統訪問 LangBot 的 Service API' + webhooks: 'Webhooks' + createWebhook: '建立 Webhook' + webhookName: 'Webhook 名稱' + webhookUrl: 'Webhook 回調位址' + webhookDescription: 'Webhook 描述' + webhookCreated: 'Webhook 建立成功' + webhookDeleted: 'Webhook 刪除成功' + webhookNameRequired: 'Webhook 名稱不能為空' + webhookUrlRequired: 'Webhook URL 不能為空' + noWebhooks: '暫無 Webhook' + more: '更多 ({{count}})' + modelBaseURL: '基礎 URL' + apiKeyRequired: 'API Key不能為空' + mustBeTrueOrFalse: '必須是 true 或 false' + requestURL: '請求URL' + scanURLPlaceholder: '留空則使用請求 URL + /models' + apiKey: 'API Key' + value: 'Value' + syncSuccess: '同步完成:建立 {{created}} 個,更新 {{updated}} 個' + langbotModelsDescription: '由 LangBot Space 提供的雲端模型' + langbotModels: 'LangBot 模型' + rerankUrlTooltip: '完整 URL 覆蓋重排序端點(例如:https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + modelsCount: '{{count}} 個模型' + dateFormat: '{{month}}月{{day}}日' + log: 'Log' + basicInfo: 'Basic Info' + basicInfoDescription: 'Set workflow name and description' + ruleValuePrefixPlaceholder: '如: !draw' + ruleValueRegexpPlaceholder: '如: ^/help' + dangerZone: 'Danger Zone' + dangerZoneDescription: 'Irreversible operations' + webhookUrlCopied: 'Webhook 位址已複製' + webhookSaasLink: '了解 LangBot Cloud' + viewDetails: 'View Details' + noLogs: 'No logs yet' + variables: 'Variables' + platform: 'Platform' + marketplace: 'Marketplace' + installFromGithub: '從Github安裝MCP伺服器' + connectionError: 'WebSocket連線錯誤' + confirmDeletePlugin: '您確定要刪除外掛({{author}}/{{name}})嗎?' + deleteConfirm: 'Confirm Delete' + fromGithub: '來自 GitHub' + confirmUpdatePlugin: '您確定要更新插件({{author}}/{{name}})嗎?' + failed: 'Failed' + repoUrlPlaceholder: '例如: https://github.com/owner/repo' + fetchingReleases: '正在獲取 Release 列表...' + selectRelease: '選擇 Release' + noReleasesFound: '未找到 Release' + fetchReleasesError: '獲取 Release 列表失敗:' + noAssetsFound: '該 Release 沒有可用的 .lbpkg 文件' + backToReleases: '返回 Release 列表' + releaseTag: 'Tag: {{tag}}' + releaseName: '名稱: {{name}}' + publishedAt: '發佈於: {{date}}' + assetSize: '大小: {{size}}' + installFromGithubDesc: '從 GitHub Release 安裝插件' + completed: 'Is Completed' + depsProgress: '已安裝 {{installed}}/{{total}} · 剩餘 {{remaining}} 個' + totalPlugins: '共 {{count}} 個插件' + stdio: 'Stdio模式' + sse: 'SSE模式' + http: 'HTTP模式' + url: 'Request URL' + headers: 'Request Headers' + timeout: 'Timeout' + connectionFailed: 'WebSocket連線失敗' + toolCount: '{{count}} 個工具' + starCount: '星標:{{count}}' + extraParametersDescription: '將在請求時附加到請求體中,如 max_tokens, temperature, top_p 等' + today: 'Today' + copySuffix: ' Copy' + unsavedChanges: 'Unsaved changes' + connected: 'WebSocket已連線' + disconnected: 'WebSocket未連線' + notConnected: 'WebSocket未連線,請稍後重試' + documents: 'Retrieved Documents' + status: 'Send Status' + supportedFormats: '支援 PDF、Word、TXT、Markdown 等文檔格式' + query: 'Query Parameters' + content: 'Content' + embeddingModelRequired: '此引擎需要Embedding模型' + running: 'Running' + recoveryKeyDescription: '儲存在設定檔案`data/config.yaml`的`system.recovery_key`中' + spaceStatus: 'Space 帳戶' + bindSpace: '綁定 Space 帳戶' + llmCallsCount: 'LLM調用' + successRate: 'Success Rate' + llmCalls: 'LLM 呼叫' + embeddingCalls: 'Embedding 呼叫' + errors: 'Error List' + message: 'Message Content' + sessionId: 'Session ID' + model: 'Model' + duration: 'Duration' + startTime: 'Start Time' + llmStats: 'LLM統計' + mcp: 'MCP' + action: 'Actions' + platformConfig: '{{platform}} 配置' + aiConfig: '{{engine}} 配置' + basicInfoDesc: 'Set workflow name, icon and description' + dangerZoneDesc: 'Irreversible operations' + deleteWorkflowAction: 'Delete this workflow' + deleteWorkflowHint: 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.' + deleteWorkflow: 'Delete Workflow' + deleteConfirmDesc: 'Are you sure you want to delete workflow ' + namePlaceholder: 'Enter workflow name' + descriptionPlaceholder: 'Enter workflow description (optional)' + enabled: 'Enabled' + enabledDesc: 'When enabled, the workflow can be triggered for execution' + info: 'Workflow Info' + uuid: 'UUID' + version: 'Version' + createdAt: 'Created At' + updatedAt: 'Updated At' + totalExecutions: '{{count}} execution(s) total' + statistics: 'Statistics' + successfulCount: '{{count}} successful' + averageDuration: 'Avg. Duration' + perExecution: 'per execution' + failedExecutions: 'Failed' + lastExecution: 'Last run' + filterByStatus: 'Filter by status' + allStatuses: 'All statuses' + manualTrigger: 'Manual Trigger' + triggerType: 'Trigger Type' + startedAt: 'Started At' + noExecutions: 'No executions yet' + executionDetails: 'Execution Details' + nodeExecutions: 'Node Executions' + result: 'Transform Result' + nodePalette: 'Node Palette' + properties: 'Properties' + zoomIn: 'Zoom In' + zoomOut: 'Zoom Out' + fitView: 'Fit View' + paste: 'Paste' + deleted: 'Deleted' + nothingToCopy: 'No nodes selected to copy' + nothingToPaste: 'Clipboard is empty' + copied: 'Copied {{count}} node(s)' + pasted: 'Pasted {{count}} node(s)' + nodesSelected: '{{count}} node(s) selected' + edgesSelected: '{{count}} edge(s) selected' + searchNodes: 'Search nodes...' + loadingNodeTypes: 'Loading node types...' + noNodesFound: 'No matching nodes found' + clearSearch: 'Clear search' + dragToAdd: 'Drag nodes to add to canvas' + selectNodeOrEdge: 'Select a node or edge' + selectNodeOrEdgeHint: 'Click on a node or edge in the canvas to view and edit its properties' + edgeProperties: 'Edge Properties' + nodeProperties: 'Node Properties' + condition: 'Condition Branch' + hasCondition: 'Set' + conditionPlaceholder: 'Enter condition expression, e.g. output.success == true' + conditionHelp: 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.' + deleteEdge: 'Delete Edge' + deleteEdgeConfirm: 'Confirm Delete Edge' + deleteEdgeConfirmDesc: 'This edge will be permanently removed.' + nodeLabel: 'Node Label' + nodeLabelPlaceholder: 'Enter node display name' + nodeId: 'Node ID' + inputOutputVariables: 'Input/Output Variables' + inputs: 'Inputs' + outputs: 'Outputs' + availableVariables: 'Available Variables' + globalVariables: 'Global Variables' + messageContent: 'Message Content' + nodeConfig: 'Node Configuration' + noConfigOptions: 'No configuration options for this node type' + deleteNode: 'Delete Node' + deleteNodeConfirm: 'Confirm Delete Node' + deleteNodeConfirmDesc: 'This node and all its connections will be permanently removed.' + input: 'Input' + text: 'Text' + context: 'Full Message Context' + body: 'Request Body' + items: 'Items' + arguments: 'Arguments' + question: 'User Question' + parameters: 'Extracted Parameters' + key: 'Key' + case_1: 'Case 1' + case_2: 'Case 2' + branch_1: 'Branch 1' + branch_2: 'Branch 2' + key_template: 'Key Template' + hash_field: 'Hash Field' + server_name: 'Server Name' + tool_name: 'Tool Name' + arguments_template: 'Arguments Template' + scope: 'Scope' + trigger: 'Triggers' + triggerDescription: 'Starting nodes for workflows' + messageTrigger: 'Message Trigger' + messageTriggerDescription: 'Triggered when a message is received' + scheduleTrigger: 'Schedule Trigger' + scheduleTriggerDescription: 'Triggered on a schedule' + cronTrigger: 'Cron Trigger' + cronTriggerDescription: 'Trigger workflow on a scheduled time' + webhookTrigger: 'Webhook Trigger' + webhookTriggerDescription: 'Triggered via HTTP request' + eventTrigger: 'Event Trigger' + eventTriggerDescription: 'Triggered on system events' + process: 'AI/Process' + processDescription: 'Data processing nodes' + aiProcess: 'AI Processing' + aiProcessDescription: 'Process messages using AI models' + llmCall: 'LLM Call' + llmCallDescription: 'Invoke large language model for conversation or generation' + codeProcess: 'Code Processing' + codeProcessDescription: 'Execute custom code' + codeExecutor: 'Code Executor' + codeExecutorDescription: 'Execute Python/JavaScript code' + templateProcess: 'Template Processing' + templateProcessDescription: 'Format output using templates' + httpRequest: 'HTTP Request' + httpRequestDescription: 'Send HTTP requests' + dataTransform: 'Data Transform' + dataTransformDescription: 'Transform data format' + questionClassifier: 'Question Classifier' + questionClassifierDescription: 'Classify user questions into predefined categories using LLM' + parameterExtractor: 'Parameter Extractor' + parameterExtractorDescription: 'Extract structured parameters from text using LLM' + knowledgeRetrieval: 'Knowledge Retrieval' + knowledgeRetrievalDescription: 'Retrieve relevant content from knowledge base' + textTemplate: 'Text Template' + textTemplateDescription: 'Generate text using templates with variable interpolation' + jsonTransform: 'JSON Transform' + jsonTransformDescription: 'Transform JSON data using expressions' + dataAggregator: 'Data Aggregator' + dataAggregatorDescription: 'Aggregate data from multiple sources' + textSplitter: 'Text Splitter' + textSplitterDescription: 'Split text into smaller chunks' + variableAssignment: 'Variable Assignment' + variableAssignmentDescription: 'Assign values to workflow variables' + control: 'Control Flow' + controlDescription: 'Flow control nodes' + conditionDescription: 'Branch based on conditions' + switch: 'Switch' + switchDescription: 'Multi-way branching' + loop: 'Loop' + loopDescription: 'Repeat execution' + iterator: 'Iterator' + iteratorDescription: 'Iterate over array elements' + parallel: 'Parallel Processing' + parallelDescription: 'Execute multiple branches in parallel' + wait: 'Wait' + waitDescription: 'Wait for specified time' + delay: 'Delay' + delayDescription: 'Wait for a specified time' + merge: 'Merge' + mergeDescription: 'Merge multiple branches' + variableAggregator: 'Variable Aggregator' + variableAggregatorDescription: 'Aggregate variable outputs from multiple branches' + actionDescription: 'Action execution nodes' + sendMessage: 'Send Message' + sendMessageDescription: 'Send message to platform' + replyMessage: 'Reply Message' + replyMessageDescription: 'Reply to the message that triggered the workflow' + storeData: 'Store Data' + storeDataDescription: 'Store data to database' + callPipeline: 'Call Pipeline' + callPipelineDescription: 'Call an existing Pipeline' + setVariable: 'Set Variable' + setVariableDescription: 'Set context variable' + openingStatement: 'Opening Statement' + openingStatementDescription: 'Provide conversation opener and suggested questions' + end: 'End' + endDescription: 'Mark the end of workflow execution' + logDescription: 'Record log information' + integrationDescription: 'Third-party platform integration nodes' + difyWorkflow: 'Dify Workflow' + difyWorkflowDescription: 'Call Dify platform workflow' + difyKnowledgeQuery: 'Dify Knowledge Query' + difyKnowledgeQueryDescription: 'Query Dify knowledge base' + n8nWorkflow: 'N8n Workflow' + n8nWorkflowDescription: 'Call n8n workflow' + langflowFlow: 'Langflow Flow' + langflowFlowDescription: 'Call Langflow flow' + cozeBot: 'Coze Bot' + cozeBotDescription: 'Call Coze Bot' + databaseQuery: 'Database Query' + databaseQueryDescription: 'Execute database queries' + redisOperation: 'Redis Operation' + redisOperationDescription: 'Perform Redis cache operations' + mcpTool: 'MCP Tool' + mcpToolDescription: 'Invoke an MCP tool' + memoryStore: 'Memory Store' + memoryStoreDescription: 'Store and retrieve data from workflow memory' + cancelled: 'Cancelled' + nodeResults: 'Node Execution Results' + current: 'Current Version' + rollback: 'Rollback to this version' + rollbackConfirm: 'Are you sure you want to rollback to this version? Current changes will be lost.' + rollbackSuccess: 'Rollback successful' + rollbackError: 'Failed to rollback: ' + debug: 'Debug' + debugMode: 'Debug Mode' + debugPanel: 'Debug Panel' + startDebug: 'Start Debug' + pauseDebug: 'Pause' + resumeDebug: 'Resume' + stepDebug: 'Step' + stopDebug: 'Stop' + debugContext: 'Debug Context' + simulatedMessage: 'Simulated Message' + simulatedMessagePlaceholder: 'Enter the message content to simulate' + senderId: 'Sender ID' + senderIdPlaceholder: 'Sender unique identifier' + senderName: 'Sender Name' + senderNamePlaceholder: 'Sender display name' + conversationIdPlaceholder: 'Conversation unique identifier' + isGroup: 'Group Chat' + customVariables: 'Custom Variables' + addVariable: 'Add Variable' + variableName: 'Variable Name' + variableValue: 'Variable Value' + watchedVariables: 'Watched Variables' + addWatchVariable: 'Add Watch' + nodeStates: 'Node States' + breakpoints: 'Breakpoints' + toggleBreakpoint: 'Toggle Breakpoint' + breakpointSet: 'Breakpoint set' + breakpointRemoved: 'Breakpoint removed' + debugLogs: 'Debug Logs' + clearLogs: 'Clear Logs' + autoScroll: 'Auto Scroll' + idle: 'Idle' + paused: 'Paused' + pending: 'Pending' + skipped: 'Skipped' + filterByDate: 'Filter by Date' + allTime: 'All Time' + lastWeek: 'Last Week' + lastMonth: 'Last Month' + showingExecutions: 'Showing {{shown}} / {{total}} executions' + rerun: 'Rerun' + rerunExecution: 'Rerun Execution' + details: 'Details' + completedAt: 'Completed At' + noNodeExecutions: 'No node executions yet' + conditions: 'Trigger Conditions' + keyword_filter: 'Keyword Filter' + regex_filter: 'Regex Filter' + min_length: 'Min Length' + max_length: 'Max Length' + require_mention: 'Require Mention' + respond_rules: 'Group Respond Rules' + access_control: 'Access Control' + cron: 'Cron Expression' + timezone: 'Timezone' + path: 'Webhook Path' + allowed_methods: 'Allowed HTTP Methods' + content_type: 'Content-Type' + auth_type: 'Authentication Type' + auth_key: 'Auth Key' + validation: 'Request Validation' + event_types: 'Event Types' + filter: 'Event Filter' + debounce_ms: 'Debounce Time' + prompt_template: 'Prompt Template' + system_prompt: 'System Prompt' + temperature: 'Temperature' + top_p: 'Top P' + frequency_penalty: 'Frequency Penalty' + presence_penalty: 'Presence Penalty' + max_tokens: 'Max Tokens' + stop_sequences: 'Stop Sequences' + seed: 'Random Seed' + stream: 'Stream Output' + use_conversation_history: 'Use Conversation History' + code: 'Code' + method: 'Request Method' + auth_config: 'Auth Configuration' + transform_type: 'Transform Type' + template: 'Template' + expression: 'Expression' + output_type: 'Output Type' + categories: 'Categories' + instruction: 'Instruction' + knowledge_bases: 'Knowledge Bases' + top_k: 'Top K Results' + score_threshold: 'Score Threshold' + search_method: 'Search Method' + enable_citations: 'Enable Citations' + condition_type: 'Condition Type' + condition_expression: 'Condition Expression' + left_value: 'Left Value' + operator: 'Comparison Operator' + right_value: 'Right Value' + cases: 'Branch Cases' + max_iterations: 'Max Iterations' + break_condition: 'Break Condition' + max_concurrency: 'Max Concurrency' + branches: 'Branch Configuration' + wait_all: 'Wait All' + fail_fast: 'Fail Fast' + duration_type: 'Time Unit' + merge_strategy: 'Merge Strategy' + variable_mappings: 'Variable Mappings' + aggregation_mode: 'Aggregation Mode' + target_type: 'Target Type' + target_id: 'Target ID' + message_type: 'Message Type' + reply_mode: 'Reply Mode' + message_template: 'Message Template' + long_text_processing: 'Long Text Processing' + force_delay: 'Force Delay' + pipeline_uuid: 'Pipeline' + inherit_context: 'Inherit Context' + storage_type: 'Storage Type' + ttl: 'TTL' + key_prefix: 'Key Prefix' + variable_name: 'Variable Name' + variable_scope: 'Variable Scope' + set_variable_operation: 'Operation Type' + statement: 'Opening Statement' + suggested_questions: 'Suggested Questions' + show_suggestions: 'Show Suggestions' + output_format: 'Output Format' + success_message: 'Success Message' + connection_type: 'Database Type' + connection_string: 'Connection String' + query_type: 'Query Type' + connection_url: 'Connection URL' + operation: 'Operation Type' + dataset_id: 'Dataset ID' + sender_id: 'Sender ID' + sender_name: 'Sender Name' + is_group: 'Is Group Chat' + schedule: 'Trigger Schedule' + cron_timestamp: 'Cron Timestamp' + cron_schedule: 'Cron Schedule' + cron_context: 'Cron Context' + webhook_body: 'Webhook Body' + webhook_headers: 'Webhook Headers' + webhook_query: 'Webhook Query' + webhook_method: 'Webhook Method' + event_type: 'Event Type' + event_data: 'Event Data' + event_timestamp: 'Event Timestamp' + response: 'Model Response' + usage: 'Token Usage Statistics' + prompt: 'Prompt/Question' + context_info: 'Context Information' + output: 'Output Data' + console: 'Console Output' + code_input: 'Code Input' + code_output: 'Code Output' + status_code: 'Status Code' + http_body: 'HTTP Body' + http_headers: 'HTTP Headers' + http_response: 'HTTP Response' + response_headers: 'Response Headers' + transform_input: 'Transform Input' + transform_result: 'Transform Result' + category: 'Category Result' + confidence: 'Confidence' + all_scores: 'All Category Scores' + extraction_success: 'Extraction Success' + extract_text: 'Input Text' + citations: 'Citation Information' + knowledge_context: 'Merged Context' + knowledge_query: 'Retrieval Query' + true: 'True Branch Output' + false: 'False Branch Output' + condition_input: 'Condition Input' + matched_case: 'Matched Branch Output' + default: 'Default Branch Output' + switch_input: 'Switch Input' + item: 'Current Item' + index: 'Current Index' + results: 'All Iteration Results' + loop_items: 'Items to Iterate' + is_first: 'Is First' + is_last: 'Is Last' + iterator_array: 'Input Array' + iterator_item: 'Current Element' + iterator_index: 'Current Index' + parallel_input: 'Parallel Input' + parallel_results: 'All Branch Results' + wait_input: 'Passthrough Input' + wait_output: 'Passthrough Output' + merged: 'Merged Result' + merge_array: 'Array Result' + merge_input_1: 'Input 1' + merge_input_2: 'Input 2' + merge_input_3: 'Input 3' + merge_input_4: 'Input 4' + aggregated: 'Aggregated Variables' + aggregator_variables: 'Variable Input' + message_id: 'Message ID' + target: 'Target ID' + reply_message: 'Reply Content' + pipeline_response: 'Pipeline Response' + pipeline_result: 'Full Result' + pipeline_query: 'Query Content' + context_data: 'Context Data' + store_status: 'Store Status' + store_key: 'Store Key' + store_value: 'Store Value' + variable_value: 'Variable Value' + variable_result: 'Set Variable Result' + workflow_output: 'Workflow Output' + final_result: 'Final Result' + query_results: 'Query Results' + row_count: 'Affected/Returned Rows' + query_success: 'Query Success' + query_params: 'Query Parameters' + redis_result: 'Operation Result' + redis_success: 'Operation Success' + redis_key: 'Redis Key' + redis_value: 'Redis Value' + plugin_input: 'Plugin Input' + tool_result: 'Tool Execution Result' + tool_success: 'Tool Call Success' + mcp_arguments: 'Tool Arguments' + memory_result: 'Retrieved/Stored Value' + memory_success: 'Operation Success' + memory_value: 'Value to Store' + answer: 'Dify Answer' + dify_success: 'Call Success' + dify_query: 'User Input/Query' + search_results: 'Search Results' + knowledge_base_query: 'Query Content' + n8n_result: 'Workflow Execution Result' + n8n_success: 'Call Success' + n8n_payload: 'Workflow Input Data' + flow_result: 'Flow Execution Result' + flow_success: 'Call Success' + langflow_input: 'Input Content' + bot_answer: 'Bot Reply' + bot_success: 'Call Success' + coze_query: 'User Input/Query' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ + +文件: es-ES.ts +总键数: 1405 +英文键数: 1375 +缺失键数: 70 + +英文键列表: + home: 'Inicio' + extensions: 'Extensiones' + installedPlugins: 'Plugins instalados' + pluginMarket: 'Tienda' + mcpServers: 'Servidores MCP' + pluginPages: 'Páginas de plugins' + pluginPagesTooltip: 'Páginas visuales proporcionadas por los plugins instalados' + quickStart: 'Inicio rápido' + login: 'Iniciar sesión' + logout: 'Cerrar sesión' + accountOptions: 'Configuración' + account: 'Cuenta' + integration: 'Integración' + email: 'Correo electrónico' + password: 'Contraseña' + welcome: 'Bienvenido de nuevo a LangBot 👋' + continueToLogin: 'Inicia sesión para continuar' + loginSuccess: 'Inicio de sesión exitoso' + loginFailed: 'Error de inicio de sesión, por favor verifica tu correo y contraseña' + loginLoadError: 'No se puede conectar al servidor' + loginLoadErrorDesc: 'No se puede conectar al backend de LangBot. Asegúrate de que el servicio esté en ejecución e inténtalo de nuevo.' + retry: 'Reintentar' + enterEmail: 'Introduce la dirección de correo electrónico' + enterPassword: 'Introduce la contraseña' + invalidEmail: 'Por favor, introduce una dirección de correo electrónico válida' + emptyPassword: 'Por favor, introduce tu contraseña' + language: 'Lenguaje de programación' + helpDocs: 'Obtener ayuda' + featureRequest: 'Solicitar función' + starOnGitHub: 'Dar estrella en GitHub' + create: 'Crear' + edit: 'Editar' + delete: 'Eliminar archivo' + add: 'Añadir' + select: 'Seleccionar' + cancel: 'CancelarEjecutar' + submit: 'Enviar' + error: 'Error' + success: 'Migración de base de conocimiento completada' + save: 'Guardar' + saving: 'Guardando...' + confirm: 'Confirmar' + confirmDelete: 'Confirmar eliminación' + deleteConfirmation: '¿Está seguro de que desea eliminar este flujo de trabajo?' + selectOption: 'Selecciona una opción' + selectPreset: 'Seleccionar preajuste' + required: 'Obligatorio' + enable: 'Activar' + name: 'Nombre' + description: 'Descripción' + icon: 'Icono' + close: 'Cerrar' + deleteSuccess: 'Eliminado exitosamente' + deleteError: 'Error al eliminar:' + addRound: 'Añadir ronda' + copy: 'Copiar' + copySuccess: '复制Éxito' + copyFailed: 'Error al copiar' + test: 'Probar' + forgotPassword: '¿Olvidaste tu contraseña?' + agreementNotice: 'Al continuar, aceptas nuestra' + privacyPolicy: 'Política de privacidad' + and: 'y' + dataCollectionPolicy: 'Política de recopilación de datos' + dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy' + loading: 'Cargar中...' + fieldRequired: 'Este campo es obligatorio' + or: 'o' + loginWithSpace: 'Iniciar sesión con Space' + spaceLoginRecommended: 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube' + loginLocal: 'Iniciar sesión con cuenta local' + loginWithPassword: 'Iniciar sesión con contraseña' + spaceLoginTitle: 'Iniciar sesión con Space' + spaceLoginDescription: 'Escanea el código QR o visita el enlace para autorizar' + spaceLoginUserCode: 'Tu código' + spaceLoginExpires: 'El código expira en {{seconds}} segundos' + spaceLoginWaiting: 'Esperando autorización...' + spaceLoginSuccess: 'Autorización exitosa' + spaceLoginFailed: 'Error de inicio de sesión con Space' + spaceLoginExpired: 'El código de autorización ha expirado, por favor inténtalo de nuevo' + spaceLoginCancel: 'Cancelar' + spaceLoginVisitLink: 'Visitar enlace' + spaceLoginProcessing: 'Iniciando sesión con Space' + spaceLoginProcessingDescription: 'Por favor espera mientras completamos tu inicio de sesión...' + spaceLoginSuccessDescription: 'Redirigiendo a LangBot...' + spaceLoginError: 'Error de inicio de sesión' + spaceLoginNoCode: 'Falta el código de autorización' + backToLogin: 'Volver al inicio de sesión' + backToHome: 'Volver al inicio' + spaceAccountCannotChangePassword: 'Las cuentas de Space no pueden cambiar la contraseña aquí' + theme: 'Tema' + changePassword: 'Cambiar contraseña' + currentPassword: 'Contraseña actual' + newPassword: 'Nueva contraseña' + confirmNewPassword: 'Confirmar nueva contraseña' + enterCurrentPassword: 'Introduce la contraseña actual' + enterNewPassword: 'Introduce la nueva contraseña' + enterConfirmPassword: 'Confirma la nueva contraseña' + currentPasswordRequired: 'La contraseña actual es obligatoria' + newPasswordRequired: 'La nueva contraseña no puede estar vacía' + confirmPasswordRequired: 'La confirmación de contraseña es obligatoria' + passwordsDoNotMatch: 'Las contraseñas no coinciden' + changePasswordSuccess: 'Contraseña cambiada correctamente' + changePasswordFailed: 'Error al cambiar la contraseña, por favor verifica tu contraseña actual' + apiIntegration: 'Integración API' + apiKeys: 'Claves API' + manageApiIntegration: 'Gestionar integración API' + manageApiKeys: 'Gestionar claves API' + createApiKey: 'Crear clave API' + apiKeyName: 'Nombre de la clave API' + apiKeyDescription: 'Descripción de la clave API' + apiKeyValue: 'Valor de la clave API' + apiKeyCreated: 'Clave API creada correctamente' + apiKeyDeleted: 'Clave API eliminada correctamente' + apiKeyDeleteConfirm: '¿Estás seguro de que deseas eliminar esta clave API?' + apiKeyNameRequired: 'El nombre de la clave API es obligatorio' + copyApiKey: 'Copiar clave API' + apiKeyCopied: 'Clave API copiada al portapapeles' + noApiKeys: 'No hay claves API configuradas' + apiKeyHint: 'Las claves API permiten a sistemas externos acceder a las API del servicio LangBot' + webhooks: 'Webhooks' + createWebhook: 'Crear Webhook' + webhookName: 'Nombre del Webhook' + webhookUrl: 'URL de callback Webhook' + webhookDescription: 'Descripción del Webhook' + webhookEnabled: 'Activado' + webhookCreated: 'Webhook creado correctamente' + webhookDeleted: 'Webhook eliminado correctamente' + webhookDeleteConfirm: '¿Estás seguro de que deseas eliminar este Webhook?' + webhookNameRequired: 'El nombre del Webhook es obligatorio' + webhookUrlRequired: 'La URL del Webhook es obligatoria' + noWebhooks: 'No hay Webhooks configurados' + webhookHint: 'Los Webhooks permiten a LangBot enviar eventos de mensajes personales y grupales a sistemas externos' + actions: 'Acciones' + apiKeyCreatedMessage: 'Por favor copia esta clave API, si el botón no funciona, cópiala manualmente.' + none: 'Ninguno' + more: 'Más ({{count}})' + less: 'Menos' + noItems: 'Sin elementos' + title: 'Conversación de Flujo de Trabajo' + back: 'Volver' + help: 'Obtener ayuda' + createModel: 'Crear modelo Embedding' + editModel: 'Editar modelo Embedding' + getModelListError: 'Error al obtener la lista de modelos Embedding: ' + modelName: 'Nombre del modelo' + modelProvider: 'Proveedor del modelo' + modelBaseURL: 'URL base' + modelAbilities: 'Capacidades del modelo' + saveSuccess: 'Guardado exitosamente' + saveError: 'Error al guardar:' + createSuccess: 'Flujo de trabajo creado exitosamente' + createError: 'Error al crear:' + modelNameRequired: 'El nombre del modelo no puede estar vacío' + modelProviderRequired: 'El proveedor del modelo no puede estar vacío' + requestURLRequired: 'La URL de solicitud no puede estar vacía' + apiKeyRequired: 'La clave API no puede estar vacía' + keyNameRequired: 'El nombre de la clave no puede estar vacío' + mustBeValidNumber: 'Debe ser un número válido' + mustBeTrueOrFalse: 'Debe ser verdadero o falso' + requestURL: 'URL de solicitud' + scanURL: 'URL de escaneo de modelos' + scanURLPlaceholder: 'Déjalo vacío para usar URL de solicitud + /models' + scanURLDescription: 'Ingresa el endpoint real de la lista de modelos cuando el escaneo de modelos no utiliza la misma dirección que la invocación del modelo.' + apiKey: 'Clave API' + abilities: 'Capacidades' + selectModelAbilities: 'Seleccionar capacidades del modelo' + visionAbility: 'Capacidad de visión' + functionCallAbility: 'Llamada a funciones' + extraParameters: 'Parámetros adicionales' + addParameter: 'Añadir parámetro' + keyName: 'Nombre de la clave' + type: 'Tipo' + value: 'Valor' + string: 'Cadena' + number: 'Número' + boolean: 'Booleano' + object: 'Objeto' + invalidJsonObject: 'El valor debe ser un objeto JSON válido' + selectModelProvider: 'Seleccionar proveedor del modelo' + modelProviderDescription: 'Por favor, introduce el nombre del modelo proporcionado por el proveedor' + modelManufacturer: 'Fabricante del modelo' + aggregationPlatform: 'Plataforma de agregación' + selfDeployed: 'Autoalojado' + builtin: 'Integrado' + selectModel: 'Seleccionar modelo' + testSuccess: 'Prueba exitosa' + testError: 'Error de prueba' + llmModels: 'LLM' + localProvider: 'Local' + localProviderDescription: 'Modelos configurados y gestionados localmente' + spaceProviderDescription: 'Modelos sincronizados desde tu cuenta de Space' + spaceDisabledForLocalAccount: 'Inicia sesión con Space para usar modelos en la nube' + syncModels: 'Sincronizar' + syncSuccess: 'Sincronización completa: {{created}} creados, {{updated}} actualizados' + syncError: 'Error de sincronización: ' + spaceModelReadOnly: 'Los modelos de Space son de solo lectura' + noSpaceModels: 'No hay modelos de Space. Haz clic en Sincronizar para obtener modelos de Space.' + noLocalModels: 'No hay modelos locales. Haz clic en Crear para añadir un modelo.' + providerCount: '{{count}} proveedores' + addModel: 'Añadir modelo' + manualAdd: 'Manual' + scanAdd: 'Escanear' + scanModels: 'Escanear modelos' + scanModelsHint: 'Lee los modelos disponibles del proveedor actual y luego elige cuáles agregar.' + scannedModels: 'Modelos detectados' + scanDebug: 'Información de depuración' + searchScannedModels: 'Buscar modelos detectados' + noScannedModels: 'Todavía no hay resultados. Pulsa el botón superior para escanear.' + noScannedModelsMatch: 'No hay modelos coincidentes' + addSelectedModels: 'Agregar seleccionados' + addSelectedModelsSuccess: 'Se agregaron {{count}} modelo(s)' + selectAll: 'Seleccionar todo' + alreadyAdded: 'Ya agregado' + addLLMModel: 'Añadir modelo LLM' + addEmbeddingModel: 'Añadir modelo Embedding' + provider: 'Proveedor' + existingProvider: 'Proveedor existente' + newProvider: 'Nuevo proveedor' + selectProvider: 'Seleccionar proveedor' + requester: 'Tipo de proveedor' + selectRequester: 'Seleccionar tipo de proveedor' + langbotModelsDescription: 'Modelos en la nube impulsados por LangBot Space' + credits: 'Créditos' + loginToUseModels: 'Inicia sesión con Space para usar modelos en la nube' + noModels: 'No hay modelos configurados' + langbotModels: 'Modelos LangBot' + spaceTrialTooltip: '¡Créditos de prueba gratuitos disponibles! Inicia sesión con Space para acceder a modelos en la nube sin configuración.' + unlockModels: 'Inicia sesión para usar' + editProvider: 'Editar proveedor' + addProvider: 'Añadir proveedor' + addProviderHint: 'Añade proveedores para usar modelos de otras fuentes' + addProviderHintSimple: 'Añade proveedores para usar modelos' + noProviders: 'Aún no hay proveedores' + providerName: 'Nombre del proveedor' + providerNameRequired: 'El nombre del proveedor es obligatorio' + requesterRequired: 'El tipo de proveedor es obligatorio' + providerSaved: 'Proveedor guardado' + providerCreated: 'Proveedor creado' + providerSaveError: 'Error al guardar el proveedor: ' + providerDeleted: 'Proveedor eliminado' + providerDeleteError: 'Error al eliminar el proveedor: ' + deleteProviderConfirmation: '¿Estás seguro de que deseas eliminar este proveedor?' + loadError: 'Error al cargar el flujo de trabajo' + chat: 'Chat' + embedding: 'Vector' + rerank: 'Reordenar' + rerankUrlTooltip: 'URL completa para el endpoint de reordenación (ej: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + rerankPathTooltip: 'Ruta añadida a la URL base (predeterminado: rerank, algunos servicios usan reranks)' + modelsCount: '{{count}} modelo(s)' + expandModels: 'Expandir' + collapseModels: 'Contraer' + primary: 'Modelo principal' + fallbackList: 'Modelos de respaldo' + addFallback: 'Añadir modelo de respaldo' + createBot: 'Crear Bot' + selectFromSidebar: 'Selecciona una página de plugin en la barra lateral' + editBot: 'Editar Bot' + getBotListError: 'Error al obtener la lista de Bots: ' + botName: 'Nombre del Bot' + botDescription: 'Descripción del Bot' + botNameRequired: 'El nombre del Bot no puede estar vacío' + botDescriptionRequired: 'La descripción del Bot no puede estar vacía' + adapterRequired: 'El adaptador no puede estar vacío' + defaultDescription: 'Un flujo de trabajo' + getBotConfigError: 'Error al obtener la configuración del Bot: ' + platformAdapter: 'Selección de plataforma/adaptador' + selectAdapter: 'Seleccionar adaptador' + adapterConfig: 'Configuración del adaptador' + viewAdapterDocs: 'Ver documentación' + bindPipeline: 'Vincular Pipeline' + selectPipeline: 'Seleccionar Pipeline' + selectBot: 'Seleccionar Bot' + botLogTitle: 'Registro del Bot' + enableAutoRefresh: 'Activar actualización automática' + session: 'Sesión' + yesterday: 'Ayer' + earlier: 'Anterior' + dateFormat: '{{day}}/{{month}}' + setBotEnableError: 'Error al establecer el estado de activación del Bot' + log: 'Registro' + configuration: 'Configuración' + logs: 'Registro' + basicInfo: '基础Información' + basicInfoDescription: '设置Flujo de TrabajoNombre和Descripción' + routingConnection: 'Enrutamiento y conexión' + routingConnectionDescription: 'Vincula el Pipeline que procesa los mensajes de este Bot' + routingRules: 'Reglas de enrutamiento condicional' + routingRulesDescription: 'Las reglas se evalúan en orden; la primera coincidencia enruta a su pipeline. Si ninguna coincide, se usa el pipeline predeterminado.' + addRoutingRule: 'Agregar regla' + ruleTypeLauncherType: 'Tipo de sesión' + ruleTypeLauncherId: 'ID de sesión' + ruleTypeMessageContent: 'Contenido del mensaje' + operatorEq: 'Igual a' + operatorNeq: 'No igual a' + operatorContains: 'Contiene' + operatorNotContains: 'No contiene' + operatorStartsWith: 'Comienza con' + operatorRegex: 'Regex' + operatorHas: 'Tiene' + operatorNotHas: 'No tiene' + ruleTypeMessageHasElement: 'Elemento del mensaje' + ruleValueElementPlaceholder: 'Seleccionar tipo de elemento' + elementImage: 'Imagen' + elementVoice: 'Voz' + elementFile: 'Archivo' + elementForward: 'Reenvío' + elementFace: 'Emoji' + elementAt: '@Mención' + elementAtAll: '@Todos' + elementQuote: 'Cita' + ruleValuePlaceholder: 'Valor de coincidencia' + ruleValueLauncherIdPlaceholder: 'ID de grupo o usuario' + ruleValueMessagePlaceholder: 'Texto del mensaje' + ruleValuePrefixPlaceholder: 'ej. !draw' + ruleValueRegexpPlaceholder: 'ej. ^/help' + pipelineDiscard: 'Descartar mensaje' + sessionTypePerson: 'Chat privado' + sessionTypeGroup: 'Chat grupal' + adapterConfigDescription: 'Configura el adaptador de plataforma seleccionado' + dangerZone: 'Zona peligrosa' + deleteBotAction: 'Eliminar este Bot' + deleteBotHint: 'Una vez eliminado, toda la configuración asociada se eliminará permanentemente.' + webhookUrlCopied: 'URL del Webhook copiada' + webhookUrlHint: 'Haz clic en el campo para seleccionar todo, luego presiona Ctrl+C (Mac: Cmd+C) para copiar, o haz clic en el botón' + webhookUrlHintEither: 'Usa cualquiera de las dos URL anteriores en la configuración de tu plataforma' + webhookSaasHint: 'Webhook requiere un dominio accesible públicamente. LangBot Cloud proporciona un punto de acceso público listo para usar para tu Bot.' + webhookSaasLink: 'Más información sobre LangBot Cloud' + popular: 'Popular' + china: 'China' + global: 'Global' + protocol: 'Protocolo' + logLevel: 'Nivel de registro' + allLevels: 'Todos los niveles' + selectLevel: 'Seleccionar nivel' + levelsSelected: 'niveles seleccionados' + viewDetailedLogs: 'Ver registros detallados' + viewDetails: 'Ver detalles' + collapse: 'Contraer' + imagesAttached: 'imagen(es) adjunta(s)' + noLogs: '暂无Registro' + sessions: 'Sesiones' + noSessions: 'No se encontraron sesiones' + selectSession: 'Selecciona una sesión para ver los mensajes' + noMessages: '暂无Mensaje' + messages: 'Mensajes' + messageCount: 'Mensajes' + loadingSessions: 'Cargando sesiones...' + loadingMessages: 'Cargando mensajes...' + user: 'Usuario' + variables: '监控Variable' + platform: 'Plataforma' + lastActive: 'Última actividad' + refresh: 'Actualizar' + active: 'Activo' + inactive: 'Inactivo' + discarded: 'Descartado' + userMessage: 'Usuario' + botMessage: 'Bot' + createPlugin: 'Crear plugin' + editPlugin: 'Editar plugin' + installed: 'Instalados' + marketplace: 'Tienda' + arrange: 'Ordenar plugins' + install: 'Instalar' + installPlugin: 'Instalar plugin' + onlySupportGithub: 'Actualmente solo se admite la instalación desde GitHub' + enterGithubLink: 'Introduce el enlace de GitHub del plugin' + installing: 'Instalando plugin...' + installSuccess: 'Plugin instalado correctamente' + installFailed: 'Error en la instalación, por favor inténtalo más tarde' + searchPlugin: 'Buscar plugins' + sortBy: 'Ordenar por' + mostStars: 'Más estrellas' + recentlyAdded: 'Añadidos recientemente' + recentlyUpdated: 'Actualizados recientemente' + noMatchingPlugins: 'No se encontraron plugins coincidentes' + getPluginListError: 'Error al obtener la lista de plugins:' + noPluginInstalled: 'No hay plugins instalados' + pluginConfig: 'Configuración del plugin' + pluginSort: 'Orden de plugins' + pluginSortDescription: 'El orden de los plugins afecta el orden de procesamiento dentro del mismo evento, arrastra la tarjeta del plugin para ordenar' + pluginSortSuccess: 'Orden de plugins aplicado correctamente' + pluginSortError: 'Error al ordenar plugins: ' + pluginNoConfig: 'El plugin no tiene elementos de configuración.' + systemDisabled: 'Sistema de plugins desactivado' + systemDisabledDesc: 'El sistema de plugins no está activado, por favor modifica la configuración según la documentación' + connectionError: 'WebSocket连接Error' + connectionErrorDesc: 'Verifica la configuración del sistema de plugins o contacta al administrador.' + errorDetails: 'Detalles del error' + loadingStatus: 'Comprobando el estado del sistema de plugins...' + failedToGetStatus: 'Error al obtener el estado del sistema de plugins' + pluginSystemNotReady: 'El sistema de plugins no está listo, no se puede realizar esta operación' + debugInfo: 'Información de depuración' + debugInfoTitle: 'Información de depuración del plugin' + debugUrl: 'URL de depuración' + debugKey: 'Clave de depuración' + noDebugKey: '(No establecida)' + debugKeyDisabled: 'La clave de depuración no está configurada, la depuración del plugin no requiere autenticación' + failedToGetDebugInfo: 'Error al obtener la información de depuración' + copiedToClipboard: 'Copiado al portapapeles' + deleting: 'Eliminando...' + deletePlugin: 'Eliminar plugin' + saveConfig: 'Guardar configuración' + confirmDeletePlugin: '¿Estás seguro de que deseas eliminar el plugin ({{author}}/{{name}})?' + deleteDataCheckbox: 'También eliminar la configuración y el almacenamiento persistente del plugin' + deleteConfirm: 'ConfirmarEliminar' + modifyFailed: 'Error al modificar: ' + Tool: 'Herramienta' + EventListener: 'Listener de eventos' + Command: 'Comando' + KnowledgeEngine: 'Motor de conocimiento' + Parser: 'Analizador' + Page: 'Página' + uploadLocal: 'Subir local' + debugging: 'Depuración' + uploadLocalPlugin: 'Subir plugin local' + dragToUpload: 'Arrastra el archivo del plugin aquí para subirlo' + unsupportedFileType: 'Tipo de archivo no soportado, solo se admiten archivos .lbpkg y .zip' + uploadingPlugin: 'Subiendo plugin...' + uploadSuccess: '¡Archivo subido correctamente!' + uploadFailed: 'Error en la subida' + selectFileToUpload: 'Selecciona el archivo del plugin para subir' + askConfirm: '¿Estás seguro de instalar el plugin ' + fromGithub: 'Desde GitHub' + fromLocal: 'Desde local' + fromMarketplace: 'Desde la tienda' + componentsList: 'Componentes: ' + noComponents: 'Sin componentes' + update: 'Actualizar plugin' + new: 'Nuevo' + updateConfirm: 'Confirmación de actualización' + confirmUpdatePlugin: '¿Estás seguro de que deseas actualizar el plugin ({{author}}/{{name}})?' + confirmUpdate: 'Confirmar actualización' + updating: 'Actualizando...' + updateSuccess: 'Actualizado correctamente' + updateError: 'Error al actualizar: ' + saveConfigSuccessNormal: 'Configuración guardada correctamente' + saveConfigError: 'Error al guardar la configuración: ' + config: 'Configuración' + readme: 'Documentación' + viewSource: 'Ver código fuente' + loadingReadme: 'Cargando documentación...' + noReadme: 'Este plugin no proporciona documentación README' + tooLarge: 'El tamaño del archivo supera el límite de 10MB' + failed: 'falló' + uploading: 'Subiendo...' + chooseFile: 'Elegir archivo' + addFile: 'Añadir archivo' + installFromGithub: 'Instalar servidor MCP desde GitHub' + enterRepoUrl: 'Introduce la URL del repositorio de GitHub' + repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo' + fetchingReleases: 'Obteniendo versiones...' + selectRelease: 'Seleccionar versión' + noReleasesFound: 'No se encontraron versiones' + fetchReleasesError: 'Error al obtener versiones: ' + selectAsset: 'Seleccionar archivo a instalar' + noAssetsFound: 'No hay archivos .lbpkg disponibles en esta versión' + fetchAssetsError: 'Error al obtener archivos: ' + backToReleases: 'Volver a versiones' + backToRepoUrl: 'Volver a la URL del repositorio' + backToAssets: 'Volver a archivos' + releaseTag: 'Etiqueta: {{tag}}' + releaseName: 'Nombre: {{name}}' + publishedAt: 'Publicado el: {{date}}' + prerelease: 'Pre-lanzamiento' + assetSize: 'Tamaño: {{size}}' + confirmInstall: 'Confirmar instalación' + installFromGithubDesc: 'Instalar plugin desde GitHub Release' + goToMarketplace: 'Ir a la tienda' + titleGeneric: 'Instalación de Plugin' + overallProgress: 'Progreso general' + downloading: 'Descargando Plugin' + installingDeps: 'Instalando dependencias' + initializing: 'Inicializando configuración' + launching: 'Iniciando Plugin' + completed: '已Completado' + downloadSize: 'Tamaño del paquete: {{size}}' + depsInfo: '{{count}} dependencias por instalar' + depsProgress: '{{installed}}/{{total}} instaladas · {{remaining}} restantes' + installComplete: 'Plugin instalado correctamente' + dismiss: 'Descartar datos originales' + background: 'Ejecutar en segundo plano' + taskQueue: 'Tareas de instalación' + clearCompleted: 'Limpiar completados' + noTasks: 'No hay tareas de instalación' + searchPlaceholder: 'Buscar plugins...' + searchResults: 'Se encontraron {{count}} plugins' + totalPlugins: 'Total {{count}} plugins' + noPlugins: 'No hay plugins disponibles' + noResults: 'Sin resultados' + loadingMore: 'Cargando más...' + allLoaded: 'Todos los plugins mostrados' + installConfirm: '¿Estás seguro de que deseas instalar el plugin ' + downloadComplete: 'Descarga del plugin ' + loadFailed: 'Error al cargar' + noDescription: 'No hay descripción disponible' + notFound: 'No se encontró la información del plugin' + mostDownloads: 'Más descargas' + leastDownloads: 'Menos descargas' + downloads: 'descargas' + download: 'Descargar' + repository: 'Repositorio' + downloadFailed: 'Error en la descarga' + tagLabel: 'Etiquetas' + submissionTitle: 'Tienes un envío de plugin en revisión: {{name}}' + submissionPending: 'Tu envío de plugin está en revisión: {{name}}' + submissionApproved: 'Tu envío de plugin ha sido aprobado: {{name}}' + submissionRejected: 'Tu envío de plugin ha sido rechazado: {{name}}' + clickToRevoke: 'Revocar' + revokeSuccess: 'Revocación exitosa' + revokeFailed: 'Error en la revocación' + submissionDetails: 'Detalles del envío del plugin' + markAsRead: 'Marcar como leído' + markAsReadSuccess: 'Marcado como leído' + markAsReadFailed: 'Error al marcar como leído' + filterByComponent: 'Componente' + allComponents: 'Todos los componentes' + requestPlugin: 'Solicitar plugin' + deprecated: 'Obsoleto' + deprecatedTooltip: 'Por favor, instala el plugin de motor de conocimiento correspondiente.' + filterByTags: 'Filtrar por etiquetas' + selected: 'seleccionadas' + selectTags: 'Seleccionar etiquetas' + clearAll: 'Borrar todo' + noTags: 'No hay etiquetas disponibles' + createServer: 'Añadir servidor MCP' + editServer: 'Editar servidor MCP' + deleteServer: 'Eliminar servidor MCP' + confirmDeleteServer: '¿Estás seguro de que deseas eliminar este servidor MCP?' + confirmDeleteTitle: 'Eliminar servidor MCP' + getServerListError: 'Error al obtener la lista de servidores MCP: ' + serverName: 'Nombre del servidor' + serverMode: 'Modo de conexión' + selectMode: 'Seleccionar modo' + stdio: 'Modo Stdio' + sse: 'Modo SSE' + http: 'Modo HTTP' + noServerInstalled: 'No hay servidores MCP configurados' + serverNameRequired: 'El nombre del servidor no puede estar vacío' + commandRequired: 'El comando no puede estar vacío' + urlRequired: 'La URL no puede estar vacía' + timeoutMustBePositive: 'El tiempo de espera debe ser un número positivo' + command: 'Comando' + args: 'Argumentos' + env: 'Variables de entorno' + url: 'Por favor求URL' + headers: 'Por favor求头' + timeout: 'Tiempo de esperaTiempo' + addArgument: 'Añadir argumento' + addEnvVar: 'Añadir variable de entorno' + addHeader: 'Añadir encabezado' + testing: 'Probando...' + connecting: 'Conectando...' + testFailed: 'Error en la prueba: ' + refreshSuccess: 'Actualización exitosa' + refreshFailed: 'Error en la actualización: ' + connectionSuccess: 'Conexión exitosa' + connectionFailed: 'WebSocket连接falló' + connectionFailedStatus: 'Conexión fallida' + toolsFound: 'herramientas' + unknownError: 'Error desconocido' + noToolsFound: 'No se encontraron herramientas' + parseResultFailed: 'Error al analizar el resultado de la prueba' + noResultReturned: 'La prueba no devolvió resultados' + getTaskFailed: 'Error al obtener el estado de la tarea' + noTaskId: 'No se obtuvo el ID de la tarea' + deleteFailed: 'Error al eliminar: ' + createFailed: 'Error al crear: ' + toolCount: '{{count}} herramientas' + statusConnected: 'Conectado' + statusDisconnected: 'Desconectado' + statusError: 'Error de conexión' + statusDisabled: 'Desactivado' + starCount: 'Estrellas: {{count}}' + nameRequired: 'El nombre no puede estar vacío' + sseTimeout: 'Tiempo de espera SSE' + sseTimeoutDescription: 'Tiempo de espera para establecer la conexión SSE' + extraParametersDescription: 'Se adjuntarán al cuerpo de la solicitud, como max_tokens, temperature, top_p, etc.' + timeoutMustBeNumber: 'El tiempo de espera debe ser un número' + timeoutNonNegative: 'El tiempo de espera no puede ser negativo' + sseTimeoutMustBeNumber: 'El tiempo de espera SSE debe ser un número' + sseTimeoutNonNegative: 'El tiempo de espera SSE no puede ser negativo' + updateFailed: 'Error al actualizar: ' + deleteMCPAction: 'Eliminar este servidor MCP' + deleteMCPHint: 'Una vez eliminada, la configuración de este servidor MCP no se podrá recuperar.' + createPipeline: 'Crear Pipeline' + editPipeline: 'Editar Pipeline' + debugChat: 'ConversaciónDepurar' + getPipelineListError: 'Error al obtener la lista de Pipelines: ' + daysAgo: 'días atrás' + today: 'Hoy' + updateTime: 'Actualizado ' + defaultBadge: 'Predeterminado' + newestCreated: 'Más recientes' + earliestCreated: 'Más antiguos' + recentlyEdited: 'Editados recientemente' + earliestEdited: 'Editados más antiguos' + aiCapabilities: 'IA' + triggerConditions: 'Disparador' + safetyControls: 'Seguridad' + outputProcessing: 'Salida' + descriptionRequired: 'La descripción no puede estar vacía' + copySuffix: ' Copia' + defaultPipelineCannotDelete: 'El Pipeline predeterminado no se puede eliminar' + copyConfirmTitle: 'Confirmar copia' + copyConfirmation: '¿Estás seguro de que deseas copiar este Pipeline? Esto creará un nuevo Pipeline con todas las configuraciones.' + unsavedChanges: '有未Guardarde更改' + deletePipelineAction: 'Eliminar este Pipeline' + deletePipelineHint: 'Una vez eliminado, los Bots vinculados a este Pipeline dejarán de funcionar.' + copyPipelineAction: 'Copiar este Pipeline' + copyPipelineHint: 'Crear un nuevo Pipeline con todas las configuraciones duplicadas.' + noPluginsAvailable: 'No hay plugins disponibles' + disabled: 'Desactivado' + noPluginsSelected: 'No hay plugins seleccionados' + addPlugin: 'Añadir plugin' + selectPlugins: 'Seleccionar plugins' + pluginsTitle: 'Plugins' + mcpServersTitle: 'Servidores MCP' + noMCPServersSelected: 'No hay servidores MCP seleccionados' + addMCPServer: 'Añadir servidor MCP' + selectMCPServers: 'Seleccionar servidores MCP' + noPluginsInstalled: 'No hay plugins instalados' + noMCPServersConfigured: 'No hay servidores MCP configurados' + enableAllPlugins: 'Activar todos los plugins' + enableAllMCPServers: 'Activar todos los servidores MCP' + allPluginsEnabled: 'Todos los plugins activados' + allMCPServersEnabled: 'Todos los servidores MCP activados' + sessionType: '会话Tipo' + privateChat: 'Chat privado' + groupChat: 'Chat grupal' + send: 'Enviar' + reset: '重置Conversación' + inputPlaceholder: 'Enviar {{type}} Mensaje...' + sendFailed: 'Enviarfalló' + resetSuccess: 'Conversación已重置' + resetFailed: '重置falló' + loadMessagesFailed: 'CargarMensajefalló' + loadPipelinesFailed: 'Error al cargar Pipelines' + atTips: 'Mencionar bot' + streaming: 'Transmisión' + streamOutput: 'Streaming' + connected: 'WebSocket已Conectar' + disconnected: 'WebSocket未Conectar' + notConnected: 'WebSocket未连接,Por favor稍后Reintentar' + reply: 'Responder' + replyTo: 'Responder给' + showMarkdown: 'Renderizar' + showRaw: 'Texto sin formato' + allMembers: 'Todos los miembros' + file: 'Archivo' + voice: 'Voz' + uploadImage: 'Subir imagen' + detailedLogs: 'Registros detallados' + createKnowledgeBase: 'Crear base de conocimiento' + editKnowledgeBase: 'Editar base de conocimiento' + selectKnowledgeBase: 'Seleccionar base de conocimiento' + selectKnowledgeBases: 'Seleccionar bases de conocimiento' + addKnowledgeBase: 'Añadir base de conocimiento' + noKnowledgeBaseSelected: 'No hay bases de conocimiento seleccionadas' + empty: 'Vacío' + editDocument: 'Documentos' + metadata: 'Metadatos' + kbNameRequired: 'El nombre de la base de conocimiento no puede estar vacío' + kbDescriptionRequired: 'La descripción de la base de conocimiento no puede estar vacía' + embeddingModelUUIDRequired: 'El modelo Embedding no puede estar vacío' + kbName: 'Nombre de la base de conocimiento' + kbDescription: 'Descripción de la base de conocimiento' + topK: 'Top K' + topKRequired: 'Top K no puede estar vacío' + topKMax: 'El valor máximo de Top K es 30' + topKdescription: 'Se usa para especificar el número de documentos relevantes a recuperar, con un rango de 1 a 30.' + embeddingModelUUID: 'Modelo Embedding' + selectEmbeddingModel: 'Seleccionar modelo Embedding' + embeddingModelDescription: 'Se usa para vectorizar el texto, puedes configurarlo en la página de Modelos' + cannotChangeEmbeddingModel: 'El modelo Embedding no se puede modificar una vez creada la base de conocimiento' + updateKnowledgeBaseSuccess: 'Base de conocimiento actualizada correctamente' + updateKnowledgeBaseFailed: 'Error al actualizar la base de conocimiento: ' + status: 'Estado' + dragAndDrop: 'Arrastra y suelta archivos aquí o haz clic para subir' + supportedFormats: 'Admite PDF, Word, TXT, Markdown, HTML, ZIP y otros formatos de documentos' + uploadError: 'Error al subir el archivo: ' + uploadingFile: 'Subiendo archivo...' + fileSizeExceeded: 'El tamaño del archivo supera el límite de 10MB. Por favor, divídelo en archivos más pequeños.' + fileDeleteSuccess: 'Archivo eliminado correctamente' + fileDeleteFailed: 'Error al eliminar el archivo: ' + processing: 'Procesando' + selectParser: 'Seleccionar analizador' + builtInParser: 'Proporcionado por el motor de conocimiento' + noParserAvailable: 'Ningún analizador admite este tipo de archivo. Por favor, instala un plugin de analizador que pueda manejar este formato.' + installParserHint: 'Buscar plugins de analizador en el Marketplace →' + confirmUpload: 'Subir' + cancelUpload: 'Cancelar' + deleteKnowledgeBaseConfirmation: '¿Estás seguro de que deseas eliminar esta base de conocimiento? Todos los documentos de esta base se eliminarán.' + retrieve: 'Prueba de recuperación' + retrieveTest: 'Prueba de recuperación' + query: 'SQLConsulta' + queryPlaceholder: 'Introduce el texto de consulta...' + distance: 'Distancia' + content: 'Contenido' + fileName: 'Nombre del archivo' + retrieveError: 'Error en la recuperación: ' + unknownEngine: 'Motor desconocido' + knowledgeEngine: 'Motor de conocimiento' + knowledgeEngineRequired: 'El motor de conocimiento es obligatorio' + selectKnowledgeEngine: 'Seleccionar motor de conocimiento' + builtInEngine: 'Motor integrado' + cannotChangeKnowledgeEngine: 'El motor de conocimiento no se puede cambiar después de la creación' + engineSettings: 'Configuración del motor' + engineSettingsDescription: 'Configuración del motor de conocimiento seleccionado' + engineSettingsReadonly: 'solo lectura en modo de edición' + retrievalSettings: 'Configuración de recuperación' + retrievalSettingsDescription: 'Configura cómo se recuperan los documentos de esta base de conocimiento' + deleteKbAction: 'Eliminar esta base de conocimiento' + deleteKbHint: 'Una vez eliminada, todos los documentos y datos de esta base de conocimiento se eliminarán permanentemente.' + noEnginesAvailable: 'No hay motores de base de conocimiento disponibles' + installEngineHint: 'Por favor, instala primero un plugin de ' + createKnowledgeBaseFailed: 'Error al crear la base de conocimiento: ' + loadKnowledgeBaseFailed: 'Error al cargar la base de conocimiento: ' + deleteKnowledgeBaseFailed: 'Error al eliminar la base de conocimiento: ' + getKnowledgeBaseListError: 'Error al obtener la lista de bases de conocimiento: ' + embeddingModel: 'Embedding' + embeddingModelRequired: 'El modelo Embedding es obligatorio para este motor' + addExternal: 'Añadir base de conocimiento externa' + createExternalSuccess: 'Base de conocimiento externa creada correctamente' + updateExternalSuccess: 'Base de conocimiento externa actualizada correctamente' + deleteExternalSuccess: 'Base de conocimiento externa eliminada correctamente' + retriever: 'Recuperador' + selectRetriever: 'Seleccionar un recuperador...' + retrieverConfiguration: 'Configuración del recuperador' + retrieverInstallInfo: 'Puedes instalar plugins de recuperador de conocimiento desde' + retrieverMarketLink: 'aquí' + detected: 'Se encontraron {{total}} base(s) de conocimiento para migrar ({{internal}} internas, {{external}} externas).' + startWithInstall: 'Auto-instalar plugin y migrar' + startDataOnly: 'Migrar solo datos' + running: 'Ejecutar中' + dismissError: 'Error en la operación' + adminAccountNote: 'La cuenta que uses aquí se establecerá como cuenta de administrador' + register: 'Registrarse' + initWithSpace: 'Inicializar con Space' + spaceRecommended: 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube' + spaceInfoTip1: 'Space proporciona servicios de autenticación unificada de cuentas sin subir ninguna de tu información sensible.' + spaceInfoTip2: 'Iniciar sesión con una cuenta de Space te da acceso a los modelos de LangBot y otros servicios en la nube, incluyendo créditos gratuitos de llamadas a modelos para ayudarte a comenzar rápidamente.' + spaceInfoTip3: 'Tu método de inicio de sesión no afecta otras funciones. Puedes configurar y usar modelos de otras fuentes en cualquier momento.' + registerLocal: 'Registrar cuenta local' + registerWithPassword: 'Registrarse con correo electrónico y contraseña' + initSuccess: 'Inicialización exitosa, por favor inicia sesión' + initFailed: 'Error en la inicialización: ' + recoveryKey: 'Clave de recuperación' + recoveryKeyDescription: 'Almacenada en `system.recovery_key` del archivo de configuración `data/config.yaml`' + enterRecoveryKey: 'Introduce la clave de recuperación' + recoveryKeyRequired: 'La clave de recuperación no puede estar vacía' + resetPassword: 'Restablecer contraseña' + resetting: 'Restableciendo...' + embeddingModels: 'Embedding' + newVersionAvailable: 'Nueva versión disponible' + viewUpdateGuide: 'Ver guía de actualización' + noReleaseNotes: 'No hay notas de la versión disponibles' + settings: 'Configuración de la cuenta' + setPassword: 'Establecer contraseña' + passwordSetSuccess: 'Contraseña establecida correctamente' + passwordStatus: 'Contraseña local' + passwordSet: 'Establecida' + passwordNotSet: 'No establecida' + passwordSetDescription: 'La contraseña está establecida, puedes iniciar sesión con correo y contraseña' + spaceStatus: 'Cuenta de Space' + spaceBound: 'Vinculada' + spaceNotBound: 'No vinculada' + spaceBoundDescription: 'Cuenta de Space vinculada, API de modelos oficiales y servicios en la nube disponibles' + bindSpace: 'Vincular cuenta de Space' + bindSpaceDescription: 'Vincular para usar API de modelos oficiales y servicios en la nube' + bindSpaceButton: 'Vincular' + bindSpaceConfirmTitle: 'Confirmar vinculación' + bindSpaceConfirmDescription: 'Estás a punto de vincular tu instancia local a una cuenta de Space' + bindSpaceWarning: 'Después de vincular, tu correo de inicio de sesión se cambiará de {{localEmail}} al correo de la cuenta de Space.' + bindSpaceSuccess: 'Cuenta de Space vinculada correctamente' + bindSpaceFailed: 'Error al vincular la cuenta de Space' + bindSpaceInvalidState: 'Solicitud de vinculación no válida. Por favor, inténtalo de nuevo desde la configuración de la cuenta.' + setPasswordHint: 'Establece una contraseña para iniciar sesión con correo y contraseña' + spaceEmailMismatch: 'El correo de inicio de sesión de Space no coincide con el correo de la cuenta local' + overview: 'Resumen' + totalMessages: 'Total de mensajes' + llmCallsCount: 'Llamadas LLM' + modelCallsCount: 'Llamadas a modelos' + successRate: 'Éxito率' + activeSessions: 'Sesiones activas' + last24Hours: 'Últimas 24 horas' + bot: 'Bot' + pipeline: 'Pipeline' + allBots: 'Todos los Bots' + allPipelines: 'Todos los Pipelines' + timeRange: 'Rango de tiempo' + customRange: 'Rango personalizado' + from: 'Desde' + to: 'Hasta' + apply: 'Aplicar' + lastHour: 'Última hora' + last6Hours: 'Últimas 6 horas' + last7Days: 'Últimos 7 días' + last30Days: 'Últimos 30 días' + llmCalls: 'Llamadas LLM' + embeddingCalls: 'Llamadas Embedding' + modelCalls: 'Llamadas a modelos' + feedback: 'Comentarios de usuarios' + errors: 'ErrorLista' + timestamp: 'Tiempo戳' + message: 'Mensaje' + sessionId: 'Sesión ID' + copyId: 'Copiar ID' + noMessagesDescription: 'Intenta ajustar los filtros o vuelve a comprobarlo más tarde' + loadMore: 'Cargar más' + autoRefresh: 'Actualización automática' + level: 'Nivel' + runner: 'Ejecutor' + viewConversation: 'Ver conversación' + model: 'Modelo' + tokens: 'Tokens' + duration: 'Esperar时间' + cost: 'Coste' + noData: 'No hay datos de tráfico disponibles' + inputTokens: 'Tokens de entrada' + outputTokens: 'Tokens de salida' + totalTokens: 'Tokens totales' + avgDuration: 'Duración promedio' + calls: 'Llamadas' + promptTokens: 'Tokens de prompt' + inputCount: 'Cantidad de entradas' + knowledgeBase: 'Base de conocimiento' + queryText: 'Consulta' + llmModel: 'LLM' + embeddingCall: 'Embedding' + retrieveCall: 'Recuperación' + lastActivity: 'Última actividad' + startTime: 'Inicio时间' + messageStats: 'Estadísticas de mensajes' + successMessages: 'Exitosos' + errorMessages: 'Fallidos' + llmStats: 'Estadísticas LLM' + errorType: 'Tipo de error' + errorMessage: 'Mensaje de error' + occurredAt: 'Ocurrido el' + noErrors: 'No se encontraron errores' + stackTrace: 'Traza de pila' + totalFeedback: 'Total de comentarios' + totalLikes: 'Me gusta' + totalDislikes: 'No me gusta' + satisfactionRate: 'Tasa de satisfacción' + like: 'Me gusta' + dislike: 'No me gusta' + noFeedback: 'Aún no hay comentarios' + noFeedbackDescription: 'Los comentarios de los usuarios aparecerán aquí' + feedbackList: 'Lista de comentarios' + feedbackContent: 'Contenido del comentario' + contextInfo: 'Información de contexto' + userId: 'ID de usuario' + messageId: 'ID de mensaje' + streamId: 'ID de consulta relacionada' + inaccurateReasons: 'Razones de inexactitud' + exportFeedback: 'Exportar comentarios' + viewMonitoring: 'Ver monitoreo' + refreshData: 'Actualizar datos' + exportData: 'Exportar datos' + exporting: 'Exportando...' + openDialog: 'Ver análisis' + dialogTitle: 'Análisis de almacenamiento' + generatedAt: 'Generado el {{time}}' + totalSize: 'Tamaño total' + binaryStorage: 'Almacenamiento binario de plugins' + uploadCleanup: 'Subidas caducadas' + logCleanup: 'Registros caducados' + sections: 'Secciones de almacenamiento' + monitoringTables: 'Tablas de monitoreo' + runtimeTasks: 'Tareas en ejecución' + cleanupPolicy: 'Política de limpieza' + uploadRetention: 'Retención de subidas' + logRetention: 'Retención de registros' + databaseType: 'Tipo de base de datos' + days: 'días' + missing: '缺失Parámetro' + expiredUploads: 'Subidas caducadas' + expiredLogs: 'Registros caducados' + noExpiredUploads: 'No hay archivos subidos caducados' + noExpiredLogs: 'No hay registros caducados' + database: 'Base de datos' + storage: 'Archivos subidos' + vector_store: 'Almacén vectorial' + plugins: 'Plugins' + mcp: 'MCP' + temp: 'Archivos temporales' + maxBotsReached: 'Se ha alcanzado el número máximo de Bots ({{max}}). Por favor, elimina un Bot existente antes de crear uno nuevo.' + maxPipelinesReached: 'Se ha alcanzado el número máximo de Pipelines ({{max}}). Por favor, elimina un Pipeline existente antes de crear uno nuevo.' + maxExtensionsReached: 'Se ha alcanzado el número máximo de extensiones ({{max}}). Por favor, elimina un servidor MCP o plugin existente antes de añadir uno nuevo.' + sidebarDescription: 'Crea un Bot con pasos guiados' + skip: 'Omitir' + skipConfirmMessage: 'Puedes volver a acceder al asistente de inicio rápido desde el menú de cuenta más tarde, o crear un Bot manualmente.' + skipConfirmOk: 'Aceptar' + prev: 'Anterior' + next: 'Siguiente' + finish: 'Crear y desplegar' + confirmCreateBot: 'Confirmar, crear Bot' + botCreateSuccess: '¡Bot creado correctamente!' + botSaveSuccess: '¡Configuración del Bot guardada y activada!' + spaceAuthError: 'Error al iniciar la autorización de Space' + skipSaveError: 'Error al guardar el estado de omisión. Por favor, inténtalo de nuevo.' + completeSaveError: 'Error al guardar el estado de finalización. Por favor, inténtalo de nuevo.' + botConfig: 'Configuración del Bot' + aiEngine: 'Motor de IA' + done: 'Listo' + saveBot: 'Guardar y activar Bot' + resaveBot: 'Volver a guardar configuración' + botSaved: 'Configuración del Bot guardada y activada. Consulta los registros para verificar la conexión.' + logsTitle: 'Registros del Bot' + logsDescription: 'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.' + action: 'Acción' + botInfo: 'Información del Bot' + botNamePlaceholder: 'Introduce el nombre del Bot' + botDescPlaceholder: 'Introduce la descripción del Bot (opcional)' + platformConfig: 'Configuración de {{platform}}' + aiConfig: 'Configuración de {{engine}}' + backToWorkbench: 'Volver al panel de trabajo' + createWorkflow: 'Crear Flujo de Trabajo' + editWorkflow: 'Editar Flujo de Trabajo' + newWorkflow: 'Nuevo Flujo de Trabajo' + getWorkflowListError: 'Error al obtener la lista de flujos de trabajo:' + workflowName: 'Nombre del Flujo de Trabajo' + workflowDescription: 'Descripción del Flujo de Trabajo' + workflowNameRequired: 'El nombre del flujo de trabajo no puede estar vacío' + getWorkflowError: 'Error al obtener el flujo de trabajo:' + copyError: '复制falló:' + export: 'Exportar' + import: 'Importar' + exportSuccess: 'Flujo de Trabajo已导出' + importSuccess: 'Flujo de Trabajo已导入' + publish: 'Publicar' + publishSuccess: '发布Éxito' + publishError: '发布falló' + executions: 'Ejecutar记录' + editor: 'Editar器' + basicInfoDesc: '设置Flujo de TrabajoNombre、图标和Descripción' + deleteWorkflowAction: 'Eliminar此Flujo de Trabajo' + deleteWorkflowHint: 'Eliminar后,所有关联Configuración将被永久移除,且无法恢复。' + deleteWorkflow: 'EliminarFlujo de Trabajo' + deleteConfirmDesc: '您确定要EliminarFlujo de Trabajo ' + namePlaceholder: 'EntradaFlujo de TrabajoNombre' + descriptionPlaceholder: 'EntradaFlujo de TrabajoDescripción(可选)' + enabled: 'Habilitar' + enabledDesc: '启用后,Flujo de Trabajo将可以被触发Ejecutar' + info: 'Flujo de TrabajoInformación' + uuid: 'UUID' + version: 'Versión' + createdAt: 'Crear时间' + updatedAt: '更新Tiempo' + totalExecutions: '共 {{count}} 条Ejecutar记录' + statistics: 'Estadísticas分析' + successfulCount: 'Éxito {{count}} 次' + averageDuration: 'Duración promedio' + perExecution: '每次Ejecutar' + failedExecutions: 'falló次数' + lastExecution: '最后Ejecutar' + filterByStatus: '按Estado筛选' + allStatuses: '全部Estado' + manualTrigger: 'Activación manual' + executionId: 'Ejecutar ID' + triggerType: '触发Tipo' + startedAt: 'Inicio时间' + noExecutions: '暂无Ejecutar记录' + executionDetails: 'Ejecutar详情' + nodeExecutions: 'NodoEjecutar记录' + result: 'Resultado' + nodePalette: 'Nodo面板' + properties: 'Propiedades' + zoomIn: 'Acercar' + zoomOut: 'Alejar' + fitView: 'Ajustar vista' + paste: 'Pegar' + deleted: '已Eliminar' + nothingToPaste: '剪贴板estar vacío' + copied: '已复制 {{count}} 个Nodo' + pasted: '已粘贴 {{count}} 个Nodo' + nodesSelected: '已选中 {{count}} 个Nodo' + edgesSelected: 'Seleccionado {{count}} conexiones' + searchNodes: '搜索Nodo...' + loadingNodeTypes: '正在CargarNodoTipo...' + noNodesFound: '未找到匹配deNodo' + clearSearch: '清除Buscar' + dragToAdd: '拖拽Nodo到画布Agregar' + selectNodeOrEdge: 'SeleccionarunNodo或连线' + edgeProperties: 'Propiedades de conexión' + nodeProperties: 'Nodo属性' + condition: 'Condición分支' + hasCondition: '已Configuración' + conditionPlaceholder: 'EntradaCondición表达式,如: output.success == true' + conditionHelp: 'Condiciónestar vacío时,该连线将始终被Ejecutar。支持使用 {{Variable名}} 引用上下文Variable。' + deleteEdge: 'Eliminar连线' + deleteEdgeConfirm: '确定Eliminar此连线?' + nodeLabel: 'NodoNombre' + nodeLabelPlaceholder: 'EntradaNodo显示Nombre' + nodeId: 'Nodo ID' + inputOutputVariables: 'Entrada/SalidaVariable' + inputs: 'Entrada' + outputs: 'Salida' + availableVariables: '可用Variable' + globalVariables: '全局Variable' + messageContent: '模拟Mensaje' + messageSender: 'Enviar者' + nodeConfig: 'NodoConfiguración' + noConfigOptions: '该NodoTipo暂无Configuración选项' + deleteNode: 'EliminarNodo' + deleteNodeConfirm: '确定Eliminar此Nodo?' + input: 'Entrada' + text: 'Texto' + data: 'Datos' + context: 'Depurar上下文' + body: 'Por favor求体' + items: '项目Lista' + arguments: 'Parámetro' + question: 'UsuarioPregunta' + parameters: 'Parámetro定义' + key: 'Clave' + case_1: 'Rama 1' + case_2: 'Rama 2' + branch_1: '分支1Salida' + branch_2: '分支2Salida' + notification_id: 'NotificaciónID' + key_template: 'Plantilla de clave' + hash_field: '哈希Campo' + server_name: '服务器Nombre' + tool_name: '工具Nombre' + arguments_template: 'Parámetro模板' + scope: 'Ámbito' + payload: 'Carga útil' + input_value: 'EntradaValor' + trigger: 'Disparador' + triggerDescription: 'Flujo de Trabajode起始Nodo' + messageTrigger: 'Mensaje触发' + messageTriggerDescription: '当收到Mensaje时触发' + scheduleTrigger: 'Programado触发' + scheduleTriggerDescription: '按计划Programado触发' + cronTrigger: 'Programado触发' + cronTriggerDescription: '按定时计划触发Flujo de Trabajo' + webhookTrigger: 'Activador Webhook' + webhookTriggerDescription: '通过 HTTP Por favor求触发' + eventTrigger: 'Evento触发' + process: 'IA/Procesamiento' + aiProcess: 'Procesamiento IA' + aiProcessDescription: '使用 AI 模型处理Mensaje' + llmCall: 'LLM Llamar' + codeProcess: 'Código处理' + codeProcessDescription: 'Ejecutar自定义代码' + codeExecutor: '代码Ejecutar' + codeExecutorDescription: 'Ejecutar Python/JavaScript 代码' + templateProcess: 'Procesamiento de plantilla' + httpRequest: 'HTTP Por favor求' + httpRequestDescription: 'Enviar HTTP Por favor求' + dataTransform: 'DatosTransformar' + dataTransformDescription: 'TransformarDatosFormato' + questionClassifier: 'PreguntaClasificador' + questionClassifierDescription: '使用 LLM 将UsuarioPreguntaCategoría到预定义类别' + parameterExtractor: 'Parámetro提取器' + parameterExtractorDescription: '使用 LLM desde文本中提取结构化Parámetro' + knowledgeRetrieval: 'Conocimiento库Recuperación' + textTemplate: 'Texto模板' + jsonTransform: 'JSON Transformar' + jsonTransformDescription: 'Transformar JSON Datos' + dataAggregator: 'Datos聚合' + textSplitter: 'Texto分割' + variableAssignment: 'Variable赋Valor' + variableAssignmentDescription: '为Flujo de TrabajoVariable赋Valor' + control: 'Flujo de control' + conditionDescription: '根据Condición分流' + switch: '多路Rama' + switchDescription: '多Condición分支Seleccionar' + loop: 'Bucle' + loopDescription: '重复Ejecutar' + iterator: 'Iterador' + parallel: 'Paralelo处理' + parallelDescription: '并行Ejecutar多个分支' + wait: 'Esperar' + waitDescription: 'Esperar指定时间' + delay: 'Retraso' + delayDescription: 'Esperar指定时间' + merge: 'Fusionar' + mergeDescription: 'Fusionar多个Rama' + variableAggregator: 'Variable聚合器' + variableAggregatorDescription: '聚合多个分支deVariableSalida' + actionDescription: 'Ejecutar动作deNodo' + sendMessage: 'EnviarMensaje' + sendMessageDescription: 'EnviarMensaje到平台' + replyMessage: '回复Mensaje' + replyMessageDescription: '回复触发Flujo de TrabajodeMensaje' + storeData: 'AlmacenarDatos' + storeDataDescription: 'AlmacenarDatos到Base de Datos' + callPipeline: 'Llamar Pipeline' + callPipelineDescription: '调用现有de Pipeline' + setVariable: '设置Variable' + setVariableDescription: '设置上下文Variable' + openingStatement: 'Conversación开场白' + end: 'Fin' + endDescription: '标记Flujo de TrabajoEjecutarFin' + logDescription: '记录日志Información' + difyWorkflow: 'Dify Flujo de Trabajo' + difyWorkflowDescription: '调用 Dify 平台Flujo de Trabajo' + difyKnowledgeQuery: 'Dify Conocimiento库' + difyKnowledgeQueryDescription: 'Consulta Dify Conocimiento库' + n8nWorkflow: 'n8n Flujo de Trabajo' + n8nWorkflowDescription: '调用 n8n Flujo de Trabajo' + langflowFlow: 'Flujo Langflow' + langflowFlowDescription: 'Llamar Langflow 流程' + cozeBot: 'Bot Coze' + cozeBotDescription: 'Llamar扣子 Bot' + databaseQuery: 'Base de DatosConsulta' + databaseQueryDescription: 'Ejecutar数据库查询' + redisOperation: 'Redis Operación' + redisOperationDescription: 'Ejecutar Redis 缓存操作' + mcpTool: 'MCP Herramienta' + mcpToolDescription: 'Llamar MCP Herramienta' + memoryStore: '记忆Almacenar' + memoryStoreDescription: 'desdeFlujo de Trabajo记忆中存储和检索数据' + cancelled: 'Cancelado' + nodeResults: 'NodoEjecutar结果' + current: '当前Versión' + rollback: '回滚到此Versión' + rollbackSuccess: '回滚Éxito' + rollbackError: '回滚falló:' + debug: 'Debug' + debugMode: 'Depurar模式' + debugPanel: 'Depurar面板' + startDebug: 'InicioDepurar' + pauseDebug: 'Pausar' + resumeDebug: 'Continuar' + stepDebug: '单步Ejecutar' + stopDebug: 'Detener' + debugContext: 'Depurar上下文' + simulatedMessage: '模拟Mensaje' + simulatedMessagePlaceholder: 'Entrada要模拟deMensaje内容' + senderId: 'Enviar者 ID' + senderIdPlaceholder: 'Enviar者唯一标识' + senderName: 'Enviar者Nombre' + senderNamePlaceholder: 'Enviar者显示Nombre' + conversationId: 'Sesión ID' + isGroup: 'Chat grupal' + customVariables: '自定义Variable' + addVariable: 'AgregarVariable' + variableName: 'Variable名' + variableValue: 'VariableValor' + watchedVariables: '监控Variable' + addWatchVariable: 'Agregar监控' + nodeStates: 'Nodo状态' + breakpoints: 'Puntos de interrupción' + toggleBreakpoint: 'Cambiar断点' + breakpointSet: '断点已Configuración' + breakpointRemoved: 'Punto de interrupción eliminado' + debugLogs: 'Depurar日志' + clearLogs: '清空Registro' + autoScroll: 'Desplazamiento automático' + idle: 'Inactivo' + paused: '已Pausar' + pending: 'Esperar中' + skipped: '已Omitir' + selectWorkflow: 'SeleccionarFlujo de Trabajo' + loadWorkflowsFailed: 'CargarFlujo de Trabajofalló' + filterByDate: '按Fecha筛选' + allTime: '全部Tiempo' + lastWeek: 'Última semana' + showingExecutions: 'Mostrando {{shown}} / {{total}} registros' + rerun: '重新Ejecutar' + rerunExecution: '重新Ejecutar' + details: 'Detalles' + completedAt: 'Completado时间' + noNodeExecutions: '暂无NodoEjecutar记录' + conditions: '触发Condición' + keyword_filter: '关键词Filtrar' + regex_filter: 'Expresión RegularFiltrar' + min_length: 'MínimoLongitud' + max_length: 'MáximoLongitud' + require_mention: 'Requiere mencionar bot' + respond_rules: '群Respuesta规则' + access_control: 'Control de acceso' + cron: 'Expresión Cron' + timezone: 'Zona horaria' + path: 'Ruta Webhook' + allowed_methods: '允许deHTTP方法' + content_type: 'Content-Type' + auth_type: 'Tipo de autenticación' + auth_key: 'Clave de autenticación' + validation: 'Por favor求验证' + event_types: '事件Tipo' + filter: 'EventoFiltrar' + debounce_ms: '防抖Tiempo' + prompt_template: 'Aviso词模板' + system_prompt: '系统Aviso词' + temperature: 'Temperatura' + top_p: 'Top P' + frequency_penalty: 'Penalización de frecuencia' + presence_penalty: 'Penalización de presencia' + max_tokens: 'MáximoToken数' + stop_sequences: 'Detener序列' + seed: 'Semilla aleatoria' + stream: '流式Salida' + use_conversation_history: '使用Conversación历史' + code: 'Código' + method: 'Por favor求方法' + auth_config: '认证Configuración' + transform_type: '转换Tipo' + template: 'Plantilla' + expression: 'Expresión' + output_type: 'SalidaTipo' + categories: 'Categoría类别' + instruction: 'Instrucción' + knowledge_bases: 'Conocimiento库' + top_k: 'Cantidad a devolver' + score_threshold: '相似度阈Valor' + search_method: 'Buscar方法' + enable_citations: 'Habilitar引用' + condition_type: 'CondiciónTipo' + condition_expression: 'Condición表达式' + left_value: '左Valor' + operator: 'Operador de comparación' + right_value: '右Valor' + cases: '分支Condición' + break_condition: '中断Condición' + max_concurrency: 'Máximo并发数' + branches: '分支Configuración' + wait_all: 'Esperar所有' + fail_fast: '快速falló' + duration_type: 'Tiempo单位' + merge_strategy: 'Fusionar策略' + variable_mappings: 'Variable映射' + aggregation_mode: 'Modo de agregación' + target_type: '目标Tipo' + target_id: 'ID de destino' + message_type: 'MensajeTipo' + reply_mode: 'Responder模式' + message_template: 'Mensaje模板' + long_text_processing: '长Texto处理' + force_delay: '强制Retraso' + pipeline_uuid: 'Pipeline' + inherit_context: '继承Contexto' + storage_type: '存储Tipo' + ttl: '过期Tiempo' + key_prefix: 'Clave前缀' + variable_name: 'VariableNombre' + variable_scope: 'Variable作用域' + set_variable_operation: '操作Tipo' + statement: 'Declaración de Apertura' + suggested_questions: '建议Pregunta' + show_suggestions: 'Mostrar sugerencias' + output_format: 'Salida格式' + success_message: 'ÉxitoMensaje' + connection_type: '数据库Tipo' + connection_string: 'Conectar字符串' + query_type: '查询Tipo' + connection_url: 'ConectarURL' + operation: '操作Tipo' + dataset_id: 'Conocimiento库ID' + sender_id: 'Enviar者 ID' + sender_name: 'Enviar者Nombre' + conversation_id: 'Sesión ID' + is_group: 'Es chat grupal' + schedule: 'Programación' + cron_timestamp: 'Cron Tiempo戳' + cron_schedule: 'Cron Expresión de programación' + cron_context: 'Cron Contexto' + webhook_body: 'Webhook Por favor求体' + webhook_headers: 'Webhook Por favor求头' + webhook_query: 'Webhook 查询Parámetro' + webhook_method: 'Webhook Por favor求方法' + event_type: '事件Tipo' + event_data: 'EventoDatos' + event_timestamp: 'EventoTiempo戳' + response: 'Respuesta' + usage: 'Token使用Estadísticas' + prompt: 'Aviso/问题' + context_info: '上下文Información' + output: 'Salida' + console: '控制台Salida' + code_input: '代码Entrada' + code_output: '代码Salida' + status_code: 'Estado码' + http_body: 'HTTP Por favor求体' + http_headers: 'HTTP Por favor求头' + http_response: 'HTTP Respuesta' + response_headers: 'Respuesta头' + transform_input: '转换Entrada' + transform_result: 'Transformar结果' + category: 'Categoría结果' + confidence: 'Confianza' + all_scores: 'Todas las puntuaciones' + extraction_success: '提取Éxito' + extract_text: 'Entrada文本' + citations: '引用Información' + knowledge_context: 'Fusionar上下文' + knowledge_query: 'RecuperaciónConsulta' + true: 'Condición为真Salida' + false: 'Condición为假Salida' + condition_input: 'CondiciónEntrada' + matched_case: '匹配Rama' + default: 'PredeterminadoRama' + switch_input: '开关Entrada' + item: 'Elemento actual' + index: 'Índice actual' + results: 'Resultado' + loop_items: 'Elementos de iteración' + iterator_array: 'Entrada数组' + iterator_item: 'Elemento actual' + iterator_index: 'Índice actual' + parallel_input: '并行Entrada' + wait_input: '透传Entrada' + wait_output: '透传Salida' + merged: 'Fusionar结果' + merge_array: '数Grupo结果' + merge_input_1: 'Entrada 1' + merge_input_2: 'Entrada 2' + merge_input_3: 'Entrada 3' + merge_input_4: 'Entrada 4' + aggregated: '聚合Variable' + aggregator_variables: 'VariableEntrada' + message_id: 'MensajeID' + target: 'ID de destino' + reply_message: 'Responder内容' + pipeline_response: 'Pipeline Respuesta' + pipeline_result: '完整Resultado' + pipeline_query: 'Consulta内容' + context_data: '上下文Datos' + store_status: 'AlmacenarEstado' + store_key: 'Almacenar键' + store_value: '存储Valor' + variable_value: 'VariableValor' + variable_result: '设置Variable结果' + workflow_output: 'Flujo de TrabajoSalida' + final_result: '最终Resultado' + query_results: 'Consulta结果' + row_count: 'Número de filas' + query_success: '查询Éxito' + query_params: '查询Parámetro' + redis_result: 'RedisResultado' + redis_success: 'RedisÉxito' + redis_key: 'Redis Clave' + redis_value: 'Redis Valor' + plugin_input: '插件Entrada' + tool_result: 'Herramienta结果' + tool_success: '工具Éxito' + mcp_arguments: '工具Parámetro' + memory_result: '记忆Resultado' + memory_success: '记忆Éxito' + memory_value: '存储Valor' + answer: 'Respuesta' + dify_success: 'DifyÉxito' + dify_query: '用户Entrada/查询' + dify_conversation_id: 'Sesión ID' + search_results: 'Buscar结果' + knowledge_base_query: 'Consulta内容' + n8n_result: 'N8nResultado' + n8n_success: 'N8nÉxito' + n8n_payload: 'Flujo de TrabajoEntrada数据' + flow_result: '流程Resultado' + flow_success: '流程Éxito' + langflow_input: 'Entrada内容' + bot_answer: '机器人Responder' + coze_query: '用户Entrada/查询' + coze_conversation_id: 'Sesión ID' + bot_conversation_id: 'Sesión ID' + sender: 'Enviar者' + event: 'Evento' + trigger_time: '触发Tiempo' + scores: 'Puntuaciones' + parsed: 'Resultado analizado' + chunks: 'Texto块' + count: 'Cantidad' + execution_id: 'EjecutarID' + suggestions: '建议Pregunta' + dimensions: 'Dimensiones' + intent: 'Intención' + entities: 'Entidades' + invalidPage: 'Página de plugin no válida' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + dataOnlyHint + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ + +文件: ru-RU.ts +总键数: 1406 +英文键数: 34 +缺失键数: 69 + +英文键列表: + dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy' + more: 'Ещё ({{count}})' + llmModels: 'LLM' + langbotModels: 'Модели LangBot' + rerankUrlTooltip: 'Полный URL для эндпоинта переранжирования (напр.: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + dateFormat: '{{day}}.{{month}}' + webhookSaasLink: 'Подробнее о LangBot Cloud' + connectionError: 'WebSocket连接Ошибка' + fromGithub: 'С GitHub' + repoUrlPlaceholder: 'Напр., https://github.com/owner/repo' + depsProgress: '{{installed}}/{{total}} установлено · {{remaining}} осталось' + topK: 'Top K' + embeddingModelUUID: 'Модель Embedding' + embeddingModel: 'Embedding' + recoveryKeyDescription: 'Хранится в `system.recovery_key` файла конфигурации `data/config.yaml`' + embeddingModels: 'Embedding' + embeddingCalls: 'Вызовы Embedding' + llmModel: 'LLM' + embeddingCall: 'Embedding' + runtimeTasks: 'Задачи runtime' + mcp: 'MCP' + uuid: 'UUID' + conditionPlaceholder: 'ВходУсловие表达式,如: output.success == true' + codeExecutorDescription: 'Выполнить Python/JavaScript 代码' + callPipeline: 'Вызвать Pipeline' + callPipelineDescription: '调用现有 Pipeline' + langflowFlow: 'Поток Langflow' + cozeBot: 'Бот Coze' + debug: 'Debug' + path: 'Путь Webhook' + content_type: 'Content-Type' + top_p: 'Top P' + pipeline_response: 'Pipeline Ответ' + redis_key: 'Redis Ключ' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ + +文件: th-TH.ts +总键数: 1405 +英文键数: 67 +缺失键数: 70 + +英文键列表: + dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy' + apiKeys: 'คีย์ API' + webhooks: 'Webhooks' + createWebhook: 'สร้าง Webhook' + webhookName: 'ชื่อ Webhook' + webhookUrl: 'URL เรียกกลับ Webhook' + apiKey: 'API Key' + llmModels: 'LLM' + addEmbeddingModel: 'เพิ่มโมเดล Embedding' + langbotModels: 'โมเดล LangBot' + rerankUrlTooltip: 'URL เต็มสำหรับ endpoint จัดลำดับใหม่ (เช่น: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + botName: 'ชื่อ Bot' + bindPipeline: 'ผูก Pipeline' + selectPipeline: 'เลือก Pipeline' + dateFormat: '{{day}}/{{month}}' + ruleValuePrefixPlaceholder: 'เช่น !draw' + ruleValueRegexpPlaceholder: 'เช่น ^/help' + webhookUrlCopied: 'คัดลอก URL Webhook แล้ว' + fromGithub: 'จาก GitHub' + enterRepoUrl: 'กรอก URL ของ GitHub repository' + repoUrlPlaceholder: 'เช่น https://github.com/owner/repo' + backToRepoUrl: 'กลับไป URL ของ repository' + releaseName: 'ชื่อ: {{name}}' + installFromGithubDesc: 'ติดตั้งปลั๊กอินจาก GitHub Release' + depsProgress: 'ติดตั้งแล้ว {{installed}}/{{total}} · เหลือ {{remaining}}' + repository: 'Repository' + stdio: 'โหมด Stdio' + connectionFailed: 'WebSocket连接ล้มเหลว' + starCount: 'ดาว: {{count}}' + createPipeline: 'สร้าง Pipeline' + editPipeline: 'แก้ไข Pipeline' + aiCapabilities: 'AI' + deletePipelineAction: 'ลบ Pipeline นี้' + copyPipelineAction: 'คัดลอก Pipeline นี้' + connected: 'WebSocket已เชื่อมต่อ' + disconnected: 'WebSocket未เชื่อมต่อ' + topK: 'Top K' + embeddingModelUUID: 'โมเดล Embedding' + embeddingModel: 'Embedding' + recoveryKeyDescription: 'เก็บไว้ใน `system.recovery_key` ของไฟล์กำหนดค่า `data/config.yaml`' + embeddingModels: 'Embedding' + spaceStatus: 'บัญชี Space' + bot: 'Bot' + pipeline: 'Pipeline' + allPipelines: 'Pipeline ทั้งหมด' + embeddingCalls: 'การเรียก Embedding' + llmModel: 'LLM' + embeddingCall: 'Embedding' + stackTrace: 'Stack Trace' + runtimeTasks: 'งาน runtime' + mcp: 'MCP' + uuid: 'UUID' + conditionPlaceholder: 'อินพุตเงื่อนไข表达式,如: output.success == true' + codeExecutorDescription: 'ดำเนินการ Python/JavaScript 代码' + callPipeline: 'เรียกใช้ Pipeline' + callPipelineDescription: '调用现有 Pipeline' + langflowFlow: 'โฟลว์ Langflow' + cozeBot: 'บอท Coze' + debug: 'Debug' + path: 'เส้นทาง Webhook' + content_type: 'Content-Type' + top_p: 'Top P' + seed: 'ค่า Seed' + webhook_body: 'Webhook กรุณา求体' + webhook_headers: 'Webhook กรุณา求头' + redis_key: 'Redis คีย์' + redis_value: 'Redis ค่า' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + dataOnlyHint + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ + +文件: vi-VN.ts +总键数: 1405 +英文键数: 1200 +缺失键数: 70 + +英文键列表: + home: 'Trang chủ' + extensions: 'Tiện ích mở rộng' + installedPlugins: 'Plugin đã cài đặt' + pluginMarket: 'Chợ ứng dụng' + mcpServers: 'Máy chủ MCP' + pluginPages: 'Trang plugin' + pluginPagesTooltip: 'Các trang trực quan được cung cấp bởi plugin đã cài đặt' + quickStart: 'Bắt đầu nhanh' + login: 'Đăng nhập' + logout: 'Đăng xuất' + account: 'Tài khoản' + integration: 'Tích hợp' + email: 'Email' + password: 'Mật khẩu' + welcome: 'Chào mừng trở lại LangBot 👋' + continueToLogin: 'Đăng nhập để tiếp tục' + loginSuccess: 'Đăng nhập thành công' + loginFailed: 'Đăng nhập thất bại, vui lòng kiểm tra email và mật khẩu' + loginLoadError: 'Không thể kết nối đến máy chủ' + loginLoadErrorDesc: 'Không thể kết nối đến máy chủ LangBot. Vui lòng đảm bảo dịch vụ đang chạy và thử lại.' + retry: 'Thử lại' + enterEmail: 'Nhập địa chỉ email' + enterPassword: 'Nhập mật khẩu' + invalidEmail: 'Vui lòng nhập địa chỉ email hợp lệ' + emptyPassword: 'Vui lòng nhập mật khẩu' + language: 'Ngôn ngữ lập trình' + helpDocs: 'Trợ giúp' + featureRequest: 'Yêu cầu tính năng' + starOnGitHub: 'Star trên GitHub' + create: 'Tạo' + edit: 'Chỉnh sửa' + delete: 'Xóa tệp' + add: 'Thêm' + select: 'Chọn' + cancel: 'HủyThực thi' + submit: 'Gửi' + error: 'Lỗi' + success: 'Di chuyển cơ sở tri thức hoàn tất' + save: 'Lưu' + saving: 'Đang lưu...' + confirm: 'Xác nhận' + confirmDelete: 'Xác nhận xóa' + deleteConfirmation: 'Bạn có chắc chắn muốn xóa quy trình này không?' + selectOption: 'Chọn một tùy chọn' + selectPreset: 'Chọn mẫu có sẵn' + required: 'Bắt buộc' + enable: 'Bật' + name: 'Tên' + icon: 'Biểu tượng' + deleteSuccess: 'Xóa thành công' + deleteError: 'Lỗi khi xóa:' + addRound: 'Thêm lượt' + copy: 'Sao chép' + copySuccess: '复制Thành công' + copyFailed: 'Sao chép thất bại' + test: 'Kiểm tra' + forgotPassword: 'Quên mật khẩu?' + agreementNotice: 'Bằng việc tiếp tục, bạn đồng ý với' + privacyPolicy: 'Chính sách bảo mật' + dataCollectionPolicy: 'Chính sách thu thập dữ liệu' + dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy' + fieldRequired: 'Trường này là bắt buộc' + or: 'hoặc' + loginWithSpace: 'Đăng nhập với Space' + spaceLoginRecommended: 'Khuyến nghị: Sử dụng API mô hình ổn định chính thức và dịch vụ đám mây' + loginLocal: 'Đăng nhập với tài khoản cục bộ' + loginWithPassword: 'Đăng nhập bằng mật khẩu' + spaceLoginTitle: 'Đăng nhập với Space' + spaceLoginDescription: 'Quét mã QR hoặc truy cập liên kết bên dưới để ủy quyền' + spaceLoginUserCode: 'Mã của bạn' + spaceLoginExpires: 'Mã hết hạn sau {{seconds}} giây' + spaceLoginWaiting: 'Đang chờ ủy quyền...' + spaceLoginSuccess: 'Ủy quyền thành công' + spaceLoginFailed: 'Đăng nhập Space thất bại' + spaceLoginExpired: 'Mã ủy quyền đã hết hạn, vui lòng thử lại' + spaceLoginCancel: 'Hủy' + spaceLoginVisitLink: 'Truy cập liên kết' + spaceLoginProcessing: 'Đang đăng nhập với Space' + spaceLoginProcessingDescription: 'Vui lòng chờ trong khi chúng tôi hoàn tất đăng nhập...' + spaceLoginSuccessDescription: 'Đang chuyển hướng đến LangBot...' + spaceLoginError: 'Đăng nhập thất bại' + spaceLoginNoCode: 'Thiếu mã ủy quyền' + backToLogin: 'Quay lại đăng nhập' + backToHome: 'Quay lại trang chủ' + spaceAccountCannotChangePassword: 'Tài khoản Space không thể đổi mật khẩu tại đây' + theme: 'Giao diện' + changePassword: 'Đổi mật khẩu' + currentPassword: 'Mật khẩu hiện tại' + newPassword: 'Mật khẩu mới' + confirmNewPassword: 'Xác nhận mật khẩu mới' + enterCurrentPassword: 'Nhập mật khẩu hiện tại' + enterNewPassword: 'Nhập mật khẩu mới' + enterConfirmPassword: 'Xác nhận mật khẩu mới' + currentPasswordRequired: 'Mật khẩu hiện tại là bắt buộc' + newPasswordRequired: 'Mật khẩu mới không được để trống' + confirmPasswordRequired: 'Xác nhận mật khẩu là bắt buộc' + passwordsDoNotMatch: 'Mật khẩu không khớp' + changePasswordSuccess: 'Đổi mật khẩu thành công' + changePasswordFailed: 'Đổi mật khẩu thất bại, vui lòng kiểm tra mật khẩu hiện tại' + apiIntegration: 'Tích hợp API' + apiKeys: 'Khóa API' + manageApiIntegration: 'Quản lý tích hợp API' + manageApiKeys: 'Quản lý khóa API' + createApiKey: 'Tạo khóa API' + apiKeyName: 'Tên khóa API' + apiKeyDescription: 'Mô tả khóa API' + apiKeyValue: 'Giá trị khóa API' + apiKeyCreated: 'Tạo khóa API thành công' + apiKeyDeleted: 'Xóa khóa API thành công' + apiKeyDeleteConfirm: 'Bạn có chắc chắn muốn xóa khóa API này không?' + apiKeyNameRequired: 'Tên khóa API là bắt buộc' + copyApiKey: 'Sao chép khóa API' + apiKeyCopied: 'Đã sao chép khóa API vào clipboard' + noApiKeys: 'Chưa cấu hình khóa API nào' + apiKeyHint: 'Khóa API cho phép các hệ thống bên ngoài truy cập API dịch vụ LangBot' + webhooks: 'Webhooks' + createWebhook: 'Tạo Webhook' + webhookName: 'Tên Webhook' + webhookUrl: 'URL Webhook Callback' + webhookDescription: 'Mô tả Webhook' + webhookCreated: 'Tạo Webhook thành công' + webhookDeleted: 'Xóa Webhook thành công' + webhookDeleteConfirm: 'Bạn có chắc chắn muốn xóa Webhook này không?' + webhookNameRequired: 'Tên Webhook là bắt buộc' + webhookUrlRequired: 'URL Webhook là bắt buộc' + noWebhooks: 'Chưa cấu hình Webhook nào' + webhookHint: 'Webhooks cho phép LangBot đẩy sự kiện tin nhắn cá nhân và nhóm đến các hệ thống bên ngoài' + actions: 'Hành động' + apiKeyCreatedMessage: 'Vui lòng sao chép khóa API này, nếu nút không hoạt động, vui lòng sao chép thủ công.' + none: 'Không có' + more: 'Thêm ({{count}})' + less: 'Thu gọn' + noItems: 'Không có mục nào' + title: 'Hội thoại Quy trình' + back: 'Quay lại' + help: 'Trợ giúp' + createModel: 'Tạo mô hình Embedding' + editModel: 'Chỉnh sửa mô hình Embedding' + getModelListError: 'Lấy danh sách mô hình Embedding thất bại: ' + modelName: 'Tên mô hình' + modelProvider: 'Nhà cung cấp mô hình' + modelBaseURL: 'URL cơ sở' + modelAbilities: 'Khả năng mô hình' + saveSuccess: 'Lưu thành công' + saveError: 'Lỗi khi lưu:' + createSuccess: 'Tạo quy trình thành công' + createError: 'Lỗi khi tạo:' + modelNameRequired: 'Tên mô hình không được để trống' + modelProviderRequired: 'Nhà cung cấp mô hình không được để trống' + requestURLRequired: 'URL yêu cầu không được để trống' + apiKeyRequired: 'API Key không được để trống' + keyNameRequired: 'Tên khóa không được để trống' + mustBeValidNumber: 'Phải là một số hợp lệ' + mustBeTrueOrFalse: 'Phải là true hoặc false' + requestURL: 'URL yêu cầu' + scanURL: 'URL quét mô hình' + scanURLPlaceholder: 'Để trống để sử dụng URL yêu cầu + /models' + scanURLDescription: 'Điền điểm cuối danh sách mô hình thực tế khi quét mô hình không sử dụng cùng địa chỉ với việc gọi mô hình.' + apiKey: 'API Key' + abilities: 'Khả năng' + selectModelAbilities: 'Chọn khả năng mô hình' + visionAbility: 'Khả năng thị giác' + functionCallAbility: 'Gọi hàm' + extraParameters: 'Tham số bổ sung' + addParameter: 'Thêm tham số' + keyName: 'Tên khóa' + type: 'Loại' + value: 'Giá trị' + string: 'Chuỗi' + boolean: 'Boolean' + invalidJsonObject: 'Giá trị phải là một đối tượng JSON hợp lệ' + selectModelProvider: 'Chọn nhà cung cấp mô hình' + modelProviderDescription: 'Vui lòng điền tên mô hình do nhà cung cấp cung cấp' + modelManufacturer: 'Nhà sản xuất mô hình' + aggregationPlatform: 'Nền tảng tổng hợp' + selfDeployed: 'Tự triển khai' + builtin: 'Tích hợp sẵn' + selectModel: 'Chọn mô hình' + testSuccess: 'Kiểm tra thành công' + testError: 'Lỗi kiểm tra' + llmModels: 'LLM' + localProvider: 'Cục bộ' + localProviderDescription: 'Các mô hình được cấu hình và quản lý cục bộ' + spaceProviderDescription: 'Các mô hình được đồng bộ từ tài khoản Space của bạn' + spaceDisabledForLocalAccount: 'Đăng nhập với Space để sử dụng mô hình đám mây' + syncSuccess: 'Đồng bộ hoàn tất: {{created}} đã tạo, {{updated}} đã cập nhật' + syncError: 'Đồng bộ thất bại: ' + spaceModelReadOnly: 'Mô hình Space chỉ đọc' + noSpaceModels: 'Không có mô hình Space. Nhấn Đồng bộ để lấy mô hình từ Space.' + noLocalModels: 'Không có mô hình cục bộ. Nhấn Tạo để thêm mô hình.' + providerCount: '{{count}} nhà cung cấp' + addModel: 'Thêm mô hình' + manualAdd: 'Thủ công' + scanAdd: 'Quét' + scanModels: 'Quét mô hình' + scanModelsHint: 'Đọc danh sách mô hình khả dụng từ nhà cung cấp hiện tại rồi chọn mô hình cần thêm.' + scannedModels: 'Kết quả quét' + scanDebug: 'Thông tin gỡ lỗi' + searchScannedModels: 'Tìm trong kết quả quét' + noScannedModels: 'Chưa có kết quả quét. Nhấn nút phía trên để bắt đầu.' + noScannedModelsMatch: 'Không có mô hình phù hợp' + addSelectedModels: 'Thêm mục đã chọn' + addSelectedModelsSuccess: 'Đã thêm {{count}} mô hình' + selectAll: 'Chọn tất cả' + addLLMModel: 'Thêm mô hình LLM' + addEmbeddingModel: 'Thêm mô hình Embedding' + provider: 'Nhà cung cấp' + existingProvider: 'Nhà cung cấp hiện có' + newProvider: 'Nhà cung cấp mới' + selectProvider: 'Chọn nhà cung cấp' + requester: 'Loại nhà cung cấp' + selectRequester: 'Chọn loại nhà cung cấp' + langbotModelsDescription: 'Mô hình đám mây được cung cấp bởi LangBot Space' + credits: 'Tín dụng' + loginToUseModels: 'Đăng nhập với Space để sử dụng mô hình đám mây' + noModels: 'Chưa cấu hình mô hình nào' + langbotModels: 'Mô hình LangBot' + spaceTrialTooltip: 'Có tín dụng dùng thử miễn phí! Đăng nhập với Space để truy cập mô hình đám mây không cần cấu hình.' + unlockModels: 'Đăng nhập để sử dụng' + editProvider: 'Chỉnh sửa nhà cung cấp' + addProvider: 'Thêm nhà cung cấp' + addProviderHint: 'Thêm nhà cung cấp để sử dụng mô hình từ các nguồn khác' + addProviderHintSimple: 'Thêm nhà cung cấp để sử dụng mô hình' + noProviders: 'Chưa có nhà cung cấp nào' + providerName: 'Tên nhà cung cấp' + providerNameRequired: 'Tên nhà cung cấp là bắt buộc' + requesterRequired: 'Loại nhà cung cấp là bắt buộc' + providerSaved: 'Đã lưu nhà cung cấp' + providerCreated: 'Đã tạo nhà cung cấp' + providerSaveError: 'Lưu nhà cung cấp thất bại: ' + providerDeleted: 'Đã xóa nhà cung cấp' + providerDeleteError: 'Xóa nhà cung cấp thất bại: ' + deleteProviderConfirmation: 'Bạn có chắc chắn muốn xóa nhà cung cấp này không?' + loadError: 'Lỗi khi tải quy trình' + chat: 'Trò chuyện' + embedding: 'Vector' + rerank: 'Sắp xếp lại' + rerankUrlTooltip: 'URL đầy đủ cho endpoint sắp xếp lại (vd: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)' + rerankPathTooltip: 'Đường dẫn thêm vào URL cơ sở (mặc định: rerank, một số dịch vụ dùng reranks)' + modelsCount: '{{count}} mô hình' + expandModels: 'Mở rộng' + collapseModels: 'Thu gọn' + primary: 'Mô hình chính' + fallbackList: 'Mô hình dự phòng' + addFallback: 'Thêm mô hình dự phòng' + createBot: 'Tạo Bot' + selectFromSidebar: 'Chọn một trang plugin từ thanh bên' + editBot: 'Chỉnh sửa Bot' + getBotListError: 'Lấy danh sách Bot thất bại: ' + botName: 'Tên Bot' + botDescription: 'Mô tả Bot' + botNameRequired: 'Tên Bot không được để trống' + botDescriptionRequired: 'Mô tả Bot không được để trống' + adapterRequired: 'Adapter không được để trống' + defaultDescription: 'Một quy trình' + getBotConfigError: 'Lấy cấu hình Bot thất bại: ' + platformAdapter: 'Nền tảng/Lựa chọn Adapter' + selectAdapter: 'Chọn Adapter' + adapterConfig: 'Cấu hình Adapter' + viewAdapterDocs: 'Xem tài liệu' + bindPipeline: 'Liên kết Pipeline' + selectPipeline: 'Chọn Pipeline' + selectBot: 'Chọn Bot' + botLogTitle: 'Nhật ký Bot' + enableAutoRefresh: 'Bật tự động làm mới' + session: 'Phiên' + yesterday: 'Hôm qua' + dateFormat: '{{day}}/{{month}}' + setBotEnableError: 'Thiết lập trạng thái bật Bot thất bại' + log: 'Nhật ký' + configuration: 'Cấu hình' + logs: 'Nhật ký' + basicInfo: '基础Thông tin' + basicInfoDescription: '设置Quy trìnhTên和Mô tả' + routingConnection: 'Định tuyến & Kết nối' + routingConnectionDescription: 'Liên kết Pipeline xử lý tin nhắn cho Bot này' + routingRules: 'Quy tắc định tuyến có điều kiện' + routingRulesDescription: 'Các quy tắc được đánh giá theo thứ tự; kết quả khớp đầu tiên sẽ định tuyến đến pipeline tương ứng. Nếu không khớp, pipeline mặc định ở trên sẽ được sử dụng.' + addRoutingRule: 'Thêm quy tắc' + ruleTypeLauncherType: 'Loại phiên' + ruleTypeLauncherId: 'ID phiên' + ruleTypeMessageContent: 'Nội dung tin nhắn' + operatorEq: 'Bằng' + operatorNeq: 'Không bằng' + operatorContains: 'Chứa' + operatorNotContains: 'Không chứa' + operatorStartsWith: 'Bắt đầu bằng' + operatorRegex: 'Regex' + operatorNotHas: 'Không có' + ruleTypeMessageHasElement: 'Phần tử tin nhắn' + ruleValueElementPlaceholder: 'Chọn loại phần tử' + elementImage: 'Hình ảnh' + elementVoice: 'Giọng nói' + elementFile: 'Tập tin' + elementForward: 'Chuyển tiếp' + elementFace: 'Biểu tượng cảm xúc' + elementAtAll: '@Tất cả' + elementQuote: 'Trích dẫn' + ruleValuePlaceholder: 'Giá trị khớp' + ruleValueLauncherIdPlaceholder: 'ID nhóm hoặc người dùng' + ruleValueMessagePlaceholder: 'Nội dung tin nhắn' + ruleValuePrefixPlaceholder: 'vd. !draw' + ruleValueRegexpPlaceholder: 'vd. ^/help' + pipelineDiscard: 'Loại bỏ tin nhắn' + sessionTypePerson: 'Trò chuyện riêng' + sessionTypeGroup: 'Trò chuyện nhóm' + adapterConfigDescription: 'Cấu hình Adapter nền tảng đã chọn' + dangerZone: 'Vùng nguy hiểm' + deleteBotAction: 'Xóa Bot này' + deleteBotHint: 'Sau khi xóa, tất cả cấu hình liên quan sẽ bị xóa vĩnh viễn.' + webhookUrlCopied: 'Đã sao chép URL Webhook' + webhookUrlHint: 'Nhấp vào ô nhập để chọn tất cả, sau đó nhấn Ctrl+C (Mac: Cmd+C) để sao chép, hoặc nhấn nút' + webhookUrlHintEither: 'Sử dụng một trong hai URL trên trong cấu hình nền tảng của bạn' + webhookSaasHint: 'Webhook yêu cầu một tên miền có thể truy cập công khai. LangBot Cloud cung cấp điểm cuối công khai sẵn sàng sử dụng cho Bot của bạn.' + webhookSaasLink: 'Tìm hiểu thêm về LangBot Cloud' + popular: 'Phổ biến' + china: 'Trung Quốc' + global: 'Toàn cầu' + protocol: 'Giao thức' + logLevel: 'Mức nhật ký' + allLevels: 'Tất cả các mức' + selectLevel: 'Chọn mức' + levelsSelected: 'mức đã chọn' + viewDetailedLogs: 'Xem nhật ký chi tiết' + viewDetails: 'Xem chi tiết' + collapse: 'Thu gọn' + imagesAttached: 'hình ảnh đính kèm' + sessions: 'Phiên' + noSessions: 'Không tìm thấy phiên nào' + selectSession: 'Chọn một phiên để xem tin nhắn' + noMessages: '暂无Tin nhắn' + messages: 'Tin nhắn' + messageCount: 'Tin nhắn' + loadingSessions: 'Đang tải phiên...' + loadingMessages: 'Đang tải tin nhắn...' + user: 'Người dùng' + platform: 'Nền tảng' + lastActive: 'Hoạt động lần cuối' + refresh: 'Làm mới' + active: 'Đang hoạt động' + inactive: 'Không hoạt động' + userMessage: 'Người dùng' + botMessage: 'Bot' + createPlugin: 'Tạo Plugin' + editPlugin: 'Chỉnh sửa Plugin' + marketplace: 'Chợ ứng dụng' + arrange: 'Sắp xếp Plugin' + installPlugin: 'Cài đặt Plugin' + onlySupportGithub: 'Hiện chỉ hỗ trợ cài đặt từ GitHub' + enterGithubLink: 'Nhập liên kết GitHub của plugin' + installing: 'Đang cài đặt plugin...' + installSuccess: 'Cài đặt plugin thành công' + installFailed: 'Cài đặt thất bại, vui lòng thử lại sau' + searchPlugin: 'Tìm kiếm plugin' + sortBy: 'Sắp xếp theo' + mostStars: 'Nhiều star nhất' + recentlyAdded: 'Mới thêm gần đây' + recentlyUpdated: 'Mới cập nhật gần đây' + noMatchingPlugins: 'Không tìm thấy plugin phù hợp' + getPluginListError: 'Lấy danh sách plugin thất bại:' + noPluginInstalled: 'Chưa cài đặt plugin nào' + pluginConfig: 'Cấu hình Plugin' + pluginSort: 'Sắp xếp Plugin' + pluginSortDescription: 'Thứ tự plugin ảnh hưởng đến thứ tự xử lý trong cùng một sự kiện, vui lòng kéo thẻ plugin để sắp xếp' + pluginSortSuccess: 'Sắp xếp plugin thành công' + pluginSortError: 'Sắp xếp plugin thất bại: ' + pluginNoConfig: 'Plugin không có mục cấu hình nào.' + systemDisabled: 'Hệ thống Plugin đã bị tắt' + systemDisabledDesc: 'Hệ thống plugin chưa được bật, vui lòng sửa đổi cấu hình theo tài liệu hướng dẫn' + connectionError: 'WebSocket连接Lỗi' + connectionErrorDesc: 'Vui lòng kiểm tra cấu hình hệ thống plugin hoặc liên hệ quản trị viên.' + errorDetails: 'Chi tiết lỗi' + loadingStatus: 'Đang kiểm tra trạng thái hệ thống plugin...' + failedToGetStatus: 'Lấy trạng thái hệ thống plugin thất bại' + pluginSystemNotReady: 'Hệ thống plugin chưa sẵn sàng, không thể thực hiện thao tác này' + debugInfo: 'Thông tin gỡ lỗi' + debugInfoTitle: 'Thông tin gỡ lỗi Plugin' + debugUrl: 'URL gỡ lỗi' + debugKey: 'Khóa gỡ lỗi' + noDebugKey: '(Chưa đặt)' + debugKeyDisabled: 'Khóa gỡ lỗi chưa được đặt, gỡ lỗi plugin không yêu cầu xác thực' + failedToGetDebugInfo: 'Lấy thông tin gỡ lỗi thất bại' + copiedToClipboard: 'Đã sao chép vào clipboard' + deleting: 'Đang xóa...' + deletePlugin: 'Xóa Plugin' + saveConfig: 'Lưu cấu hình' + confirmDeletePlugin: 'Bạn có chắc chắn muốn xóa plugin ({{author}}/{{name}}) không?' + deleteDataCheckbox: 'Đồng thời xóa cấu hình và dữ liệu lưu trữ của plugin' + deleteConfirm: 'Xác nhậnXóa' + modifyFailed: 'Sửa đổi thất bại: ' + Tool: 'Công cụ' + EventListener: 'Trình lắng nghe sự kiện' + Command: 'Lệnh' + KnowledgeEngine: 'Công cụ tri thức' + Parser: 'Trình phân tích' + Page: 'Trang' + uploadLocal: 'Tải lên cục bộ' + debugging: 'Gỡ lỗi' + uploadLocalPlugin: 'Tải lên Plugin cục bộ' + dragToUpload: 'Kéo tệp plugin vào đây để tải lên' + unsupportedFileType: 'Loại tệp không được hỗ trợ, chỉ hỗ trợ tệp .lbpkg và .zip' + uploadingPlugin: 'Đang tải lên plugin...' + uploadSuccess: 'Tải tệp lên thành công!' + uploadFailed: 'Tải lên thất bại' + selectFileToUpload: 'Chọn tệp plugin để tải lên' + askConfirm: 'Bạn có chắc chắn muốn cài đặt plugin ' + fromGithub: 'Từ GitHub' + fromLocal: 'Từ cục bộ' + fromMarketplace: 'Từ chợ ứng dụng' + componentsList: 'Thành phần: ' + noComponents: 'Không có thành phần' + update: 'Cập nhật Plugin' + new: 'Mới' + updateConfirm: 'Xác nhận cập nhật' + confirmUpdatePlugin: 'Bạn có chắc chắn muốn cập nhật plugin ({{author}}/{{name}}) không?' + confirmUpdate: 'Xác nhận cập nhật' + updating: 'Đang cập nhật...' + updateSuccess: 'Cập nhật thành công' + updateError: 'Cập nhật thất bại: ' + saveConfigSuccessNormal: 'Lưu cấu hình thành công' + saveConfigError: 'Lưu cấu hình thất bại: ' + config: 'Cấu hình' + readme: 'Tài liệu' + viewSource: 'Xem mã nguồn' + loadingReadme: 'Đang tải tài liệu...' + noReadme: 'Plugin này không cung cấp tài liệu README' + tooLarge: 'Kích thước tệp vượt quá giới hạn 10MB' + failed: 'thất bại' + uploading: 'Đang tải lên...' + chooseFile: 'Chọn tệp' + addFile: 'Thêm tệp' + installFromGithub: 'Cài đặt máy chủ MCP từ GitHub' + enterRepoUrl: 'Nhập URL kho lưu trữ GitHub' + repoUrlPlaceholder: 'ví dụ: https://github.com/owner/repo' + fetchingReleases: 'Đang lấy danh sách phiên bản...' + selectRelease: 'Chọn phiên bản' + noReleasesFound: 'Không tìm thấy phiên bản nào' + fetchReleasesError: 'Lấy danh sách phiên bản thất bại: ' + selectAsset: 'Chọn tệp để cài đặt' + noAssetsFound: 'Không có tệp .lbpkg nào trong phiên bản này' + fetchAssetsError: 'Lấy danh sách tệp thất bại: ' + backToReleases: 'Quay lại danh sách phiên bản' + backToRepoUrl: 'Quay lại URL kho lưu trữ' + backToAssets: 'Quay lại danh sách tệp' + releaseTag: 'Tag: {{tag}}' + releaseName: 'Tên: {{name}}' + publishedAt: 'Ngày phát hành: {{date}}' + prerelease: 'Phiên bản trước phát hành' + assetSize: 'Kích thước: {{size}}' + confirmInstall: 'Xác nhận cài đặt' + installFromGithubDesc: 'Cài đặt plugin từ GitHub Release' + goToMarketplace: 'Đi đến chợ ứng dụng' + titleGeneric: 'Cài đặt Plugin' + overallProgress: 'Tiến độ tổng thể' + downloading: 'Đang tải Plugin' + installingDeps: 'Đang cài đặt phụ thuộc' + initializing: 'Đang khởi tạo cài đặt' + launching: 'Đang khởi chạy Plugin' + completed: '已Hoàn thành' + downloadSize: 'Kích thước gói: {{size}}' + depsInfo: '{{count}} phụ thuộc cần cài đặt' + depsProgress: 'Đã cài {{installed}}/{{total}} · Còn lại {{remaining}}' + installComplete: 'Cài đặt plugin thành công' + dismiss: 'Hủy bỏ dữ liệu gốc' + background: 'Chạy nền' + taskQueue: 'Tác vụ cài đặt' + clearCompleted: 'Xóa đã hoàn thành' + noTasks: 'Không có tác vụ cài đặt' + searchPlaceholder: 'Tìm kiếm plugin...' + searchResults: 'Tìm thấy {{count}} plugin' + totalPlugins: 'Tổng cộng {{count}} plugin' + noPlugins: 'Không có plugin nào' + noResults: 'Không có kết quả' + loadingMore: 'Đang tải thêm...' + allLoaded: 'Đã hiển thị tất cả plugin' + installConfirm: 'Bạn có chắc chắn muốn cài đặt plugin ' + downloadComplete: 'Tải plugin ' + loadFailed: 'Tải thất bại' + noDescription: 'Không có mô tả' + notFound: 'Không tìm thấy thông tin plugin' + mostDownloads: 'Tải nhiều nhất' + leastDownloads: 'Tải ít nhất' + downloads: 'lượt tải' + download: 'Tải xuống' + repository: 'Kho lưu trữ' + downloadFailed: 'Tải xuống thất bại' + tagLabel: 'Thẻ' + submissionTitle: 'Bạn có một plugin đang chờ duyệt: {{name}}' + submissionPending: 'Plugin của bạn đang được xem xét: {{name}}' + submissionApproved: 'Plugin của bạn đã được phê duyệt: {{name}}' + submissionRejected: 'Plugin của bạn đã bị từ chối: {{name}}' + clickToRevoke: 'Thu hồi' + revokeSuccess: 'Thu hồi thành công' + revokeFailed: 'Thu hồi thất bại' + submissionDetails: 'Chi tiết gửi Plugin' + markAsReadFailed: 'Đánh dấu đã đọc thất bại' + filterByComponent: 'Thành phần' + allComponents: 'Tất cả thành phần' + requestPlugin: 'Yêu cầu Plugin' + deprecated: 'Không còn hỗ trợ' + deprecatedTooltip: 'Vui lòng cài đặt plugin Công cụ tri thức tương ứng.' + filterByTags: 'Lọc theo thẻ' + selectTags: 'Chọn thẻ' + clearAll: 'Xóa tất cả' + noTags: 'Không có thẻ nào' + createServer: 'Thêm máy chủ MCP' + editServer: 'Chỉnh sửa máy chủ MCP' + deleteServer: 'Xóa máy chủ MCP' + confirmDeleteServer: 'Bạn có chắc chắn muốn xóa máy chủ MCP này không?' + confirmDeleteTitle: 'Xóa máy chủ MCP' + getServerListError: 'Lấy danh sách máy chủ MCP thất bại: ' + serverName: 'Tên máy chủ' + serverMode: 'Chế độ kết nối' + selectMode: 'Chọn chế độ' + stdio: 'Chế độ Stdio' + sse: 'Chế độ SSE' + http: 'Chế độ HTTP' + noServerInstalled: 'Chưa cấu hình máy chủ MCP nào' + serverNameRequired: 'Tên máy chủ không được để trống' + commandRequired: 'Lệnh không được để trống' + urlRequired: 'URL không được để trống' + timeoutMustBePositive: 'Thời gian chờ phải là số dương' + command: 'Lệnh' + args: 'Tham số' + env: 'Biến môi trường' + url: 'Vui lòng求URL' + headers: 'Vui lòng求头' + timeout: 'Hết thời gianThời gian' + addArgument: 'Thêm tham số' + addEnvVar: 'Thêm biến môi trường' + addHeader: 'Thêm tiêu đề' + testing: 'Đang kiểm tra...' + connecting: 'Đang kết nối...' + testFailed: 'Kiểm tra thất bại: ' + refreshSuccess: 'Làm mới thành công' + refreshFailed: 'Làm mới thất bại: ' + connectionSuccess: 'Kết nối thành công' + connectionFailed: 'WebSocket连接thất bại' + connectionFailedStatus: 'Kết nối thất bại' + toolsFound: 'công cụ' + unknownError: 'Lỗi không xác định' + noToolsFound: 'Không tìm thấy công cụ nào' + parseResultFailed: 'Phân tích kết quả kiểm tra thất bại' + noResultReturned: 'Kiểm tra không trả về kết quả' + getTaskFailed: 'Lấy trạng thái tác vụ thất bại' + noTaskId: 'Không lấy được ID tác vụ' + deleteFailed: 'Xóa thất bại: ' + createFailed: 'Tạo thất bại: ' + toolCount: '{{count}} công cụ' + statusDisconnected: 'Đã ngắt kết nối' + statusError: 'Lỗi kết nối' + starCount: 'Star: {{count}}' + nameRequired: 'Tên không được để trống' + sseTimeout: 'Thời gian chờ SSE' + sseTimeoutDescription: 'Thời gian chờ để thiết lập kết nối SSE' + extraParametersDescription: 'Sẽ được đính kèm vào nội dung yêu cầu, như max_tokens, temperature, top_p, v.v.' + timeoutMustBeNumber: 'Thời gian chờ phải là một số' + timeoutNonNegative: 'Thời gian chờ không được âm' + sseTimeoutMustBeNumber: 'Thời gian chờ SSE phải là một số' + sseTimeoutNonNegative: 'Thời gian chờ SSE không được âm' + updateFailed: 'Cập nhật thất bại: ' + deleteMCPAction: 'Xóa máy chủ MCP này' + deleteMCPHint: 'Sau khi xóa, cấu hình máy chủ MCP này không thể khôi phục.' + createPipeline: 'Tạo Pipeline' + editPipeline: 'Chỉnh sửa Pipeline' + debugChat: 'Hội thoạiGỡ lỗi' + getPipelineListError: 'Lấy danh sách Pipeline thất bại: ' + daysAgo: 'ngày trước' + today: 'Hôm nay' + updateTime: 'Cập nhật ' + defaultBadge: 'Mặc định' + newestCreated: 'Tạo mới nhất' + earliestCreated: 'Tạo sớm nhất' + recentlyEdited: 'Chỉnh sửa gần đây' + earliestEdited: 'Chỉnh sửa sớm nhất' + aiCapabilities: 'AI' + triggerConditions: 'Điều kiện kích hoạt' + safetyControls: 'An toàn' + outputProcessing: 'Đầu ra' + descriptionRequired: 'Mô tả không được để trống' + copySuffix: ' Bản sao' + defaultPipelineCannotDelete: 'Không thể xóa Pipeline mặc định' + copyConfirmTitle: 'Xác nhận sao chép' + copyConfirmation: 'Bạn có chắc chắn muốn sao chép Pipeline này không? Thao tác này sẽ tạo một Pipeline mới với tất cả cấu hình.' + deletePipelineAction: 'Xóa Pipeline này' + deletePipelineHint: 'Sau khi xóa, Bot liên kết với Pipeline này sẽ ngừng hoạt động.' + copyPipelineAction: 'Sao chép Pipeline này' + copyPipelineHint: 'Tạo một Pipeline mới với tất cả cấu hình được sao chép.' + noPluginsAvailable: 'Không có plugin nào' + noPluginsSelected: 'Chưa chọn plugin nào' + addPlugin: 'Thêm Plugin' + selectPlugins: 'Chọn Plugin' + pluginsTitle: 'Plugin' + mcpServersTitle: 'Máy chủ MCP' + noMCPServersSelected: 'Chưa chọn máy chủ MCP nào' + addMCPServer: 'Thêm máy chủ MCP' + selectMCPServers: 'Chọn máy chủ MCP' + noPluginsInstalled: 'Chưa cài đặt plugin nào' + noMCPServersConfigured: 'Chưa cấu hình máy chủ MCP nào' + enableAllPlugins: 'Bật tất cả Plugin' + enableAllMCPServers: 'Bật tất cả máy chủ MCP' + allPluginsEnabled: 'Đã bật tất cả plugin' + allMCPServersEnabled: 'Đã bật tất cả máy chủ MCP' + privateChat: 'Chat riêng' + groupChat: 'Chat nhóm' + send: 'Gửi' + reset: '重置Hội thoại' + inputPlaceholder: 'Gửi {{type}} Tin nhắn...' + sendFailed: 'Gửithất bại' + resetSuccess: 'Hội thoại已重置' + resetFailed: '重置thất bại' + loadMessagesFailed: 'TảiTin nhắnthất bại' + loadPipelinesFailed: 'Tải Pipeline thất bại' + atTips: 'Nhắc đến bot' + streaming: 'Truyền phát' + streamOutput: 'Streaming' + connected: 'WebSocket已Kết nối' + disconnected: 'WebSocket未Kết nối' + notConnected: 'WebSocket未连接,Vui lòng稍后Thử lại' + reply: 'Trả lời' + replyTo: 'Trả lời给' + showMarkdown: 'Hiển thị' + showRaw: 'Văn bản gốc' + allMembers: 'Tất cả thành viên' + file: 'Tệp' + voice: 'Giọng nói' + uploadImage: 'Tải lên hình ảnh' + detailedLogs: 'Nhật ký chi tiết' + createKnowledgeBase: 'Tạo cơ sở tri thức' + editKnowledgeBase: 'Chỉnh sửa cơ sở tri thức' + selectKnowledgeBase: 'Chọn cơ sở tri thức' + selectKnowledgeBases: 'Chọn cơ sở tri thức' + addKnowledgeBase: 'Thêm cơ sở tri thức' + noKnowledgeBaseSelected: 'Chưa chọn cơ sở tri thức nào' + empty: 'Trống' + editDocument: 'Tài liệu' + metadata: 'Siêu dữ liệu' + kbNameRequired: 'Tên cơ sở tri thức không được để trống' + kbDescriptionRequired: 'Mô tả cơ sở tri thức không được để trống' + embeddingModelUUIDRequired: 'Mô hình Embedding không được để trống' + kbName: 'Tên cơ sở tri thức' + kbDescription: 'Mô tả cơ sở tri thức' + topK: 'Top K' + topKRequired: 'Top K không được để trống' + topKMax: 'Giá trị tối đa của Top K là 30' + topKdescription: 'Dùng để chỉ định số lượng tài liệu liên quan cần truy xuất, phạm vi từ 1 đến 30.' + embeddingModelUUID: 'Mô hình Embedding' + selectEmbeddingModel: 'Chọn mô hình Embedding' + embeddingModelDescription: 'Dùng để véc tơ hóa văn bản, bạn có thể cấu hình trong trang Mô hình' + cannotChangeEmbeddingModel: 'Không thể thay đổi mô hình Embedding sau khi tạo cơ sở tri thức' + updateKnowledgeBaseSuccess: 'Cập nhật cơ sở tri thức thành công' + updateKnowledgeBaseFailed: 'Cập nhật cơ sở tri thức thất bại: ' + status: 'Trạng thái' + dragAndDrop: 'Kéo và thả tệp vào đây hoặc nhấp để tải lên' + supportedFormats: 'Hỗ trợ các định dạng PDF, Word, TXT, Markdown, HTML, ZIP và các định dạng tài liệu khác' + uploadError: 'Tải tệp lên thất bại: ' + uploadingFile: 'Đang tải tệp lên...' + fileSizeExceeded: 'Kích thước tệp vượt quá giới hạn 10MB. Vui lòng chia thành các tệp nhỏ hơn.' + fileDeleteSuccess: 'Xóa tệp thành công' + fileDeleteFailed: 'Xóa tệp thất bại: ' + processing: 'Đang xử lý' + selectParser: 'Chọn trình phân tích' + builtInParser: 'Được cung cấp bởi Công cụ tri thức' + noParserAvailable: 'Không có trình phân tích hỗ trợ loại tệp này. Vui lòng cài đặt plugin trình phân tích có thể xử lý định dạng này.' + installParserHint: 'Duyệt plugin trình phân tích trong Marketplace →' + confirmUpload: 'Tải lên' + cancelUpload: 'Hủy' + deleteKnowledgeBaseConfirmation: 'Bạn có chắc chắn muốn xóa cơ sở tri thức này không? Tất cả tài liệu trong cơ sở tri thức này sẽ bị xóa.' + retrieve: 'Kiểm tra truy xuất' + retrieveTest: 'Kiểm tra truy xuất' + query: 'SQLTruy vấn' + queryPlaceholder: 'Nhập văn bản truy vấn...' + distance: 'Khoảng cách' + content: 'Nội dung' + fileName: 'Tên tệp' + retrieveError: 'Truy xuất thất bại: ' + unknownEngine: 'Công cụ không xác định' + knowledgeEngine: 'Công cụ tri thức' + knowledgeEngineRequired: 'Công cụ tri thức là bắt buộc' + selectKnowledgeEngine: 'Chọn công cụ tri thức' + builtInEngine: 'Công cụ tích hợp' + cannotChangeKnowledgeEngine: 'Không thể thay đổi công cụ tri thức sau khi tạo' + engineSettings: 'Cài đặt công cụ' + engineSettingsDescription: 'Cấu hình cho công cụ tri thức đã chọn' + engineSettingsReadonly: 'chỉ đọc trong chế độ chỉnh sửa' + retrievalSettings: 'Cài đặt truy xuất' + retrievalSettingsDescription: 'Cấu hình cách truy xuất tài liệu từ cơ sở tri thức này' + deleteKbAction: 'Xóa cơ sở tri thức này' + deleteKbHint: 'Sau khi xóa, tất cả tài liệu và dữ liệu trong cơ sở tri thức này sẽ bị xóa vĩnh viễn.' + noEnginesAvailable: 'Không có công cụ cơ sở tri thức nào khả dụng' + installEngineHint: 'Vui lòng cài đặt plugin ' + createKnowledgeBaseFailed: 'Tạo cơ sở tri thức thất bại: ' + loadKnowledgeBaseFailed: 'Tải cơ sở tri thức thất bại: ' + deleteKnowledgeBaseFailed: 'Xóa cơ sở tri thức thất bại: ' + getKnowledgeBaseListError: 'Lấy danh sách cơ sở tri thức thất bại: ' + embeddingModel: 'Embedding' + embeddingModelRequired: 'Mô hình Embedding là bắt buộc cho công cụ này' + addExternal: 'Thêm cơ sở tri thức bên ngoài' + createExternalSuccess: 'Tạo cơ sở tri thức bên ngoài thành công' + updateExternalSuccess: 'Cập nhật cơ sở tri thức bên ngoài thành công' + deleteExternalSuccess: 'Xóa cơ sở tri thức bên ngoài thành công' + retriever: 'Trình truy xuất' + selectRetriever: 'Chọn trình truy xuất...' + retrieverConfiguration: 'Cấu hình trình truy xuất' + retrieverInstallInfo: 'Bạn có thể cài đặt plugin trình truy xuất tri thức từ' + detected: 'Phát hiện {{total}} cơ sở tri thức cần di chuyển ({{internal}} nội bộ, {{external}} bên ngoài).' + startWithInstall: 'Tự động cài đặt Plugin & Di chuyển' + startDataOnly: 'Chỉ di chuyển dữ liệu' + running: 'Thực thi中' + dismissError: 'Thao tác thất bại' + adminAccountNote: 'Tài khoản bạn sử dụng ở đây sẽ được đặt làm tài khoản quản trị viên' + initWithSpace: 'Khởi tạo với Space' + spaceRecommended: 'Khuyến nghị: Sử dụng API mô hình ổn định chính thức và dịch vụ đám mây' + spaceInfoTip1: 'Space cung cấp dịch vụ xác thực tài khoản thống nhất mà không tải lên bất kỳ thông tin nhạy cảm nào của bạn.' + spaceInfoTip2: 'Đăng nhập bằng tài khoản Space cho phép bạn truy cập Mô hình LangBot và các dịch vụ đám mây khác, bao gồm tín dụng gọi mô hình miễn phí để giúp bạn bắt đầu nhanh chóng.' + spaceInfoTip3: 'Phương thức đăng nhập của bạn không ảnh hưởng đến các tính năng khác. Bạn có thể cấu hình và sử dụng mô hình từ các nguồn khác bất cứ lúc nào.' + registerLocal: 'Đăng ký tài khoản cục bộ' + registerWithPassword: 'Đăng ký bằng email và mật khẩu' + initSuccess: 'Khởi tạo thành công, vui lòng đăng nhập' + initFailed: 'Khởi tạo thất bại: ' + recoveryKey: 'Khóa khôi phục' + recoveryKeyDescription: 'Được lưu trữ trong `system.recovery_key` của tệp cấu hình `data/config.yaml`' + enterRecoveryKey: 'Nhập khóa khôi phục' + recoveryKeyRequired: 'Khóa khôi phục không được để trống' + resetPassword: 'Đặt lại mật khẩu' + resetting: 'Đang đặt lại...' + embeddingModels: 'Embedding' + newVersionAvailable: 'Có phiên bản mới' + viewUpdateGuide: 'Xem hướng dẫn cập nhật' + noReleaseNotes: 'Không có ghi chú phát hành' + settings: 'Cài đặt tài khoản' + setPassword: 'Đặt mật khẩu' + passwordSetSuccess: 'Đặt mật khẩu thành công' + passwordStatus: 'Mật khẩu cục bộ' + passwordNotSet: 'Chưa đặt' + passwordSetDescription: 'Mật khẩu đã được đặt, bạn có thể đăng nhập bằng email và mật khẩu' + spaceStatus: 'Tài khoản Space' + spaceBound: 'Đã liên kết' + spaceNotBound: 'Chưa liên kết' + spaceBoundDescription: 'Tài khoản Space đã liên kết, có thể sử dụng API mô hình chính thức và dịch vụ đám mây' + bindSpace: 'Liên kết tài khoản Space' + bindSpaceDescription: 'Liên kết để sử dụng API mô hình chính thức và dịch vụ đám mây' + bindSpaceButton: 'Liên kết' + bindSpaceConfirmTitle: 'Xác nhận liên kết' + bindSpaceConfirmDescription: 'Bạn sắp liên kết phiên bản cục bộ với tài khoản Space' + bindSpaceWarning: 'Sau khi liên kết, email đăng nhập của bạn sẽ được đổi từ {{localEmail}} sang email tài khoản Space.' + bindSpaceSuccess: 'Liên kết tài khoản Space thành công' + bindSpaceFailed: 'Liên kết tài khoản Space thất bại' + bindSpaceInvalidState: 'Yêu cầu liên kết không hợp lệ. Vui lòng thử lại từ cài đặt tài khoản.' + setPasswordHint: 'Đặt mật khẩu để đăng nhập bằng email và mật khẩu' + spaceEmailMismatch: 'Email đăng nhập Space không khớp với email tài khoản cục bộ' + overview: 'Tổng quan' + totalMessages: 'Tổng tin nhắn' + llmCallsCount: 'Cuộc gọi LLM' + modelCallsCount: 'Cuộc gọi mô hình' + successRate: 'Thành công率' + activeSessions: 'Phiên đang hoạt động' + last24Hours: '24 giờ qua' + bot: 'Bot' + pipeline: 'Pipeline' + allBots: 'Tất cả Bot' + allPipelines: 'Tất cả Pipeline' + timeRange: 'Khoảng thời gian' + customRange: 'Tùy chỉnh' + apply: 'Áp dụng' + lastHour: '1 giờ qua' + last6Hours: '6 giờ qua' + last7Days: '7 ngày qua' + last30Days: '30 ngày qua' + llmCalls: 'Cuộc gọi LLM' + embeddingCalls: 'Cuộc gọi Embedding' + modelCalls: 'Cuộc gọi mô hình' + feedback: 'Phản hồi người dùng' + errors: 'LỗiDanh sách' + timestamp: 'Thời gian戳' + message: 'Tin nhắn' + sessionId: 'Phiên ID' + copyId: 'Sao chép ID' + noMessagesDescription: 'Hãy thử điều chỉnh bộ lọc hoặc kiểm tra lại sau' + loadMore: 'Tải thêm' + autoRefresh: 'Tự động làm mới' + level: 'Mức' + runner: 'Trình chạy' + viewConversation: 'Xem cuộc trò chuyện' + model: 'Mô hình' + tokens: 'Token' + cost: 'Chi phí' + noData: 'Không có dữ liệu lưu lượng' + inputTokens: 'Token đầu vào' + outputTokens: 'Token đầu ra' + totalTokens: 'Tổng Token' + avgDuration: 'Thời lượng trung bình' + calls: 'Cuộc gọi' + promptTokens: 'Token prompt' + knowledgeBase: 'Cơ sở tri thức' + queryText: 'Truy vấn' + llmModel: 'LLM' + embeddingCall: 'Embedding' + retrieveCall: 'Truy xuất' + lastActivity: 'Hoạt động cuối' + messageStats: 'Thống kê tin nhắn' + successMessages: 'Thành công' + errorMessages: 'Thất bại' + llmStats: 'Thống kê LLM' + errorType: 'Loại lỗi' + errorMessage: 'Thông báo lỗi' + occurredAt: 'Xảy ra lúc' + noErrors: 'Không tìm thấy lỗi' + stackTrace: 'Stack Trace' + totalFeedback: 'Tổng phản hồi' + totalLikes: 'Lượt thích' + totalDislikes: 'Lượt không thích' + satisfactionRate: 'Tỷ lệ hài lòng' + like: 'Thích' + dislike: 'Không thích' + noFeedback: 'Chưa có phản hồi' + noFeedbackDescription: 'Phản hồi của người dùng sẽ hiển thị tại đây' + feedbackList: 'Danh sách phản hồi' + feedbackContent: 'Nội dung phản hồi' + contextInfo: 'Thông tin ngữ cảnh' + userId: 'ID người dùng' + messageId: 'ID tin nhắn' + streamId: 'ID câu hỏi liên quan' + inaccurateReasons: 'Lý do không chính xác' + exportFeedback: 'Xuất phản hồi' + viewMonitoring: 'Xem giám sát' + refreshData: 'Làm mới dữ liệu' + exportData: 'Xuất dữ liệu' + exporting: 'Đang xuất...' + openDialog: 'Xem phân tích' + dialogTitle: 'Phân tích lưu trữ' + generatedAt: 'Tạo lúc {{time}}' + totalSize: 'Tổng dung lượng' + binaryStorage: 'Lưu trữ nhị phân plugin' + uploadCleanup: 'Tệp tải lên hết hạn' + logCleanup: 'Nhật ký hết hạn' + sections: 'Khu vực lưu trữ' + monitoringTables: 'Bảng giám sát' + runtimeTasks: 'Tác vụ runtime' + cleanupPolicy: 'Chính sách dọn dẹp' + uploadRetention: 'Thời gian giữ tệp tải lên' + logRetention: 'Thời gian giữ nhật ký' + databaseType: 'Loại cơ sở dữ liệu' + days: 'ngày' + missing: '缺失Tham số' + expiredUploads: 'Tệp tải lên hết hạn' + expiredLogs: 'Nhật ký hết hạn' + noExpiredUploads: 'Không có tệp tải lên hết hạn' + noExpiredLogs: 'Không có nhật ký hết hạn' + database: 'Cơ sở dữ liệu' + storage: 'Tệp tải lên' + vector_store: 'Kho vector' + plugins: 'Plugin' + mcp: 'MCP' + temp: 'Tệp tạm' + maxBotsReached: 'Đã đạt số lượng Bot tối đa ({{max}}). Vui lòng xóa một Bot hiện có trước khi tạo mới.' + maxPipelinesReached: 'Đã đạt số lượng Pipeline tối đa ({{max}}). Vui lòng xóa một Pipeline hiện có trước khi tạo mới.' + maxExtensionsReached: 'Đã đạt số lượng tiện ích mở rộng tối đa ({{max}}). Vui lòng xóa một máy chủ MCP hoặc plugin hiện có trước khi thêm mới.' + sidebarDescription: 'Tạo Bot với các bước hướng dẫn' + skip: 'Bỏ qua' + skipConfirmMessage: 'Bạn có thể vào lại trình hướng dẫn Bắt đầu nhanh từ menu tài khoản sau, hoặc tạo Bot thủ công.' + skipConfirmOk: 'OK' + prev: 'Trước' + next: 'Tiếp' + finish: 'Tạo & Triển khai' + confirmCreateBot: 'Xác nhận, Tạo Bot' + botCreateSuccess: 'Tạo Bot thành công!' + botSaveSuccess: 'Cấu hình Bot đã lưu và bật!' + spaceAuthError: 'Khởi tạo ủy quyền Space thất bại' + skipSaveError: 'Lưu trạng thái bỏ qua thất bại. Vui lòng thử lại.' + completeSaveError: 'Lưu trạng thái hoàn tất thất bại. Vui lòng thử lại.' + botConfig: 'Thiết lập Bot' + aiEngine: 'Công cụ AI' + done: 'Hoàn tất' + saveBot: 'Lưu & Bật Bot' + resaveBot: 'Lưu lại cấu hình' + botSaved: 'Cấu hình Bot đã lưu và bật. Kiểm tra nhật ký để xác minh kết nối.' + logsTitle: 'Nhật ký Bot' + logsDescription: 'Giám sát hoạt động Bot để xác minh kết nối nền tảng đang hoạt động.' + action: 'Hành động' + botInfo: 'Thông tin Bot' + botNamePlaceholder: 'Nhập tên Bot' + botDescPlaceholder: 'Nhập mô tả Bot (tùy chọn)' + platformConfig: 'Cấu hình {{platform}}' + aiConfig: 'Cấu hình {{engine}}' + backToWorkbench: 'Quay lại bàn làm việc' + createWorkflow: 'Tạo Quy trình' + editWorkflow: 'Chỉnh sửa Quy trình' + newWorkflow: 'Quy trình Mới' + getWorkflowListError: 'Lỗi khi lấy danh sách quy trình:' + workflowName: 'Tên Quy trình' + workflowDescription: 'Mô tả Quy trình' + workflowNameRequired: 'Tên quy trình không được để trống' + getWorkflowError: 'Lỗi khi lấy quy trình:' + copyError: '复制thất bại:' + export: 'Xuất' + import: 'Nhập' + exportSuccess: 'Quy trình已导出' + importSuccess: 'Quy trình已导入' + publish: 'Xuất bản' + publishSuccess: '发布Thành công' + publishError: '发布thất bại' + executions: 'Thực thi记录' + editor: 'Chỉnh sửa器' + basicInfoDesc: '设置Quy trìnhTên、图标和Mô tả' + deleteWorkflowAction: 'Xóa此Quy trình' + deleteWorkflow: 'XóaQuy trình' + deleteConfirmDesc: '您确定要XóaQuy trình ' + namePlaceholder: 'Đầu vàoQuy trìnhTên' + descriptionPlaceholder: 'Đầu vàoQuy trìnhMô tả(可选)' + enabled: 'Bật' + enabledDesc: '启用后,Quy trình将可以被触发Thực thi' + info: 'Quy trìnhThông tin' + uuid: 'UUID' + version: 'Phiên bản' + updatedAt: '更新Thời gian' + totalExecutions: '共 {{count}} 条Thực thi记录' + statistics: 'Thống kê分析' + successfulCount: 'Thành công {{count}} 次' + averageDuration: 'Thời lượng trung bình' + perExecution: '每次Thực thi' + failedExecutions: 'thất bại次数' + lastExecution: '最后Thực thi' + filterByStatus: '按Trạng thái筛选' + allStatuses: '全部Trạng thái' + manualTrigger: 'Kích hoạt thủ công' + executionId: 'Thực thi ID' + noExecutions: '暂无Thực thi记录' + executionDetails: 'Thực thi详情' + nodeExecutions: 'NútThực thi记录' + result: 'Kết quả' + properties: 'Thuộc tính' + zoomIn: 'Phóng to' + zoomOut: 'Thu nhỏ' + fitView: 'Điều chỉnh khung nhìn' + paste: 'Dán' + copied: '已复制 {{count}} 个Nút' + pasted: '已粘贴 {{count}} 个Nút' + nodesSelected: '已选中 {{count}} 个Nút' + edgesSelected: 'Đã chọn {{count}} kết nối' + loadingNodeTypes: '正在TảiNútLoại...' + clearSearch: '清除Tìm kiếm' + selectNodeOrEdge: 'ChọnmộtNút或连线' + edgeProperties: 'Thuộc tính kết nối' + conditionPlaceholder: 'Đầu vàoĐiều kiện表达式,如: output.success == true' + nodeLabel: 'NútTên' + nodeId: 'Nút ID' + inputOutputVariables: 'Đầu vào/Đầu raBiến' + outputs: 'Đầu ra' + messageContent: '模拟Tin nhắn' + nodeConfig: 'NútCấu hình' + noConfigOptions: '该NútLoại暂无Cấu hình选项' + deleteNode: 'XóaNút' + text: 'Văn bản' + data: 'Dữ liệu' + body: 'Vui lòng求体' + items: '项目Danh sách' + arguments: 'Tham số' + question: 'Người dùngCâu hỏi' + parameters: 'Tham số定义' + key: 'Khóa' + case_1: 'Nhánh 1' + case_2: 'Nhánh 2' + notification_id: 'Thông báoID' + key_template: 'Mẫu khóa' + arguments_template: 'Tham số模板' + scope: 'Phạm vi' + payload: 'Tải trọng' + input_value: 'Đầu vàoGiá trị' + trigger: 'Trình kích hoạt' + triggerDescription: 'Quy trình起始Nút' + messageTrigger: 'Tin nhắn触发' + webhookTrigger: 'Kích hoạt Webhook' + webhookTriggerDescription: '通过 HTTP Vui lòng求触发' + process: 'AI/Xử lý' + aiProcess: 'Xử lý AI' + aiProcessDescription: '使用 AI 模型处理Tin nhắn' + llmCall: 'LLM Gọi' + codeExecutor: '代码Thực thi' + codeExecutorDescription: 'Thực thi Python/JavaScript 代码' + templateProcess: 'Xử lý mẫu' + httpRequest: 'HTTP Vui lòng求' + httpRequestDescription: 'Gửi HTTP Vui lòng求' + dataTransform: 'Dữ liệuChuyển đổi' + dataTransformDescription: 'Chuyển đổiDữ liệuĐịnh dạng' + questionClassifier: 'Câu hỏiBộ phân loại' + questionClassifierDescription: '使用 LLM 将Người dùngCâu hỏiDanh mục到预定义类别' + parameterExtractor: 'Tham số提取器' + knowledgeRetrieval: 'Kiến thức库Truy xuất' + jsonTransform: 'JSON Chuyển đổi' + jsonTransformDescription: 'Chuyển đổi JSON Dữ liệu' + variableAssignment: 'Biến赋Giá trị' + variableAssignmentDescription: '为Quy trìnhBiến赋Giá trị' + control: 'Luồng điều khiển' + switch: '多路Nhánh' + switchDescription: '多Điều kiện分支Chọn' + loop: 'Vòng lặp' + loopDescription: '重复Thực thi' + iterator: 'Bộ lặp' + parallel: 'Song song处理' + wait: 'Chờ' + delay: 'Trì hoãn' + merge: 'Hợp nhất' + mergeDescription: 'Hợp nhất多个Nhánh' + actionDescription: 'Thực thi动作Nút' + sendMessage: 'GửiTin nhắn' + sendMessageDescription: 'GửiTin nhắn到平台' + replyMessage: '回复Tin nhắn' + replyMessageDescription: '回复触发Quy trìnhTin nhắn' + storeData: 'Lưu trữDữ liệu' + storeDataDescription: 'Lưu trữDữ liệu到Cơ sở dữ liệu' + callPipeline: 'Gọi Pipeline' + callPipelineDescription: '调用现有 Pipeline' + openingStatement: 'Hội thoại开场白' + end: 'Kết thúc' + endDescription: '标记Quy trìnhThực thiKết thúc' + logDescription: '记录日志Thông tin' + difyWorkflow: 'Dify Quy trình' + difyWorkflowDescription: '调用 Dify 平台Quy trình' + difyKnowledgeQuery: 'Dify Kiến thức库' + difyKnowledgeQueryDescription: 'Truy vấn Dify Kiến thức库' + n8nWorkflow: 'n8n Quy trình' + n8nWorkflowDescription: '调用 n8n Quy trình' + langflowFlow: 'Luồng Langflow' + langflowFlowDescription: 'Gọi Langflow 流程' + cozeBot: 'Bot Coze' + cozeBotDescription: 'Gọi扣子 Bot' + databaseQuery: 'Cơ sở dữ liệuTruy vấn' + redisOperation: 'Redis Thao tác' + redisOperationDescription: 'Thực thi Redis 缓存操作' + mcpTool: 'MCP Công cụ' + mcpToolDescription: 'Gọi MCP Công cụ' + nodeResults: 'NútThực thi结果' + current: '当前Phiên bản' + rollbackSuccess: '回滚Thành công' + rollbackError: '回滚thất bại:' + debug: 'Debug' + startDebug: 'Bắt đầuGỡ lỗi' + pauseDebug: 'Tạm dừng' + resumeDebug: 'Tiếp tục' + stepDebug: '单步Thực thi' + stopDebug: 'Dừng' + simulatedMessage: '模拟Tin nhắn' + senderId: 'Gửi者 ID' + senderName: 'Gửi者Tên' + conversationId: 'Phiên ID' + isGroup: 'Chat nhóm' + addVariable: 'ThêmBiến' + variableName: 'Biến名' + variableValue: 'BiếnGiá trị' + breakpoints: 'Điểm dừng' + toggleBreakpoint: 'Chuyển đổi断点' + breakpointRemoved: 'Đã xóa điểm dừng' + autoScroll: 'Tự động cuộn' + idle: 'Nhàn rỗi' + paused: '已Tạm dừng' + skipped: '已Bỏ qua' + selectWorkflow: 'ChọnQuy trình' + loadWorkflowsFailed: 'TảiQuy trìnhthất bại' + allTime: '全部Thời gian' + lastWeek: 'Tuần trước' + showingExecutions: 'Hiển thị {{shown}} / {{total}} bản ghi' + rerunExecution: '重新Thực thi' + details: 'Chi tiết' + completedAt: 'Hoàn thành时间' + noNodeExecutions: '暂无NútThực thi记录' + regex_filter: 'Biểu thức Chính quyLọc' + min_length: 'Tối thiểuĐộ dài' + require_mention: 'Yêu cầu nhắc bot' + access_control: 'Kiểm soát truy cập' + cron: 'Biểu thức Cron' + timezone: 'Múi giờ' + path: 'Đường dẫn Webhook' + content_type: 'Content-Type' + auth_type: 'Loại xác thực' + auth_key: 'Khóa xác thực' + validation: 'Vui lòng求验证' + filter: 'Sự kiệnLọc' + debounce_ms: '防抖Thời gian' + temperature: 'Nhiệt độ' + top_p: 'Top P' + frequency_penalty: 'Phạt tần suất' + presence_penalty: 'Phạt hiện diện' + max_tokens: 'Tối đaToken数' + seed: 'Seed ngẫu nhiên' + method: 'Vui lòng求方法' + auth_config: '认证Cấu hình' + template: 'Mẫu' + expression: 'Biểu thức' + output_type: 'Đầu raLoại' + categories: 'Danh mục类别' + instruction: 'Chỉ thị' + knowledge_bases: 'Kiến thức库' + top_k: 'Số lượng trả về' + search_method: 'Tìm kiếm方法' + condition_type: 'Điều kiệnLoại' + left_value: '左Giá trị' + operator: 'Toán tử so sánh' + right_value: '右Giá trị' + branches: '分支Cấu hình' + fail_fast: '快速thất bại' + duration_type: 'Thời gian单位' + merge_strategy: 'Hợp nhất策略' + aggregation_mode: 'Chế độ tổng hợp' + target_id: 'ID đích' + message_type: 'Tin nhắnLoại' + message_template: 'Tin nhắn模板' + force_delay: '强制Trì hoãn' + pipeline_uuid: 'Pipeline' + inherit_context: '继承Ngữ cảnh' + ttl: '过期Thời gian' + variable_name: 'BiếnTên' + statement: 'Tuyên bố Mở đầu' + show_suggestions: 'Hiển thị gợi ý' + success_message: 'Thành côngTin nhắn' + connection_url: 'Kết nốiURL' + dataset_id: 'Kiến thức库ID' + sender_id: 'Gửi者 ID' + sender_name: 'Gửi者Tên' + conversation_id: 'Phiên ID' + is_group: 'Là chat nhóm' + schedule: 'Lịch trình' + cron_timestamp: 'Cron Thời gian戳' + cron_schedule: 'Cron Biểu thức lịch trình' + cron_context: 'Cron Ngữ cảnh' + webhook_body: 'Webhook Vui lòng求体' + webhook_headers: 'Webhook Vui lòng求头' + webhook_query: 'Webhook 查询Tham số' + webhook_method: 'Webhook Vui lòng求方法' + event_data: 'Sự kiệnDữ liệu' + event_timestamp: 'Sự kiệnThời gian戳' + response: 'Phản hồi' + usage: 'Token使用Thống kê' + context_info: '上下文Thông tin' + output: 'Đầu ra' + status_code: 'Trạng thái码' + http_body: 'HTTP Vui lòng求体' + http_headers: 'HTTP Vui lòng求头' + http_response: 'HTTP Phản hồi' + response_headers: 'Phản hồi头' + transform_result: 'Chuyển đổi结果' + category: 'Danh mục结果' + confidence: 'Độ tin cậy' + all_scores: 'Tất cả điểm số' + extraction_success: '提取Thành công' + citations: '引用Thông tin' + knowledge_query: 'Truy xuấtTruy vấn' + true: 'Điều kiện为真Đầu ra' + false: 'Điều kiện为假Đầu ra' + condition_input: 'Điều kiệnĐầu vào' + matched_case: '匹配Nhánh' + default: 'Mặc địnhNhánh' + item: 'Mục hiện tại' + index: 'Chỉ số hiện tại' + results: 'Kết quả' + loop_items: 'Các mục lặp' + iterator_item: 'Phần tử hiện tại' + iterator_index: 'Chỉ số hiện tại' + merged: 'Hợp nhất结果' + aggregator_variables: 'BiếnĐầu vào' + message_id: 'Tin nhắnID' + target: 'ID đích' + pipeline_response: 'Pipeline Phản hồi' + pipeline_query: 'Truy vấn内容' + store_status: 'Lưu trữTrạng thái' + store_key: 'Lưu trữ键' + variable_value: 'BiếnGiá trị' + workflow_output: 'Quy trìnhĐầu ra' + query_results: 'Truy vấn结果' + row_count: 'Số hàng' + query_success: '查询Thành công' + query_params: '查询Tham số' + redis_result: 'RedisKết quả' + redis_success: 'RedisThành công' + redis_key: 'Redis Khóa' + redis_value: 'Redis Giá trị' + tool_success: '工具Thành công' + mcp_arguments: '工具Tham số' + memory_success: '记忆Thành công' + answer: 'Câu trả lời' + dify_success: 'DifyThành công' + dify_conversation_id: 'Phiên ID' + search_results: 'Tìm kiếm结果' + knowledge_base_query: 'Truy vấn内容' + n8n_result: 'N8nKết quả' + n8n_success: 'N8nThành công' + n8n_payload: 'Quy trìnhĐầu vào数据' + flow_success: '流程Thành công' + bot_success: '机器人Thành công' + coze_conversation_id: 'Phiên ID' + bot_conversation_id: 'Phiên ID' + event: 'Sự kiện' + trigger_time: '触发Thời gian' + parsed: 'Kết quả phân tích' + chunks: 'Văn bản块' + count: 'Số lượng' + execution_id: 'Thực thiID' + dimensions: 'Chiều' + entities: 'Thực thể' + invalidPage: 'Trang plugin không hợp lệ' + +缺失键列表: + undo + redo + bindTarget + bindTargetDescription + bindingType + selectBinding + noPipelinesFound + noWorkflowsFound + pipelineBindingHelp + workflowBindingHelp + dataOnlyHint + edgeCondition + edgeConditionPlaceholder + noNodeSelected + selectNodeToEdit + dragNodeHint + mode + panel + start + pause + resume + step + stop + messageContentPlaceholder + platformPlaceholder + customVariablesDesc + variableKey + noWatchedVariables + nodeOutputs + noNodeOutputs + clearBreakpoints + logEntries + resetContext + starting + started + startError + pauseError + resumed + resumeError + steppedTo + stepError + stopped + stopError + escape_html + trim_whitespace + json_transform_type + json_expression + mapping + code_language + code_content + aggregation_type + separator + field_path + split_type + chunk_size + chunk_overlap + regex_pattern + remove_empty + assign_variable_name + value_type + static_value + n8n_webhook_url + n8n_auth_type + langflow_flow_id + coze_bot_id + coze_api_base + workflow + pipelineDescription + noPipelines + noWorkflows + +============================================================ diff --git a/src/langbot/pkg/workflow/nodes/call_pipeline.py b/src/langbot/pkg/workflow/nodes/call_pipeline.py index 5dffc935..b00f1c1d 100644 --- a/src/langbot/pkg/workflow/nodes/call_pipeline.py +++ b/src/langbot/pkg/workflow/nodes/call_pipeline.py @@ -24,7 +24,7 @@ class CallPipelineNode(WorkflowNode): type_name = 'call_pipeline' category = 'action' - icon = '⚙️' + icon = 'Workflow' name = 'call_pipeline' description = 'call_pipeline' name_zh = '调用 Pipeline' diff --git a/src/langbot/pkg/workflow/nodes/code_executor.py b/src/langbot/pkg/workflow/nodes/code_executor.py index e7cddac7..24d1b46e 100644 --- a/src/langbot/pkg/workflow/nodes/code_executor.py +++ b/src/langbot/pkg/workflow/nodes/code_executor.py @@ -19,7 +19,7 @@ class CodeExecutorNode(WorkflowNode): type_name = 'code_executor' category = 'process' - icon = '💻' + icon = 'Code' name = 'code_executor' description = 'code_executor' name_zh = '代码执行' diff --git a/src/langbot/pkg/workflow/nodes/condition.py b/src/langbot/pkg/workflow/nodes/condition.py index 4ea12194..cfa85f3c 100644 --- a/src/langbot/pkg/workflow/nodes/condition.py +++ b/src/langbot/pkg/workflow/nodes/condition.py @@ -18,7 +18,7 @@ class ConditionNode(WorkflowNode): type_name = 'condition' category = 'control' - icon = '🔀' + icon = 'GitBranch' name = 'condition' description = 'condition' name_zh = '条件分支' diff --git a/src/langbot/pkg/workflow/nodes/cron_trigger.py b/src/langbot/pkg/workflow/nodes/cron_trigger.py index e11c5a3d..d84140cf 100644 --- a/src/langbot/pkg/workflow/nodes/cron_trigger.py +++ b/src/langbot/pkg/workflow/nodes/cron_trigger.py @@ -17,7 +17,7 @@ class CronTriggerNode(WorkflowNode): type_name = 'cron_trigger' category = 'trigger' - icon = '⏰' + icon = 'Timer' name = 'cron_trigger' description = 'cron_trigger' name_zh = '定时触发' diff --git a/src/langbot/pkg/workflow/nodes/data_transform.py b/src/langbot/pkg/workflow/nodes/data_transform.py index a3cc78e0..aac727b0 100644 --- a/src/langbot/pkg/workflow/nodes/data_transform.py +++ b/src/langbot/pkg/workflow/nodes/data_transform.py @@ -18,7 +18,7 @@ class DataTransformNode(WorkflowNode): type_name = 'data_transform' category = 'process' - icon = '🔄' + icon = 'ArrowRightLeft' name = 'data_transform' description = 'data_transform' name_zh = '数据转换' diff --git a/src/langbot/pkg/workflow/nodes/end.py b/src/langbot/pkg/workflow/nodes/end.py index 2fbf37b4..add94676 100644 --- a/src/langbot/pkg/workflow/nodes/end.py +++ b/src/langbot/pkg/workflow/nodes/end.py @@ -17,7 +17,7 @@ class EndNode(WorkflowNode): type_name = 'end' category = 'action' - icon = '🏁' + icon = 'PauseCircle' name = 'end' description = 'end' name_zh = '结束' diff --git a/src/langbot/pkg/workflow/nodes/event_trigger.py b/src/langbot/pkg/workflow/nodes/event_trigger.py index 56202cc9..2a20e50c 100644 --- a/src/langbot/pkg/workflow/nodes/event_trigger.py +++ b/src/langbot/pkg/workflow/nodes/event_trigger.py @@ -17,7 +17,7 @@ class EventTriggerNode(WorkflowNode): type_name = 'event_trigger' category = 'trigger' - icon = '📡' + icon = 'Bell' name = 'event_trigger' description = 'event_trigger' name_zh = '事件触发' diff --git a/src/langbot/pkg/workflow/nodes/http_request.py b/src/langbot/pkg/workflow/nodes/http_request.py index e1b2ba29..42c99a51 100644 --- a/src/langbot/pkg/workflow/nodes/http_request.py +++ b/src/langbot/pkg/workflow/nodes/http_request.py @@ -17,7 +17,7 @@ class HTTPRequestNode(WorkflowNode): type_name = 'http_request' category = 'process' - icon = '🌐' + icon = 'Globe' name = 'http_request' description = 'http_request' name_zh = 'HTTP 请求' diff --git a/src/langbot/pkg/workflow/nodes/iterator.py b/src/langbot/pkg/workflow/nodes/iterator.py index bb8e19ab..6007ab3e 100644 --- a/src/langbot/pkg/workflow/nodes/iterator.py +++ b/src/langbot/pkg/workflow/nodes/iterator.py @@ -14,7 +14,7 @@ class IteratorNode(WorkflowNode): type_name = 'iterator' category = 'control' - icon = '🔄' + icon = 'Repeat' name = 'iterator' name_zh = '迭代器' name_en = 'Iterator' diff --git a/src/langbot/pkg/workflow/nodes/knowledge_retrieval.py b/src/langbot/pkg/workflow/nodes/knowledge_retrieval.py index 732a9da3..9d6f9aee 100644 --- a/src/langbot/pkg/workflow/nodes/knowledge_retrieval.py +++ b/src/langbot/pkg/workflow/nodes/knowledge_retrieval.py @@ -17,7 +17,7 @@ class KnowledgeRetrievalNode(WorkflowNode): type_name = 'knowledge_retrieval' category = 'process' - icon = '📚' + icon = 'Search' name = 'knowledge_retrieval' description = 'knowledge_retrieval' name_zh = '知识库检索' diff --git a/src/langbot/pkg/workflow/nodes/llm_call.py b/src/langbot/pkg/workflow/nodes/llm_call.py index a6f02308..22b80cba 100644 --- a/src/langbot/pkg/workflow/nodes/llm_call.py +++ b/src/langbot/pkg/workflow/nodes/llm_call.py @@ -20,7 +20,7 @@ class LLMCallNode(WorkflowNode): type_name = 'llm_call' category = 'process' - icon = '🤖' + icon = 'Brain' name = 'llm_call' name_zh = 'LLM 调用' name_en = 'LLM Call' diff --git a/src/langbot/pkg/workflow/nodes/loop.py b/src/langbot/pkg/workflow/nodes/loop.py index 9dbb60f0..92e82346 100644 --- a/src/langbot/pkg/workflow/nodes/loop.py +++ b/src/langbot/pkg/workflow/nodes/loop.py @@ -14,7 +14,7 @@ class LoopNode(WorkflowNode): type_name = 'loop' category = 'control' - icon = '🔁' + icon = 'Repeat' name = 'loop' name_zh = '循环' name_en = 'Loop' diff --git a/src/langbot/pkg/workflow/nodes/merge.py b/src/langbot/pkg/workflow/nodes/merge.py index d73b39a3..4e5290c1 100644 --- a/src/langbot/pkg/workflow/nodes/merge.py +++ b/src/langbot/pkg/workflow/nodes/merge.py @@ -17,7 +17,7 @@ class MergeNode(WorkflowNode): type_name = 'merge' category = 'control' - icon = '🔗' + icon = 'GitMerge' name = 'merge' description = 'merge' name_zh = '合并' diff --git a/src/langbot/pkg/workflow/nodes/message_trigger.py b/src/langbot/pkg/workflow/nodes/message_trigger.py index f55a2a48..74db03e4 100644 --- a/src/langbot/pkg/workflow/nodes/message_trigger.py +++ b/src/langbot/pkg/workflow/nodes/message_trigger.py @@ -19,7 +19,7 @@ class MessageTriggerNode(WorkflowNode): type_name = 'message_trigger' category = 'trigger' - icon = '💬' + icon = 'MessageSquare' name = 'message_trigger' description = 'message_trigger' name_zh = '消息触发' diff --git a/src/langbot/pkg/workflow/nodes/opening_statement.py b/src/langbot/pkg/workflow/nodes/opening_statement.py index d239f692..428682e3 100644 --- a/src/langbot/pkg/workflow/nodes/opening_statement.py +++ b/src/langbot/pkg/workflow/nodes/opening_statement.py @@ -17,7 +17,7 @@ class OpeningStatementNode(WorkflowNode): type_name = 'opening_statement' category = 'action' - icon = '👋' + icon = 'MessageSquare' name = 'opening_statement' description = 'opening_statement' name_zh = '对话开场白' diff --git a/src/langbot/pkg/workflow/nodes/parallel.py b/src/langbot/pkg/workflow/nodes/parallel.py index 6e8f8c2e..73c8028a 100644 --- a/src/langbot/pkg/workflow/nodes/parallel.py +++ b/src/langbot/pkg/workflow/nodes/parallel.py @@ -14,7 +14,7 @@ class ParallelNode(WorkflowNode): type_name = 'parallel' category = 'control' - icon = '⚡' + icon = 'Layers' name = 'parallel' name_zh = '并行执行' name_en = 'Parallel' diff --git a/src/langbot/pkg/workflow/nodes/parameter_extractor.py b/src/langbot/pkg/workflow/nodes/parameter_extractor.py index 8a39247b..2f262238 100644 --- a/src/langbot/pkg/workflow/nodes/parameter_extractor.py +++ b/src/langbot/pkg/workflow/nodes/parameter_extractor.py @@ -17,7 +17,7 @@ class ParameterExtractorNode(WorkflowNode): type_name = 'parameter_extractor' category = 'process' - icon: str = '📤' + icon: str = 'Variable' name = 'parameter_extractor' description = 'parameter_extractor' name_zh = '参数提取器' diff --git a/src/langbot/pkg/workflow/nodes/question_classifier.py b/src/langbot/pkg/workflow/nodes/question_classifier.py index 5d79e076..d7cf70e1 100644 --- a/src/langbot/pkg/workflow/nodes/question_classifier.py +++ b/src/langbot/pkg/workflow/nodes/question_classifier.py @@ -17,7 +17,7 @@ class QuestionClassifierNode(WorkflowNode): type_name = 'question_classifier' category = 'process' - icon = '🏷️' + icon = 'ListFilter' name = 'question_classifier' description = 'question_classifier' name_zh = '问题分类器' diff --git a/src/langbot/pkg/workflow/nodes/reply_message.py b/src/langbot/pkg/workflow/nodes/reply_message.py index 51b73d9d..03895132 100644 --- a/src/langbot/pkg/workflow/nodes/reply_message.py +++ b/src/langbot/pkg/workflow/nodes/reply_message.py @@ -20,7 +20,7 @@ class ReplyMessageNode(WorkflowNode): type_name = 'reply_message' category = 'action' - icon = '↩️' + icon = 'Send' name = 'reply_message' description = 'reply_message' name_zh = '回复消息' diff --git a/src/langbot/pkg/workflow/nodes/send_message.py b/src/langbot/pkg/workflow/nodes/send_message.py index 9440b4d7..286b983a 100644 --- a/src/langbot/pkg/workflow/nodes/send_message.py +++ b/src/langbot/pkg/workflow/nodes/send_message.py @@ -17,7 +17,7 @@ class SendMessageNode(WorkflowNode): type_name = 'send_message' category = 'action' - icon = '📤' + icon = 'MessageCircle' name = 'send_message' description = 'send_message' name_zh = '发送消息' diff --git a/src/langbot/pkg/workflow/nodes/set_variable.py b/src/langbot/pkg/workflow/nodes/set_variable.py index 193cad6b..14246d6c 100644 --- a/src/langbot/pkg/workflow/nodes/set_variable.py +++ b/src/langbot/pkg/workflow/nodes/set_variable.py @@ -17,7 +17,7 @@ class SetVariableNode(WorkflowNode): type_name = 'set_variable' category = 'action' - icon = '📝' + icon = 'Variable' name = 'set_variable' description = 'set_variable' name_zh = '设置变量' diff --git a/src/langbot/pkg/workflow/nodes/store_data.py b/src/langbot/pkg/workflow/nodes/store_data.py index 12036eff..62ffeeec 100644 --- a/src/langbot/pkg/workflow/nodes/store_data.py +++ b/src/langbot/pkg/workflow/nodes/store_data.py @@ -17,7 +17,7 @@ class StoreDataNode(WorkflowNode): type_name = 'store_data' category = 'action' - icon = '💾' + icon = 'Database' name = 'store_data' description = 'store_data' name_zh = '存储数据' diff --git a/src/langbot/pkg/workflow/nodes/switch.py b/src/langbot/pkg/workflow/nodes/switch.py index bc1b1db2..0c8474ea 100644 --- a/src/langbot/pkg/workflow/nodes/switch.py +++ b/src/langbot/pkg/workflow/nodes/switch.py @@ -17,7 +17,7 @@ class SwitchNode(WorkflowNode): type_name = 'switch' category = 'control' - icon = '🔃' + icon = 'Split' name = 'switch' description = 'switch' name_zh = '多路分支' diff --git a/src/langbot/pkg/workflow/nodes/variable_aggregator.py b/src/langbot/pkg/workflow/nodes/variable_aggregator.py index 6778da27..547946f8 100644 --- a/src/langbot/pkg/workflow/nodes/variable_aggregator.py +++ b/src/langbot/pkg/workflow/nodes/variable_aggregator.py @@ -17,7 +17,7 @@ class VariableAggregatorNode(WorkflowNode): type_name = 'variable_aggregator' category = 'control' - icon = '📊' + icon = 'GitMerge' name = 'variable_aggregator' description = 'variable_aggregator' name_zh = '变量聚合器' diff --git a/src/langbot/pkg/workflow/nodes/wait.py b/src/langbot/pkg/workflow/nodes/wait.py index 49b76fb6..6a5e8d20 100644 --- a/src/langbot/pkg/workflow/nodes/wait.py +++ b/src/langbot/pkg/workflow/nodes/wait.py @@ -17,7 +17,7 @@ class WaitNode(WorkflowNode): type_name = 'wait' category = 'control' - icon = '⏳' + icon = 'Clock' name = 'wait' description = 'wait' name_zh = '等待' diff --git a/src/langbot/pkg/workflow/nodes/webhook_trigger.py b/src/langbot/pkg/workflow/nodes/webhook_trigger.py index b638591c..95ef183c 100644 --- a/src/langbot/pkg/workflow/nodes/webhook_trigger.py +++ b/src/langbot/pkg/workflow/nodes/webhook_trigger.py @@ -17,7 +17,7 @@ class WebhookTriggerNode(WorkflowNode): type_name = 'webhook_trigger' category = 'trigger' - icon = '🌐' + icon = 'Webhook' name = 'webhook_trigger' description = 'webhook_trigger' name_zh = 'Webhook 触发' diff --git a/web/ai_translate_workflows.py b/web/ai_translate_workflows.py new file mode 100644 index 00000000..688e00ee --- /dev/null +++ b/web/ai_translate_workflows.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +AI翻译工作流i18n - 使用完整短语翻译而非词汇替换 +""" + +import json +import re +from typing import Dict, List + +def has_chinese(text: str) -> bool: + """检查文本是否包含中文字符""" + return bool(re.search(r'[\u4e00-\u9fff]', text)) + +def load_translations() -> Dict: + """加载翻译文件""" + with open('workflows_translations.json', 'r', encoding='utf-8') as f: + return json.load(f) + +def save_translations(data: Dict): + """保存翻译文件""" + with open('workflows_translations.json', 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + +# 完整短语翻译字典 - 第一批(基础UI和操作) +TRANSLATIONS_BATCH_1 = { + # 基础操作 + "工作流": {"es-ES": "Flujo de trabajo", "ru-RU": "Рабочий процесс", "th-TH": "เวิร์กโฟลว์", "vi-VN": "Quy trình làm việc"}, + "节点": {"es-ES": "Nodo", "ru-RU": "Узел", "th-TH": "โหนด", "vi-VN": "Nút"}, + "创建工作流": {"es-ES": "Crear flujo de trabajo", "ru-RU": "Создать рабочий процесс", "th-TH": "สร้างเวิร์กโฟลว์", "vi-VN": "Tạo quy trình làm việc"}, + "从侧边栏选择": {"es-ES": "Seleccionar desde la barra lateral", "ru-RU": "Выбрать из боковой панели", "th-TH": "เลือกจากแถบด้านข้าง", "vi-VN": "Chọn từ thanh bên"}, + "编辑工作流": {"es-ES": "Editar flujo de trabajo", "ru-RU": "Редактировать рабочий процесс", "th-TH": "แก้ไขเวิร์กโฟลว์", "vi-VN": "Chỉnh sửa quy trình làm việc"}, + "新建工作流": {"es-ES": "Nuevo flujo de trabajo", "ru-RU": "Новый рабочий процесс", "th-TH": "เวิร์กโฟลว์ใหม่", "vi-VN": "Quy trình làm việc mới"}, + "获取工作流列表失败": {"es-ES": "Error al obtener la lista de flujos de trabajo", "ru-RU": "Не удалось получить список рабочих процессов", "th-TH": "ไม่สามารถรับรายการเวิร์กโฟลว์", "vi-VN": "Không thể lấy danh sách quy trình làm việc"}, + "工作流名称": {"es-ES": "Nombre del flujo de trabajo", "ru-RU": "Название рабочего процесса", "th-TH": "ชื่อเวิร์กโฟลว์", "vi-VN": "Tên quy trình làm việc"}, + "工作流描述": {"es-ES": "Descripción del flujo de trabajo", "ru-RU": "Описание рабочего процесса", "th-TH": "คำอธิบายเวิร์กโฟลว์", "vi-VN": "Mô tả quy trình làm việc"}, + "工作流名称不能为空": {"es-ES": "El nombre del flujo de trabajo no puede estar vacío", "ru-RU": "Название рабочего процесса не может быть пустым", "th-TH": "ชื่อเวิร์กโฟลว์ไม่สามารถว่างเปล่า", "vi-VN": "Tên quy trình làm việc không được để trống"}, + "默认工作流描述": {"es-ES": "Descripción predeterminada del flujo de trabajo", "ru-RU": "Описание рабочего процесса по умолчанию", "th-TH": "คำอธิบายเวิร์กโฟลว์เริ่มต้น", "vi-VN": "Mô tả quy trình làm việc mặc định"}, + + # 成功/失败消息 + "保存成功": {"es-ES": "Guardado exitosamente", "ru-RU": "Успешно сохранено", "th-TH": "บันทึกสำเร็จ", "vi-VN": "Lưu thành công"}, + "保存失败": {"es-ES": "Error al guardar", "ru-RU": "Не удалось сохранить", "th-TH": "บันทึกล้มเหลว", "vi-VN": "Lưu thất bại"}, + "创建成功": {"es-ES": "Creado exitosamente", "ru-RU": "Успешно создано", "th-TH": "สร้างสำเร็จ", "vi-VN": "Tạo thành công"}, + "创建失败": {"es-ES": "Error al crear", "ru-RU": "Не удалось создать", "th-TH": "สร้างล้มเหลว", "vi-VN": "Tạo thất bại"}, + "删除成功": {"es-ES": "Eliminado exitosamente", "ru-RU": "Успешно удалено", "th-TH": "ลบสำเร็จ", "vi-VN": "Xóa thành công"}, + "删除失败": {"es-ES": "Error al eliminar", "ru-RU": "Не удалось удалить", "th-TH": "ลบล้มเหลว", "vi-VN": "Xóa thất bại"}, + "复制成功": {"es-ES": "Copiado exitosamente", "ru-RU": "Успешно скопировано", "th-TH": "คัดลอกสำเร็จ", "vi-VN": "Sao chép thành công"}, + "复制失败": {"es-ES": "Error al copiar", "ru-RU": "Не удалось скопировать", "th-TH": "คัดลอกล้มเหลว", "vi-VN": "Sao chép thất bại"}, + "导出成功": {"es-ES": "Exportado exitosamente", "ru-RU": "Успешно экспортировано", "th-TH": "ส่งออกสำเร็จ", "vi-VN": "Xuất thành công"}, + "导入成功": {"es-ES": "Importado exitosamente", "ru-RU": "Успешно импортировано", "th-TH": "นำเข้าสำเร็จ", "vi-VN": "Nhập thành công"}, + "导入失败": {"es-ES": "Error al importar", "ru-RU": "Не удалось импортировать", "th-TH": "นำเข้าล้มเหลว", "vi-VN": "Nhập thất bại"}, + "发布成功": {"es-ES": "Publicado exitosamente", "ru-RU": "Успешно опубликовано", "th-TH": "เผยแพร่สำเร็จ", "vi-VN": "Xuất bản thành công"}, + "发布失败": {"es-ES": "Error al publicar", "ru-RU": "Не удалось опубликовать", "th-TH": "เผยแพร่ล้มเหลว", "vi-VN": "Xuất bản thất bại"}, + "获取工作流失败": {"es-ES": "Error al obtener el flujo de trabajo", "ru-RU": "Не удалось получить рабочий процесс", "th-TH": "ไม่สามารถรับเวิร์กโฟลว์", "vi-VN": "Không thể lấy quy trình làm việc"}, + "加载失败": {"es-ES": "Error al cargar", "ru-RU": "Не удалось загрузить", "th-TH": "โหลดล้มเหลว", "vi-VN": "Tải thất bại"}, + + # 确认对话框 + "确认删除": {"es-ES": "Confirmar eliminación", "ru-RU": "Подтвердить удаление", "th-TH": "ยืนยันการลบ", "vi-VN": "Xác nhận xóa"}, + "确认删除此工作流吗?": {"es-ES": "¿Confirmar la eliminación de este flujo de trabajo?", "ru-RU": "Подтвердить удаление этого рабочего процесса?", "th-TH": "ยืนยันการลบเวิร์กโฟลว์นี้หรือไม่?", "vi-VN": "Xác nhận xóa quy trình làm việc này?"}, + + # 基本操作 + "导出": {"es-ES": "Exportar", "ru-RU": "Экспорт", "th-TH": "ส่งออก", "vi-VN": "Xuất"}, + "导入": {"es-ES": "Importar", "ru-RU": "Импорт", "th-TH": "นำเข้า", "vi-VN": "Nhập"}, + "发布": {"es-ES": "Publicar", "ru-RU": "Опубликовать", "th-TH": "เผยแพร่", "vi-VN": "Xuất bản"}, + "配置": {"es-ES": "Configuración", "ru-RU": "Конфигурация", "th-TH": "การกำหนดค่า", "vi-VN": "Cấu hình"}, + "执行记录": {"es-ES": "Registros de ejecución", "ru-RU": "Записи выполнения", "th-TH": "บันทึกการดำเนินการ", "vi-VN": "Bản ghi thực thi"}, + "编辑器": {"es-ES": "Editor", "ru-RU": "Редактор", "th-TH": "ตัวแก้ไข", "vi-VN": "Trình chỉnh sửa"}, + "调试聊天": {"es-ES": "Chat de depuración", "ru-RU": "Отладочный чат", "th-TH": "แชทดีบัก", "vi-VN": "Chat gỡ lỗi"}, + + # 配置部分 + "基本信息": {"es-ES": "Información básica", "ru-RU": "Основная информация", "th-TH": "ข้อมูลพื้นฐาน", "vi-VN": "Thông tin cơ bản"}, + "基本信息描述": {"es-ES": "Descripción de información básica", "ru-RU": "Описание основной информации", "th-TH": "คำอธิบายข้อมูลพื้นฐาน", "vi-VN": "Mô tả thông tin cơ bản"}, + "危险区域": {"es-ES": "Zona peligrosa", "ru-RU": "Опасная зона", "th-TH": "พื้นที่อันตราย", "vi-VN": "Khu vực nguy hiểm"}, + "危险区域描述": {"es-ES": "Descripción de zona peligrosa", "ru-RU": "Описание опасной зоны", "th-TH": "คำอธิบายพื้นที่อันตราย", "vi-VN": "Mô tả khu vực nguy hiểm"}, + "删除工作流操作": {"es-ES": "Eliminar operación de flujo de trabajo", "ru-RU": "Удалить операцию рабочего процесса", "th-TH": "ลบการดำเนินการเวิร์กโฟลว์", "vi-VN": "Xóa thao tác quy trình làm việc"}, + "删除工作流提示": {"es-ES": "Sugerencia de eliminación de flujo de trabajo", "ru-RU": "Подсказка удаления рабочего процесса", "th-TH": "คำแนะนำการลบเวิร์กโฟลว์", "vi-VN": "Gợi ý xóa quy trình làm việc"}, + "删除工作流": {"es-ES": "Eliminar flujo de trabajo", "ru-RU": "Удалить рабочий процесс", "th-TH": "ลบเวิร์กโฟลว์", "vi-VN": "Xóa quy trình làm việc"}, + "删除确认描述": {"es-ES": "Descripción de confirmación de eliminación", "ru-RU": "Описание подтверждения удаления", "th-TH": "คำอธิบายการยืนยันการลบ", "vi-VN": "Mô tả xác nhận xóa"}, + + # 表单字段 + "名称": {"es-ES": "Nombre", "ru-RU": "Название", "th-TH": "ชื่อ", "vi-VN": "Tên"}, + "名称占位符": {"es-ES": "Marcador de posición de nombre", "ru-RU": "Заполнитель имени", "th-TH": "ตัวยึดตำแหน่งชื่อ", "vi-VN": "Trình giữ chỗ tên"}, + "描述占位符": {"es-ES": "Marcador de posición de descripción", "ru-RU": "Заполнитель описания", "th-TH": "ตัวยึดตำแหน่งคำอธิบาย", "vi-VN": "Trình giữ chỗ mô tả"}, + "已启用": {"es-ES": "Habilitado", "ru-RU": "Включено", "th-TH": "เปิดใช้งาน", "vi-VN": "Đã bật"}, + "已启用描述": {"es-ES": "Descripción habilitada", "ru-RU": "Описание включено", "th-TH": "คำอธิบายเปิดใช้งาน", "vi-VN": "Mô tả đã bật"}, + "加载中": {"es-ES": "Cargando", "ru-RU": "Загрузка", "th-TH": "กำลังโหลด", "vi-VN": "Đang tải"}, + "信息": {"es-ES": "Información", "ru-RU": "Информация", "th-TH": "ข้อมูล", "vi-VN": "Thông tin"}, + + # 统计信息 + "版本": {"es-ES": "Versión", "ru-RU": "Версия", "th-TH": "เวอร์ชัน", "vi-VN": "Phiên bản"}, + "创建时间": {"es-ES": "Tiempo de creación", "ru-RU": "Время создания", "th-TH": "เวลาสร้าง", "vi-VN": "Thời gian tạo"}, + "更新时间": {"es-ES": "Tiempo de actualización", "ru-RU": "Время обновления", "th-TH": "เวลาอัปเดต", "vi-VN": "Thời gian cập nhật"}, + "总执行次数": {"es-ES": "Total de ejecuciones", "ru-RU": "Всего выполнений", "th-TH": "จำนวนการดำเนินการทั้งหมด", "vi-VN": "Tổng số lần thực thi"}, + "统计": {"es-ES": "Estadísticas", "ru-RU": "Статистика", "th-TH": "สถิติ", "vi-VN": "Thống kê"}, + "成功次数": {"es-ES": "Número de éxitos", "ru-RU": "Количество успехов", "th-TH": "จำนวนความสำเร็จ", "vi-VN": "Số lần thành công"}, + "成功率": {"es-ES": "Tasa de éxito", "ru-RU": "Процент успеха", "th-TH": "อัตราความสำเร็จ", "vi-VN": "Tỷ lệ thành công"}, + "平均耗时": {"es-ES": "Duración promedio", "ru-RU": "Средняя продолжительность", "th-TH": "ระยะเวลาเฉลี่ย", "vi-VN": "Thời gian trung bình"}, + "每次执行": {"es-ES": "Por ejecución", "ru-RU": "За выполнение", "th-TH": "ต่อการดำเนินการ", "vi-VN": "Mỗi lần thực thi"}, + "失败的执行": {"es-ES": "Ejecuciones fallidas", "ru-RU": "Неудачные выполнения", "th-TH": "การดำเนินการที่ล้มเหลว", "vi-VN": "Các lần thực thi thất bại"}, + "最后执行": {"es-ES": "Última ejecución", "ru-RU": "Последнее выполнение", "th-TH": "การดำเนินการล่าสุด", "vi-VN": "Lần thực thi cuối"}, +} + +def translate_batch(data: Dict, translations: Dict[str, Dict[str, str]]): + """应用一批翻译""" + count = 0 + for key, trans_obj in data['translations'].items(): + zh_text = trans_obj.get('zh-Hans', '') + if not zh_text: + continue + + # 检查是否有完整短语翻译 + if zh_text in translations: + for lang in ['es-ES', 'ru-RU', 'th-TH', 'vi-VN']: + if trans_obj.get(lang) == 'TODO': + trans_obj[lang] = translations[zh_text][lang] + count += 1 + + return count + +def main(): + print("🚀 开始AI翻译工作流i18n...") + + # 加载数据 + data = load_translations() + + # 应用第一批翻译 + print("\n📝 应用第一批翻译(基础UI和操作)...") + count = translate_batch(data, TRANSLATIONS_BATCH_1) + print(f" ✅ 已翻译 {count} 个条目") + + # 保存 + save_translations(data) + print("\n✅ 翻译完成并已保存") + + # 检查是否还有中文字符 + print("\n🔍 检查翻译质量...") + problem_count = 0 + for key, trans_obj in data['translations'].items(): + for lang in ['es-ES', 'ru-RU', 'th-TH', 'vi-VN']: + text = trans_obj.get(lang, '') + if text != 'TODO' and has_chinese(text): + problem_count += 1 + print(f" ⚠️ {key} ({lang}): {text}") + + if problem_count == 0: + print(" ✅ 所有翻译都不包含中文字符") + else: + print(f" ⚠️ 发现 {problem_count} 个翻译仍包含中文字符") + +if __name__ == '__main__': + main() diff --git a/web/analyze_missing_translations.py b/web/analyze_missing_translations.py new file mode 100644 index 00000000..ae38cff2 --- /dev/null +++ b/web/analyze_missing_translations.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +""" +分析所有语言文件中缺失的翻译键 +对比 zh-Hans.ts(完整翻译)和其他语言文件,找出所有英文键 +""" + +import re +from pathlib import Path +from typing import Dict, List, Set + +def extract_keys_from_ts(file_path: Path) -> Dict[str, str]: + """从 TypeScript 文件中提取所有键值对""" + content = file_path.read_text(encoding='utf-8') + + # 匹配键值对:key: 'value' 或 key: "value" + pattern = r"(\w+):\s*['\"]([^'\"]+)['\"]" + matches = re.findall(pattern, content) + + return dict(matches) + +def is_english(text: str) -> bool: + """判断文本是否主要是英文""" + # 如果文本中英文字符占比超过50%,认为是英文 + english_chars = sum(1 for c in text if c.isascii() and c.isalpha()) + total_chars = sum(1 for c in text if c.isalpha()) + + if total_chars == 0: + return False + + return english_chars / total_chars > 0.5 + +def analyze_file(file_path: Path, reference_keys: Dict[str, str]) -> Dict[str, List[str]]: + """分析单个文件,找出需要翻译的英文键""" + keys = extract_keys_from_ts(file_path) + + english_keys = [] + missing_keys = [] + + for key, value in keys.items(): + if is_english(value): + english_keys.append(f"{key}: '{value}'") + + # 找出参考文件中有但当前文件缺失的键 + for ref_key in reference_keys: + if ref_key not in keys: + missing_keys.append(ref_key) + + return { + 'english_keys': english_keys, + 'missing_keys': missing_keys, + 'total_keys': len(keys) + } + +def main(): + locales_dir = Path(__file__).parent / 'src' / 'i18n' / 'locales' + + # 读取参考文件(简体中文,完整翻译) + zh_hans_path = locales_dir / 'zh-Hans.ts' + print(f"读取参考文件: {zh_hans_path}") + reference_keys = extract_keys_from_ts(zh_hans_path) + print(f"参考文件包含 {len(reference_keys)} 个键\n") + + # 分析所有非中文语言文件 + target_files = [ + 'ja-JP.ts', + 'zh-Hant.ts', + 'es-ES.ts', + 'ru-RU.ts', + 'th-TH.ts', + 'vi-VN.ts' + ] + + results = {} + + for filename in target_files: + file_path = locales_dir / filename + if not file_path.exists(): + print(f"⚠️ 文件不存在: {filename}") + continue + + print(f"\n{'='*60}") + print(f"分析文件: {filename}") + print(f"{'='*60}") + + result = analyze_file(file_path, reference_keys) + results[filename] = result + + print(f"总键数: {result['total_keys']}") + print(f"英文键数: {len(result['english_keys'])}") + print(f"缺失键数: {len(result['missing_keys'])}") + + if result['english_keys']: + print(f"\n前10个英文键示例:") + for key in result['english_keys'][:10]: + print(f" - {key}") + + if result['missing_keys']: + print(f"\n前10个缺失键示例:") + for key in result['missing_keys'][:10]: + print(f" - {key}") + + # 汇总统计 + print(f"\n\n{'='*60}") + print("汇总统计") + print(f"{'='*60}") + + total_english = sum(len(r['english_keys']) for r in results.values()) + total_missing = sum(len(r['missing_keys']) for r in results.values()) + + print(f"总计需要翻译的英文键: {total_english}") + print(f"总计缺失的键: {total_missing}") + print(f"总计需要处理: {total_english + total_missing}") + + # 保存详细报告 + report_path = Path(__file__).parent.parent / 'plans' / 'translation-analysis-report.txt' + with open(report_path, 'w', encoding='utf-8') as f: + f.write("翻译分析报告\n") + f.write("="*60 + "\n\n") + + for filename, result in results.items(): + f.write(f"\n文件: {filename}\n") + f.write(f"总键数: {result['total_keys']}\n") + f.write(f"英文键数: {len(result['english_keys'])}\n") + f.write(f"缺失键数: {len(result['missing_keys'])}\n") + + if result['english_keys']: + f.write(f"\n英文键列表:\n") + for key in result['english_keys']: + f.write(f" {key}\n") + + if result['missing_keys']: + f.write(f"\n缺失键列表:\n") + for key in result['missing_keys']: + f.write(f" {key}\n") + + f.write("\n" + "="*60 + "\n") + + print(f"\n详细报告已保存到: {report_path}") + +if __name__ == '__main__': + main() diff --git a/web/apply_workflows_translations.py b/web/apply_workflows_translations.py new file mode 100644 index 00000000..1b8347cb --- /dev/null +++ b/web/apply_workflows_translations.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python3 +""" +应用workflows翻译到语言文件 + +使用方法: +1. 编辑 workflows_translations.json 文件 +2. 将 'TODO' 替换为实际翻译 +3. 运行此脚本:python3 apply_workflows_translations.py + +脚本会: +- 读取 workflows_translations.json +- 识别已完成的翻译(非"TODO") +- 应用到对应的语言文件 +- 生成进度报告 +- 支持增量应用(可以分批翻译) +""" + +import json +import re +from pathlib import Path +from typing import Dict, List, Tuple, Set + + +def load_translations() -> Dict: + """加载翻译JSON文件""" + json_path = Path(__file__).parent / 'workflows_translations.json' + + if not json_path.exists(): + raise FileNotFoundError(f"找不到翻译文件: {json_path}") + + with open(json_path, 'r', encoding='utf-8') as f: + return json.load(f) + + +def get_completed_translations(translations_data: Dict) -> Dict[str, Dict[str, str]]: + """ + 获取已完成的翻译 + + 返回格式: + { + 'ja-JP': {'title': '工作流对话', 'description': '...', ...}, + 'zh-Hant': {...}, + ... + } + """ + translations = translations_data.get('translations', {}) + languages = ['ja-JP', 'zh-Hant', 'es-ES', 'ru-RU', 'th-TH', 'vi-VN'] + + completed = {lang: {} for lang in languages} + + for key, values in translations.items(): + for lang in languages: + translation = values.get(lang, 'TODO') + if translation != 'TODO' and translation.strip(): + completed[lang][key] = translation + + return completed + + +def apply_translations_to_file(file_path: Path, translations: Dict[str, str], lang_code: str) -> Tuple[int, List[str]]: + """ + 应用翻译到指定语言文件 + + 返回:(成功应用的数量, 失败的键列表) + """ + if not file_path.exists(): + print(f"⚠️ 文件不存在: {file_path}") + return 0, list(translations.keys()) + + # 读取文件内容 + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 找到workflows部分的起始和结束位置 + workflows_start = content.find('workflows: {') + if workflows_start == -1: + print(f"⚠️ 找不到workflows部分: {file_path}") + return 0, list(translations.keys()) + + # 找到workflows部分的结束位置(匹配的闭合大括号) + brace_count = 0 + workflows_end = workflows_start + for i in range(workflows_start, len(content)): + if content[i] == '{': + brace_count += 1 + elif content[i] == '}': + brace_count -= 1 + if brace_count == 0: + workflows_end = i + 1 + break + + if workflows_end == workflows_start: + print(f"⚠️ 无法确定workflows部分的结束位置: {file_path}") + return 0, list(translations.keys()) + + # 提取workflows部分 + before_workflows = content[:workflows_start] + workflows_section = content[workflows_start:workflows_end] + after_workflows = content[workflows_end:] + + # 应用翻译 + success_count = 0 + failed_keys = [] + + for key, translation in translations.items(): + # 转义特殊字符 + escaped_key = re.escape(key) + + # 匹配模式:key: 'value', 或 key: "value", + # 支持多行和注释 + patterns = [ + # 单引号,可能有尾随逗号和注释 + rf"(\s+{escaped_key}:\s*)'[^']*'(,?\s*(?://.*)?(?:\n|$))", + # 双引号,可能有尾随逗号和注释 + rf'(\s+{escaped_key}:\s*)"[^"]*"(,?\s*(?://.*)?(?:\n|$))', + ] + + replaced = False + for pattern in patterns: + if re.search(pattern, workflows_section): + # 转义翻译文本中的单引号 + escaped_translation = translation.replace("'", "\\'") + replacement = rf"\1'{escaped_translation}'\2" + workflows_section = re.sub(pattern, replacement, workflows_section) + replaced = True + success_count += 1 + break + + if not replaced: + failed_keys.append(key) + + # 重新组合文件内容 + new_content = before_workflows + workflows_section + after_workflows + + # 写回文件 + with open(file_path, 'w', encoding='utf-8') as f: + f.write(new_content) + + return success_count, failed_keys + + +def update_progress_in_json(json_path: Path, completed_by_lang: Dict[str, int]): + """更新JSON文件中的进度信息""" + with open(json_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + # 计算总的已翻译键数(取所有语言的平均值) + total_translated = sum(completed_by_lang.values()) // len(completed_by_lang) if completed_by_lang else 0 + total_keys = data.get('_progress', {}).get('total_keys', 0) + + data['_progress']['translated_keys'] = total_translated + data['_progress']['remaining_keys'] = total_keys - total_translated + data['_progress']['by_language'] = completed_by_lang + + with open(json_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def generate_report(results: Dict[str, Tuple[int, List[str]]], total_keys: int): + """生成应用报告""" + print("\n" + "="*80) + print("📊 Workflows翻译应用报告") + print("="*80) + + total_applied = 0 + + for lang, (success_count, failed_keys) in results.items(): + total_applied += success_count + success_rate = (success_count / total_keys * 100) if total_keys > 0 else 0 + + print(f"\n【{lang}】") + print(f" ✅ 成功应用: {success_count}/{total_keys} ({success_rate:.1f}%)") + + if failed_keys: + print(f" ❌ 失败: {len(failed_keys)} 个键") + if len(failed_keys) <= 10: + print(f" 失败的键: {', '.join(failed_keys)}") + else: + print(f" 失败的键(前10个): {', '.join(failed_keys[:10])}...") + + print("\n" + "-"*80) + avg_applied = total_applied // len(results) if results else 0 + avg_rate = (avg_applied / total_keys * 100) if total_keys > 0 else 0 + print(f"📈 总体进度: {avg_applied}/{total_keys} ({avg_rate:.1f}%)") + print(f"📝 剩余待翻译: {total_keys - avg_applied} 个键") + print("="*80) + + +def main(): + print("🚀 开始应用workflows翻译...") + + # 加载翻译数据 + print("\n📖 读取翻译文件...") + translations_data = load_translations() + total_keys = translations_data.get('_progress', {}).get('total_keys', 0) + print(f" 总键数: {total_keys}") + + # 获取已完成的翻译 + print("\n🔍 识别已完成的翻译...") + completed = get_completed_translations(translations_data) + + for lang, trans in completed.items(): + print(f" {lang}: {len(trans)} 个键已翻译") + + # 如果没有任何翻译,提示用户 + if all(len(trans) == 0 for trans in completed.values()): + print("\n⚠️ 没有发现任何已完成的翻译(所有值都是'TODO')") + print("💡 请先编辑 workflows_translations.json 文件,将 'TODO' 替换为实际翻译") + return + + # 应用翻译到各个语言文件 + print("\n✏️ 应用翻译到语言文件...") + + locales_dir = Path(__file__).parent / 'src' / 'i18n' / 'locales' + + language_files = { + 'ja-JP': locales_dir / 'ja-JP.ts', + 'zh-Hant': locales_dir / 'zh-Hant.ts', + 'es-ES': locales_dir / 'es-ES.ts', + 'ru-RU': locales_dir / 'ru-RU.ts', + 'th-TH': locales_dir / 'th-TH.ts', + 'vi-VN': locales_dir / 'vi-VN.ts', + } + + results = {} + completed_by_lang = {} + + for lang, file_path in language_files.items(): + translations = completed[lang] + if not translations: + print(f" ⏭️ 跳过 {lang}(没有已完成的翻译)") + results[lang] = (0, []) + completed_by_lang[lang] = 0 + continue + + print(f" 📝 处理 {lang}...") + success_count, failed_keys = apply_translations_to_file(file_path, translations, lang) + results[lang] = (success_count, failed_keys) + completed_by_lang[lang] = success_count + + if success_count > 0: + print(f" ✅ 成功应用 {success_count} 个翻译") + if failed_keys: + print(f" ⚠️ {len(failed_keys)} 个键应用失败") + + # 更新JSON文件中的进度 + print("\n📊 更新进度信息...") + json_path = Path(__file__).parent / 'workflows_translations.json' + update_progress_in_json(json_path, completed_by_lang) + + # 生成报告 + generate_report(results, total_keys) + + print("\n✅ 翻译应用完成!") + print("\n💡 提示:") + print(" 1. 继续编辑 workflows_translations.json 翻译更多键") + print(" 2. 再次运行此脚本应用新的翻译") + print(" 3. 重复以上步骤直到所有翻译完成") + + +if __name__ == '__main__': + main() diff --git a/web/batch_translate_workflows.py b/web/batch_translate_workflows.py new file mode 100644 index 00000000..0516dc18 --- /dev/null +++ b/web/batch_translate_workflows.py @@ -0,0 +1,351 @@ +#!/usr/bin/env python3 +""" +批量翻译workflows的多语言文件 +支持:西班牙语(es-ES)、俄语(ru-RU)、泰语(th-TH)、越南语(vi-VN) +""" + +import json +import os +from pathlib import Path +from typing import Dict + +# 翻译映射表 - 基于中文原文的专业翻译 +TRANSLATIONS = { + # 基础UI文本 + "title": { + "es-ES": "Conversación de Flujo de Trabajo", + "ru-RU": "Диалог Рабочего Процесса", + "th-TH": "การสนทนาเวิร์กโฟลว์", + "vi-VN": "Hội thoại Quy trình" + }, + "description": { + "es-ES": "Descripción", + "ru-RU": "Описание", + "th-TH": "คำอธิบาย", + "vi-VN": "Mô tả" + }, + "createWorkflow": { + "es-ES": "Crear Flujo de Trabajo", + "ru-RU": "Создать Рабочий Процесс", + "th-TH": "สร้างเวิร์กโฟลว์", + "vi-VN": "Tạo Quy trình" + }, + "selectFromSidebar": { + "es-ES": "Seleccione un flujo de trabajo de la barra lateral", + "ru-RU": "Выберите рабочий процесс из боковой панели", + "th-TH": "เลือกเวิร์กโฟลว์จากแถบด้านข้าง", + "vi-VN": "Chọn một quy trình từ thanh bên" + }, + "editWorkflow": { + "es-ES": "Editar Flujo de Trabajo", + "ru-RU": "Редактировать Рабочий Процесс", + "th-TH": "แก้ไขเวิร์กโฟลว์", + "vi-VN": "Chỉnh sửa Quy trình" + }, + "newWorkflow": { + "es-ES": "Nuevo Flujo de Trabajo", + "ru-RU": "Новый Рабочий Процесс", + "th-TH": "เวิร์กโฟลว์ใหม่", + "vi-VN": "Quy trình Mới" + }, + "getWorkflowListError": { + "es-ES": "Error al obtener la lista de flujos de trabajo:", + "ru-RU": "Ошибка получения списка рабочих процессов:", + "th-TH": "ไม่สามารถรับรายการเวิร์กโฟลว์:", + "vi-VN": "Lỗi khi lấy danh sách quy trình:" + }, + "workflowName": { + "es-ES": "Nombre del Flujo de Trabajo", + "ru-RU": "Название Рабочего Процесса", + "th-TH": "ชื่อเวิร์กโฟลว์", + "vi-VN": "Tên Quy trình" + }, + "workflowDescription": { + "es-ES": "Descripción del Flujo de Trabajo", + "ru-RU": "Описание Рабочего Процесса", + "th-TH": "คำอธิบายเวิร์กโฟลว์", + "vi-VN": "Mô tả Quy trình" + }, +} + + +def load_translations_json(): + """加载翻译JSON文件""" + json_path = Path(__file__).parent / 'workflows_translations.json' + + if not json_path.exists(): + raise FileNotFoundError(f"找不到翻译文件: {json_path}") + + with open(json_path, 'r', encoding='utf-8') as f: + return json.load(f) + + +def save_translations_json(data): + """保存翻译JSON文件""" + json_path = Path(__file__).parent / 'workflows_translations.json' + + with open(json_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def translate_text(text: str, target_lang: str) -> str: + """ + 翻译文本到目标语言 + 使用规则和模式匹配进行翻译 + """ + # 如果有预定义翻译,直接使用 + if text in TRANSLATIONS and target_lang in TRANSLATIONS[text]: + return TRANSLATIONS[text][target_lang] + + # 通用翻译规则 + common_translations = { + "es-ES": { + # 常用词汇 + "工作流": "Flujo de Trabajo", + "节点": "Nodo", + "触发器": "Disparador", + "执行": "Ejecutar", + "调试": "Depurar", + "配置": "Configuración", + "变量": "Variable", + "条件": "Condición", + "循环": "Bucle", + "等待": "Esperar", + "结束": "Fin", + "开始": "Inicio", + "消息": "Mensaje", + "发送": "Enviar", + "接收": "Recibir", + "错误": "Error", + "成功": "Éxito", + "失败": "Fallo", + "保存": "Guardar", + "取消": "Cancelar", + "删除": "Eliminar", + "编辑": "Editar", + "添加": "Agregar", + "创建": "Crear", + "名称": "Nombre", + "描述": "Descripción", + "类型": "Tipo", + "值": "Valor", + "参数": "Parámetro", + "输入": "Entrada", + "输出": "Salida", + "请": "Por favor", + "选择": "Seleccionar", + "确认": "Confirmar", + "提示": "Aviso", + "警告": "Advertencia", + "信息": "Información", + }, + "ru-RU": { + "工作流": "Рабочий Процесс", + "节点": "Узел", + "触发器": "Триггер", + "执行": "Выполнить", + "调试": "Отладка", + "配置": "Конфигурация", + "变量": "Переменная", + "条件": "Условие", + "循环": "Цикл", + "等待": "Ожидание", + "结束": "Конец", + "开始": "Начало", + "消息": "Сообщение", + "发送": "Отправить", + "接收": "Получить", + "错误": "Ошибка", + "成功": "Успех", + "失败": "Неудача", + "保存": "Сохранить", + "取消": "Отмена", + "删除": "Удалить", + "编辑": "Редактировать", + "添加": "Добавить", + "创建": "Создать", + "名称": "Название", + "描述": "Описание", + "类型": "Тип", + "值": "Значение", + "参数": "Параметр", + "输入": "Вход", + "输出": "Выход", + "请": "Пожалуйста", + "选择": "Выбрать", + "确认": "Подтвердить", + "提示": "Подсказка", + "警告": "Предупреждение", + "信息": "Информация", + }, + "th-TH": { + "工作流": "เวิร์กโฟลว์", + "节点": "โหนด", + "触发器": "ทริกเกอร์", + "执行": "ดำเนินการ", + "调试": "ดีบัก", + "配置": "การกำหนดค่า", + "变量": "ตัวแปร", + "条件": "เงื่อนไข", + "循环": "วนซ้ำ", + "等待": "รอ", + "结束": "สิ้นสุด", + "开始": "เริ่มต้น", + "消息": "ข้อความ", + "发送": "ส่ง", + "接收": "รับ", + "错误": "ข้อผิดพลาด", + "成功": "สำเร็จ", + "失败": "ล้มเหลว", + "保存": "บันทึก", + "取消": "ยกเลิก", + "删除": "ลบ", + "编辑": "แก้ไข", + "添加": "เพิ่ม", + "创建": "สร้าง", + "名称": "ชื่อ", + "描述": "คำอธิบาย", + "类型": "ประเภท", + "值": "ค่า", + "参数": "พารามิเตอร์", + "输入": "อินพุต", + "输出": "เอาต์พุต", + "请": "กรุณา", + "选择": "เลือก", + "确认": "ยืนยัน", + "提示": "คำแนะนำ", + "警告": "คำเตือน", + "信息": "ข้อมูล", + }, + "vi-VN": { + "工作流": "Quy trình", + "节点": "Nút", + "触发器": "Trình kích hoạt", + "执行": "Thực thi", + "调试": "Gỡ lỗi", + "配置": "Cấu hình", + "变量": "Biến", + "条件": "Điều kiện", + "循环": "Vòng lặp", + "等待": "Chờ", + "结束": "Kết thúc", + "开始": "Bắt đầu", + "消息": "Tin nhắn", + "发送": "Gửi", + "接收": "Nhận", + "错误": "Lỗi", + "成功": "Thành công", + "失败": "Thất bại", + "保存": "Lưu", + "取消": "Hủy", + "删除": "Xóa", + "编辑": "Chỉnh sửa", + "添加": "Thêm", + "创建": "Tạo", + "名称": "Tên", + "描述": "Mô tả", + "类型": "Loại", + "值": "Giá trị", + "参数": "Tham số", + "输入": "Đầu vào", + "输出": "Đầu ra", + "请": "Vui lòng", + "选择": "Chọn", + "确认": "Xác nhận", + "提示": "Gợi ý", + "警告": "Cảnh báo", + "信息": "Thông tin", + } + } + + # 尝试使用通用翻译规则 + if target_lang in common_translations: + result = text + for zh, translation in common_translations[target_lang].items(): + result = result.replace(zh, translation) + if result != text: + return result + + # 如果没有匹配的翻译规则,返回原文 + return text + + +def batch_translate(): + """批量翻译所有TODO项""" + print("🚀 开始批量翻译workflows...") + print("=" * 80) + + # 加载翻译数据 + data = load_translations_json() + translations = data.get('translations', {}) + + target_languages = ['es-ES', 'ru-RU', 'th-TH', 'vi-VN'] + + stats = {lang: {'total': 0, 'translated': 0} for lang in target_languages} + + # 遍历所有键进行翻译 + for key, values in translations.items(): + zh_hans = values.get('zh-Hans', '') + + if not zh_hans or zh_hans == 'TODO': + continue + + for lang in target_languages: + stats[lang]['total'] += 1 + + current_value = values.get(lang, 'TODO') + + # 如果已经翻译过,跳过 + if current_value != 'TODO' and current_value.strip(): + stats[lang]['translated'] += 1 + continue + + # 执行翻译 + translated = translate_text(zh_hans, lang) + + # 更新翻译 + if translated and translated != zh_hans: + values[lang] = translated + stats[lang]['translated'] += 1 + print(f"✅ [{lang}] {key}: {zh_hans} -> {translated}") + + # 保存更新后的数据 + save_translations_json(data) + + # 显示统计信息 + print("\n" + "=" * 80) + print("📊 翻译统计:") + print("=" * 80) + + for lang in target_languages: + total = stats[lang]['total'] + translated = stats[lang]['translated'] + percentage = (translated / total * 100) if total > 0 else 0 + + lang_names = { + 'es-ES': '西班牙语', + 'ru-RU': '俄语', + 'th-TH': '泰语', + 'vi-VN': '越南语' + } + + print(f"\n【{lang_names[lang]} ({lang})】") + print(f" 总计: {total}") + print(f" 已翻译: {translated}") + print(f" 完成度: {percentage:.1f}%") + + print("\n" + "=" * 80) + print("✅ 批量翻译完成!") + print("\n💡 下一步:") + print(" 1. 运行 python3 check_translation_progress.py 查看进度") + print(" 2. 运行 python3 apply_workflows_translations.py 应用翻译") + print("=" * 80) + + +if __name__ == '__main__': + try: + batch_translate() + except Exception as e: + print(f"\n❌ 错误: {e}") + import traceback + traceback.print_exc() diff --git a/web/batch_translate_zh_hant.py b/web/batch_translate_zh_hant.py new file mode 100644 index 00000000..42a969a4 --- /dev/null +++ b/web/batch_translate_zh_hant.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +""" +批量翻译繁体中文workflows部分 +基于简体中文进行繁体转换和台湾用语调整 +""" + +import re +from pathlib import Path + +# 简繁转换映射(常用词汇) +SIMPLIFIED_TO_TRADITIONAL = { + # 基础词汇 + '工作流': '工作流程', + '创建': '建立', + '编辑': '編輯', + '删除': '刪除', + '保存': '儲存', + '加载': '載入', + '导出': '匯出', + '导入': '匯入', + '发布': '發佈', + '配置': '設定', + '执行': '執行', + '记录': '記錄', + '编辑器': '編輯器', + '调试': '除錯', + '基础': '基礎', + '信息': '資訊', + '设置': '設定', + '图标': '圖示', + '描述': '描述', + '危险': '危險', + '区域': '區域', + '操作': '操作', + '确认': '確認', + '名称': '名稱', + '输入': '輸入', + '启用': '啟用', + '加载中': '載入中', + '版本': '版本', + '创建时间': '建立時間', + '更新时间': '更新時間', + '统计': '統計', + '分析': '分析', + '成功': '成功', + '失败': '失敗', + '平均': '平均', + '耗时': '耗時', + '筛选': '篩選', + '状态': '狀態', + '手动': '手動', + '触发': '觸發', + '开始': '開始', + '时间': '時間', + '详情': '詳情', + '错误': '錯誤', + '节点': '節點', + '结果': '結果', + '等待': '等待', + '执行中': '執行中', + '已完成': '已完成', + '已取消': '已取消', + '面板': '面板', + '属性': '屬性', + '放大': '放大', + '缩小': '縮小', + '适应': '適應', + '视图': '檢視', + '未保存': '未儲存', + '更改': '變更', + '粘贴': '貼上', + '已删除': '已刪除', + '复制': '複製', + '剪贴板': '剪貼簿', + '搜索': '搜尋', + '正在加载': '正在載入', + '类型': '類型', + '未找到': '找不到', + '清除': '清除', + '拖拽': '拖曳', + '画布': '畫布', + '选择': '選擇', + '连线': '連線', + '点击': '點擊', + '查看': '檢視', + '条件': '條件', + '已设置': '已設定', + '表达式': '運算式', + '变量': '變數', + '引用': '參照', + '上下文': '上下文', + '显示': '顯示', + '标签': '標籤', + '输出': '輸出', + '可用': '可用', + '全局': '全域', + '消息': '訊息', + '内容': '內容', + '发送者': '發送者', + '平台': '平台', + '会话': '工作階段', + '时间戳': '時間戳記', + '无': '無', + '选项': '選項', + # 节点类型 + '触发器': '觸發器', + '定时': '定時', + '事件': '事件', + '处理': '處理', + '调用': '呼叫', + '代码': '程式碼', + '模板': '範本', + '请求': '請求', + '转换': '轉換', + '分类器': '分類器', + '提取器': '擷取器', + '检索': '檢索', + '知识库': '知識庫', + '聚合': '彙總', + '分割': '分割', + '赋值': '指派', + '控制流': '控制流程', + '分支': '分支', + '多路': '多路', + '循环': '迴圈', + '迭代器': '迭代器', + '并行': '並行', + '延迟': '延遲', + '合并': '合併', + '聚合器': '彙總器', + '动作': '動作', + '回复': '回覆', + '存储': '儲存', + '数据': '資料', + '数据库': '資料庫', + '集成': '整合', + '第三方': '第三方', + '查询': '查詢', + '缓存': '快取', + '工具': '工具', + '记忆': '記憶', + # 配置字段 + '关键词': '關鍵字', + '过滤': '篩選', + '正则': '正規表示式', + '长度': '長度', + '提及': '提及', + '群': '群組', + '响应': '回應', + '规则': '規則', + '访问': '存取', + '控制': '控制', + '表达式': '運算式', + '时区': '時區', + '路径': '路徑', + '允许': '允許', + '方法': '方法', + '认证': '驗證', + '密钥': '金鑰', + '验证': '驗證', + '超时': '逾時', + '防抖': '防抖', + '模型': '模型', + '提示词': '提示詞', + '系统': '系統', + '温度': '溫度', + '惩罚': '懲罰', + '令牌': '權杖', + '序列': '序列', + '种子': '種子', + '流式': '串流', + '历史': '歷史', + '语言': '語言', + '程序': '程式', + '指令': '指令', + '参数': '參數', + '定义': '定義', + '返回': '傳回', + '阈值': '閾值', + '相似度': '相似度', + '引用': '引用', + '运算符': '運算子', + '迭代': '迭代', + '中断': '中斷', + '并发': '並行', + '等待': '等待', + '所有': '所有', + '快速': '快速', + '单位': '單位', + '策略': '策略', + '映射': '對應', + '模式': '模式', + '目标': '目標', + '长文本': '長文字', + '强制': '強制', + '继承': '繼承', + '过期': '過期', + '前缀': '前置詞', + '作用域': '範圍', + '建议': '建議', + '问题': '問題', + '格式': '格式', + '连接': '連線', + '字符串': '字串', + '哈希': '雜湊', + '字段': '欄位', + '服务器': '伺服器', + '应用': '應用程式', + '数据集': '資料集', + '流程': '流程', + '机器人': '機器人', +} + +def convert_to_traditional(text: str) -> str: + """将简体中文转换为繁体中文""" + result = text + for simp, trad in SIMPLIFIED_TO_TRADITIONAL.items(): + result = result.replace(simp, trad) + return result + +def main(): + print("繁体中文批量转换工具") + print("=" * 60) + print("此脚本将简体中文翻译转换为繁体中文") + print("=" * 60) + + # 读取简体中文文件 + zh_hans_file = Path(__file__).parent / 'src' / 'i18n' / 'locales' / 'zh-Hans.ts' + zh_hant_file = Path(__file__).parent / 'src' / 'i18n' / 'locales' / 'zh-Hant.ts' + + if not zh_hans_file.exists(): + print(f"错误:找不到简体中文文件 {zh_hans_file}") + return + + print(f"读取简体中文文件: {zh_hans_file}") + with open(zh_hans_file, 'r', encoding='utf-8') as f: + zh_hans_content = f.read() + + # 提取workflows部分 + workflows_match = re.search(r'workflows:\s*\{(.+?)\n \},\n unifiedBinding:', zh_hans_content, re.DOTALL) + if not workflows_match: + print("错误:无法找到workflows部分") + return + + workflows_content = workflows_match.group(1) + print(f"找到workflows部分,长度: {len(workflows_content)} 字符") + + # 转换为繁体 + print("正在转换为繁体中文...") + traditional_content = convert_to_traditional(workflows_content) + + # 读取现有的繁体中文文件 + print(f"读取繁体中文文件: {zh_hant_file}") + with open(zh_hant_file, 'r', encoding='utf-8') as f: + zh_hant_content = f.read() + + # 替换workflows部分 + zh_hant_new = re.sub( + r'workflows:\s*\{(.+?)\n \},\n unifiedBinding:', + f'workflows: {{\n{traditional_content}\n }},\n unifiedBinding:', + zh_hant_content, + flags=re.DOTALL + ) + + # 写入文件 + print(f"写入繁体中文文件: {zh_hant_file}") + with open(zh_hant_file, 'w', encoding='utf-8') as f: + f.write(zh_hant_new) + + print("\n" + "=" * 60) + print("✅ 繁体中文转换完成!") + print("=" * 60) + print(f"已更新文件: {zh_hant_file}") + print("\n建议:") + print("1. 检查转换结果是否正确") + print("2. 运行 TypeScript 编译检查语法") + print("3. 手动审核关键术语的翻译") + +if __name__ == '__main__': + main() diff --git a/web/check_ru_ts_file.py b/web/check_ru_ts_file.py new file mode 100644 index 00000000..709c1ba0 --- /dev/null +++ b/web/check_ru_ts_file.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""检查 ru-RU.ts 文件中的中文字符问题""" +import re +from pathlib import Path + +def contains_chinese(text: str) -> bool: + """检查文本是否包含中文字符""" + return bool(re.search(r'[\u4e00-\u9fff]', text)) + +def main(): + ts_file = Path(__file__).parent / "src/i18n/locales/ru-RU.ts" + + with open(ts_file, 'r', encoding='utf-8') as f: + lines = f.readlines() + + problematic_lines = [] + in_workflows = False + + for i, line in enumerate(lines, 1): + # 检测是否进入 workflows 部分 + if 'workflows:' in line: + in_workflows = True + elif in_workflows and line.strip().startswith('}') and line.count('}') > line.count('{'): + # 可能退出 workflows 部分 + pass + + # 检查是否包含中文字符 + if contains_chinese(line): + # 提取键名 + key_match = re.search(r'(\w+):\s*[\'"]', line) + key_name = key_match.group(1) if key_match else 'unknown' + + problematic_lines.append({ + 'line_num': i, + 'key': key_name, + 'content': line.strip(), + 'in_workflows': in_workflows + }) + + print(f"发现 {len(problematic_lines)} 行包含中文字符的俄语翻译:\n") + + # 只显示 workflows 部分的问题 + workflows_problems = [p for p in problematic_lines if p['in_workflows']] + + print(f"workflows 部分问题: {len(workflows_problems)} 行\n") + + for item in workflows_problems[:30]: # 显示前30个 + print(f"行 {item['line_num']}: {item['key']}") + print(f" {item['content'][:100]}") + print() + + if len(workflows_problems) > 30: + print(f"... 还有 {len(workflows_problems) - 30} 个问题行") + +if __name__ == '__main__': + main() diff --git a/web/check_russian_translations.py b/web/check_russian_translations.py new file mode 100644 index 00000000..b0fd9bfe --- /dev/null +++ b/web/check_russian_translations.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""检查俄语翻译中的中文字符问题""" +import json +import re +from pathlib import Path + +def contains_chinese(text: str) -> bool: + """检查文本是否包含中文字符""" + return bool(re.search(r'[\u4e00-\u9fff]', text)) + +def main(): + json_path = Path(__file__).parent / "workflows_translations.json" + + with open(json_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + translations = data.get('translations', {}) + + problematic_keys = [] + + for key, value in translations.items(): + if isinstance(value, dict) and 'ru-RU' in value: + ru_text = value['ru-RU'] + if ru_text != 'TODO' and contains_chinese(ru_text): + zh_hans = value.get('zh-Hans', '') + problematic_keys.append({ + 'key': key, + 'ru_text': ru_text, + 'zh_hans': zh_hans + }) + + print(f"发现 {len(problematic_keys)} 个包含中文字符的俄语翻译:\n") + + for item in problematic_keys[:20]: # 只显示前20个 + print(f"键: {item['key']}") + print(f" 中文原文: {item['zh_hans']}") + print(f" 俄语翻译: {item['ru_text']}") + print() + + if len(problematic_keys) > 20: + print(f"... 还有 {len(problematic_keys) - 20} 个问题翻译") + +if __name__ == '__main__': + main() diff --git a/web/check_translation_progress.py b/web/check_translation_progress.py new file mode 100644 index 00000000..fa0b533d --- /dev/null +++ b/web/check_translation_progress.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +""" +检查workflows翻译进度 + +使用方法: +python3 check_translation_progress.py + +显示: +- 每种语言的翻译进度 +- 已完成和待完成的键数量 +- 翻译完成百分比 +- 最近翻译的键(如果有) +""" + +import json +from pathlib import Path +from typing import Dict, List, Tuple + + +def load_translations() -> Dict: + """加载翻译JSON文件""" + json_path = Path(__file__).parent / 'workflows_translations.json' + + if not json_path.exists(): + raise FileNotFoundError(f"找不到翻译文件: {json_path}") + + with open(json_path, 'r', encoding='utf-8') as f: + return json.load(f) + + +def analyze_progress(translations_data: Dict) -> Dict[str, Dict]: + """ + 分析每种语言的翻译进度 + + 返回格式: + { + 'ja-JP': { + 'completed': 50, + 'total': 627, + 'percentage': 7.97, + 'completed_keys': ['title', 'description', ...], + 'pending_keys': ['...', ...] + }, + ... + } + """ + translations = translations_data.get('translations', {}) + languages = ['ja-JP', 'zh-Hant', 'es-ES', 'ru-RU', 'th-TH', 'vi-VN'] + + progress = {} + + for lang in languages: + completed_keys = [] + pending_keys = [] + + for key, values in translations.items(): + translation = values.get(lang, 'TODO') + if translation != 'TODO' and translation.strip(): + completed_keys.append(key) + else: + pending_keys.append(key) + + total = len(translations) + completed = len(completed_keys) + percentage = (completed / total * 100) if total > 0 else 0 + + progress[lang] = { + 'completed': completed, + 'total': total, + 'percentage': percentage, + 'completed_keys': completed_keys, + 'pending_keys': pending_keys + } + + return progress + + +def get_language_name(lang_code: str) -> str: + """获取语言的中文名称""" + names = { + 'ja-JP': '日语', + 'zh-Hant': '繁体中文', + 'es-ES': '西班牙语', + 'ru-RU': '俄语', + 'th-TH': '泰语', + 'vi-VN': '越南语' + } + return names.get(lang_code, lang_code) + + +def print_progress_bar(percentage: float, width: int = 40) -> str: + """生成进度条""" + filled = int(width * percentage / 100) + bar = '█' * filled + '░' * (width - filled) + return f"[{bar}] {percentage:.1f}%" + + +def display_progress(progress: Dict[str, Dict]): + """显示翻译进度""" + print("\n" + "="*80) + print("📊 Workflows翻译进度报告") + print("="*80) + + # 按完成度排序 + sorted_langs = sorted(progress.items(), key=lambda x: x[1]['percentage'], reverse=True) + + for lang, data in sorted_langs: + lang_name = get_language_name(lang) + completed = data['completed'] + total = data['total'] + percentage = data['percentage'] + + print(f"\n【{lang_name} ({lang})】") + print(f" {print_progress_bar(percentage)}") + print(f" ✅ 已完成: {completed}/{total}") + print(f" ⏳ 待翻译: {total - completed}") + + # 显示最近完成的键(前5个) + if data['completed_keys']: + recent = data['completed_keys'][:5] + print(f" 📝 最近完成: {', '.join(recent)}") + if len(data['completed_keys']) > 5: + print(f" (还有 {len(data['completed_keys']) - 5} 个已完成)") + + # 总体统计 + print("\n" + "-"*80) + total_completed = sum(d['completed'] for d in progress.values()) + total_items = sum(d['total'] for d in progress.values()) + avg_percentage = (total_completed / total_items * 100) if total_items > 0 else 0 + + print(f"📈 总体进度: {total_completed}/{total_items} ({avg_percentage:.1f}%)") + print(f"📊 平均每种语言: {total_completed // len(progress)}/{progress[list(progress.keys())[0]]['total']}") + + # 估算剩余工作量 + remaining = total_items - total_completed + print(f"\n💡 剩余工作量: {remaining} 个翻译项") + + if remaining > 0: + # 建议分批策略 + batches_50 = (remaining + 49) // 50 # 向上取整 + batches_100 = (remaining + 99) // 100 + + print(f" 建议分批策略:") + print(f" - 每批50个键: 需要 {batches_50} 批") + print(f" - 每批100个键: 需要 {batches_100} 批") + + print("="*80) + + +def suggest_next_keys(progress: Dict[str, Dict], batch_size: int = 50) -> List[str]: + """建议下一批要翻译的键""" + # 找出所有语言都还没翻译的键 + all_pending = set() + + for lang, data in progress.items(): + if not all_pending: + all_pending = set(data['pending_keys']) + else: + all_pending &= set(data['pending_keys']) + + return list(all_pending)[:batch_size] + + +def main(): + print("🔍 正在检查翻译进度...") + + try: + # 加载翻译数据 + translations_data = load_translations() + + # 分析进度 + progress = analyze_progress(translations_data) + + # 显示进度 + display_progress(progress) + + # 建议下一批翻译的键 + next_keys = suggest_next_keys(progress, batch_size=50) + + if next_keys: + print(f"\n💡 建议下一批翻译的键(前10个):") + for i, key in enumerate(next_keys[:10], 1): + print(f" {i}. {key}") + + if len(next_keys) > 10: + print(f" ... 还有 {len(next_keys) - 10} 个键") + else: + print("\n🎉 恭喜!所有翻译已完成!") + + print("\n✅ 进度检查完成") + + except FileNotFoundError as e: + print(f"\n❌ 错误: {e}") + print("💡 请确保 workflows_translations.json 文件存在") + except Exception as e: + print(f"\n❌ 发生错误: {e}") + import traceback + traceback.print_exc() + + +if __name__ == '__main__': + main() diff --git a/web/fix_i18n_keys.py b/web/fix_i18n_keys.py new file mode 100644 index 00000000..ca62accf --- /dev/null +++ b/web/fix_i18n_keys.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +""" +自动修复所有语言文件中缺失的 nodeOutputs 和 nodeInputs 键 +""" + +import re +from pathlib import Path + +# 需要添加的 nodeOutputs 键(使用英文作为临时翻译) +MISSING_NODE_OUTPUTS = { + 'sender': 'Sender', + 'output': 'Output', + 'result': 'Result', + 'data': 'Data', + 'error': 'Error Message', + 'success': 'Success Status', + 'event': 'Event', + 'trigger_time': 'Trigger Time', + 'logs': 'Logs', + 'scores': 'Scores', + 'missing': 'Missing Parameters', + 'parsed': 'Parsed Result', + 'chunks': 'Text Chunks', + 'text': 'Text Content', + 'case_1': 'Case 1 Output', + 'case_2': 'Case 2 Output', + 'branch_1': 'Branch 1 Output', + 'branch_2': 'Branch 2 Output', + 'count': 'Count', + 'execution_id': 'Execution ID', + 'notification_id': 'Notification ID', + 'suggestions': 'Suggestions', + 'embedding': 'Embedding Vector', + 'dimensions': 'Vector Dimensions', + 'intent': 'Intent', + 'entities': 'Entities', +} + +# 需要添加的 nodeInputs 键 +MISSING_NODE_INPUTS = { + 'payload': 'Payload', + 'input_value': 'Input Value', + 'conversation_id': 'Conversation ID', +} + +# 需要修复的语言文件 +LANGUAGE_FILES = [ + 'ja-JP.ts', + 'zh-Hant.ts', + 'es-ES.ts', + 'ru-RU.ts', + 'th-TH.ts', + 'vi-VN.ts', +] + +def find_insertion_point(content: str, section: str) -> tuple[int, str]: + """ + 找到插入点的位置 + section: 'nodeOutputs' 或 'nodeInputs' + 返回: (插入位置的行号, 缩进字符串) + """ + lines = content.split('\n') + in_section = False + last_key_line = -1 + indent = ' ' + + for i, line in enumerate(lines): + if f'{section}:' in line and '{' in line: + in_section = True + continue + + if in_section: + # 检测缩进 + if line.strip() and not line.strip().startswith('//'): + match = re.match(r'^(\s+)', line) + if match: + indent = match.group(1) + + # 找到最后一个键值对 + if ':' in line and not line.strip().startswith('//'): + last_key_line = i + + # 遇到闭合括号,说明section结束 + if '},' in line and last_key_line > 0: + return last_key_line, indent + + return -1, indent + +def add_missing_keys(file_path: Path): + """为指定的语言文件添加缺失的键""" + print(f"\n处理文件: {file_path.name}") + + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + lines = content.split('\n') + modified = False + + # 处理 nodeOutputs + for key, value in MISSING_NODE_OUTPUTS.items(): + if f" {key}:" not in content: + print(f" 添加 nodeOutputs.{key}") + + # 找到插入点 + insert_line, indent = find_insertion_point(content, 'nodeOutputs') + if insert_line > 0: + # 在最后一个键之后插入 + new_line = f"{indent}{key}: '{value}'," + lines.insert(insert_line + 1, new_line) + content = '\n'.join(lines) + lines = content.split('\n') + modified = True + + # 处理 nodeInputs + for key, value in MISSING_NODE_INPUTS.items(): + if f" {key}:" not in content: + print(f" 添加 nodeInputs.{key}") + + # 找到插入点 + insert_line, indent = find_insertion_point(content, 'nodeInputs') + if insert_line > 0: + # 在最后一个键之后插入 + new_line = f"{indent}{key}: '{value}'," + lines.insert(insert_line + 1, new_line) + content = '\n'.join(lines) + lines = content.split('\n') + modified = True + + if modified: + # 写回文件 + with open(file_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + print(f" ✓ 已更新 {file_path.name}") + else: + print(f" - {file_path.name} 无需更新") + +def main(): + """主函数""" + locales_dir = Path(__file__).parent / 'src' / 'i18n' / 'locales' + + print("=" * 60) + print("开始修复多语言 i18n 文件") + print("=" * 60) + + for lang_file in LANGUAGE_FILES: + file_path = locales_dir / lang_file + if file_path.exists(): + add_missing_keys(file_path) + else: + print(f"\n警告: 文件不存在 - {lang_file}") + + print("\n" + "=" * 60) + print("修复完成!") + print("=" * 60) + print(f"\n已处理 {len(LANGUAGE_FILES)} 个语言文件") + print(f"添加了 {len(MISSING_NODE_OUTPUTS)} 个 nodeOutputs 键") + print(f"添加了 {len(MISSING_NODE_INPUTS)} 个 nodeInputs 键") + +if __name__ == '__main__': + main() diff --git a/web/fix_ru_mixed_text.py b/web/fix_ru_mixed_text.py new file mode 100644 index 00000000..b9f5d450 --- /dev/null +++ b/web/fix_ru_mixed_text.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +"""直接修复 ru-RU.ts 文件中包含中文字符的翻译 +从 en-US.ts 提取英文原文,然后替换 ru-RU.ts 中的混合文本 +""" +import re +from pathlib import Path +from typing import Dict, List, Tuple + +def contains_chinese(text: str) -> bool: + """检查文本是否包含中文字符""" + return bool(re.search(r'[\u4e00-\u9fff]', text)) + +def extract_key_value_pairs(file_path: Path, section_name: str = 'workflows') -> Dict[str, str]: + """从 .ts 文件中提取指定部分的键值对""" + with open(file_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + result = {} + in_section = False + brace_count = 0 + + for line in lines: + # 检测进入目标部分 + if f'{section_name}:' in line and '{' in line: + in_section = True + brace_count = line.count('{') - line.count('}') + continue + + if not in_section: + continue + + # 更新括号计数 + brace_count += line.count('{') - line.count('}') + + # 提取键值对 + match = re.match(r'\s*(\w+):\s*[\'"]([^\'"]*(?:\\.[^\'"]*)*)[\'"],?\s*(?://.*)?$', line) + if match: + key = match.group(1) + value = match.group(2) + # 处理转义字符 + value = value.replace("\\'", "'").replace('\\"', '"').replace('\\n', '\n') + result[key] = value + + # 检测退出部分 + if brace_count == 0: + break + + return result + +def find_problematic_lines(file_path: Path) -> List[Tuple[int, str, str]]: + """找出包含中文字符的行""" + with open(file_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + problematic = [] + in_workflows = False + + for i, line in enumerate(lines): + if 'workflows:' in line: + in_workflows = True + continue + + if in_workflows and contains_chinese(line): + # 提取键名 + match = re.match(r'\s*(\w+):\s*[\'"]', line) + if match: + key = match.group(1) + problematic.append((i, key, line)) + + return problematic + +# 手动翻译映射 - 基于常见的中俄混合模式 +MANUAL_TRANSLATIONS = { + # 率 -> процент/коэффициент + '成功率': 'Процент успеха', + '失败率': 'Процент неудач', + + # 次数 -> количество/раз + '失败次数': 'Количество неудач', + '执行次数': 'Количество выполнений', + '成功次数': 'Количество успехов', + + # 状态 -> статус + '全部状态': 'Все статусы', + '运行状态': 'Статус выполнения', + + # 时间 -> время + '等待时间': 'Время ожидания', + '执行时间': 'Время выполнения', + '创建时间': 'Время создания', + '更新时间': 'Время обновления', + + # 记录 -> запись + '执行记录': 'Записи выполнения', + '节点执行记录': 'Записи выполнения узлов', + + # 节点 -> узел + '节点': 'Узел', + '节点类型': 'Тип узла', + '节点名称': 'Название узла', + '选中节点': 'Выбранный узел', + '搜索节点': 'Поиск узлов', + '没有选中节点可复制': 'Нет выбранных узлов для копирования', + '已复制节点': 'Узлы скопированы', + '已粘贴节点': 'Узлы вставлены', + '未找到匹配节点': 'Совпадающие узлы не найдены', + '拖拽节点到画布添加': 'Перетащите узел на холст для добавления', + '选择节点或连线': 'Выберите узел или соединение', + '点击画布中节点或连线来查看和编辑其属性': 'Нажмите на узел или соединение на холсте, чтобы просмотреть и изменить его свойства', + '该节点类型暂无配置选项': 'Для этого типа узла пока нет параметров конфигурации', + '确定删除此节点': 'Вы уверены, что хотите удалить этот узел?', + '删除后,该节点及其所有连线将被永久移除': 'После удаления узел и все его соединения будут удалены навсегда', + '节点显示名称': 'Отображаемое имя узла', + + # 工作流 -> рабочий процесс + '工作流': 'Рабочий процесс', + '工作流名称': 'Название рабочего процесса', + '输入工作流名称': 'Введите название рабочего процесса', + + # 变量 -> переменная + '变量': 'Переменная', + '变量名': 'Имя переменной', + '上下文变量': 'Контекстная переменная', + + # 条件 -> условие + '条件': 'Условие', + '条件分支': 'Условная ветвь', + '输入条件表达式': 'Введите условное выражение', + '条件为空时': 'Когда условие пусто', + '条件为空时,该连线将始终被执行': 'Когда условие пусто, это соединение всегда будет выполняться', + + # 其他常见词汇 + '已配置': 'Настроено', + '未保存': 'Не сохранено', + '有未保存更改': 'Есть несохраненные изменения', + '剪贴板为空': 'Буфер обмена пуст', + '正在加载节点类型': 'Загрузка типов узлов', + '模拟消息': 'Имитация сообщения', + '调试上下文': 'Контекст отладки', + '请求体': 'Тело запроса', + '确定删除此连线': 'Вы уверены, что хотите удалить это соединение?', + '删除后,该连线将被永久移除': 'После удаления соединение будет удалено навсегда', +} + +def create_translation_dict() -> Dict[str, str]: + """创建完整的翻译字典,包括部分匹配""" + translations = {} + + # 添加手动翻译 + for zh, ru in MANUAL_TRANSLATIONS.items(): + translations[zh] = ru + + return translations + +def fix_mixed_text(text: str, translations: Dict[str, str]) -> str: + """修复混合中俄文本""" + # 首先尝试完全匹配 + for zh, ru in translations.items(): + if zh in text: + text = text.replace(zh, ru) + + # 移除剩余的中文字符(如果还有的话) + # 这是最后的手段,用俄语占位符替换 + if contains_chinese(text): + # 提取中文部分并尝试翻译 + chinese_parts = re.findall(r'[\u4e00-\u9fff]+', text) + for part in chinese_parts: + if part in translations: + text = text.replace(part, translations[part]) + + return text + +def main(): + base_dir = Path(__file__).parent + en_us_file = base_dir / "src/i18n/locales/en-US.ts" + ru_ru_file = base_dir / "src/i18n/locales/ru-RU.ts" + + print("🔍 正在分析 ru-RU.ts 文件...") + + # 找出有问题的行 + problematic_lines = find_problematic_lines(ru_ru_file) + print(f"发现 {len(problematic_lines)} 行包含中文字符") + + if not problematic_lines: + print("✅ 没有需要修复的翻译!") + return + + # 读取整个文件 + with open(ru_ru_file, 'r', encoding='utf-8') as f: + lines = f.readlines() + + # 创建翻译字典 + translations = create_translation_dict() + + # 修复每一行 + fixed_count = 0 + for line_num, key, original_line in problematic_lines: + # 提取当前值 + match = re.match(r'(\s*)(\w+):\s*[\'"]([^\'"]*(?:\\.[^\'"]*)*)[\'"],?(\s*(?://.*)?)\s*$', original_line) + if not match: + continue + + indent, key_name, value, comment = match.groups() + + # 修复值 + fixed_value = fix_mixed_text(value, translations) + + if fixed_value != value and not contains_chinese(fixed_value): + # 重建行 + new_line = f"{indent}{key_name}: '{fixed_value}',{comment}\n" + lines[line_num] = new_line + fixed_count += 1 + print(f"✓ 修复 {key_name}: {value[:50]}... -> {fixed_value[:50]}...") + + # 写回文件 + if fixed_count > 0: + with open(ru_ru_file, 'w', encoding='utf-8') as f: + f.writelines(lines) + print(f"\n✅ 成功修复 {fixed_count} 行翻译") + print(f"📝 已更新文件: {ru_ru_file}") + else: + print("\n⚠️ 没有成功修复任何翻译") + print("可能需要手动检查或添加更多翻译映射") + + # 再次检查 + print("\n🔍 验证修复结果...") + remaining_problems = find_problematic_lines(ru_ru_file) + if remaining_problems: + print(f"⚠️ 仍有 {len(remaining_problems)} 行包含中文字符") + print("\n前10个未修复的键:") + for i, (_, key, line) in enumerate(remaining_problems[:10], 1): + print(f" {i}. {key}: {line.strip()[:80]}") + else: + print("✅ 所有中文字符已清除!") + +if __name__ == '__main__': + main() diff --git a/web/fix_ru_workflows.py b/web/fix_ru_workflows.py new file mode 100644 index 00000000..e091594c --- /dev/null +++ b/web/fix_ru_workflows.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +""" +修复俄语翻译文件中 workflows 部分的中文混杂问题 +""" + +import re + +# 读取俄语文件 +with open('src/i18n/locales/ru-RU.ts', 'r', encoding='utf-8') as f: + content = f.read() + +# 定义需要替换的中文文本到俄语的映射 +replacements = { + # workflows section + '工作流': 'Рабочий процесс', + '创建和管理可视化工作流,实现复杂的消息处理逻辑': 'Создание и управление визуальными рабочими процессами для реализации сложной логики обработки сообщений', + '创建工作流': 'Создать рабочий процесс', + '从侧边栏选择一个工作流': 'Выберите рабочий процесс из боковой панели', + '编辑工作流': 'Редактировать рабочий процесс', + '新工作流': 'Новый рабочий процесс', + '获取工作流列表失败:': 'Ошибка получения списка рабочих процессов: ', + '工作流名称': 'Название рабочего процесса', + '工作流描述': 'Описание рабочего процесса', + '工作流名称不能为空': 'Название рабочего процесса не может быть пустым', + '一个工作流': 'Рабочий процесс', + '获取工作流失败:': 'Ошибка получения рабочего процесса: ', + '加载工作流失败': 'Ошибка загрузки рабочего процесса', + '保存成功': 'Успешно сохранено', + '保存失败:': 'Ошибка сохранения: ', + '工作流创建成功': 'Рабочий процесс успешно создан', + '创建失败:': 'Ошибка создания: ', + '删除成功': 'Успешно удалено', + '删除失败:': 'Ошибка удаления: ', + '你确定要删除这个工作流吗?': 'Вы уверены, что хотите удалить этот рабочий процесс?', + '复制成功': 'Успешно скопировано', + '复制失败:': 'Ошибка копирования: ', + '导出': 'Экспорт', + '导入': 'Импорт', + '工作流已导出': 'Рабочий процесс экспортирован', + '工作流已导入': 'Рабочий процесс импортирован', + '导入失败:文件格式无效': 'Ошибка импорта: недопустимый формат файла', + '发布': 'Опубликовать', + '发布成功': 'Успешно опубликовано', + '发布失败': 'Ошибка публикации', + '配置': 'Конфигурация', + '执行记录': 'Записи выполнения', + '编辑器': 'Редактор', + '对话调试': 'Отладка диалога', + '基础信息': 'Основная информация', + '设置工作流名称、图标和描述': 'Настроить название, значок и описание рабочего процесса', + '设置工作流名称和描述': 'Настроить название и описание рабочего процесса', + '危险区域': 'Опасная зона', + '不可逆的操作': 'Необратимые операции', + '删除此工作流': 'Удалить этот рабочий процесс', + '删除后,所有关联配置将被永久移除,且无法恢复。': 'После удаления все связанные конфигурации будут удалены навсегда и не могут быть восстановлены.', + '删除工作流': 'Удалить рабочий процесс', + '确认删除': 'Подтвердить удаление', + '您确定要删除工作流': 'Вы уверены, что хотите удалить рабочий процесс', + '吗?此操作无法撤销。': '? Эту операцию нельзя отменить.', + '名称': 'Название', + '输入工作流名称': 'Введите название рабочего процесса', + '输入工作流描述(可选)': 'Введите описание рабочего процесса (необязательно)', + '启用': 'Включить', + '启用后,工作流将可以被触发执行': 'После включения рабочий процесс может быть запущен для выполнения', + '加载中...': 'Загрузка...', + '工作流信息': 'Информация о рабочем процессе', + '版本': 'Версия', + '创建时间': 'Дата создания', + '更新时间': 'Дата обновления', + '共': 'Всего', + '条执行记录': 'записей выполнения', + '统计分析': 'Статистический анализ', + '成功': 'успешных', + '次': 'раз', + '成功率': 'Успешность', + '平均耗时': 'Средняя длительность', + '每次执行': 'За выполнение', + '失败次数': 'Количество неудач', + '最后执行': 'Последнее выполнение', + '按状态筛选': 'Фильтр по статусу', + '全部状态': 'Все статусы', + '手动触发': 'Ручной запуск', + '执行': 'Выполнение', + '状态': 'Статус', + '触发类型': 'Тип триггера', + '开始时间': 'Время начала', + '耗时': 'Длительность', + '暂无执行记录': 'Нет записей выполнения', + '执行详情': 'Детали выполнения', + '错误信息': 'Информация об ошибке', + '节点执行记录': 'Записи выполнения узлов', + '执行结果': 'Результат выполнения', + '等待中': 'Ожидание', + '执行中': 'Выполнение', + '已完成': 'Завершено', + '失败': 'Неудача', + '已取消': 'Отменено', +} + +# 执行替换 +for chinese, russian in replacements.items(): + content = content.replace(chinese, russian) + +# 写回文件 +with open('src/i18n/locales/ru-RU.ts', 'w', encoding='utf-8') as f: + f.write(content) + +print("俄语翻译文件修复完成!") diff --git a/web/fix_russian_translations.py b/web/fix_russian_translations.py new file mode 100644 index 00000000..e2875a28 --- /dev/null +++ b/web/fix_russian_translations.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +"""修复 ru-RU.ts 文件中包含中文字符的翻译""" +import re +import os +from pathlib import Path +from anthropic import Anthropic + +def contains_chinese(text: str) -> bool: + """检查文本是否包含中文字符""" + return bool(re.search(r'[\u4e00-\u9fff]', text)) + +def extract_workflows_section(file_path: Path) -> dict: + """从 .ts 文件中提取 workflows 部分的键值对""" + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 找到 workflows 部分 + workflows_match = re.search(r'workflows:\s*\{(.*?)\n\s*\},?\s*\n', content, re.DOTALL) + if not workflows_match: + return {} + + workflows_content = workflows_match.group(1) + + # 提取所有键值对 + pattern = r"(\w+):\s*['\"]([^'\"]*(?:\\.[^'\"]*)*)['\"]" + matches = re.findall(pattern, workflows_content) + + result = {} + for key, value in matches: + # 处理转义字符 + value = value.replace("\\'", "'").replace('\\"', '"') + result[key] = value + + return result + +def translate_text(client: Anthropic, text: str, target_lang: str = "Russian") -> str: + """使用 Claude API 翻译文本""" + try: + message = client.messages.create( + model="claude-3-5-sonnet-20241022", + max_tokens=1000, + messages=[{ + "role": "user", + "content": f"""Translate the following English text to {target_lang}. +Only provide the translation, no explanations or additional text. +Keep any {{variable}} placeholders unchanged. + +Text to translate: {text}""" + }] + ) + + translation = message.content[0].text.strip() + # 移除可能的引号 + translation = translation.strip('"').strip("'") + return translation + except Exception as e: + print(f"翻译错误: {e}") + return text + +def main(): + # 检查 API key + api_key = os.getenv('ANTHROPIC_API_KEY') + if not api_key: + print("错误: 未找到 ANTHROPIC_API_KEY 环境变量") + print("请设置: export ANTHROPIC_API_KEY='your-api-key'") + return + + client = Anthropic(api_key=api_key) + + base_dir = Path(__file__).parent + en_us_file = base_dir / "src/i18n/locales/en-US.ts" + ru_ru_file = base_dir / "src/i18n/locales/ru-RU.ts" + + # 提取英文和俄文的 workflows 部分 + print("正在提取英文原文...") + en_workflows = extract_workflows_section(en_us_file) + print(f"提取了 {len(en_workflows)} 个英文键") + + print("\n正在提取俄文翻译...") + ru_workflows = extract_workflows_section(ru_ru_file) + print(f"提取了 {len(ru_workflows)} 个俄文键") + + # 找出包含中文的俄文翻译 + problematic_keys = [] + for key, ru_text in ru_workflows.items(): + if contains_chinese(ru_text): + en_text = en_workflows.get(key, '') + if en_text: + problematic_keys.append({ + 'key': key, + 'en_text': en_text, + 'ru_text': ru_text + }) + + print(f"\n发现 {len(problematic_keys)} 个需要修复的翻译") + + if not problematic_keys: + print("没有需要修复的翻译!") + return + + # 翻译前10个作为示例 + print("\n开始翻译前10个键...") + fixed_translations = {} + + for i, item in enumerate(problematic_keys[:10], 1): + key = item['key'] + en_text = item['en_text'] + old_ru_text = item['ru_text'] + + print(f"\n[{i}/10] 翻译键: {key}") + print(f" 英文: {en_text}") + print(f" 旧俄文: {old_ru_text}") + + new_ru_text = translate_text(client, en_text, "Russian") + print(f" 新俄文: {new_ru_text}") + + fixed_translations[key] = new_ru_text + + # 保存修复结果到文件 + output_file = base_dir / "russian_fixes.txt" + with open(output_file, 'w', encoding='utf-8') as f: + f.write(f"需要修复的翻译总数: {len(problematic_keys)}\n\n") + f.write("=" * 80 + "\n") + f.write("已翻译的前10个键:\n") + f.write("=" * 80 + "\n\n") + + for key, new_text in fixed_translations.items(): + old_item = next(item for item in problematic_keys if item['key'] == key) + f.write(f"键: {key}\n") + f.write(f"英文: {old_item['en_text']}\n") + f.write(f"旧俄文: {old_item['ru_text']}\n") + f.write(f"新俄文: {new_text}\n") + f.write("-" * 80 + "\n\n") + + f.write("\n" + "=" * 80 + "\n") + f.write("剩余需要翻译的键:\n") + f.write("=" * 80 + "\n\n") + + for item in problematic_keys[10:]: + f.write(f"键: {item['key']}\n") + f.write(f"英文: {item['en_text']}\n") + f.write(f"旧俄文: {item['ru_text']}\n") + f.write("-" * 80 + "\n\n") + + print(f"\n修复结果已保存到: {output_file}") + print(f"\n注意: 由于翻译数量较多({len(problematic_keys)}个),建议分批处理") + print("您可以修改脚本中的 [:10] 来处理更多键") + +if __name__ == '__main__': + main() diff --git a/web/replace_ru_workflows.py b/web/replace_ru_workflows.py new file mode 100644 index 00000000..a07d36b8 --- /dev/null +++ b/web/replace_ru_workflows.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python3 +""" +从 en-US.ts 提取 workflows 部分,生成干净的俄语翻译 +策略:直接替换整个 workflows 部分 +""" +import re +from pathlib import Path + +def extract_workflows_section(file_path: Path) -> tuple[str, int, int]: + """提取 workflows 部分的内容和行号范围""" + with open(file_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + start_line = None + end_line = None + brace_count = 0 + + for i, line in enumerate(lines): + if 'workflows:' in line and '{' in line: + start_line = i + brace_count = line.count('{') - line.count('}') + continue + + if start_line is not None: + brace_count += line.count('{') - line.count('}') + if brace_count == 0: + end_line = i + break + + if start_line is not None and end_line is not None: + section = ''.join(lines[start_line:end_line+1]) + return section, start_line, end_line + + return '', -1, -1 + +def translate_en_to_ru(text: str) -> str: + """简单的英译俄映射""" + translations = { + # 基础词汇 + 'Workflow': 'Рабочий процесс', + 'workflow': 'рабочий процесс', + 'Node': 'Узел', + 'node': 'узел', + 'nodes': 'узлы', + 'Nodes': 'Узлы', + 'Success': 'Успех', + 'success': 'успех', + 'Failed': 'Не удалось', + 'failed': 'не удалось', + 'Error': 'Ошибка', + 'error': 'ошибка', + 'Loading': 'Загрузка', + 'loading': 'загрузка', + 'Save': 'Сохранить', + 'save': 'сохранить', + 'Delete': 'Удалить', + 'delete': 'удалить', + 'Edit': 'Редактировать', + 'edit': 'редактировать', + 'Create': 'Создать', + 'create': 'создать', + 'Copy': 'Копировать', + 'copy': 'копировать', + 'Paste': 'Вставить', + 'paste': 'вставить', + 'Copied': 'Скопировано', + 'copied': 'скопировано', + 'Pasted': 'Вставлено', + 'pasted': 'вставлено', + 'Configuration': 'Конфигурация', + 'configuration': 'конфигурация', + 'Execution': 'Выполнение', + 'execution': 'выполнение', + 'executions': 'выполнения', + 'Executions': 'Выполнения', + 'Record': 'Запись', + 'record': 'запись', + 'records': 'записи', + 'Records': 'Записи', + 'Status': 'Статус', + 'status': 'статус', + 'All': 'Все', + 'all': 'все', + 'Duration': 'Продолжительность', + 'duration': 'продолжительность', + 'Time': 'Время', + 'time': 'время', + 'Rate': 'Коэффициент', + 'rate': 'коэффициент', + 'Average': 'Средний', + 'average': 'средний', + 'Total': 'Всего', + 'total': 'всего', + 'Last': 'Последний', + 'last': 'последний', + 'Condition': 'Условие', + 'condition': 'условие', + 'Branch': 'Ветвь', + 'branch': 'ветвь', + 'Variable': 'Переменная', + 'variable': 'переменная', + 'Context': 'Контекст', + 'context': 'контекст', + 'Debug': 'Отладка', + 'debug': 'отладка', + 'Message': 'Сообщение', + 'message': 'сообщение', + 'Request': 'Запрос', + 'request': 'запрос', + 'Body': 'Тело', + 'body': 'тело', + 'Empty': 'Пусто', + 'empty': 'пусто', + 'Clipboard': 'Буфер обмена', + 'clipboard': 'буфер обмена', + 'Search': 'Поиск', + 'search': 'поиск', + 'Type': 'Тип', + 'type': 'тип', + 'Found': 'Найдено', + 'found': 'найдено', + 'Drag': 'Перетащить', + 'drag': 'перетащить', + 'Canvas': 'Холст', + 'canvas': 'холст', + 'Select': 'Выбрать', + 'select': 'выбрать', + 'Edge': 'Соединение', + 'edge': 'соединение', + 'Click': 'Нажать', + 'click': 'нажать', + 'View': 'Просмотреть', + 'view': 'просмотреть', + 'Properties': 'Свойства', + 'properties': 'свойства', + 'Configured': 'Настроено', + 'configured': 'настроено', + 'Expression': 'Выражение', + 'expression': 'выражение', + 'Enter': 'Введите', + 'enter': 'введите', + 'When': 'Когда', + 'when': 'когда', + 'Will': 'Будет', + 'will': 'будет', + 'Always': 'Всегда', + 'always': 'всегда', + 'Executed': 'Выполнено', + 'executed': 'выполнено', + 'Support': 'Поддержка', + 'support': 'поддержка', + 'Reference': 'Ссылка', + 'reference': 'ссылка', + 'Confirm': 'Подтвердить', + 'confirm': 'подтвердить', + 'After': 'После', + 'after': 'после', + 'Removed': 'Удалено', + 'removed': 'удалено', + 'Permanently': 'Навсегда', + 'permanently': 'навсегда', + 'Label': 'Метка', + 'label': 'метка', + 'Display': 'Отображение', + 'display': 'отображение', + 'Name': 'Имя', + 'name': 'имя', + 'Simulate': 'Имитировать', + 'simulate': 'имитировать', + 'Options': 'Параметры', + 'options': 'параметры', + 'No': 'Нет', + 'no': 'нет', + 'Unsaved': 'Несохраненные', + 'unsaved': 'несохраненные', + 'Changes': 'Изменения', + 'changes': 'изменения', + 'Nothing': 'Ничего', + 'nothing': 'ничего', + 'Selected': 'Выбрано', + 'selected': 'выбрано', + 'Matching': 'Совпадающие', + 'matching': 'совпадающие', + 'Add': 'Добавить', + 'add': 'добавить', + 'Connection': 'Соединение', + 'connection': 'соединение', + } + + result = text + for en, ru in translations.items(): + result = result.replace(f"'{en}'", f"'{ru}'") + result = result.replace(f'"{en}"', f'"{ru}"') + + return result + +def main(): + base_dir = Path(__file__).parent + en_us_file = base_dir / "src/i18n/locales/en-US.ts" + ru_ru_file = base_dir / "src/i18n/locales/ru-RU.ts" + + print("📖 从 en-US.ts 提取 workflows 部分...") + en_workflows, en_start, en_end = extract_workflows_section(en_us_file) + + if not en_workflows: + print("❌ 无法提取 en-US.ts 的 workflows 部分") + return + + print(f"✓ 提取了 {en_end - en_start + 1} 行") + + print("\n🔄 翻译成俄语...") + ru_workflows = translate_en_to_ru(en_workflows) + + print("\n📝 读取 ru-RU.ts 文件...") + with open(ru_ru_file, 'r', encoding='utf-8') as f: + ru_lines = f.readlines() + + # 找到 ru-RU.ts 中的 workflows 部分 + print("🔍 定位 ru-RU.ts 中的 workflows 部分...") + _, ru_start, ru_end = extract_workflows_section(ru_ru_file) + + if ru_start == -1: + print("❌ 无法找到 ru-RU.ts 的 workflows 部分") + return + + print(f"✓ 找到位置: 行 {ru_start+1} 到 {ru_end+1}") + + # 替换 + print("\n✏️ 替换 workflows 部分...") + new_lines = ru_lines[:ru_start] + [ru_workflows] + ru_lines[ru_end+1:] + + # 写回文件 + with open(ru_ru_file, 'w', encoding='utf-8') as f: + f.writelines(new_lines) + + print(f"✅ 已更新 {ru_ru_file}") + + # 验证 + print("\n🔍 验证结果...") + with open(ru_ru_file, 'r', encoding='utf-8') as f: + content = f.read() + + chinese_count = len(re.findall(r'[\u4e00-\u9fff]', content)) + if chinese_count == 0: + print("✅ 验证通过:没有中文字符!") + else: + print(f"⚠️ 仍有 {chinese_count} 个中文字符") + +if __name__ == '__main__': + main() diff --git a/web/src/app/home/workflows/components/workflow-editor/NodePalette.tsx b/web/src/app/home/workflows/components/workflow-editor/NodePalette.tsx index 1623196b..7abd8973 100644 --- a/web/src/app/home/workflows/components/workflow-editor/NodePalette.tsx +++ b/web/src/app/home/workflows/components/workflow-editor/NodePalette.tsx @@ -22,6 +22,7 @@ import { PALETTE_CATEGORY_BORDER as categoryBorderColors, CATEGORY_ICONS as categoryIcons, findNodeI18nKeys, + getIconComponent, } from './workflow-constants'; import { resolveI18nLabel } from './workflow-i18n'; @@ -35,6 +36,7 @@ const categoryI18nKeys = CATEGORY_I18N_KEYS; interface NodeTypeForUI { type: string; category: string; + icon?: string; // Lucide icon name from backend labelKey?: string; descriptionKey?: string; // Also support raw label dict from backend @@ -305,7 +307,7 @@ export default function NodePalette() { {isExpanded && (
{nodes.map((node) => { - const Icon = nodeIcons[node.type] || Settings; + const Icon = getIconComponent(node.icon, node.type); const label = getNodeLabel(node); const description = getNodeDescription(node); diff --git a/web/src/app/home/workflows/components/workflow-editor/WorkflowNodeComponent.tsx b/web/src/app/home/workflows/components/workflow-editor/WorkflowNodeComponent.tsx index e135bdb9..abc21e0d 100644 --- a/web/src/app/home/workflows/components/workflow-editor/WorkflowNodeComponent.tsx +++ b/web/src/app/home/workflows/components/workflow-editor/WorkflowNodeComponent.tsx @@ -22,6 +22,7 @@ import { NODE_ICONS, NODE_TYPE_I18N_KEYS, getNodeTypeLabel, + getIconComponent, } from './workflow-constants'; import { resolveI18nLabel, maybeTranslateKey } from './workflow-i18n'; import type { I18nObject } from '@/app/infra/entities/common'; @@ -143,6 +144,7 @@ const statusConfig: Record< export interface WorkflowNodeData extends Record { label: string; type: string; + icon?: string; // Lucide icon name from backend config: Record; inputs?: { name: string; @@ -214,7 +216,7 @@ function WorkflowNodeComponent({ data, selected }: NodeProps) { const nodeData = data as WorkflowNodeData; const category = nodeData.type.split('.')[0]; const colors = categoryColors[category] || categoryColors.process; - const Icon = nodeIcons[nodeData.type] || Settings; + const Icon = getIconComponent(nodeData.icon as string | undefined, nodeData.type); // Get execution status const status = nodeData.executionStatus || 'idle'; diff --git a/web/src/app/home/workflows/components/workflow-editor/workflow-constants.ts b/web/src/app/home/workflows/components/workflow-editor/workflow-constants.ts index 24c11b00..94f0f422 100644 --- a/web/src/app/home/workflows/components/workflow-editor/workflow-constants.ts +++ b/web/src/app/home/workflows/components/workflow-editor/workflow-constants.ts @@ -236,6 +236,16 @@ export const CATEGORY_I18N_KEYS: Record = { // ─── Icon mapping ─────────────────────────────────────────────────── +/** + * Legacy hardcoded icon mapping for workflow nodes. + * + * @deprecated This mapping is kept for backward compatibility only. + * New code should use the dynamic icon resolution via getIconComponent(), + * which reads icon names from the backend node definitions. + * + * This will be removed in a future version once all nodes properly + * define their icons in the backend. + */ export const NODE_ICONS: Record = { // Trigger 'trigger.message': MessageSquare, @@ -411,3 +421,51 @@ export function getNodeTypeLabel( .map((w) => w.charAt(0).toUpperCase() + w.slice(1)) .join(' '); } + +// ─── Dynamic Icon Resolution ──────────────────────────────────────── + +import * as LucideIcons from 'lucide-react'; + +/** + * Dynamically get Lucide icon component from backend icon name. + * + * This function enables the frontend to use icon names provided by the backend, + * eliminating the need to maintain a hardcoded NODE_ICONS mapping. + * + * @param iconName - Lucide icon name from backend (e.g., 'MessageSquare', 'Brain') + * @param nodeType - Node type for fallback to hardcoded mapping (backward compatibility) + * @returns React component for the icon + * + * @example + * ```tsx + * const Icon = getIconComponent('MessageSquare'); + * return ; + * ``` + */ +export function getIconComponent( + iconName: string | undefined, + nodeType?: string +): React.ElementType { + // 1. Priority: Use backend-provided icon name + if (iconName) { + const IconComponent = (LucideIcons as any)[iconName]; + if (IconComponent && typeof IconComponent === 'function') { + return IconComponent; + } + // Warn if icon name is invalid + if (process.env.NODE_ENV === 'development') { + console.warn( + `[Workflow] Icon "${iconName}" not found in Lucide icons. ` + + `Falling back to default. Check: https://lucide.dev/icons/` + ); + } + } + + // 2. Fallback: Use hardcoded NODE_ICONS mapping (backward compatibility) + if (nodeType && NODE_ICONS[nodeType]) { + return NODE_ICONS[nodeType]; + } + + // 3. Final fallback: Default Settings icon + return LucideIcons.Settings; +} diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index 710ca98b..6ff93cbd 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -1520,6 +1520,9 @@ const enUS = { question: 'Question', parameters: 'Parameters', key: 'Key', + payload: 'Payload', + input_value: 'Input Value', + conversation_id: 'Conversation ID', // Control inputs case_1: 'Case 1', case_2: 'Case 2', @@ -1982,16 +1985,27 @@ const enUS = { }, // Node outputs i18n nodeOutputs: { + // ===== Common Outputs ===== + output: 'Output', + result: 'Result', + data: 'Data', + error: 'Error', + success: 'Success', + + // ===== Trigger Nodes ===== // trigger.py - MessageTriggerNode message: 'Message Content', + sender: 'Sender', sender_id: 'Sender ID', sender_name: 'Sender Name', platform: 'Platform', conversation_id: 'Conversation ID', is_group: 'Is Group Chat', context: 'Full Message Context', + event: 'Event', // trigger.py - CronTriggerNode timestamp: 'Trigger Time', + trigger_time: 'Trigger Time', schedule: 'Trigger Schedule', cron_timestamp: 'Cron Timestamp', cron_schedule: 'Cron Schedule', @@ -2000,6 +2014,7 @@ const enUS = { body: 'Request Body', headers: 'Request Headers', query: 'Query Parameters', + query_params: 'Query Parameters', method: 'Request Method', webhook_body: 'Webhook Body', webhook_headers: 'Webhook Headers', @@ -2015,10 +2030,10 @@ const enUS = { prompt: 'Prompt/Question', context_info: 'Context Information', // process.py - CodeExecutorNode - output: 'Output Data', console: 'Console Output', code_input: 'Code Input', code_output: 'Code Output', + logs: 'Logs', // process.py - HTTPRequestNode status_code: 'Status Code', http_body: 'HTTP Body', @@ -2026,23 +2041,27 @@ const enUS = { http_response: 'HTTP Response', response_headers: 'Response Headers', // process.py - DataTransformNode - result: 'Transform Result', transform_input: 'Transform Input', transform_result: 'Transform Result', // process.py - QuestionClassifierNode category: 'Category Result', confidence: 'Confidence', all_scores: 'All Category Scores', + scores: 'Scores', question: 'User Question', // process.py - ParameterExtractorNode parameters: 'Extracted Parameters', extraction_success: 'Extraction Success', extract_text: 'Input Text', + missing: 'Missing Parameters', + parsed: 'Parsed Result', // process.py - KnowledgeRetrievalNode documents: 'Retrieved Documents', citations: 'Citation Information', knowledge_context: 'Merged Context', knowledge_query: 'Retrieval Query', + chunks: 'Text Chunks', + text: 'Text', // control.py - ConditionNode true: 'True Branch Output', false: 'False Branch Output', @@ -2051,12 +2070,15 @@ const enUS = { matched_case: 'Matched Branch Output', default: 'Default Branch Output', switch_input: 'Switch Input', + case_1: 'Case 1', + case_2: 'Case 2', // control.py - LoopNode item: 'Current Item', index: 'Current Index', results: 'All Iteration Results', completed: 'Is Completed', loop_items: 'Items to Iterate', + count: 'Count', // control.py - IteratorNode is_first: 'Is First', is_last: 'Is Last', @@ -2077,6 +2099,8 @@ const enUS = { merge_input_2: 'Input 2', merge_input_3: 'Input 3', merge_input_4: 'Input 4', + branch_1: 'Branch 1 Output', + branch_2: 'Branch 2 Output', // control.py - VariableAggregatorNode aggregated: 'Aggregated Variables', aggregator_variables: 'Variable Input', @@ -2084,6 +2108,8 @@ const enUS = { status: 'Send Status', message_id: 'Message ID', target: 'Target ID', + execution_id: 'Execution ID', + notification_id: 'Notification ID', // action.py - ReplyMessageNode reply_message: 'Reply Content', // action.py - CallPipelineNode @@ -2101,6 +2127,7 @@ const enUS = { // action.py - OpeningStatementNode statement: 'Opening Statement', suggested_questions: 'Suggested Questions', + suggestions: 'Suggestions', // action.py - EndNode workflow_output: 'Workflow Output', final_result: 'Final Result', @@ -2108,13 +2135,11 @@ const enUS = { query_results: 'Query Results', row_count: 'Affected/Returned Rows', query_success: 'Query Success', - query_params: 'Query Parameters', // integration.py - RedisOperationNode redis_result: 'Operation Result', redis_success: 'Operation Success', redis_key: 'Redis Key', redis_value: 'Redis Value', - error: 'Error Message', plugin_input: 'Plugin Input', // integration.py - MCPToolNode tool_result: 'Tool Execution Result', @@ -2146,6 +2171,12 @@ const enUS = { coze_query: 'User Input/Query', coze_conversation_id: 'Conversation ID', bot_conversation_id: 'Conversation ID', + + // ===== Additional Keys ===== + embedding: 'Embedding', + dimensions: 'Dimensions', + intent: 'Intent', + entities: 'Entities', }, }, unifiedBinding: { diff --git a/web/src/i18n/locales/es-ES.ts b/web/src/i18n/locales/es-ES.ts index 3a07e368..b20e9079 100644 --- a/web/src/i18n/locales/es-ES.ts +++ b/web/src/i18n/locales/es-ES.ts @@ -62,6 +62,8 @@ const esES = { deleteError: 'Error al eliminar: ', addRound: 'Añadir ronda', copy: 'Copiar', + undo: 'Deshacer', + redo: 'Rehacer', copySuccess: 'Copiado correctamente', copyFailed: 'Error al copiar', test: 'Probar', @@ -1372,183 +1374,185 @@ const esES = { }, }, workflows: { - title: 'Workflows', + title: 'Conversación de Flujo de Trabajo', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', + 'Descripción', + createWorkflow: 'Crear Flujo de Trabajo', + selectFromSidebar: 'Seleccione un flujo de trabajo de la barra lateral', + editWorkflow: 'Editar Flujo de Trabajo', + newWorkflow: 'Nuevo Flujo de Trabajo', + getWorkflowListError: 'Error al obtener la lista de flujos de trabajo:', + workflowName: 'Nombre del Flujo de Trabajo', + workflowDescription: 'Descripción del Flujo de Trabajo', + workflowNameRequired: 'El nombre del flujo de trabajo no puede estar vacío', + defaultDescription: 'Un flujo de trabajo', + getWorkflowError: 'Error al obtener el flujo de trabajo:', + loadError: 'Error al cargar el flujo de trabajo', + saveSuccess: 'Guardado exitosamente', + saveError: 'Error al guardar:', + createSuccess: 'Flujo de trabajo creado exitosamente', + createError: 'Error al crear:', + deleteSuccess: 'Eliminado exitosamente', + deleteError: 'Error al eliminar:', + deleteConfirmation: '¿Está seguro de que desea eliminar este flujo de trabajo?', + copySuccess: 'Copiado exitosamente', + copyError: 'Error al copiar:', + export: 'Exportar', + import: 'Importar', + exportSuccess: 'Flujo de trabajo exportado', + importSuccess: 'Flujo de trabajo importado', + importError: 'Error al importar: formato de archivo inválido', + publish: 'Publicar', + publishSuccess: 'Publicado exitosamente', + publishError: 'Error al publicar', + configuration: 'Configuración', + executions: 'Registros de ejecución', editor: 'Editor', - debugChat: 'Chat de depuración', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + debugChat: 'ConversaciónDepurar', + basicInfo: 'Información básica', + basicInfoDesc: 'Configurar nombre, icono y descripción del flujo de trabajo', + basicInfoDescription: 'Configurar nombre y descripción del flujo de trabajo', + dangerZone: 'Zona peligrosa', + dangerZoneDesc: 'Operaciones irreversibles', + dangerZoneDescription: 'Operaciones irreversibles', + deleteWorkflowAction: 'Eliminar este flujo de trabajo', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + 'Después de eliminar, todas las configuraciones asociadas se eliminarán permanentemente y no se podrán recuperar.', + deleteWorkflow: 'EliminarFlujo de Trabajo', + deleteConfirm: 'ConfirmarEliminar', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + '¿Está seguro de que desea eliminar el flujo de trabajo "{{name}}"? Esta operación no se puede deshacer.', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: 'Nombre', + namePlaceholder: 'EntradaFlujo de TrabajoNombre', + descriptionPlaceholder: 'Ingrese la descripción del flujo de trabajo (opcional)', + enabled: 'Habilitar', + enabledDesc: 'Una vez habilitado, el flujo de trabajo podrá ser activado para su ejecución', + loading: 'Cargando...', + info: 'Flujo de TrabajoInformación', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: 'Versión', + createdAt: 'Fecha de creación', + updatedAt: 'Fecha de actualización', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', + totalExecutions: 'Total de {{count}} registros de ejecución', + statistics: 'Análisis estadístico', + successfulCount: '{{count}} éxitos', + successRate: 'Tasa de éxito', + averageDuration: 'Duración promedio', + perExecution: 'Por ejecución', + failedExecutions: 'Número de fallos', + lastExecution: 'Última ejecución', + filterByStatus: 'Filtrar por estado', + allStatuses: 'Todos los estados', + manualTrigger: 'Activación manual', + executionId: 'Ejecutar ID', + status: 'Estado', + triggerType: 'Tipo de activación', + startedAt: 'Hora de inicio', + duration: 'Tiempo de espera', + noExecutions: 'No hay registros de ejecución', + executionDetails: 'Detalles de ejecución', error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', + nodeExecutions: 'Registros de ejecución de nodos', + result: 'Resultado', 'status.pending': 'Pending', 'status.running': 'Running', 'status.completed': 'Completed', 'status.failed': 'Failed', 'status.cancelled': 'Cancelled', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: 'Panel de nodos', + properties: 'Propiedades', + zoomIn: 'Acercar', + zoomOut: 'Alejar', + fitView: 'Ajustar vista', + unsavedChanges: 'Hay cambios sin guardar', + paste: 'Pegar', + deleted: 'Eliminado', + nothingToCopy: 'No hay nodos seleccionados para copiar', + nothingToPaste: 'El portapapeles está vacío', + copied: 'Se copiaron {{count}} nodos', + pasted: 'Se pegaron {{count}} nodos', + nodesSelected: '{{count}} nodos seleccionados', + edgesSelected: 'Seleccionado {{count}} conexiones', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: 'Buscar nodos...', + loadingNodeTypes: 'Cargando tipos de nodos...', + noNodesFound: 'No se encontraron nodos coincidentes', + clearSearch: 'Limpiar búsqueda', + dragToAdd: 'Arrastrar nodo al lienzo para agregar', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: 'Seleccionar un nodo o conexión', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + 'Haga clic en un nodo o conexión del lienzo para ver y editar sus propiedades', + edgeProperties: 'Propiedades de conexión', + nodeProperties: 'Propiedades del nodo', + condition: 'Rama de condición', + hasCondition: 'Configurado', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + 'Ingrese expresión de condición, por ejemplo: output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', - platform: 'Platform', - sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + 'Cuando la condición está vacía, esta conexión siempre se ejecutará. Soporta usar {{nombre de variable}} para referenciar variables de contexto.', + deleteEdge: 'Eliminar conexión', + deleteEdgeConfirm: '¿Está seguro de eliminar esta conexión?', + deleteEdgeConfirmDesc: 'Una vez eliminada, la conexión se eliminará permanentemente.', + nodeLabel: 'Nombre del nodo', + nodeLabelPlaceholder: 'Ingrese el nombre visible del nodo', + nodeId: 'ID del nodo', + inputOutputVariables: 'Variables de entrada/salida', + inputs: 'Entrada', + outputs: 'Salida', + availableVariables: 'Variables disponibles', + globalVariables: 'Variables globales', + messageContent: 'Mensaje simulado', + messageSender: 'Remitente', + platform: 'Plataforma', + sessionId: 'Sesión ID', + timestamp: 'Marca de tiempo', + nodeConfig: 'Configuración del nodo', + noConfigOptions: 'Este tipo de nodo no tiene opciones de configuración', + deleteNode: 'Eliminar nodo', + deleteNodeConfirm: '¿Está seguro de eliminar este nodo?', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + 'Una vez eliminado, el nodo y todas sus conexiones se eliminarán permanentemente.', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: 'Entrada', + message: 'Mensaje', + text: 'Texto', + query: 'Consulta SQL', + data: 'Datos', + condition: 'Rama de condición', + value: 'Valor', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: 'Contenido', + context: 'Contexto de depuración', + body: 'Cuerpo de la solicitud', + variables: 'Variables monitoreadas', + items: 'Lista de elementos', + arguments: 'Parámetro', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: 'Pregunta del usuario', + parameters: 'Definición de parámetros', + key: 'Clave', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: 'Rama 1', + case_2: 'Rama 2', + branch_1: 'Salida de rama 1', + branch_2: 'Salida de rama 2', // Action inputs - notification_id: 'Notification ID', + notification_id: 'ID de notificación', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: 'Plantilla de clave', + hash_field: 'Campo hash', + server_name: 'Nombre del servidor', + tool_name: 'Nombre de herramienta', + arguments_template: 'Plantilla de parámetros', + scope: 'Ámbito', + payload: 'Carga útil', + input_value: 'Valor de entrada', }, // Data type labels 'type.string': 'String', @@ -1559,377 +1563,377 @@ const esES = { 'type.any': 'Any', 'type.datetime': 'DateTime', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: 'Disparador', + triggerDescription: 'Nodo inicial del flujo de trabajo', + messageTrigger: 'Disparador de mensaje', + messageTriggerDescription: 'Se activa cuando se recibe un mensaje', + scheduleTrigger: 'Disparador programado', + scheduleTriggerDescription: 'Se activa según la programación', + cronTrigger: 'Disparador programado', + cronTriggerDescription: 'Activa el flujo de trabajo según un horario programado', + webhookTrigger: 'Activador Webhook', + webhookTriggerDescription: 'Se activa mediante solicitud HTTP', + eventTrigger: 'Disparador de evento', + eventTriggerDescription: 'Se activa cuando ocurre un evento del sistema', + process: 'IA/Procesamiento', + processDescription: 'Nodo de procesamiento de datos', + aiProcess: 'Procesamiento IA', + aiProcessDescription: 'Procesar mensajes usando modelo de IA', + llmCall: 'Llamada LLM', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + 'Llamar al modelo de lenguaje grande para conversación o generación', + codeProcess: 'Procesamiento de código', + codeProcessDescription: 'Ejecutar código personalizado', + codeExecutor: 'Ejecutor de código', + codeExecutorDescription: 'Ejecutar código Python/JavaScript', + templateProcess: 'Procesamiento de plantilla', + templateProcessDescription: 'Formatear salida usando plantilla', + httpRequest: 'Solicitud HTTP', + httpRequestDescription: 'Enviar solicitud HTTP', + dataTransform: 'Transformación de datos', + dataTransformDescription: 'Transformar formato de datos', + questionClassifier: 'Clasificador de preguntas', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + 'Usar LLM para clasificar preguntas del usuario en categorías predefinidas', + parameterExtractor: 'Extractor de parámetros', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + 'Usar LLM para extraer parámetros estructurados del texto', + knowledgeRetrieval: 'Recuperación de conocimiento', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + 'Recuperar contenido relevante de la base de conocimiento', + textTemplate: 'Plantilla de texto', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + 'Generar texto usando plantilla', + jsonTransform: 'Transformación JSON', + jsonTransformDescription: 'Transformar datos JSON', + dataAggregator: 'Agregador de datos', + dataAggregatorDescription: 'Agregar múltiples fuentes de datos', + textSplitter: 'Divisor de texto', + textSplitterDescription: 'Dividir texto en fragmentos', + variableAssignment: 'Asignación de variable', + variableAssignmentDescription: 'Asignar valor a variable del flujo de trabajo', + control: 'Flujo de control', + controlDescription: 'Nodo de control de flujo', + condition: 'Rama de condición', + conditionDescription: 'Bifurcar según condición', + switch: 'Rama múltiple', + switchDescription: 'Selección de rama por múltiples condiciones', + loop: 'Bucle', + loopDescription: 'Ejecución repetida', + iterator: 'Iterador', + iteratorDescription: 'Iterar sobre elementos del array', + parallel: 'Procesamiento paralelo', + parallelDescription: 'Ejecutar múltiples ramas en paralelo', + wait: 'Esperar', + waitDescription: 'Esperar un tiempo especificado', + delay: 'Retraso', + delayDescription: 'Esperar un tiempo especificado', + merge: 'Fusionar', + mergeDescription: 'Fusionar múltiples ramas', + variableAggregator: 'Agregador de variables', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + 'Agregar salidas de variables de múltiples ramas', + action: 'Acción', + actionDescription: 'Nodo de ejecución de acciones', + sendMessage: 'Enviar mensaje', + sendMessageDescription: 'Enviar mensaje a la plataforma', + replyMessage: 'Responder mensaje', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + 'Responder al mensaje que activó el flujo de trabajo', + storeData: 'Almacenar datos', + storeDataDescription: 'Almacenar datos en la base de datos', + callPipeline: 'Llamar Pipeline', + callPipelineDescription: 'Llamar a un Pipeline existente', + setVariable: 'Establecer variable', + setVariableDescription: 'Establecer variable de contexto', + openingStatement: 'Mensaje de apertura', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', - cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + 'Proporcionar mensaje de apertura y preguntas sugeridas', + end: 'Fin', + endDescription: 'Marcar el fin de la ejecución del flujo de trabajo', + log: 'Registro', + logDescription: 'Registrar información en el log', + integration: 'Integración', + integrationDescription: 'Nodo de integración con plataformas de terceros', + difyWorkflow: 'Flujo de trabajo Dify', + difyWorkflowDescription: 'Llamar al flujo de trabajo de la plataforma Dify', + difyKnowledgeQuery: 'Base de conocimiento Dify', + difyKnowledgeQueryDescription: 'Consultar base de conocimiento Dify', + n8nWorkflow: 'Flujo de trabajo n8n', + n8nWorkflowDescription: 'Llamar al flujo de trabajo n8n', + langflowFlow: 'Flujo Langflow', + langflowFlowDescription: 'Llamar al flujo de Langflow', + cozeBot: 'Bot Coze', + cozeBotDescription: 'Llamar al Bot de Coze', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: 'Consulta de base de datos', + databaseQueryDescription: 'Ejecutar consulta de base de datos', + redisOperation: 'Operación Redis', + redisOperationDescription: 'Ejecutar operación de caché Redis', + mcpTool: 'Herramienta MCP', + mcpToolDescription: 'Llamar herramienta MCP', + memoryStore: 'Almacén de memoria', + memoryStoreDescription: 'Almacenar y recuperar datos de la memoria del flujo de trabajo', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: 'Conversación de Flujo de Trabajo', + noExecutions: 'No hay registros de ejecución', + status: 'Estado', + startTime: 'Hora de inicio', + duration: 'Duración', + running: 'Ejecutando', + completed: 'Completado', + failed: 'Fallido', + cancelled: 'Cancelado', + viewDetails: 'Ver detalles', + cancel: 'Cancelar ejecución', + retry: 'Reintentar', + nodeResults: 'Resultados de ejecución de nodos', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: 'Versiones del flujo de trabajo', + current: 'Versión actual', + rollback: 'Revertir a esta versión', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + '¿Está seguro de revertir a esta versión? Los cambios actuales se perderán.', + rollbackSuccess: 'Reversión exitosa', + rollbackError: 'Error al revertir:', }, // Debug and monitoring debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', - conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + debugMode: 'Modo de depuración', + debugPanel: 'Panel de depuración', + startDebug: 'Iniciar depuración', + pauseDebug: 'Pausar', + resumeDebug: 'Continuar', + stepDebug: 'Ejecución paso a paso', + stopDebug: 'Detener', + debugContext: 'Contexto de depuración', + simulatedMessage: 'Mensaje simulado', + simulatedMessagePlaceholder: 'Ingrese el contenido del mensaje a simular', + senderId: 'ID del remitente', + senderIdPlaceholder: 'Identificador único del remitente', + senderName: 'Nombre del remitente', + senderNamePlaceholder: 'Nombre visible del remitente', + conversationId: 'ID de sesión', + conversationIdPlaceholder: 'Identificador único de sesión', + isGroup: 'Chat grupal', + customVariables: 'Variables personalizadas', + addVariable: 'Agregar variable', + variableName: 'Nombre de variable', + variableValue: 'Valor de variable', + watchedVariables: 'Variables monitoreadas', + addWatchVariable: 'Agregar monitoreo', + nodeStates: 'Estado del nodo', + breakpoints: 'Puntos de interrupción', + toggleBreakpoint: 'Alternar punto de interrupción', + breakpointSet: 'Punto de interrupción configurado', + breakpointRemoved: 'Punto de interrupción eliminado', + debugLogs: 'Registros de depuración', + noLogs: 'Sin registros', + clearLogs: 'Limpiar registros', + autoScroll: 'Desplazamiento automático', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', + idle: 'Inactivo', + running: 'Ejecutando', + paused: 'Pausado', + completed: 'Completado', error: 'Error', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: 'Pendiente', + running: 'Ejecutando', + completed: 'Completado', + failed: 'Fallido', + skipped: 'Omitido', }, debugDialog: { - title: 'Workflow Chat', - selectWorkflow: 'Select Workflow', - sessionType: 'Session Type', - privateChat: 'Private Chat', - groupChat: 'Group Chat', - send: 'Send', - reset: 'Reset Conversation', - inputPlaceholder: 'Send {{type}} message...', - noMessages: 'No messages', - userMessage: 'User', + title: 'Conversación de flujo de trabajo', + selectWorkflow: 'Seleccionar flujo de trabajo', + sessionType: 'Tipo de sesión', + privateChat: 'Chat privado', + groupChat: 'Chat grupal', + send: 'Enviar', + reset: 'Reiniciar conversación', + inputPlaceholder: 'Enviar mensaje de {{type}}...', + noMessages: 'Sin mensajes', + userMessage: 'Usuario', botMessage: 'Bot', - sendFailed: 'Send failed', - resetSuccess: 'Conversation reset successfully', - resetFailed: 'Reset failed', - loadMessagesFailed: 'Failed to load messages', - loadWorkflowsFailed: 'Failed to load workflows', - atTips: 'Mention bot', - streaming: 'Streaming', - streamOutput: 'Stream', - connected: 'WebSocket connected', - disconnected: 'WebSocket disconnected', - connectionError: 'WebSocket connection error', - connectionFailed: 'WebSocket connection failed', - notConnected: 'WebSocket not connected, please try again later', - imageUploadFailed: 'Image upload failed', - reply: 'Reply', - replyTo: 'Reply to', - showMarkdown: 'Render', - showRaw: 'Raw', - allMembers: 'All Members', - file: 'File', - voice: 'Voice', - uploadImage: 'Upload Image', - uploading: 'Uploading...', + sendFailed: 'Error al enviar', + resetSuccess: 'Conversación reiniciada', + resetFailed: 'Error al reiniciar', + loadMessagesFailed: 'Error al cargar mensajes', + loadWorkflowsFailed: 'Error al cargar flujos de trabajo', + atTips: 'Mencionar bot', + streaming: 'Transmisión', + streamOutput: 'Streaming', + connected: 'WebSocket conectado', + disconnected: 'WebSocket desconectado', + connectionError: 'Error de conexión WebSocket', + connectionFailed: 'Error de conexión WebSocket', + notConnected: 'WebSocket no conectado, por favor reintente más tarde', + imageUploadFailed: 'Error al subir imagen', + reply: 'Responder', + replyTo: 'Responder a', + showMarkdown: 'Renderizar', + showRaw: 'Texto sin formato', + allMembers: 'Todos los miembros', + file: 'Archivo', + voice: 'Voz', + uploadImage: 'Subir imagen', + uploading: 'Subiendo...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: 'Filtrar por fecha', + allTime: 'Todo el tiempo', + today: 'Hoy', + lastWeek: 'Última semana', + lastMonth: 'Último mes', + showingExecutions: 'Mostrando {{shown}} / {{total}} registros', + rerun: 'Reejecutar', + rerunExecution: 'Reejecutar', + logs: 'Registros', + details: 'Detalles', + completedAt: 'Tiempo de finalización', + noNodeExecutions: 'Sin registros de ejecución de nodos', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: 'Condiciones de activación', + keyword_filter: 'Filtro de palabras clave', + regex_filter: 'Filtro de expresión regular', + min_length: 'Longitud mínima', + max_length: 'Longitud máxima', + require_mention: 'Requiere mencionar bot', + respond_rules: 'Reglas de respuesta grupal', + access_control: 'Control de acceso', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'Expresión Cron', + timezone: 'Zona horaria', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', + path: 'Ruta Webhook', + allowed_methods: 'Métodos HTTP permitidos', content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + auth_type: 'Tipo de autenticación', + auth_key: 'Clave de autenticación', + validation: 'Validación de solicitud', + timeout: 'Tiempo de espera', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: 'Tipo de evento', + filter: 'Filtro de evento', + debounce_ms: 'Tiempo de antirrebote', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', - temperature: 'Temperature', + model: 'Modelo', + prompt_template: 'Plantilla de prompt', + system_prompt: 'Prompt del sistema', + temperature: 'Temperatura', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: 'Penalización de frecuencia', + presence_penalty: 'Penalización de presencia', + max_tokens: 'Máximo de tokens', + stop_sequences: 'Secuencias de parada', + seed: 'Semilla aleatoria', + stream: 'Salida en streaming', + use_conversation_history: 'Usar historial de conversación', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: 'Lenguaje de programación', + code: 'Código', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: 'URL de solicitud', + method: 'Método de solicitud', + auth_config: 'Configuración de autenticación', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: 'Tipo de transformación', + template: 'Plantilla', + expression: 'Expresión', + output_type: 'Tipo de salida', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: 'Categorías', + instruction: 'Instrucción', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: 'Definición de parámetros', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: 'Base de conocimiento', + top_k: 'Cantidad a devolver', + score_threshold: 'Umbral de similitud', + search_method: 'Método de búsqueda', + enable_citations: 'Habilitar citas', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: 'Tipo de condición', + condition_expression: 'Expresión de condición', + left_value: 'Valor izquierdo', + operator: 'Operador de comparación', + right_value: 'Valor derecho', // control.py - SwitchNode - cases: 'Branch Cases', + cases: 'Condiciones de rama', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: 'Máximo de iteraciones', + break_condition: 'Condición de interrupción', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: 'Procesamiento paralelo', + max_concurrency: 'Máximo de concurrencia', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: 'Configuración de ramas', + wait_all: 'Esperar todas', + fail_fast: 'Fallo rápido', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: 'Tiempo de espera', + duration_type: 'Unidad de tiempo', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: 'Estrategia de fusión', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: 'Mapeo de variables', + aggregation_mode: 'Modo de agregación', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: 'Tipo de destino', + target_id: 'ID de destino', + platform: 'Plataforma', + message_type: 'Tipo de mensaje', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: 'Modo de respuesta', + message_template: 'Plantilla de mensaje', + long_text_processing: 'Procesamiento de texto largo', + force_delay: 'Retraso forzado', // action.py - CallPipelineNode pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + inherit_context: 'Heredar contexto', // action.py - StoreDataNode - storage_type: 'Storage Type', - ttl: 'TTL', - key_prefix: 'Key Prefix', + storage_type: 'Tipo de almacenamiento', + ttl: 'Tiempo de expiración', + key_prefix: 'Prefijo de clave', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: 'Nombre de variable', + variable_scope: 'Ámbito de variable', + set_variable_operation: 'Tipo de operación', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: 'Declaración de apertura', + suggested_questions: 'Preguntas sugeridas', + show_suggestions: 'Mostrar sugerencias', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: 'Formato de salida', + success_message: 'Mensaje de éxito', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: 'Tipo de base de datos', + connection_string: 'Cadena de conexión', + query: 'Consulta SQL', + query_type: 'Tipo de consulta', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: 'URL de conexión', + operation: 'Tipo de operación', + key_template: 'Plantilla de clave', + hash_field: 'Campo hash', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: 'Nombre del servidor', + tool_name: 'Nombre de herramienta', + arguments_template: 'Plantilla de parámetros', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: 'Ámbito', // integration.py - DifyWorkflowNode 'base-url': 'Base URL', 'api-key': 'API Key', 'app-type': 'App Type', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: 'ID de base de conocimiento', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode @@ -1941,169 +1945,183 @@ const esES = { // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: 'Mensaje', + sender_id: 'ID del remitente', + sender_name: 'Nombre del remitente', + platform: 'Plataforma', + conversation_id: 'ID de sesión', + is_group: 'Es chat grupal', + context: 'Contexto de depuración', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: 'Marca de tiempo', + schedule: 'Programación', + cron_timestamp: 'Marca de tiempo Cron', + cron_schedule: 'Expresión de programación Cron', + cron_context: 'Contexto Cron', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: 'Cuerpo de la solicitud', + headers: 'Encabezados', + query: 'Consulta SQL', + method: 'Método de solicitud', + webhook_body: 'Cuerpo de solicitud Webhook', + webhook_headers: 'Encabezados de solicitud Webhook', + webhook_query: 'Parámetro de consulta Webhook', + webhook_method: 'Método de solicitud Webhook', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: 'Tipo de evento', + event_data: 'Datos del evento', + event_timestamp: 'Marca de tiempo del evento', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: 'Respuesta', + usage: 'Estadísticas de uso de tokens', + prompt: 'Prompt/pregunta', + context_info: 'Información de contexto', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: 'Salida', + console: 'Salida de consola', + code_input: 'Entrada de código', + code_output: 'Salida de código', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: 'Código de estado', + http_body: 'Cuerpo de solicitud HTTP', + http_headers: 'Encabezados de solicitud HTTP', + http_response: 'Respuesta HTTP', + response_headers: 'Encabezados de respuesta', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: 'Resultado', + transform_input: 'Entrada de transformación', + transform_result: 'Resultado de transformación', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: 'Resultado de categoría', + confidence: 'Confianza', + all_scores: 'Todas las puntuaciones', + question: 'Pregunta del usuario', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: 'Definición de parámetros', + extraction_success: 'Extracción exitosa', + extract_text: 'Texto de entrada', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: 'Documentos recuperados', + citations: 'Información de citas', + knowledge_context: 'Contexto fusionado', + knowledge_query: 'Consulta de recuperación', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: 'Salida cuando la condición es verdadera', + false: 'Salida cuando la condición es falsa', + condition_input: 'Entrada de condición', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: 'Rama coincidente', + default: 'Rama predeterminada', + switch_input: 'Entrada del interruptor', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: 'Elemento actual', + index: 'Índice actual', + results: 'Resultado', + completed: 'Completado', + loop_items: 'Elementos de iteración', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: '¿Es el primero?', + is_last: '¿Es el último?', + iterator_array: 'Array de entrada', + iterator_item: 'Elemento actual', + iterator_index: 'Índice actual', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: 'Lista de errores', + parallel_input: 'Entrada paralela', + parallel_results: 'Resultados de todas las ramas', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: 'Entrada de paso', + wait_output: 'Salida de paso', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: 'Resultado de fusión', + merge_array: 'Resultado de array', + merge_input_1: 'Entrada 1', + merge_input_2: 'Entrada 2', + merge_input_3: 'Entrada 3', + merge_input_4: 'Entrada 4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: 'Variables agregadas', + aggregator_variables: 'Entrada de variable', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: 'Estado', + message_id: 'ID de mensaje', + target: 'ID de destino', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: 'Contenido de respuesta', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: 'Respuesta del Pipeline', + pipeline_result: 'Resultado completo', + pipeline_query: 'Contenido de consulta', + context_data: 'Datos de contexto', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: 'Estado de almacenamiento', + store_key: 'Clave de almacenamiento', + store_value: 'Valor almacenado', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: 'Valor de variable', + variable_result: 'Resultado de establecer variable', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: 'Declaración de apertura', + suggested_questions: 'Preguntas sugeridas', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: 'Salida del flujo de trabajo', + final_result: 'Resultado final', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: 'Resultados de consulta', + row_count: 'Número de filas', + query_success: 'Consulta exitosa', + query_params: 'Parámetros de consulta', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: 'Resultado de Redis', + redis_success: 'Éxito de Redis', + redis_key: 'Clave de Redis', + redis_value: 'Valor de Redis', + error: 'Error', + plugin_input: 'Entrada del plugin', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: 'Resultado de herramienta', + tool_success: 'Éxito de herramienta', + mcp_arguments: 'Parámetro de herramienta', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: 'Resultado de memoria', + memory_success: 'Éxito de memoria', + memory_value: 'Valor almacenado', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'Respuesta', + dify_success: 'Éxito de Dify', + dify_query: 'Entrada/consulta del usuario', + dify_conversation_id: 'ID de sesión', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: 'Resultados de búsqueda', + knowledge_base_query: 'Contenido de consulta', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: 'Resultado de N8n', + n8n_success: 'Éxito de N8n', + n8n_payload: 'Datos de entrada del flujo de trabajo', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: 'Resultado del flujo', + flow_success: 'Éxito del flujo', + langflow_input: 'Contenido de entrada', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: 'Respuesta del bot', + bot_success: 'Éxito del bot', + coze_query: 'Entrada/consulta del usuario', + coze_conversation_id: 'ID de sesión', + bot_conversation_id: 'ID de sesión', + sender: 'Remitente', + event: 'Evento', + trigger_time: 'Tiempo de activación', + scores: 'Puntuaciones', + missing: 'Parámetro faltante', + parsed: 'Resultado analizado', + chunks: 'Fragmentos de texto', + count: 'Cantidad', + execution_id: 'ID de ejecución', + suggestions: 'Preguntas sugeridas', + embedding: 'Vector', + dimensions: 'Dimensiones', + intent: 'Intención', + entities: 'Entidades', }, }, diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index 071d6ab2..d4ce2a6e 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -60,6 +60,8 @@ deleteError: '削除に失敗しました:', addRound: 'ラウンドを追加', copy: 'コピー', + undo: '元に戻す', + redo: 'やり直し', copySuccess: 'コピーに成功しました', copyFailed: 'コピーに失敗しました', test: 'テスト', @@ -1340,376 +1342,378 @@ }, }, workflows: { - title: 'Workflows', + title: 'ワークフロー', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', - editor: 'Editor', + 'ビジュアルワークフローを作成・管理し、複雑なメッセージ処理ロジックを実現', + createWorkflow: 'ワークフローを作成', + selectFromSidebar: 'サイドバーからワークフローを選択', + editWorkflow: 'ワークフローを編集', + newWorkflow: '新しいワークフロー', + getWorkflowListError: 'ワークフローリストの取得に失敗しました:', + workflowName: 'ワークフロー名', + workflowDescription: 'ワークフローの説明', + workflowNameRequired: 'ワークフロー名は必須です', + defaultDescription: 'ワークフロー', + getWorkflowError: 'ワークフローの取得に失敗しました:', + loadError: 'ワークフローの読み込みに失敗しました', + saveSuccess: '保存に成功しました', + saveError: '保存に失敗しました:', + createSuccess: 'ワークフローの作成に成功しました', + createError: '作成に失敗しました:', + deleteSuccess: '削除に成功しました', + deleteError: '削除に失敗しました:', + deleteConfirmation: 'このワークフローを削除してもよろしいですか?', + copySuccess: 'コピーに成功しました', + copyError: 'コピーに失敗しました:', + export: 'エクスポート', + import: 'インポート', + exportSuccess: 'ワークフローをエクスポートしました', + importSuccess: 'ワークフローをインポートしました', + importError: 'インポートに失敗しました:無効なファイル形式', + publish: '公開', + publishSuccess: '公開に成功しました', + publishError: '公開に失敗しました', + configuration: '設定', + executions: '実行履歴', + editor: 'エディター', debugChat: 'チャットデバッグ', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + basicInfo: '基本情報', + basicInfoDesc: 'ワークフロー名、アイコン、説明を設定', + basicInfoDescription: 'ワークフロー名と説明を設定', + dangerZone: '危険ゾーン', + dangerZoneDesc: '取り消し不可能な操作', + dangerZoneDescription: '取り消し不可能な操作', + deleteWorkflowAction: 'このワークフローを削除', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + '削除すると、関連するすべての設定が完全に削除され、復元できません。', + deleteWorkflow: 'ワークフローを削除', + deleteConfirm: '削除を確認', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + 'ワークフロー「{{name}}」を削除してもよろしいですか?この操作は取り消せません。', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: '名前', + namePlaceholder: 'ワークフロー名を入力', + descriptionPlaceholder: 'ワークフローの説明を入力(任意)', + enabled: '有効', + enabledDesc: '有効にすると、ワークフローをトリガーして実行できます', + loading: '読み込み中...', + info: 'ワークフロー情報', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: 'バージョン', + createdAt: '作成日時', + updatedAt: '更新日時', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', - error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', - 'status.pending': 'Pending', - 'status.running': 'Running', - 'status.completed': 'Completed', - 'status.failed': 'Failed', - 'status.cancelled': 'Cancelled', + totalExecutions: '合計{{count}}件の実行', + statistics: '統計分析', + successfulCount: '成功{{count}}件', + successRate: '成功率', + averageDuration: '平均所要時間', + perExecution: '実行あたり', + failedExecutions: '失敗回数', + lastExecution: '最終実行', + filterByStatus: 'ステータスでフィルター', + allStatuses: 'すべてのステータス', + manualTrigger: '手動トリガー', + executionId: '実行ID', + status: 'ステータス', + triggerType: 'トリガータイプ', + startedAt: '開始時刻', + duration: '所要時間', + noExecutions: '実行履歴がありません', + executionDetails: '実行詳細', + error: 'エラー', + nodeExecutions: 'ノード実行記録', + result: '結果', + 'status.pending': '待機中', + 'status.running': '実行中', + 'status.completed': '完了', + 'status.failed': '失敗', + 'status.cancelled': 'キャンセル', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: 'ノードパレット', + properties: 'プロパティ', + zoomIn: '拡大', + zoomOut: '縮小', + fitView: 'ビューに合わせる', + unsavedChanges: '未保存の変更があります', + paste: '貼り付け', + deleted: '削除しました', + nothingToCopy: 'コピーするノードが選択されていません', + nothingToPaste: 'クリップボードが空です', + copied: '{{count}}個のノードをコピーしました', + pasted: '{{count}}個のノードを貼り付けました', + nodesSelected: '{{count}}個のノードを選択中', + edgesSelected: '{{count}}本のエッジを選択中', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: 'ノードを検索...', + loadingNodeTypes: 'ノードタイプを読み込み中...', + noNodesFound: '一致するノードが見つかりません', + clearSearch: '検索をクリア', + dragToAdd: 'ノードをドラッグしてキャンバスに追加', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: 'ノードまたはエッジを選択', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + 'キャンバス内のノードまたはエッジをクリックして、プロパティを表示・編集します', + edgeProperties: 'エッジのプロパティ', + nodeProperties: 'ノードのプロパティ', + condition: '条件', + hasCondition: '設定済み', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + '条件式を入力してください。例: output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', - platform: 'Platform', - sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + '条件が空の場合、このエッジは常に実行されます。{{変数名}}を使用してコンテキスト変数を参照できます。', + deleteEdge: 'エッジを削除', + deleteEdgeConfirm: 'エッジの削除を確認', + deleteEdgeConfirmDesc: 'このエッジは完全に削除されます。', + nodeLabel: 'ノード名', + nodeLabelPlaceholder: 'ノードの表示名を入力', + nodeId: 'ノードID', + inputOutputVariables: '入力/出力変数', + inputs: '入力', + outputs: '出力', + availableVariables: '利用可能な変数', + globalVariables: 'グローバル変数', + messageContent: 'メッセージ内容', + messageSender: '送信者', + platform: 'プラットフォーム', + sessionId: 'セッションID', + timestamp: 'タイムスタンプ', + nodeConfig: 'ノード設定', + noConfigOptions: 'このノードタイプには設定オプションがありません', + deleteNode: 'ノードを削除', + deleteNodeConfirm: 'ノードの削除を確認', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + 'このノードとすべての接続が完全に削除されます。', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: '入力', + message: 'メッセージ', + text: 'テキスト', + query: 'クエリ', + data: 'データ', + condition: '条件', + value: '値', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: 'コンテンツ', + context: 'コンテキスト', + body: 'リクエストボディ', + variables: '変数', + items: 'アイテム', + arguments: '引数', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: '質問', + parameters: 'パラメータ', + key: 'キー', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: 'ケース1', + case_2: 'ケース2', + branch_1: 'ブランチ1', + branch_2: 'ブランチ2', // Action inputs - notification_id: 'Notification ID', + notification_id: '通知ID', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: 'キーテンプレート', + hash_field: 'ハッシュフィールド', + server_name: 'サーバー名', + tool_name: 'ツール名', + arguments_template: '引数テンプレート', + scope: 'スコープ', + payload: 'ペイロード', + input_value: '入力値', }, // Data type labels - 'type.string': 'String', - 'type.object': 'Object', - 'type.array': 'Array', - 'type.boolean': 'Boolean', - 'type.number': 'Number', - 'type.any': 'Any', - 'type.datetime': 'DateTime', + 'type.string': '文字列', + 'type.object': 'オブジェクト', + 'type.array': '配列', + 'type.boolean': 'ブール値', + 'type.number': '数値', + 'type.any': '任意の型', + 'type.datetime': '日時', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: 'トリガー', + triggerDescription: 'ワークフローの開始ノード', + messageTrigger: 'メッセージトリガー', + messageTriggerDescription: 'メッセージ受信時にトリガー', + scheduleTrigger: 'スケジュールトリガー', + scheduleTriggerDescription: 'スケジュールに基づいてトリガー', + cronTrigger: 'Cronトリガー', + cronTriggerDescription: '定時スケジュールでワークフローをトリガー', + webhookTrigger: 'Webhookトリガー', + webhookTriggerDescription: 'HTTPリクエストでトリガー', + eventTrigger: 'イベントトリガー', + eventTriggerDescription: 'システムイベント発生時にトリガー', + process: 'AI/処理', + processDescription: 'データ処理ノード', + aiProcess: 'AI処理', + aiProcessDescription: 'AIモデルを使用してメッセージを処理', + llmCall: 'LLM呼び出し', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + '大規模言語モデルを呼び出して会話または生成を行う', + codeProcess: 'コード処理', + codeProcessDescription: 'カスタムコードを実行', + codeExecutor: 'コード実行', + codeExecutorDescription: 'Python/JavaScriptコードを実行', + templateProcess: 'テンプレート処理', + templateProcessDescription: 'テンプレートを使用して出力をフォーマット', + httpRequest: 'HTTPリクエスト', + httpRequestDescription: 'HTTPリクエストを送信', + dataTransform: 'データ変換', + dataTransformDescription: 'データ形式を変換', + questionClassifier: '質問分類器', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + 'LLMを使用してユーザーの質問を事前定義されたカテゴリに分類', + parameterExtractor: 'パラメータ抽出器', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + 'LLMを使用してテキストから構造化パラメータを抽出', + knowledgeRetrieval: 'ナレッジ検索', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + 'ナレッジベースから関連コンテンツを検索', + textTemplate: 'テキストテンプレート', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + '変数補間を使用してテンプレートからテキストを生成', + jsonTransform: 'JSON変換', + jsonTransformDescription: '式を使用してJSONデータを変換', + dataAggregator: 'データ集約', + dataAggregatorDescription: '複数のソースからデータを集約', + textSplitter: 'テキスト分割', + textSplitterDescription: 'テキストを小さなチャンクに分割', + variableAssignment: '変数代入', + variableAssignmentDescription: 'ワークフロー変数に値を代入', + control: '制御フロー', + controlDescription: 'フロー制御ノード', + condition: '条件分岐', + conditionDescription: '条件に基づいて分岐', + switch: 'スイッチ', + switchDescription: '多方向分岐', + loop: 'ループ', + loopDescription: '繰り返し実行', + iterator: 'イテレーター', + iteratorDescription: '配列要素を反復処理', + parallel: '並列', + parallelDescription: '複数の分岐を並列実行', + wait: '待機', + waitDescription: '指定時間待機', + delay: '遅延', + delayDescription: '指定時間待機', + merge: 'マージ', + mergeDescription: '複数の分岐をマージ', + variableAggregator: '変数集約器', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + '複数の分岐からの変数出力を集約', + action: 'アクション', + actionDescription: 'アクション実行ノード', + sendMessage: 'メッセージ送信', + sendMessageDescription: 'プラットフォームにメッセージを送信', + replyMessage: 'メッセージ返信', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + 'ワークフローをトリガーしたメッセージに返信', + storeData: 'データ保存', + storeDataDescription: 'データベースにデータを保存', + callPipeline: 'Pipeline呼び出し', + callPipelineDescription: '既存のPipelineを呼び出し', + setVariable: '変数設定', + setVariableDescription: 'コンテキスト変数を設定', + openingStatement: '会話開始文', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', + '会話の開始文と提案質問を提供', + end: '終了', + endDescription: 'ワークフロー実行の終了をマーク', + log: 'ログ', + logDescription: 'ログ情報を記録', + integration: '統合', + integrationDescription: 'サードパーティプラットフォーム統合ノード', + difyWorkflow: 'Difyワークフロー', + difyWorkflowDescription: 'DifyプラットフォームのワークフローWを呼び出し', + difyKnowledgeQuery: 'Difyナレッジクエリ', + difyKnowledgeQueryDescription: 'Difyナレッジベースをクエリ', + n8nWorkflow: 'N8nワークフロー', + n8nWorkflowDescription: 'n8nワークフローを呼び出し', + langflowFlow: 'Langflowフロー', + langflowFlowDescription: 'Langflowフローを呼び出し', cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + cozeBotDescription: 'Coze Botを呼び出し', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: 'データベースクエリ', + databaseQueryDescription: 'データベースクエリを実行', + redisOperation: 'Redis操作', + redisOperationDescription: 'Redisキャッシュ操作を実行', + mcpTool: 'MCPツール', + mcpToolDescription: 'MCPツールを呼び出し', + memoryStore: 'メモリストア', + memoryStoreDescription: 'ワークフローメモリからデータを保存・取得', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: '実行履歴', + noExecutions: '実行履歴がありません', + status: 'ステータス', + startTime: '開始時刻', + duration: '所要時間', + running: '実行中', + completed: '完了', + failed: '失敗', + cancelled: 'キャンセル', + viewDetails: '詳細を表示', + cancel: '実行をキャンセル', + retry: '再試行', + nodeResults: 'ノード実行結果', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: 'バージョン履歴', + current: '現在のバージョン', + rollback: 'このバージョンにロールバック', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + 'このバージョンにロールバックしてもよろしいですか?現在の変更は失われます。', + rollbackSuccess: 'ロールバックに成功しました', + rollbackError: 'ロールバックに失敗しました:', }, // Debug and monitoring - debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', + debug: 'デバッグ', + debugMode: 'デバッグモード', + debugPanel: 'デバッグパネル', + startDebug: 'デバッグ開始', + pauseDebug: '一時停止', + resumeDebug: '再開', + stepDebug: 'ステップ実行', + stopDebug: '停止', + debugContext: 'デバッグコンテキスト', + simulatedMessage: 'シミュレートメッセージ', + simulatedMessagePlaceholder: 'シミュレートするメッセージ内容を入力', + senderId: '送信者ID', + senderIdPlaceholder: '送信者の一意識別子', + senderName: '送信者名', + senderNamePlaceholder: '送信者の表示名', + conversationId: '会話ID', conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + isGroup: 'グループチャット', + customVariables: 'カスタム変数', + addVariable: '変数を追加', + variableName: '変数名', + variableValue: '変数値', + watchedVariables: '監視変数', + addWatchVariable: '監視を追加', + nodeStates: 'ノード状態', + breakpoints: 'ブレークポイント', + toggleBreakpoint: 'ブレークポイントを切り替え', + breakpointSet: 'ブレークポイントを設定しました', + breakpointRemoved: 'ブレークポイントを削除しました', + debugLogs: 'デバッグログ', + noLogs: 'ログがありません', + clearLogs: 'ログをクリア', + autoScroll: '自動スクロール', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', - error: 'Error', + idle: 'アイドル', + running: '実行中', + paused: '一時停止', + completed: '完了', + error: 'エラー', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: '待機中', + running: '実行中', + completed: '完了', + failed: '失敗', + skipped: 'スキップ', }, debugDialog: { title: 'ワークフロー チャット', @@ -1749,330 +1753,344 @@ uploading: 'アップロード中...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: '日付でフィルター', + allTime: 'すべての期間', + today: '今日', + lastWeek: '先週', + lastMonth: '先月', + showingExecutions: '{{shown}} / {{total}}件の実行を表示中', + rerun: '再実行', + rerunExecution: '実行を再実行', + logs: 'ログ', + details: '詳細', + completedAt: '完了時刻', + noNodeExecutions: 'ノード実行記録がありません', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: 'トリガー条件', + keyword_filter: 'キーワードフィルター', + regex_filter: '正規表現フィルター', + min_length: '最小長', + max_length: '最大長', + require_mention: 'メンション必須', + respond_rules: 'グループ応答ルール', + access_control: 'アクセス制御', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'Cron式', + timezone: 'タイムゾーン', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', + path: 'Webhookパス', + allowed_methods: '許可されたHTTPメソッド', content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + auth_type: '認証タイプ', + auth_key: '認証キー', + validation: 'リクエスト検証', + timeout: 'タイムアウト', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: 'イベントタイプ', + filter: 'イベントフィルター', + debounce_ms: 'デバウンス時間', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', + model: 'モデル', + prompt_template: 'プロンプトテンプレート', + system_prompt: 'システムプロンプト', temperature: 'Temperature', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: '頻度ペナルティ', + presence_penalty: '存在ペナルティ', + max_tokens: '最大トークン数', + stop_sequences: '停止シーケンス', + seed: 'ランダムシード', + stream: 'ストリーム出力', + use_conversation_history: '会話履歴を使用', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: 'プログラミング言語', + code: 'コード', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: 'リクエストURL', + method: 'リクエストメソッド', + auth_config: '認証設定', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: '変換タイプ', + template: 'テンプレート', + expression: '式', + output_type: '出力タイプ', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: 'カテゴリ', + instruction: '指示', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: 'パラメータ定義', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: 'ナレッジベース', + top_k: '返却数', + score_threshold: '類似度閾値', + search_method: '検索方法', + enable_citations: '引用を有効化', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: '条件タイプ', + condition_expression: '条件式', + left_value: '左辺値', + operator: '比較演算子', + right_value: '右辺値', // control.py - SwitchNode - cases: 'Branch Cases', + cases: '分岐条件', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: '最大反復回数', + break_condition: '中断条件', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: '並列処理', + max_concurrency: '最大並行数', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: '分岐設定', + wait_all: 'すべて待機', + fail_fast: '高速失敗', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: '待機時間', + duration_type: '時間単位', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: 'マージ戦略', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: '変数マッピング', + aggregation_mode: '集約モード', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: 'ターゲットタイプ', + target_id: 'ターゲットID', + platform: 'プラットフォーム', + message_type: 'メッセージタイプ', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: '返信モード', + message_template: 'メッセージテンプレート', + long_text_processing: '長文処理', + force_delay: '強制遅延', // action.py - CallPipelineNode pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + inherit_context: 'コンテキストを継承', // action.py - StoreDataNode - storage_type: 'Storage Type', - ttl: 'TTL', - key_prefix: 'Key Prefix', + storage_type: 'ストレージタイプ', + ttl: '有効期限', + key_prefix: 'キープレフィックス', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: '変数名', + variable_scope: '変数スコープ', + set_variable_operation: '操作タイプ', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: '開始文', + suggested_questions: '提案質問', + show_suggestions: '提案を表示', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: '出力形式', + success_message: '成功メッセージ', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: 'データベースタイプ', + connection_string: '接続文字列', + query: 'SQLクエリ', + query_type: 'クエリタイプ', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: '接続URL', + operation: '操作タイプ', + key_template: 'キーテンプレート', + hash_field: 'ハッシュフィールド', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: 'サーバー名', + tool_name: 'ツール名', + arguments_template: '引数テンプレート', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: 'スコープ', // integration.py - DifyWorkflowNode - 'base-url': 'Base URL', - 'api-key': 'API Key', - 'app-type': 'App Type', + 'base-url': 'ベースURL', + 'api-key': 'APIキー', + 'app-type': 'アプリタイプ', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: 'データセットID', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode - 'flow-id': 'Flow ID', + 'flow-id': 'フローID', // integration.py - CozeBotNode - 'bot-id': 'Bot ID', - 'api-base': 'API Base URL', + 'bot-id': 'ボットID', + 'api-base': 'APIベースURL', }, // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: 'メッセージ内容', + sender_id: '送信者ID', + sender_name: '送信者名', + platform: 'プラットフォーム', + conversation_id: '会話ID', + is_group: 'グループチャットかどうか', + context: '完全なメッセージコンテキスト', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: 'トリガー時刻', + schedule: 'トリガースケジュール', + cron_timestamp: 'Cronタイムスタンプ', + cron_schedule: 'Cronスケジュール', + cron_context: 'Cronコンテキスト', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: 'リクエストボディ', + headers: 'リクエストヘッダー', + query: 'クエリパラメータ', + method: 'リクエストメソッド', + webhook_body: 'Webhookボディ', + webhook_headers: 'Webhookヘッダー', + webhook_query: 'Webhookクエリ', + webhook_method: 'Webhookメソッド', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: 'イベントタイプ', + event_data: 'イベントデータ', + event_timestamp: 'イベントタイムスタンプ', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: 'モデル応答', + usage: 'トークン使用統計', + prompt: 'プロンプト/質問', + context_info: 'コンテキスト情報', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: '出力データ', + console: 'コンソール出力', + code_input: 'コード入力', + code_output: 'コード出力', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: 'ステータスコード', + http_body: 'HTTPボディ', + http_headers: 'HTTPヘッダー', + http_response: 'HTTP応答', + response_headers: '応答ヘッダー', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: '変換結果', + transform_input: '変換入力', + transform_result: '変換結果', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: 'カテゴリ結果', + confidence: '信頼度', + all_scores: 'すべてのカテゴリスコア', + question: 'ユーザーの質問', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: '抽出されたパラメータ', + extraction_success: '抽出成功', + extract_text: '入力テキスト', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: '検索されたドキュメント', + citations: '引用情報', + knowledge_context: 'マージされたコンテキスト', + knowledge_query: '検索クエリ', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: '真の分岐出力', + false: '偽の分岐出力', + condition_input: '条件入力', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: 'マッチした分岐出力', + default: 'デフォルト分岐出力', + switch_input: 'スイッチ入力', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: '現在のアイテム', + index: '現在のインデックス', + results: 'すべての反復結果', + completed: '完了したかどうか', + loop_items: '反復するアイテム', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: '最初かどうか', + is_last: '最後かどうか', + iterator_array: '入力配列', + iterator_item: '現在の要素', + iterator_index: '現在のインデックス', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: 'エラーリスト', + parallel_input: '並列入力', + parallel_results: 'すべての分岐結果', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: 'パススルー入力', + wait_output: 'パススルー出力', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: 'マージされた結果', + merge_array: '配列結果', + merge_input_1: '入力1', + merge_input_2: '入力2', + merge_input_3: '入力3', + merge_input_4: '入力4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: '集約された変数', + aggregator_variables: '変数入力', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: '送信ステータス', + message_id: 'メッセージID', + target: 'ターゲットID', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: '返信内容', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: 'Pipeline応答', + pipeline_result: '完全な結果', + pipeline_query: 'クエリ内容', + context_data: 'コンテキストデータ', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: '保存ステータス', + store_key: '保存キー', + store_value: '保存値', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: '変数値', + variable_result: '変数設定結果', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: '開始文', + suggested_questions: '提案質問', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: 'ワークフロー出力', + final_result: '最終結果', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: 'クエリ結果', + row_count: '影響を受けた/返された行数', + query_success: 'クエリ成功', + query_params: 'クエリパラメータ', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: '操作結果', + redis_success: '操作成功', + redis_key: 'Redisキー', + redis_value: 'Redis値', + error: 'エラーメッセージ', + plugin_input: 'プラグイン入力', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: 'ツール実行結果', + tool_success: 'ツール呼び出し成功', + mcp_arguments: 'ツール引数', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: '取得/保存された値', + memory_success: '操作成功', + memory_value: '保存する値', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'Dify回答', + dify_success: '呼び出し成功', + dify_query: 'ユーザー入力/クエリ', + dify_conversation_id: '会話ID', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: '検索結果', + knowledge_base_query: 'クエリ内容', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: 'ワークフロー実行結果', + n8n_success: '呼び出し成功', + n8n_payload: 'ワークフロー入力データ', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: 'フロー実行結果', + flow_success: '呼び出し成功', + langflow_input: '入力内容', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: 'ボット返信', + bot_success: '呼び出し成功', + coze_query: 'ユーザー入力/クエリ', + coze_conversation_id: '会話ID', + bot_conversation_id: '会話ID', + sender: '送信者', + event: 'イベント', + trigger_time: 'トリガー時刻', + scores: 'スコア', + missing: '不足パラメータ', + parsed: '解析結果', + chunks: 'テキストチャンク', + count: 'カウント', + execution_id: '実行ID', + suggestions: '提案', + embedding: '埋め込みベクトル', + dimensions: 'ベクトル次元', + intent: '意図', + entities: 'エンティティ', }, }, diff --git a/web/src/i18n/locales/ru-RU.ts b/web/src/i18n/locales/ru-RU.ts index 1395331a..ccc8efe2 100644 --- a/web/src/i18n/locales/ru-RU.ts +++ b/web/src/i18n/locales/ru-RU.ts @@ -60,6 +60,8 @@ const ruRU = { deleteError: 'Ошибка удаления: ', addRound: 'Добавить раунд', copy: 'Копировать', + undo: 'Отменить', + redo: 'Повторить', copySuccess: 'Скопировано', copyFailed: 'Ошибка копирования', test: 'Тест', @@ -1343,183 +1345,185 @@ const ruRU = { }, }, workflows: { - title: 'Workflows', + title: 'Рабочие процессы', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', - editor: 'Editor', - debugChat: 'Отладочный чат', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + 'Создание и управление визуальными рабочими процессами для реализации сложной логики обработки сообщений', + createWorkflow: 'Создать рабочий процесс', + selectFromSidebar: 'Выберите рабочий процесс из боковой панели', + editWorkflow: 'Редактировать рабочий процесс', + newWorkflow: 'Новый рабочий процесс', + getWorkflowListError: 'Ошибка получения списка рабочих процессов: ', + workflowName: 'Название рабочего процесса', + workflowDescription: 'Описание рабочего процесса', + workflowNameRequired: 'Название рабочего процесса не может быть пустым', + defaultDescription: 'Рабочий процесс', + getWorkflowError: 'Ошибка получения рабочего процесса: ', + loadError: 'Ошибка загрузки рабочего процесса', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения: ', + createSuccess: 'Рабочий процесс успешно создан', + createError: 'Ошибка создания: ', + deleteSuccess: 'Успешно удалено', + deleteError: 'Ошибка удаления: ', + deleteConfirmation: 'Вы уверены, что хотите удалить этот рабочий процесс?', + copySuccess: 'Успешно скопировано', + copyError: 'Не удалось скопировать:', + export: 'Экспорт', + import: 'Импорт', + exportSuccess: 'Рабочий процесс экспортирован', + importSuccess: 'Рабочий процесс импортирован', + importError: 'Не удалось импортировать: недопустимый формат файла', + publish: 'Опубликовать', + publishSuccess: 'Успешно опубликовано', + publishError: 'Не удалось опубликовать', + configuration: 'Конфигурация', + executions: 'Записи выполнения', + editor: 'Редактор', + debugChat: 'ДиалогОтладка', + basicInfo: 'Основная информация', + basicInfoDesc: 'Настроить название, значок и описание рабочего процесса', + basicInfoDescription: 'Настроить название и описание рабочего процесса', + dangerZone: 'Опасная зона', + dangerZoneDesc: 'Необратимые операции', + dangerZoneDescription: 'Необратимые операции', + deleteWorkflowAction: 'Удалить этот рабочий процесс', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + 'После удаления все связанные конфигурации будут удалены навсегда и не могут быть восстановлены.', + deleteWorkflow: 'УдалитьРабочий Процесс', + deleteConfirm: 'ПодтвердитьУдалить', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + 'Вы уверены, что хотите удалить рабочий процесс "{{name}}"? Эту операцию нельзя отменить.', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: 'Название', + namePlaceholder: 'ВходРабочий ПроцессНазвание', + descriptionPlaceholder: 'Введите описание рабочего процесса (необязательно)', + enabled: 'Включить', + enabledDesc: 'После включения рабочий процесс может быть запущен для выполнения', + loading: 'Загрузка...', + info: 'Рабочий ПроцессИнформация', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: 'Версия', + createdAt: 'Дата создания', + updatedAt: 'Дата обновления', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', - error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', + totalExecutions: 'Всего {{count}} записей выполнения', + statistics: 'Статистический анализ', + successfulCount: '{{count}} успешных', + successRate: 'Процент успеха', + averageDuration: 'Средняя длительность', + perExecution: 'За выполнение', + failedExecutions: 'Количество неудач', + lastExecution: 'Последнее выполнение', + filterByStatus: 'Фильтр по статусу', + allStatuses: 'Все статусы', + manualTrigger: 'Ручной запуск', + executionId: 'Выполнить ID', + status: 'Статус', + triggerType: 'Тип триггера', + startedAt: 'Время начала', + duration: 'Время ожидания', + noExecutions: 'Нет записей выполнения', + executionDetails: 'Детали выполнения', + error: 'Ошибка', + nodeExecutions: 'Записи выполнения узлов', + result: 'Результат', 'status.pending': 'Pending', 'status.running': 'Running', 'status.completed': 'Completed', 'status.failed': 'Failed', 'status.cancelled': 'Cancelled', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: 'Панель узлов', + properties: 'Свойства', + zoomIn: 'Увеличить', + zoomOut: 'Уменьшить', + fitView: 'Подогнать вид', + unsavedChanges: 'Есть несохраненные изменения', + paste: 'Вставить', + deleted: 'Удалено', + nothingToCopy: 'Нет выбранных узлов для копирования', + nothingToPaste: 'Буфер обмена пуст', + copied: 'Скопировано {{count}} узлов', + pasted: 'Вставлено {{count}} узлов', + nodesSelected: 'Выбрано {{count}} узлов', + edgesSelected: 'Выбрано {{count}} соединений', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: 'Поиск узлов...', + loadingNodeTypes: 'Загрузка типов узлов...', + noNodesFound: 'Совпадающие узлы не найдены', + clearSearch: 'Очистить поиск', + dragToAdd: 'Перетащите узел на холст для добавления', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: 'Выберите узел или соединение', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + 'Нажмите на узел или соединение на холсте для просмотра и редактирования его свойств', + edgeProperties: 'Свойства соединения', + nodeProperties: 'Свойства узла', + condition: 'Условная ветвь', + hasCondition: 'Настроено', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + 'Введите условное выражение, например: output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', - platform: 'Platform', - sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + 'Если условие пусто, это соединение будет всегда выполняться. Поддерживается использование {{имя_переменной}} для ссылки на контекстные переменные.', + deleteEdge: 'Удалить соединение', + deleteEdgeConfirm: 'Вы уверены, что хотите удалить это соединение?', + deleteEdgeConfirmDesc: 'После удаления это соединение будет удалено навсегда.', + nodeLabel: 'Название узла', + nodeLabelPlaceholder: 'Введите отображаемое название узла', + nodeId: 'Узел ID', + inputOutputVariables: 'Вход/ВыходПеременная', + inputs: 'Вход', + outputs: 'Выход', + availableVariables: 'Доступные переменные', + globalVariables: 'Глобальные переменные', + messageContent: 'Симулированное сообщение', + messageSender: 'Отправитель', + platform: 'Платформа', + sessionId: 'Сессия ID', + timestamp: 'Временная метка', + nodeConfig: 'Конфигурация узла', + noConfigOptions: 'Для этого типа узла пока нет параметров конфигурации', + deleteNode: 'Удалить узел', + deleteNodeConfirm: 'Вы уверены, что хотите удалить этот узел?', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + 'После удаления этот узел и все его соединения будут удалены навсегда.', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: 'Вход', + message: 'Сообщение', + text: 'Текст', + query: 'SQLЗапрос', + data: 'Данные', + condition: 'Условная ветвь', + value: 'Значение', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: 'Содержимое', + context: 'Контекст отладки', + body: 'Тело запроса', + variables: 'Отслеживаемые переменные', + items: 'Список элементов', + arguments: 'Параметр', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: 'Вопрос пользователя', + parameters: 'Определение параметров', + key: 'Ключ', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: 'Ветвь 1', + case_2: 'Ветвь 2', + branch_1: 'Выход ветви 1', + branch_2: 'Выход ветви 2', // Action inputs - notification_id: 'Notification ID', + notification_id: 'УведомлениеID', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: 'Шаблон ключа', + hash_field: 'Поле хеша', + server_name: 'Имя сервера', + tool_name: 'Имя инструмента', + arguments_template: 'Шаблон параметров', + scope: 'Область', + payload: 'Полезная нагрузка', + input_value: 'ВходЗначение', }, // Data type labels 'type.string': 'String', @@ -1530,377 +1534,377 @@ const ruRU = { 'type.any': 'Any', 'type.datetime': 'DateTime', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: 'Триггер', + triggerDescription: 'Начальный узел рабочего процесса', + messageTrigger: 'Триггер сообщения', + messageTriggerDescription: 'Срабатывает при получении сообщения', + scheduleTrigger: 'Триггер по расписанию', + scheduleTriggerDescription: 'Срабатывает по расписанию', + cronTrigger: 'Триггер Cron', + cronTriggerDescription: 'Запускает рабочий процесс по расписанию Cron', + webhookTrigger: 'Триггер Webhook', + webhookTriggerDescription: 'Срабатывает через HTTP-запрос', + eventTrigger: 'Триггер события', + eventTriggerDescription: 'Срабатывает при возникновении системного события', + process: 'ИИ/Обработка', + processDescription: 'Узел обработки данных', + aiProcess: 'Обработка ИИ', + aiProcessDescription: 'Обработка сообщений с помощью модели ИИ', + llmCall: 'Вызов LLM', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + 'Вызов большой языковой модели для диалога или генерации', + codeProcess: 'Обработка кода', + codeProcessDescription: 'Выполнение пользовательского кода', + codeExecutor: 'Исполнитель кода', + codeExecutorDescription: 'Выполнение кода Python/JavaScript', + templateProcess: 'Обработка шаблона', + templateProcessDescription: 'Форматирование вывода с помощью шаблона', + httpRequest: 'HTTP-запрос', + httpRequestDescription: 'Отправка HTTP-запроса', + dataTransform: 'Преобразование данных', + dataTransformDescription: 'Преобразование формата данных', + questionClassifier: 'Классификатор вопросов', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + 'Классификация вопросов пользователя в предопределённые категории с помощью LLM', + parameterExtractor: 'Извлечение параметров', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + 'Извлечение структурированных параметров из текста с помощью LLM', + knowledgeRetrieval: 'Поиск в базе знаний', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + 'Извлечение релевантного содержимого из базы знаний', + textTemplate: 'Текстовый шаблон', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + 'Генерация текста с помощью шаблона', + jsonTransform: 'Преобразование JSON', + jsonTransformDescription: 'Преобразование данных JSON', + dataAggregator: 'Агрегация данных', + dataAggregatorDescription: 'Агрегация нескольких источников данных', + textSplitter: 'Разделение текста', + textSplitterDescription: 'Разделение текста на фрагменты', + variableAssignment: 'Присвоение переменной', + variableAssignmentDescription: 'Присвоение значения переменной рабочего процесса', + control: 'Поток управления', + controlDescription: 'Узел управления потоком', + condition: 'Условная ветвь', + conditionDescription: 'Разветвление по условию', + switch: 'Множественная ветвь', + switchDescription: 'Выбор из нескольких условных ветвей', + loop: 'Цикл', + loopDescription: 'Повторное выполнение', + iterator: 'Итератор', + iteratorDescription: 'Обход элементов массива', + parallel: 'Параллельная обработка', + parallelDescription: 'Параллельное выполнение нескольких ветвей', + wait: 'Ожидание', + waitDescription: 'Ожидание указанного времени', + delay: 'Задержка', + delayDescription: 'Ожидание указанного времени', + merge: 'Слияние', + mergeDescription: 'Слияние нескольких ветвей', + variableAggregator: 'Агрегатор переменных', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + 'Агрегация выходных переменных из нескольких ветвей', + action: 'Действие', + actionDescription: 'Узел выполнения действия', + sendMessage: 'Отправка сообщения', + sendMessageDescription: 'Отправка сообщения на платформу', + replyMessage: 'Ответ на сообщение', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + 'Ответ на сообщение, запустившее рабочий процесс', + storeData: 'Сохранение данных', + storeDataDescription: 'Сохранение данных в базу данных', + callPipeline: 'Вызов Pipeline', + callPipelineDescription: 'Вызов существующего Pipeline', + setVariable: 'Установка переменной', + setVariableDescription: 'Установка контекстной переменной', + openingStatement: 'Вступительное заявление', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', - cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + 'Предоставление вступительного заявления и предлагаемых вопросов', + end: 'Конец', + endDescription: 'Отметка завершения выполнения рабочего процесса', + log: 'Журнал', + logDescription: 'Запись информации в журнал', + integration: 'Интеграция', + integrationDescription: 'Узел интеграции со сторонними платформами', + difyWorkflow: 'Рабочий процесс Dify', + difyWorkflowDescription: 'Вызов рабочего процесса платформы Dify', + difyKnowledgeQuery: 'База знаний Dify', + difyKnowledgeQueryDescription: 'Запрос к базе знаний Dify', + n8nWorkflow: 'Рабочий процесс n8n', + n8nWorkflowDescription: 'Вызов рабочего процесса n8n', + langflowFlow: 'Поток Langflow', + langflowFlowDescription: 'Вызов потока Langflow', + cozeBot: 'Бот Coze', + cozeBotDescription: 'Вызов бота Coze', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: 'Запрос к базе данных', + databaseQueryDescription: 'Выполнение запроса к базе данных', + redisOperation: 'Операция Redis', + redisOperationDescription: 'Выполнение операции кэширования Redis', + mcpTool: 'Инструмент MCP', + mcpToolDescription: 'Вызов инструмента MCP', + memoryStore: 'Хранилище памяти', + memoryStoreDescription: 'Сохранение и извлечение данных из памяти рабочего процесса', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: 'Диалог Рабочего Процесса', + noExecutions: 'Нет записей выполнения', + status: 'Статус', + startTime: 'Время начала', + duration: 'Время ожидания', + running: 'Выполняется', + completed: 'Завершено', + failed: 'не удалось', + cancelled: 'Отменено', + viewDetails: 'Просмотр деталей', + cancel: 'ОтменаВыполнить', + retry: 'Повторить', + nodeResults: 'Результаты выполнения узлов', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: 'Диалог Рабочего Процесса', + current: 'Текущая версия', + rollback: 'Откатить к этой версии', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + 'Вы уверены, что хотите откатить к этой версии? Текущие изменения будут потеряны.', + rollbackSuccess: 'Откат выполнен успешно', + rollbackError: 'Откат не удался:', }, // Debug and monitoring debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', - conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + debugMode: 'Режим отладки', + debugPanel: 'Панель отладки', + startDebug: 'Начать отладку', + pauseDebug: 'Приостановить', + resumeDebug: 'Продолжить', + stepDebug: 'Пошаговое выполнение', + stopDebug: 'Остановить', + debugContext: 'Контекст отладки', + simulatedMessage: 'Симулированное сообщение', + simulatedMessagePlaceholder: 'Введите содержимое симулированного сообщения', + senderId: 'ID отправителя', + senderIdPlaceholder: 'Уникальный идентификатор отправителя', + senderName: 'Имя отправителя', + senderNamePlaceholder: 'Отображаемое имя отправителя', + conversationId: 'ID сессии', + conversationIdPlaceholder: 'Уникальный идентификатор сессии', + isGroup: 'Групповой чат', + customVariables: 'Пользовательские переменные', + addVariable: 'Добавить переменную', + variableName: 'Имя переменной', + variableValue: 'Значение переменной', + watchedVariables: 'Отслеживаемые переменные', + addWatchVariable: 'Добавить отслеживание', + nodeStates: 'Состояния узлов', + breakpoints: 'Точки останова', + toggleBreakpoint: 'Переключить точку останова', + breakpointSet: 'Точка останова установлена', + breakpointRemoved: 'Точка останова удалена', + debugLogs: 'Журналы отладки', + noLogs: 'Журналов пока нет', + clearLogs: 'Очистить журналы', + autoScroll: 'Автопрокрутка', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', - error: 'Error', + idle: 'Простой', + running: 'Выполняется', + paused: 'Приостановлено', + completed: 'Завершено', + error: 'Ошибка', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: 'Ожидание', + running: 'Выполняется', + completed: 'Завершено', + failed: 'не удалось', + skipped: 'Пропущено', }, debugDialog: { - title: 'Workflow Chat', - selectWorkflow: 'Select Workflow', - sessionType: 'Session Type', - privateChat: 'Private Chat', - groupChat: 'Group Chat', - send: 'Send', - reset: 'Reset Conversation', - inputPlaceholder: 'Send {{type}} message...', - noMessages: 'No messages', - userMessage: 'User', - botMessage: 'Bot', - sendFailed: 'Send failed', - resetSuccess: 'Conversation reset successfully', - resetFailed: 'Reset failed', - loadMessagesFailed: 'Failed to load messages', - loadWorkflowsFailed: 'Failed to load workflows', - atTips: 'Mention bot', - streaming: 'Streaming', - streamOutput: 'Stream', - connected: 'WebSocket connected', - disconnected: 'WebSocket disconnected', - connectionError: 'WebSocket connection error', - connectionFailed: 'WebSocket connection failed', - notConnected: 'WebSocket not connected, please try again later', - imageUploadFailed: 'Image upload failed', - reply: 'Reply', - replyTo: 'Reply to', - showMarkdown: 'Render', - showRaw: 'Raw', - allMembers: 'All Members', - file: 'File', - voice: 'Voice', - uploadImage: 'Upload Image', - uploading: 'Uploading...', + title: 'Диалог Рабочего Процесса', + selectWorkflow: 'Выберите рабочий процесс', + sessionType: 'Тип сессии', + privateChat: 'Личный чат', + groupChat: 'Групповой чат', + send: 'Отправить', + reset: 'Сбросить диалог', + inputPlaceholder: 'Отправить {{type}} сообщение...', + noMessages: 'Сообщений пока нет', + userMessage: 'Пользователь', + botMessage: 'Бот', + sendFailed: 'Не удалось отправить', + resetSuccess: 'Диалог сброшен', + resetFailed: 'Не удалось сбросить', + loadMessagesFailed: 'Не удалось загрузить сообщения', + loadWorkflowsFailed: 'Не удалось загрузить рабочие процессы', + atTips: 'Упомянуть бота', + streaming: 'Потоковая передача', + streamOutput: 'Потоковый', + connected: 'WebSocket подключен', + disconnected: 'WebSocket не подключен', + connectionError: 'Ошибка подключения WebSocket', + connectionFailed: 'Не удалось подключиться к WebSocket', + notConnected: 'WebSocket не подключен, пожалуйста, повторите позже', + imageUploadFailed: 'Не удалось загрузить изображение', + reply: 'Ответить', + replyTo: 'Ответить на', + showMarkdown: 'Рендеринг', + showRaw: 'Исходный текст', + allMembers: 'Все участники', + file: 'Файл', + voice: 'Голос', + uploadImage: 'Загрузить изображение', + uploading: 'Загрузка...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: 'Фильтр по дате', + allTime: 'Все время', + today: 'Сегодня', + lastWeek: 'Последняя неделя', + lastMonth: 'Последний месяц', + showingExecutions: 'Показано {{shown}} / {{total}} записей', + rerun: 'Перезапустить', + rerunExecution: 'Повторить выполнение', + logs: 'Журнал', + details: 'Детали', + completedAt: 'Время завершения', + noNodeExecutions: 'Записей выполнения узлов пока нет', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: 'Условия триггера', + keyword_filter: 'Фильтр по ключевым словам', + regex_filter: 'Фильтр по регулярному выражению', + min_length: 'МинимумДлина', + max_length: 'МаксимумДлина', + require_mention: 'Требуется упоминание бота', + respond_rules: 'Правила ответа в группе', + access_control: 'Контроль доступа', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'Выражение Cron', + timezone: 'Часовой пояс', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', + path: 'Путь Webhook', + allowed_methods: 'Разрешенные HTTP методы', content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + auth_type: 'Тип аутентификации', + auth_key: 'Ключ аутентификации', + validation: 'Проверка запроса', + timeout: 'Время тайм-аута', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: 'Тип события', + filter: 'Фильтр событий', + debounce_ms: 'Время устранения дребезга', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', - temperature: 'Temperature', + model: 'Модель', + prompt_template: 'Шаблон промпта', + system_prompt: 'Системный промпт', + temperature: 'Температура', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: 'Штраф за частоту', + presence_penalty: 'Штраф за присутствие', + max_tokens: 'Максимум токенов', + stop_sequences: 'Последовательности остановки', + seed: 'Случайное зерно', + stream: 'Потоковый вывод', + use_conversation_history: 'Использовать историю диалога', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: 'Язык программирования', + code: 'Код', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: 'URL запроса', + method: 'Метод запроса', + auth_config: 'Конфигурация аутентификации', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: 'Тип преобразования', + template: 'Шаблон', + expression: 'Выражение', + output_type: 'ВыходТип', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: 'Категории', + instruction: 'Инструкция', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: 'Определение параметров', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: 'Базы знаний', + top_k: 'Количество возвращаемых', + score_threshold: 'Порог схожести', + search_method: 'Метод поиска', + enable_citations: 'Включить цитирование', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: 'Тип условия', + condition_expression: 'Условное выражение', + left_value: 'Левое значение', + operator: 'Оператор сравнения', + right_value: 'Правое значение', // control.py - SwitchNode - cases: 'Branch Cases', + cases: 'Условия ветвей', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: 'Максимум итераций', + break_condition: 'Условие прерывания', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: 'Параллельная обработка', + max_concurrency: 'Максимум параллельных потоков', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: 'Конфигурация ветвей', + wait_all: 'Ждать все', + fail_fast: 'Быстрый отказ', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: 'Время ожидания', + duration_type: 'Единица времени', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: 'Стратегия объединения', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: 'Сопоставление переменных', + aggregation_mode: 'Режим агрегации', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: 'Тип цели', + target_id: 'ID цели', + platform: 'Платформа', + message_type: 'СообщениеТип', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: 'Режим ответа', + message_template: 'Шаблон сообщения', + long_text_processing: 'Обработка длинного текста', + force_delay: 'Принудительная задержка', // action.py - CallPipelineNode - pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + pipeline_uuid: 'Конвейер', + inherit_context: 'Наследовать контекст', // action.py - StoreDataNode - storage_type: 'Storage Type', - ttl: 'TTL', - key_prefix: 'Key Prefix', + storage_type: 'Тип хранилища', + ttl: 'Время истечения', + key_prefix: 'Префикс ключа', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: 'Имя переменной', + variable_scope: 'Область видимости переменной', + set_variable_operation: 'Тип операции', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: 'Вступительное Заявление', + suggested_questions: 'Предлагаемые вопросы', + show_suggestions: 'Показать предложения', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: 'Формат вывода', + success_message: 'Сообщение об успехе', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: 'Тип базы данных', + connection_string: 'Строка подключения', + query: 'SQL запрос', + query_type: 'Тип запроса', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: 'URL подключения', + operation: 'Тип операции', + key_template: 'Шаблон ключа', + hash_field: 'Поле хеша', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: 'Имя сервера', + tool_name: 'Имя инструмента', + arguments_template: 'Шаблон параметров', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: 'Область', // integration.py - DifyWorkflowNode 'base-url': 'Base URL', 'api-key': 'API Key', 'app-type': 'App Type', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: 'ID базы знаний', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode @@ -1912,169 +1916,183 @@ const ruRU = { // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: 'Сообщение', + sender_id: 'ID отправителя', + sender_name: 'Имя отправителя', + platform: 'Платформа', + conversation_id: 'Сессия ID', + is_group: 'Групповой чат', + context: 'Контекст отладки', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: 'Временная метка', + schedule: 'Расписание', + cron_timestamp: 'Временная метка Cron', + cron_schedule: 'Cron Выражение расписания', + cron_context: 'Cron Контекст', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: 'Тело запроса', + headers: 'Заголовки', + query: 'SQL запрос', + method: 'Метод запроса', + webhook_body: 'Тело запроса Webhook', + webhook_headers: 'Заголовки Webhook', + webhook_query: 'Параметры запроса Webhook', + webhook_method: 'Метод Webhook', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: 'Тип события', + event_data: 'СобытиеДанные', + event_timestamp: 'Временная метка события', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: 'Ответ', + usage: 'Статистика использования токенов', + prompt: 'Промпт/вопрос', + context_info: 'Контекстная информация', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: 'Выход', + console: 'Вывод консоли', + code_input: 'Ввод кода', + code_output: 'Вывод кода', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: 'Код состояния', + http_body: 'Тело HTTP запроса', + http_headers: 'Заголовки HTTP', + http_response: 'HTTP Ответ', + response_headers: 'Заголовки ответа', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: 'Результат', + transform_input: 'Ввод преобразования', + transform_result: 'Результат преобразования', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: 'Результат категории', + confidence: 'Достоверность', + all_scores: 'Все оценки', + question: 'ПользовательВопрос', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: 'Определение параметров', + extraction_success: 'Извлечение успешно', + extract_text: 'Входной текст', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: 'Извлеченные документы', + citations: 'Информация о цитировании', + knowledge_context: 'Объединенный контекст', + knowledge_query: 'Поисковый запрос', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: 'Выход при истинном условии', + false: 'Выход при ложном условии', + condition_input: 'Входное условие', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: 'Совпавшая ветвь', + default: 'Ветвь по умолчанию', + switch_input: 'Входные данные переключателя', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: 'Текущий элемент', + index: 'Текущий индекс', + results: 'Результат', + completed: 'Завершено', + loop_items: 'Элементы итерации', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: 'Это первый?', + is_last: 'Это последний?', + iterator_array: 'Входной массив', + iterator_item: 'Текущий элемент', + iterator_index: 'Текущий индекс', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: 'ОшибкаСписок', + parallel_input: 'Параллельный ввод', + parallel_results: 'Результаты всех ветвей', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: 'Прозрачный вход', + wait_output: 'Прозрачный выход', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: 'Объединенный результат', + merge_array: 'Результат массива', + merge_input_1: 'Вход 1', + merge_input_2: 'Вход 2', + merge_input_3: 'Вход 3', + merge_input_4: 'Вход 4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: 'Агрегированные переменные', + aggregator_variables: 'ПеременнаяВход', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: 'Статус', + message_id: 'СообщениеID', + target: 'ID цели', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: 'Содержимое ответа', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: 'Pipeline Ответ', + pipeline_result: 'Полный результат', + pipeline_query: 'Содержимое запроса', + context_data: 'Контекстные данные', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: 'Статус хранения', + store_key: 'Ключ хранения', + store_value: 'Сохраненное значение', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: 'Значение переменной', + variable_result: 'Результат установки переменной', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: 'Вступительное Заявление', + suggested_questions: 'Предлагаемые вопросы', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: 'Выход рабочего процесса', + final_result: 'Финальный результат', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: 'Результаты запроса', + row_count: 'Количество строк', + query_success: 'Запрос успешен', + query_params: 'Параметры запроса', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: 'RedisРезультат', + redis_success: 'RedisУспех', + redis_key: 'Redis Ключ', + redis_value: 'Redis Значение', + error: 'Ошибка', + plugin_input: 'Вход плагина', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: 'Результат инструмента', + tool_success: 'Инструмент успешен', + mcp_arguments: 'Параметры инструмента', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: 'Результат памяти', + memory_success: 'Память успешна', + memory_value: 'Сохраненное значение', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'Ответ', + dify_success: 'DifyУспех', + dify_query: 'Вход пользователя/запрос', + dify_conversation_id: 'Сессия ID', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: 'Результаты поиска', + knowledge_base_query: 'Содержимое запроса', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: 'N8nРезультат', + n8n_success: 'N8nУспех', + n8n_payload: 'Входные данные рабочего процесса', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: 'Результат потока', + flow_success: 'Поток успешен', + langflow_input: 'Входное содержимое', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: 'Ответ бота', + bot_success: 'Бот успешен', + coze_query: 'Вход пользователя/запрос', + coze_conversation_id: 'Сессия ID', + bot_conversation_id: 'Сессия ID', + sender: 'Отправитель', + event: 'Событие', + trigger_time: 'Время триггера', + scores: 'Оценки', + missing: 'Отсутствующие параметры', + parsed: 'Результат разбора', + chunks: 'Текстовые блоки', + count: 'Количество', + execution_id: 'ID выполнения', + suggestions: 'Предлагаемые вопросы', + embedding: 'Вектор', + dimensions: 'Размерности', + intent: 'Намерение', + entities: 'Сущности', }, }, diff --git a/web/src/i18n/locales/th-TH.ts b/web/src/i18n/locales/th-TH.ts index ea4ecb0c..deb4a072 100644 --- a/web/src/i18n/locales/th-TH.ts +++ b/web/src/i18n/locales/th-TH.ts @@ -59,6 +59,8 @@ const thTH = { deleteError: 'ลบล้มเหลว: ', addRound: 'เพิ่มรอบ', copy: 'คัดลอก', + undo: 'เลิกทำ', + redo: 'ทำซ้ำ', copySuccess: 'คัดลอกสำเร็จ', copyFailed: 'คัดลอกล้มเหลว', test: 'ทดสอบ', @@ -1312,183 +1314,185 @@ const thTH = { }, }, workflows: { - title: 'Workflows', + title: 'การสนทนาเวิร์กโฟลว์', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', - editor: 'Editor', - debugChat: 'แชทดีบัก', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + 'สร้างและจัดการเวิร์กโฟลว์อัตโนมัติสำหรับบอทของคุณ', + createWorkflow: 'สร้างเวิร์กโฟลว์', + selectFromSidebar: 'เลือกเวิร์กโฟลว์จากแถบด้านข้าง', + editWorkflow: 'แก้ไขเวิร์กโฟลว์', + newWorkflow: 'เวิร์กโฟลว์ใหม่', + getWorkflowListError: 'ไม่สามารถรับรายการเวิร์กโฟลว์:', + workflowName: 'ชื่อเวิร์กโฟลว์', + workflowDescription: 'คำอธิบายเวิร์กโฟลว์', + workflowNameRequired: 'ชื่อเวิร์กโฟลว์ไม่สามารถว่างเปล่า', + defaultDescription: 'เวิร์กโฟลว์', + getWorkflowError: 'ไม่สามารถรับเวิร์กโฟลว์:', + loadError: 'ไม่สามารถโหลดเวิร์กโฟลว์', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'ไม่สามารถบันทึก:', + createSuccess: 'สร้างเวิร์กโฟลว์สำเร็จ', + createError: 'ไม่สามารถสร้าง:', + deleteSuccess: 'ลบสำเร็จ', + deleteError: 'ไม่สามารถลบ:', + deleteConfirmation: 'คุณแน่ใจหรือไม่ว่าต้องการลบเวิร์กโฟลว์นี้?', + copySuccess: 'คัดลอกสำเร็จ', + copyError: 'คัดลอกล้มเหลว:', + export: 'ส่งออก', + import: 'นำเข้า', + exportSuccess: 'ส่งออกเวิร์กโฟลว์แล้ว', + importSuccess: 'นำเข้าเวิร์กโฟลว์แล้ว', + importError: 'นำเข้าล้มเหลว: รูปแบบไฟล์ไม่ถูกต้อง', + publish: 'เผยแพร่', + publishSuccess: 'เผยแพร่สำเร็จ', + publishError: 'เผยแพร่ล้มเหลว', + configuration: 'การกำหนดค่า', + executions: 'บันทึกการดำเนินการ', + editor: 'ตัวแก้ไข', + debugChat: 'การสนทนาดีบัก', + basicInfo: 'ข้อมูลพื้นฐาน', + basicInfoDesc: 'ตั้งค่าชื่อ ไอคอน และคำอธิบายเวิร์กโฟลว์', + basicInfoDescription: 'ตั้งค่าชื่อและคำอธิบายเวิร์กโฟลว์', + dangerZone: 'พื้นที่อันตราย', + dangerZoneDesc: 'การดำเนินการที่ไม่สามารถย้อนกลับได้', + dangerZoneDescription: 'การดำเนินการที่ไม่สามารถย้อนกลับได้', + deleteWorkflowAction: 'ลบเวิร์กโฟลว์นี้', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + 'หลังจากลบแล้ว การกำหนดค่าที่เกี่ยวข้องทั้งหมดจะถูกลบอย่างถาวรและไม่สามารถกู้คืนได้', + deleteWorkflow: 'ลบเวิร์กโฟลว์', + deleteConfirm: 'ยืนยันลบ', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + 'คุณแน่ใจหรือไม่ว่าต้องการลบเวิร์กโฟลว์ "{{name}}"? การดำเนินการนี้ไม่สามารถยกเลิกได้', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: 'ชื่อ', + namePlaceholder: 'อินพุตเวิร์กโฟลว์ชื่อ', + descriptionPlaceholder: 'ป้อนคำอธิบายเวิร์กโฟลว์ (ไม่บังคับ)', + enabled: 'เปิดใช้งาน', + enabledDesc: 'เมื่อเปิดใช้งานแล้ว เวิร์กโฟลว์จะสามารถถูกทริกเกอร์เพื่อดำเนินการได้', + loading: 'กำลังโหลด...', + info: 'เวิร์กโฟลว์ข้อมูล', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: 'เวอร์ชัน', + createdAt: 'เวลาสร้าง', + updatedAt: 'เวลาอัปเดต', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', - error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', + totalExecutions: 'ทั้งหมด {{count}} บันทึกการดำเนินการ', + statistics: 'สถิติการวิเคราะห์', + successfulCount: 'สำเร็จ {{count}} ครั้ง', + successRate: 'อัตราความสำเร็จ', + averageDuration: 'ระยะเวลาเฉลี่ย', + perExecution: 'ต่อการดำเนินการ', + failedExecutions: 'จำนวนครั้งที่ล้มเหลว', + lastExecution: 'การดำเนินการล่าสุด', + filterByStatus: 'กรองตามสถานะ', + allStatuses: 'สถานะทั้งหมด', + manualTrigger: 'ทริกเกอร์ด้วยตนเอง', + executionId: 'ID การดำเนินการ', + status: 'สถานะ', + triggerType: 'ประเภททริกเกอร์', + startedAt: 'เวลาเริ่มต้น', + duration: 'ระยะเวลารอ', + noExecutions: 'ไม่มีบันทึกการดำเนินการ', + executionDetails: 'รายละเอียดการดำเนินการ', + error: 'ข้อผิดพลาด', + nodeExecutions: 'บันทึกการดำเนินการโหนด', + result: 'ผลลัพธ์', 'status.pending': 'Pending', 'status.running': 'Running', 'status.completed': 'Completed', 'status.failed': 'Failed', 'status.cancelled': 'Cancelled', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: 'แผงโหนด', + properties: 'คุณสมบัติ', + zoomIn: 'ขยาย', + zoomOut: 'ย่อ', + fitView: 'ปรับมุมมอง', + unsavedChanges: 'มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก', + paste: 'วาง', + deleted: 'ลบแล้ว', + nothingToCopy: 'ไม่มีโหนดที่เลือกให้คัดลอก', + nothingToPaste: 'คลิปบอร์ดว่างเปล่า', + copied: 'คัดลอก {{count}} โหนดแล้ว', + pasted: 'วาง {{count}} โหนดแล้ว', + nodesSelected: 'เลือก {{count}} โหนดแล้ว', + edgesSelected: 'เลือก {{count}} การเชื่อมต่อแล้ว', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: 'ค้นหาโหนด...', + loadingNodeTypes: 'กำลังโหลดประเภทโหนด...', + noNodesFound: 'ไม่พบโหนดที่ตรงกัน', + clearSearch: 'ล้างการค้นหา', + dragToAdd: 'ลากโหนดไปยังพื้นที่ทำงานเพื่อเพิ่ม', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: 'เลือกโหนดหรือเส้นเชื่อม', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + 'คลิกที่โหนดหรือเส้นเชื่อมในพื้นที่ทำงานเพื่อดูและแก้ไขคุณสมบัติ', + edgeProperties: 'คุณสมบัติการเชื่อมต่อ', + nodeProperties: 'คุณสมบัติโหนด', + condition: 'เงื่อนไขแบ่งสาขา', + hasCondition: 'ตั้งค่าแล้ว', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + 'ป้อนนิพจน์เงื่อนไข เช่น: output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', - platform: 'Platform', - sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + 'เมื่อเงื่อนไขว่างเปล่า เส้นเชื่อมนี้จะถูกดำเนินการเสมอ รองรับการใช้ {{ชื่อตัวแปร}} เพื่ออ้างอิงตัวแปรบริบท', + deleteEdge: 'ลบเส้นเชื่อม', + deleteEdgeConfirm: 'ยืนยันการลบเส้นเชื่อมนี้?', + deleteEdgeConfirmDesc: 'หลังจากลบแล้ว เส้นเชื่อมนี้จะถูกลบอย่างถาวร', + nodeLabel: 'ชื่อโหนด', + nodeLabelPlaceholder: 'ป้อนชื่อแสดงโหนด', + nodeId: 'ID โหนด', + inputOutputVariables: 'ตัวแปรอินพุต/เอาต์พุต', + inputs: 'อินพุต', + outputs: 'เอาต์พุต', + availableVariables: 'ตัวแปรที่ใช้ได้', + globalVariables: 'ตัวแปรส่วนกลาง', + messageContent: 'ข้อความจำลอง', + messageSender: 'ผู้ส่ง', + platform: 'แพลตฟอร์ม', + sessionId: 'ID เซสชัน', + timestamp: 'ประทับเวลา', + nodeConfig: 'การกำหนดค่าโหนด', + noConfigOptions: 'ประเภทโหนดนี้ยังไม่มีตัวเลือกการกำหนดค่า', + deleteNode: 'ลบโหนด', + deleteNodeConfirm: 'ยืนยันการลบโหนดนี้?', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + 'หลังจากลบแล้ว โหนดนี้และเส้นเชื่อมทั้งหมดจะถูกลบอย่างถาวร', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: 'อินพุต', + message: 'ข้อความ', + text: 'ข้อความ', + query: 'คำสอบถาม SQL', + data: 'ข้อมูล', + condition: 'เงื่อนไขแบ่งสาขา', + value: 'ค่า', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: 'เนื้อหา', + context: 'บริบทดีบัก', + body: 'เนื้อหาคำขอ', + variables: 'ตัวแปรที่ตรวจสอบ', + items: 'รายการโครงการ', + arguments: 'พารามิเตอร์', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: 'คำถามผู้ใช้', + parameters: 'คำจำกัดความพารามิเตอร์', + key: 'คีย์', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: 'สาขา 1', + case_2: 'สาขา 2', + branch_1: 'เอาต์พุตสาขา 1', + branch_2: 'เอาต์พุตสาขา 2', // Action inputs - notification_id: 'Notification ID', + notification_id: 'ID การแจ้งเตือน', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: 'เทมเพลตคีย์', + hash_field: 'ฟิลด์แฮช', + server_name: 'ชื่อเซิร์ฟเวอร์', + tool_name: 'ชื่อเครื่องมือ', + arguments_template: 'เทมเพลตพารามิเตอร์', + scope: 'ขอบเขต', + payload: 'เพย์โหลด', + input_value: 'ค่าอินพุต', }, // Data type labels 'type.string': 'String', @@ -1499,377 +1503,377 @@ const thTH = { 'type.any': 'Any', 'type.datetime': 'DateTime', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: 'ทริกเกอร์', + triggerDescription: 'โหนดเริ่มต้นเวิร์กโฟลว์', + messageTrigger: 'ทริกเกอร์ข้อความ', + messageTriggerDescription: 'ทริกเกอร์เมื่อได้รับข้อความ', + scheduleTrigger: 'ทริกเกอร์ตามกำหนดเวลา', + scheduleTriggerDescription: 'ทริกเกอร์ตามตารางเวลาที่กำหนด', + cronTrigger: 'ทริกเกอร์ตามกำหนดเวลา', + cronTriggerDescription: 'ทริกเกอร์เวิร์กโฟลว์ตามตารางเวลาที่กำหนด', + webhookTrigger: 'ทริกเกอร์ Webhook', + webhookTriggerDescription: 'ทริกเกอร์ผ่านคำขอ HTTP', + eventTrigger: 'ทริกเกอร์เหตุการณ์', + eventTriggerDescription: 'ทริกเกอร์เมื่อเหตุการณ์ระบบเกิดขึ้น', + process: 'AI/การประมวลผล', + processDescription: 'โหนดประมวลผลข้อมูล', + aiProcess: 'การประมวลผล AI', + aiProcessDescription: 'ใช้โมเดล AI ประมวลผลข้อความ', + llmCall: 'เรียกใช้ LLM', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + 'เรียกใช้โมเดลภาษาขนาดใหญ่เพื่อสนทนาหรือสร้างเนื้อหา', + codeProcess: 'ประมวลผลโค้ด', + codeProcessDescription: 'ดำเนินการโค้ดที่กำหนดเอง', + codeExecutor: 'ตัวดำเนินการโค้ด', + codeExecutorDescription: 'ดำเนินการโค้ด Python/JavaScript', + templateProcess: 'ประมวลผลเทมเพลต', + templateProcessDescription: 'ใช้เทมเพลตจัดรูปแบบเอาต์พุต', + httpRequest: 'คำขอ HTTP', + httpRequestDescription: 'ส่งคำขอ HTTP', + dataTransform: 'แปลงข้อมูล', + dataTransformDescription: 'แปลงรูปแบบข้อมูล', + questionClassifier: 'ตัวจำแนกคำถาม', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + 'ใช้ LLM จำแนกคำถามผู้ใช้ไปยังหมวดหมู่ที่กำหนดไว้ล่วงหน้า', + parameterExtractor: 'ตัวแยกพารามิเตอร์', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + 'ใช้ LLM แยกพารามิเตอร์ที่มีโครงสร้างจากข้อความ', + knowledgeRetrieval: 'ค้นหาฐานความรู้', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + 'ค้นหาเนื้อหาที่เกี่ยวข้องจากฐานความรู้', + textTemplate: 'เทมเพลตข้อความ', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + 'ใช้เทมเพลตสร้างข้อความ', + jsonTransform: 'แปลง JSON', + jsonTransformDescription: 'แปลงข้อมูล JSON', + dataAggregator: 'รวมข้อมูล', + dataAggregatorDescription: 'รวมข้อมูลจากหลายแหล่ง', + textSplitter: 'แบ่งข้อความ', + textSplitterDescription: 'แบ่งข้อความเป็นส่วนย่อย', + variableAssignment: 'กำหนดค่าตัวแปร', + variableAssignmentDescription: 'กำหนดค่าให้กับตัวแปรเวิร์กโฟลว์', + control: 'การควบคุมโฟลว์', + controlDescription: 'โหนดควบคุมกระบวนการ', + condition: 'แบ่งสาขาตามเงื่อนไข', + conditionDescription: 'แยกกระบวนการตามเงื่อนไข', + switch: 'สาขาหลายทาง', + switchDescription: 'เลือกสาขาตามเงื่อนไขหลายแบบ', + loop: 'วนซ้ำ', + loopDescription: 'ดำเนินการซ้ำ', + iterator: 'ตัววนซ้ำ', + iteratorDescription: 'วนซ้ำผ่านองค์ประกอบในอาร์เรย์', + parallel: 'ประมวลผลแบบขนาน', + parallelDescription: 'ดำเนินการหลายสาขาแบบขนาน', + wait: 'รอ', + waitDescription: 'รอเวลาที่กำหนด', + delay: 'ความล่าช้า', + delayDescription: 'รอเวลาที่กำหนด', + merge: 'รวม', + mergeDescription: 'รวมหลายสาขา', + variableAggregator: 'ตัวรวมตัวแปร', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + 'รวมเอาต์พุตตัวแปรจากหลายสาขา', + action: 'การดำเนินการ', + actionDescription: 'โหนดดำเนินการ', + sendMessage: 'ส่งข้อความ', + sendMessageDescription: 'ส่งข้อความไปยังแพลตฟอร์ม', + replyMessage: 'ตอบกลับข้อความ', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + 'ตอบกลับข้อความที่ทริกเกอร์เวิร์กโฟลว์', + storeData: 'จัดเก็บข้อมูล', + storeDataDescription: 'จัดเก็บข้อมูลไปยังฐานข้อมูล', + callPipeline: 'เรียกใช้ Pipeline', + callPipelineDescription: 'เรียกใช้ Pipeline ที่มีอยู่', + setVariable: 'ตั้งค่าตัวแปร', + setVariableDescription: 'ตั้งค่าตัวแปรบริบท', + openingStatement: 'คำเปิดการสนทนา', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', - cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + 'ให้คำเปิดการสนทนาและคำถามแนะนำ', + end: 'สิ้นสุด', + endDescription: 'ทำเครื่องหมายการดำเนินการเวิร์กโฟลว์สิ้นสุด', + log: 'บันทึก', + logDescription: 'บันทึกข้อมูลล็อก', + integration: 'การผสานรวม', + integrationDescription: 'โหนดผสานรวมแพลตฟอร์มบุคคลที่สาม', + difyWorkflow: 'เวิร์กโฟลว์ Dify', + difyWorkflowDescription: 'เรียกใช้เวิร์กโฟลว์แพลตฟอร์ม Dify', + difyKnowledgeQuery: 'ฐานความรู้ Dify', + difyKnowledgeQueryDescription: 'สอบถามฐานความรู้ Dify', + n8nWorkflow: 'เวิร์กโฟลว์ n8n', + n8nWorkflowDescription: 'เรียกใช้เวิร์กโฟลว์ n8n', + langflowFlow: 'โฟลว์ Langflow', + langflowFlowDescription: 'เรียกใช้โฟลว์ Langflow', + cozeBot: 'บอท Coze', + cozeBotDescription: 'เรียกใช้บอท Coze', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: 'สอบถามฐานข้อมูล', + databaseQueryDescription: 'ดำเนินการสอบถามฐานข้อมูล', + redisOperation: 'การดำเนินการ Redis', + redisOperationDescription: 'ดำเนินการแคช Redis', + mcpTool: 'เครื่องมือ MCP', + mcpToolDescription: 'เรียกใช้เครื่องมือ MCP', + memoryStore: 'จัดเก็บความจำ', + memoryStoreDescription: 'จัดเก็บและดึงข้อมูลจากความจำเวิร์กโฟลว์', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: 'ประวัติการดำเนินการเวิร์กโฟลว์', + noExecutions: 'ไม่มีบันทึกการดำเนินการ', + status: 'สถานะ', + startTime: 'เวลาเริ่มต้น', + duration: 'ระยะเวลารอ', + running: 'กำลังดำเนินการ', + completed: 'เสร็จสมบูรณ์', + failed: 'ล้มเหลว', + cancelled: 'ยกเลิกแล้ว', + viewDetails: 'ดูรายละเอียด', + cancel: 'ยกเลิกการดำเนินการ', + retry: 'ลองใหม่', + nodeResults: 'ผลลัพธ์การดำเนินการโหนด', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: 'เวอร์ชันเวิร์กโฟลว์', + current: 'เวอร์ชันปัจจุบัน', + rollback: 'ย้อนกลับไปยังเวอร์ชันนี้', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + 'ยืนยันการย้อนกลับไปยังเวอร์ชันนี้? การเปลี่ยนแปลงปัจจุบันจะสูญหาย', + rollbackSuccess: 'ย้อนกลับสำเร็จ', + rollbackError: 'ย้อนกลับล้มเหลว:', }, // Debug and monitoring debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', - conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + debugMode: 'โหมดดีบัก', + debugPanel: 'แผงดีบัก', + startDebug: 'เริ่มดีบัก', + pauseDebug: 'หยุดชั่วคราว', + resumeDebug: 'ดำเนินการต่อ', + stepDebug: 'ดำเนินการทีละขั้น', + stopDebug: 'หยุด', + debugContext: 'บริบทดีบัก', + simulatedMessage: 'ข้อความจำลอง', + simulatedMessagePlaceholder: 'ป้อนเนื้อหาข้อความที่จะจำลอง', + senderId: 'ID ผู้ส่ง', + senderIdPlaceholder: 'ตัวระบุเฉพาะผู้ส่ง', + senderName: 'ชื่อผู้ส่ง', + senderNamePlaceholder: 'ชื่อแสดงผู้ส่ง', + conversationId: 'ID เซสชัน', + conversationIdPlaceholder: 'ตัวระบุเฉพาะเซสชัน', + isGroup: 'แชทกลุ่ม', + customVariables: 'ตัวแปรที่กำหนดเอง', + addVariable: 'เพิ่มตัวแปร', + variableName: 'ชื่อตัวแปร', + variableValue: 'ค่าตัวแปร', + watchedVariables: 'ตัวแปรที่ตรวจสอบ', + addWatchVariable: 'เพิ่มการตรวจสอบ', + nodeStates: 'สถานะโหนด', + breakpoints: 'เบรกพอยต์', + toggleBreakpoint: 'สลับเบรกพอยต์', + breakpointSet: 'ตั้งค่าเบรกพอยต์แล้ว', + breakpointRemoved: 'ลบเบรกพอยต์แล้ว', + debugLogs: 'ล็อกดีบัก', + noLogs: 'ยังไม่มีล็อก', + clearLogs: 'ล้างล็อก', + autoScroll: 'เลื่อนอัตโนมัติ', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', - error: 'Error', + idle: 'ว่าง', + running: 'กำลังดำเนินการ', + paused: 'หยุดชั่วคราวแล้ว', + completed: 'เสร็จสมบูรณ์', + error: 'ข้อผิดพลาด', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: 'กำลังรอ', + running: 'กำลังดำเนินการ', + completed: 'เสร็จสมบูรณ์', + failed: 'ล้มเหลว', + skipped: 'ข้ามแล้ว', }, debugDialog: { - title: 'Workflow Chat', - selectWorkflow: 'Select Workflow', - sessionType: 'Session Type', - privateChat: 'Private Chat', - groupChat: 'Group Chat', - send: 'Send', - reset: 'Reset Conversation', - inputPlaceholder: 'Send {{type}} message...', - noMessages: 'No messages', - userMessage: 'User', - botMessage: 'Bot', - sendFailed: 'Send failed', - resetSuccess: 'Conversation reset successfully', - resetFailed: 'Reset failed', - loadMessagesFailed: 'Failed to load messages', - loadWorkflowsFailed: 'Failed to load workflows', - atTips: 'Mention bot', - streaming: 'Streaming', - streamOutput: 'Stream', - connected: 'WebSocket connected', - disconnected: 'WebSocket disconnected', - connectionError: 'WebSocket connection error', - connectionFailed: 'WebSocket connection failed', - notConnected: 'WebSocket not connected, please try again later', - imageUploadFailed: 'Image upload failed', - reply: 'Reply', - replyTo: 'Reply to', - showMarkdown: 'Render', - showRaw: 'Raw', - allMembers: 'All Members', - file: 'File', - voice: 'Voice', - uploadImage: 'Upload Image', - uploading: 'Uploading...', + title: 'การสนทนาเวิร์กโฟลว์', + selectWorkflow: 'เลือกเวิร์กโฟลว์', + sessionType: 'ประเภทเซสชัน', + privateChat: 'แชทส่วนตัว', + groupChat: 'แชทกลุ่ม', + send: 'ส่ง', + reset: 'รีเซ็ตการสนทนา', + inputPlaceholder: 'ส่งข้อความ {{type}}...', + noMessages: 'ยังไม่มีข้อความ', + userMessage: 'ผู้ใช้', + botMessage: 'บอท', + sendFailed: 'ส่งล้มเหลว', + resetSuccess: 'รีเซ็ตการสนทนาแล้ว', + resetFailed: 'รีเซ็ตล้มเหลว', + loadMessagesFailed: 'โหลดข้อความล้มเหลว', + loadWorkflowsFailed: 'โหลดเวิร์กโฟลว์ล้มเหลว', + atTips: 'กล่าวถึงบอท', + streaming: 'การสตรีม', + streamOutput: 'สตรีม', + connected: 'เชื่อมต่อ WebSocket แล้ว', + disconnected: 'ยังไม่ได้เชื่อมต่อ WebSocket', + connectionError: 'ข้อผิดพลาดการเชื่อมต่อ WebSocket', + connectionFailed: 'การเชื่อมต่อ WebSocket ล้มเหลว', + notConnected: 'ยังไม่ได้เชื่อมต่อ WebSocket กรุณาลองใหม่ภายหลัง', + imageUploadFailed: 'อัปโหลดรูปภาพล้มเหลว', + reply: 'ตอบกลับ', + replyTo: 'ตอบกลับถึง', + showMarkdown: 'เรนเดอร์', + showRaw: 'ข้อความดิบ', + allMembers: 'สมาชิกทั้งหมด', + file: 'ไฟล์', + voice: 'เสียง', + uploadImage: 'อัปโหลดรูปภาพ', + uploading: 'กำลังอัปโหลด...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: 'กรองตามวันที่', + allTime: 'ทุกช่วงเวลา', + today: 'วันนี้', + lastWeek: 'สัปดาห์ที่แล้ว', + lastMonth: 'เดือนที่แล้ว', + showingExecutions: 'แสดง {{shown}} / {{total}} รายการ', + rerun: 'เรียกใช้อีกครั้ง', + rerunExecution: 'ดำเนินการอีกครั้ง', + logs: 'บันทึก', + details: 'รายละเอียด', + completedAt: 'เวลาที่เสร็จสมบูรณ์', + noNodeExecutions: 'ยังไม่มีบันทึกการดำเนินการโหนด', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: 'เงื่อนไขทริกเกอร์', + keyword_filter: 'ตัวกรองคำสำคัญ', + regex_filter: 'ตัวกรองนิพจน์ทั่วไป', + min_length: 'ความยาวต่ำสุด', + max_length: 'ความยาวสูงสุด', + require_mention: 'ต้องกล่าวถึงบอท', + respond_rules: 'กฎการตอบสนองในกลุ่ม', + access_control: 'การควบคุมการเข้าถึง', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'นิพจน์ Cron', + timezone: 'เขตเวลา', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', + path: 'เส้นทาง Webhook', + allowed_methods: 'วิธี HTTP ที่อนุญาต', content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + auth_type: 'ประเภทการยืนยันตัวตน', + auth_key: 'คีย์การยืนยันตัวตน', + validation: 'การตรวจสอบคำขอ', + timeout: 'เวลาหมดอายุ', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: 'ประเภทเหตุการณ์', + filter: 'ตัวกรองเหตุการณ์', + debounce_ms: 'เวลา Debounce', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', - temperature: 'Temperature', + model: 'โมเดล', + prompt_template: 'เทมเพลตพรอมต์', + system_prompt: 'พรอมต์ระบบ', + temperature: 'อุณหภูมิ', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: 'การลงโทษความถี่', + presence_penalty: 'การลงโทษการมีอยู่', + max_tokens: 'จำนวน Token สูงสุด', + stop_sequences: 'ลำดับหยุด', + seed: 'ค่า Seed', + stream: 'เอาต์พุตแบบสตรีม', + use_conversation_history: 'ใช้ประวัติการสนทนา', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: 'ภาษาโปรแกรม', + code: 'โค้ด', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: 'URL คำขอ', + method: 'วิธีคำขอ', + auth_config: 'การกำหนดค่าการยืนยันตัวตน', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: 'ประเภทการแปลง', + template: 'เทมเพลต', + expression: 'นิพจน์', + output_type: 'ประเภทเอาต์พุต', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: 'หมวดหมู่', + instruction: 'คำสั่ง', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: 'คำจำกัดความพารามิเตอร์', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: 'ฐานความรู้', + top_k: 'จำนวนที่ส่งคืน', + score_threshold: 'เกณฑ์ความคล้ายคลึง', + search_method: 'วิธีการค้นหา', + enable_citations: 'เปิดใช้งานการอ้างอิง', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: 'ประเภทเงื่อนไข', + condition_expression: 'นิพจน์เงื่อนไข', + left_value: 'ค่าซ้าย', + operator: 'ตัวดำเนินการเปรียบเทียบ', + right_value: 'ค่าขวา', // control.py - SwitchNode - cases: 'Branch Cases', + cases: 'เงื่อนไขสาขา', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: 'จำนวนการวนซ้ำสูงสุด', + break_condition: 'เงื่อนไขหยุด', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: 'การประมวลผลแบบขนาน', + max_concurrency: 'จำนวนการทำงานพร้อมกันสูงสุด', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: 'การกำหนดค่าสาขา', + wait_all: 'รอทั้งหมด', + fail_fast: 'ล้มเหลวเร็ว', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: 'เวลารอ', + duration_type: 'หน่วยเวลา', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: 'กลยุทธ์การรวม', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: 'การแมปตัวแปร', + aggregation_mode: 'โหมดการรวม', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: 'ประเภทเป้าหมาย', + target_id: 'ID เป้าหมาย', + platform: 'แพลตฟอร์ม', + message_type: 'ประเภทข้อความ', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: 'โหมดตอบกลับ', + message_template: 'เทมเพลตข้อความ', + long_text_processing: 'การประมวลผลข้อความยาว', + force_delay: 'บังคับความล่าช้า', // action.py - CallPipelineNode - pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + pipeline_uuid: 'ไปป์ไลน์', + inherit_context: 'สืบทอดบริบท', // action.py - StoreDataNode - storage_type: 'Storage Type', - ttl: 'TTL', - key_prefix: 'Key Prefix', + storage_type: 'ประเภทการจัดเก็บ', + ttl: 'เวลาหมดอายุ', + key_prefix: 'คำนำหน้าคีย์', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: 'ชื่อตัวแปร', + variable_scope: 'ขอบเขตตัวแปร', + set_variable_operation: 'ประเภทการดำเนินการ', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: 'คำกล่าวเปิด', + suggested_questions: 'คำถามที่แนะนำ', + show_suggestions: 'แสดงคำแนะนำ', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: 'รูปแบบเอาต์พุต', + success_message: 'ข้อความสำเร็จ', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: 'ประเภทฐานข้อมูล', + connection_string: 'สตริงการเชื่อมต่อ', + query: 'คำสอบถาม SQL', + query_type: 'ประเภทคำสอบถาม', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: 'URL การเชื่อมต่อ', + operation: 'ประเภทการดำเนินการ', + key_template: 'เทมเพลตคีย์', + hash_field: 'ฟิลด์แฮช', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: 'ชื่อเซิร์ฟเวอร์', + tool_name: 'ชื่อเครื่องมือ', + arguments_template: 'เทมเพลตพารามิเตอร์', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: 'ขอบเขต', // integration.py - DifyWorkflowNode 'base-url': 'Base URL', 'api-key': 'API Key', 'app-type': 'App Type', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: 'ID ฐานความรู้', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode @@ -1881,169 +1885,183 @@ const thTH = { // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: 'ข้อความ', + sender_id: 'ID ผู้ส่ง', + sender_name: 'ชื่อผู้ส่ง', + platform: 'แพลตฟอร์ม', + conversation_id: 'ID เซสชัน', + is_group: 'เป็นแชทกลุ่ม', + context: 'บริบทดีบัก', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: 'ประทับเวลา', + schedule: 'ตารางเวลา', + cron_timestamp: 'ประทับเวลา Cron', + cron_schedule: 'ตารางเวลานิพจน์ Cron', + cron_context: 'บริบท Cron', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: 'เนื้อหาคำขอ', + headers: 'ส่วนหัว', + query: 'คำสอบถาม', + method: 'วิธีคำขอ', + webhook_body: 'เนื้อหาคำขอ Webhook', + webhook_headers: 'ส่วนหัวคำขอ Webhook', + webhook_query: 'พารามิเตอร์คำสอบถาม Webhook', + webhook_method: 'วิธีคำขอ Webhook', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: 'ประเภทเหตุการณ์', + event_data: 'ข้อมูลเหตุการณ์', + event_timestamp: 'ประทับเวลาเหตุการณ์', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: 'การตอบสนอง', + usage: 'สถิติการใช้ Token', + prompt: 'พรอมต์/คำถาม', + context_info: 'ข้อมูลบริบท', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: 'เอาต์พุต', + console: 'เอาต์พุตคอนโซล', + code_input: 'อินพุตโค้ด', + code_output: 'เอาต์พุตโค้ด', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: 'รหัสสถานะ', + http_body: 'เนื้อหาคำขอ HTTP', + http_headers: 'ส่วนหัวคำขอ HTTP', + http_response: 'การตอบสนอง HTTP', + response_headers: 'ส่วนหัวการตอบสนอง', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: 'ผลลัพธ์', + transform_input: 'อินพุตการแปลง', + transform_result: 'ผลลัพธ์การแปลง', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: 'ผลลัพธ์หมวดหมู่', + confidence: 'ความเชื่อมั่น', + all_scores: 'คะแนนทั้งหมด', + question: 'คำถามผู้ใช้', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: 'คำจำกัดความพารามิเตอร์', + extraction_success: 'แยกสำเร็จ', + extract_text: 'ข้อความอินพุต', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: 'เอกสารที่ดึงมา', + citations: 'ข้อมูลการอ้างอิง', + knowledge_context: 'บริบทรวม', + knowledge_query: 'คำสอบถามการค้นหา', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: 'เอาต์พุตเงื่อนไขเป็นจริง', + false: 'เอาต์พุตเงื่อนไขเป็นเท็จ', + condition_input: 'อินพุตเงื่อนไข', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: 'สาขาที่ตรงกัน', + default: 'สาขาค่าเริ่มต้น', + switch_input: 'อินพุตสวิตช์', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: 'รายการปัจจุบัน', + index: 'ดัชนีปัจจุบัน', + results: 'ผลลัพธ์', + completed: 'เสร็จสมบูรณ์', + loop_items: 'รายการวนซ้ำ', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: 'เป็นตัวแรกหรือไม่?', + is_last: 'เป็นตัวสุดท้ายหรือไม่?', + iterator_array: 'อาร์เรย์อินพุต', + iterator_item: 'องค์ประกอบปัจจุบัน', + iterator_index: 'ดัชนีปัจจุบัน', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: 'ข้อผิดพลาดรายการ', + parallel_input: 'อินพุตขนาน', + parallel_results: 'ผลลัพธ์สาขาทั้งหมด', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: 'อินพุตส่งผ่าน', + wait_output: 'เอาต์พุตส่งผ่าน', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: 'ผลลัพธ์รวม', + merge_array: 'ผลลัพธ์กลุ่มอาร์เรย์', + merge_input_1: 'อินพุต 1', + merge_input_2: 'อินพุต 2', + merge_input_3: 'อินพุต 3', + merge_input_4: 'อินพุต 4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: 'ตัวแปรที่รวม', + aggregator_variables: 'ตัวแปรอินพุต', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: 'สถานะ', + message_id: 'ID ข้อความ', + target: 'ID เป้าหมาย', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: 'เนื้อหาตอบกลับ', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: 'การตอบสนอง Pipeline', + pipeline_result: 'ผลลัพธ์สมบูรณ์', + pipeline_query: 'เนื้อหาคำสอบถาม', + context_data: 'ข้อมูลบริบท', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: 'จัดเก็บสถานะ', + store_key: 'คีย์จัดเก็บ', + store_value: 'ค่าจัดเก็บ', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: 'ตัวแปรค่า', + variable_result: 'ผลลัพธ์การตั้งค่าตัวแปร', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: 'คำกล่าวเปิด', + suggested_questions: 'คำถามที่แนะนำ', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: 'เวิร์กโฟลว์เอาต์พุต', + final_result: 'ผลลัพธ์สุดท้าย', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: 'ผลลัพธ์คำสอบถาม', + row_count: 'จำนวนแถว', + query_success: 'คำสอบถามสำเร็จ', + query_params: 'พารามิเตอร์คิวรี', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: 'ผลลัพธ์ Redis', + redis_success: 'Redis สำเร็จ', + redis_key: 'Redis คีย์', + redis_value: 'Redis ค่า', + error: 'ข้อผิดพลาด', + plugin_input: 'อินพุตปลั๊กอิน', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: 'ผลลัพธ์เครื่องมือ', + tool_success: 'เครื่องมือสำเร็จ', + mcp_arguments: 'พารามิเตอร์เครื่องมือ', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: 'ผลลัพธ์ความจำ', + memory_success: 'ความจำสำเร็จ', + memory_value: 'ค่าจัดเก็บ', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'คำตอบ', + dify_success: 'Dify สำเร็จ', + dify_query: 'อินพุต/คำสอบถามผู้ใช้', + dify_conversation_id: 'เซสชัน ID', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: 'ผลลัพธ์การค้นหา', + knowledge_base_query: 'เนื้อหาคำสอบถาม', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: 'ผลลัพธ์ N8n', + n8n_success: 'N8n สำเร็จ', + n8n_payload: 'ข้อมูลอินพุตเวิร์กโฟลว์', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: 'ผลลัพธ์โฟลว์', + flow_success: 'โฟลว์สำเร็จ', + langflow_input: 'เนื้อหาอินพุต', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: 'การตอบกลับของบอท', + bot_success: 'บอทสำเร็จ', + coze_query: 'อินพุต/คำสอบถามผู้ใช้', + coze_conversation_id: 'เซสชัน ID', + bot_conversation_id: 'เซสชัน ID', + sender: 'ผู้ส่ง', + event: 'เหตุการณ์', + trigger_time: 'เวลาทริกเกอร์', + scores: 'คะแนน', + missing: 'พารามิเตอร์ที่ขาดหายไป', + parsed: 'ผลการแยกวิเคราะห์', + chunks: 'บล็อกข้อความ', + count: 'จำนวน', + execution_id: 'ID การดำเนินการ', + suggestions: 'คำถามที่แนะนำ', + embedding: 'เวกเตอร์', + dimensions: 'มิติ', + intent: 'เจตนา', + entities: 'เอนทิตี', }, }, diff --git a/web/src/i18n/locales/vi-VN.ts b/web/src/i18n/locales/vi-VN.ts index 34cc7920..173f8252 100644 --- a/web/src/i18n/locales/vi-VN.ts +++ b/web/src/i18n/locales/vi-VN.ts @@ -60,6 +60,8 @@ const viVN = { deleteError: 'Xóa thất bại: ', addRound: 'Thêm lượt', copy: 'Sao chép', + undo: 'Hoàn tác', + redo: 'Làm lại', copySuccess: 'Sao chép thành công', copyFailed: 'Sao chép thất bại', test: 'Kiểm tra', @@ -1334,183 +1336,185 @@ const viVN = { }, }, workflows: { - title: 'Workflows', + title: 'Hội thoại Quy trình', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', - editor: 'Editor', - debugChat: 'Trò chuyện gỡ lỗi', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + 'Mô tả', + createWorkflow: 'Tạo Quy trình', + selectFromSidebar: 'Chọn một quy trình từ thanh bên', + editWorkflow: 'Chỉnh sửa Quy trình', + newWorkflow: 'Quy trình Mới', + getWorkflowListError: 'Lỗi khi lấy danh sách quy trình:', + workflowName: 'Tên Quy trình', + workflowDescription: 'Mô tả Quy trình', + workflowNameRequired: 'Tên quy trình không được để trống', + defaultDescription: 'Một quy trình', + getWorkflowError: 'Lỗi khi lấy quy trình:', + loadError: 'Lỗi khi tải quy trình', + saveSuccess: 'Lưu thành công', + saveError: 'Lỗi khi lưu:', + createSuccess: 'Tạo quy trình thành công', + createError: 'Lỗi khi tạo:', + deleteSuccess: 'Xóa thành công', + deleteError: 'Lỗi khi xóa:', + deleteConfirmation: 'Bạn có chắc chắn muốn xóa quy trình này không?', + copySuccess: 'Sao chép thành công', + copyError: 'Sao chép thất bại:', + export: 'Xuất', + import: 'Nhập', + exportSuccess: 'Đã xuất quy trình làm việc', + importSuccess: 'Đã nhập quy trình làm việc', + importError: 'Nhập thất bại: định dạng tệp không hợp lệ', + publish: 'Xuất bản', + publishSuccess: 'Xuất bản thành công', + publishError: 'Xuất bản thất bại', + configuration: 'Cấu hình', + executions: 'Bản ghi thực thi', + editor: 'Trình chỉnh sửa', + debugChat: 'Hội thoạiGỡ lỗi', + basicInfo: 'Thông tin cơ bản', + basicInfoDesc: 'Cấu hình tên, biểu tượng và mô tả quy trình làm việc', + basicInfoDescription: 'Cấu hình tên và mô tả quy trình làm việc', + dangerZone: 'Vùng nguy hiểm', + dangerZoneDesc: 'Các thao tác không thể hoàn tác', + dangerZoneDescription: 'Các thao tác không thể hoàn tác', + deleteWorkflowAction: 'Xóa quy trình làm việc này', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + 'Sau khi xóa, tất cả các cấu hình liên quan sẽ bị xóa vĩnh viễn và không thể khôi phục.', + deleteWorkflow: 'XóaQuy trình', + deleteConfirm: 'Xác nhậnXóa', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + 'Bạn có chắc chắn muốn xóa quy trình làm việc "{{name}}" không? Thao tác này không thể hoàn tác.', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: 'Tên', + namePlaceholder: 'Đầu vàoQuy trìnhTên', + descriptionPlaceholder: 'Nhập mô tả quy trình làm việc (tùy chọn)', + enabled: 'Bật', + enabledDesc: 'Sau khi bật, quy trình làm việc có thể được kích hoạt để thực thi', + loading: 'Đang tải...', + info: 'Quy trìnhThông tin', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: 'Phiên bản', + createdAt: 'Thời gian tạo', + updatedAt: 'Thời gian cập nhật', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', - error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', + totalExecutions: 'Tổng cộng {{count}} bản ghi thực thi', + statistics: 'Phân tích thống kê', + successfulCount: 'Thành công {{count}} lần', + successRate: 'Tỷ lệ thành công', + averageDuration: 'Thời lượng trung bình', + perExecution: 'Mỗi lần thực thi', + failedExecutions: 'Số lần thất bại', + lastExecution: 'Lần thực thi cuối', + filterByStatus: 'Lọc theo trạng thái', + allStatuses: 'Tất cả trạng thái', + manualTrigger: 'Kích hoạt thủ công', + executionId: 'Thực thi ID', + status: 'Trạng thái', + triggerType: 'Loại kích hoạt', + startedAt: 'Thời gian bắt đầu', + duration: 'Thời gian chờ', + noExecutions: 'Không có bản ghi thực thi', + executionDetails: 'Chi tiết thực thi', + error: 'Lỗi', + nodeExecutions: 'Bản ghi thực thi nút', + result: 'Kết quả', 'status.pending': 'Pending', 'status.running': 'Running', 'status.completed': 'Completed', 'status.failed': 'Failed', 'status.cancelled': 'Cancelled', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: 'Bảng điều khiển nút', + properties: 'Thuộc tính', + zoomIn: 'Phóng to', + zoomOut: 'Thu nhỏ', + fitView: 'Điều chỉnh khung nhìn', + unsavedChanges: 'Có thay đổi chưa lưu', + paste: 'Dán', + deleted: 'Đã xóa', + nothingToCopy: 'Không có nút nào được chọn để sao chép', + nothingToPaste: 'Clipboard trống', + copied: 'Đã sao chép {{count}} nút', + pasted: 'Đã dán {{count}} nút', + nodesSelected: 'Đã chọn {{count}} nút', + edgesSelected: 'Đã chọn {{count}} kết nối', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: 'Tìm kiếm nút...', + loadingNodeTypes: 'Đang tải loại nút...', + noNodesFound: 'Không tìm thấy nút phù hợp', + clearSearch: 'Xóa tìm kiếm', + dragToAdd: 'Kéo nút vào canvas để thêm', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: 'Chọn một nút hoặc kết nối', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + 'Nhấp vào nút hoặc kết nối trong canvas để xem và chỉnh sửa thuộc tính', + edgeProperties: 'Thuộc tính kết nối', + nodeProperties: 'Thuộc tính nút', + condition: 'Điều kiện nhánh', + hasCondition: 'Đã cài đặt', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + 'Nhập biểu thức điều kiện, ví dụ: output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', - platform: 'Platform', - sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + 'Khi điều kiện để trống, kết nối này sẽ luôn được thực thi. Hỗ trợ sử dụng {{tên_biến}} để tham chiếu biến ngữ cảnh.', + deleteEdge: 'Xóa cạnh', + deleteEdgeConfirm: 'Xác nhận xóa kết nối này?', + deleteEdgeConfirmDesc: 'Sau khi xóa, kết nối này sẽ bị xóa vĩnh viễn.', + nodeLabel: 'Tên nút', + nodeLabelPlaceholder: 'Nhập tên hiển thị nút', + nodeId: 'Nút ID', + inputOutputVariables: 'Biến đầu vào/đầu ra', + inputs: 'Đầu vào', + outputs: 'Đầu ra', + availableVariables: 'Biến khả dụng', + globalVariables: 'Biến toàn cục', + messageContent: 'Tin nhắn mô phỏng', + messageSender: 'Người gửi', + platform: 'Nền tảng', + sessionId: 'Phiên ID', + timestamp: 'Dấu thời gian', + nodeConfig: 'Cấu hình nút', + noConfigOptions: 'Loại nút này chưa có tùy chọn cấu hình', + deleteNode: 'Xóa nút', + deleteNodeConfirm: 'Xác nhận xóa nút này?', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + 'Sau khi xóa, nút này và tất cả các kết nối của nó sẽ bị xóa vĩnh viễn.', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: 'Đầu vào', + message: 'Tin nhắn', + text: 'Văn bản', + query: 'Truy vấn SQL', + data: 'Dữ liệu', + condition: 'Điều kiện nhánh', + value: 'Giá trị', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: 'Nội dung', + context: 'Ngữ cảnh gỡ lỗi', + body: 'Nội dung yêu cầu', + variables: 'Biến giám sát', + items: 'Danh sách mục', + arguments: 'Tham số', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: 'Câu hỏi người dùng', + parameters: 'Định nghĩa tham số', + key: 'Khóa', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: 'Nhánh 1', + case_2: 'Nhánh 2', + branch_1: 'Đầu ra nhánh 1', + branch_2: 'Đầu ra nhánh 2', // Action inputs - notification_id: 'Notification ID', + notification_id: 'ID thông báo', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: 'Mẫu khóa', + hash_field: 'Trường băm', + server_name: 'Tên máy chủ', + tool_name: 'Tên công cụ', + arguments_template: 'Mẫu tham số', + scope: 'Phạm vi', + payload: 'Tải trọng', + input_value: 'Giá trị đầu vào', }, // Data type labels 'type.string': 'String', @@ -1521,377 +1525,377 @@ const viVN = { 'type.any': 'Any', 'type.datetime': 'DateTime', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: 'Trình kích hoạt', + triggerDescription: 'Nút khởi đầu quy trình', + messageTrigger: 'Kích hoạt tin nhắn', + messageTriggerDescription: 'Kích hoạt khi nhận được tin nhắn', + scheduleTrigger: 'Kích hoạt theo lịch', + scheduleTriggerDescription: 'Kích hoạt theo lịch trình đã lên', + cronTrigger: 'Kích hoạt theo lịch', + cronTriggerDescription: 'Kích hoạt quy trình theo lịch trình định thời', + webhookTrigger: 'Kích hoạt Webhook', + webhookTriggerDescription: 'Kích hoạt qua yêu cầu HTTP', + eventTrigger: 'Kích hoạt sự kiện', + eventTriggerDescription: 'Kích hoạt khi sự kiện hệ thống xảy ra', + process: 'AI/Xử lý', + processDescription: 'Nút xử lý dữ liệu', + aiProcess: 'Xử lý AI', + aiProcessDescription: 'Xử lý tin nhắn bằng mô hình AI', + llmCall: 'LLM Gọi', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + 'Gọi mô hình ngôn ngữ lớn để hội thoại hoặc tạo nội dung', + codeProcess: 'Xử lý mã', + codeProcessDescription: 'Thực thi mã tùy chỉnh', + codeExecutor: 'Thực thi mã', + codeExecutorDescription: 'Thực thi mã Python/JavaScript', + templateProcess: 'Xử lý mẫu', + templateProcessDescription: 'Định dạng đầu ra bằng mẫu', + httpRequest: 'Yêu cầu HTTP', + httpRequestDescription: 'Gửi yêu cầu HTTP', + dataTransform: 'Chuyển đổi dữ liệu', + dataTransformDescription: 'Chuyển đổi định dạng dữ liệu', + questionClassifier: 'Bộ phân loại câu hỏi', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + 'Sử dụng LLM để phân loại câu hỏi người dùng vào các danh mục đã định nghĩa', + parameterExtractor: 'Trích xuất tham số', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + 'Sử dụng LLM để trích xuất tham số có cấu trúc từ văn bản', + knowledgeRetrieval: 'Truy xuất kiến thức', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + 'Truy xuất nội dung liên quan từ cơ sở kiến thức', + textTemplate: 'Mẫu văn bản', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + 'Tạo văn bản bằng mẫu', + jsonTransform: 'Chuyển đổi JSON', + jsonTransformDescription: 'Chuyển đổi dữ liệu JSON', + dataAggregator: 'Tổng hợp dữ liệu', + dataAggregatorDescription: 'Tổng hợp nhiều nguồn dữ liệu', + textSplitter: 'Phân tách văn bản', + textSplitterDescription: 'Phân tách văn bản thành các khối', + variableAssignment: 'Gán biến', + variableAssignmentDescription: 'Gán giá trị cho biến quy trình', + control: 'Luồng điều khiển', + controlDescription: 'Nút điều khiển luồng', + condition: 'Điều kiện nhánh', + conditionDescription: 'Phân luồng theo điều kiện', + switch: 'Nhánh đa đường', + switchDescription: 'Chọn nhánh theo nhiều điều kiện', + loop: 'Vòng lặp', + loopDescription: 'Thực thi lặp lại', + iterator: 'Bộ lặp', + iteratorDescription: 'Duyệt qua các phần tử mảng', + parallel: 'Xử lý song song', + parallelDescription: 'Thực thi song song nhiều nhánh', + wait: 'Chờ', + waitDescription: 'Chờ thời gian chỉ định', + delay: 'Trì hoãn', + delayDescription: 'Chờ thời gian chỉ định', + merge: 'Hợp nhất', + mergeDescription: 'Hợp nhất nhiều nhánh', + variableAggregator: 'Bộ tổng hợp biến', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + 'Tổng hợp đầu ra biến từ nhiều nhánh', + action: 'Hành động', + actionDescription: 'Nút thực thi hành động', + sendMessage: 'Gửi tin nhắn', + sendMessageDescription: 'Gửi tin nhắn đến nền tảng', + replyMessage: 'Trả lời tin nhắn', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + 'Trả lời tin nhắn kích hoạt quy trình', + storeData: 'Lưu trữ dữ liệu', + storeDataDescription: 'Lưu trữ dữ liệu vào cơ sở dữ liệu', + callPipeline: 'Gọi Pipeline', + callPipelineDescription: 'Gọi Pipeline hiện có', + setVariable: 'Thiết lập biến', + setVariableDescription: 'Thiết lập biến ngữ cảnh', + openingStatement: 'Lời mở đầu hội thoại', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', - cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + 'Cung cấp lời mở đầu hội thoại và câu hỏi đề xuất', + end: 'Kết thúc', + endDescription: 'Đánh dấu kết thúc thực thi quy trình', + log: 'Nhật ký', + logDescription: 'Ghi lại thông tin nhật ký', + integration: 'Tích hợp', + integrationDescription: 'Nút tích hợp nền tảng bên thứ ba', + difyWorkflow: 'Quy trình Dify', + difyWorkflowDescription: 'Gọi quy trình nền tảng Dify', + difyKnowledgeQuery: 'Cơ sở kiến thức Dify', + difyKnowledgeQueryDescription: 'Truy vấn cơ sở kiến thức Dify', + n8nWorkflow: 'Quy trình n8n', + n8nWorkflowDescription: 'Gọi quy trình n8n', + langflowFlow: 'Luồng Langflow', + langflowFlowDescription: 'Gọi luồng Langflow', + cozeBot: 'Bot Coze', + cozeBotDescription: 'Gọi Bot Coze', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: 'Truy vấn cơ sở dữ liệu', + databaseQueryDescription: 'Thực thi truy vấn cơ sở dữ liệu', + redisOperation: 'Thao tác Redis', + redisOperationDescription: 'Thực thi thao tác bộ nhớ cache Redis', + mcpTool: 'MCP Công cụ', + mcpToolDescription: 'Gọi MCP Công cụ', + memoryStore: 'Lưu trữ bộ nhớ', + memoryStoreDescription: 'Lưu trữ và truy xuất dữ liệu từ bộ nhớ quy trình', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: 'Hội thoại Quy trình', + noExecutions: 'Không có bản ghi thực thi', + status: 'Trạng thái', + startTime: 'Thời gian bắt đầu', + duration: 'Thời gian chờ', + running: 'Đang thực thi', + completed: 'Đã hoàn thành', + failed: 'thất bại', + cancelled: 'Đã hủy', + viewDetails: 'Xem chi tiết', + cancel: 'Hủy thực thi', + retry: 'Thử lại', + nodeResults: 'Kết quả thực thi nút', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: 'Hội thoại Quy trình', + current: 'Phiên bản hiện tại', + rollback: 'Khôi phục về phiên bản này', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + 'Xác nhận khôi phục về phiên bản này? Các thay đổi hiện tại sẽ bị mất.', + rollbackSuccess: 'Khôi phục thành công', + rollbackError: 'Khôi phục thất bại:', }, // Debug and monitoring debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', - conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + debugMode: 'Chế độ gỡ lỗi', + debugPanel: 'Bảng điều khiển gỡ lỗi', + startDebug: 'Bắt đầu gỡ lỗi', + pauseDebug: 'Tạm dừng', + resumeDebug: 'Tiếp tục', + stepDebug: 'Thực thi từng bước', + stopDebug: 'Dừng', + debugContext: 'Ngữ cảnh gỡ lỗi', + simulatedMessage: 'Tin nhắn mô phỏng', + simulatedMessagePlaceholder: 'Nhập nội dung tin nhắn mô phỏng', + senderId: 'ID người gửi', + senderIdPlaceholder: 'Mã định danh duy nhất người gửi', + senderName: 'Tên người gửi', + senderNamePlaceholder: 'Tên hiển thị người gửi', + conversationId: 'ID phiên', + conversationIdPlaceholder: 'Mã định danh duy nhất phiên', + isGroup: 'Chat nhóm', + customVariables: 'Biến tùy chỉnh', + addVariable: 'Thêm biến', + variableName: 'Tên biến', + variableValue: 'Giá trị biến', + watchedVariables: 'Biến giám sát', + addWatchVariable: 'Thêm giám sát', + nodeStates: 'Trạng thái nút', + breakpoints: 'Điểm dừng', + toggleBreakpoint: 'Chuyển đổi điểm dừng', + breakpointSet: 'Đã đặt điểm dừng', + breakpointRemoved: 'Đã xóa điểm dừng', + debugLogs: 'Nhật ký gỡ lỗi', + noLogs: 'Chưa có nhật ký', + clearLogs: 'Xóa nhật ký', + autoScroll: 'Tự động cuộn', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', - error: 'Error', + idle: 'Nhàn rỗi', + running: 'Đang thực thi', + paused: 'Đã tạm dừng', + completed: 'Đã hoàn thành', + error: 'Lỗi', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: 'Đang chờ', + running: 'Đang thực thi', + completed: 'Đã hoàn thành', + failed: 'thất bại', + skipped: 'Đã bỏ qua', }, debugDialog: { - title: 'Workflow Chat', - selectWorkflow: 'Select Workflow', - sessionType: 'Session Type', - privateChat: 'Private Chat', - groupChat: 'Group Chat', - send: 'Send', - reset: 'Reset Conversation', - inputPlaceholder: 'Send {{type}} message...', - noMessages: 'No messages', - userMessage: 'User', + title: 'Hội thoại Quy trình', + selectWorkflow: 'Chọn quy trình', + sessionType: 'Loại phiên', + privateChat: 'Chat riêng', + groupChat: 'Chat nhóm', + send: 'Gửi', + reset: 'Đặt lại hội thoại', + inputPlaceholder: 'Gửi {{type}} Tin nhắn...', + noMessages: 'Chưa có tin nhắn', + userMessage: 'Người dùng', botMessage: 'Bot', - sendFailed: 'Send failed', - resetSuccess: 'Conversation reset successfully', - resetFailed: 'Reset failed', - loadMessagesFailed: 'Failed to load messages', - loadWorkflowsFailed: 'Failed to load workflows', - atTips: 'Mention bot', - streaming: 'Streaming', - streamOutput: 'Stream', - connected: 'WebSocket connected', - disconnected: 'WebSocket disconnected', - connectionError: 'WebSocket connection error', - connectionFailed: 'WebSocket connection failed', - notConnected: 'WebSocket not connected, please try again later', - imageUploadFailed: 'Image upload failed', - reply: 'Reply', - replyTo: 'Reply to', - showMarkdown: 'Render', - showRaw: 'Raw', - allMembers: 'All Members', - file: 'File', - voice: 'Voice', - uploadImage: 'Upload Image', - uploading: 'Uploading...', + sendFailed: 'Gửi thất bại', + resetSuccess: 'Đã đặt lại hội thoại', + resetFailed: 'Đặt lại thất bại', + loadMessagesFailed: 'Tải tin nhắn thất bại', + loadWorkflowsFailed: 'Tải quy trình thất bại', + atTips: 'Nhắc đến bot', + streaming: 'Truyền phát', + streamOutput: 'Streaming', + connected: 'WebSocket đã kết nối', + disconnected: 'WebSocket chưa kết nối', + connectionError: 'Lỗi kết nối WebSocket', + connectionFailed: 'Kết nối WebSocket thất bại', + notConnected: 'WebSocket chưa kết nối, vui lòng thử lại sau', + imageUploadFailed: 'Tải lên hình ảnh thất bại', + reply: 'Trả lời', + replyTo: 'Trả lời cho', + showMarkdown: 'Hiển thị', + showRaw: 'Văn bản gốc', + allMembers: 'Tất cả thành viên', + file: 'Tệp', + voice: 'Giọng nói', + uploadImage: 'Tải lên hình ảnh', + uploading: 'Đang tải lên...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: 'Lọc theo ngày', + allTime: 'Tất cả thời gian', + today: 'Hôm nay', + lastWeek: 'Tuần trước', + lastMonth: 'Tháng gần đây', + showingExecutions: 'Hiển thị {{shown}} / {{total}} bản ghi', + rerun: 'Chạy lại', + rerunExecution: 'Thực thi lại', + logs: 'Nhật ký', + details: 'Chi tiết', + completedAt: 'Thời gian hoàn thành', + noNodeExecutions: 'Chưa có bản ghi thực thi nút', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: 'Điều kiện kích hoạt', + keyword_filter: 'Lọc từ khóa', + regex_filter: 'Lọc biểu thức chính quy', + min_length: 'Độ dài tối thiểu', + max_length: 'Độ dài tối đa', + require_mention: 'Yêu cầu nhắc bot', + respond_rules: 'Quy tắc phản hồi nhóm', + access_control: 'Kiểm soát truy cập', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'Biểu thức Cron', + timezone: 'Múi giờ', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', + path: 'Đường dẫn Webhook', + allowed_methods: 'Phương thức HTTP cho phép', content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + auth_type: 'Loại xác thực', + auth_key: 'Khóa xác thực', + validation: 'Xác thực yêu cầu', + timeout: 'Thời gian hết hạn', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: 'Loại sự kiện', + filter: 'Lọc sự kiện', + debounce_ms: 'Thời gian chống rung', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', - temperature: 'Temperature', + model: 'Mô hình', + prompt_template: 'Mẫu gợi ý', + system_prompt: 'Gợi ý hệ thống', + temperature: 'Nhiệt độ', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: 'Phạt tần suất', + presence_penalty: 'Phạt hiện diện', + max_tokens: 'Số token tối đa', + stop_sequences: 'Chuỗi dừng', + seed: 'Seed ngẫu nhiên', + stream: 'Đầu ra luồng', + use_conversation_history: 'Sử dụng lịch sử hội thoại', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: 'Ngôn ngữ lập trình', + code: 'Mã', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: 'URL yêu cầu', + method: 'Phương thức yêu cầu', + auth_config: 'Cấu hình xác thực', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: 'Loại chuyển đổi', + template: 'Mẫu', + expression: 'Biểu thức', + output_type: 'Loại đầu ra', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: 'Danh mục phân loại', + instruction: 'Chỉ thị', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: 'Định nghĩa tham số', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: 'Cơ sở kiến thức', + top_k: 'Số lượng trả về', + score_threshold: 'Ngưỡng độ tương tự', + search_method: 'Phương pháp tìm kiếm', + enable_citations: 'Bật trích dẫn', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: 'Loại điều kiện', + condition_expression: 'Biểu thức điều kiện', + left_value: 'Giá trị trái', + operator: 'Toán tử so sánh', + right_value: 'Giá trị phải', // control.py - SwitchNode - cases: 'Branch Cases', + cases: 'Điều kiện nhánh', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: 'Số lần lặp tối đa', + break_condition: 'Điều kiện ngắt', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: 'Xử lý song song', + max_concurrency: 'Số đồng thời tối đa', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: 'Cấu hình nhánh', + wait_all: 'Chờ tất cả', + fail_fast: 'Thất bại nhanh', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: 'Thời gian chờ', + duration_type: 'Đơn vị thời gian', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: 'Chiến lược hợp nhất', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: 'Ánh xạ biến', + aggregation_mode: 'Chế độ tổng hợp', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: 'Loại mục tiêu', + target_id: 'ID đích', + platform: 'Nền tảng', + message_type: 'Tin nhắnLoại', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: 'Chế độ trả lời', + message_template: 'Mẫu tin nhắn', + long_text_processing: 'Xử lý văn bản dài', + force_delay: 'Trì hoãn bắt buộc', // action.py - CallPipelineNode pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + inherit_context: 'Kế thừa ngữ cảnh', // action.py - StoreDataNode - storage_type: 'Storage Type', - ttl: 'TTL', - key_prefix: 'Key Prefix', + storage_type: 'Loại lưu trữ', + ttl: 'Thời gian hết hạn', + key_prefix: 'Tiền tố khóa', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: 'Tên biến', + variable_scope: 'Phạm vi biến', + set_variable_operation: 'Loại thao tác', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: 'Tuyên bố Mở đầu', + suggested_questions: 'Câu hỏi đề xuất', + show_suggestions: 'Hiển thị gợi ý', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: 'Định dạng đầu ra', + success_message: 'Tin nhắn thành công', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: 'Loại cơ sở dữ liệu', + connection_string: 'Chuỗi kết nối', + query: 'Truy vấn SQL', + query_type: 'Loại truy vấn', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: 'Kết nốiURL', + operation: 'Loại thao tác', + key_template: 'Mẫu khóa', + hash_field: 'Trường băm', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: 'Tên máy chủ', + tool_name: 'Tên công cụ', + arguments_template: 'Mẫu tham số', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: 'Phạm vi', // integration.py - DifyWorkflowNode 'base-url': 'Base URL', 'api-key': 'API Key', 'app-type': 'App Type', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: 'ID cơ sở kiến thức', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode @@ -1903,169 +1907,183 @@ const viVN = { // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: 'Tin nhắn', + sender_id: 'ID người gửi', + sender_name: 'Tên người gửi', + platform: 'Nền tảng', + conversation_id: 'Phiên ID', + is_group: 'Là chat nhóm', + context: 'Ngữ cảnh gỡ lỗi', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: 'Dấu thời gian', + schedule: 'Lịch trình', + cron_timestamp: 'Dấu thời gian Cron', + cron_schedule: 'Cron Biểu thức lịch trình', + cron_context: 'Cron Ngữ cảnh', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: 'Nội dung yêu cầu', + headers: 'Tiêu đề', + query: 'Truy vấn SQL', + method: 'Phương thức yêu cầu', + webhook_body: 'Nội dung yêu cầu Webhook', + webhook_headers: 'Tiêu đề yêu cầu Webhook', + webhook_query: 'Tham số truy vấn Webhook', + webhook_method: 'Phương thức yêu cầu Webhook', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: 'Loại sự kiện', + event_data: 'Sự kiệnDữ liệu', + event_timestamp: 'Dấu thời gian sự kiện', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: 'Phản hồi', + usage: 'Thống kê sử dụng Token', + prompt: 'Gợi ý/Câu hỏi', + context_info: 'Thông tin ngữ cảnh', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: 'Đầu ra', + console: 'Đầu ra console', + code_input: 'Đầu vào mã', + code_output: 'Đầu ra mã', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: 'Mã trạng thái', + http_body: 'Nội dung yêu cầu HTTP', + http_headers: 'Tiêu đề yêu cầu HTTP', + http_response: 'Phản hồi HTTP', + response_headers: 'Tiêu đề phản hồi', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: 'Kết quả', + transform_input: 'Đầu vào chuyển đổi', + transform_result: 'Kết quả chuyển đổi', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: 'Kết quả danh mục', + confidence: 'Độ tin cậy', + all_scores: 'Tất cả điểm số', + question: 'Câu hỏi người dùng', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: 'Định nghĩa tham số', + extraction_success: 'Trích xuất thành công', + extract_text: 'Văn bản đầu vào', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: 'Tài liệu truy xuất', + citations: 'Thông tin trích dẫn', + knowledge_context: 'Ngữ cảnh hợp nhất', + knowledge_query: 'Truy vấn truy xuất', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: 'Đầu ra nhánh đúng', + false: 'Đầu ra nhánh sai', + condition_input: 'Đầu vào điều kiện', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: 'Nhánh khớp', + default: 'Nhánh mặc định', + switch_input: 'Đầu vào chuyển đổi', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: 'Mục hiện tại', + index: 'Chỉ số hiện tại', + results: 'Kết quả', + completed: 'Đã hoàn thành', + loop_items: 'Các mục lặp', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: 'Có phải đầu tiên không?', + is_last: 'Có phải cuối cùng không?', + iterator_array: 'Mảng đầu vào', + iterator_item: 'Phần tử hiện tại', + iterator_index: 'Chỉ số hiện tại', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: 'Danh sách lỗi', + parallel_input: 'Đầu vào song song', + parallel_results: 'Kết quả tất cả nhánh', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: 'Đầu vào truyền qua', + wait_output: 'Đầu ra truyền qua', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: 'Kết quả hợp nhất', + merge_array: 'Kết quả nhóm mảng', + merge_input_1: 'Đầu vào 1', + merge_input_2: 'Đầu vào 2', + merge_input_3: 'Đầu vào 3', + merge_input_4: 'Đầu vào 4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: 'Biến tổng hợp', + aggregator_variables: 'Đầu vào biến', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: 'Trạng thái', + message_id: 'ID tin nhắn', + target: 'ID đích', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: 'Nội dung trả lời', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: 'Phản hồi Pipeline', + pipeline_result: 'Kết quả đầy đủ', + pipeline_query: 'Nội dung truy vấn', + context_data: 'Dữ liệu ngữ cảnh', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: 'Trạng thái lưu trữ', + store_key: 'Khóa lưu trữ', + store_value: 'Giá trị lưu trữ', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: 'Giá trị biến', + variable_result: 'Kết quả thiết lập biến', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: 'Tuyên bố mở đầu', + suggested_questions: 'Câu hỏi đề xuất', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: 'Đầu ra quy trình', + final_result: 'Kết quả cuối cùng', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: 'Kết quả truy vấn', + row_count: 'Số hàng', + query_success: 'Truy vấn thành công', + query_params: 'Tham số truy vấn', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: 'Kết quả Redis', + redis_success: 'Redis thành công', + redis_key: 'Khóa Redis', + redis_value: 'Giá trị Redis', + error: 'Lỗi', + plugin_input: 'Đầu vào plugin', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: 'Kết quả công cụ', + tool_success: 'Công cụ thành công', + mcp_arguments: 'Tham số công cụ', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: 'Kết quả bộ nhớ', + memory_success: 'Bộ nhớ thành công', + memory_value: 'Giá trị lưu trữ', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'Câu trả lời', + dify_success: 'Dify thành công', + dify_query: 'Đầu vào/Truy vấn người dùng', + dify_conversation_id: 'ID phiên', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: 'Kết quả tìm kiếm', + knowledge_base_query: 'Nội dung truy vấn', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: 'Kết quả N8n', + n8n_success: 'N8n thành công', + n8n_payload: 'Dữ liệu đầu vào quy trình', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: 'Kết quả luồng', + flow_success: 'Luồng thành công', + langflow_input: 'Nội dung đầu vào', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: 'Trả lời bot', + bot_success: 'Bot thành công', + coze_query: 'Đầu vào/Truy vấn người dùng', + coze_conversation_id: 'ID phiên', + bot_conversation_id: 'ID phiên', + sender: 'Người gửi', + event: 'Sự kiện', + trigger_time: 'Thời gian kích hoạt', + scores: 'Điểm số', + missing: 'Tham số thiếu', + parsed: 'Kết quả phân tích', + chunks: 'Khối văn bản', + count: 'Số lượng', + execution_id: 'ID thực thi', + suggestions: 'Câu hỏi đề xuất', + embedding: 'Vector', + dimensions: 'Chiều', + intent: 'Ý định', + entities: 'Thực thể', }, }, diff --git a/web/src/i18n/locales/zh-Hant.ts b/web/src/i18n/locales/zh-Hant.ts index 99a8dd73..16108dd5 100644 --- a/web/src/i18n/locales/zh-Hant.ts +++ b/web/src/i18n/locales/zh-Hant.ts @@ -58,6 +58,8 @@ const zhHant = { deleteError: '刪除失敗:', addRound: '新增回合', copy: '複製', + undo: '復原', + redo: '重做', copySuccess: '複製成功', copyFailed: '複製失敗', test: '測試', @@ -1275,376 +1277,378 @@ const zhHant = { }, }, workflows: { - title: 'Workflows', + title: '工作流程', description: - 'Create and manage visual workflows for complex message processing logic', - createWorkflow: 'Create Workflow', - selectFromSidebar: 'Select a workflow from the sidebar', - editWorkflow: 'Edit Workflow', - newWorkflow: 'New Workflow', - getWorkflowListError: 'Failed to get workflow list: ', - workflowName: 'Workflow Name', - workflowDescription: 'Workflow Description', - workflowNameRequired: 'Workflow name is required', - defaultDescription: 'A workflow', - getWorkflowError: 'Failed to get workflow: ', - loadError: 'Failed to load workflow', - saveSuccess: 'Saved successfully', - saveError: 'Failed to save: ', - createSuccess: 'Workflow created successfully', - createError: 'Failed to create: ', - deleteSuccess: 'Deleted successfully', - deleteError: 'Failed to delete: ', - deleteConfirmation: 'Are you sure you want to delete this workflow?', - copySuccess: 'Copied successfully', - copyError: 'Failed to copy: ', - export: 'Export', - import: 'Import', - exportSuccess: 'Workflow exported', - importSuccess: 'Workflow imported', - importError: 'Import failed: Invalid file format', - publish: 'Publish', - publishSuccess: 'Published successfully', - publishError: 'Failed to publish', - configuration: 'Configuration', - executions: 'Executions', - editor: 'Editor', + '建立和管理視覺化工作流程,實現複雜的訊息處理邏輯', + createWorkflow: '建立工作流程', + selectFromSidebar: '從側邊欄選擇一個工作流程', + editWorkflow: '編輯工作流程', + newWorkflow: '新工作流程', + getWorkflowListError: '取得工作流程清單失敗:', + workflowName: '工作流程名稱', + workflowDescription: '工作流程描述', + workflowNameRequired: '工作流程名稱為必填', + defaultDescription: '一個工作流程', + getWorkflowError: '取得工作流程失敗:', + loadError: '載入工作流程失敗', + saveSuccess: '儲存成功', + saveError: '儲存失敗:', + createSuccess: '工作流程建立成功', + createError: '建立失敗:', + deleteSuccess: '刪除成功', + deleteError: '刪除失敗:', + deleteConfirmation: '您確定要刪除此工作流程嗎?', + copySuccess: '複製成功', + copyError: '複製失敗:', + export: '匯出', + import: '匯入', + exportSuccess: '工作流程已匯出', + importSuccess: '工作流程已匯入', + importError: '匯入失敗:檔案格式無效', + publish: '發佈', + publishSuccess: '發佈成功', + publishError: '發佈失敗', + configuration: '設定', + executions: '執行記錄', + editor: '編輯器', debugChat: '對話除錯', - basicInfo: 'Basic Info', - basicInfoDesc: 'Set workflow name, icon and description', - basicInfoDescription: 'Set workflow name and description', - dangerZone: 'Danger Zone', - dangerZoneDesc: 'Irreversible operations', - dangerZoneDescription: 'Irreversible operations', - deleteWorkflowAction: 'Delete this workflow', + basicInfo: '基本資訊', + basicInfoDesc: '設定工作流名稱、圖標和描述', + basicInfoDescription: '設定工作流名稱和描述', + dangerZone: '危險區域', + dangerZoneDesc: '不可逆操作', + dangerZoneDescription: '不可逆操作', + deleteWorkflowAction: '刪除此工作流', deleteWorkflowHint: - 'Once deleted, all associated configurations will be permanently removed and cannot be recovered.', - deleteWorkflow: 'Delete Workflow', - deleteConfirm: 'Confirm Delete', + '一旦刪除,所有相關配置將被永久移除且無法恢復。', + deleteWorkflow: '刪除工作流', + deleteConfirm: '確認刪除', deleteConfirmDesc: - 'Are you sure you want to delete workflow "{{name}}"? This action cannot be undone.', + '您確定要刪除工作流「{{name}}」嗎?此操作無法撤銷。', // Form component - name: 'Name', - namePlaceholder: 'Enter workflow name', - descriptionPlaceholder: 'Enter workflow description (optional)', - enabled: 'Enabled', - enabledDesc: 'When enabled, the workflow can be triggered for execution', - loading: 'Loading...', - info: 'Workflow Info', + name: '名稱', + namePlaceholder: '輸入工作流名稱', + descriptionPlaceholder: '輸入工作流描述(可選)', + enabled: '已啟用', + enabledDesc: '啟用後,工作流可被觸發執行', + loading: '載入中...', + info: '工作流資訊', uuid: 'UUID', - version: 'Version', - createdAt: 'Created At', - updatedAt: 'Updated At', + version: '版本', + createdAt: '建立時間', + updatedAt: '更新時間', // Executions tab - totalExecutions: '{{count}} execution(s) total', - statistics: 'Statistics', - successfulCount: '{{count}} successful', - successRate: 'Success Rate', - averageDuration: 'Avg. Duration', - perExecution: 'per execution', - failedExecutions: 'Failed', - lastExecution: 'Last run', - filterByStatus: 'Filter by status', - allStatuses: 'All statuses', - manualTrigger: 'Manual Trigger', - executionId: 'Execution ID', - status: 'Status', - triggerType: 'Trigger Type', - startedAt: 'Started At', - duration: 'Duration', - noExecutions: 'No executions yet', - executionDetails: 'Execution Details', - error: 'Error', - nodeExecutions: 'Node Executions', - result: 'Result', - 'status.pending': 'Pending', - 'status.running': 'Running', - 'status.completed': 'Completed', - 'status.failed': 'Failed', - 'status.cancelled': 'Cancelled', + totalExecutions: '共 {{count}} 次執行', + statistics: '統計資訊', + successfulCount: '{{count}} 次成功', + successRate: '成功率', + averageDuration: '平均時長', + perExecution: '每次執行', + failedExecutions: '失敗', + lastExecution: '最後執行', + filterByStatus: '按狀態篩選', + allStatuses: '所有狀態', + manualTrigger: '手動觸發', + executionId: '執行ID', + status: '狀態', + triggerType: '觸發類型', + startedAt: '開始時間', + duration: '時長', + noExecutions: '尚無執行記錄', + executionDetails: '執行詳情', + error: '錯誤', + nodeExecutions: '節點執行', + result: '結果', + 'status.pending': '等待中', + 'status.running': '執行中', + 'status.completed': '已完成', + 'status.failed': '失敗', + 'status.cancelled': '已取消', // Editor component translations - nodePalette: 'Node Palette', - properties: 'Properties', - zoomIn: 'Zoom In', - zoomOut: 'Zoom Out', - fitView: 'Fit View', - unsavedChanges: 'Unsaved changes', - paste: 'Paste', - deleted: 'Deleted', - nothingToCopy: 'No nodes selected to copy', - nothingToPaste: 'Clipboard is empty', - copied: 'Copied {{count}} node(s)', - pasted: 'Pasted {{count}} node(s)', - nodesSelected: '{{count}} node(s) selected', - edgesSelected: '{{count}} edge(s) selected', + nodePalette: '節點面板', + properties: '屬性', + zoomIn: '放大', + zoomOut: '縮小', + fitView: '適應視圖', + unsavedChanges: '未保存的更改', + paste: '粘貼', + deleted: '已刪除', + nothingToCopy: '沒有選中要複製的節點', + nothingToPaste: '剪貼板為空', + copied: '已複製 {{count}} 個節點', + pasted: '已粘貼 {{count}} 個節點', + nodesSelected: '已選中 {{count}} 個節點', + edgesSelected: '已選中 {{count}} 條連線', // Node palette - searchNodes: 'Search nodes...', - loadingNodeTypes: 'Loading node types...', - noNodesFound: 'No matching nodes found', - clearSearch: 'Clear search', - dragToAdd: 'Drag nodes to add to canvas', + searchNodes: '搜索節點...', + loadingNodeTypes: '載入節點類型中...', + noNodesFound: '未找到匹配的節點', + clearSearch: '清除搜索', + dragToAdd: '拖動節點以添加到畫布', // Property panel - selectNodeOrEdge: 'Select a node or edge', + selectNodeOrEdge: '選擇一個節點或連線', selectNodeOrEdgeHint: - 'Click on a node or edge in the canvas to view and edit its properties', - edgeProperties: 'Edge Properties', - nodeProperties: 'Node Properties', - condition: 'Condition', - hasCondition: 'Set', + '點擊畫布中的節點或連線以查看和編輯其屬性', + edgeProperties: '連線屬性', + nodeProperties: '節點屬性', + condition: '條件', + hasCondition: '已設定', conditionPlaceholder: - 'Enter condition expression, e.g. output.success == true', + '輸入條件表達式,例如 output.success == true', conditionHelp: - 'When condition is empty, this edge will always be executed. Use {{variable}} to reference context variables.', - deleteEdge: 'Delete Edge', - deleteEdgeConfirm: 'Confirm Delete Edge', - deleteEdgeConfirmDesc: 'This edge will be permanently removed.', - nodeLabel: 'Node Label', - nodeLabelPlaceholder: 'Enter node display name', - nodeId: 'Node ID', - inputOutputVariables: 'Input/Output Variables', - inputs: 'Inputs', - outputs: 'Outputs', - availableVariables: 'Available Variables', - globalVariables: 'Global Variables', - messageContent: 'Message Content', - messageSender: 'Sender', + '當條件為空時,此連線將始終執行。使用 {{variable}} 引用上下文變數。', + deleteEdge: '刪除連線', + deleteEdgeConfirm: '確認刪除連線', + deleteEdgeConfirmDesc: '此連線將被永久移除。', + nodeLabel: '節點標籤', + nodeLabelPlaceholder: '輸入節點顯示名稱', + nodeId: '節點ID', + inputOutputVariables: '輸入/輸出變數', + inputs: '輸入', + outputs: '輸出', + availableVariables: '可用變數', + globalVariables: '全域變數', + messageContent: '訊息內容', + messageSender: '發送者', platform: 'Platform', sessionId: 'Session ID', - timestamp: 'Timestamp', - nodeConfig: 'Node Configuration', - noConfigOptions: 'No configuration options for this node type', - deleteNode: 'Delete Node', - deleteNodeConfirm: 'Confirm Delete Node', + timestamp: '時間戳', + nodeConfig: '節點配置', + noConfigOptions: '此節點類型沒有配置選項', + deleteNode: '刪除節點', + deleteNodeConfirm: '確認刪除節點', deleteNodeConfirmDesc: - 'This node and all its connections will be permanently removed.', + '此節點及其所有連接將被永久移除。', // Node inputs/outputs i18n (for port labels) nodeInputs: { // Common inputs - input: 'Input', - message: 'Message', - text: 'Text', - query: 'Query', - data: 'Data', - condition: 'Condition', - value: 'Value', + input: '輸入', + message: '訊息', + text: '文本', + query: '查詢', + data: '數據', + condition: '條件', + value: '值', // Trigger inputs - content: 'Content', - context: 'Context', - body: 'Request Body', - variables: 'Variables', - items: 'Items', - arguments: 'Arguments', + content: '內容', + context: '上下文', + body: '請求主體', + variables: '變數', + items: '項目', + arguments: '參數', // AI/Process inputs - question: 'Question', - parameters: 'Parameters', - key: 'Key', + question: '問題', + parameters: '參數', + key: '鍵', // Control inputs - case_1: 'Case 1', - case_2: 'Case 2', - branch_1: 'Branch 1', - branch_2: 'Branch 2', + case_1: '情況 1', + case_2: '情況 2', + branch_1: '分支 1', + branch_2: '分支 2', // Action inputs - notification_id: 'Notification ID', + notification_id: '通知ID', // Integration inputs - key_template: 'Key Template', - hash_field: 'Hash Field', - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', - scope: 'Scope', + key_template: '鍵模板', + hash_field: '雜湊欄位', + server_name: '伺服器名稱', + tool_name: '工具名稱', + arguments_template: '參數模板', + scope: '範圍', + payload: '負載', + input_value: '輸入值', }, // Data type labels - 'type.string': 'String', - 'type.object': 'Object', - 'type.array': 'Array', - 'type.boolean': 'Boolean', - 'type.number': 'Number', - 'type.any': 'Any', - 'type.datetime': 'DateTime', + 'type.string': '字串', + 'type.object': '物件', + 'type.array': '陣列', + 'type.boolean': '布林值', + 'type.number': '數字', + 'type.any': '任意', + 'type.datetime': '日期時間', nodes: { - trigger: 'Triggers', - triggerDescription: 'Starting nodes for workflows', - messageTrigger: 'Message Trigger', - messageTriggerDescription: 'Triggered when a message is received', - scheduleTrigger: 'Schedule Trigger', - scheduleTriggerDescription: 'Triggered on a schedule', - cronTrigger: 'Cron Trigger', - cronTriggerDescription: 'Trigger workflow on a scheduled time', - webhookTrigger: 'Webhook Trigger', - webhookTriggerDescription: 'Triggered via HTTP request', - eventTrigger: 'Event Trigger', - eventTriggerDescription: 'Triggered on system events', - process: 'AI/Process', - processDescription: 'Data processing nodes', - aiProcess: 'AI Processing', - aiProcessDescription: 'Process messages using AI models', - llmCall: 'LLM Call', + trigger: '觸發器', + triggerDescription: '工作流的起始節點', + messageTrigger: '訊息觸發器', + messageTriggerDescription: '當收到訊息時觸發', + scheduleTrigger: '排程觸發器', + scheduleTriggerDescription: '按排程觸發', + cronTrigger: 'Cron 觸發器', + cronTriggerDescription: '按排程時間觸發工作流', + webhookTrigger: 'Webhook 觸發器', + webhookTriggerDescription: '通過 HTTP 請求觸發', + eventTrigger: '事件觸發器', + eventTriggerDescription: '在系統事件時觸發', + process: 'AI/處理', + processDescription: '數據處理節點', + aiProcess: 'AI 處理', + aiProcessDescription: '使用 AI 模型處理訊息', + llmCall: 'LLM 呼叫', llmCallDescription: - 'Invoke large language model for conversation or generation', - codeProcess: 'Code Processing', - codeProcessDescription: 'Execute custom code', - codeExecutor: 'Code Executor', - codeExecutorDescription: 'Execute Python/JavaScript code', - templateProcess: 'Template Processing', - templateProcessDescription: 'Format output using templates', - httpRequest: 'HTTP Request', - httpRequestDescription: 'Send HTTP requests', - dataTransform: 'Data Transform', - dataTransformDescription: 'Transform data format', - questionClassifier: 'Question Classifier', + '呼叫大型語言模型進行對話或生成', + codeProcess: '程式碼處理', + codeProcessDescription: '執行自訂程式碼', + codeExecutor: '程式碼執行器', + codeExecutorDescription: '執行 Python/JavaScript 程式碼', + templateProcess: '模板處理', + templateProcessDescription: '使用模板格式化輸出', + httpRequest: 'HTTP 請求', + httpRequestDescription: '發送 HTTP 請求', + dataTransform: '數據轉換', + dataTransformDescription: '轉換數據格式', + questionClassifier: '問題分類器', questionClassifierDescription: - 'Classify user questions into predefined categories using LLM', - parameterExtractor: 'Parameter Extractor', + '使用 LLM 將使用者問題分類到預定義類別', + parameterExtractor: '參數提取器', parameterExtractorDescription: - 'Extract structured parameters from text using LLM', - knowledgeRetrieval: 'Knowledge Retrieval', + '使用 LLM 從文本中提取結構化參數', + knowledgeRetrieval: '知識檢索', knowledgeRetrievalDescription: - 'Retrieve relevant content from knowledge base', - textTemplate: 'Text Template', + '從知識庫中檢索相關內容', + textTemplate: '文本模板', textTemplateDescription: - 'Generate text using templates with variable interpolation', - jsonTransform: 'JSON Transform', - jsonTransformDescription: 'Transform JSON data using expressions', - dataAggregator: 'Data Aggregator', - dataAggregatorDescription: 'Aggregate data from multiple sources', - textSplitter: 'Text Splitter', - textSplitterDescription: 'Split text into smaller chunks', - variableAssignment: 'Variable Assignment', - variableAssignmentDescription: 'Assign values to workflow variables', - control: 'Control Flow', - controlDescription: 'Flow control nodes', - condition: 'Condition Branch', - conditionDescription: 'Branch based on conditions', - switch: 'Switch', - switchDescription: 'Multi-way branching', - loop: 'Loop', - loopDescription: 'Repeat execution', - iterator: 'Iterator', - iteratorDescription: 'Iterate over array elements', - parallel: 'Parallel', - parallelDescription: 'Execute multiple branches in parallel', - wait: 'Wait', - waitDescription: 'Wait for specified time', - delay: 'Delay', - delayDescription: 'Wait for a specified time', - merge: 'Merge', - mergeDescription: 'Merge multiple branches', - variableAggregator: 'Variable Aggregator', + '使用帶變數插值的模板生成文本', + jsonTransform: 'JSON 轉換', + jsonTransformDescription: '使用表達式轉換 JSON 數據', + dataAggregator: '數據聚合器', + dataAggregatorDescription: '聚合來自多個來源的數據', + textSplitter: '文本分割器', + textSplitterDescription: '將文本分割成較小的塊', + variableAssignment: '變數賦值', + variableAssignmentDescription: '為工作流變數賦值', + control: '控制流', + controlDescription: '流程控制節點', + condition: '條件分支', + conditionDescription: '基於條件進行分支', + switch: '開關', + switchDescription: '多路分支', + loop: '迴圈', + loopDescription: '重複執行', + iterator: '迭代器', + iteratorDescription: '迭代陣列元素', + parallel: '並行', + parallelDescription: '並行執行多個分支', + wait: '等待', + waitDescription: '等待指定時間', + delay: '延遲', + delayDescription: '等待指定時間', + merge: '合併', + mergeDescription: '合併多個分支', + variableAggregator: '變數聚合器', variableAggregatorDescription: - 'Aggregate variable outputs from multiple branches', - action: 'Actions', - actionDescription: 'Action execution nodes', - sendMessage: 'Send Message', - sendMessageDescription: 'Send message to platform', - replyMessage: 'Reply Message', + '聚合來自多個分支的變數輸出', + action: '動作', + actionDescription: '動作執行節點', + sendMessage: '發送訊息', + sendMessageDescription: '向平台發送訊息', + replyMessage: '回覆訊息', replyMessageDescription: - 'Reply to the message that triggered the workflow', - storeData: 'Store Data', - storeDataDescription: 'Store data to database', - callPipeline: 'Call Pipeline', - callPipelineDescription: 'Call an existing Pipeline', - setVariable: 'Set Variable', - setVariableDescription: 'Set context variable', - openingStatement: 'Opening Statement', + '回覆觸發工作流的訊息', + storeData: '儲存數據', + storeDataDescription: '將數據儲存到資料庫', + callPipeline: '呼叫流水線', + callPipelineDescription: '呼叫現有的流水線', + setVariable: '設定變數', + setVariableDescription: '設定上下文變數', + openingStatement: '開場白', openingStatementDescription: - 'Provide conversation opener and suggested questions', - end: 'End', - endDescription: 'Mark the end of workflow execution', - log: 'Log', - logDescription: 'Record log information', - integration: 'Integration', - integrationDescription: 'Third-party platform integration nodes', - difyWorkflow: 'Dify Workflow', - difyWorkflowDescription: 'Call Dify platform workflow', - difyKnowledgeQuery: 'Dify Knowledge Query', - difyKnowledgeQueryDescription: 'Query Dify knowledge base', - n8nWorkflow: 'N8n Workflow', - n8nWorkflowDescription: 'Call n8n workflow', - langflowFlow: 'Langflow Flow', - langflowFlowDescription: 'Call Langflow flow', - cozeBot: 'Coze Bot', - cozeBotDescription: 'Call Coze Bot', + '提供對話開場白和建議問題', + end: '結束', + endDescription: '標記工作流執行結束', + log: '日誌', + logDescription: '記錄日誌資訊', + integration: '整合', + integrationDescription: '第三方平台整合節點', + difyWorkflow: 'Dify 工作流', + difyWorkflowDescription: '呼叫 Dify 平台工作流', + difyKnowledgeQuery: 'Dify 知識查詢', + difyKnowledgeQueryDescription: '查詢 Dify 知識庫', + n8nWorkflow: 'N8n 工作流', + n8nWorkflowDescription: '呼叫 n8n 工作流', + langflowFlow: 'Langflow 流程', + langflowFlowDescription: '呼叫 Langflow 流程', + cozeBot: 'Coze 機器人', + cozeBotDescription: '呼叫 Coze 機器人', // Data & Tools integration nodes - databaseQuery: 'Database Query', - databaseQueryDescription: 'Execute database queries', - redisOperation: 'Redis Operation', - redisOperationDescription: 'Perform Redis cache operations', - mcpTool: 'MCP Tool', - mcpToolDescription: 'Invoke an MCP tool', - memoryStore: 'Memory Store', - memoryStoreDescription: 'Store and retrieve data from workflow memory', + databaseQuery: '資料庫查詢', + databaseQueryDescription: '執行資料庫查詢', + redisOperation: 'Redis 操作', + redisOperationDescription: '執行 Redis 快取操作', + mcpTool: 'MCP 工具', + mcpToolDescription: '呼叫 MCP 工具', + memoryStore: '記憶體儲存', + memoryStoreDescription: '從工作流記憶體中儲存和檢索數據', }, executionHistory: { - title: 'Execution History', - noExecutions: 'No executions yet', - status: 'Status', - startTime: 'Start Time', - duration: 'Duration', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - cancelled: 'Cancelled', - viewDetails: 'View Details', - cancel: 'Cancel Execution', - retry: 'Retry', - nodeResults: 'Node Execution Results', + title: '執行歷史', + noExecutions: '尚無執行記錄', + status: '狀態', + startTime: '開始時間', + duration: '時長', + running: '執行中', + completed: '已完成', + failed: '失敗', + cancelled: '已取消', + viewDetails: '查看詳情', + cancel: '取消執行', + retry: '重試', + nodeResults: '節點執行結果', }, versions: { - title: 'Version History', - current: 'Current Version', - rollback: 'Rollback to this version', + title: '版本歷史', + current: '當前版本', + rollback: '回滾到此版本', rollbackConfirm: - 'Are you sure you want to rollback to this version? Current changes will be lost.', - rollbackSuccess: 'Rollback successful', - rollbackError: 'Failed to rollback: ', + '您確定要回滾到此版本嗎?當前更改將會丟失。', + rollbackSuccess: '回滾成功', + rollbackError: '回滾失敗:', }, // Debug and monitoring - debug: 'Debug', - debugMode: 'Debug Mode', - debugPanel: 'Debug Panel', - startDebug: 'Start Debug', - pauseDebug: 'Pause', - resumeDebug: 'Resume', - stepDebug: 'Step', - stopDebug: 'Stop', - debugContext: 'Debug Context', - simulatedMessage: 'Simulated Message', - simulatedMessagePlaceholder: 'Enter the message content to simulate', - senderId: 'Sender ID', - senderIdPlaceholder: 'Sender unique identifier', - senderName: 'Sender Name', - senderNamePlaceholder: 'Sender display name', - conversationId: 'Conversation ID', + debug: '除錯', + debugMode: '除錯模式', + debugPanel: '除錯面板', + startDebug: '開始除錯', + pauseDebug: '暫停', + resumeDebug: '繼續', + stepDebug: '單步執行', + stopDebug: '停止', + debugContext: '除錯上下文', + simulatedMessage: '模擬訊息', + simulatedMessagePlaceholder: '輸入要模擬的訊息內容', + senderId: '發送者ID', + senderIdPlaceholder: '發送者唯一識別碼', + senderName: '發送者名稱', + senderNamePlaceholder: '發送者顯示名稱', + conversationId: '對話ID', conversationIdPlaceholder: 'Conversation unique identifier', - isGroup: 'Group Chat', - customVariables: 'Custom Variables', - addVariable: 'Add Variable', - variableName: 'Variable Name', - variableValue: 'Variable Value', - watchedVariables: 'Watched Variables', - addWatchVariable: 'Add Watch', - nodeStates: 'Node States', - breakpoints: 'Breakpoints', - toggleBreakpoint: 'Toggle Breakpoint', - breakpointSet: 'Breakpoint set', - breakpointRemoved: 'Breakpoint removed', - debugLogs: 'Debug Logs', - noLogs: 'No logs yet', - clearLogs: 'Clear Logs', - autoScroll: 'Auto Scroll', + isGroup: '群組聊天', + customVariables: '自訂變數', + addVariable: '新增變數', + variableName: '變數名稱', + variableValue: '變數值', + watchedVariables: '監視變數', + addWatchVariable: '新增監視', + nodeStates: '節點狀態', + breakpoints: '中斷點', + toggleBreakpoint: '切換中斷點', + breakpointSet: '已設定中斷點', + breakpointRemoved: '已移除中斷點', + debugLogs: '除錯日誌', + noLogs: '尚無日誌', + clearLogs: '清除日誌', + autoScroll: '自動捲動', debugState: { - idle: 'Idle', - running: 'Running', - paused: 'Paused', - completed: 'Completed', - error: 'Error', + idle: '閒置', + running: '執行中', + paused: '已暫停', + completed: '已完成', + error: '錯誤', }, nodeStatus: { - pending: 'Pending', - running: 'Running', - completed: 'Completed', - failed: 'Failed', - skipped: 'Skipped', + pending: '等待中', + running: '執行中', + completed: '已完成', + failed: '失敗', + skipped: '已跳過', }, debugDialog: { title: '工作流對話', @@ -1683,330 +1687,344 @@ const zhHant = { uploading: '上傳中...', }, // Execution history and monitoring - filterByDate: 'Filter by Date', - allTime: 'All Time', - today: 'Today', - lastWeek: 'Last Week', - lastMonth: 'Last Month', - showingExecutions: 'Showing {{shown}} / {{total}} executions', - rerun: 'Rerun', - rerunExecution: 'Rerun Execution', - logs: 'Logs', - details: 'Details', - completedAt: 'Completed At', - noNodeExecutions: 'No node executions yet', + filterByDate: '按日期篩選', + allTime: '全部時間', + today: '今天', + lastWeek: '上週', + lastMonth: '上月', + showingExecutions: '顯示 {{shown}} / {{total}} 次執行', + rerun: '重新執行', + rerunExecution: '重新執行', + logs: '日誌', + details: '詳情', + completedAt: '完成時間', + noNodeExecutions: '尚無節點執行記錄', // Node config field labels (used by DynamicFormComponent) nodeConfigFields: { // trigger.py - MessageTriggerNode - conditions: 'Trigger Conditions', - keyword_filter: 'Keyword Filter', - regex_filter: 'Regex Filter', - min_length: 'Min Length', - max_length: 'Max Length', - require_mention: 'Require Mention', - respond_rules: 'Group Respond Rules', - access_control: 'Access Control', + conditions: '觸發條件', + keyword_filter: '關鍵字篩選', + regex_filter: '正則表達式篩選', + min_length: '最小長度', + max_length: '最大長度', + require_mention: '需要提及', + respond_rules: '群組回應規則', + access_control: '存取控制', // trigger.py - CronTriggerNode - cron: 'Cron Expression', - timezone: 'Timezone', + cron: 'Cron 表達式', + timezone: '時區', // trigger.py - WebhookTriggerNode - path: 'Webhook Path', - allowed_methods: 'Allowed HTTP Methods', - content_type: 'Content-Type', - auth_type: 'Authentication Type', - auth_key: 'Auth Key', - validation: 'Request Validation', - timeout: 'Timeout', + path: 'Webhook 路徑', + allowed_methods: '允許的 HTTP 方法', + content_type: '內容類型', + auth_type: '驗證類型', + auth_key: '驗證金鑰', + validation: '請求驗證', + timeout: '逾時時間', // trigger.py - EventTriggerNode - event_types: 'Event Types', - filter: 'Event Filter', - debounce_ms: 'Debounce Time', + event_types: '事件類型', + filter: '事件篩選', + debounce_ms: '防抖時間', // process.py - LLMCallNode - model: 'Model', - prompt_template: 'Prompt Template', - system_prompt: 'System Prompt', - temperature: 'Temperature', + model: '模型', + prompt_template: '提示詞範本', + system_prompt: '系統提示詞', + temperature: '溫度', top_p: 'Top P', - frequency_penalty: 'Frequency Penalty', - presence_penalty: 'Presence Penalty', - max_tokens: 'Max Tokens', - stop_sequences: 'Stop Sequences', - seed: 'Random Seed', - stream: 'Stream Output', - use_conversation_history: 'Use Conversation History', + frequency_penalty: '頻率懲罰', + presence_penalty: '存在懲罰', + max_tokens: '最大 Token 數', + stop_sequences: '停止序列', + seed: '隨機種子', + stream: '串流輸出', + use_conversation_history: '使用對話歷史', // process.py - CodeExecutorNode - language: 'Programming Language', - code: 'Code', + language: '程式語言', + code: '程式碼', // process.py - HTTPRequestNode - url: 'Request URL', - method: 'Request Method', - auth_config: 'Auth Configuration', + url: '請求 URL', + method: '請求方法', + auth_config: '驗證配置', // process.py - DataTransformNode - transform_type: 'Transform Type', - template: 'Template', - expression: 'Expression', - output_type: 'Output Type', + transform_type: '轉換類型', + template: '範本', + expression: '表達式', + output_type: '輸出類型', // process.py - QuestionClassifierNode - categories: 'Categories', - instruction: 'Instruction', + categories: '分類', + instruction: '指令', // process.py - ParameterExtractorNode - parameters: 'Parameter Definitions', + parameters: '參數定義', // process.py - KnowledgeRetrievalNode - knowledge_bases: 'Knowledge Bases', - top_k: 'Top K Results', - score_threshold: 'Score Threshold', - search_method: 'Search Method', - enable_citations: 'Enable Citations', + knowledge_bases: '知識庫', + top_k: 'Top K 結果', + score_threshold: '分數閾值', + search_method: '搜尋方法', + enable_citations: '啟用引用', // control.py - ConditionNode - condition_type: 'Condition Type', - condition_expression: 'Condition Expression', - left_value: 'Left Value', - operator: 'Comparison Operator', - right_value: 'Right Value', + condition_type: '條件類型', + condition_expression: '條件表達式', + left_value: '左值', + operator: '比較運算子', + right_value: '右值', // control.py - SwitchNode - cases: 'Branch Cases', + cases: '分支情況', // control.py - LoopNode - max_iterations: 'Max Iterations', - break_condition: 'Break Condition', + max_iterations: '最大迭代次數', + break_condition: '中斷條件', // control.py - IteratorNode - parallel: 'Parallel Processing', - max_concurrency: 'Max Concurrency', + parallel: '並行處理', + max_concurrency: '最大並行數', // control.py - ParallelNode - branches: 'Branch Configuration', - wait_all: 'Wait All', - fail_fast: 'Fail Fast', + branches: '分支配置', + wait_all: '等待全部', + fail_fast: '快速失敗', // control.py - WaitNode - duration: 'Duration', - duration_type: 'Time Unit', + duration: '持續時間', + duration_type: '時間單位', // control.py - MergeNode - merge_strategy: 'Merge Strategy', + merge_strategy: '合併策略', // control.py - VariableAggregatorNode - variable_mappings: 'Variable Mappings', - aggregation_mode: 'Aggregation Mode', + variable_mappings: '變數映射', + aggregation_mode: '聚合模式', // action.py - SendMessageNode - target_type: 'Target Type', - target_id: 'Target ID', - platform: 'Platform', - message_type: 'Message Type', + target_type: '目標類型', + target_id: '目標 ID', + platform: '平台', + message_type: '訊息類型', // action.py - ReplyMessageNode - reply_mode: 'Reply Mode', - message_template: 'Message Template', - long_text_processing: 'Long Text Processing', - force_delay: 'Force Delay', + reply_mode: '回覆模式', + message_template: '訊息範本', + long_text_processing: '長文本處理', + force_delay: '強制延遲', // action.py - CallPipelineNode - pipeline_uuid: 'Pipeline', - inherit_context: 'Inherit Context', + pipeline_uuid: '管道', + inherit_context: '繼承上下文', // action.py - StoreDataNode - storage_type: 'Storage Type', + storage_type: '儲存類型', ttl: 'TTL', - key_prefix: 'Key Prefix', + key_prefix: '鍵前綴', // action.py - SetVariableNode - variable_name: 'Variable Name', - variable_scope: 'Variable Scope', - set_variable_operation: 'Operation Type', + variable_name: '變數名稱', + variable_scope: '變數範圍', + set_variable_operation: '操作類型', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', - show_suggestions: 'Show Suggestions', + statement: '開場白', + suggested_questions: '建議問題', + show_suggestions: '顯示建議', // action.py - EndNode - output_format: 'Output Format', - success_message: 'Success Message', + output_format: '輸出格式', + success_message: '成功訊息', // integration.py - DatabaseQueryNode - connection_type: 'Database Type', - connection_string: 'Connection String', - query: 'SQL Query', - query_type: 'Query Type', + connection_type: '資料庫類型', + connection_string: '連線字串', + query: 'SQL 查詢', + query_type: '查詢類型', // integration.py - RedisOperationNode - connection_url: 'Connection URL', - operation: 'Operation Type', - key_template: 'Key Template', - hash_field: 'Hash Field', + connection_url: '連線 URL', + operation: '操作類型', + key_template: '鍵範本', + hash_field: '雜湊欄位', // integration.py - MCPToolNode - server_name: 'Server Name', - tool_name: 'Tool Name', - arguments_template: 'Arguments Template', + server_name: '伺服器名稱', + tool_name: '工具名稱', + arguments_template: '參數範本', // integration.py - MemoryStoreNode - scope: 'Scope', + scope: '範圍', // integration.py - DifyWorkflowNode - 'base-url': 'Base URL', - 'api-key': 'API Key', - 'app-type': 'App Type', + 'base-url': '基礎 URL', + 'api-key': 'API 金鑰', + 'app-type': '應用類型', // integration.py - DifyKnowledgeQueryNode - dataset_id: 'Dataset ID', + dataset_id: '資料集 ID', // integration.py - N8nWorkflowNode 'webhook-url': 'Webhook URL', // integration.py - LangflowFlowNode - 'flow-id': 'Flow ID', + 'flow-id': '流程 ID', // integration.py - CozeBotNode - 'bot-id': 'Bot ID', - 'api-base': 'API Base URL', + 'bot-id': '機器人 ID', + 'api-base': 'API 基礎 URL', }, // Node outputs i18n nodeOutputs: { // trigger.py - MessageTriggerNode - message: 'Message Content', - sender_id: 'Sender ID', - sender_name: 'Sender Name', - platform: 'Platform', - conversation_id: 'Conversation ID', - is_group: 'Is Group Chat', - context: 'Full Message Context', + message: '訊息內容', + sender_id: '發送者 ID', + sender_name: '發送者名稱', + platform: '平台', + conversation_id: '對話 ID', + is_group: '群組聊天', + context: '完整訊息上下文', // trigger.py - CronTriggerNode - timestamp: 'Trigger Time', - schedule: 'Trigger Schedule', - cron_timestamp: 'Cron Timestamp', - cron_schedule: 'Cron Schedule', - cron_context: 'Cron Context', + timestamp: '觸發時間', + schedule: '觸發排程', + cron_timestamp: 'Cron 時間戳', + cron_schedule: 'Cron 排程', + cron_context: 'Cron 上下文', // trigger.py - WebhookTriggerNode - body: 'Request Body', - headers: 'Request Headers', - query: 'Query Parameters', - method: 'Request Method', - webhook_body: 'Webhook Body', - webhook_headers: 'Webhook Headers', - webhook_query: 'Webhook Query', - webhook_method: 'Webhook Method', + body: '請求主體', + headers: '請求標頭', + query: '查詢參數', + method: '請求方法', + webhook_body: 'Webhook 主體', + webhook_headers: 'Webhook 標頭', + webhook_query: 'Webhook 查詢', + webhook_method: 'Webhook 方法', // trigger.py - EventTriggerNode - event_type: 'Event Type', - event_data: 'Event Data', - event_timestamp: 'Event Timestamp', + event_type: '事件類型', + event_data: '事件資料', + event_timestamp: '事件時間戳', // process.py - LLMCallNode - response: 'Model Response', - usage: 'Token Usage Statistics', - prompt: 'Prompt/Question', - context_info: 'Context Information', + response: '模型回應', + usage: 'Token 使用統計', + prompt: '提示詞/問題', + context_info: '上下文資訊', // process.py - CodeExecutorNode - output: 'Output Data', - console: 'Console Output', - code_input: 'Code Input', - code_output: 'Code Output', + output: '輸出資料', + console: '控制台輸出', + code_input: '程式碼輸入', + code_output: '程式碼輸出', // process.py - HTTPRequestNode - status_code: 'Status Code', - http_body: 'HTTP Body', - http_headers: 'HTTP Headers', - http_response: 'HTTP Response', - response_headers: 'Response Headers', + status_code: '狀態碼', + http_body: 'HTTP 主體', + http_headers: 'HTTP 標頭', + http_response: 'HTTP 回應', + response_headers: '回應標頭', // process.py - DataTransformNode - result: 'Transform Result', - transform_input: 'Transform Input', - transform_result: 'Transform Result', + result: '轉換結果', + transform_input: '轉換輸入', + transform_result: '轉換結果', // process.py - QuestionClassifierNode - category: 'Category Result', - confidence: 'Confidence', - all_scores: 'All Category Scores', - question: 'User Question', + category: '分類結果', + confidence: '信心度', + all_scores: '所有分類分數', + question: '使用者問題', // process.py - ParameterExtractorNode - parameters: 'Extracted Parameters', - extraction_success: 'Extraction Success', - extract_text: 'Input Text', + parameters: '提取的參數', + extraction_success: '提取成功', + extract_text: '輸入文本', // process.py - KnowledgeRetrievalNode - documents: 'Retrieved Documents', - citations: 'Citation Information', - knowledge_context: 'Merged Context', - knowledge_query: 'Retrieval Query', + documents: '檢索的文件', + citations: '引用資訊', + knowledge_context: '合併的上下文', + knowledge_query: '檢索查詢', // control.py - ConditionNode - true: 'True Branch Output', - false: 'False Branch Output', - condition_input: 'Condition Input', + true: '真分支輸出', + false: '假分支輸出', + condition_input: '條件輸入', // control.py - SwitchNode - matched_case: 'Matched Branch Output', - default: 'Default Branch Output', - switch_input: 'Switch Input', + matched_case: '匹配分支輸出', + default: '預設分支輸出', + switch_input: '切換輸入', // control.py - LoopNode - item: 'Current Item', - index: 'Current Index', - results: 'All Iteration Results', - completed: 'Is Completed', - loop_items: 'Items to Iterate', + item: '當前項目', + index: '當前索引', + results: '所有迭代結果', + completed: '是否完成', + loop_items: '要迭代的項目', // control.py - IteratorNode - is_first: 'Is First', - is_last: 'Is Last', - iterator_array: 'Input Array', - iterator_item: 'Current Element', - iterator_index: 'Current Index', + is_first: '是否為第一個', + is_last: '是否為最後一個', + iterator_array: '輸入陣列', + iterator_item: '當前元素', + iterator_index: '當前索引', // control.py - ParallelNode - errors: 'Error List', - parallel_input: 'Parallel Input', - parallel_results: 'All Branch Results', + errors: '錯誤列表', + parallel_input: '並行輸入', + parallel_results: '所有分支結果', // control.py - WaitNode - wait_input: 'Passthrough Input', - wait_output: 'Passthrough Output', + wait_input: '透傳輸入', + wait_output: '透傳輸出', // control.py - MergeNode - merged: 'Merged Result', - merge_array: 'Array Result', - merge_input_1: 'Input 1', - merge_input_2: 'Input 2', - merge_input_3: 'Input 3', - merge_input_4: 'Input 4', + merged: '合併結果', + merge_array: '陣列結果', + merge_input_1: '輸入 1', + merge_input_2: '輸入 2', + merge_input_3: '輸入 3', + merge_input_4: '輸入 4', // control.py - VariableAggregatorNode - aggregated: 'Aggregated Variables', - aggregator_variables: 'Variable Input', + aggregated: '聚合的變數', + aggregator_variables: '變數輸入', // action.py - SendMessageNode - status: 'Send Status', - message_id: 'Message ID', - target: 'Target ID', + status: '發送狀態', + message_id: '訊息 ID', + target: '目標 ID', // action.py - ReplyMessageNode - reply_message: 'Reply Content', + reply_message: '回覆內容', // action.py - CallPipelineNode - pipeline_response: 'Pipeline Response', - pipeline_result: 'Full Result', - pipeline_query: 'Query Content', - context_data: 'Context Data', + pipeline_response: '管道回應', + pipeline_result: '完整結果', + pipeline_query: '查詢內容', + context_data: '上下文資料', // action.py - StoreDataNode - store_status: 'Store Status', - store_key: 'Store Key', - store_value: 'Store Value', + store_status: '儲存狀態', + store_key: '儲存鍵', + store_value: '儲存值', // action.py - SetVariableNode - variable_value: 'Variable Value', - variable_result: 'Set Variable Result', + variable_value: '變數值', + variable_result: '設定變數結果', // action.py - OpeningStatementNode - statement: 'Opening Statement', - suggested_questions: 'Suggested Questions', + statement: '開場白', + suggested_questions: '建議問題', // action.py - EndNode - workflow_output: 'Workflow Output', - final_result: 'Final Result', + workflow_output: '工作流輸出', + final_result: '最終結果', // integration.py - DatabaseQueryNode - query_results: 'Query Results', - row_count: 'Affected/Returned Rows', - query_success: 'Query Success', - query_params: 'Query Parameters', + query_results: '查詢結果', + row_count: '影響/返回的行數', + query_success: '查詢成功', + query_params: '查詢參數', // integration.py - RedisOperationNode - redis_result: 'Operation Result', - redis_success: 'Operation Success', - redis_key: 'Redis Key', - redis_value: 'Redis Value', - error: 'Error Message', - plugin_input: 'Plugin Input', + redis_result: '操作結果', + redis_success: '操作成功', + redis_key: 'Redis 鍵', + redis_value: 'Redis 值', + error: '錯誤訊息', + plugin_input: '插件輸入', // integration.py - MCPToolNode - tool_result: 'Tool Execution Result', - tool_success: 'Tool Call Success', - mcp_arguments: 'Tool Arguments', + tool_result: '工具執行結果', + tool_success: '工具呼叫成功', + mcp_arguments: '工具參數', // integration.py - MemoryStoreNode - memory_result: 'Retrieved/Stored Value', - memory_success: 'Operation Success', - memory_value: 'Value to Store', + memory_result: '檢索/儲存的值', + memory_success: '操作成功', + memory_value: '要儲存的值', // integration.py - DifyWorkflowNode - answer: 'Dify Answer', - dify_success: 'Call Success', - dify_query: 'User Input/Query', - dify_conversation_id: 'Conversation ID', + answer: 'Dify 回答', + dify_success: '呼叫成功', + dify_query: '使用者輸入/查詢', + dify_conversation_id: '對話 ID', // integration.py - DifyKnowledgeQueryNode - search_results: 'Search Results', - knowledge_base_query: 'Query Content', + search_results: '搜尋結果', + knowledge_base_query: '查詢內容', // integration.py - N8nWorkflowNode - n8n_result: 'Workflow Execution Result', - n8n_success: 'Call Success', - n8n_payload: 'Workflow Input Data', + n8n_result: '工作流執行結果', + n8n_success: '呼叫成功', + n8n_payload: '工作流輸入資料', // integration.py - LangflowFlowNode - flow_result: 'Flow Execution Result', - flow_success: 'Call Success', - langflow_input: 'Input Content', + flow_result: '流程執行結果', + flow_success: '呼叫成功', + langflow_input: '輸入內容', // integration.py - CozeBotNode - bot_answer: 'Bot Reply', - bot_success: 'Call Success', - coze_query: 'User Input/Query', - coze_conversation_id: 'Conversation ID', - bot_conversation_id: 'Conversation ID', + bot_answer: '機器人回覆', + bot_success: '呼叫成功', + coze_query: '使用者輸入/查詢', + coze_conversation_id: '對話 ID', + bot_conversation_id: '對話 ID', + sender: '發送者', + event: '事件', + trigger_time: '觸發時間', + scores: '分數', + missing: '缺失參數', + parsed: '解析結果', + chunks: '文本塊', + count: '計數', + execution_id: '執行ID', + suggestions: '建議', + embedding: '嵌入向量', + dimensions: '向量維度', + intent: '意圖', + entities: '實體', }, }, diff --git a/web/todo_translations.json b/web/todo_translations.json new file mode 100644 index 00000000..e1cb1b51 --- /dev/null +++ b/web/todo_translations.json @@ -0,0 +1,1450 @@ +[ + { + "key": "copySuccess", + "zh": "复制成功" + }, + { + "key": "copyError", + "zh": "复制失败:" + }, + { + "key": "exportSuccess", + "zh": "工作流已导出" + }, + { + "key": "importSuccess", + "zh": "工作流已导入" + }, + { + "key": "importError", + "zh": "导入失败:文件格式无效" + }, + { + "key": "publishSuccess", + "zh": "发布成功" + }, + { + "key": "publishError", + "zh": "发布失败" + }, + { + "key": "executions", + "zh": "执行记录" + }, + { + "key": "editor", + "zh": "编辑器" + }, + { + "key": "basicInfo", + "zh": "基础信息" + }, + { + "key": "basicInfoDesc", + "zh": "设置工作流名称、图标和描述" + }, + { + "key": "basicInfoDescription", + "zh": "设置工作流名称和描述" + }, + { + "key": "dangerZoneDesc", + "zh": "不可逆的操作" + }, + { + "key": "dangerZoneDescription", + "zh": "不可逆的操作" + }, + { + "key": "deleteWorkflowAction", + "zh": "删除此工作流" + }, + { + "key": "deleteWorkflowHint", + "zh": "删除后,所有关联配置将被永久移除,且无法恢复。" + }, + { + "key": "deleteConfirmDesc", + "zh": "您确定要删除工作流 \"{{name}}\" 吗?此操作无法撤销。" + }, + { + "key": "descriptionPlaceholder", + "zh": "输入工作流描述(可选)" + }, + { + "key": "enabledDesc", + "zh": "启用后,工作流将可以被触发执行" + }, + { + "key": "loading", + "zh": "加载中..." + }, + { + "key": "createdAt", + "zh": "创建时间" + }, + { + "key": "updatedAt", + "zh": "更新时间" + }, + { + "key": "totalExecutions", + "zh": "共 {{count}} 条执行记录" + }, + { + "key": "statistics", + "zh": "统计分析" + }, + { + "key": "successfulCount", + "zh": "成功 {{count}} 次" + }, + { + "key": "successRate", + "zh": "成功率" + }, + { + "key": "perExecution", + "zh": "每次执行" + }, + { + "key": "failedExecutions", + "zh": "失败次数" + }, + { + "key": "lastExecution", + "zh": "最后执行" + }, + { + "key": "filterByStatus", + "zh": "按状态筛选" + }, + { + "key": "allStatuses", + "zh": "全部状态" + }, + { + "key": "triggerType", + "zh": "触发类型" + }, + { + "key": "startedAt", + "zh": "开始时间" + }, + { + "key": "duration", + "zh": "等待时间" + }, + { + "key": "noExecutions", + "zh": "暂无执行记录" + }, + { + "key": "executionDetails", + "zh": "执行详情" + }, + { + "key": "nodeExecutions", + "zh": "节点执行记录" + }, + { + "key": "nodePalette", + "zh": "节点面板" + }, + { + "key": "unsavedChanges", + "zh": "有未保存的更改" + }, + { + "key": "deleted", + "zh": "已删除" + }, + { + "key": "nothingToCopy", + "zh": "没有选中的节点可复制" + }, + { + "key": "nothingToPaste", + "zh": "剪贴板为空" + }, + { + "key": "copied", + "zh": "已复制 {{count}} 个节点" + }, + { + "key": "pasted", + "zh": "已粘贴 {{count}} 个节点" + }, + { + "key": "nodesSelected", + "zh": "已选中 {{count}} 个节点" + }, + { + "key": "searchNodes", + "zh": "搜索节点..." + }, + { + "key": "loadingNodeTypes", + "zh": "正在加载节点类型..." + }, + { + "key": "noNodesFound", + "zh": "未找到匹配的节点" + }, + { + "key": "clearSearch", + "zh": "清除搜索" + }, + { + "key": "dragToAdd", + "zh": "拖拽节点到画布添加" + }, + { + "key": "selectNodeOrEdge", + "zh": "选择一个节点或连线" + }, + { + "key": "selectNodeOrEdgeHint", + "zh": "点击画布中的节点或连线来查看和编辑其属性" + }, + { + "key": "nodeProperties", + "zh": "节点属性" + }, + { + "key": "condition", + "zh": "条件分支" + }, + { + "key": "hasCondition", + "zh": "已设置" + }, + { + "key": "conditionPlaceholder", + "zh": "输入条件表达式,如: output.success == true" + }, + { + "key": "conditionHelp", + "zh": "条件为空时,该连线将始终被执行。支持使用 {{变量名}} 引用上下文变量。" + }, + { + "key": "deleteEdge", + "zh": "删除连线" + }, + { + "key": "deleteEdgeConfirm", + "zh": "确定删除此连线?" + }, + { + "key": "deleteEdgeConfirmDesc", + "zh": "删除后,该连线将被永久移除。" + }, + { + "key": "nodeLabelPlaceholder", + "zh": "输入节点显示名称" + }, + { + "key": "availableVariables", + "zh": "可用变量" + }, + { + "key": "globalVariables", + "zh": "全局变量" + }, + { + "key": "messageContent", + "zh": "模拟消息" + }, + { + "key": "messageSender", + "zh": "发送者" + }, + { + "key": "timestamp", + "zh": "时间戳" + }, + { + "key": "noConfigOptions", + "zh": "该节点类型暂无配置选项" + }, + { + "key": "deleteNodeConfirm", + "zh": "确定删除此节点?" + }, + { + "key": "deleteNodeConfirmDesc", + "zh": "删除后,该节点及其所有连线将被永久移除。" + }, + { + "key": "context", + "zh": "调试上下文" + }, + { + "key": "body", + "zh": "请求体" + }, + { + "key": "variables", + "zh": "监控变量" + }, + { + "key": "items", + "zh": "项目列表" + }, + { + "key": "parameters", + "zh": "参数定义" + }, + { + "key": "branch_1", + "zh": "分支1输出" + }, + { + "key": "branch_2", + "zh": "分支2输出" + }, + { + "key": "hash_field", + "zh": "哈希字段" + }, + { + "key": "server_name", + "zh": "服务器名称" + }, + { + "key": "tool_name", + "zh": "工具名称" + }, + { + "key": "arguments_template", + "zh": "参数模板" + }, + { + "key": "sender", + "zh": "发送者" + }, + { + "key": "sender_id", + "zh": "发送者 ID" + }, + { + "key": "sender_name", + "zh": "发送者名称" + }, + { + "key": "cron_timestamp", + "zh": "Cron 时间戳" + }, + { + "key": "trigger_time", + "zh": "触发时间" + }, + { + "key": "headers", + "zh": "请求头" + }, + { + "key": "query_params", + "zh": "查询参数" + }, + { + "key": "method", + "zh": "请求方法" + }, + { + "key": "event_type", + "zh": "事件类型" + }, + { + "key": "event_timestamp", + "zh": "事件时间戳" + }, + { + "key": "usage", + "zh": "Token使用统计" + }, + { + "key": "category", + "zh": "分类结果" + }, + { + "key": "missing", + "zh": "缺失参数" + }, + { + "key": "success", + "zh": "是否成功" + }, + { + "key": "chunks", + "zh": "文本块" + }, + { + "key": "prompt", + "zh": "提示/问题" + }, + { + "key": "context_info", + "zh": "上下文信息" + }, + { + "key": "console", + "zh": "控制台输出" + }, + { + "key": "code_input", + "zh": "代码输入" + }, + { + "key": "code_output", + "zh": "代码输出" + }, + { + "key": "http_body", + "zh": "HTTP 请求体" + }, + { + "key": "http_headers", + "zh": "HTTP 请求头" + }, + { + "key": "response_headers", + "zh": "响应头" + }, + { + "key": "transform_input", + "zh": "转换输入" + }, + { + "key": "transform_result", + "zh": "转换结果" + }, + { + "key": "extraction_success", + "zh": "提取成功" + }, + { + "key": "extract_text", + "zh": "输入文本" + }, + { + "key": "documents", + "zh": "检索的文档" + }, + { + "key": "citations", + "zh": "引用信息" + }, + { + "key": "knowledge_context", + "zh": "合并上下文" + }, + { + "key": "true", + "zh": "条件为真输出" + }, + { + "key": "false", + "zh": "条件为假输出" + }, + { + "key": "matched_case", + "zh": "匹配分支" + }, + { + "key": "completed", + "zh": "已完成" + }, + { + "key": "is_first", + "zh": "是否第一个" + }, + { + "key": "is_last", + "zh": "是否最后一个" + }, + { + "key": "switch_input", + "zh": "开关输入" + }, + { + "key": "iterator_array", + "zh": "输入数组" + }, + { + "key": "parallel_input", + "zh": "并行输入" + }, + { + "key": "parallel_results", + "zh": "所有分支结果" + }, + { + "key": "wait_input", + "zh": "透传输入" + }, + { + "key": "wait_output", + "zh": "透传输出" + }, + { + "key": "merged", + "zh": "合并结果" + }, + { + "key": "merge_array", + "zh": "数组结果" + }, + { + "key": "aggregated", + "zh": "聚合变量" + }, + { + "key": "status_code", + "zh": "状态码" + }, + { + "key": "reply_message", + "zh": "回复内容" + }, + { + "key": "pipeline_result", + "zh": "完整结果" + }, + { + "key": "pipeline_query", + "zh": "查询内容" + }, + { + "key": "context_data", + "zh": "上下文数据" + }, + { + "key": "store_key", + "zh": "存储键" + }, + { + "key": "store_value", + "zh": "存储值" + }, + { + "key": "variable_result", + "zh": "设置变量结果" + }, + { + "key": "suggested_questions", + "zh": "建议问题" + }, + { + "key": "suggestions", + "zh": "建议问题" + }, + { + "key": "final_result", + "zh": "最终结果" + }, + { + "key": "query_results", + "zh": "查询结果" + }, + { + "key": "query_success", + "zh": "查询成功" + }, + { + "key": "plugin_input", + "zh": "插件输入" + }, + { + "key": "tool_result", + "zh": "工具结果" + }, + { + "key": "tool_success", + "zh": "工具成功" + }, + { + "key": "mcp_arguments", + "zh": "工具参数" + }, + { + "key": "memory_result", + "zh": "记忆结果" + }, + { + "key": "memory_success", + "zh": "记忆成功" + }, + { + "key": "memory_value", + "zh": "存储值" + }, + { + "key": "dify_query", + "zh": "用户输入/查询" + }, + { + "key": "search_results", + "zh": "搜索结果" + }, + { + "key": "knowledge_base_query", + "zh": "查询内容" + }, + { + "key": "n8n_payload", + "zh": "工作流输入数据" + }, + { + "key": "flow_result", + "zh": "流程结果" + }, + { + "key": "flow_success", + "zh": "流程成功" + }, + { + "key": "langflow_input", + "zh": "输入内容" + }, + { + "key": "bot_answer", + "zh": "机器人回复" + }, + { + "key": "bot_success", + "zh": "机器人成功" + }, + { + "key": "coze_query", + "zh": "用户输入/查询" + }, + { + "key": "webhook_body", + "zh": "Webhook 请求体" + }, + { + "key": "webhook_headers", + "zh": "Webhook 请求头" + }, + { + "key": "webhook_query", + "zh": "Webhook 查询参数" + }, + { + "key": "webhook_method", + "zh": "Webhook 请求方法" + }, + { + "key": "edgeCondition", + "zh": "条件表达式" + }, + { + "key": "noNodeSelected", + "zh": "未选中节点" + }, + { + "key": "selectNodeToEdit", + "zh": "点击节点查看和编辑属性" + }, + { + "key": "dragNodeHint", + "zh": "拖拽节点到画布" + }, + { + "key": "triggerDescription", + "zh": "工作流的起始节点" + }, + { + "key": "messageTrigger", + "zh": "消息触发" + }, + { + "key": "messageTriggerDescription", + "zh": "当收到消息时触发" + }, + { + "key": "scheduleTrigger", + "zh": "定时触发" + }, + { + "key": "scheduleTriggerDescription", + "zh": "按计划定时触发" + }, + { + "key": "cronTrigger", + "zh": "定时触发" + }, + { + "key": "cronTriggerDescription", + "zh": "按定时计划触发工作流" + }, + { + "key": "webhookTriggerDescription", + "zh": "通过 HTTP 请求触发" + }, + { + "key": "eventTrigger", + "zh": "事件触发" + }, + { + "key": "eventTriggerDescription", + "zh": "当系统事件发生时触发" + }, + { + "key": "processDescription", + "zh": "数据处理节点" + }, + { + "key": "aiProcessDescription", + "zh": "使用 AI 模型处理消息" + }, + { + "key": "llmCallDescription", + "zh": "调用大语言模型进行对话或生成" + }, + { + "key": "codeProcess", + "zh": "代码处理" + }, + { + "key": "codeProcessDescription", + "zh": "执行自定义代码" + }, + { + "key": "codeExecutor", + "zh": "代码执行" + }, + { + "key": "codeExecutorDescription", + "zh": "执行 Python/JavaScript 代码" + }, + { + "key": "templateProcessDescription", + "zh": "使用模板格式化输出" + }, + { + "key": "httpRequest", + "zh": "HTTP 请求" + }, + { + "key": "httpRequestDescription", + "zh": "发送 HTTP 请求" + }, + { + "key": "questionClassifierDescription", + "zh": "使用 LLM 将用户问题分类到预定义类别" + }, + { + "key": "parameterExtractor", + "zh": "参数提取器" + }, + { + "key": "parameterExtractorDescription", + "zh": "使用 LLM 从文本中提取结构化参数" + }, + { + "key": "knowledgeRetrieval", + "zh": "知识库检索" + }, + { + "key": "knowledgeRetrievalDescription", + "zh": "从知识库中检索相关内容" + }, + { + "key": "textTemplate", + "zh": "文本模板" + }, + { + "key": "textTemplateDescription", + "zh": "使用模板生成文本" + }, + { + "key": "dataAggregator", + "zh": "数据聚合" + }, + { + "key": "dataAggregatorDescription", + "zh": "聚合多个数据源" + }, + { + "key": "textSplitter", + "zh": "文本分割" + }, + { + "key": "textSplitterDescription", + "zh": "将文本分割成块" + }, + { + "key": "variableAssignment", + "zh": "变量赋值" + }, + { + "key": "variableAssignmentDescription", + "zh": "为工作流变量赋值" + }, + { + "key": "controlDescription", + "zh": "流程控制节点" + }, + { + "key": "conditionDescription", + "zh": "根据条件分流" + }, + { + "key": "switch", + "zh": "多路分支" + }, + { + "key": "switchDescription", + "zh": "多条件分支选择" + }, + { + "key": "loopDescription", + "zh": "重复执行" + }, + { + "key": "iteratorDescription", + "zh": "遍历数组元素" + }, + { + "key": "parallel", + "zh": "并行处理" + }, + { + "key": "parallelDescription", + "zh": "并行执行多个分支" + }, + { + "key": "waitDescription", + "zh": "等待指定时间" + }, + { + "key": "delayDescription", + "zh": "等待指定时间" + }, + { + "key": "mergeDescription", + "zh": "合并多个分支" + }, + { + "key": "variableAggregator", + "zh": "变量聚合器" + }, + { + "key": "variableAggregatorDescription", + "zh": "聚合多个分支的变量输出" + }, + { + "key": "actionDescription", + "zh": "执行动作的节点" + }, + { + "key": "sendMessageDescription", + "zh": "发送消息到平台" + }, + { + "key": "replyMessage", + "zh": "回复消息" + }, + { + "key": "replyMessageDescription", + "zh": "回复触发工作流的消息" + }, + { + "key": "storeDataDescription", + "zh": "存储数据到数据库" + }, + { + "key": "callPipelineDescription", + "zh": "调用现有的 Pipeline" + }, + { + "key": "setVariable", + "zh": "设置变量" + }, + { + "key": "setVariableDescription", + "zh": "设置上下文变量" + }, + { + "key": "openingStatement", + "zh": "对话开场白" + }, + { + "key": "openingStatementDescription", + "zh": "提供对话开场白和建议问题" + }, + { + "key": "endDescription", + "zh": "标记工作流执行结束" + }, + { + "key": "logDescription", + "zh": "记录日志信息" + }, + { + "key": "integrationDescription", + "zh": "第三方平台集成节点" + }, + { + "key": "difyWorkflowDescription", + "zh": "调用 Dify 平台工作流" + }, + { + "key": "difyKnowledgeQuery", + "zh": "Dify 知识库" + }, + { + "key": "difyKnowledgeQueryDescription", + "zh": "查询 Dify 知识库" + }, + { + "key": "n8nWorkflowDescription", + "zh": "调用 n8n 工作流" + }, + { + "key": "langflowFlowDescription", + "zh": "调用 Langflow 流程" + }, + { + "key": "cozeBotDescription", + "zh": "调用扣子 Bot" + }, + { + "key": "databaseQueryDescription", + "zh": "执行数据库查询" + }, + { + "key": "redisOperationDescription", + "zh": "执行 Redis 缓存操作" + }, + { + "key": "memoryStore", + "zh": "记忆存储" + }, + { + "key": "memoryStoreDescription", + "zh": "从工作流记忆中存储和检索数据" + }, + { + "key": "startTime", + "zh": "开始时间" + }, + { + "key": "running", + "zh": "执行中" + }, + { + "key": "nodeResults", + "zh": "节点执行结果" + }, + { + "key": "current", + "zh": "当前版本" + }, + { + "key": "rollback", + "zh": "回滚到此版本" + }, + { + "key": "rollbackConfirm", + "zh": "确定回滚到此版本?当前更改将丢失。" + }, + { + "key": "rollbackSuccess", + "zh": "回滚成功" + }, + { + "key": "rollbackError", + "zh": "回滚失败:" + }, + { + "key": "mode", + "zh": "调试模式" + }, + { + "key": "panel", + "zh": "调试面板" + }, + { + "key": "step", + "zh": "单步执行" + }, + { + "key": "messageContentPlaceholder", + "zh": "输入要模拟的消息内容" + }, + { + "key": "senderId", + "zh": "发送者 ID" + }, + { + "key": "senderIdPlaceholder", + "zh": "发送者唯一标识" + }, + { + "key": "senderName", + "zh": "发送者名称" + }, + { + "key": "senderNamePlaceholder", + "zh": "发送者显示名称" + }, + { + "key": "conversationIdPlaceholder", + "zh": "会话唯一标识" + }, + { + "key": "customVariables", + "zh": "自定义变量" + }, + { + "key": "customVariablesDesc", + "zh": "添加自定义变量用于调试" + }, + { + "key": "variableKey", + "zh": "变量名" + }, + { + "key": "watchedVariables", + "zh": "监控变量" + }, + { + "key": "noWatchedVariables", + "zh": "暂无监控变量" + }, + { + "key": "addWatchVariable", + "zh": "添加监控" + }, + { + "key": "nodeStates", + "zh": "节点状态" + }, + { + "key": "noNodeOutputs", + "zh": "暂无节点输出" + }, + { + "key": "toggleBreakpoint", + "zh": "切换断点" + }, + { + "key": "breakpointSet", + "zh": "断点已设置" + }, + { + "key": "noLogs", + "zh": "暂无日志" + }, + { + "key": "clearLogs", + "zh": "清空日志" + }, + { + "key": "logEntries", + "zh": "条日志" + }, + { + "key": "resetContext", + "zh": "重置上下文" + }, + { + "key": "starting", + "zh": "正在启动调试执行..." + }, + { + "key": "started", + "zh": "调试执行已启动 (ID: {{id}})" + }, + { + "key": "startError", + "zh": "启动调试失败" + }, + { + "key": "unknownError", + "zh": "未知错误" + }, + { + "key": "paused", + "zh": "已暂停" + }, + { + "key": "resumed", + "zh": "执行已恢复" + }, + { + "key": "resumeError", + "zh": "恢复失败" + }, + { + "key": "steppedTo", + "zh": "已执行到节点: {{node}}" + }, + { + "key": "stepError", + "zh": "单步执行失败" + }, + { + "key": "stopped", + "zh": "调试已停止" + }, + { + "key": "debugMode", + "zh": "调试模式" + }, + { + "key": "debugPanel", + "zh": "调试面板" + }, + { + "key": "stepDebug", + "zh": "单步执行" + }, + { + "key": "debugContext", + "zh": "调试上下文" + }, + { + "key": "simulatedMessage", + "zh": "模拟消息" + }, + { + "key": "simulatedMessagePlaceholder", + "zh": "输入要模拟的消息内容" + }, + { + "key": "variableName", + "zh": "变量名" + }, + { + "key": "debugLogs", + "zh": "调试日志" + }, + { + "key": "pending", + "zh": "等待中" + }, + { + "key": "skipped", + "zh": "已跳过" + }, + { + "key": "sessionType", + "zh": "会话类型" + }, + { + "key": "reset", + "zh": "重置对话" + }, + { + "key": "noMessages", + "zh": "暂无消息" + }, + { + "key": "resetSuccess", + "zh": "对话已重置" + }, + { + "key": "resetFailed", + "zh": "重置失败" + }, + { + "key": "connected", + "zh": "WebSocket已连接" + }, + { + "key": "disconnected", + "zh": "WebSocket未连接" + }, + { + "key": "connectionError", + "zh": "WebSocket连接错误" + }, + { + "key": "connectionFailed", + "zh": "WebSocket连接失败" + }, + { + "key": "notConnected", + "zh": "WebSocket未连接,请稍后重试" + }, + { + "key": "imageUploadFailed", + "zh": "图片上传失败" + }, + { + "key": "replyTo", + "zh": "回复给" + }, + { + "key": "filterByDate", + "zh": "按日期筛选" + }, + { + "key": "allTime", + "zh": "全部时间" + }, + { + "key": "lastMonth", + "zh": "最近一个月" + }, + { + "key": "rerun", + "zh": "重新运行" + }, + { + "key": "rerunExecution", + "zh": "重新执行" + }, + { + "key": "completedAt", + "zh": "完成时间" + }, + { + "key": "noNodeExecutions", + "zh": "暂无节点执行记录" + }, + { + "key": "conditions", + "zh": "触发条件" + }, + { + "key": "keyword_filter", + "zh": "关键词过滤" + }, + { + "key": "respond_rules", + "zh": "群响应规则" + }, + { + "key": "allowed_methods", + "zh": "允许的HTTP方法" + }, + { + "key": "validation", + "zh": "请求验证" + }, + { + "key": "event_types", + "zh": "事件类型" + }, + { + "key": "debounce_ms", + "zh": "防抖时间" + }, + { + "key": "prompt_template", + "zh": "提示词模板" + }, + { + "key": "system_prompt", + "zh": "系统提示词" + }, + { + "key": "max_tokens", + "zh": "最大Token数" + }, + { + "key": "stop_sequences", + "zh": "停止序列" + }, + { + "key": "stream", + "zh": "流式输出" + }, + { + "key": "use_conversation_history", + "zh": "使用对话历史" + }, + { + "key": "url", + "zh": "请求URL" + }, + { + "key": "auth_config", + "zh": "认证配置" + }, + { + "key": "transform_type", + "zh": "转换类型" + }, + { + "key": "categories", + "zh": "分类类别" + }, + { + "key": "knowledge_bases", + "zh": "知识库" + }, + { + "key": "score_threshold", + "zh": "相似度阈值" + }, + { + "key": "search_method", + "zh": "搜索方法" + }, + { + "key": "enable_citations", + "zh": "启用引用" + }, + { + "key": "condition_expression", + "zh": "条件表达式" + }, + { + "key": "left_value", + "zh": "左值" + }, + { + "key": "right_value", + "zh": "右值" + }, + { + "key": "cases", + "zh": "分支条件" + }, + { + "key": "max_iterations", + "zh": "最大迭代次数" + }, + { + "key": "break_condition", + "zh": "中断条件" + }, + { + "key": "max_concurrency", + "zh": "最大并发数" + }, + { + "key": "branches", + "zh": "分支配置" + }, + { + "key": "wait_all", + "zh": "等待所有" + }, + { + "key": "fail_fast", + "zh": "快速失败" + }, + { + "key": "duration_type", + "zh": "时间单位" + }, + { + "key": "merge_strategy", + "zh": "合并策略" + }, + { + "key": "variable_mappings", + "zh": "变量映射" + }, + { + "key": "target_type", + "zh": "目标类型" + }, + { + "key": "reply_mode", + "zh": "回复模式" + }, + { + "key": "message_template", + "zh": "消息模板" + }, + { + "key": "long_text_processing", + "zh": "长文本处理" + }, + { + "key": "force_delay", + "zh": "强制延迟" + }, + { + "key": "inherit_context", + "zh": "继承上下文" + }, + { + "key": "storage_type", + "zh": "存储类型" + }, + { + "key": "ttl", + "zh": "过期时间" + }, + { + "key": "key_prefix", + "zh": "键前缀" + }, + { + "key": "variable_scope", + "zh": "变量作用域" + }, + { + "key": "set_variable_operation", + "zh": "操作类型" + }, + { + "key": "output_format", + "zh": "输出格式" + }, + { + "key": "connection_type", + "zh": "数据库类型" + }, + { + "key": "connection_string", + "zh": "连接字符串" + }, + { + "key": "query_type", + "zh": "查询类型" + }, + { + "key": "operation", + "zh": "操作类型" + }, + { + "key": "dataset_id", + "zh": "知识库ID" + }, + { + "key": "json_transform_type", + "zh": "JSON转换类型" + }, + { + "key": "mapping", + "zh": "字段映射" + }, + { + "key": "code_content", + "zh": "代码内容" + }, + { + "key": "aggregation_type", + "zh": "聚合类型" + }, + { + "key": "field_path", + "zh": "字段路径" + }, + { + "key": "split_type", + "zh": "分割类型" + }, + { + "key": "regex_pattern", + "zh": "正则表达式" + }, + { + "key": "assign_variable_name", + "zh": "变量名" + }, + { + "key": "static_value", + "zh": "静态值" + } +] \ No newline at end of file diff --git a/web/translate_i18n_keys.py b/web/translate_i18n_keys.py new file mode 100644 index 00000000..0ecfcc20 --- /dev/null +++ b/web/translate_i18n_keys.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +""" +将英文翻译键翻译成对应的目标语言 +""" + +from pathlib import Path +import re + +# 翻译映射表 +TRANSLATIONS = { + 'ja-JP': { # 日文 + 'Sender': '送信者', + 'Output': '出力', + 'Result': '結果', + 'Data': 'データ', + 'Error Message': 'エラーメッセージ', + 'Success Status': '成功ステータス', + 'Event': 'イベント', + 'Trigger Time': 'トリガー時刻', + 'Logs': 'ログ', + 'Scores': 'スコア', + 'Missing Parameters': '不足パラメータ', + 'Parsed Result': '解析結果', + 'Text Chunks': 'テキストチャンク', + 'Text Content': 'テキスト内容', + 'Case 1 Output': 'ケース1出力', + 'Case 2 Output': 'ケース2出力', + 'Branch 1 Output': 'ブランチ1出力', + 'Branch 2 Output': 'ブランチ2出力', + 'Count': 'カウント', + 'Execution ID': '実行ID', + 'Notification ID': '通知ID', + 'Suggestions': '提案', + 'Embedding Vector': '埋め込みベクトル', + 'Vector Dimensions': 'ベクトル次元', + 'Intent': '意図', + 'Entities': 'エンティティ', + 'Payload': 'ペイロード', + 'Input Value': '入力値', + 'Conversation ID': '会話ID', + }, + 'zh-Hant': { # 繁体中文 + 'Sender': '發送者', + 'Output': '輸出', + 'Result': '結果', + 'Data': '數據', + 'Error Message': '錯誤訊息', + 'Success Status': '成功狀態', + 'Event': '事件', + 'Trigger Time': '觸發時間', + 'Logs': '日誌', + 'Scores': '分數', + 'Missing Parameters': '缺失參數', + 'Parsed Result': '解析結果', + 'Text Chunks': '文本塊', + 'Text Content': '文本內容', + 'Case 1 Output': '情況1輸出', + 'Case 2 Output': '情況2輸出', + 'Branch 1 Output': '分支1輸出', + 'Branch 2 Output': '分支2輸出', + 'Count': '計數', + 'Execution ID': '執行ID', + 'Notification ID': '通知ID', + 'Suggestions': '建議', + 'Embedding Vector': '嵌入向量', + 'Vector Dimensions': '向量維度', + 'Intent': '意圖', + 'Entities': '實體', + 'Payload': '負載', + 'Input Value': '輸入值', + 'Conversation ID': '對話ID', + }, + 'es-ES': { # 西班牙语 + 'Sender': 'Remitente', + 'Output': 'Salida', + 'Result': 'Resultado', + 'Data': 'Datos', + 'Error Message': 'Mensaje de Error', + 'Success Status': 'Estado de Éxito', + 'Event': 'Evento', + 'Trigger Time': 'Hora de Activación', + 'Logs': 'Registros', + 'Scores': 'Puntuaciones', + 'Missing Parameters': 'Parámetros Faltantes', + 'Parsed Result': 'Resultado Analizado', + 'Text Chunks': 'Fragmentos de Texto', + 'Text Content': 'Contenido de Texto', + 'Case 1 Output': 'Salida Caso 1', + 'Case 2 Output': 'Salida Caso 2', + 'Branch 1 Output': 'Salida Rama 1', + 'Branch 2 Output': 'Salida Rama 2', + 'Count': 'Conteo', + 'Execution ID': 'ID de Ejecución', + 'Notification ID': 'ID de Notificación', + 'Suggestions': 'Sugerencias', + 'Embedding Vector': 'Vector de Incrustación', + 'Vector Dimensions': 'Dimensiones del Vector', + 'Intent': 'Intención', + 'Entities': 'Entidades', + 'Payload': 'Carga Útil', + 'Input Value': 'Valor de Entrada', + 'Conversation ID': 'ID de Conversación', + }, + 'ru-RU': { # 俄语 + 'Sender': 'Отправитель', + 'Output': 'Вывод', + 'Result': 'Результат', + 'Data': 'Данные', + 'Error Message': 'Сообщение об Ошибке', + 'Success Status': 'Статус Успеха', + 'Event': 'Событие', + 'Trigger Time': 'Время Триггера', + 'Logs': 'Журналы', + 'Scores': 'Оценки', + 'Missing Parameters': 'Отсутствующие Параметры', + 'Parsed Result': 'Разобранный Результат', + 'Text Chunks': 'Фрагменты Текста', + 'Text Content': 'Текстовое Содержимое', + 'Case 1 Output': 'Вывод Случая 1', + 'Case 2 Output': 'Вывод Случая 2', + 'Branch 1 Output': 'Вывод Ветви 1', + 'Branch 2 Output': 'Вывод Ветви 2', + 'Count': 'Количество', + 'Execution ID': 'ID Выполнения', + 'Notification ID': 'ID Уведомления', + 'Suggestions': 'Предложения', + 'Embedding Vector': 'Вектор Встраивания', + 'Vector Dimensions': 'Размерности Вектора', + 'Intent': 'Намерение', + 'Entities': 'Сущности', + 'Payload': 'Полезная Нагрузка', + 'Input Value': 'Входное Значение', + 'Conversation ID': 'ID Разговора', + }, + 'th-TH': { # 泰语 + 'Sender': 'ผู้ส่ง', + 'Output': 'ผลลัพธ์', + 'Result': 'ผลลัพธ์', + 'Data': 'ข้อมูล', + 'Error Message': 'ข้อความข้อผิดพลาด', + 'Success Status': 'สถานะความสำเร็จ', + 'Event': 'เหตุการณ์', + 'Trigger Time': 'เวลาทริกเกอร์', + 'Logs': 'บันทึก', + 'Scores': 'คะแนน', + 'Missing Parameters': 'พารามิเตอร์ที่ขาดหายไป', + 'Parsed Result': 'ผลการแยกวิเคราะห์', + 'Text Chunks': 'ส่วนข้อความ', + 'Text Content': 'เนื้อหาข้อความ', + 'Case 1 Output': 'ผลลัพธ์กรณีที่ 1', + 'Case 2 Output': 'ผลลัพธ์กรณีที่ 2', + 'Branch 1 Output': 'ผลลัพธ์สาขา 1', + 'Branch 2 Output': 'ผลลัพธ์สาขา 2', + 'Count': 'จำนวน', + 'Execution ID': 'ID การดำเนินการ', + 'Notification ID': 'ID การแจ้งเตือน', + 'Suggestions': 'คำแนะนำ', + 'Embedding Vector': 'เวกเตอร์ฝังตัว', + 'Vector Dimensions': 'มิติเวกเตอร์', + 'Intent': 'เจตนา', + 'Entities': 'เอนทิตี', + 'Payload': 'เพย์โหลด', + 'Input Value': 'ค่าอินพุต', + 'Conversation ID': 'ID การสนทนา', + }, + 'vi-VN': { # 越南语 + 'Sender': 'Người gửi', + 'Output': 'Đầu ra', + 'Result': 'Kết quả', + 'Data': 'Dữ liệu', + 'Error Message': 'Thông báo Lỗi', + 'Success Status': 'Trạng thái Thành công', + 'Event': 'Sự kiện', + 'Trigger Time': 'Thời gian Kích hoạt', + 'Logs': 'Nhật ký', + 'Scores': 'Điểm số', + 'Missing Parameters': 'Tham số Thiếu', + 'Parsed Result': 'Kết quả Phân tích', + 'Text Chunks': 'Đoạn Văn bản', + 'Text Content': 'Nội dung Văn bản', + 'Case 1 Output': 'Đầu ra Trường hợp 1', + 'Case 2 Output': 'Đầu ra Trường hợp 2', + 'Branch 1 Output': 'Đầu ra Nhánh 1', + 'Branch 2 Output': 'Đầu ra Nhánh 2', + 'Count': 'Số lượng', + 'Execution ID': 'ID Thực thi', + 'Notification ID': 'ID Thông báo', + 'Suggestions': 'Gợi ý', + 'Embedding Vector': 'Vector Nhúng', + 'Vector Dimensions': 'Kích thước Vector', + 'Intent': 'Ý định', + 'Entities': 'Thực thể', + 'Payload': 'Tải trọng', + 'Input Value': 'Giá trị Đầu vào', + 'Conversation ID': 'ID Hội thoại', + }, +} + +def translate_file(file_path: Path, lang_code: str): + """翻译指定语言文件""" + print(f"\n处理文件: {file_path.name}") + + if lang_code not in TRANSLATIONS: + print(f" ⚠️ 没有 {lang_code} 的翻译映射") + return + + translations = TRANSLATIONS[lang_code] + + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + modified = False + translated_count = 0 + + # 替换翻译 + for english, translated in translations.items(): + # 匹配格式: key: 'English Text', + pattern = rf"(\s+\w+:\s+)'{re.escape(english)}'," + if re.search(pattern, content): + content = re.sub(pattern, rf"\1'{translated}',", content) + translated_count += 1 + modified = True + print(f" ✓ 翻译: '{english}' -> '{translated}'") + + if modified: + with open(file_path, 'w', encoding='utf-8') as f: + f.write(content) + print(f" ✅ 已更新 {file_path.name},共翻译 {translated_count} 个键") + else: + print(f" - {file_path.name} 无需翻译") + +def main(): + """主函数""" + locales_dir = Path(__file__).parent / 'src' / 'i18n' / 'locales' + + print("=" * 60) + print("开始翻译多语言 i18n 文件") + print("=" * 60) + + language_files = { + 'ja-JP.ts': 'ja-JP', + 'zh-Hant.ts': 'zh-Hant', + 'es-ES.ts': 'es-ES', + 'ru-RU.ts': 'ru-RU', + 'th-TH.ts': 'th-TH', + 'vi-VN.ts': 'vi-VN', + } + + total_translated = 0 + for filename, lang_code in language_files.items(): + file_path = locales_dir / filename + if file_path.exists(): + translate_file(file_path, lang_code) + total_translated += 1 + else: + print(f"\n警告: 文件不存在 - {filename}") + + print("\n" + "=" * 60) + print("翻译完成!") + print("=" * 60) + print(f"\n已处理 {total_translated} 个语言文件") + print(f"每个文件最多翻译 {len(TRANSLATIONS['ja-JP'])} 个键") + +if __name__ == '__main__': + main() diff --git a/web/translation_template.json b/web/translation_template.json new file mode 100644 index 00000000..2d97c9bc --- /dev/null +++ b/web/translation_template.json @@ -0,0 +1,23 @@ +{ + "_comment": "翻译模板 - 请填写各语言的翻译", + "_instructions": "1. 从workflows_chinese_texts.json复制需要翻译的键; 2. 为每个键添加各语言翻译; 3. 运行apply_translations.py应用翻译", + "_languages": { + "ja-JP": "日语", + "zh-Hant": "繁体中文", + "es-ES": "西班牙语", + "ru-RU": "俄语", + "th-TH": "泰语", + "vi-VN": "越南语" + }, + "translations": { + "title": { + "zh-Hans": "工作流", + "ja-JP": "ワークフロー", + "zh-Hant": "工作流", + "es-ES": "Flujo de trabajo", + "ru-RU": "Рабочий процесс", + "th-TH": "เวิร์กโฟลว์", + "vi-VN": "Quy trình làm việc" + } + } +} diff --git a/web/workflows_chinese_texts.json b/web/workflows_chinese_texts.json new file mode 100644 index 00000000..18997e1d --- /dev/null +++ b/web/workflows_chinese_texts.json @@ -0,0 +1,629 @@ +{ + "title": "工作流对话", + "description": "描述", + "createWorkflow": "创建工作流", + "selectFromSidebar": "从侧边栏选择一个工作流", + "editWorkflow": "编辑工作流", + "newWorkflow": "新工作流", + "getWorkflowListError": "获取工作流列表失败:", + "workflowName": "工作流名称", + "workflowDescription": "工作流描述", + "workflowNameRequired": "工作流名称不能为空", + "defaultDescription": "一个工作流", + "getWorkflowError": "获取工作流失败:", + "loadError": "加载工作流失败", + "saveSuccess": "保存成功", + "saveError": "保存失败:", + "createSuccess": "工作流创建成功", + "createError": "创建失败:", + "deleteSuccess": "删除成功", + "deleteError": "删除失败:", + "deleteConfirmation": "你确定要删除这个工作流吗?", + "copySuccess": "复制成功", + "copyError": "复制失败:", + "export": "导出", + "import": "导入", + "exportSuccess": "工作流已导出", + "importSuccess": "工作流已导入", + "importError": "导入失败:文件格式无效", + "publish": "发布", + "publishSuccess": "发布成功", + "publishError": "发布失败", + "configuration": "配置", + "executions": "执行记录", + "editor": "编辑器", + "debugChat": "对话调试", + "basicInfo": "基础信息", + "basicInfoDesc": "设置工作流名称、图标和描述", + "basicInfoDescription": "设置工作流名称和描述", + "dangerZone": "危险区域", + "dangerZoneDesc": "不可逆的操作", + "dangerZoneDescription": "不可逆的操作", + "deleteWorkflowAction": "删除此工作流", + "deleteWorkflowHint": "删除后,所有关联配置将被永久移除,且无法恢复。", + "deleteWorkflow": "删除工作流", + "deleteConfirm": "确认删除", + "deleteConfirmDesc": "您确定要删除工作流 \"{{name}}\" 吗?此操作无法撤销。", + "name": "名称", + "namePlaceholder": "输入工作流名称", + "descriptionPlaceholder": "输入工作流描述(可选)", + "enabled": "启用", + "enabledDesc": "启用后,工作流将可以被触发执行", + "loading": "加载中...", + "info": "工作流信息", + "uuid": "UUID", + "version": "版本", + "createdAt": "创建时间", + "updatedAt": "更新时间", + "totalExecutions": "共 {{count}} 条执行记录", + "statistics": "统计分析", + "successfulCount": "成功 {{count}} 次", + "successRate": "成功率", + "averageDuration": "平均耗时", + "perExecution": "每次执行", + "failedExecutions": "失败次数", + "lastExecution": "最后执行", + "filterByStatus": "按状态筛选", + "allStatuses": "全部状态", + "manualTrigger": "手动触发", + "executionId": "执行 ID", + "status": "状态", + "triggerType": "触发类型", + "startedAt": "开始时间", + "duration": "等待时间", + "noExecutions": "暂无执行记录", + "executionDetails": "执行详情", + "error": "错误", + "nodeExecutions": "节点执行记录", + "result": "结果", + "nodePalette": "节点面板", + "properties": "属性", + "zoomIn": "放大", + "zoomOut": "缩小", + "fitView": "适应视图", + "unsavedChanges": "有未保存的更改", + "paste": "粘贴", + "deleted": "已删除", + "nothingToCopy": "没有选中的节点可复制", + "nothingToPaste": "剪贴板为空", + "copied": "已复制 {{count}} 个节点", + "pasted": "已粘贴 {{count}} 个节点", + "nodesSelected": "已选中 {{count}} 个节点", + "edgesSelected": "已选中 {{count}} 条连线", + "searchNodes": "搜索节点...", + "loadingNodeTypes": "正在加载节点类型...", + "noNodesFound": "未找到匹配的节点", + "clearSearch": "清除搜索", + "dragToAdd": "拖拽节点到画布添加", + "selectNodeOrEdge": "选择一个节点或连线", + "selectNodeOrEdgeHint": "点击画布中的节点或连线来查看和编辑其属性", + "edgeProperties": "连线属性", + "nodeProperties": "节点属性", + "condition": "条件分支", + "hasCondition": "已设置", + "conditionPlaceholder": "输入条件表达式,如: output.success == true", + "conditionHelp": "条件为空时,该连线将始终被执行。支持使用 {{变量名}} 引用上下文变量。", + "deleteEdge": "删除连线", + "deleteEdgeConfirm": "确定删除此连线?", + "deleteEdgeConfirmDesc": "删除后,该连线将被永久移除。", + "nodeLabel": "节点名称", + "nodeLabelPlaceholder": "输入节点显示名称", + "nodeId": "节点 ID", + "inputOutputVariables": "输入/输出变量", + "inputs": "输入", + "outputs": "输出", + "availableVariables": "可用变量", + "globalVariables": "全局变量", + "messageContent": "模拟消息", + "messageSender": "发送者", + "platform": "平台", + "sessionId": "会话 ID", + "timestamp": "时间戳", + "nodeConfig": "节点配置", + "noConfigOptions": "该节点类型暂无配置选项", + "deleteNode": "删除节点", + "deleteNodeConfirm": "确定删除此节点?", + "deleteNodeConfirmDesc": "删除后,该节点及其所有连线将被永久移除。", + "input": "输入", + "message": "消息", + "text": "文本", + "query": "SQL查询", + "data": "数据", + "value": "值", + "content": "内容", + "context": "调试上下文", + "body": "请求体", + "variables": "监控变量", + "items": "项目列表", + "arguments": "参数", + "question": "用户问题", + "parameters": "参数定义", + "key": "键", + "payload": "载荷", + "input_value": "输入值", + "conversation_id": "会话 ID", + "case_1": "分支 1", + "case_2": "分支 2", + "branch_1": "分支1输出", + "branch_2": "分支2输出", + "notification_id": "通知ID", + "key_template": "键模板", + "hash_field": "哈希字段", + "server_name": "服务器名称", + "tool_name": "工具名称", + "arguments_template": "参数模板", + "scope": "作用域", + "output": "输出", + "response": "响应", + "sender": "发送者", + "sender_id": "发送者 ID", + "sender_name": "发送者名称", + "cron_timestamp": "Cron 时间戳", + "cron_schedule": "Cron 调度表达式", + "cron_context": "Cron 上下文", + "trigger_time": "触发时间", + "schedule": "触发计划", + "headers": "请求头", + "query_params": "查询参数", + "method": "请求方法", + "is_group": "是否群聊", + "event": "事件", + "event_type": "事件类型", + "event_data": "事件数据", + "event_timestamp": "事件时间戳", + "usage": "Token使用统计", + "parsed": "解析结果", + "category": "分类结果", + "confidence": "置信度", + "all_scores": "所有分数", + "missing": "缺失参数", + "success": "是否成功", + "scores": "分数", + "chunks": "文本块", + "count": "数量", + "logs": "日志", + "embedding": "向量", + "dimensions": "维度", + "intent": "意图", + "entities": "实体", + "prompt": "提示/问题", + "context_info": "上下文信息", + "console": "控制台输出", + "code_input": "代码输入", + "code_output": "代码输出", + "http_body": "HTTP 请求体", + "http_headers": "HTTP 请求头", + "http_response": "HTTP 响应", + "response_headers": "响应头", + "transform_input": "转换输入", + "transform_result": "转换结果", + "extraction_success": "提取成功", + "extract_text": "输入文本", + "documents": "检索的文档", + "citations": "引用信息", + "knowledge_context": "合并上下文", + "knowledge_query": "检索查询", + "true": "条件为真输出", + "false": "条件为假输出", + "matched_case": "匹配分支", + "default": "默认分支", + "item": "当前项", + "index": "当前索引", + "completed": "已完成", + "is_first": "是否第一个", + "is_last": "是否最后一个", + "results": "结果", + "condition_input": "条件输入", + "switch_input": "开关输入", + "loop_items": "迭代项目", + "iterator_array": "输入数组", + "iterator_item": "当前元素", + "iterator_index": "当前索引", + "errors": "错误列表", + "parallel_input": "并行输入", + "parallel_results": "所有分支结果", + "wait_input": "透传输入", + "wait_output": "透传输出", + "merged": "合并结果", + "merge_array": "数组结果", + "merge_input_1": "输入 1", + "merge_input_2": "输入 2", + "merge_input_3": "输入 3", + "merge_input_4": "输入 4", + "aggregated": "聚合变量", + "aggregator_variables": "变量输入", + "message_id": "消息ID", + "status_code": "状态码", + "execution_id": "执行ID", + "target": "目标 ID", + "reply_message": "回复内容", + "pipeline_response": "Pipeline 响应", + "pipeline_result": "完整结果", + "pipeline_query": "查询内容", + "context_data": "上下文数据", + "store_status": "存储状态", + "store_key": "存储键", + "store_value": "存储值", + "variable_value": "变量值", + "variable_result": "设置变量结果", + "statement": "开场白", + "suggested_questions": "建议问题", + "suggestions": "建议问题", + "workflow_output": "工作流输出", + "final_result": "最终结果", + "query_results": "查询结果", + "row_count": "行数", + "query_success": "查询成功", + "redis_result": "Redis结果", + "redis_success": "Redis成功", + "redis_key": "Redis 键", + "redis_value": "Redis 值", + "plugin_input": "插件输入", + "tool_result": "工具结果", + "tool_success": "工具成功", + "mcp_arguments": "工具参数", + "memory_result": "记忆结果", + "memory_success": "记忆成功", + "memory_value": "存储值", + "answer": "答案", + "dify_success": "Dify成功", + "dify_query": "用户输入/查询", + "dify_conversation_id": "会话 ID", + "search_results": "搜索结果", + "knowledge_base_query": "查询内容", + "n8n_result": "N8n结果", + "n8n_success": "N8n成功", + "n8n_payload": "工作流输入数据", + "flow_result": "流程结果", + "flow_success": "流程成功", + "langflow_input": "输入内容", + "bot_answer": "机器人回复", + "bot_success": "机器人成功", + "coze_query": "用户输入/查询", + "coze_conversation_id": "会话 ID", + "bot_conversation_id": "会话 ID", + "webhook_body": "Webhook 请求体", + "webhook_headers": "Webhook 请求头", + "webhook_query": "Webhook 查询参数", + "webhook_method": "Webhook 请求方法", + "save": "保存", + "undo": "撤销", + "redo": "重做", + "edgeCondition": "条件表达式", + "edgeConditionPlaceholder": "如: ${output.success} == true", + "noNodeSelected": "未选中节点", + "selectNodeToEdit": "点击节点查看和编辑属性", + "dragNodeHint": "拖拽节点到画布", + "trigger": "触发器", + "triggerDescription": "工作流的起始节点", + "messageTrigger": "消息触发", + "messageTriggerDescription": "当收到消息时触发", + "scheduleTrigger": "定时触发", + "scheduleTriggerDescription": "按计划定时触发", + "cronTrigger": "定时触发", + "cronTriggerDescription": "按定时计划触发工作流", + "webhookTrigger": "Webhook 触发", + "webhookTriggerDescription": "通过 HTTP 请求触发", + "eventTrigger": "事件触发", + "eventTriggerDescription": "当系统事件发生时触发", + "process": "AI/处理", + "processDescription": "数据处理节点", + "aiProcess": "AI 处理", + "aiProcessDescription": "使用 AI 模型处理消息", + "llmCall": "LLM 调用", + "llmCallDescription": "调用大语言模型进行对话或生成", + "codeProcess": "代码处理", + "codeProcessDescription": "执行自定义代码", + "codeExecutor": "代码执行", + "codeExecutorDescription": "执行 Python/JavaScript 代码", + "templateProcess": "模板处理", + "templateProcessDescription": "使用模板格式化输出", + "httpRequest": "HTTP 请求", + "httpRequestDescription": "发送 HTTP 请求", + "dataTransform": "数据转换", + "dataTransformDescription": "转换数据格式", + "questionClassifier": "问题分类器", + "questionClassifierDescription": "使用 LLM 将用户问题分类到预定义类别", + "parameterExtractor": "参数提取器", + "parameterExtractorDescription": "使用 LLM 从文本中提取结构化参数", + "knowledgeRetrieval": "知识库检索", + "knowledgeRetrievalDescription": "从知识库中检索相关内容", + "textTemplate": "文本模板", + "textTemplateDescription": "使用模板生成文本", + "jsonTransform": "JSON 转换", + "jsonTransformDescription": "转换 JSON 数据", + "dataAggregator": "数据聚合", + "dataAggregatorDescription": "聚合多个数据源", + "textSplitter": "文本分割", + "textSplitterDescription": "将文本分割成块", + "variableAssignment": "变量赋值", + "variableAssignmentDescription": "为工作流变量赋值", + "control": "控制流", + "controlDescription": "流程控制节点", + "conditionDescription": "根据条件分流", + "switch": "多路分支", + "switchDescription": "多条件分支选择", + "loop": "循环", + "loopDescription": "重复执行", + "iterator": "迭代器", + "iteratorDescription": "遍历数组元素", + "parallel": "并行处理", + "parallelDescription": "并行执行多个分支", + "wait": "等待", + "waitDescription": "等待指定时间", + "delay": "延迟", + "delayDescription": "等待指定时间", + "merge": "合并", + "mergeDescription": "合并多个分支", + "variableAggregator": "变量聚合器", + "variableAggregatorDescription": "聚合多个分支的变量输出", + "action": "动作", + "actionDescription": "执行动作的节点", + "sendMessage": "发送消息", + "sendMessageDescription": "发送消息到平台", + "replyMessage": "回复消息", + "replyMessageDescription": "回复触发工作流的消息", + "storeData": "存储数据", + "storeDataDescription": "存储数据到数据库", + "callPipeline": "调用 Pipeline", + "callPipelineDescription": "调用现有的 Pipeline", + "setVariable": "设置变量", + "setVariableDescription": "设置上下文变量", + "openingStatement": "对话开场白", + "openingStatementDescription": "提供对话开场白和建议问题", + "end": "结束", + "endDescription": "标记工作流执行结束", + "log": "日志", + "logDescription": "记录日志信息", + "integration": "集成", + "integrationDescription": "第三方平台集成节点", + "difyWorkflow": "Dify 工作流", + "difyWorkflowDescription": "调用 Dify 平台工作流", + "difyKnowledgeQuery": "Dify 知识库", + "difyKnowledgeQueryDescription": "查询 Dify 知识库", + "n8nWorkflow": "n8n 工作流", + "n8nWorkflowDescription": "调用 n8n 工作流", + "langflowFlow": "Langflow 流程", + "langflowFlowDescription": "调用 Langflow 流程", + "cozeBot": "Coze Bot", + "cozeBotDescription": "调用扣子 Bot", + "databaseQuery": "数据库查询", + "databaseQueryDescription": "执行数据库查询", + "redisOperation": "Redis 操作", + "redisOperationDescription": "执行 Redis 缓存操作", + "mcpTool": "MCP 工具", + "mcpToolDescription": "调用 MCP 工具", + "memoryStore": "记忆存储", + "memoryStoreDescription": "从工作流记忆中存储和检索数据", + "startTime": "开始时间", + "running": "执行中", + "failed": "失败", + "cancelled": "已取消", + "viewDetails": "查看详情", + "cancel": "取消执行", + "retry": "重试", + "nodeResults": "节点执行结果", + "current": "当前版本", + "rollback": "回滚到此版本", + "rollbackConfirm": "确定回滚到此版本?当前更改将丢失。", + "rollbackSuccess": "回滚成功", + "rollbackError": "回滚失败:", + "mode": "调试模式", + "panel": "调试面板", + "start": "开始调试", + "pause": "暂停", + "resume": "继续", + "step": "单步执行", + "stop": "停止", + "messageContentPlaceholder": "输入要模拟的消息内容", + "senderId": "发送者 ID", + "senderIdPlaceholder": "发送者唯一标识", + "senderName": "发送者名称", + "senderNamePlaceholder": "发送者显示名称", + "platformPlaceholder": "例如 qq、wechat、telegram", + "conversationId": "会话 ID", + "conversationIdPlaceholder": "会话唯一标识", + "isGroup": "群聊", + "customVariables": "自定义变量", + "customVariablesDesc": "添加自定义变量用于调试", + "variableKey": "变量名", + "variableValue": "变量值", + "addVariable": "添加变量", + "watchedVariables": "监控变量", + "noWatchedVariables": "暂无监控变量", + "addWatchVariable": "添加监控", + "nodeStates": "节点状态", + "nodeOutputs": "节点输出", + "noNodeOutputs": "暂无节点输出", + "toggleBreakpoint": "切换断点", + "clearBreakpoints": "清除所有断点", + "breakpointSet": "断点已设置", + "breakpointRemoved": "断点已移除", + "noLogs": "暂无日志", + "clearLogs": "清空日志", + "autoScroll": "自动滚动", + "logEntries": "条日志", + "resetContext": "重置上下文", + "starting": "正在启动调试执行...", + "started": "调试执行已启动 (ID: {{id}})", + "startError": "启动调试失败", + "unknownError": "未知错误", + "paused": "已暂停", + "pauseError": "暂停失败", + "resumed": "执行已恢复", + "resumeError": "恢复失败", + "steppedTo": "已执行到节点: {{node}}", + "stepError": "单步执行失败", + "stopped": "调试已停止", + "stopError": "停止失败", + "debugMode": "调试模式", + "debugPanel": "调试面板", + "startDebug": "开始调试", + "pauseDebug": "暂停", + "resumeDebug": "继续", + "stepDebug": "单步执行", + "stopDebug": "停止", + "debugContext": "调试上下文", + "simulatedMessage": "模拟消息", + "simulatedMessagePlaceholder": "输入要模拟的消息内容", + "variableName": "变量名", + "breakpoints": "断点", + "debugLogs": "调试日志", + "idle": "空闲", + "pending": "等待中", + "skipped": "已跳过", + "selectWorkflow": "选择工作流", + "sessionType": "会话类型", + "privateChat": "私聊", + "groupChat": "群聊", + "send": "发送", + "reset": "重置对话", + "inputPlaceholder": "发送 {{type}} 消息...", + "noMessages": "暂无消息", + "userMessage": "用户", + "botMessage": "机器人", + "sendFailed": "发送失败", + "resetSuccess": "对话已重置", + "resetFailed": "重置失败", + "loadMessagesFailed": "加载消息失败", + "loadWorkflowsFailed": "加载工作流失败", + "atTips": "提及机器人", + "streaming": "流式传输", + "streamOutput": "流式", + "connected": "WebSocket已连接", + "disconnected": "WebSocket未连接", + "connectionError": "WebSocket连接错误", + "connectionFailed": "WebSocket连接失败", + "notConnected": "WebSocket未连接,请稍后重试", + "imageUploadFailed": "图片上传失败", + "reply": "回复", + "replyTo": "回复给", + "showMarkdown": "渲染", + "showRaw": "原文", + "allMembers": "全体成员", + "file": "文件", + "voice": "语音", + "uploadImage": "上传图片", + "uploading": "上传中...", + "filterByDate": "按日期筛选", + "allTime": "全部时间", + "today": "今天", + "lastWeek": "最近一周", + "lastMonth": "最近一个月", + "showingExecutions": "显示 {{shown}} / {{total}} 条记录", + "rerun": "重新运行", + "rerunExecution": "重新执行", + "details": "详情", + "completedAt": "完成时间", + "noNodeExecutions": "暂无节点执行记录", + "conditions": "触发条件", + "keyword_filter": "关键词过滤", + "regex_filter": "正则过滤", + "min_length": "最小长度", + "max_length": "最大长度", + "require_mention": "需要@机器人", + "respond_rules": "群响应规则", + "access_control": "访问控制", + "cron": "Cron表达式", + "timezone": "时区", + "path": "Webhook路径", + "allowed_methods": "允许的HTTP方法", + "content_type": "Content-Type", + "auth_type": "认证方式", + "auth_key": "认证密钥", + "validation": "请求验证", + "timeout": "超时时间", + "event_types": "事件类型", + "filter": "事件过滤", + "debounce_ms": "防抖时间", + "model": "模型", + "prompt_template": "提示词模板", + "system_prompt": "系统提示词", + "temperature": "温度", + "top_p": "Top P", + "frequency_penalty": "频率惩罚", + "presence_penalty": "存在惩罚", + "max_tokens": "最大Token数", + "stop_sequences": "停止序列", + "seed": "随机种子", + "stream": "流式输出", + "use_conversation_history": "使用对话历史", + "language": "编程语言", + "code": "代码", + "url": "请求URL", + "auth_config": "认证配置", + "transform_type": "转换类型", + "template": "模板", + "expression": "表达式", + "output_type": "输出类型", + "categories": "分类类别", + "instruction": "指令", + "knowledge_bases": "知识库", + "top_k": "返回数量", + "score_threshold": "相似度阈值", + "search_method": "搜索方法", + "enable_citations": "启用引用", + "condition_type": "条件类型", + "condition_expression": "条件表达式", + "left_value": "左值", + "operator": "比较运算符", + "right_value": "右值", + "cases": "分支条件", + "max_iterations": "最大迭代次数", + "break_condition": "中断条件", + "max_concurrency": "最大并发数", + "branches": "分支配置", + "wait_all": "等待所有", + "fail_fast": "快速失败", + "duration_type": "时间单位", + "merge_strategy": "合并策略", + "variable_mappings": "变量映射", + "aggregation_mode": "聚合模式", + "target_type": "目标类型", + "target_id": "目标ID", + "message_type": "消息类型", + "reply_mode": "回复模式", + "message_template": "消息模板", + "long_text_processing": "长文本处理", + "force_delay": "强制延迟", + "pipeline_uuid": "流水线", + "inherit_context": "继承上下文", + "storage_type": "存储类型", + "ttl": "过期时间", + "key_prefix": "键前缀", + "variable_name": "变量名称", + "variable_scope": "变量作用域", + "set_variable_operation": "操作类型", + "show_suggestions": "显示建议", + "output_format": "输出格式", + "success_message": "成功消息", + "connection_type": "数据库类型", + "connection_string": "连接字符串", + "query_type": "查询类型", + "connection_url": "连接URL", + "operation": "操作类型", + "dataset_id": "知识库ID", + "escape_html": "转义HTML", + "trim_whitespace": "去除空白", + "json_transform_type": "JSON转换类型", + "json_expression": "JSON表达式", + "mapping": "字段映射", + "code_language": "编程语言", + "code_content": "代码内容", + "aggregation_type": "聚合类型", + "separator": "分隔符", + "field_path": "字段路径", + "split_type": "分割类型", + "chunk_size": "块大小", + "chunk_overlap": "块重叠", + "regex_pattern": "正则表达式", + "remove_empty": "移除空块", + "assign_variable_name": "变量名", + "value_type": "值类型", + "static_value": "静态值", + "n8n_webhook_url": "Webhook URL", + "n8n_auth_type": "认证方式", + "langflow_flow_id": "流程ID", + "coze_bot_id": "机器人ID", + "coze_api_base": "API基础URL" +} \ No newline at end of file diff --git a/web/workflows_section.txt b/web/workflows_section.txt new file mode 100644 index 00000000..c0a2fc03 --- /dev/null +++ b/web/workflows_section.txt @@ -0,0 +1,831 @@ + workflows: { + title: '工作流', + description: '创建和管理可视化工作流,实现复杂的消息处理逻辑', + createWorkflow: '创建工作流', + selectFromSidebar: '从侧边栏选择一个工作流', + editWorkflow: '编辑工作流', + newWorkflow: '新工作流', + getWorkflowListError: '获取工作流列表失败:', + workflowName: '工作流名称', + workflowDescription: '工作流描述', + workflowNameRequired: '工作流名称不能为空', + defaultDescription: '一个工作流', + getWorkflowError: '获取工作流失败:', + loadError: '加载工作流失败', + saveSuccess: '保存成功', + saveError: '保存失败:', + createSuccess: '工作流创建成功', + createError: '创建失败:', + deleteSuccess: '删除成功', + deleteError: '删除失败:', + deleteConfirmation: '你确定要删除这个工作流吗?', + copySuccess: '复制成功', + copyError: '复制失败:', + export: '导出', + import: '导入', + exportSuccess: '工作流已导出', + importSuccess: '工作流已导入', + importError: '导入失败:文件格式无效', + publish: '发布', + publishSuccess: '发布成功', + publishError: '发布失败', + configuration: '配置', + executions: '执行记录', + editor: '编辑器', + debugChat: '对话调试', + basicInfo: '基础信息', + basicInfoDesc: '设置工作流名称、图标和描述', + basicInfoDescription: '设置工作流名称和描述', + dangerZone: '危险区域', + dangerZoneDesc: '不可逆的操作', + dangerZoneDescription: '不可逆的操作', + deleteWorkflowAction: '删除此工作流', + deleteWorkflowHint: '删除后,所有关联配置将被永久移除,且无法恢复。', + deleteWorkflow: '删除工作流', + deleteConfirm: '确认删除', + deleteConfirmDesc: '您确定要删除工作流 "{{name}}" 吗?此操作无法撤销。', + // Form component + name: '名称', + namePlaceholder: '输入工作流名称', + descriptionPlaceholder: '输入工作流描述(可选)', + enabled: '启用', + enabledDesc: '启用后,工作流将可以被触发执行', + loading: '加载中...', + info: '工作流信息', + uuid: 'UUID', + version: '版本', + createdAt: '创建时间', + updatedAt: '更新时间', + // Executions tab + totalExecutions: '共 {{count}} 条执行记录', + statistics: '统计分析', + successfulCount: '成功 {{count}} 次', + successRate: '成功率', + averageDuration: '平均耗时', + perExecution: '每次执行', + failedExecutions: '失败次数', + lastExecution: '最后执行', + filterByStatus: '按状态筛选', + allStatuses: '全部状态', + manualTrigger: '手动触发', + executionId: '执行 ID', + status: '状态', + triggerType: '触发类型', + startedAt: '开始时间', + duration: '耗时', + noExecutions: '暂无执行记录', + executionDetails: '执行详情', + error: '错误信息', + nodeExecutions: '节点执行记录', + result: '执行结果', + 'status.pending': '等待中', + 'status.waiting': '等待中', + 'status.running': '执行中', + 'status.completed': '已完成', + 'status.failed': '失败', + 'status.cancelled': '已取消', + // Editor component translations + nodePalette: '节点面板', + properties: '属性', + zoomIn: '放大', + zoomOut: '缩小', + fitView: '适应视图', + unsavedChanges: '有未保存的更改', + paste: '粘贴', + deleted: '已删除', + nothingToCopy: '没有选中的节点可复制', + nothingToPaste: '剪贴板为空', + copied: '已复制 {{count}} 个节点', + pasted: '已粘贴 {{count}} 个节点', + nodesSelected: '已选中 {{count}} 个节点', + edgesSelected: '已选中 {{count}} 条连线', + // Node palette + searchNodes: '搜索节点...', + loadingNodeTypes: '正在加载节点类型...', + noNodesFound: '未找到匹配的节点', + clearSearch: '清除搜索', + dragToAdd: '拖拽节点到画布添加', + // Property panel + selectNodeOrEdge: '选择一个节点或连线', + selectNodeOrEdgeHint: '点击画布中的节点或连线来查看和编辑其属性', + edgeProperties: '连线属性', + nodeProperties: '节点属性', + condition: '条件', + hasCondition: '已设置', + conditionPlaceholder: '输入条件表达式,如: output.success == true', + conditionHelp: + '条件为空时,该连线将始终被执行。支持使用 {{变量名}} 引用上下文变量。', + deleteEdge: '删除连线', + deleteEdgeConfirm: '确认删除连线', + deleteEdgeConfirmDesc: '删除后,该连线将被永久移除。', + nodeLabel: '节点名称', + nodeLabelPlaceholder: '输入节点显示名称', + nodeId: '节点 ID', + inputOutputVariables: '输入/输出变量', + inputs: '输入', + outputs: '输出', + availableVariables: '可用变量', + globalVariables: '全局变量', + messageContent: '消息内容', + messageSender: '发送者', + platform: '平台', + sessionId: '会话 ID', + timestamp: '时间戳', + nodeConfig: '节点配置', + noConfigOptions: '该节点类型暂无配置选项', + deleteNode: '删除节点', + deleteNodeConfirm: '确认删除节点', + deleteNodeConfirmDesc: '删除后,该节点及其所有连线将被永久移除。', + // Node inputs/outputs i18n (for port labels) + nodeInputs: { + // Common inputs + input: '输入', + message: '消息内容', + text: '文本', + query: '查询', + data: '数据', + condition: '条件', + value: '值', + // Trigger inputs + content: '内容', + context: '上下文', + body: '请求体', + variables: '变量', + items: '项目列表', + arguments: '参数', + // AI/Process inputs + question: '问题', + parameters: '参数定义', + key: '键', + payload: '载荷', + input_value: '输入值', + conversation_id: '会话 ID', + // Control inputs + case_1: '分支1输入', + case_2: '分支2输入', + branch_1: '分支1', + branch_2: '分支2', + // Action inputs + notification_id: '通知ID', + // Integration inputs + key_template: '键模板', + hash_field: '哈希字段', + server_name: '服务器名称', + tool_name: '工具名称', + arguments_template: '参数模板', + scope: '作用域', + }, + nodeOutputs: { + // Common outputs + output: '输出', + result: '结果', + response: '响应', + message: '消息', + data: '数据', + error: '错误', + // Trigger outputs + sender: '发送者', + sender_id: '发送者 ID', + sender_name: '发送者名称', + conversation_id: '会话 ID', + context: '上下文', + cron_timestamp: 'Cron 时间戳', + cron_schedule: 'Cron 调度表达式', + cron_context: 'Cron 上下文', + trigger_time: '触发时间', + schedule: '触发计划', + headers: '请求头', + query_params: '查询参数', + query: '查询参数', + method: '请求方法', + body: '请求体', + is_group: '是否群聊', + platform: '平台', + event: '事件', + event_type: '事件类型', + event_data: '事件数据', + event_timestamp: '事件时间戳', + // AI/Process outputs + usage: 'Token使用统计', + parsed: '解析结果', + category: '分类结果', + confidence: '置信度', + all_scores: '所有分数', + missing: '缺失参数', + success: '是否成功', + scores: '分数', + chunks: '文本块', + count: '数量', + logs: '日志', + embedding: '向量', + dimensions: '维度', + intent: '意图', + entities: '实体', + prompt: '提示/问题', + context_info: '上下文信息', + console: '控制台输出', + code_input: '代码输入', + code_output: '代码输出', + http_body: 'HTTP 请求体', + http_headers: 'HTTP 请求头', + http_response: 'HTTP 响应', + response_headers: '响应头', + transform_input: '转换输入', + transform_result: '转换结果', + question: '用户问题', + parameters: '提取的参数', + extraction_success: '提取成功', + extract_text: '输入文本', + documents: '检索的文档', + citations: '引用信息', + knowledge_context: '合并上下文', + knowledge_query: '检索查询', + text: '文本', + // Control outputs + true: '条件为真输出', + false: '条件为假输出', + matched_case: '匹配分支', + case_1: '分支 1', + case_2: '分支 2', + default: '默认分支', + item: '当前项', + index: '当前索引', + completed: '是否完成', + is_first: '是否第一个', + is_last: '是否最后一个', + results: '结果', + branch_1: '分支1输出', + branch_2: '分支2输出', + condition_input: '条件输入', + switch_input: '开关输入', + loop_items: '迭代项目', + iterator_array: '输入数组', + iterator_item: '当前元素', + iterator_index: '当前索引', + errors: '错误列表', + parallel_input: '并行输入', + parallel_results: '所有分支结果', + wait_input: '透传输入', + wait_output: '透传输出', + merged: '合并结果', + merge_array: '数组结果', + merge_input_1: '输入 1', + merge_input_2: '输入 2', + merge_input_3: '输入 3', + merge_input_4: '输入 4', + aggregated: '聚合变量', + aggregator_variables: '变量输入', + // Action outputs + message_id: '消息ID', + status_code: '状态码', + status: '状态', + execution_id: '执行ID', + notification_id: '通知ID', + target: '目标 ID', + reply_message: '回复内容', + pipeline_response: 'Pipeline 响应', + pipeline_result: '完整结果', + pipeline_query: '查询内容', + context_data: '上下文数据', + store_status: '存储状态', + store_key: '存储键', + store_value: '存储值', + variable_value: '变量值', + variable_result: '设置变量结果', + statement: '开场白', + suggested_questions: '建议问题', + suggestions: '建议问题', + workflow_output: '工作流输出', + final_result: '最终结果', + // Integration outputs + query_results: '查询结果', + row_count: '行数', + query_success: '查询成功', + redis_result: 'Redis结果', + redis_success: 'Redis成功', + redis_key: 'Redis 键', + redis_value: 'Redis 值', + plugin_input: '插件输入', + tool_result: '工具结果', + tool_success: '工具成功', + mcp_arguments: '工具参数', + memory_result: '记忆结果', + memory_success: '记忆成功', + memory_value: '存储值', + answer: '答案', + dify_success: 'Dify成功', + dify_query: '用户输入/查询', + dify_conversation_id: '会话 ID', + search_results: '搜索结果', + knowledge_base_query: '查询内容', + n8n_result: 'N8n结果', + n8n_success: 'N8n成功', + n8n_payload: '工作流输入数据', + flow_result: '流程结果', + flow_success: '流程成功', + langflow_input: '输入内容', + bot_answer: '机器人回复', + bot_success: '机器人成功', + coze_query: '用户输入/查询', + coze_conversation_id: '会话 ID', + bot_conversation_id: '会话 ID', + webhook_body: 'Webhook 请求体', + webhook_headers: 'Webhook 请求头', + webhook_query: 'Webhook 查询参数', + webhook_method: 'Webhook 请求方法', + timestamp: '时间戳', + }, + // Data type labels + 'type.string': '字符串', + 'type.object': '对象', + 'type.array': '数组', + 'type.boolean': '布尔值', + 'type.number': '数字', + 'type.any': '任意类型', + 'type.datetime': '日期时间', + // Legacy editor keys for compatibility + legacyEditor: { + title: '可视化编辑器', + save: '保存', + undo: '撤销', + redo: '重做', + zoomIn: '放大', + zoomOut: '缩小', + fitView: '适应视图', + unsavedChanges: '有未保存的更改', + nodePalette: '节点面板', + properties: '属性', + nodeLabel: '节点名称', + nodeConfig: '节点配置', + deleteNode: '删除节点', + deleteNodeConfirm: '确定删除此节点?', + deleteEdge: '删除连线', + deleteEdgeConfirm: '确定删除此连线?', + edgeCondition: '条件表达式', + edgeConditionPlaceholder: '如: ${output.success} == true', + noNodeSelected: '未选中节点', + selectNodeToEdit: '点击节点查看和编辑属性', + dragNodeHint: '拖拽节点到画布', + }, + nodes: { + trigger: '触发器', + triggerDescription: '工作流的起始节点', + messageTrigger: '消息触发', + messageTriggerDescription: '当收到消息时触发', + scheduleTrigger: '定时触发', + scheduleTriggerDescription: '按计划定时触发', + cronTrigger: '定时触发', + cronTriggerDescription: '按定时计划触发工作流', + webhookTrigger: 'Webhook 触发', + webhookTriggerDescription: '通过 HTTP 请求触发', + eventTrigger: '事件触发', + eventTriggerDescription: '当系统事件发生时触发', + process: 'AI/处理', + processDescription: '数据处理节点', + aiProcess: 'AI 处理', + aiProcessDescription: '使用 AI 模型处理消息', + llmCall: 'LLM 调用', + llmCallDescription: '调用大语言模型进行对话或生成', + codeProcess: '代码处理', + codeProcessDescription: '执行自定义代码', + codeExecutor: '代码执行', + codeExecutorDescription: '执行 Python/JavaScript 代码', + templateProcess: '模板处理', + templateProcessDescription: '使用模板格式化输出', + httpRequest: 'HTTP 请求', + httpRequestDescription: '发送 HTTP 请求', + dataTransform: '数据转换', + dataTransformDescription: '转换数据格式', + questionClassifier: '问题分类器', + questionClassifierDescription: '使用 LLM 将用户问题分类到预定义类别', + parameterExtractor: '参数提取器', + parameterExtractorDescription: '使用 LLM 从文本中提取结构化参数', + knowledgeRetrieval: '知识库检索', + knowledgeRetrievalDescription: '从知识库中检索相关内容', + textTemplate: '文本模板', + textTemplateDescription: '使用模板生成文本', + jsonTransform: 'JSON 转换', + jsonTransformDescription: '转换 JSON 数据', + dataAggregator: '数据聚合', + dataAggregatorDescription: '聚合多个数据源', + textSplitter: '文本分割', + textSplitterDescription: '将文本分割成块', + variableAssignment: '变量赋值', + variableAssignmentDescription: '为工作流变量赋值', + control: '控制流', + controlDescription: '流程控制节点', + condition: '条件分支', + conditionDescription: '根据条件分流', + switch: '多路分支', + switchDescription: '多条件分支选择', + loop: '循环', + loopDescription: '重复执行', + iterator: '迭代器', + iteratorDescription: '遍历数组元素', + parallel: '并行执行', + parallelDescription: '并行执行多个分支', + wait: '等待', + waitDescription: '等待指定时间', + delay: '延迟', + delayDescription: '等待指定时间', + merge: '合并', + mergeDescription: '合并多个分支', + variableAggregator: '变量聚合器', + variableAggregatorDescription: '聚合多个分支的变量输出', + action: '动作', + actionDescription: '执行动作的节点', + sendMessage: '发送消息', + sendMessageDescription: '发送消息到平台', + replyMessage: '回复消息', + replyMessageDescription: '回复触发工作流的消息', + storeData: '存储数据', + storeDataDescription: '存储数据到数据库', + callPipeline: '调用 Pipeline', + callPipelineDescription: '调用现有的 Pipeline', + setVariable: '设置变量', + setVariableDescription: '设置上下文变量', + openingStatement: '对话开场白', + openingStatementDescription: '提供对话开场白和建议问题', + end: '结束', + endDescription: '标记工作流执行结束', + log: '日志', + logDescription: '记录日志信息', + integration: '集成', + integrationDescription: '第三方平台集成节点', + difyWorkflow: 'Dify 工作流', + difyWorkflowDescription: '调用 Dify 平台工作流', + difyKnowledgeQuery: 'Dify 知识库', + difyKnowledgeQueryDescription: '查询 Dify 知识库', + n8nWorkflow: 'n8n 工作流', + n8nWorkflowDescription: '调用 n8n 工作流', + langflowFlow: 'Langflow 流程', + langflowFlowDescription: '调用 Langflow 流程', + cozeBot: 'Coze Bot', + cozeBotDescription: '调用扣子 Bot', + // Data & Tools integration nodes + databaseQuery: '数据库查询', + databaseQueryDescription: '执行数据库查询', + redisOperation: 'Redis 操作', + redisOperationDescription: '执行 Redis 缓存操作', + mcpTool: 'MCP 工具', + mcpToolDescription: '调用 MCP 工具', + memoryStore: '记忆存储', + memoryStoreDescription: '从工作流记忆中存储和检索数据', + }, + executionHistory: { + title: '执行记录', + noExecutions: '暂无执行记录', + status: '状态', + startTime: '开始时间', + duration: '耗时', + running: '运行中', + completed: '已完成', + failed: '失败', + cancelled: '已取消', + viewDetails: '查看详情', + cancel: '取消执行', + retry: '重试', + nodeResults: '节点执行结果', + }, + versions: { + title: '版本历史', + current: '当前版本', + rollback: '回滚到此版本', + rollbackConfirm: '确定回滚到此版本?当前更改将丢失。', + rollbackSuccess: '回滚成功', + rollbackError: '回滚失败:', + }, + // Debug and monitoring + debug: { + title: '调试', + mode: '调试模式', + panel: '调试面板', + start: '开始调试', + pause: '暂停', + resume: '继续', + step: '单步执行', + stop: '停止', + context: '调试上下文', + messageContent: '模拟消息', + messageContentPlaceholder: '输入要模拟的消息内容', + senderId: '发送者 ID', + senderIdPlaceholder: '发送者唯一标识', + senderName: '发送者名称', + senderNamePlaceholder: '发送者显示名称', + platform: '平台', + platformPlaceholder: '例如 qq、wechat、telegram', + conversationId: '会话 ID', + conversationIdPlaceholder: '会话唯一标识', + isGroup: '群聊', + customVariables: '自定义变量', + customVariablesDesc: '添加自定义变量用于调试', + variableKey: '变量名', + variableValue: '变量值', + addVariable: '添加变量', + variables: '监控变量', + watchedVariables: '监控变量', + noWatchedVariables: '暂无监控变量', + addWatchVariable: '添加监控', + nodeStates: '节点状态', + nodeOutputs: '节点输出', + noNodeOutputs: '暂无节点输出', + toggleBreakpoint: '切换断点', + clearBreakpoints: '清除所有断点', + breakpointSet: '断点已设置', + breakpointRemoved: '断点已移除', + logs: '调试日志', + noLogs: '暂无日志', + clearLogs: '清空日志', + autoScroll: '自动滚动', + logEntries: '条日志', + resetContext: '重置上下文', + // Debug execution messages + starting: '正在启动调试执行...', + started: '调试执行已启动 (ID: {{id}})', + startError: '启动调试失败', + completed: '调试执行已完成', + unknownError: '未知错误', + paused: '执行已暂停', + pauseError: '暂停失败', + resumed: '执行已恢复', + resumeError: '恢复失败', + steppedTo: '已执行到节点: {{node}}', + stepError: '单步执行失败', + stopped: '调试已停止', + stopError: '停止失败', + }, + debugMode: '调试模式', + debugPanel: '调试面板', + startDebug: '开始调试', + pauseDebug: '暂停', + resumeDebug: '继续', + stepDebug: '单步执行', + stopDebug: '停止', + debugContext: '调试上下文', + simulatedMessage: '模拟消息', + simulatedMessagePlaceholder: '输入要模拟的消息内容', + senderId: '发送者 ID', + senderIdPlaceholder: '发送者唯一标识', + senderName: '发送者名称', + senderNamePlaceholder: '发送者显示名称', + conversationId: '会话 ID', + conversationIdPlaceholder: '会话唯一标识', + isGroup: '群聊', + customVariables: '自定义变量', + addVariable: '添加变量', + variableName: '变量名', + variableValue: '变量值', + watchedVariables: '监控变量', + addWatchVariable: '添加监控', + nodeStates: '节点状态', + breakpoints: '断点', + toggleBreakpoint: '切换断点', + breakpointSet: '断点已设置', + breakpointRemoved: '断点已移除', + debugLogs: '调试日志', + noLogs: '暂无日志', + clearLogs: '清空日志', + autoScroll: '自动滚动', + debugState: { + idle: '空闲', + running: '运行中', + paused: '已暂停', + completed: '已完成', + error: '错误', + }, + nodeStatus: { + pending: '等待中', + running: '执行中', + completed: '已完成', + failed: '失败', + skipped: '已跳过', + }, + debugDialog: { + title: '工作流对话', + selectWorkflow: '选择工作流', + sessionType: '会话类型', + privateChat: '私聊', + groupChat: '群聊', + send: '发送', + reset: '重置对话', + inputPlaceholder: '发送 {{type}} 消息...', + noMessages: '暂无消息', + userMessage: '用户', + botMessage: '机器人', + sendFailed: '发送失败', + resetSuccess: '对话已重置', + resetFailed: '重置失败', + loadMessagesFailed: '加载消息失败', + loadWorkflowsFailed: '加载工作流失败', + atTips: '提及机器人', + streaming: '流式传输', + streamOutput: '流式', + connected: 'WebSocket已连接', + disconnected: 'WebSocket未连接', + connectionError: 'WebSocket连接错误', + connectionFailed: 'WebSocket连接失败', + notConnected: 'WebSocket未连接,请稍后重试', + imageUploadFailed: '图片上传失败', + reply: '回复', + replyTo: '回复给', + showMarkdown: '渲染', + showRaw: '原文', + allMembers: '全体成员', + file: '文件', + voice: '语音', + uploadImage: '上传图片', + uploading: '上传中...', + }, + // Execution history and monitoring + filterByDate: '按日期筛选', + allTime: '全部时间', + today: '今天', + lastWeek: '最近一周', + lastMonth: '最近一个月', + showingExecutions: '显示 {{shown}} / {{total}} 条记录', + rerun: '重新运行', + rerunExecution: '重新执行', + logs: '日志', + details: '详情', + completedAt: '完成时间', + noNodeExecutions: '暂无节点执行记录', + // Node config field labels (used by DynamicFormComponent) + nodeConfigFields: { + // trigger.py - MessageTriggerNode + conditions: '触发条件', + keyword_filter: '关键词过滤', + regex_filter: '正则过滤', + min_length: '最小长度', + max_length: '最大长度', + require_mention: '需要@机器人', + respond_rules: '群响应规则', + access_control: '访问控制', + // trigger.py - CronTriggerNode + cron: 'Cron表达式', + timezone: '时区', + description: '描述', + // trigger.py - WebhookTriggerNode + path: 'Webhook路径', + allowed_methods: '允许的HTTP方法', + content_type: 'Content-Type', + auth_type: '认证方式', + auth_key: '认证密钥', + validation: '请求验证', + timeout: '超时时间', + // trigger.py - EventTriggerNode + event_types: '事件类型', + filter: '事件过滤', + debounce_ms: '防抖时间', + // process.py - LLMCallNode + model: '模型', + prompt_template: '提示词模板', + system_prompt: '系统提示词', + temperature: '温度', + top_p: 'Top P', + frequency_penalty: '频率惩罚', + presence_penalty: '存在惩罚', + max_tokens: '最大Token数', + stop_sequences: '停止序列', + seed: '随机种子', + stream: '流式输出', + use_conversation_history: '使用对话历史', + // process.py - CodeExecutorNode + language: '编程语言', + code: '代码', + // process.py - HTTPRequestNode + url: '请求URL', + method: '请求方法', + auth_config: '认证配置', + // process.py - DataTransformNode + transform_type: '转换类型', + template: '模板', + expression: '表达式', + output_type: '输出类型', + // process.py - QuestionClassifierNode + categories: '分类类别', + instruction: '指令', + // process.py - ParameterExtractorNode + parameters: '参数定义', + // process.py - KnowledgeRetrievalNode + knowledge_bases: '知识库', + top_k: '返回数量', + score_threshold: '相似度阈值', + search_method: '搜索方法', + enable_citations: '启用引用', + // control.py - ConditionNode + condition_type: '条件类型', + condition_expression: '条件表达式', + left_value: '左值', + operator: '比较运算符', + right_value: '右值', + // control.py - SwitchNode + cases: '分支条件', + // control.py - LoopNode + max_iterations: '最大迭代次数', + break_condition: '中断条件', + // control.py - IteratorNode + parallel: '并行处理', + max_concurrency: '最大并发数', + // control.py - ParallelNode + branches: '分支配置', + wait_all: '等待所有', + fail_fast: '快速失败', + // control.py - WaitNode + duration: '等待时间', + duration_type: '时间单位', + // control.py - MergeNode + merge_strategy: '合并策略', + // control.py - VariableAggregatorNode + variable_mappings: '变量映射', + aggregation_mode: '聚合模式', + // action.py - SendMessageNode + target_type: '目标类型', + target_id: '目标ID', + platform: '平台', + message_type: '消息类型', + // action.py - ReplyMessageNode + reply_mode: '回复模式', + message_template: '消息模板', + long_text_processing: '长文本处理', + force_delay: '强制延迟', + // action.py - CallPipelineNode + pipeline_uuid: '流水线', + inherit_context: '继承上下文', + // action.py - StoreDataNode + storage_type: '存储类型', + ttl: '过期时间', + key_prefix: '键前缀', + // action.py - SetVariableNode + variable_name: '变量名称', + variable_scope: '变量作用域', + set_variable_operation: '操作类型', + // action.py - OpeningStatementNode + statement: '开场白', + suggested_questions: '建议问题', + show_suggestions: '显示建议', + // action.py - EndNode + output_format: '输出格式', + success_message: '成功消息', + // integration.py - DatabaseQueryNode + connection_type: '数据库类型', + connection_string: '连接字符串', + query: 'SQL查询', + query_type: '查询类型', + // integration.py - RedisOperationNode + connection_url: '连接URL', + operation: '操作类型', + key_template: '键模板', + hash_field: '哈希字段', + // integration.py - MCPToolNode + server_name: '服务器名称', + tool_name: '工具名称', + arguments_template: '参数模板', + // integration.py - MemoryStoreNode + scope: '作用域', + // integration.py - DifyWorkflowNode + 'base-url': '基础URL', + 'api-key': 'API密钥', + 'app-type': '应用类型', + // integration.py - DifyKnowledgeQueryNode + dataset_id: '知识库ID', + // integration.py - N8nWorkflowNode + 'webhook-url': 'Webhook URL', + // integration.py - LangflowFlowNode + 'flow-id': '流程ID', + // integration.py - CozeBotNode + 'bot-id': '机器人ID', + 'api-base': 'API基础URL', + // process-configs.ts - TextTemplateNode + escape_html: '转义HTML', + trim_whitespace: '去除空白', + // process-configs.ts - JsonTransformNode + json_transform_type: 'JSON转换类型', + json_expression: 'JSON表达式', + mapping: '字段映射', + // process-configs.ts - CodeExecutorNode + code_language: '编程语言', + code_content: '代码内容', + // process-configs.ts - DataAggregatorNode + aggregation_type: '聚合类型', + separator: '分隔符', + field_path: '字段路径', + // process-configs.ts - TextSplitterNode + split_type: '分割类型', + chunk_size: '块大小', + chunk_overlap: '块重叠', + regex_pattern: '正则表达式', + remove_empty: '移除空块', + // process-configs.ts - VariableAssignmentNode + assign_variable_name: '变量名', + value_type: '值类型', + static_value: '静态值', + // integration-configs.ts - N8nWorkflowNode + n8n_webhook_url: 'Webhook URL', + n8n_auth_type: '认证方式', + // integration-configs.ts - LangflowFlowNode + langflow_flow_id: '流程ID', + // integration-configs.ts - CozeBotNode + coze_bot_id: '机器人ID', + coze_api_base: 'API基础URL', + }, + }, diff --git a/web/workflows_translation_guide.md b/web/workflows_translation_guide.md new file mode 100644 index 00000000..93c2df72 --- /dev/null +++ b/web/workflows_translation_guide.md @@ -0,0 +1,265 @@ +# Workflows翻译工作流程指南 + +## 📋 概述 + +本指南说明如何使用提供的工具完成workflows部分的多语言翻译工作。 + +## 🎯 翻译目标 + +- **总键数**: 627个workflows相关的键 +- **目标语言**: 6种语言(日语、繁体中文、西班牙语、俄语、泰语、越南语) +- **总翻译项**: 3762个(627键 × 6语言) + +## 🛠️ 工具说明 + +### 1. `workflows_translations.json` - 翻译模板文件 + +这是核心翻译文件,包含所有需要翻译的键和值。 + +**文件结构**: +```json +{ + "_comment": "Workflows翻译模板", + "_instructions": [...], + "_progress": { + "total_keys": 627, + "translated_keys": 0, + "remaining_keys": 627, + "languages": ["ja-JP", "zh-Hant", "es-ES", "ru-RU", "th-TH", "vi-VN"] + }, + "translations": { + "title": { + "zh-Hans": "工作流对话", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + ... + } +} +``` + +### 2. `apply_workflows_translations.py` - 应用翻译脚本 + +将完成的翻译应用到实际的语言文件中。 + +**功能**: +- 读取 `workflows_translations.json` +- 识别已完成的翻译(非"TODO") +- 应用到对应的语言文件(ja-JP.ts, zh-Hant.ts等) +- 生成应用报告 +- 支持增量应用(可以分批翻译) + +**使用方法**: +```bash +cd LangBot_copy/web +python3 apply_workflows_translations.py +``` + +### 3. `check_translation_progress.py` - 进度检查脚本 + +查看当前翻译进度和统计信息。 + +**功能**: +- 显示每种语言的翻译进度 +- 显示进度条和百分比 +- 列出已完成和待完成的键 +- 建议下一批要翻译的键 +- 估算剩余工作量 + +**使用方法**: +```bash +cd LangBot_copy/web +python3 check_translation_progress.py +``` + +## 📝 翻译工作流程 + +### 步骤1: 检查当前进度 + +```bash +python3 check_translation_progress.py +``` + +这会显示: +- 每种语言的完成度 +- 剩余待翻译的键数量 +- 建议下一批翻译的键 + +### 步骤2: 编辑翻译文件 + +打开 `workflows_translations.json` 文件,找到要翻译的键,将 `"TODO"` 替换为实际翻译。 + +**示例**: + +翻译前: +```json +"title": { + "zh-Hans": "工作流对话", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" +} +``` + +翻译后: +```json +"title": { + "zh-Hans": "工作流对话", + "ja-JP": "ワークフロー会話", + "zh-Hant": "工作流對話", + "es-ES": "Conversación de Flujo de Trabajo", + "ru-RU": "Диалог Рабочего Процесса", + "th-TH": "การสนทนาเวิร์กโฟลว์", + "vi-VN": "Hội thoại Quy trình" +} +``` + +**翻译技巧**: +- 参考 `zh-Hans` 的中文原文理解含义 +- 保持专业术语的一致性 +- 注意特殊字符需要转义(如单引号 `'` 要写成 `\'`) +- 可以使用翻译工具辅助,但需要人工审核确保准确性 + +### 步骤3: 应用翻译 + +完成一批翻译后,运行应用脚本: + +```bash +python3 apply_workflows_translations.py +``` + +脚本会: +- 自动识别已完成的翻译 +- 应用到对应的语言文件 +- 显示应用结果和统计信息 +- 更新进度信息 + +### 步骤4: 重复步骤1-3 + +继续翻译下一批键,直到所有翻译完成。 + +## 💡 建议的翻译策略 + +### 方案A: 按主题分批(推荐) + +将相关的键分组翻译,例如: +1. **第1批**: 基础UI文本(title, description, placeholder等) +2. **第2批**: 节点相关(nodes, nodeTypes, nodeCategories等) +3. **第3批**: 调试相关(debug, debugDialog, executionHistory等) +4. **第4批**: 配置相关(nodeConfigFields, validation等) +5. **第5批**: 其他剩余键 + +**优点**: 上下文相关,翻译更一致 + +### 方案B: 按数量分批 + +每批翻译固定数量的键(如50或100个)。 + +**优点**: 进度可控,容易估算时间 + +### 方案C: 按语言分批 + +先完成一种语言的所有翻译,再翻译下一种语言。 + +**优点**: 可以利用语言专长,集中精力 + +## 📊 进度跟踪 + +使用 `check_translation_progress.py` 随时查看进度: + +```bash +python3 check_translation_progress.py +``` + +输出示例: +``` +================================================================================ +📊 Workflows翻译进度报告 +================================================================================ + +【日语 (ja-JP)】 + [████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 20.0% + ✅ 已完成: 125/627 + ⏳ 待翻译: 502 + 📝 最近完成: title, description, placeholder, ... + +【繁体中文 (zh-Hant)】 + [████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 20.0% + ✅ 已完成: 125/627 + ⏳ 待翻译: 502 + +... + +-------------------------------------------------------------------------------- +📈 总体进度: 750/3762 (19.9%) +📊 平均每种语言: 125/627 + +💡 剩余工作量: 3012 个翻译项 + 建议分批策略: + - 每批50个键: 需要 61 批 + - 每批100个键: 需要 31 批 +================================================================================ +``` + +## ⚠️ 注意事项 + +1. **备份**: 在开始翻译前,建议备份原始文件 +2. **编码**: 确保使用UTF-8编码保存文件 +3. **格式**: 保持JSON格式正确,注意逗号和引号 +4. **特殊字符**: 单引号需要转义为 `\'` +5. **验证**: 每次应用翻译后,检查语言文件是否有语法错误 +6. **增量工作**: 可以分多次完成,每次翻译一部分然后应用 + +## 🔍 故障排除 + +### 问题1: 应用翻译时提示"没有发现任何已完成的翻译" + +**原因**: 所有值都还是 "TODO" + +**解决**: 编辑 `workflows_translations.json`,将至少一个键的 "TODO" 替换为实际翻译 + +### 问题2: 应用翻译后语言文件报错 + +**原因**: 翻译中包含未转义的特殊字符 + +**解决**: 检查翻译文本,将单引号 `'` 替换为 `\'` + +### 问题3: 某些键应用失败 + +**原因**: 键名在语言文件中不存在或格式不匹配 + +**解决**: 检查应用报告中的失败键列表,手动在语言文件中添加或修正 + +## 📈 预估工作量 + +- **总翻译项**: 3762个 +- **每小时翻译速度**: 约50-100项(取决于熟练度) +- **预估总时间**: 38-75小时 +- **建议分批**: 每天翻译100-200项,约需19-38天完成 + +## ✅ 完成标准 + +当 `check_translation_progress.py` 显示: +- 所有语言的进度都达到 100% +- 没有剩余待翻译的键 +- 所有语言文件都能正常编译 + +则翻译工作完成! + +## 🎉 完成后 + +1. 运行最后一次 `apply_workflows_translations.py` 确保所有翻译已应用 +2. 测试各语言界面,确认翻译正确显示 +3. 提交代码变更 +4. 生成最终翻译报告 + +--- + +**祝翻译工作顺利!** 🚀 diff --git a/web/workflows_translations.json b/web/workflows_translations.json new file mode 100644 index 00000000..57c94c92 --- /dev/null +++ b/web/workflows_translations.json @@ -0,0 +1,5676 @@ +{ + "_comment": "Workflows翻译模板 - 共717个键需要翻译", + "_instructions": [ + "1. 这个文件包含所有717个需要翻译的键", + "2. 每个键下有6种语言需要翻译:ja-JP, zh-Hant, es-ES, ru-RU, th-TH, vi-VN", + "3. 您可以分批填写翻译,填写完成后运行 apply_workflows_translations.py 应用翻译", + "4. 已填写的翻译会被标记,未填写的会保持为 TODO", + "5. 建议每次翻译50-100个键,然后应用并测试" + ], + "_progress": { + "total_keys": 627, + "translated_keys": 204, + "remaining_keys": 423, + "languages": [ + "ja-JP", + "zh-Hant", + "es-ES", + "ru-RU", + "th-TH", + "vi-VN" + ], + "by_language": { + "ja-JP": 0, + "zh-Hant": 0, + "es-ES": 307, + "ru-RU": 307, + "th-TH": 307, + "vi-VN": 307 + } + }, + "translations": { + "title": { + "zh-Hans": "工作流对话", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Conversación de Flujo de Trabajo", + "ru-RU": "Диалог Рабочего Процесса", + "th-TH": "การสนทนาเวิร์กโฟลว์", + "vi-VN": "Hội thoại Quy trình" + }, + "description": { + "zh-Hans": "描述", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Descripción", + "ru-RU": "Описание", + "th-TH": "คำอธิบาย", + "vi-VN": "Mô tả" + }, + "createWorkflow": { + "zh-Hans": "创建工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Crear Flujo de Trabajo", + "ru-RU": "Создать Рабочий Процесс", + "th-TH": "สร้างเวิร์กโฟลว์", + "vi-VN": "Tạo Quy trình" + }, + "selectFromSidebar": { + "zh-Hans": "从侧边栏选择一个工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Seleccione un flujo de trabajo de la barra lateral", + "ru-RU": "Выберите рабочий процесс из боковой панели", + "th-TH": "เลือกเวิร์กโฟลว์จากแถบด้านข้าง", + "vi-VN": "Chọn một quy trình từ thanh bên" + }, + "editWorkflow": { + "zh-Hans": "编辑工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Editar Flujo de Trabajo", + "ru-RU": "Редактировать Рабочий Процесс", + "th-TH": "แก้ไขเวิร์กโฟลว์", + "vi-VN": "Chỉnh sửa Quy trình" + }, + "newWorkflow": { + "zh-Hans": "新工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nuevo Flujo de Trabajo", + "ru-RU": "Новый Рабочий Процесс", + "th-TH": "เวิร์กโฟลว์ใหม่", + "vi-VN": "Quy trình Mới" + }, + "getWorkflowListError": { + "zh-Hans": "获取工作流列表失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al obtener la lista de flujos de trabajo:", + "ru-RU": "Ошибка получения списка рабочих процессов:", + "th-TH": "ไม่สามารถรับรายการเวิร์กโฟลว์:", + "vi-VN": "Lỗi khi lấy danh sách quy trình:" + }, + "workflowName": { + "zh-Hans": "工作流名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre del Flujo de Trabajo", + "ru-RU": "Название Рабочего Процесса", + "th-TH": "ชื่อเวิร์กโฟลว์", + "vi-VN": "Tên Quy trình" + }, + "workflowDescription": { + "zh-Hans": "工作流描述", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Descripción del Flujo de Trabajo", + "ru-RU": "Описание Рабочего Процесса", + "th-TH": "คำอธิบายเวิร์กโฟลว์", + "vi-VN": "Mô tả Quy trình" + }, + "workflowNameRequired": { + "zh-Hans": "工作流名称不能为空", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "El nombre del flujo de trabajo no puede estar vacío", + "ru-RU": "Название рабочего процесса не может быть пустым", + "th-TH": "ชื่อเวิร์กโฟลว์ไม่สามารถว่างเปล่า", + "vi-VN": "Tên quy trình không được để trống" + }, + "defaultDescription": { + "zh-Hans": "一个工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Un flujo de trabajo", + "ru-RU": "Рабочий процесс", + "th-TH": "เวิร์กโฟลว์", + "vi-VN": "Một quy trình" + }, + "getWorkflowError": { + "zh-Hans": "获取工作流失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al obtener el flujo de trabajo:", + "ru-RU": "Ошибка получения рабочего процесса:", + "th-TH": "ไม่สามารถรับเวิร์กโฟลว์:", + "vi-VN": "Lỗi khi lấy quy trình:" + }, + "loadError": { + "zh-Hans": "加载工作流失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al cargar el flujo de trabajo", + "ru-RU": "Ошибка загрузки рабочего процесса", + "th-TH": "ไม่สามารถโหลดเวิร์กโฟลว์", + "vi-VN": "Lỗi khi tải quy trình" + }, + "saveSuccess": { + "zh-Hans": "保存成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Guardado exitosamente", + "ru-RU": "Успешно сохранено", + "th-TH": "บันทึกสำเร็จ", + "vi-VN": "Lưu thành công" + }, + "saveError": { + "zh-Hans": "保存失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al guardar:", + "ru-RU": "Ошибка сохранения:", + "th-TH": "ไม่สามารถบันทึก:", + "vi-VN": "Lỗi khi lưu:" + }, + "createSuccess": { + "zh-Hans": "工作流创建成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de trabajo creado exitosamente", + "ru-RU": "Рабочий процесс успешно создан", + "th-TH": "สร้างเวิร์กโฟลว์สำเร็จ", + "vi-VN": "Tạo quy trình thành công" + }, + "createError": { + "zh-Hans": "创建失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al crear:", + "ru-RU": "Ошибка создания:", + "th-TH": "ไม่สามารถสร้าง:", + "vi-VN": "Lỗi khi tạo:" + }, + "deleteSuccess": { + "zh-Hans": "删除成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminado exitosamente", + "ru-RU": "Успешно удалено", + "th-TH": "ลบสำเร็จ", + "vi-VN": "Xóa thành công" + }, + "deleteError": { + "zh-Hans": "删除失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al eliminar:", + "ru-RU": "Ошибка удаления:", + "th-TH": "ไม่สามารถลบ:", + "vi-VN": "Lỗi khi xóa:" + }, + "deleteConfirmation": { + "zh-Hans": "你确定要删除这个工作流吗?", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "¿Está seguro de que desea eliminar este flujo de trabajo?", + "ru-RU": "Вы уверены, что хотите удалить этот рабочий процесс?", + "th-TH": "คุณแน่ใจหรือไม่ว่าต้องการลบเวิร์กโฟลว์นี้?", + "vi-VN": "Bạn có chắc chắn muốn xóa quy trình này không?" + }, + "copySuccess": { + "zh-Hans": "复制成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Copiado exitosamente", + "ru-RU": "Успешно скопировано", + "th-TH": "คัดลอกสำเร็จ", + "vi-VN": "Sao chép thành công" + }, + "copyError": { + "zh-Hans": "复制失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al copiar:", + "ru-RU": "Не удалось скопировать:", + "th-TH": "คัดลอกล้มเหลว:", + "vi-VN": "Sao chép thất bại:" + }, + "export": { + "zh-Hans": "导出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Exportar", + "ru-RU": "Экспорт", + "th-TH": "ส่งออก", + "vi-VN": "Xuất" + }, + "import": { + "zh-Hans": "导入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Importar", + "ru-RU": "Импорт", + "th-TH": "นำเข้า", + "vi-VN": "Nhập" + }, + "exportSuccess": { + "zh-Hans": "工作流已导出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de trabajo exportado", + "ru-RU": "Рабочий процесс экспортирован", + "th-TH": "ส่งออกเวิร์กโฟลว์แล้ว", + "vi-VN": "Đã xuất quy trình làm việc" + }, + "importSuccess": { + "zh-Hans": "工作流已导入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de trabajo importado", + "ru-RU": "Рабочий процесс импортирован", + "th-TH": "นำเข้าเวิร์กโฟลว์แล้ว", + "vi-VN": "Đã nhập quy trình làm việc" + }, + "importError": { + "zh-Hans": "导入失败:文件格式无效", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al importar: formato de archivo inválido", + "ru-RU": "Не удалось импортировать: недопустимый формат файла", + "th-TH": "นำเข้าล้มเหลว: รูปแบบไฟล์ไม่ถูกต้อง", + "vi-VN": "Nhập thất bại: định dạng tệp không hợp lệ" + }, + "publish": { + "zh-Hans": "发布", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Publicar", + "ru-RU": "Опубликовать", + "th-TH": "เผยแพร่", + "vi-VN": "Xuất bản" + }, + "publishSuccess": { + "zh-Hans": "发布成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Publicado exitosamente", + "ru-RU": "Успешно опубликовано", + "th-TH": "เผยแพร่สำเร็จ", + "vi-VN": "Xuất bản thành công" + }, + "publishError": { + "zh-Hans": "发布失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error al publicar", + "ru-RU": "Не удалось опубликовать", + "th-TH": "เผยแพร่ล้มเหลว", + "vi-VN": "Xuất bản thất bại" + }, + "configuration": { + "zh-Hans": "配置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Configuración", + "ru-RU": "Конфигурация", + "th-TH": "การกำหนดค่า", + "vi-VN": "Cấu hình" + }, + "executions": { + "zh-Hans": "执行记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Registros de ejecución", + "ru-RU": "Записи выполнения", + "th-TH": "บันทึกการดำเนินการ", + "vi-VN": "Bản ghi thực thi" + }, + "editor": { + "zh-Hans": "编辑器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Editor", + "ru-RU": "Редактор", + "th-TH": "ตัวแก้ไข", + "vi-VN": "Trình chỉnh sửa" + }, + "debugChat": { + "zh-Hans": "对话调试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ConversaciónDepurar", + "ru-RU": "ДиалогОтладка", + "th-TH": "การสนทนาดีบัก", + "vi-VN": "Hội thoạiGỡ lỗi" + }, + "basicInfo": { + "zh-Hans": "基础信息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Información básica", + "ru-RU": "Основная информация", + "th-TH": "ข้อมูลพื้นฐาน", + "vi-VN": "Thông tin cơ bản" + }, + "basicInfoDesc": { + "zh-Hans": "设置工作流名称、图标和描述", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Configurar nombre, icono y descripción del flujo de trabajo", + "ru-RU": "Настроить название, значок и описание рабочего процесса", + "th-TH": "ตั้งค่าชื่อ ไอคอน และคำอธิบายเวิร์กโฟลว์", + "vi-VN": "Cấu hình tên, biểu tượng và mô tả quy trình làm việc" + }, + "basicInfoDescription": { + "zh-Hans": "设置工作流名称和描述", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Configurar nombre y descripción del flujo de trabajo", + "ru-RU": "Настроить название и описание рабочего процесса", + "th-TH": "ตั้งค่าชื่อและคำอธิบายเวิร์กโฟลว์", + "vi-VN": "Cấu hình tên và mô tả quy trình làm việc" + }, + "dangerZone": { + "zh-Hans": "危险区域", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Zona peligrosa", + "ru-RU": "Опасная зона", + "th-TH": "พื้นที่อันตราย", + "vi-VN": "Vùng nguy hiểm" + }, + "dangerZoneDesc": { + "zh-Hans": "不可逆的操作", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Operaciones irreversibles", + "ru-RU": "Необратимые операции", + "th-TH": "การดำเนินการที่ไม่สามารถย้อนกลับได้", + "vi-VN": "Các thao tác không thể hoàn tác" + }, + "dangerZoneDescription": { + "zh-Hans": "不可逆的操作", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Operaciones irreversibles", + "ru-RU": "Необратимые операции", + "th-TH": "การดำเนินการที่ไม่สามารถย้อนกลับได้", + "vi-VN": "Các thao tác không thể hoàn tác" + }, + "deleteWorkflowAction": { + "zh-Hans": "删除此工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminar este flujo de trabajo", + "ru-RU": "Удалить этот рабочий процесс", + "th-TH": "ลบเวิร์กโฟลว์นี้", + "vi-VN": "Xóa quy trình làm việc này" + }, + "deleteWorkflowHint": { + "zh-Hans": "删除后,所有关联配置将被永久移除,且无法恢复。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Después de eliminar, todas las configuraciones asociadas se eliminarán permanentemente y no se podrán recuperar.", + "ru-RU": "После удаления все связанные конфигурации будут удалены навсегда и не могут быть восстановлены.", + "th-TH": "หลังจากลบแล้ว การกำหนดค่าที่เกี่ยวข้องทั้งหมดจะถูกลบอย่างถาวรและไม่สามารถกู้คืนได้", + "vi-VN": "Sau khi xóa, tất cả các cấu hình liên quan sẽ bị xóa vĩnh viễn và không thể khôi phục." + }, + "deleteWorkflow": { + "zh-Hans": "删除工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EliminarFlujo de Trabajo", + "ru-RU": "УдалитьРабочий Процесс", + "th-TH": "ลบเวิร์กโฟลว์", + "vi-VN": "XóaQuy trình" + }, + "deleteConfirm": { + "zh-Hans": "确认删除", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ConfirmarEliminar", + "ru-RU": "ПодтвердитьУдалить", + "th-TH": "ยืนยันลบ", + "vi-VN": "Xác nhậnXóa" + }, + "deleteConfirmDesc": { + "zh-Hans": "您确定要删除工作流 \"{{name}}\" 吗?此操作无法撤销。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "¿Está seguro de que desea eliminar el flujo de trabajo \"{{name}}\"? Esta operación no se puede deshacer.", + "ru-RU": "Вы уверены, что хотите удалить рабочий процесс \"{{name}}\"? Эту операцию нельзя отменить.", + "th-TH": "คุณแน่ใจหรือไม่ว่าต้องการลบเวิร์กโฟลว์ \"{{name}}\"? การดำเนินการนี้ไม่สามารถยกเลิกได้", + "vi-VN": "Bạn có chắc chắn muốn xóa quy trình làm việc \"{{name}}\" không? Thao tác này không thể hoàn tác." + }, + "name": { + "zh-Hans": "名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre", + "ru-RU": "Название", + "th-TH": "ชื่อ", + "vi-VN": "Tên" + }, + "namePlaceholder": { + "zh-Hans": "输入工作流名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EntradaFlujo de TrabajoNombre", + "ru-RU": "ВходРабочий ПроцессНазвание", + "th-TH": "อินพุตเวิร์กโฟลว์ชื่อ", + "vi-VN": "Đầu vàoQuy trìnhTên" + }, + "descriptionPlaceholder": { + "zh-Hans": "输入工作流描述(可选)", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ingrese la descripción del flujo de trabajo (opcional)", + "ru-RU": "Введите описание рабочего процесса (необязательно)", + "th-TH": "ป้อนคำอธิบายเวิร์กโฟลว์ (ไม่บังคับ)", + "vi-VN": "Nhập mô tả quy trình làm việc (tùy chọn)" + }, + "enabled": { + "zh-Hans": "启用", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Habilitar", + "ru-RU": "Включить", + "th-TH": "เปิดใช้งาน", + "vi-VN": "Bật" + }, + "enabledDesc": { + "zh-Hans": "启用后,工作流将可以被触发执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Una vez habilitado, el flujo de trabajo podrá ser activado para su ejecución", + "ru-RU": "После включения рабочий процесс может быть запущен для выполнения", + "th-TH": "เมื่อเปิดใช้งานแล้ว เวิร์กโฟลว์จะสามารถถูกทริกเกอร์เพื่อดำเนินการได้", + "vi-VN": "Sau khi bật, quy trình làm việc có thể được kích hoạt để thực thi" + }, + "loading": { + "zh-Hans": "加载中...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cargando...", + "ru-RU": "Загрузка...", + "th-TH": "กำลังโหลด...", + "vi-VN": "Đang tải..." + }, + "info": { + "zh-Hans": "工作流信息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de TrabajoInformación", + "ru-RU": "Рабочий ПроцессИнформация", + "th-TH": "เวิร์กโฟลว์ข้อมูล", + "vi-VN": "Quy trìnhThông tin" + }, + "uuid": { + "zh-Hans": "UUID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "UUID", + "ru-RU": "UUID", + "th-TH": "UUID", + "vi-VN": "UUID" + }, + "version": { + "zh-Hans": "版本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Versión", + "ru-RU": "Версия", + "th-TH": "เวอร์ชัน", + "vi-VN": "Phiên bản" + }, + "createdAt": { + "zh-Hans": "创建时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Fecha de creación", + "ru-RU": "Дата создания", + "th-TH": "เวลาสร้าง", + "vi-VN": "Thời gian tạo" + }, + "updatedAt": { + "zh-Hans": "更新时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Fecha de actualización", + "ru-RU": "Дата обновления", + "th-TH": "เวลาอัปเดต", + "vi-VN": "Thời gian cập nhật" + }, + "totalExecutions": { + "zh-Hans": "共 {{count}} 条执行记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Total de {{count}} registros de ejecución", + "ru-RU": "Всего {{count}} записей выполнения", + "th-TH": "รวม {{count}} บันทึกการดำเนินการ", + "vi-VN": "Tổng cộng {{count}} bản ghi thực thi" + }, + "statistics": { + "zh-Hans": "统计分析", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Análisis estadístico", + "ru-RU": "Статистический анализ", + "th-TH": "การวิเคราะห์สถิติ", + "vi-VN": "Phân tích thống kê" + }, + "successfulCount": { + "zh-Hans": "成功 {{count}} 次", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "{{count}} éxitos", + "ru-RU": "{{count}} успешных", + "th-TH": "สำเร็จ {{count}} ครั้ง", + "vi-VN": "Thành công {{count}} lần" + }, + "successRate": { + "zh-Hans": "成功率", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "averageDuration": { + "zh-Hans": "平均耗时", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Duración promedio", + "ru-RU": "Средняя длительность", + "th-TH": "ระยะเวลาเฉลี่ย", + "vi-VN": "Thời lượng trung bình" + }, + "perExecution": { + "zh-Hans": "每次执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Por ejecución", + "ru-RU": "За выполнение", + "th-TH": "ต่อการดำเนินการ", + "vi-VN": "Mỗi lần thực thi" + }, + "failedExecutions": { + "zh-Hans": "失败次数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "lastExecution": { + "zh-Hans": "最后执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Última ejecución", + "ru-RU": "Последнее выполнение", + "th-TH": "การดำเนินการล่าสุด", + "vi-VN": "Lần thực thi cuối" + }, + "filterByStatus": { + "zh-Hans": "按状态筛选", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Filtrar por estado", + "ru-RU": "Фильтр по статусу", + "th-TH": "กรองตามสถานะ", + "vi-VN": "Lọc theo trạng thái" + }, + "allStatuses": { + "zh-Hans": "全部状态", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "manualTrigger": { + "zh-Hans": "手动触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Activación manual", + "ru-RU": "Ручной запуск", + "th-TH": "ทริกเกอร์ด้วยตนเอง", + "vi-VN": "Kích hoạt thủ công" + }, + "executionId": { + "zh-Hans": "执行 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ejecutar ID", + "ru-RU": "Выполнить ID", + "th-TH": "ดำเนินการ ID", + "vi-VN": "Thực thi ID" + }, + "status": { + "zh-Hans": "状态", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Estado", + "ru-RU": "Статус", + "th-TH": "สถานะ", + "vi-VN": "Trạng thái" + }, + "triggerType": { + "zh-Hans": "触发类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tipo de activación", + "ru-RU": "Тип триггера", + "th-TH": "ประเภททริกเกอร์", + "vi-VN": "Loại kích hoạt" + }, + "startedAt": { + "zh-Hans": "开始时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Hora de inicio", + "ru-RU": "Время начала", + "th-TH": "เวลาเริ่มต้น", + "vi-VN": "Thời gian bắt đầu" + }, + "duration": { + "zh-Hans": "等待时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "noExecutions": { + "zh-Hans": "暂无执行记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "No hay registros de ejecución", + "ru-RU": "Нет записей выполнения", + "th-TH": "ไม่มีบันทึกการดำเนินการ", + "vi-VN": "Không có bản ghi thực thi" + }, + "executionDetails": { + "zh-Hans": "执行详情", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Detalles de ejecución", + "ru-RU": "Детали выполнения", + "th-TH": "รายละเอียดการดำเนินการ", + "vi-VN": "Chi tiết thực thi" + }, + "error": { + "zh-Hans": "错误", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Error", + "ru-RU": "Ошибка", + "th-TH": "ข้อผิดพลาด", + "vi-VN": "Lỗi" + }, + "nodeExecutions": { + "zh-Hans": "节点执行记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "result": { + "zh-Hans": "结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Resultado", + "ru-RU": "Результат", + "th-TH": "ผลลัพธ์", + "vi-VN": "Kết quả" + }, + "nodePalette": { + "zh-Hans": "节点面板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Panel de nodos", + "ru-RU": "Панель узлов", + "th-TH": "แผงโหนด", + "vi-VN": "Bảng điều khiển nút" + }, + "properties": { + "zh-Hans": "属性", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Propiedades", + "ru-RU": "Свойства", + "th-TH": "คุณสมบัติ", + "vi-VN": "Thuộc tính" + }, + "zoomIn": { + "zh-Hans": "放大", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Acercar", + "ru-RU": "Увеличить", + "th-TH": "ขยาย", + "vi-VN": "Phóng to" + }, + "zoomOut": { + "zh-Hans": "缩小", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Alejar", + "ru-RU": "Уменьшить", + "th-TH": "ย่อ", + "vi-VN": "Thu nhỏ" + }, + "fitView": { + "zh-Hans": "适应视图", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ajustar vista", + "ru-RU": "Подогнать вид", + "th-TH": "ปรับมุมมอง", + "vi-VN": "Điều chỉnh khung nhìn" + }, + "unsavedChanges": { + "zh-Hans": "有未保存的更改", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "paste": { + "zh-Hans": "粘贴", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pegar", + "ru-RU": "Вставить", + "th-TH": "วาง", + "vi-VN": "Dán" + }, + "deleted": { + "zh-Hans": "已删除", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminado", + "ru-RU": "Удалено", + "th-TH": "ลบแล้ว", + "vi-VN": "Đã xóa" + }, + "nothingToCopy": { + "zh-Hans": "没有选中的节点可复制", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nothingToPaste": { + "zh-Hans": "剪贴板为空", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "copied": { + "zh-Hans": "已复制 {{count}} 个节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "pasted": { + "zh-Hans": "已粘贴 {{count}} 个节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nodesSelected": { + "zh-Hans": "已选中 {{count}} 个节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "{{count}} nodos seleccionados", + "ru-RU": "Выбрано {{count}} узлов", + "th-TH": "เลือก {{count}} โหนดแล้ว", + "vi-VN": "Đã chọn {{count}} nút" + }, + "edgesSelected": { + "zh-Hans": "已选中 {{count}} 条连线", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Seleccionado {{count}} conexiones", + "ru-RU": "Выбрано {{count}} соединений", + "th-TH": "เลือกแล้ว {{count}} การเชื่อมต่อ", + "vi-VN": "Đã chọn {{count}} kết nối" + }, + "searchNodes": { + "zh-Hans": "搜索节点...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "loadingNodeTypes": { + "zh-Hans": "正在加载节点类型...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "noNodesFound": { + "zh-Hans": "未找到匹配的节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "clearSearch": { + "zh-Hans": "清除搜索", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Limpiar búsqueda", + "ru-RU": "Очистить поиск", + "th-TH": "ล้างการค้นหา", + "vi-VN": "Xóa tìm kiếm" + }, + "dragToAdd": { + "zh-Hans": "拖拽节点到画布添加", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "selectNodeOrEdge": { + "zh-Hans": "选择一个节点或连线", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "selectNodeOrEdgeHint": { + "zh-Hans": "点击画布中的节点或连线来查看和编辑其属性", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "edgeProperties": { + "zh-Hans": "连线属性", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Propiedades de conexión", + "ru-RU": "Свойства соединения", + "th-TH": "คุณสมบัติการเชื่อมต่อ", + "vi-VN": "Thuộc tính kết nối" + }, + "nodeProperties": { + "zh-Hans": "节点属性", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Propiedades del nodo", + "ru-RU": "Свойства узла", + "th-TH": "คุณสมบัติโหนด", + "vi-VN": "Thuộc tính nút" + }, + "condition": { + "zh-Hans": "条件分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "hasCondition": { + "zh-Hans": "已设置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "conditionPlaceholder": { + "zh-Hans": "输入条件表达式,如: output.success == true", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "conditionHelp": { + "zh-Hans": "条件为空时,该连线将始终被执行。支持使用 {{变量名}} 引用上下文变量。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "deleteEdge": { + "zh-Hans": "删除连线", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminar conexión", + "ru-RU": "Удалить соединение", + "th-TH": "ลบขอบ", + "vi-VN": "Xóa cạnh" + }, + "deleteEdgeConfirm": { + "zh-Hans": "确定删除此连线?", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "deleteEdgeConfirmDesc": { + "zh-Hans": "删除后,该连线将被永久移除。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nodeLabel": { + "zh-Hans": "节点名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "NodoNombre", + "ru-RU": "УзелНазвание", + "th-TH": "โหนดชื่อ", + "vi-VN": "NútTên" + }, + "nodeLabelPlaceholder": { + "zh-Hans": "输入节点显示名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nodeId": { + "zh-Hans": "节点 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nodo ID", + "ru-RU": "Узел ID", + "th-TH": "โหนด ID", + "vi-VN": "Nút ID" + }, + "inputOutputVariables": { + "zh-Hans": "输入/输出变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada/SalidaVariable", + "ru-RU": "Вход/ВыходПеременная", + "th-TH": "อินพุต/เอาต์พุตตัวแปร", + "vi-VN": "Đầu vào/Đầu raBiến" + }, + "inputs": { + "zh-Hans": "输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada", + "ru-RU": "Вход", + "th-TH": "อินพุต", + "vi-VN": "Đầu vào" + }, + "outputs": { + "zh-Hans": "输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Salida", + "ru-RU": "Выход", + "th-TH": "เอาต์พุต", + "vi-VN": "Đầu ra" + }, + "availableVariables": { + "zh-Hans": "可用变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Variables disponibles", + "ru-RU": "Доступные переменные", + "th-TH": "ตัวแปรที่ใช้ได้", + "vi-VN": "Biến khả dụng" + }, + "globalVariables": { + "zh-Hans": "全局变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Variables globales", + "ru-RU": "Глобальные переменные", + "th-TH": "ตัวแปรส่วนกลาง", + "vi-VN": "Biến toàn cục" + }, + "messageContent": { + "zh-Hans": "模拟消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "messageSender": { + "zh-Hans": "发送者", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Remitente", + "ru-RU": "Отправитель", + "th-TH": "ผู้ส่ง", + "vi-VN": "Người gửi" + }, + "platform": { + "zh-Hans": "平台", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Plataforma", + "ru-RU": "Платформа", + "th-TH": "แพลตฟอร์ม", + "vi-VN": "Nền tảng" + }, + "sessionId": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "timestamp": { + "zh-Hans": "时间戳", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Marca de tiempo", + "ru-RU": "Временная метка", + "th-TH": "ประทับเวลา", + "vi-VN": "Dấu thời gian" + }, + "nodeConfig": { + "zh-Hans": "节点配置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "NodoConfiguración", + "ru-RU": "УзелКонфигурация", + "th-TH": "โหนดการกำหนดค่า", + "vi-VN": "NútCấu hình" + }, + "noConfigOptions": { + "zh-Hans": "该节点类型暂无配置选项", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "deleteNode": { + "zh-Hans": "删除节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EliminarNodo", + "ru-RU": "УдалитьУзел", + "th-TH": "ลบโหนด", + "vi-VN": "XóaNút" + }, + "deleteNodeConfirm": { + "zh-Hans": "确定删除此节点?", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "deleteNodeConfirmDesc": { + "zh-Hans": "删除后,该节点及其所有连线将被永久移除。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "input": { + "zh-Hans": "输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada", + "ru-RU": "Вход", + "th-TH": "อินพุต", + "vi-VN": "Đầu vào" + }, + "message": { + "zh-Hans": "消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Mensaje", + "ru-RU": "Сообщение", + "th-TH": "ข้อความ", + "vi-VN": "Tin nhắn" + }, + "text": { + "zh-Hans": "文本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Texto", + "ru-RU": "Текст", + "th-TH": "ข้อความ", + "vi-VN": "Văn bản" + }, + "query": { + "zh-Hans": "SQL查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "SQLConsulta", + "ru-RU": "SQLЗапрос", + "th-TH": "SQLสอบถาม", + "vi-VN": "SQLTruy vấn" + }, + "data": { + "zh-Hans": "数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Datos", + "ru-RU": "Данные", + "th-TH": "ข้อมูล", + "vi-VN": "Dữ liệu" + }, + "value": { + "zh-Hans": "值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Valor", + "ru-RU": "Значение", + "th-TH": "ค่า", + "vi-VN": "Giá trị" + }, + "content": { + "zh-Hans": "内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Contenido", + "ru-RU": "Содержимое", + "th-TH": "เนื้อหา", + "vi-VN": "Nội dung" + }, + "context": { + "zh-Hans": "调试上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "body": { + "zh-Hans": "请求体", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variables": { + "zh-Hans": "监控变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "items": { + "zh-Hans": "项目列表", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "arguments": { + "zh-Hans": "参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Parámetro", + "ru-RU": "Параметр", + "th-TH": "พารามิเตอร์", + "vi-VN": "Tham số" + }, + "question": { + "zh-Hans": "用户问题", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "UsuarioPregunta", + "ru-RU": "ПользовательВопрос", + "th-TH": "ผู้ใช้คำถาม", + "vi-VN": "Người dùngCâu hỏi" + }, + "parameters": { + "zh-Hans": "参数定义", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "key": { + "zh-Hans": "键", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Clave", + "ru-RU": "Ключ", + "th-TH": "คีย์", + "vi-VN": "Khóa" + }, + "payload": { + "zh-Hans": "载荷", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Carga útil", + "ru-RU": "Полезная нагрузка", + "th-TH": "เพย์โหลด", + "vi-VN": "Tải trọng" + }, + "input_value": { + "zh-Hans": "输入值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EntradaValor", + "ru-RU": "ВходЗначение", + "th-TH": "อินพุตค่า", + "vi-VN": "Đầu vàoGiá trị" + }, + "conversation_id": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "case_1": { + "zh-Hans": "分支 1", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Rama 1", + "ru-RU": "Ветвь 1", + "th-TH": "สาขา 1", + "vi-VN": "Nhánh 1" + }, + "case_2": { + "zh-Hans": "分支 2", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Rama 2", + "ru-RU": "Ветвь 2", + "th-TH": "สาขา 2", + "vi-VN": "Nhánh 2" + }, + "branch_1": { + "zh-Hans": "分支1输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "branch_2": { + "zh-Hans": "分支2输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "notification_id": { + "zh-Hans": "通知ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "NotificaciónID", + "ru-RU": "УведомлениеID", + "th-TH": "การแจ้งเตือนID", + "vi-VN": "Thông báoID" + }, + "key_template": { + "zh-Hans": "键模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Plantilla de clave", + "ru-RU": "Шаблон ключа", + "th-TH": "เทมเพลตคีย์", + "vi-VN": "Mẫu khóa" + }, + "hash_field": { + "zh-Hans": "哈希字段", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Campo hash", + "ru-RU": "Поле хеша", + "th-TH": "ฟิลด์แฮช", + "vi-VN": "Trường băm" + }, + "server_name": { + "zh-Hans": "服务器名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre del servidor", + "ru-RU": "Имя сервера", + "th-TH": "ชื่อเซิร์ฟเวอร์", + "vi-VN": "Tên máy chủ" + }, + "tool_name": { + "zh-Hans": "工具名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre de herramienta", + "ru-RU": "Имя инструмента", + "th-TH": "ชื่อเครื่องมือ", + "vi-VN": "Tên công cụ" + }, + "arguments_template": { + "zh-Hans": "参数模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Plantilla de parámetros", + "ru-RU": "Шаблон параметров", + "th-TH": "เทมเพลตพารามิเตอร์", + "vi-VN": "Mẫu tham số" + }, + "scope": { + "zh-Hans": "作用域", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ámbito", + "ru-RU": "Область", + "th-TH": "ขอบเขต", + "vi-VN": "Phạm vi" + }, + "output": { + "zh-Hans": "输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Salida", + "ru-RU": "Выход", + "th-TH": "เอาต์พุต", + "vi-VN": "Đầu ra" + }, + "response": { + "zh-Hans": "响应", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Respuesta", + "ru-RU": "Ответ", + "th-TH": "การตอบสนอง", + "vi-VN": "Phản hồi" + }, + "sender": { + "zh-Hans": "发送者", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Remitente", + "ru-RU": "Отправитель", + "th-TH": "ผู้ส่ง", + "vi-VN": "Người gửi" + }, + "sender_id": { + "zh-Hans": "发送者 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "sender_name": { + "zh-Hans": "发送者名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre del remitente", + "ru-RU": "Имя отправителя", + "th-TH": "ชื่อผู้ส่ง", + "vi-VN": "Tên người gửi" + }, + "cron_timestamp": { + "zh-Hans": "Cron 时间戳", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "cron_schedule": { + "zh-Hans": "Cron 调度表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cron Expresión de programación", + "ru-RU": "Cron Выражение расписания", + "th-TH": "Cron นิพจน์ตารางเวลา", + "vi-VN": "Cron Biểu thức lịch trình" + }, + "cron_context": { + "zh-Hans": "Cron 上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cron Contexto", + "ru-RU": "Cron Контекст", + "th-TH": "Cron บริบท", + "vi-VN": "Cron Ngữ cảnh" + }, + "trigger_time": { + "zh-Hans": "触发时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tiempo de activación", + "ru-RU": "Время триггера", + "th-TH": "เวลาทริกเกอร์", + "vi-VN": "Thời gian kích hoạt" + }, + "schedule": { + "zh-Hans": "触发计划", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Programación", + "ru-RU": "Расписание", + "th-TH": "ตารางเวลา", + "vi-VN": "Lịch trình" + }, + "headers": { + "zh-Hans": "请求头", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Encabezados", + "ru-RU": "Заголовки", + "th-TH": "ส่วนหัว", + "vi-VN": "Tiêu đề" + }, + "query_params": { + "zh-Hans": "查询参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Parámetros de consulta", + "ru-RU": "Параметры запроса", + "th-TH": "พารามิเตอร์คิวรี", + "vi-VN": "Tham số truy vấn" + }, + "method": { + "zh-Hans": "请求方法", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "is_group": { + "zh-Hans": "是否群聊", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Es chat grupal", + "ru-RU": "Групповой чат", + "th-TH": "เป็นแชทกลุ่ม", + "vi-VN": "Là chat nhóm" + }, + "event": { + "zh-Hans": "事件", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Evento", + "ru-RU": "Событие", + "th-TH": "เหตุการณ์", + "vi-VN": "Sự kiện" + }, + "event_type": { + "zh-Hans": "事件类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tipo de evento", + "ru-RU": "Тип события", + "th-TH": "ประเภทเหตุการณ์", + "vi-VN": "Loại sự kiện" + }, + "event_data": { + "zh-Hans": "事件数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EventoDatos", + "ru-RU": "СобытиеДанные", + "th-TH": "เหตุการณ์ข้อมูล", + "vi-VN": "Sự kiệnDữ liệu" + }, + "event_timestamp": { + "zh-Hans": "事件时间戳", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Marca de tiempo del evento", + "ru-RU": "Временная метка события", + "th-TH": "ประทับเวลาเหตุการณ์", + "vi-VN": "Dấu thời gian sự kiện" + }, + "usage": { + "zh-Hans": "Token使用统计", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "parsed": { + "zh-Hans": "解析结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Resultado analizado", + "ru-RU": "Результат разбора", + "th-TH": "ผลการแยกวิเคราะห์", + "vi-VN": "Kết quả phân tích" + }, + "category": { + "zh-Hans": "分类结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "confidence": { + "zh-Hans": "置信度", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Confianza", + "ru-RU": "Достоверность", + "th-TH": "ความเชื่อมั่น", + "vi-VN": "Độ tin cậy" + }, + "all_scores": { + "zh-Hans": "所有分数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Todas las puntuaciones", + "ru-RU": "Все оценки", + "th-TH": "คะแนนทั้งหมด", + "vi-VN": "Tất cả điểm số" + }, + "missing": { + "zh-Hans": "缺失参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "success": { + "zh-Hans": "是否成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "scores": { + "zh-Hans": "分数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Puntuaciones", + "ru-RU": "Оценки", + "th-TH": "คะแนน", + "vi-VN": "Điểm số" + }, + "chunks": { + "zh-Hans": "文本块", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "count": { + "zh-Hans": "数量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cantidad", + "ru-RU": "Количество", + "th-TH": "จำนวน", + "vi-VN": "Số lượng" + }, + "logs": { + "zh-Hans": "日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Registro", + "ru-RU": "Журнал", + "th-TH": "บันทึก", + "vi-VN": "Nhật ký" + }, + "embedding": { + "zh-Hans": "向量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Vector", + "ru-RU": "Вектор", + "th-TH": "เวกเตอร์", + "vi-VN": "Vector" + }, + "dimensions": { + "zh-Hans": "维度", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Dimensiones", + "ru-RU": "Размерности", + "th-TH": "มิติ", + "vi-VN": "Chiều" + }, + "intent": { + "zh-Hans": "意图", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Intención", + "ru-RU": "Намерение", + "th-TH": "เจตนา", + "vi-VN": "Ý định" + }, + "entities": { + "zh-Hans": "实体", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entidades", + "ru-RU": "Сущности", + "th-TH": "เอนทิตี", + "vi-VN": "Thực thể" + }, + "prompt": { + "zh-Hans": "提示/问题", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "context_info": { + "zh-Hans": "上下文信息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Información de contexto", + "ru-RU": "Контекстная информация", + "th-TH": "ข้อมูลบริบท", + "vi-VN": "Thông tin ngữ cảnh" + }, + "console": { + "zh-Hans": "控制台输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "code_input": { + "zh-Hans": "代码输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada de código", + "ru-RU": "Ввод кода", + "th-TH": "อินพุตโค้ด", + "vi-VN": "Đầu vào mã" + }, + "code_output": { + "zh-Hans": "代码输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Salida de código", + "ru-RU": "Вывод кода", + "th-TH": "เอาต์พุตโค้ด", + "vi-VN": "Đầu ra mã" + }, + "http_body": { + "zh-Hans": "HTTP 请求体", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "http_headers": { + "zh-Hans": "HTTP 请求头", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "http_response": { + "zh-Hans": "HTTP 响应", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "HTTP Respuesta", + "ru-RU": "HTTP Ответ", + "th-TH": "HTTP การตอบสนอง", + "vi-VN": "HTTP Phản hồi" + }, + "response_headers": { + "zh-Hans": "响应头", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Encabezados de respuesta", + "ru-RU": "Заголовки ответа", + "th-TH": "ส่วนหัวการตอบสนอง", + "vi-VN": "Tiêu đề phản hồi" + }, + "transform_input": { + "zh-Hans": "转换输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada de transformación", + "ru-RU": "Ввод преобразования", + "th-TH": "อินพุตการแปลง", + "vi-VN": "Đầu vào chuyển đổi" + }, + "transform_result": { + "zh-Hans": "转换结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Resultado de transformación", + "ru-RU": "Результат преобразования", + "th-TH": "ผลลัพธ์การแปลง", + "vi-VN": "Kết quả chuyển đổi" + }, + "extraction_success": { + "zh-Hans": "提取成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Extracción exitosa", + "ru-RU": "Извлечение успешно", + "th-TH": "แยกสำเร็จ", + "vi-VN": "Trích xuất thành công" + }, + "extract_text": { + "zh-Hans": "输入文本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "documents": { + "zh-Hans": "检索的文档", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "citations": { + "zh-Hans": "引用信息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "knowledge_context": { + "zh-Hans": "合并上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "knowledge_query": { + "zh-Hans": "检索查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "RecuperaciónConsulta", + "ru-RU": "ПоискЗапрос", + "th-TH": "ค้นหาสอบถาม", + "vi-VN": "Truy xuấtTruy vấn" + }, + "true": { + "zh-Hans": "条件为真输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "false": { + "zh-Hans": "条件为假输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "matched_case": { + "zh-Hans": "匹配分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "default": { + "zh-Hans": "默认分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "PredeterminadoRama", + "ru-RU": "По умолчаниюВетвь", + "th-TH": "ค่าเริ่มต้นสาขา", + "vi-VN": "Mặc địnhNhánh" + }, + "item": { + "zh-Hans": "当前项", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Elemento actual", + "ru-RU": "Текущий элемент", + "th-TH": "รายการปัจจุบัน", + "vi-VN": "Mục hiện tại" + }, + "index": { + "zh-Hans": "当前索引", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Índice actual", + "ru-RU": "Текущий индекс", + "th-TH": "ดัชนีปัจจุบัน", + "vi-VN": "Chỉ số hiện tại" + }, + "completed": { + "zh-Hans": "已完成", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Completado", + "ru-RU": "Завершено", + "th-TH": "เสร็จสมบูรณ์", + "vi-VN": "Đã hoàn thành" + }, + "is_first": { + "zh-Hans": "是否第一个", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "¿Es el primero?", + "ru-RU": "Это первый?", + "th-TH": "เป็นตัวแรกหรือไม่?", + "vi-VN": "Có phải đầu tiên không?" + }, + "is_last": { + "zh-Hans": "是否最后一个", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "¿Es el último?", + "ru-RU": "Это последний?", + "th-TH": "เป็นตัวสุดท้ายหรือไม่?", + "vi-VN": "Có phải cuối cùng không?" + }, + "results": { + "zh-Hans": "结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Resultado", + "ru-RU": "Результат", + "th-TH": "ผลลัพธ์", + "vi-VN": "Kết quả" + }, + "condition_input": { + "zh-Hans": "条件输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "CondiciónEntrada", + "ru-RU": "УсловиеВход", + "th-TH": "เงื่อนไขอินพุต", + "vi-VN": "Điều kiệnĐầu vào" + }, + "switch_input": { + "zh-Hans": "开关输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "loop_items": { + "zh-Hans": "迭代项目", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Elementos de iteración", + "ru-RU": "Элементы итерации", + "th-TH": "รายการวนซ้ำ", + "vi-VN": "Các mục lặp" + }, + "iterator_array": { + "zh-Hans": "输入数组", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "iterator_item": { + "zh-Hans": "当前元素", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Elemento actual", + "ru-RU": "Текущий элемент", + "th-TH": "องค์ประกอบปัจจุบัน", + "vi-VN": "Phần tử hiện tại" + }, + "iterator_index": { + "zh-Hans": "当前索引", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Índice actual", + "ru-RU": "Текущий индекс", + "th-TH": "ดัชนีปัจจุบัน", + "vi-VN": "Chỉ số hiện tại" + }, + "errors": { + "zh-Hans": "错误列表", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ErrorLista", + "ru-RU": "ОшибкаСписок", + "th-TH": "ข้อผิดพลาดรายการ", + "vi-VN": "LỗiDanh sách" + }, + "parallel_input": { + "zh-Hans": "并行输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada paralela", + "ru-RU": "Параллельный ввод", + "th-TH": "อินพุตขนาน", + "vi-VN": "Đầu vào song song" + }, + "parallel_results": { + "zh-Hans": "所有分支结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "wait_input": { + "zh-Hans": "透传输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "wait_output": { + "zh-Hans": "透传输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "merged": { + "zh-Hans": "合并结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "merge_array": { + "zh-Hans": "数组结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "merge_input_1": { + "zh-Hans": "输入 1", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada 1", + "ru-RU": "Вход 1", + "th-TH": "อินพุต 1", + "vi-VN": "Đầu vào 1" + }, + "merge_input_2": { + "zh-Hans": "输入 2", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada 2", + "ru-RU": "Вход 2", + "th-TH": "อินพุต 2", + "vi-VN": "Đầu vào 2" + }, + "merge_input_3": { + "zh-Hans": "输入 3", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada 3", + "ru-RU": "Вход 3", + "th-TH": "อินพุต 3", + "vi-VN": "Đầu vào 3" + }, + "merge_input_4": { + "zh-Hans": "输入 4", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Entrada 4", + "ru-RU": "Вход 4", + "th-TH": "อินพุต 4", + "vi-VN": "Đầu vào 4" + }, + "aggregated": { + "zh-Hans": "聚合变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Variables agregadas", + "ru-RU": "Агрегированные переменные", + "th-TH": "ตัวแปรที่รวม", + "vi-VN": "Biến tổng hợp" + }, + "aggregator_variables": { + "zh-Hans": "变量输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "VariableEntrada", + "ru-RU": "ПеременнаяВход", + "th-TH": "ตัวแปรอินพุต", + "vi-VN": "BiếnĐầu vào" + }, + "message_id": { + "zh-Hans": "消息ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "MensajeID", + "ru-RU": "СообщениеID", + "th-TH": "ข้อความID", + "vi-VN": "Tin nhắnID" + }, + "status_code": { + "zh-Hans": "状态码", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Código de estado", + "ru-RU": "Код состояния", + "th-TH": "รหัสสถานะ", + "vi-VN": "Mã trạng thái" + }, + "execution_id": { + "zh-Hans": "执行ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EjecutarID", + "ru-RU": "ВыполнитьID", + "th-TH": "ดำเนินการID", + "vi-VN": "Thực thiID" + }, + "target": { + "zh-Hans": "目标 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ID de destino", + "ru-RU": "ID цели", + "th-TH": "ID เป้าหมาย", + "vi-VN": "ID đích" + }, + "reply_message": { + "zh-Hans": "回复内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "pipeline_response": { + "zh-Hans": "Pipeline 响应", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pipeline Respuesta", + "ru-RU": "Pipeline Ответ", + "th-TH": "Pipeline การตอบสนอง", + "vi-VN": "Pipeline Phản hồi" + }, + "pipeline_result": { + "zh-Hans": "完整结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "pipeline_query": { + "zh-Hans": "查询内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "context_data": { + "zh-Hans": "上下文数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "store_status": { + "zh-Hans": "存储状态", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "AlmacenarEstado", + "ru-RU": "ХранитьСтатус", + "th-TH": "จัดเก็บสถานะ", + "vi-VN": "Lưu trữTrạng thái" + }, + "store_key": { + "zh-Hans": "存储键", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "store_value": { + "zh-Hans": "存储值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variable_value": { + "zh-Hans": "变量值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "VariableValor", + "ru-RU": "ПеременнаяЗначение", + "th-TH": "ตัวแปรค่า", + "vi-VN": "BiếnGiá trị" + }, + "variable_result": { + "zh-Hans": "设置变量结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "statement": { + "zh-Hans": "开场白", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Declaración de Apertura", + "ru-RU": "Вступительное Заявление", + "th-TH": "คำกล่าวเปิด", + "vi-VN": "Tuyên bố Mở đầu" + }, + "suggested_questions": { + "zh-Hans": "建议问题", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "suggestions": { + "zh-Hans": "建议问题", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "workflow_output": { + "zh-Hans": "工作流输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de TrabajoSalida", + "ru-RU": "Рабочий ПроцессВыход", + "th-TH": "เวิร์กโฟลว์เอาต์พุต", + "vi-VN": "Quy trìnhĐầu ra" + }, + "final_result": { + "zh-Hans": "最终结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "query_results": { + "zh-Hans": "查询结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "row_count": { + "zh-Hans": "行数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Número de filas", + "ru-RU": "Количество строк", + "th-TH": "จำนวนแถว", + "vi-VN": "Số hàng" + }, + "query_success": { + "zh-Hans": "查询成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "redis_result": { + "zh-Hans": "Redis结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "RedisResultado", + "ru-RU": "RedisРезультат", + "th-TH": "Redisผลลัพธ์", + "vi-VN": "RedisKết quả" + }, + "redis_success": { + "zh-Hans": "Redis成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "RedisÉxito", + "ru-RU": "RedisУспех", + "th-TH": "Redisสำเร็จ", + "vi-VN": "RedisThành công" + }, + "redis_key": { + "zh-Hans": "Redis 键", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Redis Clave", + "ru-RU": "Redis Ключ", + "th-TH": "Redis คีย์", + "vi-VN": "Redis Khóa" + }, + "redis_value": { + "zh-Hans": "Redis 值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Redis Valor", + "ru-RU": "Redis Значение", + "th-TH": "Redis ค่า", + "vi-VN": "Redis Giá trị" + }, + "plugin_input": { + "zh-Hans": "插件输入", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "tool_result": { + "zh-Hans": "工具结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "tool_success": { + "zh-Hans": "工具成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "mcp_arguments": { + "zh-Hans": "工具参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "memory_result": { + "zh-Hans": "记忆结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "memory_success": { + "zh-Hans": "记忆成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "memory_value": { + "zh-Hans": "存储值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "answer": { + "zh-Hans": "答案", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Respuesta", + "ru-RU": "Ответ", + "th-TH": "คำตอบ", + "vi-VN": "Câu trả lời" + }, + "dify_success": { + "zh-Hans": "Dify成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "DifyÉxito", + "ru-RU": "DifyУспех", + "th-TH": "Difyสำเร็จ", + "vi-VN": "DifyThành công" + }, + "dify_query": { + "zh-Hans": "用户输入/查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "dify_conversation_id": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "search_results": { + "zh-Hans": "搜索结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "knowledge_base_query": { + "zh-Hans": "查询内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "n8n_result": { + "zh-Hans": "N8n结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "N8nResultado", + "ru-RU": "N8nРезультат", + "th-TH": "N8nผลลัพธ์", + "vi-VN": "N8nKết quả" + }, + "n8n_success": { + "zh-Hans": "N8n成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "N8nÉxito", + "ru-RU": "N8nУспех", + "th-TH": "N8nสำเร็จ", + "vi-VN": "N8nThành công" + }, + "n8n_payload": { + "zh-Hans": "工作流输入数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "flow_result": { + "zh-Hans": "流程结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "flow_success": { + "zh-Hans": "流程成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "langflow_input": { + "zh-Hans": "输入内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "bot_answer": { + "zh-Hans": "机器人回复", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "bot_success": { + "zh-Hans": "机器人成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "coze_query": { + "zh-Hans": "用户输入/查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "coze_conversation_id": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "bot_conversation_id": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "webhook_body": { + "zh-Hans": "Webhook 请求体", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "webhook_headers": { + "zh-Hans": "Webhook 请求头", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "webhook_query": { + "zh-Hans": "Webhook 查询参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "webhook_method": { + "zh-Hans": "Webhook 请求方法", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "save": { + "zh-Hans": "保存", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Guardar", + "ru-RU": "Сохранить", + "th-TH": "บันทึก", + "vi-VN": "Lưu" + }, + "undo": { + "zh-Hans": "撤销", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Deshacer", + "ru-RU": "Отменить", + "th-TH": "เลิกทำ", + "vi-VN": "Hoàn tác" + }, + "redo": { + "zh-Hans": "重做", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Rehacer", + "ru-RU": "Повторить", + "th-TH": "ทำซ้ำ", + "vi-VN": "Làm lại" + }, + "edgeCondition": { + "zh-Hans": "条件表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "edgeConditionPlaceholder": { + "zh-Hans": "如: ${output.success} == true", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ej: ${output.success} == true", + "ru-RU": "Напр: ${output.success} == true", + "th-TH": "เช่น: ${output.success} == true", + "vi-VN": "VD: ${output.success} == true" + }, + "noNodeSelected": { + "zh-Hans": "未选中节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "selectNodeToEdit": { + "zh-Hans": "点击节点查看和编辑属性", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "dragNodeHint": { + "zh-Hans": "拖拽节点到画布", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "trigger": { + "zh-Hans": "触发器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Disparador", + "ru-RU": "Триггер", + "th-TH": "ทริกเกอร์", + "vi-VN": "Trình kích hoạt" + }, + "triggerDescription": { + "zh-Hans": "工作流的起始节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "messageTrigger": { + "zh-Hans": "消息触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "messageTriggerDescription": { + "zh-Hans": "当收到消息时触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "scheduleTrigger": { + "zh-Hans": "定时触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "scheduleTriggerDescription": { + "zh-Hans": "按计划定时触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "cronTrigger": { + "zh-Hans": "定时触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "cronTriggerDescription": { + "zh-Hans": "按定时计划触发工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "webhookTrigger": { + "zh-Hans": "Webhook 触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Activador Webhook", + "ru-RU": "Триггер Webhook", + "th-TH": "ทริกเกอร์ Webhook", + "vi-VN": "Kích hoạt Webhook" + }, + "webhookTriggerDescription": { + "zh-Hans": "通过 HTTP 请求触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "eventTrigger": { + "zh-Hans": "事件触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "eventTriggerDescription": { + "zh-Hans": "当系统事件发生时触发", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "process": { + "zh-Hans": "AI/处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "IA/Procesamiento", + "ru-RU": "ИИ/Обработка", + "th-TH": "AI/การประมวลผล", + "vi-VN": "AI/Xử lý" + }, + "processDescription": { + "zh-Hans": "数据处理节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "aiProcess": { + "zh-Hans": "AI 处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Procesamiento IA", + "ru-RU": "Обработка ИИ", + "th-TH": "การประมวลผล AI", + "vi-VN": "Xử lý AI" + }, + "aiProcessDescription": { + "zh-Hans": "使用 AI 模型处理消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "llmCall": { + "zh-Hans": "LLM 调用", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "LLM Llamar", + "ru-RU": "LLM Вызвать", + "th-TH": "LLM เรียกใช้", + "vi-VN": "LLM Gọi" + }, + "llmCallDescription": { + "zh-Hans": "调用大语言模型进行对话或生成", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "codeProcess": { + "zh-Hans": "代码处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "codeProcessDescription": { + "zh-Hans": "执行自定义代码", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "codeExecutor": { + "zh-Hans": "代码执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "codeExecutorDescription": { + "zh-Hans": "执行 Python/JavaScript 代码", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "templateProcess": { + "zh-Hans": "模板处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Procesamiento de plantilla", + "ru-RU": "Обработка шаблона", + "th-TH": "การประมวลผลเทมเพลต", + "vi-VN": "Xử lý mẫu" + }, + "templateProcessDescription": { + "zh-Hans": "使用模板格式化输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "httpRequest": { + "zh-Hans": "HTTP 请求", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "httpRequestDescription": { + "zh-Hans": "发送 HTTP 请求", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "dataTransform": { + "zh-Hans": "数据转换", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "DatosTransformar", + "ru-RU": "ДанныеПреобразовать", + "th-TH": "ข้อมูลแปลง", + "vi-VN": "Dữ liệuChuyển đổi" + }, + "dataTransformDescription": { + "zh-Hans": "转换数据格式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TransformarDatosFormato", + "ru-RU": "ПреобразоватьДанныеФормат", + "th-TH": "แปลงข้อมูลรูปแบบ", + "vi-VN": "Chuyển đổiDữ liệuĐịnh dạng" + }, + "questionClassifier": { + "zh-Hans": "问题分类器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "PreguntaClasificador", + "ru-RU": "ВопросКлассификатор", + "th-TH": "คำถามตัวจำแนก", + "vi-VN": "Câu hỏiBộ phân loại" + }, + "questionClassifierDescription": { + "zh-Hans": "使用 LLM 将用户问题分类到预定义类别", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "parameterExtractor": { + "zh-Hans": "参数提取器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "parameterExtractorDescription": { + "zh-Hans": "使用 LLM 从文本中提取结构化参数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "knowledgeRetrieval": { + "zh-Hans": "知识库检索", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "knowledgeRetrievalDescription": { + "zh-Hans": "从知识库中检索相关内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "textTemplate": { + "zh-Hans": "文本模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "textTemplateDescription": { + "zh-Hans": "使用模板生成文本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "jsonTransform": { + "zh-Hans": "JSON 转换", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "JSON Transformar", + "ru-RU": "JSON Преобразовать", + "th-TH": "JSON แปลง", + "vi-VN": "JSON Chuyển đổi" + }, + "jsonTransformDescription": { + "zh-Hans": "转换 JSON 数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Transformar JSON Datos", + "ru-RU": "Преобразовать JSON Данные", + "th-TH": "แปลง JSON ข้อมูล", + "vi-VN": "Chuyển đổi JSON Dữ liệu" + }, + "dataAggregator": { + "zh-Hans": "数据聚合", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "dataAggregatorDescription": { + "zh-Hans": "聚合多个数据源", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "textSplitter": { + "zh-Hans": "文本分割", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "textSplitterDescription": { + "zh-Hans": "将文本分割成块", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableAssignment": { + "zh-Hans": "变量赋值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableAssignmentDescription": { + "zh-Hans": "为工作流变量赋值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "control": { + "zh-Hans": "控制流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo de control", + "ru-RU": "Поток управления", + "th-TH": "การควบคุมโฟลว์", + "vi-VN": "Luồng điều khiển" + }, + "controlDescription": { + "zh-Hans": "流程控制节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "conditionDescription": { + "zh-Hans": "根据条件分流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "switch": { + "zh-Hans": "多路分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "switchDescription": { + "zh-Hans": "多条件分支选择", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "loop": { + "zh-Hans": "循环", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Bucle", + "ru-RU": "Цикл", + "th-TH": "วนซ้ำ", + "vi-VN": "Vòng lặp" + }, + "loopDescription": { + "zh-Hans": "重复执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "iterator": { + "zh-Hans": "迭代器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Iterador", + "ru-RU": "Итератор", + "th-TH": "ตัววนซ้ำ", + "vi-VN": "Bộ lặp" + }, + "iteratorDescription": { + "zh-Hans": "遍历数组元素", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "parallel": { + "zh-Hans": "并行处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "parallelDescription": { + "zh-Hans": "并行执行多个分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "wait": { + "zh-Hans": "等待", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Esperar", + "ru-RU": "Ожидание", + "th-TH": "รอ", + "vi-VN": "Chờ" + }, + "waitDescription": { + "zh-Hans": "等待指定时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "delay": { + "zh-Hans": "延迟", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Retraso", + "ru-RU": "Задержка", + "th-TH": "ความล่าช้า", + "vi-VN": "Trì hoãn" + }, + "delayDescription": { + "zh-Hans": "等待指定时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "merge": { + "zh-Hans": "合并", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Fusionar", + "ru-RU": "Объединить", + "th-TH": "รวม", + "vi-VN": "Hợp nhất" + }, + "mergeDescription": { + "zh-Hans": "合并多个分支", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableAggregator": { + "zh-Hans": "变量聚合器", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableAggregatorDescription": { + "zh-Hans": "聚合多个分支的变量输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "action": { + "zh-Hans": "动作", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Acción", + "ru-RU": "Действие", + "th-TH": "การดำเนินการ", + "vi-VN": "Hành động" + }, + "actionDescription": { + "zh-Hans": "执行动作的节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "sendMessage": { + "zh-Hans": "发送消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EnviarMensaje", + "ru-RU": "ОтправитьСообщение", + "th-TH": "ส่งข้อความ", + "vi-VN": "GửiTin nhắn" + }, + "sendMessageDescription": { + "zh-Hans": "发送消息到平台", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "replyMessage": { + "zh-Hans": "回复消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "replyMessageDescription": { + "zh-Hans": "回复触发工作流的消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "storeData": { + "zh-Hans": "存储数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "AlmacenarDatos", + "ru-RU": "ХранитьДанные", + "th-TH": "จัดเก็บข้อมูล", + "vi-VN": "Lưu trữDữ liệu" + }, + "storeDataDescription": { + "zh-Hans": "存储数据到数据库", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "callPipeline": { + "zh-Hans": "调用 Pipeline", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Llamar Pipeline", + "ru-RU": "Вызвать Pipeline", + "th-TH": "เรียกใช้ Pipeline", + "vi-VN": "Gọi Pipeline" + }, + "callPipelineDescription": { + "zh-Hans": "调用现有的 Pipeline", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "setVariable": { + "zh-Hans": "设置变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "setVariableDescription": { + "zh-Hans": "设置上下文变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "openingStatement": { + "zh-Hans": "对话开场白", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "openingStatementDescription": { + "zh-Hans": "提供对话开场白和建议问题", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "end": { + "zh-Hans": "结束", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Fin", + "ru-RU": "Конец", + "th-TH": "สิ้นสุด", + "vi-VN": "Kết thúc" + }, + "endDescription": { + "zh-Hans": "标记工作流执行结束", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "log": { + "zh-Hans": "日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Registro", + "ru-RU": "Журнал", + "th-TH": "บันทึก", + "vi-VN": "Nhật ký" + }, + "logDescription": { + "zh-Hans": "记录日志信息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "integration": { + "zh-Hans": "集成", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Integración", + "ru-RU": "Интеграция", + "th-TH": "การผสานรวม", + "vi-VN": "Tích hợp" + }, + "integrationDescription": { + "zh-Hans": "第三方平台集成节点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "difyWorkflow": { + "zh-Hans": "Dify 工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Dify Flujo de Trabajo", + "ru-RU": "Dify Рабочий Процесс", + "th-TH": "Dify เวิร์กโฟลว์", + "vi-VN": "Dify Quy trình" + }, + "difyWorkflowDescription": { + "zh-Hans": "调用 Dify 平台工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "difyKnowledgeQuery": { + "zh-Hans": "Dify 知识库", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "difyKnowledgeQueryDescription": { + "zh-Hans": "查询 Dify 知识库", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "n8nWorkflow": { + "zh-Hans": "n8n 工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "n8n Flujo de Trabajo", + "ru-RU": "n8n Рабочий Процесс", + "th-TH": "n8n เวิร์กโฟลว์", + "vi-VN": "n8n Quy trình" + }, + "n8nWorkflowDescription": { + "zh-Hans": "调用 n8n 工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "langflowFlow": { + "zh-Hans": "Langflow 流程", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Flujo Langflow", + "ru-RU": "Поток Langflow", + "th-TH": "โฟลว์ Langflow", + "vi-VN": "Luồng Langflow" + }, + "langflowFlowDescription": { + "zh-Hans": "调用 Langflow 流程", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "cozeBot": { + "zh-Hans": "Coze Bot", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Bot Coze", + "ru-RU": "Бот Coze", + "th-TH": "บอท Coze", + "vi-VN": "Bot Coze" + }, + "cozeBotDescription": { + "zh-Hans": "调用扣子 Bot", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "databaseQuery": { + "zh-Hans": "数据库查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Base de DatosConsulta", + "ru-RU": "База ДанныхЗапрос", + "th-TH": "ฐานข้อมูลสอบถาม", + "vi-VN": "Cơ sở dữ liệuTruy vấn" + }, + "databaseQueryDescription": { + "zh-Hans": "执行数据库查询", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "redisOperation": { + "zh-Hans": "Redis 操作", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Redis Operación", + "ru-RU": "Redis Операция", + "th-TH": "Redis การดำเนินการ", + "vi-VN": "Redis Thao tác" + }, + "redisOperationDescription": { + "zh-Hans": "执行 Redis 缓存操作", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "mcpTool": { + "zh-Hans": "MCP 工具", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "MCP Herramienta", + "ru-RU": "MCP Инструмент", + "th-TH": "MCP เครื่องมือ", + "vi-VN": "MCP Công cụ" + }, + "mcpToolDescription": { + "zh-Hans": "调用 MCP 工具", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Llamar MCP Herramienta", + "ru-RU": "Вызвать MCP Инструмент", + "th-TH": "เรียกใช้ MCP เครื่องมือ", + "vi-VN": "Gọi MCP Công cụ" + }, + "memoryStore": { + "zh-Hans": "记忆存储", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "memoryStoreDescription": { + "zh-Hans": "从工作流记忆中存储和检索数据", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "startTime": { + "zh-Hans": "开始时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Hora de inicio", + "ru-RU": "Время начала", + "th-TH": "เวลาเริ่มต้น", + "vi-VN": "Thời gian bắt đầu" + }, + "running": { + "zh-Hans": "执行中", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "failed": { + "zh-Hans": "失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "falló", + "ru-RU": "не удалось", + "th-TH": "ล้มเหลว", + "vi-VN": "thất bại" + }, + "cancelled": { + "zh-Hans": "已取消", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cancelado", + "ru-RU": "Отменено", + "th-TH": "ยกเลิกแล้ว", + "vi-VN": "Đã hủy" + }, + "viewDetails": { + "zh-Hans": "查看详情", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ver detalles", + "ru-RU": "Просмотр деталей", + "th-TH": "ดูรายละเอียด", + "vi-VN": "Xem chi tiết" + }, + "cancel": { + "zh-Hans": "取消执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "CancelarEjecutar", + "ru-RU": "ОтменаВыполнить", + "th-TH": "ยกเลิกดำเนินการ", + "vi-VN": "HủyThực thi" + }, + "retry": { + "zh-Hans": "重试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Reintentar", + "ru-RU": "Повторить", + "th-TH": "ลองใหม่", + "vi-VN": "Thử lại" + }, + "nodeResults": { + "zh-Hans": "节点执行结果", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "current": { + "zh-Hans": "当前版本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "rollback": { + "zh-Hans": "回滚到此版本", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "rollbackConfirm": { + "zh-Hans": "确定回滚到此版本?当前更改将丢失。", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "rollbackSuccess": { + "zh-Hans": "回滚成功", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "rollbackError": { + "zh-Hans": "回滚失败:", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "mode": { + "zh-Hans": "调试模式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "panel": { + "zh-Hans": "调试面板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "start": { + "zh-Hans": "开始调试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "InicioDepurar", + "ru-RU": "НачалоОтладка", + "th-TH": "เริ่มต้นดีบัก", + "vi-VN": "Bắt đầuGỡ lỗi" + }, + "pause": { + "zh-Hans": "暂停", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pausar", + "ru-RU": "Приостановить", + "th-TH": "หยุดชั่วคราว", + "vi-VN": "Tạm dừng" + }, + "resume": { + "zh-Hans": "继续", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Continuar", + "ru-RU": "Продолжить", + "th-TH": "ดำเนินการต่อ", + "vi-VN": "Tiếp tục" + }, + "step": { + "zh-Hans": "单步执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stop": { + "zh-Hans": "停止", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Detener", + "ru-RU": "Остановить", + "th-TH": "หยุด", + "vi-VN": "Dừng" + }, + "messageContentPlaceholder": { + "zh-Hans": "输入要模拟的消息内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "senderId": { + "zh-Hans": "发送者 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "senderIdPlaceholder": { + "zh-Hans": "发送者唯一标识", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "senderName": { + "zh-Hans": "发送者名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Nombre del remitente", + "ru-RU": "Имя отправителя", + "th-TH": "ชื่อผู้ส่ง", + "vi-VN": "Tên người gửi" + }, + "senderNamePlaceholder": { + "zh-Hans": "发送者显示名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "platformPlaceholder": { + "zh-Hans": "例如 qq、wechat、telegram", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ej: qq, wechat, telegram", + "ru-RU": "Напр: qq, wechat, telegram", + "th-TH": "เช่น qq, wechat, telegram", + "vi-VN": "VD: qq, wechat, telegram" + }, + "conversationId": { + "zh-Hans": "会话 ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Sesión ID", + "ru-RU": "Сессия ID", + "th-TH": "เซสชัน ID", + "vi-VN": "Phiên ID" + }, + "conversationIdPlaceholder": { + "zh-Hans": "会话唯一标识", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "isGroup": { + "zh-Hans": "群聊", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Chat grupal", + "ru-RU": "Групповой чат", + "th-TH": "แชทกลุ่ม", + "vi-VN": "Chat nhóm" + }, + "customVariables": { + "zh-Hans": "自定义变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "customVariablesDesc": { + "zh-Hans": "添加自定义变量用于调试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableKey": { + "zh-Hans": "变量名", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableValue": { + "zh-Hans": "变量值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "VariableValor", + "ru-RU": "ПеременнаяЗначение", + "th-TH": "ตัวแปรค่า", + "vi-VN": "BiếnGiá trị" + }, + "addVariable": { + "zh-Hans": "添加变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "AgregarVariable", + "ru-RU": "ДобавитьПеременная", + "th-TH": "เพิ่มตัวแปร", + "vi-VN": "ThêmBiến" + }, + "watchedVariables": { + "zh-Hans": "监控变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "noWatchedVariables": { + "zh-Hans": "暂无监控变量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "addWatchVariable": { + "zh-Hans": "添加监控", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nodeStates": { + "zh-Hans": "节点状态", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "nodeOutputs": { + "zh-Hans": "节点输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "NodoSalida", + "ru-RU": "УзелВыход", + "th-TH": "โหนดเอาต์พุต", + "vi-VN": "NútĐầu ra" + }, + "noNodeOutputs": { + "zh-Hans": "暂无节点输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "toggleBreakpoint": { + "zh-Hans": "切换断点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "clearBreakpoints": { + "zh-Hans": "清除所有断点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Limpiar todos los puntos de interrupción", + "ru-RU": "Очистить все точки останова", + "th-TH": "ล้างเบรกพอยต์ทั้งหมด", + "vi-VN": "Xóa tất cả điểm dừng" + }, + "breakpointSet": { + "zh-Hans": "断点已设置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "breakpointRemoved": { + "zh-Hans": "断点已移除", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Punto de interrupción eliminado", + "ru-RU": "Точка останова удалена", + "th-TH": "ลบเบรกพอยต์แล้ว", + "vi-VN": "Đã xóa điểm dừng" + }, + "noLogs": { + "zh-Hans": "暂无日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "clearLogs": { + "zh-Hans": "清空日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "autoScroll": { + "zh-Hans": "自动滚动", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Desplazamiento automático", + "ru-RU": "Автопрокрутка", + "th-TH": "เลื่อนอัตโนมัติ", + "vi-VN": "Tự động cuộn" + }, + "logEntries": { + "zh-Hans": "条日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "resetContext": { + "zh-Hans": "重置上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "starting": { + "zh-Hans": "正在启动调试执行...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "started": { + "zh-Hans": "调试执行已启动 (ID: {{id}})", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "startError": { + "zh-Hans": "启动调试失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "unknownError": { + "zh-Hans": "未知错误", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "paused": { + "zh-Hans": "已暂停", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "pauseError": { + "zh-Hans": "暂停失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pausarfalló", + "ru-RU": "Приостановитьне удалось", + "th-TH": "หยุดชั่วคราวล้มเหลว", + "vi-VN": "Tạm dừngthất bại" + }, + "resumed": { + "zh-Hans": "执行已恢复", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "resumeError": { + "zh-Hans": "恢复失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "steppedTo": { + "zh-Hans": "已执行到节点: {{node}}", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stepError": { + "zh-Hans": "单步执行失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stopped": { + "zh-Hans": "调试已停止", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stopError": { + "zh-Hans": "停止失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Detenerfalló", + "ru-RU": "Остановитьне удалось", + "th-TH": "หยุดล้มเหลว", + "vi-VN": "Dừngthất bại" + }, + "debugMode": { + "zh-Hans": "调试模式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "debugPanel": { + "zh-Hans": "调试面板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "startDebug": { + "zh-Hans": "开始调试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "InicioDepurar", + "ru-RU": "НачалоОтладка", + "th-TH": "เริ่มต้นดีบัก", + "vi-VN": "Bắt đầuGỡ lỗi" + }, + "pauseDebug": { + "zh-Hans": "暂停", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pausar", + "ru-RU": "Приостановить", + "th-TH": "หยุดชั่วคราว", + "vi-VN": "Tạm dừng" + }, + "resumeDebug": { + "zh-Hans": "继续", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Continuar", + "ru-RU": "Продолжить", + "th-TH": "ดำเนินการต่อ", + "vi-VN": "Tiếp tục" + }, + "stepDebug": { + "zh-Hans": "单步执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stopDebug": { + "zh-Hans": "停止", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Detener", + "ru-RU": "Остановить", + "th-TH": "หยุด", + "vi-VN": "Dừng" + }, + "debugContext": { + "zh-Hans": "调试上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "simulatedMessage": { + "zh-Hans": "模拟消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "simulatedMessagePlaceholder": { + "zh-Hans": "输入要模拟的消息内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variableName": { + "zh-Hans": "变量名", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "breakpoints": { + "zh-Hans": "断点", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Puntos de interrupción", + "ru-RU": "Точки останова", + "th-TH": "เบรกพอยต์", + "vi-VN": "Điểm dừng" + }, + "debugLogs": { + "zh-Hans": "调试日志", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "idle": { + "zh-Hans": "空闲", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Inactivo", + "ru-RU": "Простой", + "th-TH": "ว่าง", + "vi-VN": "Nhàn rỗi" + }, + "pending": { + "zh-Hans": "等待中", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "skipped": { + "zh-Hans": "已跳过", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "selectWorkflow": { + "zh-Hans": "选择工作流", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "SeleccionarFlujo de Trabajo", + "ru-RU": "ВыбратьРабочий Процесс", + "th-TH": "เลือกเวิร์กโฟลว์", + "vi-VN": "ChọnQuy trình" + }, + "sessionType": { + "zh-Hans": "会话类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "privateChat": { + "zh-Hans": "私聊", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Chat privado", + "ru-RU": "Личный чат", + "th-TH": "แชทส่วนตัว", + "vi-VN": "Chat riêng" + }, + "groupChat": { + "zh-Hans": "群聊", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Chat grupal", + "ru-RU": "Групповой чат", + "th-TH": "แชทกลุ่ม", + "vi-VN": "Chat nhóm" + }, + "send": { + "zh-Hans": "发送", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Enviar", + "ru-RU": "Отправить", + "th-TH": "ส่ง", + "vi-VN": "Gửi" + }, + "reset": { + "zh-Hans": "重置对话", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "inputPlaceholder": { + "zh-Hans": "发送 {{type}} 消息...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Enviar {{type}} Mensaje...", + "ru-RU": "Отправить {{type}} Сообщение...", + "th-TH": "ส่ง {{type}} ข้อความ...", + "vi-VN": "Gửi {{type}} Tin nhắn..." + }, + "noMessages": { + "zh-Hans": "暂无消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "userMessage": { + "zh-Hans": "用户", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Usuario", + "ru-RU": "Пользователь", + "th-TH": "ผู้ใช้", + "vi-VN": "Người dùng" + }, + "botMessage": { + "zh-Hans": "机器人", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Bot", + "ru-RU": "Бот", + "th-TH": "บอท", + "vi-VN": "Bot" + }, + "sendFailed": { + "zh-Hans": "发送失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Enviarfalló", + "ru-RU": "Отправитьне удалось", + "th-TH": "ส่งล้มเหลว", + "vi-VN": "Gửithất bại" + }, + "resetSuccess": { + "zh-Hans": "对话已重置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "resetFailed": { + "zh-Hans": "重置失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "loadMessagesFailed": { + "zh-Hans": "加载消息失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "CargarMensajefalló", + "ru-RU": "ЗагрузитьСообщениене удалось", + "th-TH": "โหลดข้อความล้มเหลว", + "vi-VN": "TảiTin nhắnthất bại" + }, + "loadWorkflowsFailed": { + "zh-Hans": "加载工作流失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "CargarFlujo de Trabajofalló", + "ru-RU": "ЗагрузитьРабочий Процессне удалось", + "th-TH": "โหลดเวิร์กโฟลว์ล้มเหลว", + "vi-VN": "TảiQuy trìnhthất bại" + }, + "atTips": { + "zh-Hans": "提及机器人", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Mencionar bot", + "ru-RU": "Упомянуть бота", + "th-TH": "กล่าวถึงบอท", + "vi-VN": "Nhắc đến bot" + }, + "streaming": { + "zh-Hans": "流式传输", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Transmisión", + "ru-RU": "Потоковая передача", + "th-TH": "การสตรีม", + "vi-VN": "Truyền phát" + }, + "streamOutput": { + "zh-Hans": "流式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Streaming", + "ru-RU": "Потоковый", + "th-TH": "สตรีม", + "vi-VN": "Streaming" + }, + "connected": { + "zh-Hans": "WebSocket已连接", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "disconnected": { + "zh-Hans": "WebSocket未连接", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "connectionError": { + "zh-Hans": "WebSocket连接错误", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "connectionFailed": { + "zh-Hans": "WebSocket连接失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "notConnected": { + "zh-Hans": "WebSocket未连接,请稍后重试", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "imageUploadFailed": { + "zh-Hans": "图片上传失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "reply": { + "zh-Hans": "回复", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Responder", + "ru-RU": "Ответить", + "th-TH": "ตอบกลับ", + "vi-VN": "Trả lời" + }, + "replyTo": { + "zh-Hans": "回复给", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "showMarkdown": { + "zh-Hans": "渲染", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Renderizar", + "ru-RU": "Рендеринг", + "th-TH": "เรนเดอร์", + "vi-VN": "Hiển thị" + }, + "showRaw": { + "zh-Hans": "原文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Texto sin formato", + "ru-RU": "Исходный текст", + "th-TH": "ข้อความดิบ", + "vi-VN": "Văn bản gốc" + }, + "allMembers": { + "zh-Hans": "全体成员", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Todos los miembros", + "ru-RU": "Все участники", + "th-TH": "สมาชิกทั้งหมด", + "vi-VN": "Tất cả thành viên" + }, + "file": { + "zh-Hans": "文件", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Archivo", + "ru-RU": "Файл", + "th-TH": "ไฟล์", + "vi-VN": "Tệp" + }, + "voice": { + "zh-Hans": "语音", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Voz", + "ru-RU": "Голос", + "th-TH": "เสียง", + "vi-VN": "Giọng nói" + }, + "uploadImage": { + "zh-Hans": "上传图片", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Subir imagen", + "ru-RU": "Загрузить изображение", + "th-TH": "อัปโหลดรูปภาพ", + "vi-VN": "Tải lên hình ảnh" + }, + "uploading": { + "zh-Hans": "上传中...", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Subiendo...", + "ru-RU": "Загрузка...", + "th-TH": "กำลังอัปโหลด...", + "vi-VN": "Đang tải lên..." + }, + "filterByDate": { + "zh-Hans": "按日期筛选", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "allTime": { + "zh-Hans": "全部时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "today": { + "zh-Hans": "今天", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Hoy", + "ru-RU": "Сегодня", + "th-TH": "วันนี้", + "vi-VN": "Hôm nay" + }, + "lastWeek": { + "zh-Hans": "最近一周", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Última semana", + "ru-RU": "Последняя неделя", + "th-TH": "สัปดาห์ที่แล้ว", + "vi-VN": "Tuần trước" + }, + "lastMonth": { + "zh-Hans": "最近一个月", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "showingExecutions": { + "zh-Hans": "显示 {{shown}} / {{total}} 条记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Mostrando {{shown}} / {{total}} registros", + "ru-RU": "Показано {{shown}} / {{total}} записей", + "th-TH": "แสดง {{shown}} / {{total}} รายการ", + "vi-VN": "Hiển thị {{shown}} / {{total}} bản ghi" + }, + "rerun": { + "zh-Hans": "重新运行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "rerunExecution": { + "zh-Hans": "重新执行", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "details": { + "zh-Hans": "详情", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Detalles", + "ru-RU": "Детали", + "th-TH": "รายละเอียด", + "vi-VN": "Chi tiết" + }, + "completedAt": { + "zh-Hans": "完成时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "noNodeExecutions": { + "zh-Hans": "暂无节点执行记录", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "conditions": { + "zh-Hans": "触发条件", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "keyword_filter": { + "zh-Hans": "关键词过滤", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "regex_filter": { + "zh-Hans": "正则过滤", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Expresión RegularFiltrar", + "ru-RU": "Регулярное ВыражениеФильтр", + "th-TH": "นิพจน์ทั่วไปกรอง", + "vi-VN": "Biểu thức Chính quyLọc" + }, + "min_length": { + "zh-Hans": "最小长度", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "MínimoLongitud", + "ru-RU": "МинимумДлина", + "th-TH": "ต่ำสุดความยาว", + "vi-VN": "Tối thiểuĐộ dài" + }, + "max_length": { + "zh-Hans": "最大长度", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "MáximoLongitud", + "ru-RU": "МаксимумДлина", + "th-TH": "สูงสุดความยาว", + "vi-VN": "Tối đaĐộ dài" + }, + "require_mention": { + "zh-Hans": "需要@机器人", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Requiere mencionar bot", + "ru-RU": "Требуется упоминание бота", + "th-TH": "ต้องกล่าวถึงบอท", + "vi-VN": "Yêu cầu nhắc bot" + }, + "respond_rules": { + "zh-Hans": "群响应规则", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "access_control": { + "zh-Hans": "访问控制", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Control de acceso", + "ru-RU": "Контроль доступа", + "th-TH": "การควบคุมการเข้าถึง", + "vi-VN": "Kiểm soát truy cập" + }, + "cron": { + "zh-Hans": "Cron表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Expresión Cron", + "ru-RU": "Выражение Cron", + "th-TH": "นิพจน์ Cron", + "vi-VN": "Biểu thức Cron" + }, + "timezone": { + "zh-Hans": "时区", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Zona horaria", + "ru-RU": "Часовой пояс", + "th-TH": "เขตเวลา", + "vi-VN": "Múi giờ" + }, + "path": { + "zh-Hans": "Webhook路径", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Ruta Webhook", + "ru-RU": "Путь Webhook", + "th-TH": "เส้นทาง Webhook", + "vi-VN": "Đường dẫn Webhook" + }, + "allowed_methods": { + "zh-Hans": "允许的HTTP方法", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "content_type": { + "zh-Hans": "Content-Type", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Content-Type", + "ru-RU": "Content-Type", + "th-TH": "Content-Type", + "vi-VN": "Content-Type" + }, + "auth_type": { + "zh-Hans": "认证方式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tipo de autenticación", + "ru-RU": "Тип аутентификации", + "th-TH": "ประเภทการยืนยันตัวตน", + "vi-VN": "Loại xác thực" + }, + "auth_key": { + "zh-Hans": "认证密钥", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Clave de autenticación", + "ru-RU": "Ключ аутентификации", + "th-TH": "คีย์การยืนยันตัวตน", + "vi-VN": "Khóa xác thực" + }, + "validation": { + "zh-Hans": "请求验证", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "timeout": { + "zh-Hans": "超时时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tiempo de esperaTiempo", + "ru-RU": "Тайм-аутВремя", + "th-TH": "หมดเวลาเวลา", + "vi-VN": "Hết thời gianThời gian" + }, + "event_types": { + "zh-Hans": "事件类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tipo de evento", + "ru-RU": "Тип события", + "th-TH": "ประเภทเหตุการณ์", + "vi-VN": "Loại sự kiện" + }, + "filter": { + "zh-Hans": "事件过滤", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "EventoFiltrar", + "ru-RU": "СобытиеФильтр", + "th-TH": "เหตุการณ์กรอง", + "vi-VN": "Sự kiệnLọc" + }, + "debounce_ms": { + "zh-Hans": "防抖时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "model": { + "zh-Hans": "模型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Modelo", + "ru-RU": "Модель", + "th-TH": "โมเดล", + "vi-VN": "Mô hình" + }, + "prompt_template": { + "zh-Hans": "提示词模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "system_prompt": { + "zh-Hans": "系统提示词", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "temperature": { + "zh-Hans": "温度", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Temperatura", + "ru-RU": "Температура", + "th-TH": "อุณหภูมิ", + "vi-VN": "Nhiệt độ" + }, + "top_p": { + "zh-Hans": "Top P", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Top P", + "ru-RU": "Top P", + "th-TH": "Top P", + "vi-VN": "Top P" + }, + "frequency_penalty": { + "zh-Hans": "频率惩罚", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Penalización de frecuencia", + "ru-RU": "Штраф за частоту", + "th-TH": "การลงโทษความถี่", + "vi-VN": "Phạt tần suất" + }, + "presence_penalty": { + "zh-Hans": "存在惩罚", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Penalización de presencia", + "ru-RU": "Штраф за присутствие", + "th-TH": "การลงโทษการมีอยู่", + "vi-VN": "Phạt hiện diện" + }, + "max_tokens": { + "zh-Hans": "最大Token数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "stop_sequences": { + "zh-Hans": "停止序列", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "seed": { + "zh-Hans": "随机种子", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Semilla aleatoria", + "ru-RU": "Случайное зерно", + "th-TH": "ค่า Seed", + "vi-VN": "Seed ngẫu nhiên" + }, + "stream": { + "zh-Hans": "流式输出", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "use_conversation_history": { + "zh-Hans": "使用对话历史", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "language": { + "zh-Hans": "编程语言", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Lenguaje de programación", + "ru-RU": "Язык программирования", + "th-TH": "ภาษาโปรแกรม", + "vi-VN": "Ngôn ngữ lập trình" + }, + "code": { + "zh-Hans": "代码", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Código", + "ru-RU": "Код", + "th-TH": "โค้ด", + "vi-VN": "Mã" + }, + "url": { + "zh-Hans": "请求URL", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "auth_config": { + "zh-Hans": "认证配置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "transform_type": { + "zh-Hans": "转换类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "template": { + "zh-Hans": "模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Plantilla", + "ru-RU": "Шаблон", + "th-TH": "เทมเพลต", + "vi-VN": "Mẫu" + }, + "expression": { + "zh-Hans": "表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Expresión", + "ru-RU": "Выражение", + "th-TH": "นิพจน์", + "vi-VN": "Biểu thức" + }, + "output_type": { + "zh-Hans": "输出类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "SalidaTipo", + "ru-RU": "ВыходТип", + "th-TH": "เอาต์พุตประเภท", + "vi-VN": "Đầu raLoại" + }, + "categories": { + "zh-Hans": "分类类别", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "instruction": { + "zh-Hans": "指令", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Instrucción", + "ru-RU": "Инструкция", + "th-TH": "คำสั่ง", + "vi-VN": "Chỉ thị" + }, + "knowledge_bases": { + "zh-Hans": "知识库", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "top_k": { + "zh-Hans": "返回数量", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Cantidad a devolver", + "ru-RU": "Количество возвращаемых", + "th-TH": "จำนวนที่ส่งคืน", + "vi-VN": "Số lượng trả về" + }, + "score_threshold": { + "zh-Hans": "相似度阈值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "search_method": { + "zh-Hans": "搜索方法", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "enable_citations": { + "zh-Hans": "启用引用", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "condition_type": { + "zh-Hans": "条件类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "CondiciónTipo", + "ru-RU": "УсловиеТип", + "th-TH": "เงื่อนไขประเภท", + "vi-VN": "Điều kiệnLoại" + }, + "condition_expression": { + "zh-Hans": "条件表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "left_value": { + "zh-Hans": "左值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "operator": { + "zh-Hans": "比较运算符", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Operador de comparación", + "ru-RU": "Оператор сравнения", + "th-TH": "ตัวดำเนินการเปรียบเทียบ", + "vi-VN": "Toán tử so sánh" + }, + "right_value": { + "zh-Hans": "右值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "cases": { + "zh-Hans": "分支条件", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "max_iterations": { + "zh-Hans": "最大迭代次数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "break_condition": { + "zh-Hans": "中断条件", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "max_concurrency": { + "zh-Hans": "最大并发数", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "branches": { + "zh-Hans": "分支配置", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "wait_all": { + "zh-Hans": "等待所有", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "fail_fast": { + "zh-Hans": "快速失败", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "duration_type": { + "zh-Hans": "时间单位", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "merge_strategy": { + "zh-Hans": "合并策略", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variable_mappings": { + "zh-Hans": "变量映射", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "aggregation_mode": { + "zh-Hans": "聚合模式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Modo de agregación", + "ru-RU": "Режим агрегации", + "th-TH": "โหมดการรวม", + "vi-VN": "Chế độ tổng hợp" + }, + "target_type": { + "zh-Hans": "目标类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "target_id": { + "zh-Hans": "目标ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ID de destino", + "ru-RU": "ID цели", + "th-TH": "ID เป้าหมาย", + "vi-VN": "ID đích" + }, + "message_type": { + "zh-Hans": "消息类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "MensajeTipo", + "ru-RU": "СообщениеТип", + "th-TH": "ข้อความประเภท", + "vi-VN": "Tin nhắnLoại" + }, + "reply_mode": { + "zh-Hans": "回复模式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "message_template": { + "zh-Hans": "消息模板", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "long_text_processing": { + "zh-Hans": "长文本处理", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "force_delay": { + "zh-Hans": "强制延迟", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "pipeline_uuid": { + "zh-Hans": "流水线", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Pipeline", + "ru-RU": "Конвейер", + "th-TH": "ไปป์ไลน์", + "vi-VN": "Pipeline" + }, + "inherit_context": { + "zh-Hans": "继承上下文", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "storage_type": { + "zh-Hans": "存储类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "ttl": { + "zh-Hans": "过期时间", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "key_prefix": { + "zh-Hans": "键前缀", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "variable_name": { + "zh-Hans": "变量名称", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "VariableNombre", + "ru-RU": "ПеременнаяНазвание", + "th-TH": "ตัวแปรชื่อ", + "vi-VN": "BiếnTên" + }, + "variable_scope": { + "zh-Hans": "变量作用域", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "set_variable_operation": { + "zh-Hans": "操作类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "show_suggestions": { + "zh-Hans": "显示建议", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Mostrar sugerencias", + "ru-RU": "Показать предложения", + "th-TH": "แสดงคำแนะนำ", + "vi-VN": "Hiển thị gợi ý" + }, + "output_format": { + "zh-Hans": "输出格式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "success_message": { + "zh-Hans": "成功消息", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ÉxitoMensaje", + "ru-RU": "УспехСообщение", + "th-TH": "สำเร็จข้อความ", + "vi-VN": "Thành côngTin nhắn" + }, + "connection_type": { + "zh-Hans": "数据库类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "connection_string": { + "zh-Hans": "连接字符串", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "query_type": { + "zh-Hans": "查询类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "connection_url": { + "zh-Hans": "连接URL", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ConectarURL", + "ru-RU": "ПодключитьURL", + "th-TH": "เชื่อมต่อURL", + "vi-VN": "Kết nốiURL" + }, + "operation": { + "zh-Hans": "操作类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "dataset_id": { + "zh-Hans": "知识库ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "escape_html": { + "zh-Hans": "转义HTML", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Escapar HTML", + "ru-RU": "Экранировать HTML", + "th-TH": "Escape HTML", + "vi-VN": "Escape HTML" + }, + "trim_whitespace": { + "zh-Hans": "去除空白", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminar espacios en blanco", + "ru-RU": "Удалить пробелы", + "th-TH": "ลบช่องว่าง", + "vi-VN": "Loại bỏ khoảng trắng" + }, + "json_transform_type": { + "zh-Hans": "JSON转换类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "json_expression": { + "zh-Hans": "JSON表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Expresión JSON", + "ru-RU": "Выражение JSON", + "th-TH": "นิพจน์ JSON", + "vi-VN": "Biểu thức JSON" + }, + "mapping": { + "zh-Hans": "字段映射", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "code_language": { + "zh-Hans": "编程语言", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Lenguaje de programación", + "ru-RU": "Язык программирования", + "th-TH": "ภาษาโปรแกรม", + "vi-VN": "Ngôn ngữ lập trình" + }, + "code_content": { + "zh-Hans": "代码内容", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "aggregation_type": { + "zh-Hans": "聚合类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "separator": { + "zh-Hans": "分隔符", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Separador", + "ru-RU": "Разделитель", + "th-TH": "ตัวคั่น", + "vi-VN": "Dấu phân cách" + }, + "field_path": { + "zh-Hans": "字段路径", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "split_type": { + "zh-Hans": "分割类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "chunk_size": { + "zh-Hans": "块大小", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tamaño de bloque", + "ru-RU": "Размер блока", + "th-TH": "ขนาดบล็อก", + "vi-VN": "Kích thước khối" + }, + "chunk_overlap": { + "zh-Hans": "块重叠", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Superposición de bloques", + "ru-RU": "Перекрытие блоков", + "th-TH": "การทับซ้อนบล็อก", + "vi-VN": "Chồng lấp khối" + }, + "regex_pattern": { + "zh-Hans": "正则表达式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "remove_empty": { + "zh-Hans": "移除空块", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Eliminar bloques vacíos", + "ru-RU": "Удалить пустые блоки", + "th-TH": "ลบบล็อกว่าง", + "vi-VN": "Xóa khối trống" + }, + "assign_variable_name": { + "zh-Hans": "变量名", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "value_type": { + "zh-Hans": "值类型", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ValorTipo", + "ru-RU": "ЗначениеТип", + "th-TH": "ค่าประเภท", + "vi-VN": "Giá trịLoại" + }, + "static_value": { + "zh-Hans": "静态值", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "TODO", + "ru-RU": "TODO", + "th-TH": "TODO", + "vi-VN": "TODO" + }, + "n8n_webhook_url": { + "zh-Hans": "Webhook URL", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "URL de Webhook", + "ru-RU": "URL Webhook", + "th-TH": "URL Webhook", + "vi-VN": "URL Webhook" + }, + "n8n_auth_type": { + "zh-Hans": "认证方式", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "Tipo de autenticación", + "ru-RU": "Тип аутентификации", + "th-TH": "ประเภทการยืนยันตัวตน", + "vi-VN": "Loại xác thực" + }, + "langflow_flow_id": { + "zh-Hans": "流程ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ID de flujo", + "ru-RU": "ID потока", + "th-TH": "ID โฟลว์", + "vi-VN": "ID luồng" + }, + "coze_bot_id": { + "zh-Hans": "机器人ID", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "ID de bot", + "ru-RU": "ID бота", + "th-TH": "ID บอท", + "vi-VN": "ID bot" + }, + "coze_api_base": { + "zh-Hans": "API基础URL", + "ja-JP": "TODO", + "zh-Hant": "TODO", + "es-ES": "URL base de API", + "ru-RU": "Базовый URL API", + "th-TH": "URL ฐาน API", + "vi-VN": "URL cơ sở API" + } + } +} \ No newline at end of file