V2.2.1: Membership & Billing, USDT TRC20 payment, VIP free indicators, AI Trading Radar, simplified strategy creation, system settings simplification, bug fixes and UI improvements

This commit is contained in:
TIANHE
2026-02-27 01:57:04 +08:00
parent ae82cc0d4e
commit ffdd2ffbae
71 changed files with 4067 additions and 6073 deletions
+172 -12
View File
@@ -17,6 +17,8 @@ const locale = {
'common.add': 'Add',
'common.close': 'Close',
'common.ok': 'OK',
'common.loading': 'Loading...',
'common.noData': 'No data',
'submit': 'Submit',
'save': 'Save',
'submit.ok': 'Submit successfully',
@@ -25,6 +27,7 @@ const locale = {
'menu.home': 'Home',
'menu.dashboard': 'Dashboard',
'menu.dashboard.analysis': 'AI Analysis',
'menu.dashboard.aiAssetAnalysis': 'AI Asset Analysis',
'menu.dashboard.aiQuant': 'AI Quant',
'menu.dashboard.indicator': 'Indicator Analysis',
'menu.dashboard.community': 'Indicator Market',
@@ -36,6 +39,76 @@ const locale = {
'menu.dashboard.signalRobot': 'Signal Robot',
'menu.dashboard.monitor': 'Monitor',
'menu.dashboard.workplace': 'Workplace',
'aiAssetAnalysis.title': 'AI Asset Analysis',
'aiAssetAnalysis.subtitle': 'Unify portfolio monitoring, instant analysis, and scheduled tasks into one smooth workflow.',
'aiAssetAnalysis.actions.quickAnalysis': 'Start Analysis Now',
'aiAssetAnalysis.actions.monitorTasks': 'Manage Monitor Tasks',
'aiAssetAnalysis.actions.openStandalone': 'Open Standalone Page',
'aiAssetAnalysis.quickBar.title': 'Quick Analyze',
'aiAssetAnalysis.quickBar.placeholder': 'Select a symbol from asset pool',
'aiAssetAnalysis.quickBar.useInQuick': 'Use in Instant Analysis',
'aiAssetAnalysis.quickBar.runNow': 'Analyze Now',
'aiAssetAnalysis.history.title': 'Recent Analysis',
'aiAssetAnalysis.history.empty': 'No analysis history yet',
'aiAssetAnalysis.actions.enterQuick': 'Go to Instant Analysis',
'aiAssetAnalysis.actions.enterMonitor': 'Go to Asset Pool & Tasks',
'aiAssetAnalysis.flow.poolTitle': 'Build Asset Pool',
'aiAssetAnalysis.flow.poolDesc': 'Add positions and watch targets first to build one unified analysis pool.',
'aiAssetAnalysis.flow.poolAction': 'Manage Asset Pool',
'aiAssetAnalysis.flow.quickTitle': 'Instant Analysis',
'aiAssetAnalysis.flow.quickDesc': 'Run AI analysis for any symbol in one click and get suggestions quickly.',
'aiAssetAnalysis.flow.quickAction': 'Run Analysis',
'aiAssetAnalysis.flow.autoTitle': 'Scheduled Monitoring',
'aiAssetAnalysis.flow.autoDesc': 'Set recurring AI analysis tasks and deliver reports through notification channels.',
'aiAssetAnalysis.flow.autoAction': 'Configure Tasks',
'aiAssetAnalysis.tabs.quick': 'Instant Analysis',
'aiAssetAnalysis.tabs.monitor': 'Asset Pool & Scheduled Tasks',
'aiAssetAnalysis.tabLead.quick': 'Best for ad-hoc decisions: select a symbol and analyze immediately.',
'aiAssetAnalysis.tabLead.monitor': 'Best for continuous tracking: maintain positions and set monitor ranges/frequency.',
// AI Asset Analysis - Performance Stats
'aiAssetAnalysis.stats.totalAnalyses': 'Total Analyses',
'aiAssetAnalysis.stats.accuracy': 'Accuracy',
'aiAssetAnalysis.stats.avgReturn': 'Avg Return',
'aiAssetAnalysis.stats.satisfaction': 'Satisfaction',
'aiAssetAnalysis.stats.decisions': 'Decision Dist.',
// AI Asset Analysis - Trading Opportunities
'aiAssetAnalysis.opportunities.title': 'AI Opportunity Radar',
'aiAssetAnalysis.opportunities.empty': 'No opportunities found',
'aiAssetAnalysis.opportunities.analyze': 'Analyze',
'aiAssetAnalysis.opportunities.updateHint': 'Updates hourly',
'aiAssetAnalysis.opportunities.signal.overbought': 'Overbought',
'aiAssetAnalysis.opportunities.signal.oversold': 'Oversold',
'aiAssetAnalysis.opportunities.signal.bullish_momentum': 'Bullish',
'aiAssetAnalysis.opportunities.signal.bearish_momentum': 'Bearish',
'aiAssetAnalysis.opportunities.market.Crypto': '🪙 Crypto',
'aiAssetAnalysis.opportunities.market.USStock': '📈 US Stock',
'aiAssetAnalysis.opportunities.market.Forex': '💱 Forex',
'aiAssetAnalysis.opportunities.reason.crypto.overbought': '24h +{change}%, 7d +{change7d}%, overbought risk',
'aiAssetAnalysis.opportunities.reason.crypto.bullish_momentum': '24h +{change}%, strong bullish momentum',
'aiAssetAnalysis.opportunities.reason.crypto.oversold': '24h -{change}%, possible oversold bounce',
'aiAssetAnalysis.opportunities.reason.crypto.bearish_momentum': '24h -{change}%, clear bearish trend',
'aiAssetAnalysis.opportunities.reason.usstock.overbought': 'Day +{change}%, large gain, watch for pullback',
'aiAssetAnalysis.opportunities.reason.usstock.bullish_momentum': 'Day +{change}%, strong bullish momentum',
'aiAssetAnalysis.opportunities.reason.usstock.oversold': 'Day -{change}%, possible oversold bounce',
'aiAssetAnalysis.opportunities.reason.usstock.bearish_momentum': 'Day -{change}%, clear bearish trend',
'aiAssetAnalysis.opportunities.reason.forex.overbought': 'Day +{change}%, volatile, watch for reversal',
'aiAssetAnalysis.opportunities.reason.forex.bullish_momentum': 'Day +{change}%, bullish momentum',
'aiAssetAnalysis.opportunities.reason.forex.oversold': 'Day -{change}%, volatile, possible bounce',
'aiAssetAnalysis.opportunities.reason.forex.bearish_momentum': 'Day -{change}%, clear bearish trend',
// AI Asset Analysis - Portfolio Checkup
'aiAssetAnalysis.checkup.title': 'Portfolio Checkup',
'aiAssetAnalysis.checkup.btn': 'Checkup',
'aiAssetAnalysis.checkup.desc': 'Run AI analysis on all positions in your portfolio to quickly understand the current status and get recommendations for each asset.',
'aiAssetAnalysis.checkup.start': 'Start Checkup',
'aiAssetAnalysis.checkup.progress': 'Analyzing {current}/{total}...',
'aiAssetAnalysis.checkup.noPositions': 'No positions in your portfolio. Please add assets first.',
'aiAssetAnalysis.checkup.complete': 'Checkup Complete',
'aiAssetAnalysis.checkup.failed': 'Failed',
'aiAssetAnalysis.checkup.rerun': 'Run Again',
// AI Asset Analysis - Global Search
'aiAssetAnalysis.search.hint': 'Search',
'aiAssetAnalysis.search.placeholder': 'Search any symbol... (Ctrl+K)',
'aiAssetAnalysis.search.noResults': 'No results found. Try a different keyword.',
'menu.form': 'Form',
'menu.form.basic-form': 'Basic Form',
'menu.form.step-form': 'Step Form',
@@ -558,9 +631,7 @@ const locale = {
'dashboard.analysis.modal.addStock.willAutoFetchName': 'Name will be fetched automatically',
'dashboard.analysis.modal.addStock.addDirectly': 'Add Directly',
'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Name will be fetched automatically when adding',
'dashboard.analysis.market.AShare': 'A-Share',
'dashboard.analysis.market.USStock': 'US Stock',
'dashboard.analysis.market.HShare': 'H-Share',
'dashboard.analysis.market.Crypto': 'Cryptocurrency',
'dashboard.analysis.market.Forex': 'Forex',
'dashboard.analysis.market.Futures': 'Futures',
@@ -735,9 +806,7 @@ const locale = {
'dashboard.indicator.drawing.priceChannel': 'Price Channel',
'dashboard.indicator.drawing.fibonacciLine': 'Fibonacci Line',
'dashboard.indicator.drawing.clearAll': 'Clear All Drawings',
'dashboard.indicator.market.AShare': 'A-Share',
'dashboard.indicator.market.USStock': 'US Stock',
'dashboard.indicator.market.HShare': 'H-Share',
'dashboard.indicator.market.Crypto': 'Cryptocurrency',
'dashboard.indicator.market.Forex': 'Forex',
'dashboard.indicator.market.Futures': 'Futures',
@@ -1301,9 +1370,17 @@ const locale = {
'trading-assistant.form.step3': 'Strategy Parameters',
'trading-assistant.form.step2Params': 'Parameters',
'trading-assistant.form.step3Signal': 'Signal Delivery',
'trading-assistant.form.simpleMode': 'Simple',
'trading-assistant.form.advancedMode': 'Advanced',
'trading-assistant.form.simpleModeHint': 'Quick setup with recommended defaults',
'trading-assistant.form.advancedModeHint': 'Customize all parameters for pros',
'trading-assistant.form.simpleStep1': 'Select Indicator & Pair',
'trading-assistant.form.simpleStep2': 'Launch Mode',
'trading-assistant.form.simpleDefaultsHint': 'Defaults (expand to customize)',
'trading-assistant.form.showAdvancedSettings': 'Show Advanced Settings',
'trading-assistant.form.hideAdvancedSettings': 'Hide Advanced Settings',
'trading-assistant.form.marketCategory': 'Market Category',
'trading-assistant.form.marketCategoryHint': 'Select a market first. Only Crypto can enable live trading; other markets are signal-only.',
'trading-assistant.market.AShare': 'A-Share',
'trading-assistant.market.USStock': 'US Stock',
'trading-assistant.market.Crypto': 'Crypto',
'trading-assistant.market.Forex': 'Forex',
@@ -2232,7 +2309,6 @@ const locale = {
'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT Default Exchange',
'settings.field.CCXT_TIMEOUT': 'CCXT Timeout (ms)',
'settings.field.CCXT_PROXY': 'CCXT Proxy',
'settings.field.AKSHARE_TIMEOUT': 'Akshare Timeout (sec)',
'settings.field.YFINANCE_TIMEOUT': 'YFinance Timeout (sec)',
'settings.field.TIINGO_API_KEY': 'Tiingo API Key',
'settings.field.TIINGO_TIMEOUT': 'Tiingo Timeout (sec)',
@@ -2249,9 +2325,9 @@ const locale = {
// Settings descriptions (config item descriptions)
// Note: These are optional since backend already provides English descriptions
'settings.desc.SEARCH_PROVIDER': 'Web search provider for AI research. Bocha recommended for A-share news',
'settings.desc.SEARCH_PROVIDER': 'Web search provider for AI research',
'settings.desc.TAVILY_API_KEYS': 'Tavily Search API keys, comma-separated for rotation. Free 1000 requests/month',
'settings.desc.BOCHA_API_KEYS': 'Bocha Search API keys, comma-separated for rotation. Best for A-share news',
'settings.desc.BOCHA_API_KEYS': 'Bocha Search API keys, comma-separated for rotation',
'settings.desc.SERPAPI_KEYS': 'SerpAPI keys for Google/Bing search, comma-separated for rotation',
'settings.desc.ORDER_MODE': 'maker: Limit order first (lower fees), market: Market order (instant fill)',
'settings.desc.MAKER_WAIT_SEC': 'Wait time for limit order fill before switching to market order',
@@ -2473,7 +2549,7 @@ const locale = {
'profile.credits.vipExpires': 'VIP expires on',
'profile.credits.vipExpired': 'VIP expired',
'profile.credits.noVip': 'Not a VIP',
'profile.credits.hint': 'AI analysis and other features consume credits. VIP users get free access.',
'profile.credits.hint': 'AI analysis/backtest/monitoring will consume credits; VIP only makes VIP-free indicators free to use.',
// Profile - Credits Log
'profile.creditsLog': 'Credits History',
@@ -2591,11 +2667,13 @@ const locale = {
'systemOverview.realized': 'Real',
'systemOverview.unrealized': 'Unreal',
'systemOverview.symbols': 'symbols',
'systemOverview.live': 'Live',
'systemOverview.signal': 'Signal Only',
// Settings - Billing
'settings.group.billing': 'Billing & Credits',
'settings.field.BILLING_ENABLED': 'Enable Billing',
'settings.field.BILLING_VIP_BYPASS': 'VIP Free Access',
'settings.field.BILLING_VIP_BYPASS': 'VIP Bypass (Legacy)',
'settings.field.BILLING_COST_AI_ANALYSIS': 'AI Analysis Cost',
'settings.field.BILLING_COST_STRATEGY_RUN': 'Strategy Run Cost',
'settings.field.BILLING_COST_BACKTEST': 'Backtest Cost',
@@ -2603,8 +2681,22 @@ const locale = {
'settings.field.CREDITS_REGISTER_BONUS': 'Register Bonus',
'settings.field.CREDITS_REFERRAL_BONUS': 'Referral Bonus',
'settings.field.RECHARGE_TELEGRAM_URL': 'Recharge Telegram URL',
'settings.field.MEMBERSHIP_MONTHLY_PRICE_USD': 'Monthly Membership Price (USD)',
'settings.field.MEMBERSHIP_MONTHLY_CREDITS': 'Monthly Membership Bonus Credits',
'settings.field.MEMBERSHIP_YEARLY_PRICE_USD': 'Yearly Membership Price (USD)',
'settings.field.MEMBERSHIP_YEARLY_CREDITS': 'Yearly Membership Bonus Credits',
'settings.field.MEMBERSHIP_LIFETIME_PRICE_USD': 'Lifetime Membership Price (USD)',
'settings.field.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'Lifetime Monthly Credits',
'settings.field.USDT_PAY_ENABLED': 'Enable USDT Pay',
'settings.field.USDT_PAY_CHAIN': 'USDT Chain',
'settings.field.USDT_TRC20_XPUB': 'TRC20 XPUB (Watch-only)',
'settings.field.USDT_TRC20_CONTRACT': 'USDT TRC20 Contract',
'settings.field.TRONGRID_BASE_URL': 'TronGrid Base URL',
'settings.field.TRONGRID_API_KEY': 'TronGrid API Key',
'settings.field.USDT_PAY_CONFIRM_SECONDS': 'Confirm Delay (sec)',
'settings.field.USDT_PAY_EXPIRE_MINUTES': 'Order Expire (min)',
'settings.desc.BILLING_ENABLED': 'Enable billing system. Users need credits to use certain features when enabled',
'settings.desc.BILLING_VIP_BYPASS': 'VIP users can use all paid features for free during VIP period',
'settings.desc.BILLING_VIP_BYPASS': 'Legacy switch. If enabled, VIP users bypass ALL feature credit costs. Recommended OFF: VIP should only unlock VIP-free indicators.',
'settings.desc.BILLING_COST_AI_ANALYSIS': 'Credits consumed per AI analysis request',
'settings.desc.BILLING_COST_STRATEGY_RUN': 'Credits consumed when starting a strategy',
'settings.desc.BILLING_COST_BACKTEST': 'Credits consumed per backtest run',
@@ -2614,6 +2706,20 @@ const locale = {
'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': 'Maximum attempts to verify a code before lockout',
'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': 'Lockout duration after exceeding max attempts',
'settings.desc.RECHARGE_TELEGRAM_URL': 'Telegram customer service URL for recharge inquiries',
'settings.desc.MEMBERSHIP_MONTHLY_PRICE_USD': 'Monthly membership price in USD (mock payment in current version).',
'settings.desc.MEMBERSHIP_MONTHLY_CREDITS': 'Credits granted immediately after purchasing monthly membership.',
'settings.desc.MEMBERSHIP_YEARLY_PRICE_USD': 'Yearly membership price in USD (mock payment in current version).',
'settings.desc.MEMBERSHIP_YEARLY_CREDITS': 'Credits granted immediately after purchasing yearly membership.',
'settings.desc.MEMBERSHIP_LIFETIME_PRICE_USD': 'Lifetime membership price in USD (mock payment in current version).',
'settings.desc.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'Credits granted every 30 days for lifetime members (first grant happens immediately on purchase).',
'settings.desc.USDT_PAY_ENABLED': 'Enable USDT scan-to-pay flow (per-order unique address + auto reconciliation).',
'settings.desc.USDT_PAY_CHAIN': 'Currently only TRC20 is supported.',
'settings.desc.USDT_TRC20_XPUB': 'Watch-only xpub used to derive per-order deposit addresses. Do NOT paste private key/seed.',
'settings.desc.USDT_TRC20_CONTRACT': 'USDT contract address on TRON (default prefilled).',
'settings.desc.TRONGRID_BASE_URL': 'TronGrid API base URL (default is fine).',
'settings.desc.TRONGRID_API_KEY': 'Optional. For higher TronGrid rate limits and stability.',
'settings.desc.USDT_PAY_CONFIRM_SECONDS': 'After a payment is detected, wait N seconds before marking it confirmed.',
'settings.desc.USDT_PAY_EXPIRE_MINUTES': 'Order expiration time; users need to regenerate an order after it expires.',
// Global Market
'globalMarket.title': 'Global Market Dashboard',
@@ -2990,7 +3096,61 @@ const locale = {
'aiQuant.template.news': '📰 News Driven',
'aiQuant.template.custom': '✏️ Custom',
'aiQuant.hint.dataProvided': 'System auto-provides: real-time price, indicators (RSI/MACD/MA), recent news, macro data. AI analyzes these with your prompt to determine direction.',
'aiQuant.hint.liveWarning': 'Live mode will trade with REAL money! Make sure you have configured exchange API and understand the risks!'
'aiQuant.hint.liveWarning': 'Live mode will trade with REAL money! Make sure you have configured exchange API and understand the risks!',
// Trading Assistant - Live Trading Disclaimer
'trading-assistant.liveDisclaimer.title': 'Live Trading Disclaimer',
'trading-assistant.liveDisclaimer.content': 'Live trading involves significant risk and may result in partial or total loss of funds. The platform does not guarantee returns or profits. You are responsible for your own decisions and outcomes.',
'trading-assistant.liveDisclaimer.agree': 'I have read and understood the disclaimer and still want to enable live trading',
'trading-assistant.liveDisclaimer.required': 'Please accept the disclaimer before enabling live trading',
'trading-assistant.liveDisclaimer.blockTitle': 'Please accept the disclaimer first',
'trading-assistant.liveDisclaimer.blockDesc': 'You must accept the disclaimer to configure live trading connection and order settings.',
// Billing / Membership
'menu.billing': 'Membership',
'billing.title': 'Membership / Credits',
'billing.desc': 'Choose a plan to activate VIP and receive bonus credits.',
'billing.snapshot.credits': 'Current Credits',
'billing.snapshot.vip': 'VIP Status',
'billing.snapshot.notVip': 'Not VIP',
'billing.snapshot.expires': 'Expires',
'billing.vipRule.title': 'VIP Benefit',
'billing.vipRule.desc': 'VIP has only one special permission: VIP-free indicators can be used without credits deduction. Other paid features/indicators still consume credits.',
'billing.plan.monthly': 'Monthly',
'billing.plan.yearly': 'Yearly',
'billing.plan.lifetime': 'Lifetime',
'billing.perMonth': 'month',
'billing.perYear': 'year',
'billing.once': 'one-time',
'billing.credits': 'Credits',
'billing.lifetimeMonthly': 'Monthly bonus',
'billing.buyNow': 'Buy Now',
'billing.purchaseSuccess': 'Purchase successful',
'billing.purchaseFailed': 'Purchase failed',
'billing.usdt.title': 'USDT Scan to Pay',
'billing.usdt.hintTitle': 'Scan with your wallet and send USDT',
'billing.usdt.hintDesc': 'Make sure the network and amount are correct (TRC20 only for now). Membership will be activated automatically after payment is confirmed.',
'billing.usdt.chain': 'Chain',
'billing.usdt.amount': 'Amount',
'billing.usdt.address': 'Deposit Address',
'billing.usdt.copyAddress': 'Copy Address',
'billing.usdt.copyAmount': 'Copy Amount',
'billing.usdt.refresh': 'Refresh',
'billing.usdt.expires': 'Expires',
'billing.usdt.paidSuccess': 'Payment confirmed. Membership activated.',
'billing.usdt.status.pending': 'Waiting for payment',
'billing.usdt.status.paid': 'Payment detected',
'billing.usdt.status.confirmed': 'Confirmed',
'billing.usdt.status.expired': 'Expired',
'billing.usdt.status.cancelled': 'Cancelled',
'billing.usdt.status.failed': 'Failed',
// Community
'community.vipFree': 'VIP Free',
// Indicator publish
'dashboard.indicator.publish.vipFree': 'VIP Free',
'dashboard.indicator.publish.vipFreeHint': 'When enabled: VIP users can use this indicator for free (non-VIP still need to purchase).'
}
export default {