Implement internationalization support by adding translation functionality and updating UI components to use translated strings. Add language configuration in .env.example and integrate translations across various strategy and UI components.

This commit is contained in:
discountry
2025-12-09 00:35:28 +08:00
parent 03df1006cc
commit 85e7f245c0
17 changed files with 1166 additions and 295 deletions
+42 -20
View File
@@ -4,10 +4,11 @@ import { tradingConfig } from "../config";
import { getExchangeDisplayName, resolveExchangeId } from "../exchanges/create-adapter";
import { buildAdapterFromEnv } from "../exchanges/resolve-from-env";
import { TrendEngine, type TrendEngineSnapshot } from "../strategy/trend-engine";
import { formatNumber } from "../utils/format";
import { formatNumber, formatTrendLabel } from "../utils/format";
import { DataTable, type TableColumn } from "./components/DataTable";
import { t } from "../i18n";
const READY_MESSAGE = "正在等待交易所推送数据…";
const READY_MESSAGE = t("trend.readyMessage");
interface TrendAppProps {
onExit: () => void;
@@ -56,8 +57,8 @@ export function TrendApp({ onExit }: TrendAppProps) {
if (error) {
return (
<Box flexDirection="column" padding={1}>
<Text color="red">: {error.message}</Text>
<Text color="gray"></Text>
<Text color="red">{t("common.startFailed", { message: error.message })}</Text>
<Text color="gray">{t("common.checkEnv")}</Text>
</Box>
);
}
@@ -65,7 +66,7 @@ export function TrendApp({ onExit }: TrendAppProps) {
if (!snapshot) {
return (
<Box padding={1}>
<Text></Text>
<Text>{t("common.initializing", { target: t("trend.name") })}</Text>
</Box>
);
}
@@ -96,56 +97,77 @@ export function TrendApp({ onExit }: TrendAppProps) {
return (
<Box flexDirection="column" paddingX={1} paddingY={0}>
<Box flexDirection="column" marginBottom={1}>
<Text color="cyanBright">Trend Strategy Dashboard</Text>
<Text color="cyanBright">{t("trend.title")}</Text>
<Text>
: {exchangeName} : {snapshot.symbol} : {formatNumber(lastPrice, 2)} SMA30: {formatNumber(sma30, 2)} : {trend}
{t("trend.headerLine", {
exchange: exchangeName,
symbol: snapshot.symbol,
lastPrice: formatNumber(lastPrice, 2),
sma: formatNumber(sma30, 2),
trend: formatTrendLabel(trend),
})}
</Text>
<Text color="gray">
{t("trend.statusLine", { status: ready ? t("status.live") : READY_MESSAGE })}
</Text>
<Text color="gray">: {ready ? "实时运行" : READY_MESSAGE} Esc </Text>
</Box>
<Box flexDirection="row" marginBottom={1}>
<Box flexDirection="column" marginRight={4}>
<Text color="greenBright"></Text>
<Text color="greenBright">{t("common.section.position")}</Text>
{hasPosition ? (
<>
<Text>
: {position.positionAmt > 0 ? "多" : "空"} : {formatNumber(Math.abs(position.positionAmt), 4)} : {formatNumber(position.entryPrice, 2)}
{t("trend.positionLine", {
direction: position.positionAmt > 0 ? t("common.direction.long") : t("common.direction.short"),
qty: formatNumber(Math.abs(position.positionAmt), 4),
entry: formatNumber(position.entryPrice, 2),
})}
</Text>
<Text>
: {formatNumber(snapshot.pnl, 4)} USDT : {formatNumber(snapshot.unrealized, 4)} USDT
{t("trend.pnlLine", {
pnl: formatNumber(snapshot.pnl, 4),
unrealized: formatNumber(snapshot.unrealized, 4),
})}
</Text>
</>
) : (
<Text color="gray"></Text>
<Text color="gray">{t("common.noPosition")}</Text>
)}
</Box>
<Box flexDirection="column">
<Text color="greenBright"></Text>
<Text color="greenBright">{t("common.section.performance")}</Text>
<Text>
: {snapshot.totalTrades} : {formatNumber(snapshot.totalProfit, 4)} USDT
{t("trend.performanceLine", {
trades: snapshot.totalTrades,
profit: formatNumber(snapshot.totalProfit, 4),
})}
</Text>
<Text>
: {formatNumber(sessionVolume, 2)} USDT
{t("trend.volumeLine", { volume: formatNumber(sessionVolume, 2) })}
</Text>
{snapshot.lastOpenSignal.side ? (
<Text color="gray">
: {snapshot.lastOpenSignal.side} @ {formatNumber(snapshot.lastOpenSignal.price, 2)}
{t("trend.lastSignal", {
side: snapshot.lastOpenSignal.side,
price: formatNumber(snapshot.lastOpenSignal.price, 2),
})}
</Text>
) : null}
</Box>
</Box>
<Box flexDirection="column" marginBottom={1}>
<Text color="yellow"></Text>
<Text color="yellow">{t("common.section.orders")}</Text>
{orderRows.length > 0 ? (
<DataTable columns={orderColumns} rows={orderRows} />
) : (
<Text color="gray"></Text>
<Text color="gray">{t("common.noOrders")}</Text>
)}
</Box>
<Box flexDirection="column">
<Text color="yellow"></Text>
<Text color="yellow">{t("common.section.recentTrades")}</Text>
{lastLogs.length > 0 ? (
lastLogs.map((item, index) => (
<Text key={`${item.time}-${index}`}>
@@ -153,7 +175,7 @@ export function TrendApp({ onExit }: TrendAppProps) {
</Text>
))
) : (
<Text color="gray"></Text>
<Text color="gray">{t("common.noLogs")}</Text>
)}
</Box>
</Box>