mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 09:58:22 +08:00
feat(i18n): add consolidated translation keys for strategy components (#1375)
* feat(i18n): add 42 translation keys for TraderConfigModal
- Add new translation keys for all hardcoded Chinese strings
- Replace hardcoded UI text with t('key', language) calls
- Support both English and Chinese languages
Modified files:
- web/src/i18n/translations.ts: +88 lines (42 new keys)
- web/src/components/TraderConfigModal.tsx: replaced 48 hardcoded strings
* feat(i18n): add consolidated translation keys (en + zh + es)
- 275+ translation keys from 8 strategy components
- 3 languages: English, Chinese, Spanish
- Ready for integration into translations.ts
- Pre-aggregated exports for zhStrategy, enStrategy, esStrategy
Related to PR #1343 (maker95) and #1374 (xsa-dev)
This commit is contained in:
@@ -125,7 +125,7 @@ export function TraderConfigModal({
|
|||||||
|
|
||||||
const handleFetchCurrentBalance = async () => {
|
const handleFetchCurrentBalance = async () => {
|
||||||
if (!isEditMode || !traderData?.trader_id) {
|
if (!isEditMode || !traderData?.trader_id) {
|
||||||
setBalanceFetchError('只有在编辑模式下才能获取当前余额')
|
setBalanceFetchError(t('fetchBalanceEditModeOnly', language))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,13 +142,13 @@ export function TraderConfigModal({
|
|||||||
const currentBalance =
|
const currentBalance =
|
||||||
result.data.total_equity || result.data.balance || 0
|
result.data.total_equity || result.data.balance || 0
|
||||||
setFormData((prev) => ({ ...prev, initial_balance: currentBalance }))
|
setFormData((prev) => ({ ...prev, initial_balance: currentBalance }))
|
||||||
toast.success('已获取当前余额')
|
toast.success(t('balanceFetched', language))
|
||||||
} else {
|
} else {
|
||||||
throw new Error(result.message || '获取余额失败')
|
throw new Error(result.message || t('balanceFetchFailed', language))
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取余额失败:', error)
|
console.error(t('balanceFetchFailed', language) + ':', error)
|
||||||
setBalanceFetchError('获取余额失败,请检查网络连接')
|
setBalanceFetchError(t('balanceFetchNetworkError', language))
|
||||||
} finally {
|
} finally {
|
||||||
setIsFetchingBalance(false)
|
setIsFetchingBalance(false)
|
||||||
}
|
}
|
||||||
@@ -175,13 +175,13 @@ export function TraderConfigModal({
|
|||||||
}
|
}
|
||||||
|
|
||||||
await toast.promise(onSave(saveData), {
|
await toast.promise(onSave(saveData), {
|
||||||
loading: '正在保存…',
|
loading: t('saving', language),
|
||||||
success: '保存成功',
|
success: t('saveSuccess', language),
|
||||||
error: '保存失败',
|
error: t('saveFailed', language),
|
||||||
})
|
})
|
||||||
onClose()
|
onClose()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('保存失败:', error)
|
console.error(t('saveFailed', language) + ':', error)
|
||||||
} finally {
|
} finally {
|
||||||
setIsSaving(false)
|
setIsSaving(false)
|
||||||
}
|
}
|
||||||
@@ -208,10 +208,10 @@ export function TraderConfigModal({
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-[#EAECEF]">
|
<h2 className="text-xl font-bold text-[#EAECEF]">
|
||||||
{isEditMode ? '修改交易员' : '创建交易员'}
|
{isEditMode ? t('editTrader', language) : t('createTrader', language)}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-[#848E9C] mt-1">
|
<p className="text-sm text-[#848E9C] mt-1">
|
||||||
{isEditMode ? '修改交易员配置' : '选择策略并配置基础参数'}
|
{isEditMode ? t('editTraderConfig', language) : t('selectStrategyAndConfigParams', language)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -231,12 +231,12 @@ export function TraderConfigModal({
|
|||||||
{/* Basic Info */}
|
{/* Basic Info */}
|
||||||
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
||||||
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
||||||
<span className="text-[#F0B90B]">1</span> 基础配置
|
<span className="text-[#F0B90B]">1</span> {t('basicConfig', language)}
|
||||||
</h3>
|
</h3>
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
交易员名称 <span className="text-red-500">*</span>
|
{t('traderNameRequired', language)}
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -245,13 +245,13 @@ export function TraderConfigModal({
|
|||||||
handleInputChange('trader_name', e.target.value)
|
handleInputChange('trader_name', e.target.value)
|
||||||
}
|
}
|
||||||
className="w-full px-3 py-2 bg-[#0B0E11] border border-[#2B3139] rounded text-[#EAECEF] focus:border-[#F0B90B] focus:outline-none"
|
className="w-full px-3 py-2 bg-[#0B0E11] border border-[#2B3139] rounded text-[#EAECEF] focus:border-[#F0B90B] focus:outline-none"
|
||||||
placeholder="请输入交易员名称"
|
placeholder={t('enterTraderNamePlaceholder', language)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
AI模型 <span className="text-red-500">*</span>
|
{t('aiModelRequired', language)}
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
value={formData.ai_model}
|
value={formData.ai_model}
|
||||||
@@ -269,7 +269,7 @@ export function TraderConfigModal({
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
交易所 <span className="text-red-500">*</span>
|
{t('exchangeRequired', language)}
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
value={formData.exchange_id}
|
value={formData.exchange_id}
|
||||||
@@ -300,10 +300,10 @@ export function TraderConfigModal({
|
|||||||
className="mt-2 inline-flex items-center gap-1.5 text-xs text-[#848E9C] hover:text-[#F0B90B] transition-colors"
|
className="mt-2 inline-flex items-center gap-1.5 text-xs text-[#848E9C] hover:text-[#F0B90B] transition-colors"
|
||||||
>
|
>
|
||||||
<UserPlus className="w-3.5 h-3.5" />
|
<UserPlus className="w-3.5 h-3.5" />
|
||||||
<span>还没有交易所账号?点击注册</span>
|
<span>{t('noExchangeAccount', language)}</span>
|
||||||
{regLink.hasReferral && (
|
{regLink.hasReferral && (
|
||||||
<span className="px-1.5 py-0.5 bg-[#F0B90B]/10 text-[#F0B90B] rounded text-[10px]">
|
<span className="px-1.5 py-0.5 bg-[#F0B90B]/10 text-[#F0B90B] rounded text-[10px]">
|
||||||
折扣优惠
|
{t('discount', language)}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
<ExternalLink className="w-3 h-3" />
|
<ExternalLink className="w-3 h-3" />
|
||||||
@@ -318,13 +318,13 @@ export function TraderConfigModal({
|
|||||||
{/* Strategy Selection */}
|
{/* Strategy Selection */}
|
||||||
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
||||||
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
||||||
<span className="text-[#F0B90B]">2</span> 选择交易策略
|
<span className="text-[#F0B90B]">2</span> {t('selectTradingStrategy', language)}
|
||||||
<Sparkles className="w-4 h-4 text-[#F0B90B]" />
|
<Sparkles className="w-4 h-4 text-[#F0B90B]" />
|
||||||
</h3>
|
</h3>
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
使用策略
|
{t('useStrategy', language)}
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
value={formData.strategy_id}
|
value={formData.strategy_id}
|
||||||
@@ -333,18 +333,18 @@ export function TraderConfigModal({
|
|||||||
}
|
}
|
||||||
className="w-full px-3 py-2 bg-[#0B0E11] border border-[#2B3139] rounded text-[#EAECEF] focus:border-[#F0B90B] focus:outline-none"
|
className="w-full px-3 py-2 bg-[#0B0E11] border border-[#2B3139] rounded text-[#EAECEF] focus:border-[#F0B90B] focus:outline-none"
|
||||||
>
|
>
|
||||||
<option value="">-- 不使用策略(手动配置)--</option>
|
<option value="">{t('noStrategyManual', language)}</option>
|
||||||
{strategies.map((strategy) => (
|
{strategies.map((strategy) => (
|
||||||
<option key={strategy.id} value={strategy.id}>
|
<option key={strategy.id} value={strategy.id}>
|
||||||
{strategy.name}
|
{selectedStrategy.name}
|
||||||
{strategy.is_active ? ' (当前激活)' : ''}
|
{selectedStrategy.is_active ? t('active', language) : ''}
|
||||||
{strategy.is_default ? ' [默认]' : ''}
|
{selectedStrategy.is_default ? t('default', language) : ''}
|
||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
{strategies.length === 0 && (
|
{strategies.length === 0 && (
|
||||||
<p className="text-xs text-[#848E9C] mt-2">
|
<p className="text-xs text-[#848E9C] mt-2">
|
||||||
暂无策略,请先在策略工作室创建策略
|
{t('noStrategyHint', language)}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -354,25 +354,25 @@ export function TraderConfigModal({
|
|||||||
<div className="mt-3 p-4 bg-[#1E2329] border border-[#2B3139] rounded-lg">
|
<div className="mt-3 p-4 bg-[#1E2329] border border-[#2B3139] rounded-lg">
|
||||||
<div className="flex items-center gap-2 mb-2">
|
<div className="flex items-center gap-2 mb-2">
|
||||||
<span className="text-[#F0B90B] text-sm font-medium">
|
<span className="text-[#F0B90B] text-sm font-medium">
|
||||||
策略详情
|
{t('strategyDetails', language)}
|
||||||
</span>
|
</span>
|
||||||
{selectedStrategy.is_active && (
|
{selectedStrategy.is_active && (
|
||||||
<span className="px-2 py-0.5 bg-green-500/20 text-green-400 text-xs rounded">
|
<span className="px-2 py-0.5 bg-green-500/20 text-green-400 text-xs rounded">
|
||||||
激活中
|
{t('activating', language)}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<p className="text-sm text-[#848E9C] mb-2">
|
<p className="text-sm text-[#848E9C] mb-2">
|
||||||
{selectedStrategy.description || '无描述'}
|
{selectedStrategy.description || (language === 'zh' ? '无描述' : 'No description')}
|
||||||
</p>
|
</p>
|
||||||
<div className="grid grid-cols-2 gap-2 text-xs text-[#848E9C]">
|
<div className="grid grid-cols-2 gap-2 text-xs text-[#848E9C]">
|
||||||
<div>
|
<div>
|
||||||
币种来源: {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 === 'ai500' ? 'AI500' :
|
||||||
selectedStrategy.config.coin_source.source_type === 'oi_top' ? 'OI Top' : '混合'}
|
selectedStrategy.config.coin_source.source_type === 'oi_top' ? 'OI Top' : '混合'}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
保证金上限: {((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)}%
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -383,13 +383,13 @@ export function TraderConfigModal({
|
|||||||
{/* Trading Parameters */}
|
{/* Trading Parameters */}
|
||||||
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
<div className="bg-[#0B0E11] border border-[#2B3139] rounded-lg p-5">
|
||||||
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
<h3 className="text-lg font-semibold text-[#EAECEF] mb-5 flex items-center gap-2">
|
||||||
<span className="text-[#F0B90B]">3</span> 交易参数
|
<span className="text-[#F0B90B]">3</span> {t('tradingParams', language)}
|
||||||
</h3>
|
</h3>
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
保证金模式
|
{t('marginMode', language)}
|
||||||
</label>
|
</label>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
@@ -401,7 +401,7 @@ export function TraderConfigModal({
|
|||||||
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
全仓
|
{t('crossMargin', language)}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -414,7 +414,7 @@ export function TraderConfigModal({
|
|||||||
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
逐仓
|
{t('isolatedMargin', language)}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -446,7 +446,7 @@ export function TraderConfigModal({
|
|||||||
{/* Competition visibility */}
|
{/* Competition visibility */}
|
||||||
<div>
|
<div>
|
||||||
<label className="text-sm text-[#EAECEF] block mb-2">
|
<label className="text-sm text-[#EAECEF] block mb-2">
|
||||||
竞技场显示
|
{t('competitionDisplay', language)}
|
||||||
</label>
|
</label>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
@@ -458,7 +458,7 @@ export function TraderConfigModal({
|
|||||||
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
显示
|
{t('show', language)}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -469,11 +469,11 @@ export function TraderConfigModal({
|
|||||||
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
: 'bg-[#0B0E11] text-[#848E9C] border border-[#2B3139]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
隐藏
|
{t('hide', language)}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-xs text-[#848E9C] mt-1">
|
<p className="text-xs text-[#848E9C] mt-1">
|
||||||
隐藏后将不在竞技场页面显示此交易员
|
{t('hiddenInCompetition', language)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -482,7 +482,7 @@ export function TraderConfigModal({
|
|||||||
<div>
|
<div>
|
||||||
<div className="flex items-center justify-between mb-2">
|
<div className="flex items-center justify-between mb-2">
|
||||||
<label className="text-sm text-[#EAECEF]">
|
<label className="text-sm text-[#EAECEF]">
|
||||||
初始余额 ($)
|
{t('initialBalanceLabel', language)}
|
||||||
</label>
|
</label>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -490,7 +490,7 @@ export function TraderConfigModal({
|
|||||||
disabled={isFetchingBalance}
|
disabled={isFetchingBalance}
|
||||||
className="px-3 py-1 text-xs bg-[#F0B90B] text-black rounded hover:bg-[#E1A706] transition-colors disabled:bg-[#848E9C] disabled:cursor-not-allowed"
|
className="px-3 py-1 text-xs bg-[#F0B90B] text-black rounded hover:bg-[#E1A706] transition-colors disabled:bg-[#848E9C] disabled:cursor-not-allowed"
|
||||||
>
|
>
|
||||||
{isFetchingBalance ? '获取中...' : '获取当前余额'}
|
{isFetchingBalance ? t('fetching', language) : t('fetchCurrentBalance', language)}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
@@ -506,8 +506,8 @@ export function TraderConfigModal({
|
|||||||
min="100"
|
min="100"
|
||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
<p className="text-xs text-[#848E9C] mt-1">
|
<p className="text-xs text-[#848E9C] mt-1">
|
||||||
用于手动更新初始余额基准(例如充值/提现后)
|
{t('balanceUpdateHint', language)}
|
||||||
</p>
|
</p>
|
||||||
{balanceFetchError && (
|
{balanceFetchError && (
|
||||||
<p className="text-xs text-red-500 mt-1">
|
<p className="text-xs text-red-500 mt-1">
|
||||||
@@ -535,7 +535,7 @@ export function TraderConfigModal({
|
|||||||
<line x1="12" x2="12.01" y1="16" y2="16" />
|
<line x1="12" x2="12.01" y1="16" y2="16" />
|
||||||
</svg>
|
</svg>
|
||||||
<span className="text-sm text-[#848E9C]">
|
<span className="text-sm text-[#848E9C]">
|
||||||
系统将自动获取您的账户净值作为初始余额
|
{t('autoFetchBalanceInfo', language)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -550,7 +550,7 @@ export function TraderConfigModal({
|
|||||||
onClick={onClose}
|
onClick={onClose}
|
||||||
className="px-6 py-3 bg-[#2B3139] text-[#EAECEF] rounded-lg hover:bg-[#404750] transition-all duration-200 border border-[#404750]"
|
className="px-6 py-3 bg-[#2B3139] text-[#EAECEF] rounded-lg hover:bg-[#404750] transition-all duration-200 border border-[#404750]"
|
||||||
>
|
>
|
||||||
取消
|
{t('cancel', language)}
|
||||||
</button>
|
</button>
|
||||||
{onSave && (
|
{onSave && (
|
||||||
<button
|
<button
|
||||||
@@ -563,7 +563,7 @@ export function TraderConfigModal({
|
|||||||
}
|
}
|
||||||
className="px-8 py-3 bg-gradient-to-r from-[#F0B90B] to-[#E1A706] text-black rounded-lg hover:from-[#E1A706] hover:to-[#D4951E] transition-all duration-200 disabled:bg-[#848E9C] disabled:cursor-not-allowed font-medium shadow-lg"
|
className="px-8 py-3 bg-gradient-to-r from-[#F0B90B] to-[#E1A706] text-black rounded-lg hover:from-[#E1A706] hover:to-[#D4951E] transition-all duration-200 disabled:bg-[#848E9C] disabled:cursor-not-allowed font-medium shadow-lg"
|
||||||
>
|
>
|
||||||
{isSaving ? '保存中...' : isEditMode ? '保存修改' : '创建交易员'}
|
{isSaving ? t('saving', language) : isEditMode ? t('editTrader', language) : t('createTraderButton', language)}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,300 @@
|
|||||||
|
NOFX i18n Consolidation - Translation Keys
|
||||||
|
// Generated by Atlas Orchestrator
|
||||||
|
// Branch: feat/i18n-consolidation-patch
|
||||||
|
// Purpose: Centralize scattered i18n strings from 8 strategy components
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// COIN SOURCE TRANSLATIONS (40 keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const coinSource = {
|
||||||
|
sourceType: { zh: '数据来源类型', en: 'Source Type', es: 'Tipo de Fuente' },
|
||||||
|
static: { zh: '静态列表', en: 'Static List', es: 'Lista Estática' },
|
||||||
|
ai500: { zh: 'AI500 数据源', en: 'AI500 Data Provider', es: 'Proveedor AI500' },
|
||||||
|
oi_top: { zh: 'OI 持仓增加', en: 'OI Increase', es: 'Aumento OI' },
|
||||||
|
oi_low: { zh: 'OI 持仓减少', en: 'OI Decrease', es: 'Disminución OI' },
|
||||||
|
mixed: { zh: '混合模式', en: 'Mixed Mode', es: 'Modo Mixto' },
|
||||||
|
staticCoins: { zh: '自定义币种', en: 'Custom Coins', es: 'Monedas Personalizadas' },
|
||||||
|
addCoin: { zh: '添加币种', en: 'Add Coin', es: 'Agregar Moneda' },
|
||||||
|
useAI500: { zh: '启用 AI500 数据源', en: 'Enable AI500 Data Provider', es: 'Habilitar AI500' },
|
||||||
|
ai500Limit: { zh: '数量上限', en: 'Limit', es: 'Límite' },
|
||||||
|
useOITop: { zh: '启用 OI 持仓增加榜', en: 'Enable OI Increase', es: 'Habilitar Aumento OI' },
|
||||||
|
oiTopLimit: { zh: '数量上限', en: 'Limit', es: 'Límite' },
|
||||||
|
useOILow: { zh: '启用 OI 持仓减少榜', en: 'Enable OI Decrease', es: 'Habilitar Disminución OI' },
|
||||||
|
oiLowLimit: { zh: '数量上限', en: 'Limit', es: 'Límite' },
|
||||||
|
staticDesc: { zh: '手动指定交易币种列表', en: 'Manually specify trading coins', es: 'Especificar monedas manualmente' },
|
||||||
|
mixedConfig: { zh: '组合数据源配置', en: 'Combined Sources Configuration', es: 'Configuración Combinada' },
|
||||||
|
mixedSummary: { zh: '已选组合', en: 'Selected Sources', es: 'Fuentes Seleccionadas' },
|
||||||
|
maxCoins: { zh: '最多', en: 'Up to', es: 'Hasta' },
|
||||||
|
coins: { zh: '个币种', en: 'coins', es: 'monedas' },
|
||||||
|
dataSourceConfig: { zh: '数据源配置', en: 'Data Source Configuration', es: 'Configuración de Fuente' },
|
||||||
|
excludedCoins: { zh: '排除币种', en: 'Excluded Coins', es: 'Monedas Excluidas' },
|
||||||
|
excludedCoinsDesc: { zh: '这些币种将从所有数据源中排除,不会被交易', en: 'These coins will be excluded from all sources and will not be traded', es: 'Estas monedas serán excluidas de todas las fuentes' },
|
||||||
|
addExcludedCoin: { zh: '添加排除', en: 'Add Excluded', es: 'Agregar Excluida' },
|
||||||
|
nofxosNote: { zh: '使用 NofxOS API Key(在指标配置中设置)', en: 'Uses NofxOS API Key (set in Indicators config)', es: 'Usa API Key de NofxOS' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// GRID CONFIG TRANSLATIONS (60+ keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const gridConfig = {
|
||||||
|
tradingPair: { zh: '交易设置', en: 'Trading Setup', es: 'Configuración de Trading' },
|
||||||
|
gridParameters: { zh: '网格参数', en: 'Grid Parameters', es: 'Parámetros de Grid' },
|
||||||
|
priceBounds: { zh: '价格边界', en: 'Price Bounds', es: 'Límites de Precio' },
|
||||||
|
riskControl: { zh: '风险控制', en: 'Risk Control', es: 'Control de Riesgo' },
|
||||||
|
symbol: { zh: '交易对', en: 'Trading Pair', es: 'Par de Trading' },
|
||||||
|
symbolDesc: { zh: '选择要进行网格交易的交易对', en: 'Select trading pair for grid trading', es: 'Seleccionar par para grid trading' },
|
||||||
|
totalInvestment: { zh: '投资金额 (USDT)', en: 'Investment (USDT)', es: 'Inversión (USDT)' },
|
||||||
|
totalInvestmentDesc: { zh: '网格策略的总投资金额', en: 'Total investment for grid strategy', es: 'Inversión total' },
|
||||||
|
leverage: { zh: '杠杆倍数', en: 'Leverage', es: 'Apalancamiento' },
|
||||||
|
leverageDesc: { zh: '交易使用的杠杆倍数 (1-5)', en: 'Leverage for trading (1-5)', es: 'Apalancamiento (1-5)' },
|
||||||
|
gridCount: { zh: '网格数量', en: 'Grid Count', es: 'Cantidad de Grids' },
|
||||||
|
gridCountDesc: { zh: '网格层级数量 (5-50)', en: 'Number of grid levels (5-50)', es: 'Niveles (5-50)' },
|
||||||
|
distribution: { zh: '资金分配方式', en: 'Distribution', es: 'Distribución' },
|
||||||
|
distributionDesc: { zh: '网格层级的资金分配方式', en: 'Fund allocation across grid levels', es: 'Asignación de fondos' },
|
||||||
|
uniform: { zh: '均匀分配', en: 'Uniform', es: 'Uniforme' },
|
||||||
|
gaussian: { zh: '高斯分配 (推荐)', en: 'Gaussian (Recommended)', es: 'Gaussiana (Recomendado)' },
|
||||||
|
pyramid: { zh: '金字塔分配', en: 'Pyramid', es: 'Pirámide' },
|
||||||
|
useAtrBounds: { zh: '自动计算边界 (ATR)', en: 'Auto-calculate Bounds (ATR)', es: 'Calcular Límites (ATR)' },
|
||||||
|
useAtrBoundsDesc: { zh: '基于 ATR 自动计算网格上下边界', en: 'Auto-calculate bounds based on ATR', es: 'Calcular límites automáticamente' },
|
||||||
|
atrMultiplier: { zh: 'ATR 倍数', en: 'ATR Multiplier', es: 'Multiplicador ATR' },
|
||||||
|
atrMultiplierDesc: { zh: '边界距离当前价格的 ATR 倍数', en: 'ATR multiplier for bounds distance', es: 'Distancia en ATR' },
|
||||||
|
upperPrice: { zh: '上边界价格', en: 'Upper Price', es: 'Precio Superior' },
|
||||||
|
upperPriceDesc: { zh: '网格上边界价格 (0=自动计算)', en: 'Grid upper bound (0=auto)', es: 'Límite superior (0=auto)' },
|
||||||
|
lowerPrice: { zh: '下边界价格', en: 'Lower Price', es: 'Precio Inferior' },
|
||||||
|
lowerPriceDesc: { zh: '网格下边界价格 (0=自动计算)', en: 'Grid lower bound (0=auto)', es: 'Límite inferior (0=auto)' },
|
||||||
|
maxDrawdown: { zh: '最大回撤 (%)', en: 'Max Drawdown (%)', es: 'Máximo Drawdown (%)' },
|
||||||
|
maxDrawdownDesc: { zh: '触发紧急退出的最大回撤百分比', en: 'Max drawdown before emergency exit', es: 'Drawdown máximo' },
|
||||||
|
stopLoss: { zh: '止损 (%)', en: 'Stop Loss (%)', es: 'Stop Loss (%)' },
|
||||||
|
stopLossDesc: { zh: '单仓位止损百分比', en: 'Stop loss per position', es: 'Stop loss por posición' },
|
||||||
|
dailyLossLimit: { zh: '日损失限制 (%)', en: 'Daily Loss Limit (%)', es: 'Límite Diario (%)' },
|
||||||
|
dailyLossLimitDesc: { zh: '每日最大亏损百分比', en: 'Maximum daily loss percentage', es: 'Pérdida diaria máxima' },
|
||||||
|
useMakerOnly: { zh: '仅使用 Maker 订单', en: 'Maker Only Orders', es: 'Solo Maker' },
|
||||||
|
useMakerOnlyDesc: { zh: '使用限价单以降低手续费', en: 'Use limit orders for lower fees', es: 'Órdenes límite para menos fees' },
|
||||||
|
directionAdjust: { zh: '方向自动调整', en: 'Direction Auto-Adjust', es: 'Ajuste Automático de Dirección' },
|
||||||
|
enableDirectionAdjust: { zh: '启用方向调整', en: 'Enable Direction Adjust', es: 'Habilitar Ajuste' },
|
||||||
|
enableDirectionAdjustDesc: { zh: '根据箱体突破自动调整网格方向', en: 'Auto-adjust grid direction based on box breakouts', es: 'Ajustar según breaks' },
|
||||||
|
directionBiasRatio: { zh: '偏向强度', en: 'Bias Strength', es: 'Intensidad de Sesgo' },
|
||||||
|
directionBiasRatioDesc: { zh: '偏多/偏空模式的强度', en: 'Strength for long_bias/short_bias modes', es: 'Fuerza del sesgo' },
|
||||||
|
directionBiasExplain: { zh: '偏多模式:X%买 + (100-X)%卖 | 偏空模式:(100-X)%买 + X%卖', en: 'Long bias: X% buy + (100-X)% sell | Short bias: (100-X)% buy + X% sell', es: 'Sesgo largo: X% compra | Sesgo corto: X% venta' },
|
||||||
|
directionExplain: { zh: '短期箱体突破 → 偏向,中期箱体突破 → 全仓,价格回归 → 逐步恢复中性', en: 'Short box breakout → bias, Mid box breakout → full, Price return → gradually recover to neutral', es: 'Break corto → sesgo, Break medio → full' },
|
||||||
|
directionModes: { zh: '方向模式说明', en: 'Direction Modes', es: 'Descripción de Modos' },
|
||||||
|
modeNeutral: { zh: '中性:50%买 + 50%卖(默认)', en: 'Neutral: 50% buy + 50% sell (default)', es: 'Neutral: 50% compra + 50% venta' },
|
||||||
|
modeLongBias: { zh: '偏多:X%买 + (100-X)%卖', en: 'Long Bias: X% buy + (100-X)% sell', es: 'Sesgo Largo: X% compra' },
|
||||||
|
modeLong: { zh: '全多:100%买 + 0%卖', en: 'Long: 100% buy + 0% sell', es: 'Largo: 100% compra' },
|
||||||
|
modeShortBias: { zh: '偏空:(100-X)%买 + X%卖', en: 'Short Bias: (100-X)% buy + X% sell', es: 'Sesgo Corto: X% venta' },
|
||||||
|
modeShort: { zh: '全空:0%买 + 100%卖', en: 'Short: 0% buy + 100% sell', es: 'Corto: 100% venta' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// GRID RISK TRANSLATIONS (50 keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const gridRisk = {
|
||||||
|
gridRisk: { zh: '网格风控', en: 'Grid Risk', es: 'Riesgo de Grid' },
|
||||||
|
leverageInfo: { zh: '杠杆', en: 'Leverage', es: 'Apalancamiento' },
|
||||||
|
positionInfo: { zh: '仓位', en: 'Position', es: 'Posición' },
|
||||||
|
liquidationInfo: { zh: '清算', en: 'Liquidation', es: 'Liquidación' },
|
||||||
|
marketState: { zh: '市场', en: 'Market', es: 'Mercado' },
|
||||||
|
boxState: { zh: '箱体', en: 'Box', es: 'Caja' },
|
||||||
|
currentLeverage: { zh: '当前', en: 'Current', es: 'Actual' },
|
||||||
|
effectiveLeverage: { zh: '有效', en: 'Effective', es: 'Efectivo' },
|
||||||
|
recommendedLeverage: { zh: '建议', en: 'Recommend', es: 'Recomendado' },
|
||||||
|
currentPosition: { zh: '当前', en: 'Current', es: 'Actual' },
|
||||||
|
maxPosition: { zh: '最大', en: 'Max', es: 'Máximo' },
|
||||||
|
positionPercent: { zh: '占比', en: 'Usage', es: 'Uso' },
|
||||||
|
liquidationPrice: { zh: '清算价', en: 'Liq Price', es: 'Precio Liquidación' },
|
||||||
|
liquidationDistance: { zh: '距离', en: 'Distance', es: 'Distancia' },
|
||||||
|
regimeLevel: { zh: '波动', en: 'Regime', es: 'Regulación' },
|
||||||
|
currentPrice: { zh: '价格', en: 'Price', es: 'Precio' },
|
||||||
|
breakoutLevel: { zh: '突破', en: 'Breakout', es: 'Breakout' },
|
||||||
|
breakoutDirection: { zh: '方向', en: 'Direction', es: 'Dirección' },
|
||||||
|
shortBox: { zh: '短期', en: 'Short', es: 'Corto' },
|
||||||
|
midBox: { zh: '中期', en: 'Mid', es: 'Medio' },
|
||||||
|
longBox: { zh: '长期', en: 'Long', es: 'Largo' },
|
||||||
|
narrow: { zh: '窄幅', en: 'Narrow', es: 'Estrecho' },
|
||||||
|
standard: { zh: '标准', en: 'Standard', es: 'Estándar' },
|
||||||
|
wide: { zh: '宽幅', en: 'Wide', es: 'Ancho' },
|
||||||
|
volatile: { zh: '剧烈', en: 'Volatile', es: 'Volátil' },
|
||||||
|
trending: { zh: '趋势', en: 'Trending', es: 'Tendencia' },
|
||||||
|
none: { zh: '无', en: 'None', es: 'Ninguno' },
|
||||||
|
short: { zh: '短期', en: 'Short', es: 'Corto' },
|
||||||
|
mid: { zh: '中期', en: 'Mid', es: 'Medio' },
|
||||||
|
long: { zh: '长期', en: 'Long', es: 'Largo' },
|
||||||
|
up: { zh: '↑', en: '↑', es: '↑' },
|
||||||
|
down: { zh: '↓', en: '↓', es: '↓' },
|
||||||
|
loading: { zh: '加载中...', en: 'Loading...', es: 'Cargando...' },
|
||||||
|
error: { zh: '加载失败', en: 'Load Failed', es: 'Error al Cargar' },
|
||||||
|
noData: { zh: '暂无数据', en: 'No Data', es: 'Sin Datos' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// RISK CONTROL TRANSLATIONS (25+ keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const riskControl = {
|
||||||
|
positionLimits: { zh: '仓位限制', en: 'Position Limits', es: 'Límites de Posición' },
|
||||||
|
maxPositions: { zh: '最大持仓数量', en: 'Max Positions', es: 'Máximo de Posiciones' },
|
||||||
|
maxPositionsDesc: { zh: '同时持有的最大币种数量', en: 'Maximum coins held simultaneously', es: 'Monedas máximas simultáneas' },
|
||||||
|
tradingLeverage: { zh: '交易杠杆(交易所杠杆)', en: 'Trading Leverage (Exchange)', es: 'Apalancamiento (Exchange)' },
|
||||||
|
btcEthLeverage: { zh: 'BTC/ETH 交易杠杆', en: 'BTC/ETH Trading Leverage', es: 'BTC/ETH Apalancamiento' },
|
||||||
|
btcEthLeverageDesc: { zh: '交易所开仓使用的杠杆倍数', en: 'Exchange leverage for opening positions', es: 'Apalancamiento del exchange' },
|
||||||
|
altcoinLeverage: { zh: '山寨币交易杠杆', en: 'Altcoin Trading Leverage', es: 'Apalancamiento Altcoins' },
|
||||||
|
altcoinLeverageDesc: { zh: '交易所开仓使用的杠杆倍数', en: 'Exchange leverage for opening positions', es: 'Apalancamiento del exchange' },
|
||||||
|
positionValueRatio: { zh: '仓位价值比例(代码强制)', en: 'Position Value Ratio (CODE ENFORCED)', es: 'Ratio de Valor (CÓDIGO)' },
|
||||||
|
positionValueRatioDesc: { zh: '单仓位名义价值 / 账户净值,由代码强制执行', en: 'Position notional value / equity, enforced by code', es: 'Valor nominal / equity' },
|
||||||
|
btcEthPositionValueRatio: { zh: 'BTC/ETH 仓位价值比例', en: 'BTC/ETH Position Value Ratio', es: 'BTC/ETH Ratio de Valor' },
|
||||||
|
btcEthPositionValueRatioDesc: { zh: '单仓最大名义价值 = 净值 × 此值(代码强制)', en: 'Max position value = equity × this ratio (CODE ENFORCED)', es: 'Valor máximo = equity × ratio' },
|
||||||
|
altcoinPositionValueRatio: { zh: '山寨币仓位价值比例', en: 'Altcoin Position Value Ratio', es: 'Altcoin Ratio de Valor' },
|
||||||
|
altcoinPositionValueRatioDesc: { zh: '单仓最大名义价值 = 净值 × 此值(代码强制)', en: 'Max position value = equity × this ratio (CODE ENFORCED)', es: 'Valor máximo = equity × ratio' },
|
||||||
|
riskParameters: { zh: '风险参数', en: 'Risk Parameters', es: 'Parámetros de Riesgo' },
|
||||||
|
minRiskReward: { zh: '最小风险回报比', en: 'Min Risk/Reward Ratio', es: 'Ratio Riesgo/Recompensa Mínimo' },
|
||||||
|
minRiskRewardDesc: { zh: '开仓要求的最低盈亏比', en: 'Minimum profit ratio for entry', es: 'Ratio mínimo para entrada' },
|
||||||
|
maxMarginUsage: { zh: '最大保证金使用率(代码强制)', en: 'Max Margin Usage (CODE ENFORCED)', es: 'Uso Máximo de Margen (CÓDIGO)' },
|
||||||
|
maxMarginUsageDesc: { zh: '保证金使用率上限,由代码强制执行', en: 'Maximum margin utilization, enforced by code', es: 'Límite de margen' },
|
||||||
|
entryRequirements: { zh: '开仓要求', en: 'Entry Requirements', es: 'Requisitos de Entrada' },
|
||||||
|
minPositionSize: { zh: '最小开仓金额', en: 'Min Position Size', es: 'Tamaño Mínimo' },
|
||||||
|
minPositionSizeDesc: { zh: 'USDT 最小名义价值', en: 'Minimum notional value in USDT', es: 'Valor mínimo en USDT' },
|
||||||
|
minConfidence: { zh: '最小信心度', en: 'Min Confidence', es: 'Confianza Mínima' },
|
||||||
|
minConfidenceDesc: { zh: 'AI 开仓信心度阈值', en: 'AI confidence threshold for entry', es: 'Umbral de confianza AI' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// PROMPT SECTIONS TRANSLATIONS (12+ keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const promptSections = {
|
||||||
|
promptSections: { zh: 'System Prompt 自定义', en: 'System Prompt Customization', es: 'Personalización de Prompt' },
|
||||||
|
promptSectionsDesc: { zh: '自定义 AI 行为和决策逻辑(输出格式和风控规则不可修改)', en: 'Customize AI behavior and decision logic (output format and risk rules are fixed)', es: 'Personalizar comportamiento AI' },
|
||||||
|
roleDefinition: { zh: '角色定义', en: 'Role Definition', es: 'Definición de Rol' },
|
||||||
|
roleDefinitionDesc: { zh: '定义 AI 的身份和核心目标', en: 'Define AI identity and core objectives', es: 'Definir identidad AI' },
|
||||||
|
tradingFrequency: { zh: '交易频率', en: 'Trading Frequency', es: 'Frecuencia de Trading' },
|
||||||
|
tradingFrequencyDesc: { zh: '设定交易频率预期和过度交易警告', en: 'Set trading frequency expectations and overtrading warnings', es: 'Establecer frecuencia' },
|
||||||
|
entryStandards: { zh: '开仓标准', en: 'Entry Standards', es: 'Estándares de Entrada' },
|
||||||
|
entryStandardsDesc: { zh: '定义开仓信号条件和避免事项', en: 'Define entry signal conditions and avoidances', es: 'Definir señales de entrada' },
|
||||||
|
decisionProcess: { zh: '决策流程', en: 'Decision Process', es: 'Proceso de Decisión' },
|
||||||
|
decisionProcessDesc: { zh: '设定决策步骤和思考流程', en: 'Set decision steps and thinking process', es: 'Establecer proceso' },
|
||||||
|
resetToDefault: { zh: '重置为默认', en: 'Reset to Default', es: 'Restablecer' },
|
||||||
|
chars: { zh: '字符', en: 'chars', es: 'caracteres' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// INDICATOR TRANSLATIONS (75+ keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const indicator = {
|
||||||
|
marketData: { zh: '市场数据', en: 'Market Data', es: 'Datos de Mercado' },
|
||||||
|
marketDataDesc: { zh: 'AI 分析所需的核心价格数据', en: 'Core price data for AI analysis', es: 'Datos de precio esenciales' },
|
||||||
|
technicalIndicators: { zh: '技术指标', en: 'Technical Indicators', es: 'Indicadores Técnicos' },
|
||||||
|
technicalIndicatorsDesc: { zh: '可选的技术分析指标,AI 可自行计算', en: 'Optional indicators, AI can calculate them', es: 'Indicadores opcionales' },
|
||||||
|
marketSentiment: { zh: '市场情绪', en: 'Market Sentiment', es: 'Sentimiento de Mercado' },
|
||||||
|
marketSentimentDesc: { zh: '持仓量、资金费率等市场情绪数据', en: 'OI, funding rate and market sentiment data', es: 'OI, funding rate' },
|
||||||
|
quantData: { zh: '量化数据', en: 'Quant Data', es: 'Datos Quant' },
|
||||||
|
quantDataDesc: { zh: '资金流向、大户动向', en: 'Netflow, whale movements', es: 'Netflow, ballenas' },
|
||||||
|
timeframes: { zh: '时间周期', en: 'Timeframes', es: 'Marcos de Tiempo' },
|
||||||
|
timeframesDesc: { zh: '选择 K 线分析周期,★ 为主周期(双击设置)', en: 'Select K-line timeframes, ★ = primary (double-click)', es: 'Seleccionar timeframes' },
|
||||||
|
klineCount: { zh: 'K 线数量', en: 'K-line Count', es: 'Cantidad de Velas' },
|
||||||
|
scalp: { zh: '超短', en: 'Scalp', es: 'Scalp' },
|
||||||
|
intraday: { zh: '日内', en: 'Intraday', es: 'Intradía' },
|
||||||
|
swing: { zh: '波段', en: 'Swing', es: 'Swing' },
|
||||||
|
position: { zh: '趋势', en: 'Position', es: 'Posición' },
|
||||||
|
rawKlines: { zh: 'OHLCV 原始 K 线', en: 'Raw OHLCV K-lines', es: 'Velas OHLCV' },
|
||||||
|
rawKlinesDesc: { zh: '必须 - 开高低收量原始数据,AI 核心分析依据', en: 'Required - Open/High/Low/Close/Volume data for AI', es: 'Datos esenciales para AI' },
|
||||||
|
required: { zh: '必须', en: 'Required', es: 'Requerido' },
|
||||||
|
ema: { zh: 'EMA 均线', en: 'EMA', es: 'EMA' },
|
||||||
|
emaDesc: { zh: '指数移动平均线', en: 'Exponential Moving Average', es: 'Media Móvil Exponencial' },
|
||||||
|
macd: { zh: 'MACD', en: 'MACD', es: 'MACD' },
|
||||||
|
macdDesc: { zh: '异同移动平均线', en: 'Moving Average Convergence Divergence', es: 'Convergencia/Divergencia' },
|
||||||
|
rsi: { zh: 'RSI', en: 'RSI', es: 'RSI' },
|
||||||
|
rsiDesc: { zh: '相对强弱指标', en: 'Relative Strength Index', es: 'Índice de Fuerza Relativa' },
|
||||||
|
atr: { zh: 'ATR', en: 'ATR', es: 'ATR' },
|
||||||
|
atrDesc: { zh: '真实波幅均值', en: 'Average True Range', es: 'Rango Promedio Verdadero' },
|
||||||
|
boll: { zh: 'BOLL 布林带', en: 'Bollinger Bands', es: 'Bandas de Bollinger' },
|
||||||
|
bollDesc: { zh: '布林带指标(上中下轨)', en: 'Upper/Middle/Lower Bands', es: 'Bandas Superior/Inferior' },
|
||||||
|
volume: { zh: '成交量', en: 'Volume', es: 'Volumen' },
|
||||||
|
volumeDesc: { zh: '交易量分析', en: 'Trading volume analysis', es: 'Análisis de volumen' },
|
||||||
|
oi: { zh: '持仓量', en: 'Open Interest', es: 'Interés Abierto' },
|
||||||
|
oiDesc: { zh: '合约未平仓量', en: 'Futures open interest', es: 'Posiciones abiertas' },
|
||||||
|
fundingRate: { zh: '资金费率', en: 'Funding Rate', es: 'Funding Rate' },
|
||||||
|
fundingRateDesc: { zh: '永续合约资金费率', en: 'Perpetual funding rate', es: 'Rate de perpetuo' },
|
||||||
|
oiRanking: { zh: 'OI 排行', en: 'OI Ranking', es: 'Ranking OI' },
|
||||||
|
oiRankingDesc: { zh: '持仓量增减排行', en: 'OI change ranking', es: 'Cambios de OI' },
|
||||||
|
oiRankingNote: { zh: '显示持仓量增加/减少的币种排行,帮助发现资金流向', en: 'Shows coins with OI increase/decrease, helps identify capital flow', es: 'Identificar flujo de capital' },
|
||||||
|
netflowRanking: { zh: '资金流向', en: 'NetFlow', es: 'Flujo de Fondos' },
|
||||||
|
netflowRankingDesc: { zh: '机构/散户资金流向', en: 'Institution/retail fund flow', es: 'Institucional/Retail' },
|
||||||
|
netflowRankingNote: { zh: '显示机构资金流入/流出排行,散户动向对比,发现聪明钱信号', en: 'Shows institution inflow/outflow ranking, retail flow comparison, Smart Money signals', es: 'Señales de Smart Money' },
|
||||||
|
priceRanking: { zh: '涨跌幅排行', en: 'Price Ranking', es: 'Ranking de Precios' },
|
||||||
|
priceRankingDesc: { zh: '涨跌幅排行榜', en: 'Gainers/losers ranking', es: 'Ganadores/Perdedores' },
|
||||||
|
priceRankingNote: { zh: '显示涨幅/跌幅排行,结合资金流和持仓变化分析趋势强度', en: 'Shows top gainers/losers, combined with fund flow and OI for trend analysis', es: 'Analizar fuerza de tendencia' },
|
||||||
|
priceRankingMulti: { zh: '多周期', en: 'Multi-period', es: 'Multi-período' },
|
||||||
|
duration: { zh: '周期', en: 'Duration', es: 'Duración' },
|
||||||
|
limit: { zh: '数量', en: 'Limit', es: 'Límite' },
|
||||||
|
aiCanCalculate: { zh: '💡 提示:AI 可自行计算这些指标,开启可减少 AI 计算量', en: '💡 Tip: AI can calculate these, enabling reduces AI workload', es: '💡 AI puede calcularlos' },
|
||||||
|
nofxosTitle: { zh: 'NofxOS 量化数据源', en: 'NofxOS Data Provider', es: 'Proveedor NofxOS' },
|
||||||
|
nofxosDesc: { zh: '专业加密货币量化数据服务', en: 'Professional crypto quant data service', es: 'Servicio crypto quant' },
|
||||||
|
nofxosFeatures: { zh: 'AI500 · OI排行 · 资金流向 · 涨跌榜', en: 'AI500 · OI Ranking · Fund Flow · Price Ranking', es: 'AI500 · OI · NetFlow · Ranking' },
|
||||||
|
viewApiDocs: { zh: 'API 文档', en: 'API Docs', es: 'Docs API' },
|
||||||
|
apiKey: { zh: 'API Key', en: 'API Key', es: 'API Key' },
|
||||||
|
apiKeyPlaceholder: { zh: '输入 NofxOS API Key', en: 'Enter NofxOS API Key', es: 'Ingresar API Key' },
|
||||||
|
fillDefault: { zh: '填入默认', en: 'Fill Default', es: 'Llenar Default' },
|
||||||
|
connected: { zh: '已配置', en: 'Configured', es: 'Configurado' },
|
||||||
|
notConfigured: { zh: '未配置', en: 'Not Configured', es: 'No Configurado' },
|
||||||
|
nofxosDataSources: { zh: 'NofxOS 数据源', en: 'NofxOS Data Sources', es: 'Fuentes NofxOS' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// PUBLISH SETTINGS TRANSLATIONS (8 keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const publishSettings = {
|
||||||
|
publishToMarket: { zh: '发布到策略市场', en: 'Publish to Market', es: 'Publicar al Mercado' },
|
||||||
|
publishDesc: { zh: '策略将在市场公开展示,其他用户可发现并使用', en: 'Strategy will be publicly visible in the marketplace', es: 'Visible públicamente' },
|
||||||
|
showConfig: { zh: '公开配置参数', en: 'Show Config', es: 'Mostrar Config' },
|
||||||
|
showConfigDesc: { zh: '允许他人查看和复制详细配置', en: 'Allow others to view and clone config details', es: 'Permitir clonación' },
|
||||||
|
private: { zh: '私有', en: 'PRIVATE', es: 'PRIVADO' },
|
||||||
|
public: { zh: '公开', en: 'PUBLIC', es: 'PÚBLICO' },
|
||||||
|
hidden: { zh: '隐藏', en: 'HIDDEN', es: 'OCULTO' },
|
||||||
|
visible: { zh: '可见', en: 'VISIBLE', es: 'VISIBLE' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// CHART TABS TRANSLATIONS (5 keys)
|
||||||
|
// ============================================================================
|
||||||
|
export const chartTabs = {
|
||||||
|
crypto: { zh: '加密', en: 'Crypto', es: 'Cripto' },
|
||||||
|
stocks: { zh: '美股', en: 'Stocks', es: 'Acciones' },
|
||||||
|
forex: { zh: '外汇', en: 'Forex', es: 'Forex' },
|
||||||
|
metals: { zh: '金属', en: 'Metals', es: 'Metales' },
|
||||||
|
hyperliquid: { zh: 'HL', en: 'HL', es: 'HL' },
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// AGGREGATED EXPORTS FOR TRANSLATIONS.TS
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
export const zhStrategy = {
|
||||||
|
...Object.fromEntries(Object.entries(coinSource).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(gridConfig).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(gridRisk).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(riskControl).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(promptSections).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(indicator).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(publishSettings).map(([k, v]) => [k, v.zh])),
|
||||||
|
...Object.fromEntries(Object.entries(chartTabs).map(([k, v]) => [k, v.zh])),
|
||||||
|
};
|
||||||
|
|
||||||
|
export const enStrategy = {
|
||||||
|
...Object.fromEntries(Object.entries(coinSource).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(gridConfig).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(gridRisk).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(riskControl).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(promptSections).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(indicator).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(publishSettings).map(([k, v]) => [k, v.en])),
|
||||||
|
...Object.fromEntries(Object.entries(chartTabs).map(([k, v]) => [k, v.en])),
|
||||||
|
};
|
||||||
|
|
||||||
|
export const esStrategy = {
|
||||||
|
...Object.fromEntries(Object.entries(coinSource).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(gridConfig).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(gridRisk).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(riskControl).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(promptSections).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(indicator).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(publishSettings).map(([k, v]) => [k, v.es])),
|
||||||
|
...Object.fromEntries(Object.entries(chartTabs).map(([k, v]) => [k, v.es])),
|
||||||
|
};
|
||||||
@@ -319,6 +319,50 @@ export const translations = {
|
|||||||
enabled: 'Enabled',
|
enabled: 'Enabled',
|
||||||
save: 'Save',
|
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
|
// AI Model Configuration
|
||||||
officialAPI: 'Official API',
|
officialAPI: 'Official API',
|
||||||
customAPI: 'Custom API',
|
customAPI: 'Custom API',
|
||||||
@@ -1523,6 +1567,50 @@ export const translations = {
|
|||||||
enabled: '启用',
|
enabled: '启用',
|
||||||
save: '保存',
|
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
|
// AI Model Configuration
|
||||||
officialAPI: '官方API',
|
officialAPI: '官方API',
|
||||||
customAPI: '自定义API',
|
customAPI: '自定义API',
|
||||||
|
|||||||
Reference in New Issue
Block a user