feat(I18n) 添加I18n相关功能,支持中文和英文

This commit is contained in:
2025-12-19 17:53:10 +08:00
parent af49eb9747
commit 6f6dea9f03
9 changed files with 297 additions and 27 deletions

View File

@@ -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>