diff --git a/webui/src/i18n/index.ts b/webui/src/i18n/index.ts index d0b40d8..982a1ec 100644 --- a/webui/src/i18n/index.ts +++ b/webui/src/i18n/index.ts @@ -20,6 +20,14 @@ const resources = { sidebarOps: 'Operations', sidebarInsights: 'Insights', ekg: 'EKG', + ekgEscalations: 'Escalations', + ekgSourceStats: 'Source Stats', + ekgChannelStats: 'Channel Stats', + ekgTopProvidersWorkload: 'Top Providers (workload)', + ekgTopProvidersAll: 'Top Providers (all)', + ekgTopErrsigWorkload: 'Top Error Signatures (workload)', + ekgTopErrsigHeartbeat: 'Top Error Signatures (heartbeat)', + ekgTopErrsigAll: 'Top Error Signatures (all)', taskList: 'Task List', taskDetail: 'Task Detail', taskQueue: 'Task Queue', @@ -195,6 +203,14 @@ const resources = { sidebarOps: '运维', sidebarInsights: '洞察', ekg: 'EKG', + ekgEscalations: '升级拦截次数', + ekgSourceStats: '来源统计', + ekgChannelStats: '通道统计', + ekgTopProvidersWorkload: 'Top Providers(业务负载)', + ekgTopProvidersAll: 'Top Providers(全量)', + ekgTopErrsigWorkload: 'Top 错误签名(业务负载)', + ekgTopErrsigHeartbeat: 'Top 错误签名(心跳)', + ekgTopErrsigAll: 'Top 错误签名(全量)', taskList: '任务列表', taskDetail: '任务详情', taskQueue: '任务队列', diff --git a/webui/src/pages/EKG.tsx b/webui/src/pages/EKG.tsx index 3340e80..1678916 100644 --- a/webui/src/pages/EKG.tsx +++ b/webui/src/pages/EKG.tsx @@ -1,9 +1,11 @@ import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { useAppContext } from '../context/AppContext'; type EKGKV = { key?: string; score?: number; count?: number }; const EKG: React.FC = () => { + const { t } = useTranslation(); const { q } = useAppContext(); const [loading, setLoading] = useState(false); const [ekgWindow, setEkgWindow] = useState<'6h' | '24h' | '7d'>(() => { @@ -56,47 +58,47 @@ const EKG: React.FC = () => { - +
-
Escalations
+
{t('ekgEscalations')}
{escalationCount}
-
Source Stats
+
{t('ekgSourceStats')}
{Object.keys(sourceStats).length === 0 ?
-
: Object.entries(sourceStats).map(([k,v]) =>
{k}: {v}
)}
-
Channel Stats
+
{t('ekgChannelStats')}
{Object.keys(channelStats).length === 0 ?
-
: Object.entries(channelStats).map(([k,v]) =>
{k}: {v}
)}
-
Top Providers (workload)
+
{t('ekgTopProvidersWorkload')}
{providerTopWorkload.length === 0 ?
-
: providerTopWorkload.map((x,i)=>
{x.key} ({Number(x.score||0).toFixed(2)})
)}
-
Top Providers (all)
+
{t('ekgTopProvidersAll')}
{providerTop.length === 0 ?
-
: providerTop.map((x,i)=>
{x.key} ({Number(x.score||0).toFixed(2)})
)}
-
Top Error Signatures (workload)
+
{t('ekgTopErrsigWorkload')}
{errsigTopWorkload.length === 0 ?
-
: errsigTopWorkload.map((x,i)=>
{x.key} (x{x.count||0})
)}
-
Top Error Signatures (heartbeat)
+
{t('ekgTopErrsigHeartbeat')}
{errsigTopHeartbeat.length === 0 ?
-
: errsigTopHeartbeat.map((x,i)=>
{x.key} (x{x.count||0})
)}
-
Top Error Signatures (all)
+
{t('ekgTopErrsigAll')}
{errsigTop.length === 0 ?
-
: errsigTop.map((x,i)=>
{x.key} (x{x.count||0})
)}