This commit is contained in:
yyh 2025-12-29 16:38:12 +08:00 committed by GitHub
commit f0a2c9e561
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 62 additions and 17 deletions

View File

@ -65,7 +65,7 @@ jobs:
- name: Generate i18n translations - name: Generate i18n translations
if: env.FILES_CHANGED == 'true' if: env.FILES_CHANGED == 'true'
working-directory: ./web working-directory: ./web
run: pnpm run auto-gen-i18n ${{ env.FILE_ARGS }} run: pnpm run i18n:gen ${{ env.FILE_ARGS }}
- name: Create Pull Request - name: Create Pull Request
if: env.FILES_CHANGED == 'true' if: env.FILES_CHANGED == 'true'

View File

@ -3,7 +3,7 @@ import path from 'node:path'
import vm from 'node:vm' import vm from 'node:vm'
import { transpile } from 'typescript' import { transpile } from 'typescript'
describe('check-i18n script functionality', () => { describe('i18n:check script functionality', () => {
const testDir = path.join(__dirname, '../i18n-test') const testDir = path.join(__dirname, '../i18n-test')
const testEnDir = path.join(testDir, 'en-US') const testEnDir = path.join(testDir, 'en-US')
const testZhDir = path.join(testDir, 'zh-Hans') const testZhDir = path.join(testDir, 'zh-Hans')

View File

@ -159,10 +159,10 @@ We have a list of languages that we support in the `languages.ts` file. But some
## Utility scripts ## 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. - 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}`, `<tag>`) before translation and restores them after. - Protects placeholders (`{{var}}`, `${var}`, `<tag>`) 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. - 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).

View File

@ -103,7 +103,7 @@ function parseArgs(argv) {
} }
function printHelp() { function printHelp() {
console.log(`Usage: pnpm run auto-gen-i18n [options] console.log(`Usage: pnpm run i18n:gen [options]
Options: Options:
--file <name...> Process only specific files; provide space-separated names and repeat --file if needed --file <name...> Process only specific files; provide space-separated names and repeat --file if needed
@ -112,8 +112,8 @@ Options:
-h, --help Show help -h, --help Show help
Examples: Examples:
pnpm run auto-gen-i18n --file app common --lang zh-Hans ja-JP pnpm run i18n:gen --file app common --lang zh-Hans ja-JP
pnpm run auto-gen-i18n --dry-run pnpm run i18n:gen --dry-run
`) `)
} }
@ -259,7 +259,7 @@ async function main() {
return 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'}`) console.log(`📋 Mode: ${isDryRun ? 'DRY RUN (no files will be modified)' : 'LIVE MODE'}`)
const filesInEn = fs const filesInEn = fs

View File

@ -90,7 +90,7 @@ function parseArgs(argv) {
} }
function printHelp() { function printHelp() {
console.log(`Usage: pnpm run check-i18n [options] console.log(`Usage: pnpm run i18n:check [options]
Options: Options:
--file <name...> Check only specific files; provide space-separated names and repeat --file if needed --file <name...> Check only specific files; provide space-separated names and repeat --file if needed
@ -99,8 +99,8 @@ Options:
-h, --help Show help -h, --help Show help
Examples: Examples:
pnpm run check-i18n --file app billing --lang zh-Hans ja-JP pnpm run i18n:check --file app billing --lang zh-Hans ja-JP
pnpm run check-i18n --auto-remove pnpm run i18n:check --auto-remove
`) `)
} }
@ -285,7 +285,7 @@ async function main() {
return hasDiff return hasDiff
} }
console.log('🚀 Starting check-i18n script...') console.log('🚀 Starting i18n:check script...')
if (targetFiles.length) if (targetFiles.length)
console.log(`📁 Checking files: ${targetFiles.join(', ')}`) console.log(`📁 Checking files: ${targetFiles.join(', ')}`)

View File

@ -20,6 +20,7 @@
"plans.community.includesTitle": "無料機能:", "plans.community.includesTitle": "無料機能:",
"plans.community.name": "コミュニティ", "plans.community.name": "コミュニティ",
"plans.community.price": "無料", "plans.community.price": "無料",
"plans.community.priceTip": "",
"plans.enterprise.btnText": "営業に相談", "plans.enterprise.btnText": "営業に相談",
"plans.enterprise.description": "企業レベルのセキュリティとカスタマイズを実現", "plans.enterprise.description": "企業レベルのセキュリティとカスタマイズを実現",
"plans.enterprise.features": [ "plans.enterprise.features": [

View File

@ -247,6 +247,7 @@
"metadata.languageMap.no": "ノルウェー語", "metadata.languageMap.no": "ノルウェー語",
"metadata.languageMap.pl": "ポーランド語", "metadata.languageMap.pl": "ポーランド語",
"metadata.languageMap.pt": "ポルトガル語", "metadata.languageMap.pt": "ポルトガル語",
"metadata.languageMap.ro": "ルーマニア語",
"metadata.languageMap.ru": "ロシア語", "metadata.languageMap.ru": "ロシア語",
"metadata.languageMap.sv": "スウェーデン語", "metadata.languageMap.sv": "スウェーデン語",
"metadata.languageMap.th": "タイ語", "metadata.languageMap.th": "タイ語",

View File

@ -8,6 +8,7 @@
"batchAction.delete": "削除", "batchAction.delete": "削除",
"batchAction.disable": "無効にする", "batchAction.disable": "無効にする",
"batchAction.enable": "有効にする", "batchAction.enable": "有効にする",
"batchAction.reIndex": "再インデックス",
"batchAction.selected": "選択済み", "batchAction.selected": "選択済み",
"chunkingMode.general": "汎用", "chunkingMode.general": "汎用",
"chunkingMode.graph": "グラフ", "chunkingMode.graph": "グラフ",
@ -88,6 +89,7 @@
"indexingMethod.full_text_search": "フルテキスト検索", "indexingMethod.full_text_search": "フルテキスト検索",
"indexingMethod.hybrid_search": "ハイブリッド検索", "indexingMethod.hybrid_search": "ハイブリッド検索",
"indexingMethod.invertedIndex": "転置", "indexingMethod.invertedIndex": "転置",
"indexingMethod.keyword_search": "キーワード",
"indexingMethod.semantic_search": "ベクトル検索", "indexingMethod.semantic_search": "ベクトル検索",
"indexingTechnique.economy": "経済", "indexingTechnique.economy": "経済",
"indexingTechnique.high_quality": "高品質", "indexingTechnique.high_quality": "高品質",
@ -154,6 +156,8 @@
"retrieval.hybrid_search.description": "全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するために Rerank 付けを行います。Rerank モデル API の設定が必要です。", "retrieval.hybrid_search.description": "全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するために Rerank 付けを行います。Rerank モデル API の設定が必要です。",
"retrieval.hybrid_search.recommend": "推奨", "retrieval.hybrid_search.recommend": "推奨",
"retrieval.hybrid_search.title": "ハイブリッド検索", "retrieval.hybrid_search.title": "ハイブリッド検索",
"retrieval.invertedIndex.description": "転置インデックスは、効率的な検索のための構造です。用語ごとに整理され、各用語はそれを含むドキュメントまたはWebページを指します。",
"retrieval.invertedIndex.title": "転置インデックス",
"retrieval.keyword_search.description": "逆インデックスは効率的な検索のために使用される構造です。用語によって整理されており、各用語はそれを含む文書やウェブページを指し示します。", "retrieval.keyword_search.description": "逆インデックスは効率的な検索のために使用される構造です。用語によって整理されており、各用語はそれを含む文書やウェブページを指し示します。",
"retrieval.keyword_search.title": "逆インデックス", "retrieval.keyword_search.title": "逆インデックス",
"retrieval.semantic_search.description": "クエリの埋め込みを生成し、そのベクトル表現に最も類似したテキストチャンクを検索します。", "retrieval.semantic_search.description": "クエリの埋め込みを生成し、そのベクトル表現に最も類似したテキストチャンクを検索します。",

View File

@ -12,6 +12,7 @@
"category.Entertainment": "エンターテイメント", "category.Entertainment": "エンターテイメント",
"category.HR": "人事", "category.HR": "人事",
"category.Programming": "プログラミング", "category.Programming": "プログラミング",
"category.Recommended": "推奨",
"category.Translate": "翻訳", "category.Translate": "翻訳",
"category.Workflow": "ワークフロー", "category.Workflow": "ワークフロー",
"category.Writing": "執筆", "category.Writing": "執筆",

View File

@ -1,6 +1,11 @@
{ {
"addToolModal.added": "追加済", "addToolModal.added": "追加済",
"addToolModal.agent.tip": "",
"addToolModal.agent.title": "Agent strategy は利用できません", "addToolModal.agent.title": "Agent strategy は利用できません",
"addToolModal.all.tip": "",
"addToolModal.all.title": "利用可能なツールはありません",
"addToolModal.built-in.tip": "",
"addToolModal.built-in.title": "利用可能な組み込みツールはありません",
"addToolModal.category": "カテゴリー", "addToolModal.category": "カテゴリー",
"addToolModal.custom.tip": "カスタムツールを作成する", "addToolModal.custom.tip": "カスタムツールを作成する",
"addToolModal.custom.title": "カスタムツールはありません", "addToolModal.custom.title": "カスタムツールはありません",
@ -34,6 +39,7 @@
"createTool.authMethod.type": "認証タイプ", "createTool.authMethod.type": "認証タイプ",
"createTool.authMethod.types.apiKeyPlaceholder": "API キーの HTTP ヘッダー名", "createTool.authMethod.types.apiKeyPlaceholder": "API キーの HTTP ヘッダー名",
"createTool.authMethod.types.apiValuePlaceholder": "API キーを入力してください", "createTool.authMethod.types.apiValuePlaceholder": "API キーを入力してください",
"createTool.authMethod.types.api_key": "API キー",
"createTool.authMethod.types.api_key_header": "ヘッダー", "createTool.authMethod.types.api_key_header": "ヘッダー",
"createTool.authMethod.types.api_key_query": "クエリパラメータ", "createTool.authMethod.types.api_key_query": "クエリパラメータ",
"createTool.authMethod.types.none": "なし", "createTool.authMethod.types.none": "なし",

View File

@ -4,6 +4,7 @@
"blocks.assigner": "変数代入", "blocks.assigner": "変数代入",
"blocks.code": "コード実行", "blocks.code": "コード実行",
"blocks.datasource": "データソース", "blocks.datasource": "データソース",
"blocks.datasource-empty": "空のデータソース",
"blocks.document-extractor": "テキスト抽出", "blocks.document-extractor": "テキスト抽出",
"blocks.end": "出力", "blocks.end": "出力",
"blocks.http-request": "HTTP リクエスト", "blocks.http-request": "HTTP リクエスト",
@ -22,6 +23,7 @@
"blocks.question-classifier": "質問分類器", "blocks.question-classifier": "質問分類器",
"blocks.start": "ユーザー入力", "blocks.start": "ユーザー入力",
"blocks.template-transform": "テンプレート", "blocks.template-transform": "テンプレート",
"blocks.tool": "ツール",
"blocks.trigger-plugin": "プラグイントリガー", "blocks.trigger-plugin": "プラグイントリガー",
"blocks.trigger-schedule": "スケジュールトリガー", "blocks.trigger-schedule": "スケジュールトリガー",
"blocks.trigger-webhook": "Webhook トリガー", "blocks.trigger-webhook": "Webhook トリガー",
@ -32,21 +34,25 @@
"blocksAbout.assigner": "書き込み可能な変数(例:会話変数)への値の割り当てを行います。", "blocksAbout.assigner": "書き込み可能な変数(例:会話変数)への値の割り当てを行います。",
"blocksAbout.code": "Python/NodeJS コードを実行してカスタムロジックを実装します。", "blocksAbout.code": "Python/NodeJS コードを実行してカスタムロジックを実装します。",
"blocksAbout.datasource": "データソースについて", "blocksAbout.datasource": "データソースについて",
"blocksAbout.datasource-empty": "空のデータソースのプレースホルダー",
"blocksAbout.document-extractor": "アップロード文書を LLM 処理用に最適化されたテキストに変換します。", "blocksAbout.document-extractor": "アップロード文書を LLM 処理用に最適化されたテキストに変換します。",
"blocksAbout.end": "ワークフローの出力と結果のタイプを定義します", "blocksAbout.end": "ワークフローの出力と結果のタイプを定義します",
"blocksAbout.http-request": "HTTP リクエストを送信できます。", "blocksAbout.http-request": "HTTP リクエストを送信できます。",
"blocksAbout.if-else": "if/else 条件でワークフローを 2 つの分岐に分割します。", "blocksAbout.if-else": "if/else 条件でワークフローを 2 つの分岐に分割します。",
"blocksAbout.iteration": "リスト要素に対して反復処理を実行し全結果を出力します。", "blocksAbout.iteration": "リスト要素に対して反復処理を実行し全結果を出力します。",
"blocksAbout.iteration-start": "反復開始ノード",
"blocksAbout.knowledge-index": "知識ベースについて", "blocksAbout.knowledge-index": "知識ベースについて",
"blocksAbout.knowledge-retrieval": "ナレッジベースからユーザー質問に関連するテキストを検索します。", "blocksAbout.knowledge-retrieval": "ナレッジベースからユーザー質問に関連するテキストを検索します。",
"blocksAbout.list-operator": "配列のフィルタリングやソート処理を行います。", "blocksAbout.list-operator": "配列のフィルタリングやソート処理を行います。",
"blocksAbout.llm": "大規模言語モデルを呼び出して質問回答や自然言語処理を実行します。", "blocksAbout.llm": "大規模言語モデルを呼び出して質問回答や自然言語処理を実行します。",
"blocksAbout.loop": "終了条件達成まで、または最大反復回数までロジックを繰り返します。", "blocksAbout.loop": "終了条件達成まで、または最大反復回数までロジックを繰り返します。",
"blocksAbout.loop-end": "「break」相当の機能です。このードに設定項目はなく、ループ処理中にこのードに到達すると即時終了します。", "blocksAbout.loop-end": "「break」相当の機能です。このードに設定項目はなく、ループ処理中にこのードに到達すると即時終了します。",
"blocksAbout.loop-start": "ループ開始ノード",
"blocksAbout.parameter-extractor": "自然言語から構造化パラメータを抽出し、後続処理で利用します。", "blocksAbout.parameter-extractor": "自然言語から構造化パラメータを抽出し、後続処理で利用します。",
"blocksAbout.question-classifier": "質問の分類条件を定義し、LLM が分類に基づいて対話フローを制御します。", "blocksAbout.question-classifier": "質問の分類条件を定義し、LLM が分類に基づいて対話フローを制御します。",
"blocksAbout.start": "ワークフロー開始時の初期パラメータを定義します。", "blocksAbout.start": "ワークフロー開始時の初期パラメータを定義します。",
"blocksAbout.template-transform": "Jinja テンプレート構文でデータを文字列に変換します。", "blocksAbout.template-transform": "Jinja テンプレート構文でデータを文字列に変換します。",
"blocksAbout.tool": "外部ツールを使用してワークフローの機能を拡張する",
"blocksAbout.trigger-plugin": "サードパーティ統合トリガー、外部プラットフォームのイベントによってワークフローを開始します", "blocksAbout.trigger-plugin": "サードパーティ統合トリガー、外部プラットフォームのイベントによってワークフローを開始します",
"blocksAbout.trigger-schedule": "スケジュールに基づいてワークフローを開始する時間ベースのトリガー", "blocksAbout.trigger-schedule": "スケジュールに基づいてワークフローを開始する時間ベースのトリガー",
"blocksAbout.trigger-webhook": "Webhook トリガーは第三者システムからの HTTP プッシュを受信してワークフローを自動的に開始します。", "blocksAbout.trigger-webhook": "Webhook トリガーは第三者システムからの HTTP プッシュを受信してワークフローを自動的に開始します。",
@ -507,6 +513,8 @@
"nodes.ifElse.comparisonOperator.in": "含まれている", "nodes.ifElse.comparisonOperator.in": "含まれている",
"nodes.ifElse.comparisonOperator.is": "である", "nodes.ifElse.comparisonOperator.is": "である",
"nodes.ifElse.comparisonOperator.is not": "でない", "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 contains": "含まない",
"nodes.ifElse.comparisonOperator.not empty": "空でない", "nodes.ifElse.comparisonOperator.not empty": "空でない",
"nodes.ifElse.comparisonOperator.not exists": "存在しません", "nodes.ifElse.comparisonOperator.not exists": "存在しません",
@ -971,6 +979,8 @@
"singleRun.startRun": "実行開始", "singleRun.startRun": "実行開始",
"singleRun.testRun": "テスト実行", "singleRun.testRun": "テスト実行",
"singleRun.testRunIteration": "テスト実行(イテレーション)", "singleRun.testRunIteration": "テスト実行(イテレーション)",
"singleRun.testRunLoop": "テスト実行ループ",
"tabs.-": "デフォルト",
"tabs.addAll": "すべてを追加する", "tabs.addAll": "すべてを追加する",
"tabs.agent": "エージェント戦略", "tabs.agent": "エージェント戦略",
"tabs.allAdded": "すべて追加されました", "tabs.allAdded": "すべて追加されました",

View File

@ -20,6 +20,7 @@
"plans.community.includesTitle": "免费功能:", "plans.community.includesTitle": "免费功能:",
"plans.community.name": "Community", "plans.community.name": "Community",
"plans.community.price": "免费", "plans.community.price": "免费",
"plans.community.priceTip": "",
"plans.enterprise.btnText": "联系销售", "plans.enterprise.btnText": "联系销售",
"plans.enterprise.description": "适合需要组织级安全性、合规性、可扩展性、控制和定制解决方案的企业", "plans.enterprise.description": "适合需要组织级安全性、合规性、可扩展性、控制和定制解决方案的企业",
"plans.enterprise.features": [ "plans.enterprise.features": [

View File

@ -247,6 +247,7 @@
"metadata.languageMap.no": "挪威语", "metadata.languageMap.no": "挪威语",
"metadata.languageMap.pl": "波兰语", "metadata.languageMap.pl": "波兰语",
"metadata.languageMap.pt": "葡萄牙语", "metadata.languageMap.pt": "葡萄牙语",
"metadata.languageMap.ro": "罗马尼亚语",
"metadata.languageMap.ru": "俄语", "metadata.languageMap.ru": "俄语",
"metadata.languageMap.sv": "瑞典语", "metadata.languageMap.sv": "瑞典语",
"metadata.languageMap.th": "泰语", "metadata.languageMap.th": "泰语",

View File

@ -89,6 +89,7 @@
"indexingMethod.full_text_search": "全文检索", "indexingMethod.full_text_search": "全文检索",
"indexingMethod.hybrid_search": "混合检索", "indexingMethod.hybrid_search": "混合检索",
"indexingMethod.invertedIndex": "倒排索引", "indexingMethod.invertedIndex": "倒排索引",
"indexingMethod.keyword_search": "关键词",
"indexingMethod.semantic_search": "向量检索", "indexingMethod.semantic_search": "向量检索",
"indexingTechnique.economy": "经济", "indexingTechnique.economy": "经济",
"indexingTechnique.high_quality": "高质量", "indexingTechnique.high_quality": "高质量",
@ -155,6 +156,8 @@
"retrieval.hybrid_search.description": "同时执行全文检索和向量检索,并应用重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果,用户可以选择设置权重或配置重新排序模型。", "retrieval.hybrid_search.description": "同时执行全文检索和向量检索,并应用重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果,用户可以选择设置权重或配置重新排序模型。",
"retrieval.hybrid_search.recommend": "推荐", "retrieval.hybrid_search.recommend": "推荐",
"retrieval.hybrid_search.title": "混合检索", "retrieval.hybrid_search.title": "混合检索",
"retrieval.invertedIndex.description": "倒排索引是一种用于高效检索的结构。按术语组织,每个术语指向包含它的文档或网页。",
"retrieval.invertedIndex.title": "倒排索引",
"retrieval.keyword_search.description": "倒排索引是一种用于高效检索的结构。按术语组织,每个术语指向包含它的文档或网页", "retrieval.keyword_search.description": "倒排索引是一种用于高效检索的结构。按术语组织,每个术语指向包含它的文档或网页",
"retrieval.keyword_search.title": "倒排索引", "retrieval.keyword_search.title": "倒排索引",
"retrieval.semantic_search.description": "通过生成查询嵌入并查询与其向量表示最相似的文本分段", "retrieval.semantic_search.description": "通过生成查询嵌入并查询与其向量表示最相似的文本分段",

View File

@ -12,6 +12,7 @@
"category.Entertainment": "娱乐", "category.Entertainment": "娱乐",
"category.HR": "人力资源", "category.HR": "人力资源",
"category.Programming": "编程", "category.Programming": "编程",
"category.Recommended": "推荐",
"category.Translate": "翻译", "category.Translate": "翻译",
"category.Workflow": "工作流", "category.Workflow": "工作流",
"category.Writing": "写作", "category.Writing": "写作",

View File

@ -1,6 +1,11 @@
{ {
"addToolModal.added": "已添加", "addToolModal.added": "已添加",
"addToolModal.agent.tip": "",
"addToolModal.agent.title": "没有可用的 agent 策略", "addToolModal.agent.title": "没有可用的 agent 策略",
"addToolModal.all.tip": "",
"addToolModal.all.title": "没有可用的工具",
"addToolModal.built-in.tip": "",
"addToolModal.built-in.title": "没有可用的内置工具",
"addToolModal.category": "类别", "addToolModal.category": "类别",
"addToolModal.custom.tip": "创建自定义工具", "addToolModal.custom.tip": "创建自定义工具",
"addToolModal.custom.title": "没有可用的自定义工具", "addToolModal.custom.title": "没有可用的自定义工具",
@ -34,6 +39,7 @@
"createTool.authMethod.type": "鉴权类型", "createTool.authMethod.type": "鉴权类型",
"createTool.authMethod.types.apiKeyPlaceholder": "HTTP 头部名称,用于传递 API Key", "createTool.authMethod.types.apiKeyPlaceholder": "HTTP 头部名称,用于传递 API Key",
"createTool.authMethod.types.apiValuePlaceholder": "输入 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_header": "请求头",
"createTool.authMethod.types.api_key_query": "查询参数", "createTool.authMethod.types.api_key_query": "查询参数",
"createTool.authMethod.types.none": "无", "createTool.authMethod.types.none": "无",

View File

@ -4,6 +4,7 @@
"blocks.assigner": "变量赋值", "blocks.assigner": "变量赋值",
"blocks.code": "代码执行", "blocks.code": "代码执行",
"blocks.datasource": "数据源", "blocks.datasource": "数据源",
"blocks.datasource-empty": "空数据源",
"blocks.document-extractor": "文档提取器", "blocks.document-extractor": "文档提取器",
"blocks.end": "输出", "blocks.end": "输出",
"blocks.http-request": "HTTP 请求", "blocks.http-request": "HTTP 请求",
@ -22,6 +23,7 @@
"blocks.question-classifier": "问题分类器", "blocks.question-classifier": "问题分类器",
"blocks.start": "用户输入", "blocks.start": "用户输入",
"blocks.template-transform": "模板转换", "blocks.template-transform": "模板转换",
"blocks.tool": "工具",
"blocks.trigger-plugin": "插件触发器", "blocks.trigger-plugin": "插件触发器",
"blocks.trigger-schedule": "定时触发器", "blocks.trigger-schedule": "定时触发器",
"blocks.trigger-webhook": "Webhook 触发器", "blocks.trigger-webhook": "Webhook 触发器",
@ -32,21 +34,25 @@
"blocksAbout.assigner": "变量赋值节点用于向可写入变量(例如会话变量)进行变量赋值。", "blocksAbout.assigner": "变量赋值节点用于向可写入变量(例如会话变量)进行变量赋值。",
"blocksAbout.code": "执行一段 Python 或 NodeJS 代码实现自定义逻辑", "blocksAbout.code": "执行一段 Python 或 NodeJS 代码实现自定义逻辑",
"blocksAbout.datasource": "数据源节点", "blocksAbout.datasource": "数据源节点",
"blocksAbout.datasource-empty": "空数据源占位符",
"blocksAbout.document-extractor": "用于将用户上传的文档解析为 LLM 便于理解的文本内容。", "blocksAbout.document-extractor": "用于将用户上传的文档解析为 LLM 便于理解的文本内容。",
"blocksAbout.end": "定义一个 workflow 流程的输出和结果类型", "blocksAbout.end": "定义一个 workflow 流程的输出和结果类型",
"blocksAbout.http-request": "允许通过 HTTP 协议发送服务器请求", "blocksAbout.http-request": "允许通过 HTTP 协议发送服务器请求",
"blocksAbout.if-else": "允许你根据 if/else 条件将 workflow 拆分成两个分支", "blocksAbout.if-else": "允许你根据 if/else 条件将 workflow 拆分成两个分支",
"blocksAbout.iteration": "对列表对象执行多次步骤直至输出所有结果。", "blocksAbout.iteration": "对列表对象执行多次步骤直至输出所有结果。",
"blocksAbout.iteration-start": "迭代开始节点",
"blocksAbout.knowledge-index": "知识库节点", "blocksAbout.knowledge-index": "知识库节点",
"blocksAbout.knowledge-retrieval": "允许你从知识库中查询与用户问题相关的文本内容", "blocksAbout.knowledge-retrieval": "允许你从知识库中查询与用户问题相关的文本内容",
"blocksAbout.list-operator": "用于过滤或排序数组内容。", "blocksAbout.list-operator": "用于过滤或排序数组内容。",
"blocksAbout.llm": "调用大语言模型回答问题或者对自然语言进行处理", "blocksAbout.llm": "调用大语言模型回答问题或者对自然语言进行处理",
"blocksAbout.loop": "循环执行一段逻辑直到满足结束条件或者到达循环次数上限。", "blocksAbout.loop": "循环执行一段逻辑直到满足结束条件或者到达循环次数上限。",
"blocksAbout.loop-end": "相当于“break”此节点没有配置项当循环体内运行到此节点后循环终止。", "blocksAbout.loop-end": "相当于 “break”此节点没有配置项当循环体内运行到此节点后循环终止。",
"blocksAbout.loop-start": "循环开始节点",
"blocksAbout.parameter-extractor": "利用 LLM 从自然语言内推理提取出结构化参数,用于后置的工具调用或 HTTP 请求。", "blocksAbout.parameter-extractor": "利用 LLM 从自然语言内推理提取出结构化参数,用于后置的工具调用或 HTTP 请求。",
"blocksAbout.question-classifier": "定义用户问题的分类条件LLM 能够根据分类描述定义对话的进展方式", "blocksAbout.question-classifier": "定义用户问题的分类条件LLM 能够根据分类描述定义对话的进展方式",
"blocksAbout.start": "定义一个 workflow 流程启动的初始参数", "blocksAbout.start": "定义一个 workflow 流程启动的初始参数",
"blocksAbout.template-transform": "使用 Jinja 模板语法将数据转换为字符串", "blocksAbout.template-transform": "使用 Jinja 模板语法将数据转换为字符串",
"blocksAbout.tool": "使用外部工具扩展工作流功能",
"blocksAbout.trigger-plugin": "从外部平台事件启动工作流的第三方集成触发器", "blocksAbout.trigger-plugin": "从外部平台事件启动工作流的第三方集成触发器",
"blocksAbout.trigger-schedule": "基于时间的工作流触发器,按计划启动工作流", "blocksAbout.trigger-schedule": "基于时间的工作流触发器,按计划启动工作流",
"blocksAbout.trigger-webhook": "Webhook 触发器接收来自第三方系统的 HTTP 推送以自动触发工作流。", "blocksAbout.trigger-webhook": "Webhook 触发器接收来自第三方系统的 HTTP 推送以自动触发工作流。",
@ -507,6 +513,8 @@
"nodes.ifElse.comparisonOperator.in": "在", "nodes.ifElse.comparisonOperator.in": "在",
"nodes.ifElse.comparisonOperator.is": "是", "nodes.ifElse.comparisonOperator.is": "是",
"nodes.ifElse.comparisonOperator.is not": "不是", "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 contains": "不包含",
"nodes.ifElse.comparisonOperator.not empty": "不为空", "nodes.ifElse.comparisonOperator.not empty": "不为空",
"nodes.ifElse.comparisonOperator.not exists": "不存在", "nodes.ifElse.comparisonOperator.not exists": "不存在",
@ -971,6 +979,8 @@
"singleRun.startRun": "开始运行", "singleRun.startRun": "开始运行",
"singleRun.testRun": "测试运行", "singleRun.testRun": "测试运行",
"singleRun.testRunIteration": "测试运行迭代", "singleRun.testRunIteration": "测试运行迭代",
"singleRun.testRunLoop": "测试运行循环",
"tabs.-": "默认",
"tabs.addAll": "添加全部", "tabs.addAll": "添加全部",
"tabs.agent": "Agent 策略", "tabs.agent": "Agent 策略",
"tabs.allAdded": "已添加全部", "tabs.allAdded": "已添加全部",

View File

@ -168,7 +168,7 @@ const config: KnipConfig = {
// ======================================================================== // ========================================================================
// 🔒 Utility scripts (not part of application runtime) // 🔒 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. // and are not imported by the application code.
'scripts/**', 'scripts/**',
'bin/**', 'bin/**',

View File

@ -33,8 +33,8 @@
"prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky ./web/.husky", "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", "gen-icons": "node ./app/components/base/icons/script.mjs",
"uglify-embed": "node ./bin/uglify-embed", "uglify-embed": "node ./bin/uglify-embed",
"check-i18n": "tsx ./i18n-config/check-i18n.js", "i18n:check": "tsx ./i18n-config/check-i18n.js",
"auto-gen-i18n": "tsx ./i18n-config/auto-gen-i18n.js", "i18n:gen": "tsx ./i18n-config/auto-gen-i18n.js",
"test": "vitest run", "test": "vitest run",
"test:coverage": "vitest run --coverage", "test:coverage": "vitest run --coverage",
"test:watch": "vitest --watch", "test:watch": "vitest --watch",