feat(I18n) 添加I18n相关功能,支持中文和英文
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { TEST_NODES, LatencyResult, getLatencyColor, getLatencyLevel } from '@shared/types'
|
||||
import { useLanguage } from '../contexts/LanguageContext'
|
||||
import './ResultsPanel.css'
|
||||
|
||||
interface ResultsPanelProps {
|
||||
@@ -8,6 +9,8 @@ interface ResultsPanelProps {
|
||||
}
|
||||
|
||||
export default function ResultsPanel({ results, selectedNodeId, onNodeSelect }: ResultsPanelProps) {
|
||||
const { t } = useLanguage()
|
||||
|
||||
if (results.size === 0) return null
|
||||
|
||||
const sortedNodes = [...TEST_NODES].sort((a, b) => {
|
||||
@@ -32,10 +35,20 @@ export default function ResultsPanel({ results, selectedNodeId, onNodeSelect }:
|
||||
)
|
||||
: null
|
||||
|
||||
const regionMap: Record<string, string> = {
|
||||
'North America': '北美',
|
||||
'Europe': '欧洲',
|
||||
'Asia': '亚洲',
|
||||
'Middle East': '中东',
|
||||
'South America': '南美',
|
||||
'Africa': '非洲',
|
||||
'Oceania': '大洋洲'
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="results-panel">
|
||||
<div className="results-header">
|
||||
<h2>Test Results</h2>
|
||||
<h2>{t('测试结果', 'Test Results')}</h2>
|
||||
<div className="results-header-right">
|
||||
<div className="latency-legend">
|
||||
<div className="legend-gradient"></div>
|
||||
@@ -50,7 +63,7 @@ export default function ResultsPanel({ results, selectedNodeId, onNodeSelect }:
|
||||
</div>
|
||||
{avgLatency !== null && (
|
||||
<div className="avg-latency">
|
||||
Avg: <span style={{ color: getLatencyColor(avgLatency) }}>{avgLatency}ms</span>
|
||||
{t('平均', 'Avg')}: <span style={{ color: getLatencyColor(avgLatency) }}>{avgLatency}ms</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -70,14 +83,14 @@ export default function ResultsPanel({ results, selectedNodeId, onNodeSelect }:
|
||||
className={`result-card ${hasResult ? getLatencyLevel(result?.latency ?? null) : ''} ${isSelected ? 'selected' : ''}`}
|
||||
onClick={() => onNodeSelect(isSelected ? null : node.id)}
|
||||
>
|
||||
<div className="result-region">{node.region}</div>
|
||||
<div className="result-region">{t(regionMap[node.region] || node.region, node.region)}</div>
|
||||
<div className="result-name">{node.name}</div>
|
||||
<div className="result-latency">
|
||||
{isTesting ? (
|
||||
<span className="testing-indicator">Testing...</span>
|
||||
<span className="testing-indicator">{t('测试中...', 'Testing...')}</span>
|
||||
) : hasResult ? (
|
||||
<span style={{ color: getLatencyColor(result?.latency ?? null) }}>
|
||||
{result?.latency !== null ? `${result.latency}ms` : 'Timeout'}
|
||||
{result?.latency !== null ? `${result.latency}ms` : t('超时', 'Timeout')}
|
||||
</span>
|
||||
) : (
|
||||
<span className="pending">—</span>
|
||||
|
||||
Reference in New Issue
Block a user