From 59a893afa349e4c8b6041b7494726ff9d8e9e3e8 Mon Sep 17 00:00:00 2001 From: yyh Date: Mon, 29 Dec 2025 16:31:41 +0800 Subject: [PATCH 1/2] refactor: rename i18n utility scripts to `i18n:check` and `i18n:gen` across package scripts, workflows, tests, and documentation. --- .github/workflows/translate-i18n-base-on-english.yml | 2 +- web/__tests__/check-i18n.test.ts | 2 +- web/i18n-config/README.md | 6 +++--- web/i18n-config/auto-gen-i18n.js | 8 ++++---- web/i18n-config/check-i18n.js | 8 ++++---- web/knip.config.ts | 2 +- web/package.json | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/translate-i18n-base-on-english.yml b/.github/workflows/translate-i18n-base-on-english.yml index 06227859dd..a51350f630 100644 --- a/.github/workflows/translate-i18n-base-on-english.yml +++ b/.github/workflows/translate-i18n-base-on-english.yml @@ -65,7 +65,7 @@ jobs: - name: Generate i18n translations if: env.FILES_CHANGED == 'true' working-directory: ./web - run: pnpm run auto-gen-i18n ${{ env.FILE_ARGS }} + run: pnpm run i18n:gen ${{ env.FILE_ARGS }} - name: Create Pull Request if: env.FILES_CHANGED == 'true' diff --git a/web/__tests__/check-i18n.test.ts b/web/__tests__/check-i18n.test.ts index a6f86d8107..9f573bda10 100644 --- a/web/__tests__/check-i18n.test.ts +++ b/web/__tests__/check-i18n.test.ts @@ -3,7 +3,7 @@ import path from 'node:path' import vm from 'node:vm' import { transpile } from 'typescript' -describe('check-i18n script functionality', () => { +describe('i18n:check script functionality', () => { const testDir = path.join(__dirname, '../i18n-test') const testEnDir = path.join(testDir, 'en-US') const testZhDir = path.join(testDir, 'zh-Hans') diff --git a/web/i18n-config/README.md b/web/i18n-config/README.md index b0a96986a4..a148f48202 100644 --- a/web/i18n-config/README.md +++ b/web/i18n-config/README.md @@ -159,10 +159,10 @@ We have a list of languages that we support in the `languages.ts` file. But some ## Utility scripts -- Auto-fill translations: `pnpm run auto-gen-i18n --file app common --lang zh-Hans ja-JP [--dry-run]` +- Auto-fill translations: `pnpm run i18n:gen --file app common --lang zh-Hans ja-JP [--dry-run]` - Use space-separated values; repeat `--file` / `--lang` as needed. Defaults to all en-US files and all supported locales except en-US. - Protects placeholders (`{{var}}`, `${var}`, ``) before translation and restores them after. -- Check missing/extra keys: `pnpm run check-i18n --file app billing --lang zh-Hans [--auto-remove]` +- Check missing/extra keys: `pnpm run i18n:check --file app billing --lang zh-Hans [--auto-remove]` - Use space-separated values; repeat `--file` / `--lang` as needed. Returns non-zero on missing/extra keys; `--auto-remove` deletes extra keys automatically. -Workflows: `.github/workflows/translate-i18n-base-on-english.yml` auto-runs the translation generator on `web/i18n/en-US/*.json` changes to main. `check-i18n` is a manual script (not run in CI). +Workflows: `.github/workflows/translate-i18n-base-on-english.yml` auto-runs the translation generator on `web/i18n/en-US/*.json` changes to main. `i18n:check` is a manual script (not run in CI). diff --git a/web/i18n-config/auto-gen-i18n.js b/web/i18n-config/auto-gen-i18n.js index f84a2388af..4eff7b07ad 100644 --- a/web/i18n-config/auto-gen-i18n.js +++ b/web/i18n-config/auto-gen-i18n.js @@ -103,7 +103,7 @@ function parseArgs(argv) { } function printHelp() { - console.log(`Usage: pnpm run auto-gen-i18n [options] + console.log(`Usage: pnpm run i18n:gen [options] Options: --file Process only specific files; provide space-separated names and repeat --file if needed @@ -112,8 +112,8 @@ Options: -h, --help Show help Examples: - pnpm run auto-gen-i18n --file app common --lang zh-Hans ja-JP - pnpm run auto-gen-i18n --dry-run + pnpm run i18n:gen --file app common --lang zh-Hans ja-JP + pnpm run i18n:gen --dry-run `) } @@ -259,7 +259,7 @@ async function main() { return } - console.log('🚀 Starting auto-gen-i18n script...') + console.log('🚀 Starting i18n:gen script...') console.log(`📋 Mode: ${isDryRun ? 'DRY RUN (no files will be modified)' : 'LIVE MODE'}`) const filesInEn = fs diff --git a/web/i18n-config/check-i18n.js b/web/i18n-config/check-i18n.js index 5b6efec385..4ad9eb6513 100644 --- a/web/i18n-config/check-i18n.js +++ b/web/i18n-config/check-i18n.js @@ -90,7 +90,7 @@ function parseArgs(argv) { } function printHelp() { - console.log(`Usage: pnpm run check-i18n [options] + console.log(`Usage: pnpm run i18n:check [options] Options: --file Check only specific files; provide space-separated names and repeat --file if needed @@ -99,8 +99,8 @@ Options: -h, --help Show help Examples: - pnpm run check-i18n --file app billing --lang zh-Hans ja-JP - pnpm run check-i18n --auto-remove + pnpm run i18n:check --file app billing --lang zh-Hans ja-JP + pnpm run i18n:check --auto-remove `) } @@ -285,7 +285,7 @@ async function main() { return hasDiff } - console.log('🚀 Starting check-i18n script...') + console.log('🚀 Starting i18n:check script...') if (targetFiles.length) console.log(`📁 Checking files: ${targetFiles.join(', ')}`) diff --git a/web/knip.config.ts b/web/knip.config.ts index 8598d94e2d..975a85b997 100644 --- a/web/knip.config.ts +++ b/web/knip.config.ts @@ -168,7 +168,7 @@ const config: KnipConfig = { // ======================================================================== // 🔒 Utility scripts (not part of application runtime) // ======================================================================== - // These scripts are run manually (e.g., pnpm gen-icons, pnpm check-i18n) + // These scripts are run manually (e.g., pnpm gen-icons, pnpm i18n:check) // and are not imported by the application code. 'scripts/**', 'bin/**', diff --git a/web/package.json b/web/package.json index 2e03f04a62..3d5591c57c 100644 --- a/web/package.json +++ b/web/package.json @@ -33,8 +33,8 @@ "prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky ./web/.husky", "gen-icons": "node ./app/components/base/icons/script.mjs", "uglify-embed": "node ./bin/uglify-embed", - "check-i18n": "tsx ./i18n-config/check-i18n.js", - "auto-gen-i18n": "tsx ./i18n-config/auto-gen-i18n.js", + "i18n:check": "tsx ./i18n-config/check-i18n.js", + "i18n:gen": "tsx ./i18n-config/auto-gen-i18n.js", "test": "vitest run", "test:coverage": "vitest run --coverage", "test:watch": "vitest --watch", From a05a926bafe13e3ed984aff1c6f795f88c793e9d Mon Sep 17 00:00:00 2001 From: yyh Date: Mon, 29 Dec 2025 16:37:10 +0800 Subject: [PATCH 2/2] i18n: Update Japanese and Simplified Chinese translations for explore, billing, tools, dataset, dataset documents, and workflow features. --- web/i18n/ja-JP/billing.json | 1 + web/i18n/ja-JP/dataset-documents.json | 1 + web/i18n/ja-JP/dataset.json | 4 ++++ web/i18n/ja-JP/explore.json | 1 + web/i18n/ja-JP/tools.json | 6 ++++++ web/i18n/ja-JP/workflow.json | 10 ++++++++++ web/i18n/zh-Hans/billing.json | 1 + web/i18n/zh-Hans/dataset-documents.json | 1 + web/i18n/zh-Hans/dataset.json | 3 +++ web/i18n/zh-Hans/explore.json | 1 + web/i18n/zh-Hans/tools.json | 6 ++++++ web/i18n/zh-Hans/workflow.json | 12 +++++++++++- 12 files changed, 46 insertions(+), 1 deletion(-) diff --git a/web/i18n/ja-JP/billing.json b/web/i18n/ja-JP/billing.json index 81bf41e5dd..344e934948 100644 --- a/web/i18n/ja-JP/billing.json +++ b/web/i18n/ja-JP/billing.json @@ -20,6 +20,7 @@ "plans.community.includesTitle": "無料機能:", "plans.community.name": "コミュニティ", "plans.community.price": "無料", + "plans.community.priceTip": "", "plans.enterprise.btnText": "営業に相談", "plans.enterprise.description": "企業レベルのセキュリティとカスタマイズを実現", "plans.enterprise.features": [ diff --git a/web/i18n/ja-JP/dataset-documents.json b/web/i18n/ja-JP/dataset-documents.json index 9db8008dc4..9fa6f6da68 100644 --- a/web/i18n/ja-JP/dataset-documents.json +++ b/web/i18n/ja-JP/dataset-documents.json @@ -247,6 +247,7 @@ "metadata.languageMap.no": "ノルウェー語", "metadata.languageMap.pl": "ポーランド語", "metadata.languageMap.pt": "ポルトガル語", + "metadata.languageMap.ro": "ルーマニア語", "metadata.languageMap.ru": "ロシア語", "metadata.languageMap.sv": "スウェーデン語", "metadata.languageMap.th": "タイ語", diff --git a/web/i18n/ja-JP/dataset.json b/web/i18n/ja-JP/dataset.json index eb4741b256..3500bec3ae 100644 --- a/web/i18n/ja-JP/dataset.json +++ b/web/i18n/ja-JP/dataset.json @@ -8,6 +8,7 @@ "batchAction.delete": "削除", "batchAction.disable": "無効にする", "batchAction.enable": "有効にする", + "batchAction.reIndex": "再インデックス", "batchAction.selected": "選択済み", "chunkingMode.general": "汎用", "chunkingMode.graph": "グラフ", @@ -88,6 +89,7 @@ "indexingMethod.full_text_search": "フルテキスト検索", "indexingMethod.hybrid_search": "ハイブリッド検索", "indexingMethod.invertedIndex": "転置", + "indexingMethod.keyword_search": "キーワード", "indexingMethod.semantic_search": "ベクトル検索", "indexingTechnique.economy": "経済", "indexingTechnique.high_quality": "高品質", @@ -154,6 +156,8 @@ "retrieval.hybrid_search.description": "全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するために Rerank 付けを行います。Rerank モデル API の設定が必要です。", "retrieval.hybrid_search.recommend": "推奨", "retrieval.hybrid_search.title": "ハイブリッド検索", + "retrieval.invertedIndex.description": "転置インデックスは、効率的な検索のための構造です。用語ごとに整理され、各用語はそれを含むドキュメントまたはWebページを指します。", + "retrieval.invertedIndex.title": "転置インデックス", "retrieval.keyword_search.description": "逆インデックスは効率的な検索のために使用される構造です。用語によって整理されており、各用語はそれを含む文書やウェブページを指し示します。", "retrieval.keyword_search.title": "逆インデックス", "retrieval.semantic_search.description": "クエリの埋め込みを生成し、そのベクトル表現に最も類似したテキストチャンクを検索します。", diff --git a/web/i18n/ja-JP/explore.json b/web/i18n/ja-JP/explore.json index c861b8e9fb..51afbe6133 100644 --- a/web/i18n/ja-JP/explore.json +++ b/web/i18n/ja-JP/explore.json @@ -12,6 +12,7 @@ "category.Entertainment": "エンターテイメント", "category.HR": "人事", "category.Programming": "プログラミング", + "category.Recommended": "推奨", "category.Translate": "翻訳", "category.Workflow": "ワークフロー", "category.Writing": "執筆", diff --git a/web/i18n/ja-JP/tools.json b/web/i18n/ja-JP/tools.json index 72afbd996a..36b047c990 100644 --- a/web/i18n/ja-JP/tools.json +++ b/web/i18n/ja-JP/tools.json @@ -1,6 +1,11 @@ { "addToolModal.added": "追加済", + "addToolModal.agent.tip": "", "addToolModal.agent.title": "Agent strategy は利用できません", + "addToolModal.all.tip": "", + "addToolModal.all.title": "利用可能なツールはありません", + "addToolModal.built-in.tip": "", + "addToolModal.built-in.title": "利用可能な組み込みツールはありません", "addToolModal.category": "カテゴリー", "addToolModal.custom.tip": "カスタムツールを作成する", "addToolModal.custom.title": "カスタムツールはありません", @@ -34,6 +39,7 @@ "createTool.authMethod.type": "認証タイプ", "createTool.authMethod.types.apiKeyPlaceholder": "API キーの HTTP ヘッダー名", "createTool.authMethod.types.apiValuePlaceholder": "API キーを入力してください", + "createTool.authMethod.types.api_key": "API キー", "createTool.authMethod.types.api_key_header": "ヘッダー", "createTool.authMethod.types.api_key_query": "クエリパラメータ", "createTool.authMethod.types.none": "なし", diff --git a/web/i18n/ja-JP/workflow.json b/web/i18n/ja-JP/workflow.json index 42e0f7151b..df8fb56dd0 100644 --- a/web/i18n/ja-JP/workflow.json +++ b/web/i18n/ja-JP/workflow.json @@ -4,6 +4,7 @@ "blocks.assigner": "変数代入", "blocks.code": "コード実行", "blocks.datasource": "データソース", + "blocks.datasource-empty": "空のデータソース", "blocks.document-extractor": "テキスト抽出", "blocks.end": "出力", "blocks.http-request": "HTTP リクエスト", @@ -22,6 +23,7 @@ "blocks.question-classifier": "質問分類器", "blocks.start": "ユーザー入力", "blocks.template-transform": "テンプレート", + "blocks.tool": "ツール", "blocks.trigger-plugin": "プラグイントリガー", "blocks.trigger-schedule": "スケジュールトリガー", "blocks.trigger-webhook": "Webhook トリガー", @@ -32,21 +34,25 @@ "blocksAbout.assigner": "書き込み可能な変数(例:会話変数)への値の割り当てを行います。", "blocksAbout.code": "Python/NodeJS コードを実行してカスタムロジックを実装します。", "blocksAbout.datasource": "データソースについて", + "blocksAbout.datasource-empty": "空のデータソースのプレースホルダー", "blocksAbout.document-extractor": "アップロード文書を LLM 処理用に最適化されたテキストに変換します。", "blocksAbout.end": "ワークフローの出力と結果のタイプを定義します", "blocksAbout.http-request": "HTTP リクエストを送信できます。", "blocksAbout.if-else": "if/else 条件でワークフローを 2 つの分岐に分割します。", "blocksAbout.iteration": "リスト要素に対して反復処理を実行し全結果を出力します。", + "blocksAbout.iteration-start": "反復開始ノード", "blocksAbout.knowledge-index": "知識ベースについて", "blocksAbout.knowledge-retrieval": "ナレッジベースからユーザー質問に関連するテキストを検索します。", "blocksAbout.list-operator": "配列のフィルタリングやソート処理を行います。", "blocksAbout.llm": "大規模言語モデルを呼び出して質問回答や自然言語処理を実行します。", "blocksAbout.loop": "終了条件達成まで、または最大反復回数までロジックを繰り返します。", "blocksAbout.loop-end": "「break」相当の機能です。このノードに設定項目はなく、ループ処理中にこのノードに到達すると即時終了します。", + "blocksAbout.loop-start": "ループ開始ノード", "blocksAbout.parameter-extractor": "自然言語から構造化パラメータを抽出し、後続処理で利用します。", "blocksAbout.question-classifier": "質問の分類条件を定義し、LLM が分類に基づいて対話フローを制御します。", "blocksAbout.start": "ワークフロー開始時の初期パラメータを定義します。", "blocksAbout.template-transform": "Jinja テンプレート構文でデータを文字列に変換します。", + "blocksAbout.tool": "外部ツールを使用してワークフローの機能を拡張する", "blocksAbout.trigger-plugin": "サードパーティ統合トリガー、外部プラットフォームのイベントによってワークフローを開始します", "blocksAbout.trigger-schedule": "スケジュールに基づいてワークフローを開始する時間ベースのトリガー", "blocksAbout.trigger-webhook": "Webhook トリガーは第三者システムからの HTTP プッシュを受信してワークフローを自動的に開始します。", @@ -507,6 +513,8 @@ "nodes.ifElse.comparisonOperator.in": "含まれている", "nodes.ifElse.comparisonOperator.is": "である", "nodes.ifElse.comparisonOperator.is not": "でない", + "nodes.ifElse.comparisonOperator.is not null": "null ではない", + "nodes.ifElse.comparisonOperator.is null": "ヌルです", "nodes.ifElse.comparisonOperator.not contains": "含まない", "nodes.ifElse.comparisonOperator.not empty": "空でない", "nodes.ifElse.comparisonOperator.not exists": "存在しません", @@ -971,6 +979,8 @@ "singleRun.startRun": "実行開始", "singleRun.testRun": "テスト実行", "singleRun.testRunIteration": "テスト実行(イテレーション)", + "singleRun.testRunLoop": "テスト実行ループ", + "tabs.-": "デフォルト", "tabs.addAll": "すべてを追加する", "tabs.agent": "エージェント戦略", "tabs.allAdded": "すべて追加されました", diff --git a/web/i18n/zh-Hans/billing.json b/web/i18n/zh-Hans/billing.json index 7cdc3f3eab..e42edf0dc6 100644 --- a/web/i18n/zh-Hans/billing.json +++ b/web/i18n/zh-Hans/billing.json @@ -20,6 +20,7 @@ "plans.community.includesTitle": "免费功能:", "plans.community.name": "Community", "plans.community.price": "免费", + "plans.community.priceTip": "", "plans.enterprise.btnText": "联系销售", "plans.enterprise.description": "适合需要组织级安全性、合规性、可扩展性、控制和定制解决方案的企业", "plans.enterprise.features": [ diff --git a/web/i18n/zh-Hans/dataset-documents.json b/web/i18n/zh-Hans/dataset-documents.json index 2fe105fe60..d81f487070 100644 --- a/web/i18n/zh-Hans/dataset-documents.json +++ b/web/i18n/zh-Hans/dataset-documents.json @@ -247,6 +247,7 @@ "metadata.languageMap.no": "挪威语", "metadata.languageMap.pl": "波兰语", "metadata.languageMap.pt": "葡萄牙语", + "metadata.languageMap.ro": "罗马尼亚语", "metadata.languageMap.ru": "俄语", "metadata.languageMap.sv": "瑞典语", "metadata.languageMap.th": "泰语", diff --git a/web/i18n/zh-Hans/dataset.json b/web/i18n/zh-Hans/dataset.json index dd36de8e51..ec5d09b5f4 100644 --- a/web/i18n/zh-Hans/dataset.json +++ b/web/i18n/zh-Hans/dataset.json @@ -89,6 +89,7 @@ "indexingMethod.full_text_search": "全文检索", "indexingMethod.hybrid_search": "混合检索", "indexingMethod.invertedIndex": "倒排索引", + "indexingMethod.keyword_search": "关键词", "indexingMethod.semantic_search": "向量检索", "indexingTechnique.economy": "经济", "indexingTechnique.high_quality": "高质量", @@ -155,6 +156,8 @@ "retrieval.hybrid_search.description": "同时执行全文检索和向量检索,并应用重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果,用户可以选择设置权重或配置重新排序模型。", "retrieval.hybrid_search.recommend": "推荐", "retrieval.hybrid_search.title": "混合检索", + "retrieval.invertedIndex.description": "倒排索引是一种用于高效检索的结构。按术语组织,每个术语指向包含它的文档或网页。", + "retrieval.invertedIndex.title": "倒排索引", "retrieval.keyword_search.description": "倒排索引是一种用于高效检索的结构。按术语组织,每个术语指向包含它的文档或网页", "retrieval.keyword_search.title": "倒排索引", "retrieval.semantic_search.description": "通过生成查询嵌入并查询与其向量表示最相似的文本分段", diff --git a/web/i18n/zh-Hans/explore.json b/web/i18n/zh-Hans/explore.json index 7f938ed2c2..fb4c4ace80 100644 --- a/web/i18n/zh-Hans/explore.json +++ b/web/i18n/zh-Hans/explore.json @@ -12,6 +12,7 @@ "category.Entertainment": "娱乐", "category.HR": "人力资源", "category.Programming": "编程", + "category.Recommended": "推荐", "category.Translate": "翻译", "category.Workflow": "工作流", "category.Writing": "写作", diff --git a/web/i18n/zh-Hans/tools.json b/web/i18n/zh-Hans/tools.json index ee69346996..94e002f8e0 100644 --- a/web/i18n/zh-Hans/tools.json +++ b/web/i18n/zh-Hans/tools.json @@ -1,6 +1,11 @@ { "addToolModal.added": "已添加", + "addToolModal.agent.tip": "", "addToolModal.agent.title": "没有可用的 agent 策略", + "addToolModal.all.tip": "", + "addToolModal.all.title": "没有可用的工具", + "addToolModal.built-in.tip": "", + "addToolModal.built-in.title": "没有可用的内置工具", "addToolModal.category": "类别", "addToolModal.custom.tip": "创建自定义工具", "addToolModal.custom.title": "没有可用的自定义工具", @@ -34,6 +39,7 @@ "createTool.authMethod.type": "鉴权类型", "createTool.authMethod.types.apiKeyPlaceholder": "HTTP 头部名称,用于传递 API Key", "createTool.authMethod.types.apiValuePlaceholder": "输入 API Key", + "createTool.authMethod.types.api_key": "API 密钥", "createTool.authMethod.types.api_key_header": "请求头", "createTool.authMethod.types.api_key_query": "查询参数", "createTool.authMethod.types.none": "无", diff --git a/web/i18n/zh-Hans/workflow.json b/web/i18n/zh-Hans/workflow.json index 50d36e17cd..7787c9db4b 100644 --- a/web/i18n/zh-Hans/workflow.json +++ b/web/i18n/zh-Hans/workflow.json @@ -4,6 +4,7 @@ "blocks.assigner": "变量赋值", "blocks.code": "代码执行", "blocks.datasource": "数据源", + "blocks.datasource-empty": "空数据源", "blocks.document-extractor": "文档提取器", "blocks.end": "输出", "blocks.http-request": "HTTP 请求", @@ -22,6 +23,7 @@ "blocks.question-classifier": "问题分类器", "blocks.start": "用户输入", "blocks.template-transform": "模板转换", + "blocks.tool": "工具", "blocks.trigger-plugin": "插件触发器", "blocks.trigger-schedule": "定时触发器", "blocks.trigger-webhook": "Webhook 触发器", @@ -32,21 +34,25 @@ "blocksAbout.assigner": "变量赋值节点用于向可写入变量(例如会话变量)进行变量赋值。", "blocksAbout.code": "执行一段 Python 或 NodeJS 代码实现自定义逻辑", "blocksAbout.datasource": "数据源节点", + "blocksAbout.datasource-empty": "空数据源占位符", "blocksAbout.document-extractor": "用于将用户上传的文档解析为 LLM 便于理解的文本内容。", "blocksAbout.end": "定义一个 workflow 流程的输出和结果类型", "blocksAbout.http-request": "允许通过 HTTP 协议发送服务器请求", "blocksAbout.if-else": "允许你根据 if/else 条件将 workflow 拆分成两个分支", "blocksAbout.iteration": "对列表对象执行多次步骤直至输出所有结果。", + "blocksAbout.iteration-start": "迭代开始节点", "blocksAbout.knowledge-index": "知识库节点", "blocksAbout.knowledge-retrieval": "允许你从知识库中查询与用户问题相关的文本内容", "blocksAbout.list-operator": "用于过滤或排序数组内容。", "blocksAbout.llm": "调用大语言模型回答问题或者对自然语言进行处理", "blocksAbout.loop": "循环执行一段逻辑直到满足结束条件或者到达循环次数上限。", - "blocksAbout.loop-end": "相当于“break”此节点没有配置项,当循环体内运行到此节点后循环终止。", + "blocksAbout.loop-end": "相当于 “break”,此节点没有配置项,当循环体内运行到此节点后循环终止。", + "blocksAbout.loop-start": "循环开始节点", "blocksAbout.parameter-extractor": "利用 LLM 从自然语言内推理提取出结构化参数,用于后置的工具调用或 HTTP 请求。", "blocksAbout.question-classifier": "定义用户问题的分类条件,LLM 能够根据分类描述定义对话的进展方式", "blocksAbout.start": "定义一个 workflow 流程启动的初始参数", "blocksAbout.template-transform": "使用 Jinja 模板语法将数据转换为字符串", + "blocksAbout.tool": "使用外部工具扩展工作流功能", "blocksAbout.trigger-plugin": "从外部平台事件启动工作流的第三方集成触发器", "blocksAbout.trigger-schedule": "基于时间的工作流触发器,按计划启动工作流", "blocksAbout.trigger-webhook": "Webhook 触发器接收来自第三方系统的 HTTP 推送以自动触发工作流。", @@ -507,6 +513,8 @@ "nodes.ifElse.comparisonOperator.in": "在", "nodes.ifElse.comparisonOperator.is": "是", "nodes.ifElse.comparisonOperator.is not": "不是", + "nodes.ifElse.comparisonOperator.is not null": "不为空", + "nodes.ifElse.comparisonOperator.is null": "为空", "nodes.ifElse.comparisonOperator.not contains": "不包含", "nodes.ifElse.comparisonOperator.not empty": "不为空", "nodes.ifElse.comparisonOperator.not exists": "不存在", @@ -971,6 +979,8 @@ "singleRun.startRun": "开始运行", "singleRun.testRun": "测试运行", "singleRun.testRunIteration": "测试运行迭代", + "singleRun.testRunLoop": "测试运行循环", + "tabs.-": "默认", "tabs.addAll": "添加全部", "tabs.agent": "Agent 策略", "tabs.allAdded": "已添加全部",