diff --git a/web/src/components/TraderConfigModal.tsx b/web/src/components/TraderConfigModal.tsx index 328bf3ca..e2bdf8d6 100644 --- a/web/src/components/TraderConfigModal.tsx +++ b/web/src/components/TraderConfigModal.tsx @@ -125,7 +125,7 @@ export function TraderConfigModal({ const handleFetchCurrentBalance = async () => { if (!isEditMode || !traderData?.trader_id) { - setBalanceFetchError('只有在编辑模式下才能获取当前余额') + setBalanceFetchError(t('fetchBalanceEditModeOnly', language)) return } @@ -142,13 +142,13 @@ export function TraderConfigModal({ const currentBalance = result.data.total_equity || result.data.balance || 0 setFormData((prev) => ({ ...prev, initial_balance: currentBalance })) - toast.success('已获取当前余额') + toast.success(t('balanceFetched', language)) } else { - throw new Error(result.message || '获取余额失败') + throw new Error(result.message || t('balanceFetchFailed', language)) } } catch (error) { - console.error('获取余额失败:', error) - setBalanceFetchError('获取余额失败,请检查网络连接') + console.error(t('balanceFetchFailed', language) + ':', error) + setBalanceFetchError(t('balanceFetchNetworkError', language)) } finally { setIsFetchingBalance(false) } @@ -175,13 +175,13 @@ export function TraderConfigModal({ } await toast.promise(onSave(saveData), { - loading: '正在保存…', - success: '保存成功', - error: '保存失败', + loading: t('saving', language), + success: t('saveSuccess', language), + error: t('saveFailed', language), }) onClose() } catch (error) { - console.error('保存失败:', error) + console.error(t('saveFailed', language) + ':', error) } finally { setIsSaving(false) } @@ -208,10 +208,10 @@ export function TraderConfigModal({

- {isEditMode ? '修改交易员' : '创建交易员'} + {isEditMode ? t('editTrader', language) : t('createTrader', language)}

- {isEditMode ? '修改交易员配置' : '选择策略并配置基础参数'} + {isEditMode ? t('editTraderConfig', language) : t('selectStrategyAndConfigParams', language)}

@@ -231,12 +231,12 @@ export function TraderConfigModal({ {/* Basic Info */}

- 1 基础配置 + 1 {t('basicConfig', language)}

- 还没有交易所账号?点击注册 + {t('noExchangeAccount', language)} {regLink.hasReferral && ( - 折扣优惠 + {t('discount', language)} )} @@ -318,13 +318,13 @@ export function TraderConfigModal({ {/* Strategy Selection */}

- 2 选择交易策略 + 2 {t('selectTradingStrategy', language)}

{strategies.length === 0 && ( -

- 暂无策略,请先在策略工作室创建策略 +

+ {t('noStrategyHint', language)}

)}
@@ -354,25 +354,25 @@ export function TraderConfigModal({
- 策略详情 + {t('strategyDetails', language)} {selectedStrategy.is_active && ( - 激活中 + {t('activating', language)} )}

- {selectedStrategy.description || '无描述'} + {selectedStrategy.description || (language === 'zh' ? '无描述' : 'No description')}

- 币种来源: {selectedStrategy.config.coin_source.source_type === 'static' ? '固定币种' : + {t('coinSource', language)}: {selectedStrategy.config.coin_source.source_type === 'static' ? '固定币种' : selectedStrategy.config.coin_source.source_type === 'ai500' ? 'AI500' : selectedStrategy.config.coin_source.source_type === 'oi_top' ? 'OI Top' : '混合'}
- 保证金上限: {((selectedStrategy.config.risk_control?.max_margin_usage || 0.9) * 100).toFixed(0)}% + {t('marginLimit', language)}: {((selectedStrategy.config.risk_control?.max_margin_usage || 0.9) * 100).toFixed(0)}%
@@ -383,13 +383,13 @@ export function TraderConfigModal({ {/* Trading Parameters */}

- 3 交易参数 + 3 {t('tradingParams', language)}

@@ -446,7 +446,7 @@ export function TraderConfigModal({ {/* Competition visibility */}
-

- 隐藏后将不在竞技场页面显示此交易员 +

+ {t('hiddenInCompetition', language)}

@@ -482,7 +482,7 @@ export function TraderConfigModal({
-

- 用于手动更新初始余额基准(例如充值/提现后) +

+ {t('balanceUpdateHint', language)}

{balanceFetchError && (

@@ -535,7 +535,7 @@ export function TraderConfigModal({ - 系统将自动获取您的账户净值作为初始余额 + {t('autoFetchBalanceInfo', language)}

)} @@ -550,7 +550,7 @@ export function TraderConfigModal({ onClick={onClose} className="px-6 py-3 bg-[#2B3139] text-[#EAECEF] rounded-lg hover:bg-[#404750] transition-all duration-200 border border-[#404750]" > - 取消 + {t('cancel', language)} {onSave && ( )}
diff --git a/web/src/i18n/translations.ts b/web/src/i18n/translations.ts index 7d44356e..ed0d6cd4 100644 --- a/web/src/i18n/translations.ts +++ b/web/src/i18n/translations.ts @@ -319,6 +319,50 @@ export const translations = { enabled: 'Enabled', save: 'Save', + // TraderConfigModal - New keys for hardcoded Chinese strings + fetchBalanceEditModeOnly: 'Only can fetch current balance in edit mode', + balanceFetched: 'Current balance fetched', + balanceFetchFailed: 'Failed to fetch balance', + balanceFetchNetworkError: 'Failed to fetch balance, please check network connection', + saving: 'Saving...', + saveSuccess: 'Saved successfully', + saveFailed: 'Save failed', + editTraderConfig: 'Edit Trader Configuration', + selectStrategyAndConfigParams: 'Select Strategy and Configure Basic Parameters', + basicConfig: 'Basic Configuration', + traderNameRequired: 'Trader Name *', + enterTraderNamePlaceholder: 'Enter trader name', + aiModelRequired: 'AI Model *', + exchangeRequired: 'Exchange *', + noExchangeAccount: "Don't have an exchange account? Click to register", + discount: 'Discount', + selectTradingStrategy: 'Select Trading Strategy', + useStrategy: 'Use Strategy', + noStrategyManual: '-- No Strategy (Manual Configuration) --', + active: ' (Active)', + default: ' [Default]', + noStrategyHint: 'No strategies yet, please create in Strategy Studio first', + strategyDetails: 'Strategy Details', + activating: 'Activating', + coinSource: 'Coin Source', + marginLimit: 'Margin Limit', + tradingParams: 'Trading Parameters', + marginMode: 'Margin Mode', + crossMargin: 'Cross Margin', + isolatedMargin: 'Isolated Margin', + competitionDisplay: 'Show in Competition', + show: 'Show', + hide: 'Hide', + hiddenInCompetition: 'This trader will not be shown in the competition page when hidden', + initialBalanceLabel: 'Initial Balance ($)', + fetching: 'Fetching...', + fetchCurrentBalance: 'Fetch Current Balance', + balanceUpdateHint: 'Used to manually update the initial balance baseline (e.g., after deposit/withdrawal)', + autoFetchBalanceInfo: 'The system will automatically fetch your account equity as the initial balance', + fetchingBalance: 'Fetching balance...', + editTrader: 'Save Changes', + createTraderButton: 'Create Trader', + // AI Model Configuration officialAPI: 'Official API', customAPI: 'Custom API', @@ -1523,6 +1567,50 @@ export const translations = { enabled: '启用', save: '保存', + // TraderConfigModal - New keys for hardcoded Chinese strings + fetchBalanceEditModeOnly: '只有在编辑模式下才能获取当前余额', + balanceFetched: '已获取当前余额', + balanceFetchFailed: '获取余额失败', + balanceFetchNetworkError: '获取余额失败,请检查网络连接', + saving: '正在保存…', + saveSuccess: '保存成功', + saveFailed: '保存失败', + editTraderConfig: '修改交易员配置', + selectStrategyAndConfigParams: '选择策略并配置基础参数', + basicConfig: '基础配置', + traderNameRequired: '交易员名称 *', + enterTraderNamePlaceholder: '请输入交易员名称', + aiModelRequired: 'AI模型 *', + exchangeRequired: '交易所 *', + noExchangeAccount: '还没有交易所账号?点击注册', + discount: '折扣优惠', + selectTradingStrategy: '选择交易策略', + useStrategy: '使用策略', + noStrategyManual: '-- 不使用策略(手动配置) --', + active: ' (当前激活)', + default: ' [默认]', + noStrategyHint: '暂无策略,请先在策略工作室创建策略', + strategyDetails: '策略详情', + activating: '激活中', + coinSource: '币种来源', + marginLimit: '保证金上限', + tradingParams: '交易参数', + marginMode: '保证金模式', + crossMargin: '全仓', + isolatedMargin: '逐仓', + competitionDisplay: '竞技场显示', + show: '显示', + hide: '隐藏', + hiddenInCompetition: '隐藏后将不在竞技场页面显示此交易员', + initialBalanceLabel: '初始余额 ($)', + fetching: '获取中...', + fetchCurrentBalance: '获取当前余额', + balanceUpdateHint: '用于手动更新初始余额基准(例如充值/提现后)', + autoFetchBalanceInfo: '系统将自动获取您的账户净值作为初始余额', + fetchingBalance: '正在获取余额…', + editTrader: '保存修改', + createTraderButton: '创建交易员', + // AI Model Configuration officialAPI: '官方API', customAPI: '自定义API',