export type Language = 'en' | 'zh'; export const translations = { en: { // Header appTitle: 'NOFX', subtitle: 'Multi-AI Model Trading Platform', aiTraders: 'AI Traders', details: 'Details', tradingPanel: 'Trading Panel', competition: 'Competition', running: 'RUNNING', stopped: 'STOPPED', adminMode: 'Admin Mode', logout: 'Logout', switchTrader: 'Switch Trader:', view: 'View', // Footer footerTitle: 'NOFX - AI Trading System', footerWarning: '⚠️ Trading involves risk. Use at your own discretion.', // Stats Cards totalEquity: 'Total Equity', availableBalance: 'Available Balance', totalPnL: 'Total P&L', positions: 'Positions', margin: 'Margin', free: 'Free', // Positions Table currentPositions: 'Current Positions', active: 'Active', symbol: 'Symbol', side: 'Side', entryPrice: 'Entry Price', markPrice: 'Mark Price', quantity: 'Quantity', positionValue: 'Position Value', leverage: 'Leverage', unrealizedPnL: 'Unrealized P&L', liqPrice: 'Liq. Price', long: 'LONG', short: 'SHORT', noPositions: 'No Positions', noActivePositions: 'No active trading positions', // Recent Decisions recentDecisions: 'Recent Decisions', lastCycles: 'Last {count} trading cycles', noDecisionsYet: 'No Decisions Yet', aiDecisionsWillAppear: 'AI trading decisions will appear here', cycle: 'Cycle', success: 'Success', failed: 'Failed', inputPrompt: 'Input Prompt', aiThinking: 'AI Chain of Thought', collapse: 'Collapse', expand: 'Expand', // Equity Chart accountEquityCurve: 'Account Equity Curve', noHistoricalData: 'No Historical Data', dataWillAppear: 'Equity curve will appear after running a few cycles', initialBalance: 'Initial Balance', currentEquity: 'Current Equity', historicalCycles: 'Historical Cycles', displayRange: 'Display Range', recent: 'Recent', allData: 'All Data', cycles: 'Cycles', // Comparison Chart comparisonMode: 'Comparison Mode', dataPoints: 'Data Points', currentGap: 'Current Gap', count: '{count} pts', // Competition Page aiCompetition: 'AI Competition', traders: 'traders', liveBattle: 'Live Battle', realTimeBattle: 'Real-time Battle', leader: 'Leader', leaderboard: 'Leaderboard', live: 'LIVE', realTime: 'LIVE', performanceComparison: 'Performance Comparison', realTimePnL: 'Real-time PnL %', realTimePnLPercent: 'Real-time PnL %', headToHead: 'Head-to-Head Battle', leadingBy: 'Leading by {gap}%', behindBy: 'Behind by {gap}%', equity: 'Equity', pnl: 'P&L', pos: 'Pos', // AI Learning aiLearning: 'AI Learning & Reflection', tradesAnalyzed: '{count} trades analyzed · Real-time evolution', latestReflection: 'Latest Reflection', fullCoT: 'Full Chain of Thought', totalTrades: 'Total Trades', winRate: 'Win Rate', avgWin: 'Avg Win', avgLoss: 'Avg Loss', profitFactor: 'Profit Factor', avgWinDivLoss: 'Avg Win ÷ Avg Loss', excellent: '🔥 Excellent - Strong profitability', good: '✓ Good - Stable profits', fair: '⚠️ Fair - Needs optimization', poor: '❌ Poor - Losses exceed gains', bestPerformer: 'Best Performer', worstPerformer: 'Worst Performer', symbolPerformance: 'Symbol Performance', tradeHistory: 'Trade History', completedTrades: 'Recent {count} completed trades', noCompletedTrades: 'No completed trades yet', completedTradesWillAppear: 'Completed trades will appear here', entry: 'Entry', exit: 'Exit', stopLoss: 'Stop Loss', latest: 'Latest', // AI Learning Description howAILearns: 'How AI Learns & Evolves', aiLearningPoint1: 'Analyzes last 20 trading cycles before each decision', aiLearningPoint2: 'Identifies best & worst performing symbols', aiLearningPoint3: 'Optimizes position sizing based on win rate', aiLearningPoint4: 'Avoids repeating past mistakes', // AI Traders Management manageAITraders: 'Manage your AI trading bots', aiModels: 'AI Models', exchanges: 'Exchanges', createTrader: 'Create Trader', modelConfiguration: 'Model Configuration', configured: 'Configured', notConfigured: 'Not Configured', currentTraders: 'Current Traders', noTraders: 'No AI Traders', createFirstTrader: 'Create your first AI trader to get started', configureModelsFirst: 'Please configure AI models first', configureExchangesFirst: 'Please configure exchanges first', configureModelsAndExchangesFirst: 'Please configure AI models and exchanges first', modelNotConfigured: 'Selected model is not configured', exchangeNotConfigured: 'Selected exchange is not configured', confirmDeleteTrader: 'Are you sure you want to delete this trader?', status: 'Status', start: 'Start', stop: 'Stop', createNewTrader: 'Create New AI Trader', selectAIModel: 'Select AI Model', selectExchange: 'Select Exchange', traderName: 'Trader Name', enterTraderName: 'Enter trader name', cancel: 'Cancel', create: 'Create', configureAIModels: 'Configure AI Models', configureExchanges: 'Configure Exchanges', useTestnet: 'Use Testnet', enabled: 'Enabled', save: 'Save', // AI Model Configuration officialAPI: 'Official API', customAPI: 'Custom API', apiKey: 'API Key', customAPIURL: 'Custom API URL', enterAPIKey: 'Enter API Key', enterCustomAPIURL: 'Enter custom API endpoint URL', useOfficialAPI: 'Use official API service', useCustomAPI: 'Use custom API endpoint', // Exchange Configuration secretKey: 'Secret Key', privateKey: 'Private Key', walletAddress: 'Wallet Address', user: 'User', signer: 'Signer', passphrase: 'Passphrase', enterPrivateKey: 'Enter Private Key', enterWalletAddress: 'Enter Wallet Address', enterUser: 'Enter User', enterSigner: 'Enter Signer Address', enterSecretKey: 'Enter Secret Key', enterPassphrase: 'Enter Passphrase (Required for OKX)', hyperliquidPrivateKeyDesc: 'Hyperliquid uses private key for trading authentication', hyperliquidWalletAddressDesc: 'Wallet address corresponding to the private key', testnetDescription: 'Enable to connect to exchange test environment for simulated trading', securityWarning: 'Security Warning', saveConfiguration: 'Save Configuration', // Trader Configuration positionMode: 'Position Mode', crossMarginMode: 'Cross Margin', isolatedMarginMode: 'Isolated Margin', crossMarginDescription: 'Cross margin: All positions share account balance as collateral', isolatedMarginDescription: 'Isolated margin: Each position manages collateral independently, risk isolation', leverageConfiguration: 'Leverage Configuration', btcEthLeverage: 'BTC/ETH Leverage', altcoinLeverage: 'Altcoin Leverage', leverageRecommendation: 'Recommended: BTC/ETH 5-10x, Altcoins 3-5x for risk control', tradingSymbols: 'Trading Symbols', tradingSymbolsPlaceholder: 'Enter symbols, comma separated (e.g., BTCUSDT,ETHUSDT,SOLUSDT)', selectSymbols: 'Select Symbols', selectTradingSymbols: 'Select Trading Symbols', selectedSymbolsCount: 'Selected {count} symbols', clearSelection: 'Clear All', confirmSelection: 'Confirm', tradingSymbolsDescription: 'Empty = use default symbols. Must end with USDT (e.g., BTCUSDT, ETHUSDT)', btcEthLeverageValidation: 'BTC/ETH leverage must be between 1-50x', altcoinLeverageValidation: 'Altcoin leverage must be between 1-20x', invalidSymbolFormat: 'Invalid symbol format: {symbol}, must end with USDT', // Loading & Error loading: 'Loading...', loadingError: '⚠️ Failed to load AI learning data', noCompleteData: 'No complete trading data (needs to complete open → close cycle)', // AI Traders Page - Additional inUse: 'In Use', noModelsConfigured: 'No configured AI models', noExchangesConfigured: 'No configured exchanges', signalSource: 'Signal Source', signalSourceConfig: 'Signal Source Configuration', coinPoolDescription: 'API endpoint for coin pool data, leave blank to disable this signal source', oiTopDescription: 'API endpoint for open interest rankings, leave blank to disable this signal source', information: 'Information', signalSourceInfo1: '• Signal source configuration is per-user, each user can set their own URLs', signalSourceInfo2: '• When creating traders, you can choose whether to use these signal sources', signalSourceInfo3: '• Configured URLs will be used to fetch market data and trading signals', editAIModel: 'Edit AI Model', addAIModel: 'Add AI Model', confirmDeleteModel: 'Are you sure you want to delete this AI model configuration?', selectModel: 'Select AI Model', pleaseSelectModel: 'Please select a model', customBaseURL: 'Base URL (Optional)', customBaseURLPlaceholder: 'Custom API base URL, e.g.: https://api.openai.com/v1', leaveBlankForDefault: 'Leave blank to use default API address', modelConfigInfo1: '• API Key will be encrypted and stored, please ensure it is valid', modelConfigInfo2: '• Base URL is used for custom API server address', modelConfigInfo3: '• After deleting configuration, traders using this model will not work properly', saveConfig: 'Save Configuration', editExchange: 'Edit Exchange', addExchange: 'Add Exchange', confirmDeleteExchange: 'Are you sure you want to delete this exchange configuration?', pleaseSelectExchange: 'Please select an exchange', exchangeConfigWarning1: '• API keys will be encrypted, recommend using read-only or futures trading permissions', exchangeConfigWarning2: '• Do not grant withdrawal permissions to ensure fund security', exchangeConfigWarning3: '• After deleting configuration, related traders will not be able to trade', edit: 'Edit', // Error Messages createTraderFailed: 'Failed to create trader', getTraderConfigFailed: 'Failed to get trader configuration', modelConfigNotExist: 'Model configuration does not exist or is not enabled', exchangeConfigNotExist: 'Exchange configuration does not exist or is not enabled', updateTraderFailed: 'Failed to update trader', deleteTraderFailed: 'Failed to delete trader', operationFailed: 'Operation failed', deleteConfigFailed: 'Failed to delete configuration', modelNotExist: 'Model does not exist', saveConfigFailed: 'Failed to save configuration', exchangeNotExist: 'Exchange does not exist', deleteExchangeConfigFailed: 'Failed to delete exchange configuration', saveSignalSourceFailed: 'Failed to save signal source configuration', // Login & Register login: 'Sign In', register: 'Sign Up', email: 'Email', password: 'Password', confirmPassword: 'Confirm Password', emailPlaceholder: 'your@email.com', passwordPlaceholder: 'Enter your password', confirmPasswordPlaceholder: 'Re-enter your password', otpPlaceholder: '000000', loginTitle: 'Sign in to your account', registerTitle: 'Create a new account', loginButton: 'Sign In', registerButton: 'Sign Up', back: 'Back', noAccount: "Don't have an account?", hasAccount: 'Already have an account?', registerNow: 'Sign up now', loginNow: 'Sign in now', forgotPassword: 'Forgot password?', rememberMe: 'Remember me', otpCode: 'OTP Code', scanQRCode: 'Scan QR Code', enterOTPCode: 'Enter 6-digit OTP code', verifyOTP: 'Verify OTP', setupTwoFactor: 'Set up two-factor authentication', setupTwoFactorDesc: 'Follow the steps below to secure your account with Google Authenticator', scanQRCodeInstructions: 'Scan this QR code with Google Authenticator or Authy', otpSecret: 'Or enter this secret manually:', qrCodeHint: 'QR code (if scanning fails, use the secret below):', step1Title: 'Step 1: Install Google Authenticator', step1Desc: 'Download and install Google Authenticator from your app store', step2Title: 'Step 2: Add account', step2Desc: 'Tap "+", then choose "Scan QR code" or "Enter a setup key"', step3Title: 'Step 3: Verify setup', step3Desc: 'After setup, continue to enter the 6-digit code', setupCompleteContinue: 'I have completed setup, continue', copy: 'Copy', completeRegistration: 'Complete Registration', completeRegistrationSubtitle: 'to complete registration', loginSuccess: 'Login successful', registrationSuccess: 'Registration successful', loginFailed: 'Login failed', registrationFailed: 'Registration failed', verificationFailed: 'OTP verification failed', invalidCredentials: 'Invalid email or password', passwordMismatch: 'Passwords do not match', emailRequired: 'Email is required', passwordRequired: 'Password is required', invalidEmail: 'Invalid email format', passwordTooShort: 'Password must be at least 6 characters', }, zh: { // Header appTitle: 'NOFX', subtitle: '多AI模型交易平台', aiTraders: 'AI交易员', details: '详情', tradingPanel: '交易面板', competition: '竞赛', running: '运行中', stopped: '已停止', adminMode: '管理员模式', logout: '退出', switchTrader: '切换交易员:', view: '查看', // Footer footerTitle: 'NOFX - AI交易系统', footerWarning: '⚠️ 交易有风险,请谨慎使用。', // Stats Cards totalEquity: '总净值', availableBalance: '可用余额', totalPnL: '总盈亏', positions: '持仓', margin: '保证金', free: '空闲', // Positions Table currentPositions: '当前持仓', active: '活跃', symbol: '币种', side: '方向', entryPrice: '入场价', markPrice: '标记价', quantity: '数量', positionValue: '仓位价值', leverage: '杠杆', unrealizedPnL: '未实现盈亏', liqPrice: '强平价', long: '多头', short: '空头', noPositions: '无持仓', noActivePositions: '当前没有活跃的交易持仓', // Recent Decisions recentDecisions: '最近决策', lastCycles: '最近 {count} 个交易周期', noDecisionsYet: '暂无决策', aiDecisionsWillAppear: 'AI交易决策将显示在这里', cycle: '周期', success: '成功', failed: '失败', inputPrompt: '输入提示', aiThinking: '💭 AI思维链分析', collapse: '▼ 收起', expand: '▶ 展开', // Equity Chart accountEquityCurve: '账户净值曲线', noHistoricalData: '暂无历史数据', dataWillAppear: '运行几个周期后将显示收益率曲线', initialBalance: '初始余额', currentEquity: '当前净值', historicalCycles: '历史周期', displayRange: '显示范围', recent: '最近', allData: '全部数据', cycles: '个', // Comparison Chart comparisonMode: '对比模式', dataPoints: '数据点数', currentGap: '当前差距', count: '{count} 个', // Competition Page aiCompetition: 'AI竞赛', traders: '交易员', liveBattle: '实时对战', realTimeBattle: '实时对战', leader: '领先者', leaderboard: '排行榜', live: '实时', realTime: '实时', performanceComparison: '表现对比', realTimePnL: '实时收益率', realTimePnLPercent: '实时收益率', headToHead: '正面对决', leadingBy: '领先 {gap}%', behindBy: '落后 {gap}%', equity: '权益', pnl: '收益', pos: '持仓', // AI Learning aiLearning: 'AI学习与反思', tradesAnalyzed: '已分析 {count} 笔交易 · 实时演化', latestReflection: '最新反思', fullCoT: '📋 完整思维链', totalTrades: '总交易数', winRate: '胜率', avgWin: '平均盈利', avgLoss: '平均亏损', profitFactor: '盈亏比', avgWinDivLoss: '平均盈利 ÷ 平均亏损', excellent: '🔥 优秀 - 盈利能力强', good: '✓ 良好 - 稳定盈利', fair: '⚠️ 一般 - 需要优化', poor: '❌ 较差 - 亏损超过盈利', bestPerformer: '最佳表现', worstPerformer: '最差表现', symbolPerformance: '📊 币种表现', tradeHistory: '历史成交', completedTrades: '最近 {count} 笔已完成交易', noCompletedTrades: '暂无完成的交易', completedTradesWillAppear: '已完成的交易将显示在这里', entry: '入场', exit: '出场', stopLoss: '止损', latest: '最新', // AI Learning Description howAILearns: '💡 AI如何学习和进化', aiLearningPoint1: '每次决策前分析最近20个交易周期', aiLearningPoint2: '识别表现最好和最差的币种', aiLearningPoint3: '根据胜率优化仓位大小', aiLearningPoint4: '避免重复过去的错误', // AI Traders Management manageAITraders: '管理您的AI交易机器人', aiModels: 'AI模型', exchanges: '交易所', createTrader: '创建交易员', modelConfiguration: '模型配置', configured: '已配置', notConfigured: '未配置', currentTraders: '当前交易员', noTraders: '暂无AI交易员', createFirstTrader: '创建您的第一个AI交易员开始使用', configureModelsFirst: '请先配置AI模型', configureExchangesFirst: '请先配置交易所', configureModelsAndExchangesFirst: '请先配置AI模型和交易所', modelNotConfigured: '所选模型未配置', exchangeNotConfigured: '所选交易所未配置', confirmDeleteTrader: '确定要删除这个交易员吗?', status: '状态', start: '启动', stop: '停止', createNewTrader: '创建新的AI交易员', selectAIModel: '选择AI模型', selectExchange: '选择交易所', traderName: '交易员名称', enterTraderName: '输入交易员名称', cancel: '取消', create: '创建', configureAIModels: '配置AI模型', configureExchanges: '配置交易所', useTestnet: '使用测试网', enabled: '启用', save: '保存', // AI Model Configuration officialAPI: '官方API', customAPI: '自定义API', apiKey: 'API密钥', customAPIURL: '自定义API地址', enterAPIKey: '请输入API密钥', enterCustomAPIURL: '请输入自定义API端点地址', useOfficialAPI: '使用官方API服务', useCustomAPI: '使用自定义API端点', // Exchange Configuration secretKey: '密钥', privateKey: '私钥', walletAddress: '钱包地址', user: '用户名', signer: '签名者', passphrase: '口令', enterSecretKey: '输入密钥', enterPrivateKey: '输入私钥', enterWalletAddress: '输入钱包地址', enterUser: '输入用户名', enterSigner: '输入签名者地址', enterPassphrase: '输入Passphrase (OKX必填)', hyperliquidPrivateKeyDesc: 'Hyperliquid 使用私钥进行交易认证', hyperliquidWalletAddressDesc: '与私钥对应的钱包地址', testnetDescription: '启用后将连接到交易所测试环境,用于模拟交易', securityWarning: '安全提示', saveConfiguration: '保存配置', // Trader Configuration positionMode: '仓位模式', crossMarginMode: '全仓模式', isolatedMarginMode: '逐仓模式', crossMarginDescription: '全仓模式:所有仓位共享账户余额作为保证金', isolatedMarginDescription: '逐仓模式:每个仓位独立管理保证金,风险隔离', leverageConfiguration: '杠杆配置', btcEthLeverage: 'BTC/ETH杠杆', altcoinLeverage: '山寨币杠杆', leverageRecommendation: '推荐:BTC/ETH 5-10倍,山寨币 3-5倍,控制风险', tradingSymbols: '交易币种', tradingSymbolsPlaceholder: '输入币种,逗号分隔(如:BTCUSDT,ETHUSDT,SOLUSDT)', selectSymbols: '选择币种', selectTradingSymbols: '选择交易币种', selectedSymbolsCount: '已选择 {count} 个币种', clearSelection: '清空选择', confirmSelection: '确认选择', tradingSymbolsDescription: '留空 = 使用默认币种。必须以USDT结尾(如:BTCUSDT, ETHUSDT)', btcEthLeverageValidation: 'BTC/ETH杠杆必须在1-50倍之间', altcoinLeverageValidation: '山寨币杠杆必须在1-20倍之间', invalidSymbolFormat: '无效的币种格式:{symbol},必须以USDT结尾', // Loading & Error loading: '加载中...', loadingError: '⚠️ 加载AI学习数据失败', noCompleteData: '暂无完整交易数据(需要完成开仓→平仓的完整周期)', // AI Traders Page - Additional inUse: '正在使用', noModelsConfigured: '暂无已配置的AI模型', noExchangesConfigured: '暂无已配置的交易所', signalSource: '信号源', signalSourceConfig: '信号源配置', coinPoolDescription: '用于获取币种池数据的API地址,留空则不使用此信号源', oiTopDescription: '用于获取持仓量排行数据的API地址,留空则不使用此信号源', information: '说明', signalSourceInfo1: '• 信号源配置为用户级别,每个用户可以设置自己的信号源URL', signalSourceInfo2: '• 在创建交易员时可以选择是否使用这些信号源', signalSourceInfo3: '• 配置的URL将用于获取市场数据和交易信号', editAIModel: '编辑AI模型', addAIModel: '添加AI模型', confirmDeleteModel: '确定要删除此AI模型配置吗?', selectModel: '选择AI模型', pleaseSelectModel: '请选择模型', customBaseURL: 'Base URL (可选)', customBaseURLPlaceholder: '自定义API基础URL,如: https://api.openai.com/v1', leaveBlankForDefault: '留空则使用默认API地址', modelConfigInfo1: '• API Key将被加密存储,请确保密钥有效', modelConfigInfo2: '• Base URL用于自定义API服务器地址', modelConfigInfo3: '• 删除配置后,使用此模型的交易员将无法正常工作', saveConfig: '保存配置', editExchange: '编辑交易所', addExchange: '添加交易所', confirmDeleteExchange: '确定要删除此交易所配置吗?', pleaseSelectExchange: '请选择交易所', exchangeConfigWarning1: '• API密钥将被加密存储,建议使用只读或期货交易权限', exchangeConfigWarning2: '• 不要授予提现权限,确保资金安全', exchangeConfigWarning3: '• 删除配置后,相关交易员将无法正常交易', edit: '编辑', // Error Messages createTraderFailed: '创建交易员失败', getTraderConfigFailed: '获取交易员配置失败', modelConfigNotExist: 'AI模型配置不存在或未启用', exchangeConfigNotExist: '交易所配置不存在或未启用', updateTraderFailed: '更新交易员失败', deleteTraderFailed: '删除交易员失败', operationFailed: '操作失败', deleteConfigFailed: '删除配置失败', modelNotExist: '模型不存在', saveConfigFailed: '保存配置失败', exchangeNotExist: '交易所不存在', deleteExchangeConfigFailed: '删除交易所配置失败', saveSignalSourceFailed: '保存信号源配置失败', // Login & Register login: '登录', register: '注册', email: '邮箱', password: '密码', confirmPassword: '确认密码', emailPlaceholder: '请输入邮箱地址', passwordPlaceholder: '请输入密码(至少6位)', confirmPasswordPlaceholder: '请再次输入密码', otpPlaceholder: '000000', loginTitle: '登录到您的账户', registerTitle: '创建新账户', loginButton: '登录', registerButton: '注册', back: '返回', noAccount: '还没有账户?', hasAccount: '已有账户?', registerNow: '立即注册', loginNow: '立即登录', forgotPassword: '忘记密码?', rememberMe: '记住我', otpCode: 'OTP验证码', scanQRCode: '扫描二维码', enterOTPCode: '输入6位OTP验证码', verifyOTP: '验证OTP', setupTwoFactor: '设置双因素认证', setupTwoFactorDesc: '请按以下步骤设置Google验证器以保护您的账户安全', scanQRCodeInstructions: '使用Google Authenticator或Authy扫描此二维码', otpSecret: '或手动输入此密钥:', qrCodeHint: '二维码(如果无法扫描,请使用下方密钥):', step1Title: '步骤1:下载Google Authenticator', step1Desc: '在手机应用商店下载并安装Google Authenticator应用', step2Title: '步骤2:添加账户', step2Desc: '在应用中点击“+”,选择“扫描二维码”或“手动输入密钥”', step3Title: '步骤3:验证设置', step3Desc: '设置完成后,点击下方按钮输入6位验证码', setupCompleteContinue: '我已完成设置,继续', copy: '复制', completeRegistration: '完成注册', completeRegistrationSubtitle: '以完成注册', loginSuccess: '登录成功', registrationSuccess: '注册成功', loginFailed: '登录失败', registrationFailed: '注册失败', verificationFailed: 'OTP验证失败', invalidCredentials: '邮箱或密码错误', passwordMismatch: '两次输入的密码不一致', emailRequired: '请输入邮箱', passwordRequired: '请输入密码', invalidEmail: '邮箱格式不正确', passwordTooShort: '密码至少需要6个字符', } }; export function t(key: string, lang: Language, params?: Record): string { let text = translations[lang][key as keyof typeof translations['en']] || key; // Replace parameters like {count}, {gap}, etc. if (params) { Object.entries(params).forEach(([param, value]) => { text = text.replace(`{${param}}`, String(value)); }); } return text; }