From 5072a2eaa85e58efa3e7a8935c9f7562b075bcd5 Mon Sep 17 00:00:00 2001 From: ghostubborn Date: Wed, 1 Apr 2026 18:35:18 +0800 Subject: [PATCH] feat(i18n): replace Chinese UI text in Step4Report.vue render functions Only UI display text is replaced. Regex parsing patterns are kept as-is since they match the backend output format. --- frontend/src/components/Step4Report.vue | 80 ++++++++++++------------- locales/en.json | 34 ++++++++++- locales/zh.json | 34 ++++++++++- 3 files changed, 106 insertions(+), 42 deletions(-) diff --git a/frontend/src/components/Step4Report.vue b/frontend/src/components/Step4Report.vue index ee711352..6515ae1f 100644 --- a/frontend/src/components/Step4Report.vue +++ b/frontend/src/components/Step4Report.vue @@ -1006,7 +1006,7 @@ const InsightDisplay = { ]), props.result.query && h('div', { class: 'header-topic' }, props.result.query), props.result.simulationRequirement && h('div', { class: 'header-scenario' }, [ - h('span', { class: 'scenario-label' }, '预测场景: '), + h('span', { class: 'scenario-label' }, t('step4.scenarioLabel')), h('span', { class: 'scenario-text' }, props.result.simulationRequirement) ]) ]), @@ -1017,25 +1017,25 @@ const InsightDisplay = { class: ['insight-tab', { active: activeTab.value === 'facts' }], onClick: () => { activeTab.value = 'facts' } }, [ - h('span', { class: 'tab-label' }, `当前关键记忆 (${props.result.facts.length})`) + h('span', { class: 'tab-label' }, t('step4.tabKeyFacts', { count: props.result.facts.length })) ]), h('button', { class: ['insight-tab', { active: activeTab.value === 'entities' }], onClick: () => { activeTab.value = 'entities' } }, [ - h('span', { class: 'tab-label' }, `核心实体 (${props.result.entities.length})`) + h('span', { class: 'tab-label' }, t('step4.tabCoreEntities', { count: props.result.entities.length })) ]), h('button', { class: ['insight-tab', { active: activeTab.value === 'relations' }], onClick: () => { activeTab.value = 'relations' } }, [ - h('span', { class: 'tab-label' }, `关系链 (${props.result.relations.length})`) + h('span', { class: 'tab-label' }, t('step4.tabRelationChains', { count: props.result.relations.length })) ]), props.result.subQueries.length > 0 && h('button', { class: ['insight-tab', { active: activeTab.value === 'subqueries' }], onClick: () => { activeTab.value = 'subqueries' } }, [ - h('span', { class: 'tab-label' }, `子问题 (${props.result.subQueries.length})`) + h('span', { class: 'tab-label' }, t('step4.tabSubQueries', { count: props.result.subQueries.length })) ]) ]), @@ -1044,8 +1044,8 @@ const InsightDisplay = { // Facts Tab activeTab.value === 'facts' && props.result.facts.length > 0 && h('div', { class: 'facts-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '时序记忆中所关联的最新关键事实'), - h('span', { class: 'panel-count' }, `共 ${props.result.facts.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelKeyFacts')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.facts.length })) ]), h('div', { class: 'facts-list' }, (expandedFacts.value ? props.result.facts : props.result.facts.slice(0, INITIAL_SHOW_COUNT)).map((fact, i) => @@ -1064,15 +1064,15 @@ const InsightDisplay = { // Entities Tab activeTab.value === 'entities' && props.result.entities.length > 0 && h('div', { class: 'entities-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '核心实体'), - h('span', { class: 'panel-count' }, `共 ${props.result.entities.length} 个`) + h('span', { class: 'panel-title' }, t('step4.panelCoreEntities')), + h('span', { class: 'panel-count' }, t('step4.totalEntityCount', { count: props.result.entities.length })) ]), h('div', { class: 'entities-grid' }, (expandedEntities.value ? props.result.entities : props.result.entities.slice(0, 12)).map((entity, i) => h('div', { class: 'entity-tag', key: i, title: entity.summary || '' }, [ h('span', { class: 'entity-name' }, entity.name), h('span', { class: 'entity-type' }, entity.type), - entity.relatedFactsCount > 0 && h('span', { class: 'entity-fact-count' }, `${entity.relatedFactsCount}条`) + entity.relatedFactsCount > 0 && h('span', { class: 'entity-fact-count' }, t('step4.factCount', { count: entity.relatedFactsCount })) ]) ) ), @@ -1085,8 +1085,8 @@ const InsightDisplay = { // Relations Tab activeTab.value === 'relations' && props.result.relations.length > 0 && h('div', { class: 'relations-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '关系链'), - h('span', { class: 'panel-count' }, `共 ${props.result.relations.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelRelationChains')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.relations.length })) ]), h('div', { class: 'relations-list' }, (expandedRelations.value ? props.result.relations : props.result.relations.slice(0, INITIAL_SHOW_COUNT)).map((rel, i) => @@ -1110,8 +1110,8 @@ const InsightDisplay = { // Sub-queries Tab activeTab.value === 'subqueries' && props.result.subQueries.length > 0 && h('div', { class: 'subqueries-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '漂移查询生成分析子问题'), - h('span', { class: 'panel-count' }, `共 ${props.result.subQueries.length} 个`) + h('span', { class: 'panel-title' }, t('step4.panelSubQueries')), + h('span', { class: 'panel-count' }, t('step4.totalEntityCount', { count: props.result.subQueries.length })) ]), h('div', { class: 'subqueries-list' }, props.result.subQueries.map((sq, i) => @@ -1124,9 +1124,9 @@ const InsightDisplay = { ]), // Empty state - activeTab.value === 'facts' && props.result.facts.length === 0 && h('div', { class: 'empty-state' }, '暂无当前关键记忆'), - activeTab.value === 'entities' && props.result.entities.length === 0 && h('div', { class: 'empty-state' }, '暂无核心实体'), - activeTab.value === 'relations' && props.result.relations.length === 0 && h('div', { class: 'empty-state' }, '暂无关系链') + activeTab.value === 'facts' && props.result.facts.length === 0 && h('div', { class: 'empty-state' }, t('step4.emptyKeyFacts')), + activeTab.value === 'entities' && props.result.entities.length === 0 && h('div', { class: 'empty-state' }, t('step4.emptyCoreEntities')), + activeTab.value === 'relations' && props.result.relations.length === 0 && h('div', { class: 'empty-state' }, t('step4.emptyRelationChains')) ]) ]) } @@ -1180,19 +1180,19 @@ const PanoramaDisplay = { class: ['panorama-tab', { active: activeTab.value === 'active' }], onClick: () => { activeTab.value = 'active' } }, [ - h('span', { class: 'tab-label' }, `当前有效记忆 (${props.result.activeFacts.length})`) + h('span', { class: 'tab-label' }, t('step4.tabActiveFacts', { count: props.result.activeFacts.length })) ]), h('button', { class: ['panorama-tab', { active: activeTab.value === 'historical' }], onClick: () => { activeTab.value = 'historical' } }, [ - h('span', { class: 'tab-label' }, `历史记忆 (${props.result.historicalFacts.length})`) + h('span', { class: 'tab-label' }, t('step4.tabHistoricalFacts', { count: props.result.historicalFacts.length })) ]), h('button', { class: ['panorama-tab', { active: activeTab.value === 'entities' }], onClick: () => { activeTab.value = 'entities' } }, [ - h('span', { class: 'tab-label' }, `涉及实体 (${props.result.entities.length})`) + h('span', { class: 'tab-label' }, t('step4.tabEntities', { count: props.result.entities.length })) ]) ]), @@ -1201,8 +1201,8 @@ const PanoramaDisplay = { // Active Facts Tab activeTab.value === 'active' && h('div', { class: 'facts-panel active-facts' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '当前有效记忆'), - h('span', { class: 'panel-count' }, `共 ${props.result.activeFacts.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelActiveFacts')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.activeFacts.length })) ]), props.result.activeFacts.length > 0 ? h('div', { class: 'facts-list' }, (expandedActive.value ? props.result.activeFacts : props.result.activeFacts.slice(0, INITIAL_SHOW_COUNT)).map((fact, i) => @@ -1211,7 +1211,7 @@ const PanoramaDisplay = { h('div', { class: 'fact-content' }, fact) ]) ) - ) : h('div', { class: 'empty-state' }, '暂无当前有效记忆'), + ) : h('div', { class: 'empty-state' }, t('step4.emptyActiveFacts')), props.result.activeFacts.length > INITIAL_SHOW_COUNT && h('button', { class: 'expand-btn', onClick: () => { expandedActive.value = !expandedActive.value } @@ -1221,8 +1221,8 @@ const PanoramaDisplay = { // Historical Facts Tab activeTab.value === 'historical' && h('div', { class: 'facts-panel historical-facts' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '历史记忆'), - h('span', { class: 'panel-count' }, `共 ${props.result.historicalFacts.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelHistoricalFacts')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.historicalFacts.length })) ]), props.result.historicalFacts.length > 0 ? h('div', { class: 'facts-list' }, (expandedHistorical.value ? props.result.historicalFacts : props.result.historicalFacts.slice(0, INITIAL_SHOW_COUNT)).map((fact, i) => @@ -1243,7 +1243,7 @@ const PanoramaDisplay = { ]) ]) ) - ) : h('div', { class: 'empty-state' }, '暂无历史记忆'), + ) : h('div', { class: 'empty-state' }, t('step4.emptyHistoricalFacts')), props.result.historicalFacts.length > INITIAL_SHOW_COUNT && h('button', { class: 'expand-btn', onClick: () => { expandedHistorical.value = !expandedHistorical.value } @@ -1253,8 +1253,8 @@ const PanoramaDisplay = { // Entities Tab activeTab.value === 'entities' && h('div', { class: 'entities-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '涉及实体'), - h('span', { class: 'panel-count' }, `共 ${props.result.entities.length} 个`) + h('span', { class: 'panel-title' }, t('step4.panelEntities')), + h('span', { class: 'panel-count' }, t('step4.totalEntityCount', { count: props.result.entities.length })) ]), props.result.entities.length > 0 ? h('div', { class: 'entities-grid' }, (expandedEntities.value ? props.result.entities : props.result.entities.slice(0, 8)).map((entity, i) => @@ -1263,7 +1263,7 @@ const PanoramaDisplay = { entity.type && h('span', { class: 'entity-type' }, entity.type) ]) ) - ) : h('div', { class: 'empty-state' }, '暂无涉及实体'), + ) : h('div', { class: 'empty-state' }, t('step4.emptyEntities')), props.result.entities.length > 8 && h('button', { class: 'expand-btn', onClick: () => { expandedEntities.value = !expandedEntities.value } @@ -1615,7 +1615,7 @@ const QuickSearchDisplay = { ]) ]), props.result.query && h('div', { class: 'header-query' }, [ - h('span', { class: 'query-label' }, '搜索: '), + h('span', { class: 'query-label' }, t('step4.searchLabel')), h('span', { class: 'query-text' }, props.result.query) ]) ]), @@ -1626,19 +1626,19 @@ const QuickSearchDisplay = { class: ['quicksearch-tab', { active: activeTab.value === 'facts' }], onClick: () => { activeTab.value = 'facts' } }, [ - h('span', { class: 'tab-label' }, `事实 (${props.result.facts.length})`) + h('span', { class: 'tab-label' }, t('step4.tabFacts', { count: props.result.facts.length })) ]), hasEdges.value && h('button', { class: ['quicksearch-tab', { active: activeTab.value === 'edges' }], onClick: () => { activeTab.value = 'edges' } }, [ - h('span', { class: 'tab-label' }, `关系 (${props.result.edges.length})`) + h('span', { class: 'tab-label' }, t('step4.tabEdges', { count: props.result.edges.length })) ]), hasNodes.value && h('button', { class: ['quicksearch-tab', { active: activeTab.value === 'nodes' }], onClick: () => { activeTab.value = 'nodes' } }, [ - h('span', { class: 'tab-label' }, `节点 (${props.result.nodes.length})`) + h('span', { class: 'tab-label' }, t('step4.tabNodes', { count: props.result.nodes.length })) ]) ]), @@ -1647,8 +1647,8 @@ const QuickSearchDisplay = { // Facts (always show if no tabs, or when facts tab is active) ((!showTabs.value) || activeTab.value === 'facts') && h('div', { class: 'facts-panel' }, [ !showTabs.value && h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '搜索结果'), - h('span', { class: 'panel-count' }, `共 ${props.result.facts.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelSearchResults')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.facts.length })) ]), props.result.facts.length > 0 ? h('div', { class: 'facts-list' }, (expandedFacts.value ? props.result.facts : props.result.facts.slice(0, INITIAL_SHOW_COUNT)).map((fact, i) => @@ -1657,7 +1657,7 @@ const QuickSearchDisplay = { h('div', { class: 'fact-content' }, fact) ]) ) - ) : h('div', { class: 'empty-state' }, '未找到相关结果'), + ) : h('div', { class: 'empty-state' }, t('step4.emptySearchResults')), props.result.facts.length > INITIAL_SHOW_COUNT && h('button', { class: 'expand-btn', onClick: () => { expandedFacts.value = !expandedFacts.value } @@ -1667,8 +1667,8 @@ const QuickSearchDisplay = { // Edges Tab activeTab.value === 'edges' && hasEdges.value && h('div', { class: 'edges-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '相关关系'), - h('span', { class: 'panel-count' }, `共 ${props.result.edges.length} 条`) + h('span', { class: 'panel-title' }, t('step4.panelRelatedEdges')), + h('span', { class: 'panel-count' }, t('step4.totalCount', { count: props.result.edges.length })) ]), h('div', { class: 'edges-list' }, props.result.edges.map((edge, i) => @@ -1688,8 +1688,8 @@ const QuickSearchDisplay = { // Nodes Tab activeTab.value === 'nodes' && hasNodes.value && h('div', { class: 'nodes-panel' }, [ h('div', { class: 'panel-header' }, [ - h('span', { class: 'panel-title' }, '相关节点'), - h('span', { class: 'panel-count' }, `共 ${props.result.nodes.length} 个`) + h('span', { class: 'panel-title' }, t('step4.panelRelatedNodes')), + h('span', { class: 'panel-count' }, t('step4.totalEntityCount', { count: props.result.nodes.length })) ]), h('div', { class: 'nodes-grid' }, props.result.nodes.map((node, i) => diff --git a/locales/en.json b/locales/en.json index 1932ebcc..f7ff3ca7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -213,7 +213,39 @@ "waitingForReportAgent": "Waiting for Report Agent...", "collapse": "Collapse ▲", "expandAll": "Show all {count} ▼", - "expandAllEntities": "Show all {count} ▼" + "expandAllEntities": "Show all {count} ▼", + "scenarioLabel": "Scenario: ", + "tabKeyFacts": "Key Facts ({count})", + "tabCoreEntities": "Core Entities ({count})", + "tabRelationChains": "Relation Chains ({count})", + "tabSubQueries": "Sub-queries ({count})", + "panelKeyFacts": "Latest key facts from temporal memory", + "totalCount": "{count} total", + "totalEntityCount": "{count} total", + "panelCoreEntities": "Core Entities", + "factCount": "{count} facts", + "panelRelationChains": "Relation Chains", + "panelSubQueries": "Drift query analysis sub-questions", + "emptyKeyFacts": "No key facts available", + "emptyCoreEntities": "No core entities available", + "emptyRelationChains": "No relation chains available", + "tabActiveFacts": "Active Facts ({count})", + "tabHistoricalFacts": "Historical Facts ({count})", + "tabEntities": "Entities ({count})", + "panelActiveFacts": "Active Facts", + "emptyActiveFacts": "No active facts available", + "panelHistoricalFacts": "Historical Facts", + "emptyHistoricalFacts": "No historical facts available", + "panelEntities": "Entities", + "emptyEntities": "No entities available", + "searchLabel": "Search: ", + "tabFacts": "Facts ({count})", + "tabEdges": "Edges ({count})", + "tabNodes": "Nodes ({count})", + "panelSearchResults": "Search Results", + "emptySearchResults": "No results found", + "panelRelatedEdges": "Related Edges", + "panelRelatedNodes": "Related Nodes" }, "step5": { "interactiveTools": "Interactive Tools", diff --git a/locales/zh.json b/locales/zh.json index ff13ba5a..b6a0362a 100644 --- a/locales/zh.json +++ b/locales/zh.json @@ -213,7 +213,39 @@ "waitingForReportAgent": "Waiting for Report Agent...", "collapse": "收起 ▲", "expandAll": "展开全部 {count} 条 ▼", - "expandAllEntities": "展开全部 {count} 个 ▼" + "expandAllEntities": "展开全部 {count} 个 ▼", + "scenarioLabel": "预测场景: ", + "tabKeyFacts": "当前关键记忆 ({count})", + "tabCoreEntities": "核心实体 ({count})", + "tabRelationChains": "关系链 ({count})", + "tabSubQueries": "子问题 ({count})", + "panelKeyFacts": "时序记忆中所关联的最新关键事实", + "totalCount": "共 {count} 条", + "totalEntityCount": "共 {count} 个", + "panelCoreEntities": "核心实体", + "factCount": "{count}条", + "panelRelationChains": "关系链", + "panelSubQueries": "漂移查询生成分析子问题", + "emptyKeyFacts": "暂无当前关键记忆", + "emptyCoreEntities": "暂无核心实体", + "emptyRelationChains": "暂无关系链", + "tabActiveFacts": "当前有效记忆 ({count})", + "tabHistoricalFacts": "历史记忆 ({count})", + "tabEntities": "涉及实体 ({count})", + "panelActiveFacts": "当前有效记忆", + "emptyActiveFacts": "暂无当前有效记忆", + "panelHistoricalFacts": "历史记忆", + "emptyHistoricalFacts": "暂无历史记忆", + "panelEntities": "涉及实体", + "emptyEntities": "暂无涉及实体", + "searchLabel": "搜索: ", + "tabFacts": "事实 ({count})", + "tabEdges": "关系 ({count})", + "tabNodes": "节点 ({count})", + "panelSearchResults": "搜索结果", + "emptySearchResults": "未找到相关结果", + "panelRelatedEdges": "相关关系", + "panelRelatedNodes": "相关节点" }, "step5": { "interactiveTools": "Interactive Tools",