Files
DinQuant/quantdinger_vue/src/locales/lang/en-US.js
T

2346 lines
147 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import antdEnUS from 'ant-design-vue/es/locale-provider/en_US'
import momentEU from 'moment/locale/eu'
const components = {
antLocale: antdEnUS,
momentName: 'eu',
momentLocale: momentEU
}
const locale = {
// Common
'common.confirm': 'Confirm',
'common.cancel': 'Cancel',
'common.save': 'Save',
'common.delete': 'Delete',
'common.edit': 'Edit',
'common.add': 'Add',
'common.close': 'Close',
'common.ok': 'OK',
'submit': 'Submit',
'save': 'Save',
'submit.ok': 'Submit successfully',
'save.ok': 'Saved successfully',
'menu.welcome': 'Welcome',
'menu.home': 'Home',
'menu.dashboard': 'Dashboard',
'menu.dashboard.analysis': 'AI Analysis',
'menu.dashboard.indicator': 'Indicator Analysis',
'menu.dashboard.community': 'Indicator Community',
'menu.dashboard.tradingAssistant': 'Trading Assistant',
'menu.dashboard.portfolio': 'Portfolio',
'menu.settings': 'Settings',
'menu.dashboard.aiTradingAssistant': 'AI Trading Assistant',
'menu.dashboard.signalRobot': 'Signal Robot',
'menu.dashboard.monitor': 'Monitor',
'menu.dashboard.workplace': 'Workplace',
'menu.form': 'Form',
'menu.form.basic-form': 'Basic Form',
'menu.form.step-form': 'Step Form',
'menu.form.step-form.info': 'Step Form(write transfer information)',
'menu.form.step-form.confirm': 'Step Form(confirm transfer information)',
'menu.form.step-form.result': 'Step Form(finished)',
'menu.form.advanced-form': 'Advanced Form',
'menu.list': 'List',
'menu.list.table-list': 'Search Table',
'menu.list.basic-list': 'Basic List',
'menu.list.card-list': 'Card List',
'menu.list.search-list': 'Search List',
'menu.list.search-list.articles': 'Search List(articles)',
'menu.list.search-list.projects': 'Search List(projects)',
'menu.list.search-list.applications': 'Search List(applications)',
'menu.profile': 'Profile',
'menu.profile.basic': 'Basic Profile',
'menu.profile.advanced': 'Advanced Profile',
'menu.result': 'Result',
'menu.result.success': 'Success',
'menu.result.fail': 'Fail',
'menu.exception': 'Exception',
'menu.exception.not-permission': '403',
'menu.exception.not-find': '404',
'menu.exception.server-error': '500',
'menu.exception.trigger': 'Trigger',
'menu.account': 'Account',
'menu.account.center': 'Account Center',
'menu.account.settings': 'Account Settings',
'menu.account.trigger': 'Trigger Error',
'menu.account.logout': 'Logout',
'menu.wallet': 'My Wallet',
'menu.docs': 'Documentation',
'menu.docs.detail': 'Doc Detail',
'menu.header.refreshPage': 'Refresh Page',
'menu.invite.friends': 'Invite Friends',
'app.setting.pagestyle': 'Page Style Setting',
'app.setting.pagestyle.light': 'Light Menu Style',
'app.setting.pagestyle.dark': 'Dark Menu Style',
'app.setting.pagestyle.realdark': 'RealDark style',
'app.setting.themecolor': 'Theme Color',
'app.setting.navigationmode': 'Navigation Mode',
'app.setting.sidemenu.nav': 'Sidebar Navigation',
'app.setting.topmenu.nav': 'Top Navigation',
'app.setting.content-width': 'Content Width',
'app.setting.content-width.tooltip': 'This setting is only effective for [Top Navigation]',
'app.setting.content-width.fixed': 'Fixed',
'app.setting.content-width.fluid': 'Fluid',
'app.setting.fixedheader': 'Fixed Header',
'app.setting.fixedheader.tooltip': 'Configurable when Header is fixed',
'app.setting.autoHideHeader': 'Hide Header on Scroll',
'app.setting.fixedsidebar': 'Fixed Sidebar Menu',
'app.setting.sidemenu': 'Side Menu Layout',
'app.setting.topmenu': 'Top Menu Layout',
'app.setting.othersettings': 'Other Settings',
'app.setting.weakmode': 'Weak Mode',
'app.setting.multitab': 'Multi-Tab Mode',
'app.setting.copy': 'Copy Setting',
'app.setting.loading': 'Loading theme',
'app.setting.copyinfo': 'copy successplease replace defaultSettings in src/config/defaultSettings.js',
'app.setting.copy.success': 'Copy Success',
'app.setting.copy.fail': 'Copy Failed',
'app.setting.theme.switching': 'Switching theme...',
'app.setting.production.hint': 'Setting panel shows in development environment only, please manually modify',
'app.setting.themecolor.daybreak': 'Daybreak Blue (Default)',
'app.setting.themecolor.dust': 'Dust Red',
'app.setting.themecolor.volcano': 'Volcano',
'app.setting.themecolor.sunset': 'Sunset Orange',
'app.setting.themecolor.cyan': 'Cyan',
'app.setting.themecolor.green': 'Polar Green',
'app.setting.themecolor.geekblue': 'Geek Blue',
'app.setting.themecolor.purple': 'Golden Purple',
'app.setting.tooltip': 'Page Settings',
// Notification Center
'notice.title': 'Notifications',
'notice.empty': 'No notifications',
'notice.markAllRead': 'Mark all as read',
'notice.clear': 'Clear all',
'notice.close': 'Close',
'notice.justNow': 'Just now',
'notice.minutesAgo': 'minutes ago',
'notice.hoursAgo': 'hours ago',
'notice.daysAgo': 'days ago',
'notice.detailInfo': 'Details',
'notice.aiDecision': 'AI Decision',
'notice.confidence': 'Confidence',
'notice.reasoning': 'Reasoning',
'notice.symbol': 'Symbol',
'notice.currentPrice': 'Current Price',
'notice.triggerPrice': 'Trigger Price',
'notice.action': 'Action',
'notice.quantity': 'Quantity',
'notice.viewPortfolio': 'View Portfolio',
'notice.type.aiMonitor': 'AI Monitor',
'notice.type.priceAlert': 'Price Alert',
'notice.type.signal': 'Trade Signal',
'notice.type.buy': 'Buy Signal',
'notice.type.sell': 'Sell Signal',
'notice.type.hold': 'Hold Suggestion',
'notice.type.trade': 'Trade Execution',
'notice.type.notification': 'Notification',
'user.login.userName': 'userName',
'user.login.password': 'password',
'user.login.username.placeholder': 'Account: admin',
'user.login.password.placeholder': 'password: admin or ant.design',
'user.login.message-invalid-credentials': 'Login failed, please check your email and verification code',
'user.login.message-invalid-verification-code': 'Invalid verification code',
'user.login.tab-login-credentials': 'Credentials',
'user.login.tab-login-email': 'Email',
'user.login.tab-login-mobile': 'Mobile number',
'user.login.captcha.placeholder': 'Please enter captcha',
'user.login.mobile.placeholder': 'Mobile number',
'user.login.mobile.verification-code.placeholder': 'Verification code',
'user.login.email.placeholder': 'Please enter your email address',
'user.login.email.verification-code.placeholder': 'Please enter verification code',
'user.login.email.sending': 'Sending verification code...',
'user.login.email.send-success-title': 'Notice',
'user.login.email.send-success': 'Verification code sent successfully, please check your email',
'user.login.sms.send-success': 'Verification code sent successfully, please check your SMS',
'user.login.remember-me': 'Remember me',
'user.login.forgot-password': 'Forgot your password?',
'user.login.sign-in-with': 'Sign in with',
'user.login.signup': 'Sign up',
'user.login.login': 'Login',
'user.register.register': 'Register',
'user.register.email.placeholder': 'Email',
'user.register.password.placeholder': 'Password ',
'user.register.password.popover-message': 'Please enter at least 6 characters. Please do not use passwords that are easy to guess. ',
'user.register.confirm-password.placeholder': 'Confirm password',
'user.register.get-verification-code': 'Get code',
'user.register.sign-in': 'Already have an account?',
'user.register-result.msg': 'Accountregistered at {email}',
'user.register-result.activation-email': 'The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.',
'user.register-result.back-home': 'Back to home',
'user.register-result.view-mailbox': 'View mailbox',
'user.email.required': 'Please enter your email!',
'user.email.wrong-format': 'The email address is in the wrong format!',
'user.userName.required': 'Please enter account name or email address',
'user.password.required': 'Please enter your password!',
'user.password.twice.msg': 'The passwords entered twice do not match!',
'user.password.strength.msg': 'The password is not strong enough',
'user.password.strength.strong': 'Strength: strong',
'user.password.strength.medium': 'Strength: medium',
'user.password.strength.low': 'Strength: low',
'user.password.strength.short': 'Strength: too short',
'user.confirm-password.required': 'Please confirm your password!',
'user.phone-number.required': 'Please enter your phone number!',
'user.phone-number.wrong-format': 'Please enter a valid phone number',
'user.verification-code.required': 'Please enter the verification code!',
'user.captcha.required': 'Please enter captcha!',
'user.login.infos': 'QuantDinger is an AI multi-agent stock analysis tool that does not have securities investment consulting qualifications. All analysis results, scores, and reference opinions on the platform are automatically generated by AI based on historical data, and are only for learning, research, and technical exchanges, and do not constitute any investment advice or decision-making basis. Stock investment involves market risk, liquidity risk, policy risk and other risks, which may lead to losses of principal. Users should make independent decisions based on their risk tolerance capacity, and bear the consequences of any investment behavior and its results using this tool. Market risk, investment needs to be cautious.',
'user.login.tab-login-web3': 'Web3 Login',
'user.login.web3.tip': 'Sign in with your wallet via signature',
'user.login.web3.connect': 'Connect wallet and login',
'user.login.web3.no-wallet': 'No wallet detected',
'user.login.web3.no-address': 'Wallet address not found',
'user.login.web3.nonce-failed': 'Failed to get nonce',
'user.login.web3.verify-failed': 'Signature verification failed',
'user.login.web3.success': 'Login success',
'user.login.web3.failed': 'Wallet login failed',
'nav.no_wallet': 'No wallet detected',
'nav.copy': 'Copy',
'nav.copy_success': 'Copied',
'user.login.oauth.google': 'Sign in with Google',
'user.login.oauth.github': 'Sign in with GitHub',
'user.login.oauth.loading': 'Redirecting to authorization page...',
'user.login.oauth.failed': 'OAuth login failed',
'user.login.oauth.get-url-failed': 'Failed to get authorization URL',
'user.login.subtitle': 'driven quantitative insights for global markets',
'user.login.legal.title': 'Legal Disclaimer',
'user.login.legal.view': 'View Legal Disclaimer',
'user.login.legal.collapse': 'Hide Legal Disclaimer',
'user.login.legal.agree': 'I have read and agree to the Legal Disclaimer',
'user.login.legal.required': 'Please read and check the Legal Disclaimer first',
'user.login.legal.content': 'QuantDinger is an AI multi-agent stock analysis tool and does not provide investment advice. All analysis results, scores, and references are generated by AI based on historical data and are for learning, research, and technical exchange only. They do not constitute investment advice or a basis for decision-making. Stock investments involve market, liquidity, and policy risks, which may lead to loss of principal. Users should make independent decisions based on their risk tolerance and bear the consequences of any investment behavior and results using this tool.',
'user.login.privacy.title': 'Privacy Policy',
'user.login.privacy.view': 'View Privacy Policy',
'user.login.privacy.collapse': 'Hide Privacy Policy',
'user.login.privacy.content': 'We value your privacy and data protection. (1) Scope of collection: We only collect information necessary to provide the service (e.g., email, mobile number, country code, Web3 wallet address) and limited logs/device data. (2) Purpose of use: Account login and security verification, feature provisioning, troubleshooting, and compliance requirements. (3) Storage & security: Data is encrypted and access-controlled to prevent unauthorized access, disclosure, or loss. (4) Sharing & third parties: We do not share personal data with third parties except as required by law or to deliver the service; where third-party services are involved (e.g., wallets, SMS providers), processing is limited to the minimum scope required. (5) Cookies/local storage: Used for session and login state (e.g., tokens, PHPSESSID). You may clear or restrict them in your browser. (6) Your rights: You may exercise rights of access, correction, deletion, and consent withdrawal as permitted by law. (7) Changes & notices: We will provide prominent notice for updates. Continued use indicates that you have read and agreed to the updated terms. If you do not agree, please stop using the service and contact us.',
'account.basicInfo': 'Basic Information',
'account.id': 'User ID',
'account.username': 'Username',
'account.nickname': 'Nickname',
'account.email': 'Email',
'account.mobile': 'Mobile',
'account.web3address': 'Wallet Address',
'account.pid': 'Referrer ID',
'account.level': 'Level',
'account.money': 'Balance',
'account.qdtBalance': 'QDT Balance',
'account.score': 'Score',
'account.createtime': 'Registration Time',
'account.inviteLink': 'Invite Link',
'account.recharge': 'Recharge',
'account.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge',
'account.qrCodePlaceholder': 'QR Code Placeholder (Mock)',
'account.rechargeAmount': 'Recharge Amount',
'account.enterAmount': 'Please enter recharge amount',
'account.rechargeHint': 'Minimum recharge amount: 1 QDT',
'account.confirmRecharge': 'Confirm Recharge',
'account.enterValidAmount': 'Please enter a valid recharge amount',
'account.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT',
'account.settings.menuMap.basic': 'Basic Settings',
'account.settings.menuMap.security': 'Security Settings',
'account.settings.menuMap.notification': 'New Message Notification',
'account.settings.menuMap.moneyLog': 'Transaction History',
'account.moneyLog.empty': 'No transaction history',
'account.moneyLog.total': 'Total {total} records',
'account.moneyLog.type.purchase': 'Purchase Indicator',
'account.moneyLog.type.recharge': 'Recharge',
'account.moneyLog.type.refund': 'Refund',
'account.moneyLog.type.reward': 'Reward',
'account.moneyLog.type.income': 'Indicator Income',
'account.moneyLog.type.commission': 'Platform Fee',
'wallet.balance': 'QDT Balance',
'wallet.recharge': 'Recharge',
'wallet.withdraw': 'Withdraw',
'wallet.filter': 'Filter',
'wallet.reset': 'Reset',
'wallet.totalRecharge': 'Total Recharge',
'wallet.totalWithdraw': 'Total Withdraw',
'wallet.totalIncome': 'Total Income',
'wallet.records': 'Trading Records & Transaction History',
'wallet.tradingRecords': 'Trading Records',
'wallet.moneyLog': 'Transaction History',
'wallet.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge',
'wallet.qrCodePlaceholder': 'QR Code Placeholder (Simulated)',
'wallet.rechargeAmount': 'Recharge Amount',
'wallet.enterAmount': 'Please enter recharge amount',
'wallet.rechargeHint': 'Minimum recharge amount: 1 QDT',
'wallet.confirmRecharge': 'Confirm Recharge',
'wallet.enterValidAmount': 'Please enter a valid recharge amount',
'wallet.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT',
'wallet.rechargeFailed': 'Recharge failed',
'wallet.withdrawTip': 'Please enter withdrawal amount and address',
'wallet.withdrawAmount': 'Withdrawal Amount',
'wallet.enterWithdrawAmount': 'Please enter withdrawal amount',
'wallet.withdrawHint': 'Minimum withdrawal amount: 1 QDT',
'wallet.withdrawAddress': 'Withdrawal Address (Optional)',
'wallet.enterWithdrawAddress': 'Please enter withdrawal address',
'wallet.confirmWithdraw': 'Confirm Withdrawal',
'wallet.enterValidWithdrawAmount': 'Please enter a valid withdrawal amount',
'wallet.insufficientBalance': 'Insufficient balance',
'wallet.withdrawSuccess': 'Withdrawal successful! Withdrew {amount} QDT',
'wallet.withdrawFailed': 'Withdrawal failed',
'wallet.noTradingRecords': 'No trading records',
'wallet.noMoneyLog': 'No transaction history',
'wallet.loadTradingRecordsFailed': 'Failed to load trading records',
'wallet.loadMoneyLogFailed': 'Failed to load transaction history',
'wallet.moneyLogTotal': 'Total {total} records',
'wallet.moneyLogTypeTitle': 'Type',
'wallet.moneyLogType.all': 'All types',
'wallet.table.time': 'Time',
'wallet.table.type': 'Type',
'wallet.table.price': 'Price',
'wallet.table.amount': 'Amount',
'wallet.table.money': 'Amount',
'wallet.table.balance': 'Balance',
'wallet.table.memo': 'Memo',
'wallet.table.value': 'Value',
'wallet.table.profit': 'P/L',
'wallet.table.commission': 'Commission',
'wallet.table.total': 'Total {total} records',
'wallet.tradeType.buy': 'Buy',
'wallet.tradeType.sell': 'Sell',
'wallet.tradeType.liquidation': 'Liquidation',
'wallet.tradeType.openLong': 'Open Long',
'wallet.tradeType.addLong': 'Add Long',
'wallet.tradeType.closeLong': 'Close Long',
'wallet.tradeType.closeLongStop': 'Stop Loss Close Long',
'wallet.tradeType.closeLongProfit': 'Take Profit Close Long',
'wallet.tradeType.openShort': 'Open Short',
'wallet.tradeType.addShort': 'Add Short',
'wallet.tradeType.closeShort': 'Close Short',
'wallet.tradeType.closeShortStop': 'Stop Loss Close Short',
'wallet.tradeType.closeShortProfit': 'Take Profit Close Short',
'wallet.moneyLogType.purchase': 'Purchase Indicator',
'wallet.moneyLogType.recharge': 'Recharge',
'wallet.moneyLogType.withdraw': 'Withdraw',
'wallet.moneyLogType.refund': 'Refund',
'wallet.moneyLogType.reward': 'Reward',
'wallet.moneyLogType.income': 'Income',
'wallet.moneyLogType.commission': 'Commission',
'wallet.web3Address.required': 'Please fill in Web3 wallet address first',
'wallet.web3Address.requiredDescription': 'You need to bind your Web3 wallet address before recharging to receive deposits',
'wallet.web3Address.placeholder': 'Please enter your Web3 wallet address (starts with 0x)',
'wallet.web3Address.save': 'Save Wallet Address',
'wallet.web3Address.saveSuccess': 'Wallet address saved successfully',
'wallet.web3Address.saveFailed': 'Failed to save wallet address',
'wallet.web3Address.invalidFormat': 'Please enter a valid Web3 wallet address (Ethereum format: 42 characters starting with 0x, or TRC20 format: 34 characters starting with T)',
'wallet.selectCoin': 'Select Coin',
'wallet.selectChain': 'Select Chain',
'wallet.chain.eth': 'ETH(ERC20)',
'wallet.chain.trc20': 'TRC20',
'wallet.chain.bsc': 'BSC',
'wallet.targetQdtAmount': 'Target QDT Amount (Optional)',
'wallet.targetQdtAmount.placeholder': 'Enter the QDT amount you want to exchange, current QDT price: {price} USDT',
'wallet.targetQdtAmount.requiredUsdt': 'Required USDT: {amount}',
'wallet.rechargeAddress': 'Recharge Address',
'wallet.copyAddress': 'Copy',
'wallet.copySuccess': 'Copied successfully!',
'wallet.copyFailed': 'Copy failed, please copy manually',
'wallet.rechargeAddressHint': 'Please ensure you use {chain} chain to recharge {coin} to this address',
'wallet.qdtPrice.loading': 'Loading...',
'wallet.rechargeTip.new': 'Please select coin and chain, then scan the QR code below to recharge',
'wallet.exchangeRate': '1 QDT ≈ {rate} USDT',
'wallet.withdrawableAmount': 'Withdrawable Amount',
'wallet.totalBalance': 'Total Balance',
'wallet.insufficientWithdrawable': 'Insufficient withdrawable amount, current withdrawable: {amount} QDT',
'wallet.withdrawAddressRequired': 'Please enter withdrawal address',
'wallet.withdrawAddressHint': 'Please ensure the address is correct, withdrawal cannot be revoked',
'wallet.withdrawSubmitSuccess': 'Withdrawal application submitted successfully, please wait for review',
'menu.footer.contactUs': 'Contact Us',
'menu.footer.getSupport': 'Get Support',
'menu.footer.socialAccounts': 'Social Accounts',
'menu.footer.userAgreement': 'User Agreement',
'menu.footer.privacyPolicy': 'Privacy Policy',
'menu.footer.support': 'Support',
'menu.footer.featureRequest': 'Feature request',
'menu.footer.email': 'Email',
'menu.footer.liveChat': '24/7 live chat',
'dashboard.analysis.title': 'Multi-Dimensional Analysis',
'dashboard.analysis.subtitle': 'AI-Powered Comprehensive Financial Analysis Platform',
'dashboard.analysis.selectSymbol': 'Select or enter symbol code',
'dashboard.analysis.selectModel': 'Select Model',
'dashboard.analysis.startAnalysis': 'Start Analysis',
'dashboard.analysis.history': 'History',
'dashboard.analysis.tab.overview': 'Overview',
'dashboard.analysis.tab.fundamental': 'Fundamental',
'dashboard.analysis.tab.technical': 'Technical',
'dashboard.analysis.tab.news': 'News',
'dashboard.analysis.tab.sentiment': 'Sentiment',
'dashboard.analysis.tab.risk': 'Risk',
'dashboard.analysis.tab.debate': 'Debate',
'dashboard.analysis.tab.decision': 'Final Decision',
'dashboard.analysis.empty.selectSymbol': 'Select Symbol to Start Analysis',
'dashboard.analysis.empty.selectSymbolDesc': 'Select from watchlist or enter symbol code to get multi-dimensional AI analysis report',
'dashboard.analysis.empty.startAnalysis': 'Click "Start Analysis" button to perform multi-dimensional analysis',
'dashboard.analysis.empty.startAnalysisDesc': 'We will provide comprehensive analysis from multiple dimensions including fundamental, technical, news, sentiment and risk',
'dashboard.analysis.empty.noData': 'No {type} analysis data available, please perform comprehensive analysis first',
'dashboard.analysis.empty.noWatchlist': 'No watchlist items',
'dashboard.analysis.empty.noHistory': 'No history records',
'dashboard.analysis.empty.watchlistHint': 'No watchlist, please',
'dashboard.analysis.empty.noDebateData': 'No debate data available',
'dashboard.analysis.empty.noDecisionData': 'No decision data available',
'dashboard.analysis.empty.selectAgent': 'Please select an Agent to view analysis results',
'dashboard.analysis.loading.analyzing': 'Analyzing, please wait...',
'dashboard.analysis.loading.fundamental': 'Analyzing fundamental data...',
'dashboard.analysis.loading.technical': 'Analyzing technical indicators...',
'dashboard.analysis.loading.news': 'Analyzing news data...',
'dashboard.analysis.loading.sentiment': 'Analyzing market sentiment...',
'dashboard.analysis.loading.risk': 'Assessing risks...',
'dashboard.analysis.loading.debate': 'Debating...',
'dashboard.analysis.loading.decision': 'Generating final decision...',
'dashboard.analysis.score.overall': 'Overall Score',
'dashboard.analysis.score.recommendation': 'Recommendation',
'dashboard.analysis.score.confidence': 'Confidence',
'dashboard.analysis.dimension.fundamental': 'Fundamental',
'dashboard.analysis.dimension.technical': 'Technical',
'dashboard.analysis.dimension.news': 'News',
'dashboard.analysis.dimension.sentiment': 'Sentiment',
'dashboard.analysis.dimension.risk': 'Risk',
'dashboard.analysis.card.dimensionScores': 'Dimension Scores',
'dashboard.analysis.card.overviewReport': 'Overview Report',
'dashboard.analysis.card.financialMetrics': 'Financial Metrics',
'dashboard.analysis.card.fundamentalReport': 'Fundamental Analysis Report',
'dashboard.analysis.card.technicalIndicators': 'Technical Indicators',
'dashboard.analysis.card.technicalReport': 'Technical Analysis Report',
'dashboard.analysis.card.newsList': 'Related News',
'dashboard.analysis.card.newsReport': 'News Analysis Report',
'dashboard.analysis.card.sentimentIndicators': 'Sentiment Indicators',
'dashboard.analysis.card.sentimentReport': 'Sentiment Analysis Report',
'dashboard.analysis.card.riskMetrics': 'Risk Metrics',
'dashboard.analysis.card.riskReport': 'Risk Assessment Report',
'dashboard.analysis.card.bullView': 'Bullish View (Bull)',
'dashboard.analysis.card.bearView': 'Bearish View (Bear)',
'dashboard.analysis.card.researchConclusion': 'Researcher Conclusion',
'dashboard.analysis.card.traderPlan': 'Trader Plan',
'dashboard.analysis.card.riskDebate': 'Risk Committee Debate',
'dashboard.analysis.card.finalDecision': 'Final Decision',
'dashboard.analysis.card.tradePlanDetail': 'Trading Plan Details',
'dashboard.analysis.tradingPlan.entry_price': 'Entry Price',
'dashboard.analysis.tradingPlan.position_size': 'Position Size',
'dashboard.analysis.tradingPlan.stop_loss': 'Stop Loss',
'dashboard.analysis.tradingPlan.take_profit': 'Take Profit',
'dashboard.analysis.label.confidence': 'Confidence',
'dashboard.analysis.label.keyPoints': 'Key Points',
'dashboard.analysis.label.riskWarning': 'Risk Warning',
'dashboard.analysis.risk.risky': 'Aggressive View (Risky)',
'dashboard.analysis.risk.neutral': 'Neutral View (Neutral)',
'dashboard.analysis.risk.safe': 'Conservative View (Safe)',
'dashboard.analysis.risk.conclusion': 'Conclusion',
'dashboard.analysis.feature.fundamental': 'Fundamental Analysis',
'dashboard.analysis.feature.technical': 'Technical Analysis',
'dashboard.analysis.feature.news': 'News Analysis',
'dashboard.analysis.feature.sentiment': 'Sentiment Analysis',
'dashboard.analysis.feature.risk': 'Risk Assessment',
'dashboard.analysis.watchlist.title': 'My Watchlist',
'dashboard.analysis.watchlist.add': 'Add',
'dashboard.analysis.watchlist.addStock': 'Add Stock',
'dashboard.analysis.modal.addStock.title': 'Add to Watchlist',
'dashboard.analysis.modal.addStock.confirm': 'Confirm',
'dashboard.analysis.modal.addStock.cancel': 'Cancel',
'dashboard.analysis.modal.addStock.market': 'Market Type',
'dashboard.analysis.modal.addStock.marketPlaceholder': 'Please select market',
'dashboard.analysis.modal.addStock.marketRequired': 'Please select market type',
'dashboard.analysis.modal.addStock.symbol': 'Symbol',
'dashboard.analysis.modal.addStock.symbolPlaceholder': 'e.g.: AAPL, TSLA, GOOGL, 000001, BTC',
'dashboard.analysis.modal.addStock.symbolRequired': 'Please enter symbol code',
'dashboard.analysis.modal.addStock.searchPlaceholder': 'Search symbol code or name',
'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Search or enter symbol code (e.g.: AAPL, BTC/USDT, EUR/USD)',
'dashboard.analysis.modal.addStock.searchOrInputHint': 'Search in database or enter code directly (name will be fetched automatically)',
'dashboard.analysis.modal.addStock.search': 'Search',
'dashboard.analysis.modal.addStock.searchResults': 'Search Results',
'dashboard.analysis.modal.addStock.hotSymbols': 'Hot Symbols',
'dashboard.analysis.modal.addStock.noHotSymbols': 'No hot symbols available',
'dashboard.analysis.modal.addStock.selectedSymbol': 'Selected Symbol',
'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Please select a symbol first',
'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Please select a symbol or enter symbol code',
'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Please enter symbol code',
'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Please select market type first',
'dashboard.analysis.modal.addStock.searchFailed': 'Search failed, please try again later',
'dashboard.analysis.modal.addStock.noSearchResults': 'No matching symbols found',
'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',
'dashboard.analysis.modal.history.title': 'Analysis History',
'dashboard.analysis.modal.history.viewResult': 'View Result',
'dashboard.analysis.modal.history.completeTime': 'Complete Time',
'dashboard.analysis.modal.history.error': 'Error',
'dashboard.analysis.status.pending': 'Pending',
'dashboard.analysis.status.processing': 'Processing',
'dashboard.analysis.status.completed': 'Completed',
'dashboard.analysis.status.failed': 'Failed',
'dashboard.analysis.message.selectSymbol': 'Please select a symbol first',
'dashboard.analysis.message.taskCreated': 'Analysis task created, executing in background...',
'dashboard.analysis.message.analysisComplete': 'Analysis Complete',
'dashboard.analysis.message.analysisCompleteCache': 'Analysis Complete (Using Cache)',
'dashboard.analysis.message.analysisFailed': 'Analysis failed, please try again later',
'dashboard.analysis.message.addStockSuccess': 'Added successfully',
'dashboard.analysis.message.addStockFailed': 'Failed to add',
'dashboard.analysis.message.removeStockSuccess': 'Removed successfully',
'dashboard.analysis.message.removeStockFailed': 'Failed to remove',
'dashboard.analysis.message.resumingAnalysis': 'Resuming analysis task...',
'dashboard.analysis.message.deleteSuccess': 'Deleted successfully',
'dashboard.analysis.message.deleteFailed': 'Failed to delete',
'dashboard.analysis.modal.history.delete': 'Delete',
'dashboard.analysis.modal.history.deleteConfirm': 'Are you sure you want to delete this analysis record?',
'dashboard.analysis.test': 'Gongzhuan No.{no} shop',
'dashboard.analysis.introduce': 'Introduce',
'dashboard.analysis.total-sales': 'Total Sales',
'dashboard.analysis.day-sales': 'Daily Sales',
'dashboard.analysis.visits': 'Visits',
'dashboard.analysis.visits-trend': 'Visits Trend',
'dashboard.analysis.visits-ranking': 'Visits Ranking',
'dashboard.analysis.day-visits': 'Daily Visits',
'dashboard.analysis.week': 'WoW Change',
'dashboard.analysis.day': 'DoD Change',
'dashboard.analysis.payments': 'Payments',
'dashboard.analysis.conversion-rate': 'Conversion Rate',
'dashboard.analysis.operational-effect': 'Operational Effect',
'dashboard.analysis.sales-trend': 'Stores Sales Trend',
'dashboard.analysis.sales-ranking': 'Sales Ranking',
'dashboard.analysis.all-year': 'All Year',
'dashboard.analysis.all-month': 'All Month',
'dashboard.analysis.all-week': 'All Week',
'dashboard.analysis.all-day': 'All day',
'dashboard.analysis.search-users': 'Search Users',
'dashboard.analysis.per-capita-search': 'Per Capita Search',
'dashboard.analysis.online-top-search': 'Online Top Search',
'dashboard.analysis.the-proportion-of-sales': 'The Proportion Of Sales',
'dashboard.analysis.dropdown-option-one': 'Operation one',
'dashboard.analysis.dropdown-option-two': 'Operation two',
'dashboard.analysis.channel.all': 'ALL',
'dashboard.analysis.channel.online': 'Online',
'dashboard.analysis.channel.stores': 'Stores',
'dashboard.analysis.sales': 'Sales',
'dashboard.analysis.traffic': 'Traffic',
'dashboard.analysis.table.rank': 'Rank',
'dashboard.analysis.table.search-keyword': 'Keyword',
'dashboard.analysis.table.users': 'Users',
'dashboard.analysis.table.weekly-range': 'Weekly Range',
'dashboard.indicator.selectSymbol': 'Select or enter symbol code',
'dashboard.indicator.emptyWatchlistHint': 'No watchlist, please add first',
'dashboard.indicator.hint.selectSymbol': 'Please select a symbol to start analysis',
'dashboard.indicator.hint.selectSymbolDesc': 'Select or enter stock code in the search box above to view K-line chart and technical indicators',
'dashboard.indicator.retry': 'Retry',
'dashboard.indicator.panel.title': 'Technical Indicators',
'dashboard.indicator.panel.realtimeOn': 'Turn off real-time update',
'dashboard.indicator.panel.realtimeOff': 'Turn on real-time update',
'dashboard.indicator.panel.themeLight': 'Switch to dark theme',
'dashboard.indicator.panel.themeDark': 'Switch to light theme',
'dashboard.indicator.section.enabled': 'Enabled',
'dashboard.indicator.section.added': 'My Added Indicators',
'dashboard.indicator.section.custom': 'My Created Indicators',
'dashboard.indicator.section.bought': 'Purchased Indicators',
'dashboard.indicator.section.myCreated': 'My Created Indicators',
'dashboard.indicator.empty': 'No indicators, please add or create indicators first',
'dashboard.indicator.buy': 'Buy Indicators',
'dashboard.indicator.action.start': 'Start',
'dashboard.indicator.action.stop': 'Stop',
'dashboard.indicator.action.edit': 'Edit',
'dashboard.indicator.action.delete': 'Delete',
'dashboard.indicator.action.backtest': 'Backtest',
'dashboard.indicator.status.normal': 'Active',
'dashboard.indicator.status.normalPermanent': 'Active (Permanent)',
'dashboard.indicator.status.expired': 'Expired',
'dashboard.indicator.expiry.permanent': 'Permanent',
'dashboard.indicator.expiry.noExpiry': 'No expiration',
'dashboard.indicator.expiry.expired': 'Expired: {date}',
'dashboard.indicator.expiry.expiresOn': 'Expires: {date}',
'dashboard.indicator.delete.confirmTitle': 'Confirm Deletion',
'dashboard.indicator.delete.confirmContent': 'Are you sure you want to delete indicator "{name}"? This action cannot be undone.',
'dashboard.indicator.delete.confirmOk': 'Delete',
'dashboard.indicator.delete.confirmCancel': 'Cancel',
'dashboard.indicator.delete.success': 'Deleted successfully',
'dashboard.indicator.delete.failed': 'Failed to delete',
'dashboard.indicator.save.success': 'Saved successfully',
'dashboard.indicator.save.failed': 'Failed to save',
'dashboard.indicator.error.loadWatchlistFailed': 'Failed to load watchlist',
'dashboard.indicator.error.chartNotReady': 'Chart component not initialized, please select a symbol and wait for the chart to load',
'dashboard.indicator.error.chartMethodNotReady': 'Chart component method not ready, please try again later',
'dashboard.indicator.error.chartExecuteNotReady': 'Chart component execute method not ready, please try again later',
'dashboard.indicator.error.parseFailed': 'Failed to parse Python code',
'dashboard.indicator.error.parseFailedCheck': 'Failed to parse Python code, please check the code format',
'dashboard.indicator.error.addIndicatorFailed': 'Failed to add indicator',
'dashboard.indicator.error.runIndicatorFailed': 'Failed to run indicator',
'dashboard.indicator.error.pleaseLogin': 'Please login first',
'dashboard.indicator.error.loadDataFailed': 'Failed to load data',
'dashboard.indicator.error.loadDataFailedDesc': 'Please check network connection',
'dashboard.indicator.error.tiingoSubscription': 'Forex 1-minute data requires Tiingo paid subscription. Please use other timeframes or upgrade your subscription.',
'dashboard.indicator.error.pythonEngineFailed': 'Python engine failed to load, indicator functionality may be unavailable',
'dashboard.indicator.error.chartInitFailed': 'Chart initialization failed',
'dashboard.indicator.warning.enterCode': 'Please enter indicator code first',
'dashboard.indicator.warning.chartNotInitialized': 'Chart not initialized, cannot use drawing tools',
'dashboard.indicator.warning.pyodideLoadFailed': 'Python Engine Load Failed',
'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Your current region or network environment cannot use this feature',
'dashboard.indicator.success.runIndicator': 'Indicator ran successfully',
'dashboard.indicator.success.clearDrawings': 'All drawings cleared',
'dashboard.indicator.sma': 'SMA (Moving Average Group)',
'dashboard.indicator.ema': 'EMA (Exponential Moving Average Group)',
'dashboard.indicator.rsi': 'RSI (Relative Strength Index)',
'dashboard.indicator.macd': 'MACD',
'dashboard.indicator.bb': 'Bollinger Bands',
'dashboard.indicator.atr': 'ATR (Average True Range)',
'dashboard.indicator.cci': 'CCI (Commodity Channel Index)',
'dashboard.indicator.williams': 'Williams %R',
'dashboard.indicator.mfi': 'MFI (Money Flow Index)',
'dashboard.indicator.adx': 'ADX (Average Directional Index)',
'dashboard.indicator.obv': 'OBV (On Balance Volume)',
'dashboard.indicator.adosc': 'ADOSC (Accumulation/Distribution Oscillator)',
'dashboard.indicator.ad': 'AD (Accumulation/Distribution Line)',
'dashboard.indicator.kdj': 'KDJ (Stochastic Indicator)',
'dashboard.indicator.signal.buy': 'BUY',
'dashboard.indicator.signal.sell': 'SELL',
'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy',
'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell',
'dashboard.indicator.chart.kline': 'K-Line',
'dashboard.indicator.chart.volume': 'Volume',
'dashboard.indicator.chart.uptrend': 'Up Trend',
'dashboard.indicator.chart.downtrend': 'Down Trend',
'dashboard.indicator.tooltip.time': 'Time',
'dashboard.indicator.tooltip.open': 'O',
'dashboard.indicator.tooltip.close': 'C',
'dashboard.indicator.tooltip.high': 'H',
'dashboard.indicator.tooltip.low': 'L',
'dashboard.indicator.tooltip.volume': 'Volume',
'dashboard.indicator.drawing.line': 'Line',
'dashboard.indicator.drawing.horizontalLine': 'Horizontal Line',
'dashboard.indicator.drawing.verticalLine': 'Vertical Line',
'dashboard.indicator.drawing.ray': 'Ray',
'dashboard.indicator.drawing.straightLine': 'Straight Line',
'dashboard.indicator.drawing.parallelLine': 'Parallel Line',
'dashboard.indicator.drawing.priceLine': 'Price Line',
'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',
'dashboard.indicator.create': 'Create Indicator',
'dashboard.indicator.editor.title': 'Create/Edit Indicator',
'dashboard.indicator.editor.name': 'Indicator Name',
'dashboard.indicator.editor.nameRequired': 'Please enter indicator name',
'dashboard.indicator.editor.namePlaceholder': 'Enter indicator name',
'dashboard.indicator.editor.description': 'Description',
'dashboard.indicator.editor.descriptionPlaceholder': 'Enter description (optional)',
'dashboard.indicator.editor.code': 'Python Code',
'dashboard.indicator.editor.codeRequired': 'Please enter indicator code',
'dashboard.indicator.editor.codePlaceholder': 'Enter Python code',
'dashboard.indicator.editor.run': 'Run',
'dashboard.indicator.editor.runHint': 'Click Run button to preview indicator on K-line chart',
'dashboard.indicator.editor.guide': 'Development Guide',
'dashboard.indicator.editor.guideTitle': 'Python Indicator Development Guide',
'dashboard.indicator.editor.save': 'Save',
'dashboard.indicator.editor.cancel': 'Cancel',
'dashboard.indicator.editor.unnamed': 'Unnamed Indicator',
'dashboard.indicator.editor.publishToCommunity': 'Publish to Community',
'dashboard.indicator.editor.publishToCommunityHint': 'After publishing, other users can view and use your indicator in the community',
'dashboard.indicator.editor.indicatorType': 'Indicator Type',
'dashboard.indicator.editor.indicatorTypeRequired': 'Please select indicator type',
'dashboard.indicator.editor.indicatorTypePlaceholder': 'Please select indicator type',
'dashboard.indicator.editor.previewImage': 'Preview Image',
'dashboard.indicator.editor.uploadImage': 'Upload Image',
'dashboard.indicator.editor.previewImageHint': 'Recommended size: 800x400, max 2MB',
'dashboard.indicator.editor.pricing': 'Pricing (QDT)',
'dashboard.indicator.editor.pricingType.free': 'Free',
'dashboard.indicator.editor.pricingType.permanent': 'Permanent',
'dashboard.indicator.editor.pricingType.monthly': 'Monthly',
'dashboard.indicator.editor.price': 'Price',
'dashboard.indicator.editor.priceRequired': 'Please enter price',
'dashboard.indicator.editor.pricePlaceholder': 'Please enter price',
'dashboard.indicator.editor.pricingHint': 'Free indicators (price 0) will still receive platform rewards based on usage and ratings (QDT)',
'dashboard.indicator.editor.aiGenerate': 'AI Generate',
'dashboard.indicator.editor.aiPromptPlaceholder': 'Describe your signal logic (buy/sell only) and plots. Position sizing, risk, scaling, fees/slippage are configured in backtest.',
'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.',
'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.",
'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.',
'dashboard.indicator.editor.aiGenerateBtn': 'AI Generate Code',
'dashboard.indicator.editor.aiPromptRequired': 'Please enter your idea',
'dashboard.indicator.editor.aiGenerateSuccess': 'Code generated successfully',
'dashboard.indicator.editor.aiGenerateError': 'Code generation failed, please try again later',
'dashboard.indicator.editor.verifyCode': 'Verify Code',
'dashboard.indicator.editor.verifyCodeSuccess': 'Verification Passed',
'dashboard.indicator.editor.verifyCodeFailed': 'Verification Failed',
'dashboard.indicator.editor.verifyCodeEmpty': 'Code cannot be empty',
'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide',
'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.',
'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables',
'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).',
'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries',
'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:',
'dashboard.indicator.guide.section1.libsList': '<code>pandas</code> (pd), <code>numpy</code> (np), <code>math</code>, <code>json</code>',
'dashboard.indicator.guide.section1.data': 'Input Data: df',
'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is <code>df</code>.',
'dashboard.indicator.guide.section1.dataColumns': '<code>df</code> contains the following columns (all float type):',
'dashboard.indicator.guide.section1.dataColumnsList': '<code>time</code> (timestamp, seconds), <code>open</code>, <code>high</code>, <code>low</code>, <code>close</code>, <code>volume</code>',
'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).',
'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using <code>.values</code> which loses the index.',
'dashboard.indicator.guide.section2.title': '2. Parameter Definition',
'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like <code>variable = value</code> as adjustable parameters.',
'dashboard.indicator.guide.section2.example': 'Parameter Example',
'dashboard.indicator.guide.section2.exampleCode': '<code>span = 20</code> or <code>multiplier = 2.0</code>',
'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)',
'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you <strong>must</strong> set the following two columns in your code:',
'dashboard.indicator.guide.section3.backtestRequired': '<strong>Required for Backtesting:</strong>',
'dashboard.indicator.guide.section3.backtestBuySignal': "<code>df['buy_signal']</code> - Boolean Series, True indicates buy signal",
'dashboard.indicator.guide.section3.backtestSellSignal': "<code>df['sell_signal']</code> - Boolean Series, True indicates sell signal",
'dashboard.indicator.guide.section3.backtestExample': 'Example:',
'dashboard.indicator.guide.section3.backtestExampleCode': "<code>df['buy_signal'] = condition_buy</code><br/><code>df['sell_signal'] = condition_sell</code>",
'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set <code>output.signals</code> for chart display, you must set these two columns to enable backtesting.',
'dashboard.indicator.guide.section4.title': '4. Output Requirements: output',
'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named <code>output</code> to tell the chart how to display results.',
'dashboard.indicator.guide.section4.fields': 'The <code>output</code> dictionary contains the following fields:',
'dashboard.indicator.guide.section4.plots': '<code>plots</code> - For drawing lines (e.g., moving averages, RSI)',
'dashboard.indicator.guide.section4.signals': '<code>signals</code> - For marking buy/sell signals (e.g., arrows, labels)',
'dashboard.indicator.guide.section4.name': '<code>name</code> - Indicator name (optional)',
'dashboard.indicator.guide.section4.calculatedVars': '<code>calculatedVars</code> - Calculated variables (optional, for displaying additional information)',
'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)',
'dashboard.indicator.guide.section5.desc': 'Each object in the <code>plots</code> list represents a line.',
'dashboard.indicator.guide.section5.table.field': 'Field',
'dashboard.indicator.guide.section5.table.type': 'Type',
'dashboard.indicator.guide.section5.table.required': 'Required',
'dashboard.indicator.guide.section5.table.requiredYes': 'Yes',
'dashboard.indicator.guide.section5.table.requiredNo': 'No',
'dashboard.indicator.guide.section5.table.desc': 'Description',
'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend',
'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use <code>series.tolist()</code>',
'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign",
'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'",
'dashboard.indicator.guide.section5.table.overlay': '<strong>Important.</strong> True means display on main chart (with K-line), False means display on sub-chart (independent area)',
'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)',
'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA',
'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output',
'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart',
'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)',
'dashboard.indicator.guide.section6.desc': "<code>signals</code> are used to mark buy/sell points on specific K-lines through icons or text. <strong>Note:</strong> This is only for chart display. The backtest system uses <code>df['buy_signal']</code> and <code>df['sell_signal']</code>.",
'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)",
'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions',
'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")',
'dashboard.indicator.guide.section6.table.color': 'Marker color',
'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.',
'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line',
'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line',
'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals',
'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None',
'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price',
'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations',
'dashboard.indicator.guide.section6.examplePrice': 'Record price',
'dashboard.indicator.guide.section6.exampleText': 'Buy',
'dashboard.indicator.guide.section7.title': '7. Complete Code Examples',
'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)',
'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators<br/>df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()<br/>df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()<br/><br/># 2. Calculate crossover signals<br/>cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))<br/>cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))<br/><br/># 3. 【Important】Set NEW backtest signal columns (bool)<br/>df['open_long'] = cross_up<br/>df['close_long'] = cross_down<br/>df['open_short'] = cross_down<br/>df['close_short'] = cross_up<br/><br/># 4. Generate signal data for chart display<br/>buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]<br/>sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]<br/><br/># 5. Build output<br/>output = {<br/> \"name\": \"Dual EMA Strategy\",<br/> \"plots\": [<br/> {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},<br/> {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}<br/> ],<br/> \"signals\": [<br/> {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},<br/> {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}<br/> ]<br/>}",
'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only',
'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)<br/>length = 20<br/>mult = 2.0<br/>df['sma'] = df['close'].rolling(length).mean()<br/>df['std'] = df['close'].rolling(length).std()<br/>df['upper'] = df['sma'] + mult * df['std']<br/>df['lower'] = df['sma'] - mult * df['std']<br/><br/>output = {<br/> \"name\": \"Bollinger Bands\",<br/> \"plots\": [<br/> {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},<br/> {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},<br/> {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}<br/> ]<br/>}",
'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)',
'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI<br/>delta = df['close'].diff()<br/>up = delta.clip(lower=0)<br/>down = -1 * delta.clip(upper=0)<br/>ema_up = up.ewm(com=13, adjust=False).mean()<br/>ema_down = down.ewm(com=13, adjust=False).mean()<br/>rs = ema_up / ema_down<br/>df['rsi'] = 100 - (100 / (1 + rs))<br/><br/># Generate trading signals<br/>buy_condition = df['rsi'] < 30 # Oversold buy<br/>sell_condition = df['rsi'] > 70 # Overbought sell<br/><br/># 【Important】Set NEW backtest signal columns (bool)<br/>df['open_long'] = buy_condition<br/>df['close_long'] = sell_condition<br/>df['open_short'] = sell_condition<br/>df['close_short'] = buy_condition<br/><br/># Generate chart signals<br/>buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]<br/>sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]<br/><br/>output = {<br/> \"name\": \"RSI Strategy\",<br/> \"plots\": [<br/> {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},<br/> {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},<br/> {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}<br/> ],<br/> \"signals\": [<br/> {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},<br/> {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}<br/> ]<br/>}",
'dashboard.indicator.guide.section6.param': 'Parameters',
'dashboard.indicator.guide.section6.calc': 'Calculate',
'dashboard.indicator.guide.section6.output': 'Output',
'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)',
'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart',
'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)',
'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?",
'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: <code>df['open_long']</code>, <code>df['close_long']</code>, <code>df['open_short']</code>, <code>df['close_short']</code> (boolean). Even if you set <code>output.signals</code> for chart display, you must set these columns to enable backtesting.",
'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?',
'dashboard.indicator.guide.section8.a2': "A: The <code>data</code> list in <code>plots</code> and <code>signals</code> must have exactly the same length as the K-line data. If you use <code>df['xxx'].tolist()</code>, there is usually no problem.",
'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?',
'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use <code>df.fillna(0)</code> or other methods.",
'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?',
'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using <code>.values</code> to create new Series. Use columns directly like <code>df['close']</code> for operations.",
'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?',
'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.',
'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?',
'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.',
'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?',
'dashboard.indicator.guide.section8.a7': "A: Please check the data type of <code>df['open_long']</code>/<code>df['close_long']</code>/<code>df['open_short']</code>/<code>df['close_short']</code>. They should be boolean (True/False), not numeric. Use <code>condition.fillna(False).astype(bool)</code> to ensure correct type.",
'dashboard.indicator.backtest.title': 'Indicator Backtest',
'dashboard.indicator.backtest.config': 'Backtest Parameters',
'dashboard.indicator.backtest.startDate': 'Start Date',
'dashboard.indicator.backtest.endDate': 'End Date',
'dashboard.indicator.backtest.selectStartDate': 'Select start date',
'dashboard.indicator.backtest.selectEndDate': 'Select end date',
'dashboard.indicator.backtest.startDateRequired': 'Please select start date',
'dashboard.indicator.backtest.endDateRequired': 'Please select end date',
'dashboard.indicator.backtest.initialCapital': 'Initial Capital',
'dashboard.indicator.backtest.initialCapitalRequired': 'Please enter initial capital',
'dashboard.indicator.backtest.commission': 'Commission Rate (%)',
'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.',
'dashboard.indicator.backtest.leverage': 'Leverage',
'dashboard.indicator.backtest.timeframe': 'Timeframe',
'dashboard.indicator.backtest.tradeDirection': 'Trade Direction',
'dashboard.indicator.backtest.longOnly': 'Long Only',
'dashboard.indicator.backtest.shortOnly': 'Short Only',
'dashboard.indicator.backtest.both': 'Both',
'dashboard.indicator.backtest.run': 'Run Backtest',
'dashboard.indicator.backtest.rerun': 'Run Again',
'dashboard.indicator.backtest.close': 'Close',
'dashboard.indicator.backtest.running': 'Running indicator backtest...',
'dashboard.indicator.backtest.loadingTip1': 'Fetching historical K-line data...',
'dashboard.indicator.backtest.loadingTip2': 'Executing strategy signal calculation...',
'dashboard.indicator.backtest.loadingTip3': 'Simulating trade execution...',
'dashboard.indicator.backtest.loadingTip4': 'Calculating backtest metrics...',
'dashboard.indicator.backtest.loadingTip5': 'Almost done, please wait...',
'dashboard.indicator.backtest.results': 'Backtest Results',
'dashboard.indicator.backtest.totalReturn': 'Total Return',
'dashboard.indicator.backtest.annualReturn': 'Annual Return',
'dashboard.indicator.backtest.maxDrawdown': 'Max Drawdown',
'dashboard.indicator.backtest.sharpeRatio': 'Sharpe Ratio',
'dashboard.indicator.backtest.winRate': 'Win Rate',
'dashboard.indicator.backtest.profitFactor': 'Profit Factor',
'dashboard.indicator.backtest.totalTrades': 'Total Trades',
'dashboard.indicator.totalReturn': 'Total Return',
'dashboard.indicator.annualReturn': 'Annual Return',
'dashboard.indicator.maxDrawdown': 'Max Drawdown',
'dashboard.indicator.sharpeRatio': 'Sharpe Ratio',
'dashboard.indicator.winRate': 'Win Rate',
'dashboard.indicator.profitFactor': 'Profit Factor',
'dashboard.indicator.totalTrades': 'Total Trades',
'dashboard.indicator.backtest.totalCommission': 'Total Commission',
'dashboard.indicator.backtest.equityCurve': 'Equity Curve',
'dashboard.indicator.backtest.strategy': 'Indicator',
'dashboard.indicator.backtest.benchmark': 'Benchmark',
'dashboard.indicator.backtest.tradeHistory': 'Trade History',
'dashboard.indicator.backtest.tradeTime': 'Time',
'dashboard.indicator.backtest.tradeType': 'Type',
'dashboard.indicator.backtest.buy': 'Buy',
'dashboard.indicator.backtest.sell': 'Sell',
'dashboard.indicator.backtest.liquidation': 'Liquidation',
'dashboard.indicator.backtest.openLong': 'Open Long',
'dashboard.indicator.backtest.closeLong': 'Close Long',
'dashboard.indicator.backtest.closeLongStop': 'Close Long (Stop Loss)',
'dashboard.indicator.backtest.closeLongProfit': 'Close Long (Take Profit)',
'dashboard.indicator.backtest.addLong': 'Add Long',
'dashboard.indicator.backtest.openShort': 'Open Short',
'dashboard.indicator.backtest.closeShort': 'Close Short',
'dashboard.indicator.backtest.closeShortStop': 'Close Short (Stop Loss)',
'dashboard.indicator.backtest.closeShortProfit': 'Close Short (Take Profit)',
'dashboard.indicator.backtest.addShort': 'Add Short',
'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)',
'dashboard.indicator.backtest.reduceLong': 'Reduce Long',
'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)',
'dashboard.indicator.backtest.reduceShort': 'Reduce Short',
'dashboard.indicator.backtest.price': 'Price',
'dashboard.indicator.backtest.amount': 'Amount',
'dashboard.indicator.backtest.balance': 'Balance',
'dashboard.indicator.backtest.profit': 'P&L',
'dashboard.indicator.backtest.success': 'Backtest completed',
'dashboard.indicator.backtest.failed': 'Backtest failed, please try again later',
'dashboard.indicator.backtest.quickSelect': 'Quick Select',
// Multi-timeframe backtest precision hints
'dashboard.indicator.backtest.precisionMode': 'Backtest Precision Mode',
'dashboard.indicator.backtest.estimatedCandles': 'Est. {count} candles to process',
'dashboard.indicator.backtest.highPrecisionDesc': 'Using 1-minute candles for high-precision backtest, stop-loss/take-profit triggers are more accurate',
'dashboard.indicator.backtest.mediumPrecisionDesc': 'Range exceeds 30 days, using 5-minute candles to balance precision and performance',
'dashboard.indicator.backtest.standardModeWarning': 'Using Standard Backtest Mode',
'dashboard.indicator.backtest.standardModeDesc': 'Current config does not support high-precision backtest, using strategy timeframe',
'dashboard.indicator.backtest.onlyCryptoSupported': 'High-precision backtest only supports cryptocurrency market',
'dashboard.indicator.backtest.noIndicatorCode': 'This indicator has no backtestable code',
'dashboard.indicator.backtest.noSymbol': 'Please select a trading symbol first',
'dashboard.indicator.backtest.dateRangeExceeded': 'Backtest date range exceeded: {timeframe} timeframe allows max {maxRange}',
'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)',
'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}',
'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}',
'dashboard.indicator.backtest.historyTitle': 'Backtest History',
'dashboard.indicator.backtest.historyRefresh': 'Refresh',
'dashboard.indicator.backtest.historyView': 'View',
'dashboard.indicator.backtest.historyNoData': 'No backtest history',
'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe',
'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol',
'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe',
'dashboard.indicator.backtest.historyApply': 'Apply filters',
'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze',
'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions',
'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result',
'dashboard.indicator.backtest.historyRunId': 'Run ID',
'dashboard.indicator.backtest.historyCreatedAt': 'Time',
'dashboard.indicator.backtest.historyRange': 'Range',
'dashboard.indicator.backtest.historyStatus': 'Status',
'dashboard.indicator.backtest.historyStatusSuccess': 'Success',
'dashboard.indicator.backtest.historyStatusFailed': 'Failed',
'dashboard.indicator.backtest.historyActions': 'Actions',
'dashboard.indicator.backtest.prev': 'Previous',
'dashboard.indicator.backtest.next': 'Next',
'dashboard.indicator.backtest.steps.strategy.title': 'Execution Config',
'dashboard.indicator.backtest.steps.strategy.desc': 'Position, risk, scaling',
'dashboard.indicator.backtest.steps.trading.title': 'Backtest Setup',
'dashboard.indicator.backtest.steps.trading.desc': 'Time, capital, fees, leverage, slippage',
'dashboard.indicator.backtest.steps.results.title': 'Results',
'dashboard.indicator.backtest.steps.results.desc': 'Summary & trades',
'dashboard.indicator.backtest.panel.risk': 'Execution: Risk (SL / trailing)',
'dashboard.indicator.backtest.panel.scale': 'Execution: Scale-in (Trend / DCA)',
'dashboard.indicator.backtest.panel.reduce': 'Execution: Scale-out (Trend / Adverse)',
'dashboard.indicator.backtest.panel.position': 'Execution: Entry sizing',
'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)',
'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)',
'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit',
'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)',
'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)',
'dashboard.indicator.backtest.field.slippage': 'Slippage (%)',
'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in',
'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA',
'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)',
'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)',
'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)',
'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)',
'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times',
'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times',
'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce',
'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce',
'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)',
'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)',
'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)',
'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)',
'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times',
'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times',
'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)',
'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)',
'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)',
'dashboard.docs.title': 'Documentation',
'dashboard.docs.search.placeholder': 'Search documents...',
'dashboard.docs.category.all': 'All',
'dashboard.docs.category.guide': 'Guides',
'dashboard.docs.category.api': 'API Reference',
'dashboard.docs.category.tutorial': 'Tutorials',
'dashboard.docs.category.faq': 'FAQ',
'dashboard.docs.featured.title': 'Featured Documents',
'dashboard.docs.featured.tag': 'Featured',
'dashboard.docs.list.views': 'views',
'dashboard.docs.list.author': 'Author',
'dashboard.docs.list.empty': 'No documents',
'dashboard.docs.list.backToAll': 'Back to All Documents',
'dashboard.docs.list.total': 'Total {count} documents',
'dashboard.docs.detail.back': 'Back to List',
'dashboard.docs.detail.updatedAt': 'Updated at',
'dashboard.docs.detail.related': 'Related Documents',
'dashboard.docs.detail.notFound': 'Document Not Found',
'dashboard.docs.detail.error': 'Document does not exist or has been deleted',
'dashboard.docs.search.result': 'Search Results',
'dashboard.docs.search.keyword': 'Keyword',
'community.filter.indicatorType': 'Indicator Type',
'community.filter.all': 'All',
'community.filter.other': 'Other Options',
'community.filter.pricing': 'Pricing Type',
'community.filter.allPricing': 'All Pricing',
'community.filter.sortBy': 'Sort By',
'community.filter.search': 'Search',
'community.filter.searchPlaceholder': 'Search indicator name',
'community.indicatorType.trend': 'Trend',
'community.indicatorType.momentum': 'Momentum',
'community.indicatorType.volatility': 'Volatility',
'community.indicatorType.volume': 'Volume',
'community.indicatorType.custom': 'Custom',
'community.pricing.free': 'Free',
'community.pricing.paid': 'Paid',
'community.sort.downloads': 'Downloads',
'community.sort.rating': 'Rating',
'community.sort.newest': 'Newest',
'community.pagination.total': 'Total {total} indicators',
'community.noDescription': 'No description',
'community.detail.type': 'Type',
'community.detail.pricing': 'Pricing',
'community.detail.rating': 'Rating',
'community.detail.downloads': 'Downloads',
'community.detail.author': 'Author',
'community.detail.description': 'Description',
'community.detail.detailContent': 'Detail Content',
'community.detail.backtestStats': 'Backtest Statistics',
'community.action.purchase': 'Purchase',
'community.action.addToMyIndicators': 'Add to My Indicators',
'community.action.favorite': 'Favorite',
'community.action.unfavorite': 'Unfavorite',
'community.action.buyNow': 'Buy Now',
'community.action.renew': 'Renew',
'community.purchase.price': 'Price',
'community.purchase.permanent': 'Permanent',
'community.purchase.monthly': 'Month',
'community.purchase.confirmBuy': 'Confirm purchase ({price} QDT)?',
'community.purchase.confirmRenew': 'Confirm renewal ({price} QDT/month)?',
'community.purchase.confirmFree': 'Confirm to add this free indicator?',
'community.purchase.confirmTitle': 'Confirm',
'community.purchase.owned': 'You own this indicator (permanent)',
'community.purchase.ownIndicator': 'This is your published indicator',
'community.purchase.expired': 'Your subscription has expired',
'community.purchase.expiresOn': 'Expires on: {date}',
'community.tabs.detail': 'Details',
'community.tabs.backtest': 'Backtest',
'community.tabs.ratings': 'Reviews',
'community.rating.myRating': 'My Rating',
'community.rating.stars': '{count} Stars',
'community.rating.commentPlaceholder': 'Share your experience...',
'community.rating.submit': 'Submit Rating',
'community.rating.modify': 'Edit',
'community.rating.saveModify': 'Save Changes',
'community.rating.cancel': 'Cancel',
'community.rating.selectRating': 'Please select a rating',
'community.rating.success': 'Rating submitted successfully',
'community.rating.modifySuccess': 'Review modified successfully',
'community.rating.failed': 'Failed to submit rating',
'community.rating.noRatings': 'No reviews yet',
'community.backtest.note': 'The above data is from historical backtesting, for reference only, and does not represent future returns',
'community.backtest.noData': 'No backtest data available',
'community.backtest.uploadHint': 'Author has not uploaded backtest data yet',
'community.message.loadFailed': 'Failed to load indicators',
'community.message.purchaseProcessing': 'Processing purchase...',
'community.message.downloadSuccess': 'Indicator added to your list',
'community.message.favoriteSuccess': 'Favorited successfully',
'community.message.unfavoriteSuccess': 'Unfavorited successfully',
'community.message.operationSuccess': 'Operation successful',
'community.message.operationFailed': 'Operation failed',
'community.banner.readOnly': 'Read Only',
'community.banner.loginHint': 'For login or registration, please click the button to jump to an independent page to avoid CSRF issues',
'community.banner.jumpButton': 'Go to Login/Register',
'dashboard.totalEquity': 'Total Equity',
'dashboard.totalPnL': 'Total P&L',
'dashboard.aiStrategies': 'AI Strategies',
'dashboard.indicatorStrategies': 'Indicator Strategies',
'dashboard.running': 'Running',
'dashboard.enabled': 'Enabled',
'dashboard.pnlHistory': 'P&L History',
'dashboard.strategyPerformance': 'Strategy Performance',
'dashboard.strategyRanking': 'Strategy Ranking',
// New KPI labels
'dashboard.winRate': 'Win Rate',
'dashboard.profitFactor': 'Profit Factor',
'dashboard.maxDrawdown': 'Max Drawdown',
'dashboard.totalTrades': 'Total Trades',
'dashboard.runningStrategies': 'Running Strategies',
'dashboard.equityCurve': 'Equity Curve',
'dashboard.strategyAllocation': 'Strategy Allocation',
'dashboard.drawdownCurve': 'Drawdown Curve',
'dashboard.drawdown': 'Drawdown',
'dashboard.hourlyDistribution': 'Hourly Distribution',
// Chart labels
'dashboard.dailyPnl': 'Daily P&L',
'dashboard.cumulativePnl': 'Cumulative P&L',
'dashboard.tradeCount': 'Trade Count',
'dashboard.profit': 'Profit',
'dashboard.noData': 'No Data',
'dashboard.noStrategyData': 'No strategy data',
// Ranking labels
'dashboard.ranking.totalProfit': 'Total Profit',
'dashboard.ranking.roi': 'ROI',
'dashboard.ranking.trades': 'Trades',
// Units and labels
'dashboard.unit.trades': '',
'dashboard.unit.strategies': '',
'dashboard.label.avgDaily': 'Avg Daily',
'dashboard.label.avgProfit': 'Avg Profit',
'dashboard.label.win': 'W',
'dashboard.label.lose': 'L',
'dashboard.label.trade': 'Trades',
'dashboard.label.indicator': 'Indicator',
'dashboard.label.totalPnl': 'Total P&L',
'dashboard.label.maxDrawdownPoint': 'Max DD',
'dashboard.profitCalendar': 'Profit Calendar',
'dashboard.recentTrades': 'Recent Trades',
'dashboard.currentPositions': 'Current Positions',
'dashboard.table.time': 'Time',
'dashboard.table.strategy': 'Strategy',
'dashboard.table.symbol': 'Symbol',
'dashboard.table.type': 'Type',
'dashboard.table.side': 'Side',
'dashboard.table.size': 'Size',
'dashboard.table.entryPrice': 'Entry Price',
'dashboard.table.price': 'Price',
'dashboard.table.amount': 'Amount',
'dashboard.table.profit': 'Profit',
'dashboard.pendingOrders': 'Order Execution Records',
'dashboard.totalOrders': 'Total {total} orders',
'dashboard.viewError': 'View Error',
'dashboard.filled': 'Filled',
'dashboard.orderTable.time': 'Created Time',
'dashboard.orderTable.strategy': 'Strategy',
'dashboard.orderTable.symbol': 'Symbol',
'dashboard.orderTable.signalType': 'Signal Type',
'dashboard.orderTable.amount': 'Amount',
'dashboard.orderTable.price': 'Filled Price',
'dashboard.orderTable.status': 'Status',
'dashboard.orderTable.timeInfo': 'Time',
'dashboard.orderTable.executedAt': 'Executed Time',
'dashboard.orderTable.exchange': 'Exchange',
'dashboard.orderTable.notify': 'Notify',
'dashboard.orderTable.actions': 'Actions',
'dashboard.orderTable.delete': 'Delete',
'dashboard.orderTable.deleteConfirm': 'Delete this record?',
'dashboard.orderTable.deleteSuccess': 'Deleted',
'dashboard.orderTable.deleteFailed': 'Delete failed',
'dashboard.newOrderNotify': 'New Order Alert',
'dashboard.newOrderDesc': 'New order execution record',
'dashboard.soundEnabled': 'Sound notification enabled',
'dashboard.soundDisabled': 'Sound notification disabled',
'dashboard.clickToMute': 'Click to mute',
'dashboard.clickToUnmute': 'Click to unmute',
'dashboard.signalType.openLong': 'Open Long',
'dashboard.signalType.openShort': 'Open Short',
'dashboard.signalType.closeLong': 'Close Long',
'dashboard.signalType.closeShort': 'Close Short',
'dashboard.signalType.addLong': 'Add Long',
'dashboard.signalType.addShort': 'Add Short',
'dashboard.status.pending': 'Pending',
'dashboard.status.processing': 'Processing',
'dashboard.status.completed': 'Completed',
'dashboard.status.failed': 'Failed',
'dashboard.status.cancelled': 'Cancelled',
'dashboard.table.pnl': 'Unrealized P&L',
'form.basic-form.basic.title': 'Basic form',
'form.basic-form.basic.description': 'Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.',
'form.basic-form.title.label': 'Title',
'form.basic-form.title.placeholder': 'Give the target a name',
'form.basic-form.title.required': 'Please enter a title',
'form.basic-form.date.label': 'Start and end date',
'form.basic-form.placeholder.start': 'Start date',
'form.basic-form.placeholder.end': 'End date',
'form.basic-form.date.required': 'Please select the start and end date',
'form.basic-form.goal.label': 'Goal description',
'form.basic-form.goal.placeholder': 'Please enter your work goals',
'form.basic-form.goal.required': 'Please enter a description of the goal',
'form.basic-form.standard.label': 'Metrics',
'form.basic-form.standard.placeholder': 'Please enter a metric',
'form.basic-form.standard.required': 'Please enter a metric',
'form.basic-form.client.label': 'Client',
'form.basic-form.label.tooltip': 'Target service object',
'form.basic-form.client.placeholder': 'Please describe your customer service, internal customers directly @ Name / job number',
'form.basic-form.client.required': 'Please describe the customers you serve',
'form.basic-form.invites.label': 'Inviting critics',
'form.basic-form.invites.placeholder': 'Please direct @ Name / job number, you can invite up to 5 people',
'form.basic-form.weight.label': 'Weight',
'form.basic-form.weight.placeholder': 'Please enter weight',
'form.basic-form.public.label': 'Target disclosure',
'form.basic-form.label.help': 'Customers and invitees are shared by default',
'form.basic-form.radio.public': 'Public',
'form.basic-form.radio.partially-public': 'Partially public',
'form.basic-form.radio.private': 'Private',
'form.basic-form.publicUsers.placeholder': 'Open to',
'form.basic-form.option.A': 'Colleague A',
'form.basic-form.option.B': 'Colleague B',
'form.basic-form.option.C': 'Colleague C',
'form.basic-form.email.required': 'Please enter your email!',
'form.basic-form.email.wrong-format': 'The email address is in the wrong format!',
'form.basic-form.userName.required': 'Please enter your userName!',
'form.basic-form.password.required': 'Please enter your password!',
'form.basic-form.password.twice': 'The passwords entered twice do not match!',
'form.basic-form.strength.msg': "Please enter at least 6 characters and don't use passwords that are easy to guess.",
'form.basic-form.strength.strong': 'Strength: strong',
'form.basic-form.strength.medium': 'Strength: medium',
'form.basic-form.strength.short': 'Strength: too short',
'form.basic-form.confirm-password.required': 'Please confirm your password!',
'form.basic-form.phone-number.required': 'Please enter your phone number!',
'form.basic-form.phone-number.wrong-format': 'Malformed phone number!',
'form.basic-form.verification-code.required': 'Please enter the verification code!',
'form.basic-form.form.get-captcha': 'Get Captcha',
'form.basic-form.captcha.second': 'sec',
'form.basic-form.form.optional': ' (optional) ',
'form.basic-form.form.submit': 'Submit',
'form.basic-form.form.save': 'Save',
'form.basic-form.email.placeholder': 'Email',
'form.basic-form.password.placeholder': 'Password',
'form.basic-form.confirm-password.placeholder': 'Confirm password',
'form.basic-form.phone-number.placeholder': 'Phone number',
'form.basic-form.verification-code.placeholder': 'Verification code',
'result.success.title': 'Submission Success',
'result.success.description': 'The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying “documents”, the following gray area can present more complicated content.',
'result.success.operate-title': 'Project Name',
'result.success.operate-id': 'Project ID',
'result.success.principal': 'Principal',
'result.success.operate-time': 'Effective time',
'result.success.step1-title': 'Create project',
'result.success.step1-operator': 'Qu Lili',
'result.success.step2-title': 'Departmental preliminary review',
'result.success.step2-operator': 'Zhou Maomao',
'result.success.step2-extra': 'Urge',
'result.success.step3-title': 'Financial review',
'result.success.step4-title': 'Finish',
'result.success.btn-return': 'Back List',
'result.success.btn-project': 'View Project',
'result.success.btn-print': 'Print',
'result.fail.error.title': 'Submission Failed',
'result.fail.error.description': 'Please check and modify the following information before resubmitting.',
'result.fail.error.hint-title': 'The content you submitted has the following error:',
'result.fail.error.hint-text1': 'Your account has been frozen',
'result.fail.error.hint-btn1': 'Thaw immediately',
'result.fail.error.hint-text2': 'Your account is not yet eligible to apply',
'result.fail.error.hint-btn2': 'Upgrade immediately',
'result.fail.error.btn-text': 'Return to modify',
'account.settings.menuMap.custom': 'Custom Settings',
'account.settings.menuMap.binding': 'Account Binding',
'account.settings.basic.avatar': 'Avatar',
'account.settings.basic.change-avatar': 'Change avatar',
'account.settings.basic.email': 'Email',
'account.settings.basic.email-message': 'Please input your email!',
'account.settings.basic.nickname': 'Nickname',
'account.settings.basic.nickname-message': 'Please input your Nickname!',
'account.settings.basic.profile': 'Personal profile',
'account.settings.basic.profile-message': 'Please input your personal profile!',
'account.settings.basic.profile-placeholder': 'Brief introduction to yourself',
'account.settings.basic.country': 'Country/Region',
'account.settings.basic.country-message': 'Please input your country!',
'account.settings.basic.geographic': 'Province or city',
'account.settings.basic.geographic-message': 'Please input your geographic info!',
'account.settings.basic.address': 'Street Address',
'account.settings.basic.address-message': 'Please input your address!',
'account.settings.basic.phone': 'Phone Number',
'account.settings.basic.phone-message': 'Please input your phone!',
'account.settings.basic.update': 'Update Information',
'account.settings.basic.update.success': 'Update basic information successfully',
'account.settings.security.strong': 'Strong',
'account.settings.security.medium': 'Medium',
'account.settings.security.weak': 'Weak',
'account.settings.security.password': 'Account Password',
'account.settings.security.password-description': 'Current password strength',
'account.settings.security.phone': 'Security Phone',
'account.settings.security.phone-description': 'Bound phone',
'account.settings.security.question': 'Security Question',
'account.settings.security.question-description': 'The security question is not set, and the security policy can effectively protect the account security',
'account.settings.security.email': 'Bound Email',
'account.settings.security.email-description': 'Bound Email',
'account.settings.security.mfa': 'MFA Device',
'account.settings.security.mfa-description': 'Unbound MFA device, after binding, can be confirmed twice',
'account.settings.security.modify': 'Modify',
'account.settings.security.set': 'Set',
'account.settings.security.bind': 'Bind',
'account.settings.binding.taobao': 'Binding Taobao',
'account.settings.binding.taobao-description': 'Currently unbound Taobao account',
'account.settings.binding.alipay': 'Binding Alipay',
'account.settings.binding.alipay-description': 'Currently unbound Alipay account',
'account.settings.binding.dingding': 'Binding DingTalk',
'account.settings.binding.dingding-description': 'Currently unbound DingTalk account',
'account.settings.binding.bind': 'Bind',
'account.settings.notification.password': 'Account Password',
'account.settings.notification.password-description': 'Messages from other users will be notified in the form of a station letter',
'account.settings.notification.messages': 'System Messages',
'account.settings.notification.messages-description': 'System messages will be notified in the form of a station letter',
'account.settings.notification.todo': 'To-do Notification',
'account.settings.notification.todo-description': 'The to-do list will be notified in the form of a letter from the station',
'account.settings.settings.open': 'Open',
'account.settings.settings.close': 'Close',
'trading-assistant.title': 'Trading Assistant',
'trading-assistant.strategyList': 'Strategy List',
'trading-assistant.createStrategy': 'Create Strategy',
'trading-assistant.noStrategy': 'No strategies',
'trading-assistant.selectStrategy': 'Please select a strategy from the left to view details',
'trading-assistant.startStrategy': 'Start Strategy',
'trading-assistant.stopStrategy': 'Stop Strategy',
'trading-assistant.editStrategy': 'Edit Strategy',
'trading-assistant.deleteStrategy': 'Delete Strategy',
'trading-assistant.startAll': 'Start All',
'trading-assistant.stopAll': 'Stop All',
'trading-assistant.deleteAll': 'Delete All',
'trading-assistant.symbolCount': 'symbols',
'trading-assistant.status.running': 'Running',
'trading-assistant.status.stopped': 'Stopped',
'trading-assistant.status.error': 'Error',
'trading-assistant.strategyType.IndicatorStrategy': 'Indicator Strategy',
'trading-assistant.strategyType.PromptBasedStrategy': 'Prompt Strategy',
'trading-assistant.strategyType.GridStrategy': 'Grid Strategy',
'trading-assistant.tabs.tradingRecords': 'Trading Records',
'trading-assistant.tabs.positions': 'Positions',
'trading-assistant.tabs.equityCurve': 'Equity Curve',
'trading-assistant.form.step1': 'Select Indicator',
'trading-assistant.form.step2': 'Exchange Configuration',
'trading-assistant.form.step3': 'Strategy Parameters',
'trading-assistant.form.step2Params': 'Parameters',
'trading-assistant.form.step3Signal': 'Signal Delivery',
'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',
'trading-assistant.form.indicator': 'Select Indicator',
'trading-assistant.form.indicatorHint': 'You can only select indicators you have purchased or created',
'trading-assistant.form.qdtCostHints': 'Using strategies will consume QDT, please ensure your account has sufficient QDT balance',
'trading-assistant.form.indicatorDescription': 'Indicator Description',
'trading-assistant.form.noDescription': 'No description',
'trading-assistant.form.exchange': 'Select Exchange',
'trading-assistant.form.apiKey': 'API Key',
'trading-assistant.form.secretKey': 'Secret Key',
'trading-assistant.form.passphrase': 'Passphrase',
'trading-assistant.form.testConnection': 'Test Connection',
'trading-assistant.form.strategyName': 'Strategy Name',
'trading-assistant.form.symbol': 'Trading Pair',
'trading-assistant.form.symbols': 'Trading Pairs (Multi-select)',
'trading-assistant.form.symbolHint': 'Symbol format depends on the selected market',
'trading-assistant.form.symbolsHint': 'Select multiple pairs to create strategies for each',
'trading-assistant.form.symbolHintCrypto': 'Crypto: use trading pairs like BTC/USDT',
'trading-assistant.form.symbolHintGeneral': 'Enter the symbol for the selected market (e.g. 600519, AAPL, EURUSD).',
'trading-assistant.form.initialCapital': 'Initial Capital',
'trading-assistant.form.marketType': 'Market Type',
'trading-assistant.form.marketTypeFutures': 'Futures',
'trading-assistant.form.marketTypeSpot': 'Spot',
'trading-assistant.form.marketTypeHint': 'Futures support bidirectional trading and leverage, spot only supports long positions with fixed 1x leverage',
'trading-assistant.form.leverage': 'Leverage',
'trading-assistant.form.leverageHint': 'Futures: 1-125x, Spot: Fixed 1x',
'trading-assistant.form.spotLeverageFixed': 'Spot trading leverage is fixed at 1x',
'trading-assistant.form.spotOnlyLongHint': 'Spot trading only supports long positions',
'trading-assistant.form.tradeDirection': 'Trade Direction',
'trading-assistant.form.tradeDirectionLong': 'Long Only',
'trading-assistant.form.tradeDirectionShort': 'Short Only',
'trading-assistant.form.tradeDirectionBoth': 'Both',
'trading-assistant.form.timeframe': 'Timeframe',
'trading-assistant.form.klinePeriod': 'K-Line Period',
'trading-assistant.form.timeframe1m': '1 Minute',
'trading-assistant.form.timeframe5m': '5 Minutes',
'trading-assistant.form.timeframe15m': '15 Minutes',
'trading-assistant.form.timeframe30m': '30 Minutes',
'trading-assistant.form.timeframe1H': '1 Hour',
'trading-assistant.form.timeframe4H': '4 Hours',
'trading-assistant.form.timeframe1D': '1 Day',
'trading-assistant.form.selectStrategyType': 'Select Strategy Type',
'trading-assistant.form.indicatorStrategy': 'Indicator Strategy',
'trading-assistant.form.indicatorStrategyDesc': 'Automated trading strategy based on technical indicators',
'trading-assistant.form.aiStrategy': 'AI Strategy',
'trading-assistant.form.aiStrategyDesc': 'Automated trading strategy based on AI intelligent decision-making',
'trading-assistant.form.enableAiFilter': 'Enable AI Intelligent Decision Filter',
'trading-assistant.form.enableAiFilterHint': 'When enabled, indicator signals will be filtered by AI to improve trading quality',
'trading-assistant.form.aiFilterPrompt': 'Custom Prompt',
'trading-assistant.form.aiFilterPromptHint': 'Provide custom instructions for AI filtering, leave blank to use system default',
'trading-assistant.validation.strategyTypeRequired': 'Please select a strategy type',
'trading-assistant.validation.marketCategoryRequired': 'Please select a market category',
'trading-assistant.form.advancedSettings': 'Advanced Settings',
'trading-assistant.form.orderMode': 'Order Mode',
'trading-assistant.form.orderModeMaker': 'Maker (Limit)',
'trading-assistant.form.orderModeTaker': 'Taker (Market)',
'trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees',
'trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)',
'trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying',
'trading-assistant.form.makerRetries': 'Maker Retries',
'trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled',
'trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure',
'trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution',
'trading-assistant.form.marginMode': 'Margin Mode',
'trading-assistant.form.marginModeCross': 'Cross Margin',
'trading-assistant.form.marginModeIsolated': 'Isolated Margin',
'trading-assistant.form.stopLossPct': 'Stop Loss (%)',
'trading-assistant.form.stopLossPctHint': 'Set stop loss percentage, 0 means disabled',
'trading-assistant.form.takeProfitPct': 'Take Profit (%)',
'trading-assistant.form.takeProfitPctHint': 'Set take profit percentage, 0 means disabled',
'trading-assistant.form.commission': 'Commission (%)',
'trading-assistant.form.commissionHint': 'Trading fee percentage (optional)',
'trading-assistant.form.slippage': 'Slippage (%)',
'trading-assistant.form.slippageHint': 'Estimated slippage percentage (optional)',
'trading-assistant.form.executionMode': 'Execution',
'trading-assistant.form.executionModeSignal': 'Signal only (push notifications)',
'trading-assistant.form.executionModeLive': 'Live trading',
'trading-assistant.form.liveTradingCryptoOnlyHint': 'Live trading is available for Crypto only. Other markets can only push signals.',
'trading-assistant.form.liveTradingNotSupportedHint': 'Live trading is not available for this market',
'trading-assistant.form.broker': 'Broker',
'trading-assistant.form.ibkrConnectionTitle': 'Interactive Brokers Connection',
'trading-assistant.form.ibkrConnectionHint': 'Make sure TWS or IB Gateway is running with API enabled',
'trading-assistant.validation.brokerRequired': 'Please select a broker',
'trading-assistant.placeholders.selectBroker': 'Select broker',
'trading-assistant.brokerNames': {
'ibkr': 'Interactive Brokers (IBKR)',
'mt5': 'MetaTrader 5 (MT5)',
'mt4': 'MetaTrader 4 (MT4)',
'futu': 'Futu Securities',
'tiger': 'Tiger Brokers',
'td': 'TD Ameritrade',
'schwab': 'Charles Schwab'
},
'trading-assistant.form.ibkrHost': 'Host',
'trading-assistant.form.ibkrPort': 'Port',
'trading-assistant.form.ibkrPortHint': 'TWS Live:7497, TWS Paper:7496, Gateway Live:4001, Gateway Paper:4002',
'trading-assistant.form.ibkrClientId': 'Client ID',
'trading-assistant.form.ibkrAccount': 'Account',
'trading-assistant.form.ibkrAccountHint': 'Leave empty to auto-select first account. Specify for multi-account users.',
'trading-assistant.placeholders.ibkrAccount': 'Optional, e.g. U1234567',
'trading-assistant.exchange.ibkrConnectionSuccess': 'IBKR connected successfully',
'trading-assistant.exchange.ibkrConnectionFailed': 'IBKR connection failed. Please check if TWS/Gateway is running.',
// MT5/Forex configuration
'trading-assistant.form.forexBroker': 'Forex Broker',
'trading-assistant.form.mt5ConnectionTitle': 'MetaTrader 5 Connection',
'trading-assistant.form.mt5ConnectionHint': 'Make sure MT5 terminal is running and logged in (Windows only)',
'trading-assistant.form.mt5Server': 'Server',
'trading-assistant.form.mt5ServerHint': 'Broker server name (e.g., ICMarkets-Demo)',
'trading-assistant.form.mt5Login': 'Account Number',
'trading-assistant.form.mt5Password': 'Password',
'trading-assistant.form.mt5TerminalPath': 'MT5 Terminal Path (Optional)',
'trading-assistant.form.mt5TerminalPathHint': 'If MT5 terminal is not installed in the default location, specify the full path to terminal64.exe (e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe)',
'trading-assistant.placeholders.mt5Server': 'e.g., ICMarkets-Demo',
'trading-assistant.placeholders.mt5Login': 'e.g., 12345678',
'trading-assistant.placeholders.mt5Password': 'Your MT5 password',
'trading-assistant.placeholders.mt5TerminalPath': 'e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe',
'trading-assistant.validation.mt5ServerRequired': 'Please enter MT5 server',
'trading-assistant.validation.mt5LoginRequired': 'Please enter MT5 account number',
'trading-assistant.validation.mt5PasswordRequired': 'Please enter MT5 password',
'trading-assistant.exchange.mt5ConnectionSuccess': 'MT5 connected successfully',
'trading-assistant.exchange.mt5ConnectionFailed': 'MT5 connection failed. Please check if terminal is running.',
'trading-assistant.form.notifyChannels': 'Notification Channels',
'trading-assistant.form.notifyChannelsHint': 'Choose how you want to receive buy/sell and risk-management signals.',
'trading-assistant.notify.browser': 'Browser',
'trading-assistant.notify.email': 'Email',
'trading-assistant.notify.phone': 'Phone',
'trading-assistant.notify.telegram': 'Telegram',
'trading-assistant.notify.discord': 'Discord',
'trading-assistant.notify.webhook': 'Webhook',
'trading-assistant.form.notifyEmail': 'Email',
'trading-assistant.form.notifyPhone': 'Phone number',
'trading-assistant.form.notifyTelegram': 'Telegram (chat id / username)',
'trading-assistant.form.notifyDiscord': 'Discord (webhook url)',
'trading-assistant.form.notifyWebhook': 'Webhook URL',
'trading-assistant.form.liveTradingConfigTitle': 'Exchange Credentials',
'trading-assistant.form.liveTradingConfigHint': 'Provide your exchange API credentials. You can test the connection before saving.',
'trading-assistant.form.savedCredential': 'Saved credential',
'trading-assistant.form.savedCredentialHint': 'Select a saved credential to auto-fill API keys (optional).',
'trading-assistant.form.saveCredential': 'Save this credential for future use',
'trading-assistant.form.credentialName': 'Credential name (optional)',
'trading-assistant.form.signalMode': 'Signal Mode',
'trading-assistant.form.signalModeConfirmed': 'Confirmed',
'trading-assistant.form.signalModeAggressive': 'Aggressive',
'trading-assistant.form.signalModeHint': 'Confirmed: only check completed candles; Aggressive: also check forming candles',
'trading-assistant.form.cancel': 'Cancel',
'trading-assistant.form.prev': 'Previous',
'trading-assistant.form.next': 'Next',
'trading-assistant.form.confirmCreate': 'Confirm Create',
'trading-assistant.form.confirmEdit': 'Confirm Edit',
'trading-assistant.messages.createSuccess': 'Strategy created successfully',
'trading-assistant.messages.createFailed': 'Failed to create strategy',
'trading-assistant.messages.updateSuccess': 'Strategy updated successfully',
'trading-assistant.messages.updateFailed': 'Failed to update strategy',
'trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully',
'trading-assistant.messages.deleteFailed': 'Failed to delete strategy',
'trading-assistant.messages.startSuccess': 'Strategy started successfully',
'trading-assistant.messages.startFailed': 'Failed to start strategy',
'trading-assistant.messages.stopSuccess': 'Strategy stopped successfully',
'trading-assistant.messages.stopFailed': 'Failed to stop strategy',
'trading-assistant.messages.loadFailed': 'Failed to load strategy list',
'trading-assistant.messages.runningWarning': 'Strategy is running, please stop it before editing',
'trading-assistant.messages.deleteConfirmWithName': 'Are you sure you want to delete strategy "{name}"? This action cannot be undone.',
'trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.',
'trading-assistant.messages.loadTradesFailed': 'Failed to load trading records',
'trading-assistant.messages.loadPositionsFailed': 'Failed to load position records',
'trading-assistant.messages.loadEquityFailed': 'Failed to load equity curve',
'trading-assistant.messages.loadIndicatorsFailed': 'Failed to load indicator list, please try again later',
'trading-assistant.messages.spotLimitations': 'Spot trading has been automatically set to long only with 1x leverage',
'trading-assistant.messages.autoFillApiConfig': 'Auto-filled API configuration for this exchange from history',
'trading-assistant.messages.batchCreateSuccess': 'Successfully created {count} strategies',
'trading-assistant.messages.batchStartSuccess': 'Successfully started {count} strategies',
'trading-assistant.messages.batchStartFailed': 'Failed to start strategies',
'trading-assistant.messages.batchStopSuccess': 'Successfully stopped {count} strategies',
'trading-assistant.messages.batchStopFailed': 'Failed to stop strategies',
'trading-assistant.messages.batchDeleteSuccess': 'Successfully deleted {count} strategies',
'trading-assistant.messages.batchDeleteFailed': 'Failed to delete strategies',
'trading-assistant.messages.batchDeleteConfirm': 'Are you sure you want to delete {count} strategies in group "{name}"? This action cannot be undone.',
'trading-assistant.placeholders.selectIndicator': 'Please select an indicator',
'trading-assistant.placeholders.selectExchange': 'Please select an exchange',
'trading-assistant.placeholders.selectMarketCategory': 'Please select market category',
'trading-assistant.placeholders.inputApiKey': 'Please enter API Key',
'trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key',
'trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase',
'trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name',
'trading-assistant.placeholders.selectSymbol': 'Please select trading pair',
'trading-assistant.placeholders.selectSymbols': 'Please select trading pairs (multi-select)',
'trading-assistant.placeholders.inputSymbol': 'Please enter symbol',
'trading-assistant.placeholders.selectTimeframe': 'Please select timeframe',
'trading-assistant.placeholders.selectKlinePeriod': 'Please select K-line period',
'trading-assistant.placeholders.inputAiFilterPrompt': 'Please enter custom prompt (optional)',
'trading-assistant.placeholders.inputEmail': 'Please enter email',
'trading-assistant.placeholders.inputPhone': 'Please enter phone number',
'trading-assistant.placeholders.inputTelegram': 'Please enter Telegram chat id / username',
'trading-assistant.placeholders.inputDiscord': 'Please enter Discord webhook url',
'trading-assistant.placeholders.inputWebhook': 'Please enter webhook url',
'trading-assistant.placeholders.selectSavedCredential': 'Select saved credential',
'trading-assistant.placeholders.inputCredentialName': 'For example: Binance main key',
'trading-assistant.validation.indicatorRequired': 'Please select an indicator',
'trading-assistant.validation.exchangeRequired': 'Please select an exchange',
'trading-assistant.validation.apiKeyRequired': 'Please enter API Key',
'trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key',
'trading-assistant.validation.passphraseRequired': 'Please enter Passphrase',
'trading-assistant.validation.exchangeConfigIncomplete': 'Please fill in complete exchange configuration information',
'trading-assistant.validation.testConnectionRequired': 'Please click "Test Connection" button and ensure the connection is successful',
'trading-assistant.validation.testConnectionFailed': 'Connection test failed, please check the configuration and test again',
'trading-assistant.validation.strategyNameRequired': 'Please enter strategy name',
'trading-assistant.validation.symbolRequired': 'Please select trading pair',
'trading-assistant.validation.symbolsRequired': 'Please select at least one trading pair',
'trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital',
'trading-assistant.validation.leverageRequired': 'Please enter leverage',
'trading-assistant.validation.emailInvalid': 'Invalid email address',
'trading-assistant.validation.notifyChannelRequired': 'Please select at least one notification channel',
'trading-assistant.table.time': 'Time',
'trading-assistant.table.type': 'Type',
'trading-assistant.table.price': 'Price',
'trading-assistant.table.amount': 'Amount',
'trading-assistant.table.value': 'Value',
'trading-assistant.table.commission': 'Commission',
'trading-assistant.table.symbol': 'Trading Pair',
'trading-assistant.table.side': 'Side',
'trading-assistant.table.size': 'Position Size',
'trading-assistant.table.entryPrice': 'Entry Price',
'trading-assistant.table.currentPrice': 'Current Price',
'trading-assistant.table.unrealizedPnl': 'Unrealized P&L',
'trading-assistant.table.pnlPercent': 'P&L %',
'trading-assistant.table.buy': 'Buy',
'trading-assistant.table.sell': 'Sell',
'trading-assistant.table.long': 'Long',
'trading-assistant.table.short': 'Short',
'trading-assistant.table.noPositions': 'No positions',
'trading-assistant.detail.title': 'Strategy Details',
'trading-assistant.detail.strategyName': 'Strategy Name',
'trading-assistant.detail.strategyType': 'Strategy Type',
'trading-assistant.detail.status': 'Status',
'trading-assistant.detail.tradingMode': 'Trading Mode',
'trading-assistant.detail.exchange': 'Exchange',
'trading-assistant.detail.initialCapital': 'Initial Capital',
'trading-assistant.detail.totalInvestment': 'Total Investment',
'trading-assistant.detail.currentEquity': 'Current Equity',
'trading-assistant.detail.totalPnl': 'Total P&L',
'trading-assistant.detail.indicatorName': 'Indicator Name',
'trading-assistant.detail.maxLeverage': 'Max Leverage',
'trading-assistant.detail.decideInterval': 'Decision Interval',
'trading-assistant.detail.symbols': 'Trading Symbols',
'trading-assistant.detail.createdAt': 'Created At',
'trading-assistant.detail.updatedAt': 'Updated At',
'trading-assistant.detail.llmConfig': 'AI Model Configuration',
'trading-assistant.detail.exchangeConfig': 'Exchange Configuration',
'trading-assistant.detail.provider': 'Provider',
'trading-assistant.detail.modelId': 'Model ID',
'trading-assistant.detail.close': 'Close',
'trading-assistant.detail.loadFailed': 'Failed to load strategy details',
'trading-assistant.equity.noData': 'No equity data',
'trading-assistant.equity.equity': 'Equity',
'trading-assistant.exchange.tradingMode': 'Trading Mode',
'trading-assistant.exchange.virtual': 'Virtual Trading',
'trading-assistant.exchange.live': 'Live Trading',
'trading-assistant.exchange.selectExchange': 'Select Exchange',
'trading-assistant.exchange.walletAddress': 'Wallet Address',
'trading-assistant.exchange.walletAddressPlaceholder': 'Please enter wallet address (starts with 0x)',
'trading-assistant.exchange.privateKey': 'Private Key',
'trading-assistant.exchange.privateKeyPlaceholder': 'Please enter private key (64 characters)',
'trading-assistant.exchange.testConnection': 'Test Connection',
'trading-assistant.exchange.connectionSuccess': 'Connection successful',
'trading-assistant.exchange.connectionFailed': 'Connection failed',
'trading-assistant.exchange.testFailed': 'Connection test failed',
'trading-assistant.exchange.fillComplete': 'Please fill in complete exchange configuration information',
'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:',
'trading-assistant.strategyTypeOptions.ai': 'AI-Driven Strategy',
'trading-assistant.strategyTypeOptions.indicator': 'Indicator Strategy',
'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI-Driven Strategy feature is under development, stay tuned',
'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI-Driven Strategy feature is under development',
'trading-assistant.indicatorType.trend': 'Trend',
'trading-assistant.indicatorType.momentum': 'Momentum',
'trading-assistant.indicatorType.volatility': 'Volatility',
'trading-assistant.indicatorType.volume': 'Volume',
'trading-assistant.indicatorType.custom': 'Custom',
'trading-assistant.exchangeNames': {
'okx': 'OKX',
'binance': 'Binance',
'hyperliquid': 'Hyperliquid',
'blockchaincom': 'Blockchain.com',
'coinbaseexchange': 'Coinbase',
'gate': 'Gate.io',
'mexc': 'MEXC',
'kraken': 'Kraken',
'bitfinex': 'Bitfinex',
'bybit': 'Bybit',
'kucoin': 'KuCoin',
'huobi': 'Huobi',
'bitget': 'Bitget',
'bitmex': 'BitMEX',
'deribit': 'Deribit',
'phemex': 'Phemex',
'bitmart': 'BitMart',
'bitstamp': 'Bitstamp',
'bittrex': 'Bittrex',
'poloniex': 'Poloniex',
'gemini': 'Gemini',
'cryptocom': 'Crypto.com',
'bitflyer': 'bitFlyer',
'upbit': 'Upbit',
'bithumb': 'Bithumb',
'coinone': 'Coinone',
'zb': 'ZB',
'lbank': 'LBank',
'bibox': 'Bibox',
'bigone': 'BigONE',
'bitrue': 'Bitrue',
'coinex': 'CoinEx',
'digifinex': 'DigiFinex',
'ftx': 'FTX',
'ftxus': 'FTX US',
'binanceus': 'Binance US',
'binancecoinm': 'Binance COIN-M',
'binanceusdm': 'Binance USDⓈ-M',
'ibkr': 'Interactive Brokers (IBKR)'
},
'ai-trading-assistant.title': 'AI Trading Assistant',
'ai-trading-assistant.strategyList': 'Strategy List',
'ai-trading-assistant.createStrategy': 'Create Strategy',
'ai-trading-assistant.noStrategy': 'No strategies',
'ai-trading-assistant.selectStrategy': 'Please select a strategy from the left to view details',
'ai-trading-assistant.startStrategy': 'Start Strategy',
'ai-trading-assistant.stopStrategy': 'Stop Strategy',
'ai-trading-assistant.editStrategy': 'Edit Strategy',
'ai-trading-assistant.deleteStrategy': 'Delete Strategy',
'ai-trading-assistant.status.running': 'Running',
'ai-trading-assistant.status.stopped': 'Stopped',
'ai-trading-assistant.status.error': 'Error',
'ai-trading-assistant.tabs.tradingRecords': 'Trading Records',
'ai-trading-assistant.tabs.positions': 'Positions',
'ai-trading-assistant.tabs.aiDecisions': 'AI Decisions',
'ai-trading-assistant.tabs.equityCurve': 'Equity Curve',
'ai-trading-assistant.form.createTitle': 'Create AI Trading Strategy',
'ai-trading-assistant.form.editTitle': 'Edit AI Trading Strategy',
'ai-trading-assistant.form.strategyName': 'Strategy Name',
'ai-trading-assistant.form.modelId': 'AI Model',
'ai-trading-assistant.form.modelIdHint': 'Using system OpenRouter service, no API Key configuration needed',
'ai-trading-assistant.form.decideInterval': 'Decision Interval',
'ai-trading-assistant.form.decideInterval5m': '5 Minutes',
'ai-trading-assistant.form.decideInterval10m': '10 Minutes',
'ai-trading-assistant.form.decideInterval30m': '30 Minutes',
'ai-trading-assistant.form.decideInterval1h': '1 Hour',
'ai-trading-assistant.form.decideInterval4h': '4 Hours',
'ai-trading-assistant.form.decideInterval1d': '1 Day',
'ai-trading-assistant.form.decideInterval1w': '1 Week',
'ai-trading-assistant.form.decideIntervalHint': 'Time interval for AI decision making',
'ai-trading-assistant.form.runPeriod': 'Run Period',
'ai-trading-assistant.form.runPeriodHint': 'Start and end time for strategy execution',
'ai-trading-assistant.form.startDate': 'Start Date',
'ai-trading-assistant.form.endDate': 'End Date',
'ai-trading-assistant.form.qdtCostTitle': 'QDT Cost Notice',
'ai-trading-assistant.form.qdtCostHint': 'Each AI decision will cost {cost} QDT. Please ensure your account has sufficient QDT balance. During strategy execution, each decision will be charged in real-time.',
'ai-trading-assistant.form.apiKey': 'API Key',
'ai-trading-assistant.form.exchange': 'Select Exchange',
'ai-trading-assistant.form.secretKey': 'Secret Key',
'ai-trading-assistant.form.passphrase': 'Passphrase',
'ai-trading-assistant.form.testConnection': 'Test Connection',
'ai-trading-assistant.form.symbol': 'Trading Pair',
'ai-trading-assistant.form.symbolHint': 'Select the trading pair to trade',
'ai-trading-assistant.form.initialCapital': 'Initial Capital (Margin)',
'ai-trading-assistant.form.leverage': 'Leverage',
'ai-trading-assistant.form.timeframe': 'Timeframe',
'ai-trading-assistant.form.timeframe1m': '1 Minute',
'ai-trading-assistant.form.timeframe5m': '5 Minutes',
'ai-trading-assistant.form.timeframe15m': '15 Minutes',
'ai-trading-assistant.form.timeframe30m': '30 Minutes',
'ai-trading-assistant.form.timeframe1H': '1 Hour',
'ai-trading-assistant.form.timeframe4H': '4 Hours',
'ai-trading-assistant.form.timeframe1D': '1 Day',
'ai-trading-assistant.form.marketType': 'Market Type',
'ai-trading-assistant.form.marketTypeFutures': 'Futures',
'ai-trading-assistant.form.marketTypeSpot': 'Spot',
'ai-trading-assistant.form.totalPnl': 'Total PnL',
'ai-trading-assistant.form.customPrompt': 'Custom Prompt',
'ai-trading-assistant.form.customPromptHint': 'Optional, used to customize AI trading strategy and decision logic',
'ai-trading-assistant.form.cancel': 'Cancel',
'ai-trading-assistant.form.prev': 'Previous',
'ai-trading-assistant.form.next': 'Next',
'ai-trading-assistant.form.confirmCreate': 'Confirm Create',
'ai-trading-assistant.form.confirmEdit': 'Confirm Edit',
'ai-trading-assistant.messages.createSuccess': 'Strategy created successfully',
'ai-trading-assistant.messages.createFailed': 'Failed to create strategy',
'ai-trading-assistant.messages.updateSuccess': 'Strategy updated successfully',
'ai-trading-assistant.messages.updateFailed': 'Failed to update strategy',
'ai-trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully',
'ai-trading-assistant.messages.deleteFailed': 'Failed to delete strategy',
'ai-trading-assistant.messages.startSuccess': 'Strategy started successfully',
'ai-trading-assistant.messages.startFailed': 'Failed to start strategy',
'ai-trading-assistant.messages.stopSuccess': 'Strategy stopped successfully',
'ai-trading-assistant.messages.stopFailed': 'Failed to stop strategy',
'ai-trading-assistant.messages.loadFailed': 'Failed to load strategy list',
'ai-trading-assistant.messages.loadDecisionsFailed': 'Failed to load AI decision records',
'ai-trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.',
'ai-trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name',
'ai-trading-assistant.placeholders.selectModelId': 'Please select AI model',
'ai-trading-assistant.placeholders.selectDecideInterval': 'Please select decision interval',
'ai-trading-assistant.placeholders.startTime': 'Start Time',
'ai-trading-assistant.placeholders.endTime': 'End Time',
'ai-trading-assistant.placeholders.inputApiKey': 'Please enter API Key',
'ai-trading-assistant.placeholders.selectExchange': 'Please select an exchange',
'ai-trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key',
'ai-trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase',
'ai-trading-assistant.placeholders.selectSymbol': 'Please select trading pair, e.g.: BTC/USDT',
'ai-trading-assistant.placeholders.selectTimeframe': 'Please select timeframe',
'ai-trading-assistant.placeholders.inputCustomPrompt': 'Please enter custom prompt (optional)',
'ai-trading-assistant.validation.strategyNameRequired': 'Please enter strategy name',
'ai-trading-assistant.validation.modelIdRequired': 'Please select AI model',
'ai-trading-assistant.validation.runPeriodRequired': 'Please select run period',
'ai-trading-assistant.validation.apiKeyRequired': 'Please enter API Key',
'ai-trading-assistant.validation.exchangeRequired': 'Please select an exchange',
'ai-trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key',
'ai-trading-assistant.validation.symbolRequired': 'Please select trading pair',
'ai-trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital',
'ai-trading-assistant.table.time': 'Time',
'ai-trading-assistant.table.type': 'Type',
'ai-trading-assistant.table.price': 'Price',
'ai-trading-assistant.table.amount': 'Amount',
'ai-trading-assistant.table.value': 'Value',
'ai-trading-assistant.table.symbol': 'Trading Pair',
'ai-trading-assistant.table.side': 'Side',
'ai-trading-assistant.table.size': 'Position Size',
'ai-trading-assistant.table.entryPrice': 'Entry Price',
'ai-trading-assistant.table.currentPrice': 'Current Price',
'ai-trading-assistant.table.unrealizedPnl': 'Unrealized P&L',
'ai-trading-assistant.table.profit': 'Profit',
'ai-trading-assistant.table.openLong': 'Open Long',
'ai-trading-assistant.table.closeLong': 'Close Long',
'ai-trading-assistant.table.openShort': 'Open Short',
'ai-trading-assistant.table.closeShort': 'Close Short',
'ai-trading-assistant.table.addLong': 'Add Long',
'ai-trading-assistant.table.addShort': 'Add Short',
'ai-trading-assistant.table.closeShortProfit': 'Close Short (TP)',
'ai-trading-assistant.table.closeShortStop': 'Close Short (SL)',
'ai-trading-assistant.table.closeLongProfit': 'Close Long (TP)',
'ai-trading-assistant.table.closeLongStop': 'Close Long (SL)',
'ai-trading-assistant.table.buy': 'Buy',
'ai-trading-assistant.table.sell': 'Sell',
'ai-trading-assistant.table.long': 'Long',
'ai-trading-assistant.table.short': 'Short',
'ai-trading-assistant.table.hold': 'Hold',
'ai-trading-assistant.table.reasoning': 'Analysis Reasoning',
'ai-trading-assistant.table.decisions': 'Decisions',
'ai-trading-assistant.table.riskAssessment': 'Risk',
'ai-trading-assistant.table.confidence': 'Confidence',
'ai-trading-assistant.table.totalRecords': 'Total {total} records',
'ai-trading-assistant.table.noPositions': 'No positions',
'ai-trading-assistant.detail.title': 'Strategy Details',
'ai-trading-assistant.equity.noData': 'No equity data',
'ai-trading-assistant.equity.equity': 'Equity',
'ai-trading-assistant.exchange.testFailed': 'Connection test failed',
'ai-trading-assistant.exchange.connectionSuccess': 'Connection successful',
'ai-trading-assistant.exchange.connectionFailed': 'Connection failed',
'ai-trading-assistant.form.advancedSettings': 'Advanced Settings',
'ai-trading-assistant.form.orderMode': 'Order Mode',
'ai-trading-assistant.form.orderModeMaker': 'Maker (Limit)',
'ai-trading-assistant.form.orderModeTaker': 'Taker (Market)',
'ai-trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees',
'ai-trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)',
'ai-trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying',
'ai-trading-assistant.form.makerRetries': 'Maker Retries',
'ai-trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled',
'ai-trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure',
'ai-trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution',
'ai-trading-assistant.form.marginMode': 'Margin Mode',
'ai-trading-assistant.form.marginModeCross': 'Cross Margin',
'ai-trading-assistant.form.marginModeIsolated': 'Isolated Margin',
'ai-analysis.title': 'Quantum Trading Engine',
'ai-analysis.system.online': 'ONLINE',
'ai-analysis.system.agents': 'AGENTS',
'ai-analysis.system.active': 'ACTIVE',
'ai-analysis.system.stage': 'STAGE',
'ai-analysis.panel.roster': 'AGENTS ROSTER',
'ai-analysis.panel.thinking': 'Thinking...',
'ai-analysis.panel.done': 'Done',
'ai-analysis.panel.standby': 'Standby',
'ai-analysis.input.title': 'QUANTUM TRADING ENGINE',
'ai-analysis.input.placeholder': 'SELECT TARGET ASSET (e.g. BTC/USDT)',
'ai-analysis.input.watchlist': 'Watchlist',
'ai-analysis.input.start': 'START ANALYSIS',
'ai-analysis.input.recent': 'RECENT MISSIONS:',
'ai-analysis.vis.stage': 'STAGE',
'ai-analysis.vis.processing': 'PROCESSING',
'ai-analysis.result.complete': 'ANALYSIS COMPLETE',
'ai-analysis.result.signal': 'FINAL SIGNAL',
'ai-analysis.result.confidence': 'CONFIDENCE:',
'ai-analysis.result.new': 'NEW ANALYSIS',
'ai-analysis.result.full': 'VIEW FULL DOSSIER',
'ai-analysis.logs.title': 'SYSTEM LOGS',
'ai-analysis.modal.title': 'CLASSIFIED REPORT',
'ai-analysis.modal.fundamental': 'FUNDAMENTAL ANALYSIS',
'ai-analysis.modal.technical': 'TECHNICAL ANALYSIS',
'ai-analysis.modal.sentiment': 'SENTIMENT ANALYSIS',
'ai-analysis.modal.risk': 'RISK ASSESSMENT',
'ai-analysis.stage.idle': 'IDLE',
'ai-analysis.stage.1': 'PHASE 1: MULTI-DIMENSIONAL ANALYSIS',
'ai-analysis.stage.2': 'PHASE 2: BULL/BEAR DEBATE',
'ai-analysis.stage.3': 'PHASE 3: STRATEGIC PLANNING',
'ai-analysis.stage.4': 'PHASE 4: RISK COMMITTEE REVIEW',
'ai-analysis.stage.complete': 'COMPLETE',
'ai-analysis.agent.investment_director': 'Investment Director',
'ai-analysis.agent.role.investment_director': 'Comprehensive Analysis & Final Conclusion',
'ai-analysis.agent.market': 'Market Analyst',
'ai-analysis.agent.role.market': 'Technical & Market Data',
'ai-analysis.agent.fundamental': 'Fundamental Analyst',
'ai-analysis.agent.role.fundamental': 'Financials & Valuation',
'ai-analysis.agent.technical': 'Technical Analyst',
'ai-analysis.agent.role.technical': 'Technical Indicators & Charts',
'ai-analysis.agent.news': 'News Analyst',
'ai-analysis.agent.role.news': 'Global News Filter',
'ai-analysis.agent.sentiment': 'Sentiment Analyst',
'ai-analysis.agent.role.sentiment': 'Social & Emotional',
'ai-analysis.agent.risk': 'Risk Analyst',
'ai-analysis.agent.role.risk': 'Basic Risk Check',
'ai-analysis.agent.bull': 'Bull Researcher',
'ai-analysis.agent.role.bull': 'Growth Catalyst Hunter',
'ai-analysis.agent.bear': 'Bear Researcher',
'ai-analysis.agent.role.bear': 'Risk & Flaw Hunter',
'ai-analysis.agent.manager': 'Research Manager',
'ai-analysis.agent.role.manager': 'Debate Moderator',
'ai-analysis.agent.trader': 'Trader Agent',
'ai-analysis.agent.role.trader': 'Execution Strategist',
'ai-analysis.agent.risky': 'Risky Analyst',
'ai-analysis.agent.role.risky': 'Aggressive Strategy',
'ai-analysis.agent.neutral': 'Neutral Analyst',
'ai-analysis.agent.role.neutral': 'Balanced Strategy',
'ai-analysis.agent.safe': 'Safe Analyst',
'ai-analysis.agent.role.safe': 'Conservative Strategy',
'ai-analysis.agent.cro': 'Risk Manager (CRO)',
'ai-analysis.agent.role.cro': 'Final Decision Authority',
'ai-analysis.script.market': 'Fetching OHLCV data from major exchanges...',
'ai-analysis.script.fundamental': 'Retrieving quarterly financial reports...',
'ai-analysis.script.technical': 'Analyzing technical indicators and chart patterns...',
'ai-analysis.script.news': 'Scanning global financial news feeds...',
'ai-analysis.script.sentiment': 'Analyzing social media trends...',
'ai-analysis.script.risk': 'Calculating historical volatility...',
'invite.inviteLink': 'Invite Link',
'invite.copy': 'Copy Link',
'invite.copySuccess': 'Copied successfully!',
'invite.copyFailed': 'Copy failed, please copy manually',
'invite.noInviteLink': 'Invite link not generated',
'invite.totalInvites': 'Total Invites',
'invite.totalReward': 'Total Reward',
'invite.rules': 'Invite Rules',
'invite.rule1': 'You will receive a reward for each friend you successfully invite to register',
'invite.rule2': 'When your invited friend completes their first transaction, you will receive an additional reward',
'invite.rule3': 'Invite rewards will be directly credited to your account',
'invite.inviteList': 'Invite List',
'invite.tasks': 'Task Center',
'invite.inviteeName': 'Invitee',
'invite.inviteTime': 'Invite Time',
'invite.status': 'Status',
'invite.reward': 'Reward',
'invite.active': 'Active',
'invite.inactive': 'Inactive',
'invite.completed': 'Completed',
'invite.claimed': 'Claimed',
'invite.pending': 'Pending',
'invite.goToTask': 'Go to Task',
'invite.claimReward': 'Claim Reward',
'invite.verify': 'Verify',
'invite.verifySuccess': 'Verification successful! Task completed',
'invite.verifyNotCompleted': 'Task not completed yet, please complete the task first',
'invite.verifyFailed': 'Verification failed, please try again later',
'invite.claimSuccess': 'Successfully claimed {reward} QDT!',
'invite.claimFailed': 'Claim failed, please try again later',
'invite.totalRecords': 'Total {total} records',
'invite.task.twitter.title': 'Share Tweet on X (Twitter)',
'invite.task.twitter.desc': 'Share our official tweet to your X (Twitter) account',
'invite.task.youtube.title': 'Follow our YouTube Channel',
'invite.task.youtube.desc': 'Subscribe and follow our official YouTube channel',
'invite.task.telegram.title': 'Join Telegram Group',
'invite.task.telegram.desc': 'Join our official Telegram community group',
'invite.task.discord.title': 'Join Discord Server',
'invite.task.discord.desc': 'Join our Discord community server',
'message': '-',
'layouts.usermenu.dialog.title': 'Message',
'layouts.usermenu.dialog.content': 'Are you sure you would like to logout?',
'layouts.userLayout.title': 'Clarity from Uncertainty',
// Signal Robot
'signal-robot.title': 'Signal Robot Console',
'signal-robot.createBot': 'Create New Bot',
'signal-robot.search.nameOrSymbol': 'Name/Symbol',
'signal-robot.search.placeholder': 'Search bot name or symbol',
'signal-robot.search.status': 'Status',
'signal-robot.search.statusAll': 'All',
'signal-robot.search.statusRunning': 'Running',
'signal-robot.search.statusPaused': 'Paused',
'signal-robot.search.query': 'Query',
'signal-robot.search.reset': 'Reset',
'signal-robot.table.botName': 'Bot Name',
'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe',
'signal-robot.table.triggerStrategy': 'Trigger Strategy',
'signal-robot.table.notificationChannels': 'Notification Channels',
'signal-robot.table.status': 'Status',
'signal-robot.table.action': 'Action',
'signal-robot.table.triggerConditions': '{count} trigger conditions',
'signal-robot.table.monitoring': 'Monitoring',
'signal-robot.table.paused': 'Paused',
'signal-robot.table.edit': 'Edit',
'signal-robot.table.pause': 'Pause',
'signal-robot.table.start': 'Start',
'signal-robot.table.delete': 'Delete',
'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?',
'signal-robot.table.deleteSuccess': 'Deleted successfully',
'signal-robot.table.startSuccess': 'Bot started',
'signal-robot.table.pauseSuccess': 'Bot paused',
'signal-robot.channel.telegram': 'Telegram',
'signal-robot.channel.discord': 'Discord',
'signal-robot.channel.email': 'Email',
'signal-robot.channel.webhook': 'Webhook',
'signal-robot.channel.browser': 'Browser Push',
'signal-robot.modal.createTitle': 'Create New Signal Robot',
'signal-robot.modal.editTitle': 'Edit Signal Robot',
'signal-robot.modal.step.basic': 'Basic Settings',
'signal-robot.modal.step.entry': 'Entry Strategy',
'signal-robot.modal.step.position': 'Position Management',
'signal-robot.modal.step.risk': 'Risk Control',
'signal-robot.modal.step.notify': 'Notification Config',
'signal-robot.modal.prev': 'Previous',
'signal-robot.modal.next': 'Next',
'signal-robot.modal.preview': 'Preview Backtest',
'signal-robot.modal.complete': 'Complete & Run',
'signal-robot.modal.saveSuccess': 'Saved successfully',
'signal-robot.modal.previewDeveloping': 'Preview feature is under development...',
'signal-robot.modal.basicInfoRequired': 'Please complete basic information',
'signal-robot.basic.alert': 'Set basic information for the bot',
'signal-robot.basic.title': 'Basic Information',
'signal-robot.basic.botName': 'Bot Name',
'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy',
'signal-robot.basic.symbol': 'Trading Pair',
'signal-robot.basic.symbolPlaceholder': 'Select from watchlist',
'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first',
'signal-robot.basic.timeframe': 'K-Line Period',
'signal-robot.basic.timeframe15m': '15 Minutes',
'signal-robot.basic.timeframe30m': '30 Minutes',
'signal-robot.basic.timeframe1h': '1 Hour',
'signal-robot.basic.timeframe4h': '4 Hours',
'signal-robot.basic.timeframe1d': '1 Day',
'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot',
'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met',
'signal-robot.entry.condition': 'Condition {index}',
'signal-robot.entry.indicator': 'Indicator',
'signal-robot.entry.indicatorSupertrend': 'SuperTrend',
'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)',
'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)',
'signal-robot.entry.indicatorMacd': 'MACD',
'signal-robot.entry.indicatorBollinger': 'Bollinger Bands',
'signal-robot.entry.atrPeriod': 'ATR Period',
'signal-robot.entry.multiplier': 'Multiplier',
'signal-robot.entry.triggerSignal': 'Trigger Signal',
'signal-robot.entry.signalTrendBullish': 'Trend Bullish',
'signal-robot.entry.signalTrendBearish': 'Trend Bearish',
'signal-robot.entry.signalIsUptrend': 'Is Uptrend',
'signal-robot.entry.signalIsDowntrend': 'Is Downtrend',
'signal-robot.entry.period': 'Period',
'signal-robot.entry.compareCondition': 'Compare Condition',
'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)',
'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)',
'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)',
'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)',
'signal-robot.entry.compare': 'Compare',
'signal-robot.entry.greaterThan': 'Greater Than',
'signal-robot.entry.lessThan': 'Less Than',
'signal-robot.entry.crossUpShort': 'Cross Up',
'signal-robot.entry.crossDownShort': 'Cross Down',
'signal-robot.entry.threshold': 'Threshold',
'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters',
'signal-robot.entry.addCondition': 'Add Condition',
'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules',
'signal-robot.position.basicTitle': 'Basic Position Management',
'signal-robot.position.initialSize': 'Initial Size (Capital %)',
'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%',
'signal-robot.position.leverage': 'Leverage',
'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage',
'signal-robot.position.maxPyramiding': 'Max Pyramiding Times',
'signal-robot.position.maxPyramidingHint': '0 means no pyramiding',
'signal-robot.position.pyramidingTitle': 'Pyramiding Rules',
'signal-robot.position.pyramidingEnabled': 'Enabled',
'signal-robot.position.pyramidingDisabled': 'Disabled',
'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition',
'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)',
'signal-robot.position.profitPct': 'Profit Reaches',
'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)',
'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise',
'signal-robot.position.addSize': 'Single Add Size (Capital %)',
'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed',
'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules',
'signal-robot.risk.stopLossTitle': 'Stop Loss',
'signal-robot.risk.stopLossEnabled': 'Enabled',
'signal-robot.risk.stopLossDisabled': 'Disabled',
'signal-robot.risk.stopLossType': 'Stop Loss Type',
'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage',
'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier',
'signal-robot.risk.stopLossValue': 'Value',
'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%',
'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0',
'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)',
'signal-robot.risk.trailingStopTitle': 'Trailing Stop',
'signal-robot.risk.activationProfit': 'Activation Profit (%)',
'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level',
'signal-robot.risk.callbackPct': 'Callback (%)',
'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage',
'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled',
'signal-robot.risk.otherExitTitle': 'Other Exit Rules',
'signal-robot.risk.signalExit': 'Allow Signal Exit',
'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)',
'signal-robot.notify.alert': 'Configure notification methods when signal is triggered',
'signal-robot.notify.channelTitle': 'Notification Channels',
'signal-robot.notify.discordWebhook': 'Discord Webhook',
'signal-robot.notify.genericWebhook': 'Generic Webhook',
'signal-robot.notify.webhookUrl': 'Webhook URL',
'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook',
'signal-robot.notify.discordUrl': 'Discord URL',
'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...',
'signal-robot.operator.greaterThan': 'Greater Than',
'signal-robot.operator.lessThan': 'Less Than',
'signal-robot.operator.equal': 'Equal',
'signal-robot.operator.goldenCross': 'Golden Cross',
'signal-robot.operator.deathCross': 'Death Cross',
'signal-robot.operator.increaseBy': 'Increase By',
'signal-robot.operator.decreaseBy': 'Decrease By',
'signal-robot.indicator.price': 'Price',
'signal-robot.indicator.rsi': 'RSI',
'signal-robot.indicator.kdjK': 'KDJ(K)',
'signal-robot.indicator.kdjJ': 'KDJ(J)',
'signal-robot.indicator.macd': 'MACD',
'signal-robot.indicator.macdHist': 'MACD Histogram',
'signal-robot.indicator.bollingerUp': 'Bollinger Upper',
'signal-robot.indicator.bollingerLow': 'Bollinger Lower',
'signal-robot.indicator.volume': 'Volume',
'signal-robot.indicator.changePct1h': '1H Change %',
'signal-robot.indicator.changePct24h': '24H Change %',
'signal-robot.indicator.signalLine': 'Signal Line',
// Settings
'settings.title': 'System Settings',
'settings.description': 'Configure application settings, API keys, and system preferences',
'settings.save': 'Save Settings',
'settings.reset': 'Reset',
'settings.saveSuccess': 'Settings saved successfully',
'settings.saveFailed': 'Failed to save settings',
'settings.loadFailed': 'Failed to load settings',
'settings.openrouterBalance': 'OpenRouter Account Balance',
'settings.queryBalance': 'Query Balance',
'settings.balanceUsage': 'Used',
'settings.balanceRemaining': 'Remaining',
'settings.balanceLimit': 'Total Limit',
'settings.balanceQuerySuccess': 'Balance query successful',
'settings.balanceQueryFailed': 'Failed to query balance',
'settings.balanceNotQueried': 'Click "Query Balance" to get account info',
'settings.default': 'Default',
'settings.pleaseSelect': 'Please select',
'settings.inputApiKey': 'Enter key',
'settings.getApi': 'Get API',
// Settings link texts
'settings.link.getApi': 'Get API',
'settings.link.getApiKey': 'Get API Key',
'settings.link.getToken': 'Get Token',
'settings.link.createBot': 'Create Bot',
'settings.link.viewModels': 'View Models',
'settings.link.freeRegister': 'Free Register',
'settings.link.supportedExchanges': 'Supported Exchanges',
'settings.link.applyApi': 'Apply API',
'settings.link.createSearchEngine': 'Create Search Engine',
'settings.restartRequired': 'Settings saved. Some changes require Python service restart to take effect.',
'settings.copyRestartCmd': 'Copy restart command',
'settings.copySuccess': 'Copied',
'settings.copyFailed': 'Copy failed',
// Settings groups
// Settings groups (ordered by backend order)
'settings.group.server': 'Server Configuration',
'settings.group.auth': 'Security & Authentication',
'settings.group.ai': 'AI / LLM Configuration',
'settings.group.trading': 'Live Trading',
'settings.group.strategy': 'Strategy Execution',
'settings.group.data_source': 'Data Sources',
'settings.group.notification': 'Notifications',
'settings.group.email': 'Email (SMTP)',
'settings.group.sms': 'SMS (Twilio)',
'settings.group.agent': 'AI Agent',
'settings.group.network': 'Network & Proxy',
'settings.group.search': 'Web Search',
'settings.group.app': 'Application',
// Settings fields - Auth
'settings.field.SECRET_KEY': 'Secret Key',
'settings.field.ADMIN_USER': 'Admin Username',
'settings.field.ADMIN_PASSWORD': 'Admin Password',
// Settings fields - Server
'settings.field.PYTHON_API_HOST': 'Listen Address',
'settings.field.PYTHON_API_PORT': 'Port',
'settings.field.PYTHON_API_DEBUG': 'Debug Mode',
// Settings fields - Worker
'settings.field.ENABLE_PENDING_ORDER_WORKER': 'Enable Order Worker',
'settings.field.PENDING_ORDER_STALE_SEC': 'Order Stale Timeout (sec)',
// Settings fields - Trading
'settings.field.ORDER_MODE': 'Order Mode',
'settings.field.MAKER_WAIT_SEC': 'Limit Order Wait Time (sec)',
'settings.field.MAKER_OFFSET_BPS': 'Limit Order Price Offset (bps)',
// Settings fields - Notification
'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL',
'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token',
'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': 'Notify Timeout (sec)',
'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token',
// Settings fields - SMTP
'settings.field.SMTP_HOST': 'SMTP Host',
'settings.field.SMTP_PORT': 'SMTP Port',
'settings.field.SMTP_USER': 'SMTP Username',
'settings.field.SMTP_PASSWORD': 'SMTP Password',
'settings.field.SMTP_FROM': 'From Address',
'settings.field.SMTP_USE_TLS': 'Use TLS',
'settings.field.SMTP_USE_SSL': 'Use SSL',
// Settings fields - Twilio
'settings.field.TWILIO_ACCOUNT_SID': 'Account SID',
'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token',
'settings.field.TWILIO_FROM_NUMBER': 'From Number',
// Settings fields - Strategy
'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': 'Disable Auto Restore',
'settings.field.STRATEGY_TICK_INTERVAL_SEC': 'Tick Interval (sec)',
'settings.field.PRICE_CACHE_TTL_SEC': 'Price Cache TTL (sec)',
// Settings fields - Proxy
'settings.field.PROXY_PORT': 'Proxy Port',
'settings.field.PROXY_HOST': 'Proxy Host',
'settings.field.PROXY_SCHEME': 'Proxy Scheme',
'settings.field.PROXY_URL': 'Full Proxy URL',
// Settings fields - App
'settings.field.CORS_ORIGINS': 'CORS Origins',
'settings.field.RATE_LIMIT': 'Rate Limit (per min)',
'settings.field.ENABLE_CACHE': 'Enable Cache',
'settings.field.ENABLE_REQUEST_LOG': 'Enable Request Log',
'settings.field.ENABLE_AI_ANALYSIS': 'Enable AI Analysis',
// Settings fields - Memory/Reflection
'settings.field.ENABLE_AGENT_MEMORY': 'Enable Agent Memory',
'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Enable Vector Retrieval (Local)',
'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding Dimension',
'settings.field.AGENT_MEMORY_TOP_K': 'Top-K Retrieval Count',
'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Candidate Window Size',
'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Time Decay Half-life (days)',
'settings.field.AGENT_MEMORY_W_SIM': 'Similarity Weight',
'settings.field.AGENT_MEMORY_W_RECENCY': 'Recency Weight',
'settings.field.AGENT_MEMORY_W_RETURNS': 'Returns Weight',
// Settings fields - Reflection Worker
'settings.field.ENABLE_REFLECTION_WORKER': 'Enable Auto Verification',
'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Verification Interval (sec)',
// Settings fields - AI
'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key',
'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL',
'settings.field.OPENROUTER_MODEL': 'Default Model',
'settings.field.OPENROUTER_TEMPERATURE': 'Temperature',
'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens',
'settings.field.OPENROUTER_TIMEOUT': 'Timeout (sec)',
'settings.field.OPENROUTER_CONNECT_TIMEOUT': 'Connect Timeout (sec)',
'settings.field.AI_MODELS_JSON': 'Models JSON',
// Settings fields - Market
'settings.field.MARKET_TYPES_JSON': 'Market Types JSON',
'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': 'Supported Symbols JSON',
// Settings fields - Data Source
'settings.field.DATA_SOURCE_TIMEOUT': 'Timeout (sec)',
'settings.field.DATA_SOURCE_RETRY': 'Retry Count',
'settings.field.DATA_SOURCE_RETRY_BACKOFF': 'Retry Backoff (sec)',
'settings.field.FINNHUB_API_KEY': 'Finnhub API Key',
'settings.field.FINNHUB_TIMEOUT': 'Finnhub Timeout (sec)',
'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub Rate Limit',
'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)',
// Settings fields - Search
'settings.field.SEARCH_PROVIDER': 'Search Provider',
'settings.field.SEARCH_MAX_RESULTS': 'Max Results',
'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key',
'settings.field.SEARCH_GOOGLE_CX': 'Google CX',
'settings.field.SEARCH_BING_API_KEY': 'Bing API Key',
'settings.field.INTERNAL_API_KEY': 'Internal API Key',
// Settings descriptions (config item descriptions)
// Note: These are optional since backend already provides English descriptions
'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',
'settings.desc.MAKER_OFFSET_BPS': 'Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)',
'settings.desc.TIINGO_API_KEY': 'Tiingo API key for Forex/Metals data (free tier does not support 1-minute data)',
'settings.desc.TIINGO_TIMEOUT': 'Tiingo API request timeout',
// Portfolio
'portfolio.summary.totalValue': 'Total Value',
'portfolio.summary.totalCost': 'Total Cost',
'portfolio.summary.totalPnl': 'Total P&L',
'portfolio.summary.positionCount': 'Positions',
'portfolio.summary.profitLossRatio': 'Profit/Loss',
'portfolio.summary.today': 'Today',
'portfolio.summary.todayPnl': 'Today P&L',
'portfolio.summary.bestPerformer': 'Best Performer',
'portfolio.summary.worstPerformer': 'Worst Performer',
'portfolio.summary.priceSync': 'Price Sync',
'portfolio.summary.syncInterval': 'Refresh',
'portfolio.summary.justNow': 'Just now',
'portfolio.summary.ago': ' ago',
'portfolio.positions.title': 'My Positions',
'portfolio.positions.add': 'Add Position',
'portfolio.positions.addFirst': 'Add Your First Position',
'portfolio.positions.empty': 'No positions yet',
'portfolio.positions.deleteConfirm': 'Are you sure to delete this position?',
'portfolio.positions.currentPrice': 'Current',
'portfolio.positions.entryPrice': 'Entry',
'portfolio.positions.quantity': 'Quantity',
'portfolio.positions.side': 'Side',
'portfolio.positions.long': 'Long',
'portfolio.positions.short': 'Short',
'portfolio.positions.marketValue': 'Value',
'portfolio.positions.pnl': 'P&L',
'portfolio.positions.items': 'positions',
'portfolio.monitors.title': 'AI Monitors',
'portfolio.monitors.add': 'Add Monitor',
'portfolio.monitors.addFirst': 'Add AI Monitor',
'portfolio.monitors.empty': 'No monitors yet',
'portfolio.monitors.deleteConfirm': 'Are you sure to delete this monitor?',
'portfolio.monitors.interval': 'Interval',
'portfolio.monitors.lastRun': 'Last Run',
'portfolio.monitors.nextRun': 'Next Run',
'portfolio.monitors.channels': 'Channels',
'portfolio.monitors.runNow': 'Run Now',
'portfolio.monitors.analysisResult': 'AI Analysis Result',
'portfolio.modal.addPosition': 'Add Position',
'portfolio.modal.editPosition': 'Edit Position',
'portfolio.modal.addMonitor': 'Add Monitor',
'portfolio.modal.editMonitor': 'Edit Monitor',
'portfolio.form.market': 'Market',
'portfolio.form.marketRequired': 'Please select a market',
'portfolio.form.selectMarket': 'Select Market',
'portfolio.form.symbol': 'Symbol',
'portfolio.form.symbolRequired': 'Please enter symbol',
'portfolio.form.searchSymbol': 'Search or enter symbol',
'portfolio.form.useAsSymbol': 'Use',
'portfolio.form.asSymbolCode': 'as symbol code',
'portfolio.form.symbolHint': 'Search symbols or enter any code directly',
'portfolio.form.side': 'Side',
'portfolio.form.quantity': 'Quantity',
'portfolio.form.quantityRequired': 'Please enter quantity',
'portfolio.form.enterQuantity': 'Enter quantity',
'portfolio.form.entryPrice': 'Entry Price',
'portfolio.form.entryPriceRequired': 'Please enter entry price',
'portfolio.form.enterEntryPrice': 'Enter entry price',
'portfolio.form.notes': 'Notes',
'portfolio.form.enterNotes': 'Optional: Add notes',
'portfolio.form.monitorName': 'Monitor Name',
'portfolio.form.monitorNameRequired': 'Please enter monitor name',
'portfolio.form.enterMonitorName': 'e.g. Daily Portfolio Analysis',
'portfolio.form.interval': 'Interval',
'portfolio.form.minutes': 'minutes',
'portfolio.form.hour': 'hour',
'portfolio.form.hours': 'hours',
'portfolio.form.notifyChannels': 'Notify Channels',
'portfolio.form.browser': 'Browser',
'portfolio.form.email': 'Email',
'portfolio.form.telegramChatId': 'Telegram Chat ID',
'portfolio.form.enterTelegramChatId': 'Enter Telegram Chat ID',
'portfolio.form.telegramRequired': 'Please enter Telegram Chat ID',
'portfolio.form.emailAddress': 'Email Address',
'portfolio.form.enterEmail': 'Enter email address',
'portfolio.form.emailRequired': 'Please enter email address',
'portfolio.form.emailInvalid': 'Please enter a valid email address',
'portfolio.form.customPrompt': 'Custom Prompt',
'portfolio.form.customPromptPlaceholder': 'Optional: Add focus areas, e.g. "Focus on tech stock risks"',
'portfolio.form.monitorScope': 'Monitor Scope',
'portfolio.form.allPositions': 'All Positions',
'portfolio.form.selectedPositions': 'Selected Positions',
'portfolio.form.selectPositions': 'Select Positions',
'portfolio.form.selectAll': 'Select All',
'portfolio.form.deselectAll': 'Deselect All',
'portfolio.form.selectedCount': '{count} of {total} selected',
'portfolio.form.pleaseSelectPositions': 'Please select at least one position to monitor',
'portfolio.message.loadFailed': 'Failed to load data',
'portfolio.message.saveSuccess': 'Saved successfully',
'portfolio.message.saveFailed': 'Failed to save',
'portfolio.message.deleteSuccess': 'Deleted successfully',
'portfolio.message.deleteFailed': 'Failed to delete',
'portfolio.message.updateFailed': 'Failed to update',
'portfolio.message.monitorEnabled': 'Monitor enabled',
'portfolio.message.monitorDisabled': 'Monitor paused',
'portfolio.message.monitorRunSuccess': 'Analysis completed',
'portfolio.message.monitorRunFailed': 'Analysis failed',
// Portfolio - Groups
'portfolio.groups.all': 'All Positions',
'portfolio.groups.ungrouped': 'Ungrouped',
'portfolio.form.group': 'Group',
'portfolio.form.enterGroup': 'Enter or select group',
// Portfolio - Alerts
'portfolio.alerts.title': 'Price/PnL Alerts',
'portfolio.alerts.addAlert': 'Add Alert',
'portfolio.alerts.editAlert': 'Edit Alert',
'portfolio.alerts.alertType': 'Alert Type',
'portfolio.alerts.priceAbove': 'Price Above',
'portfolio.alerts.priceBelow': 'Price Below',
'portfolio.alerts.pnlAbove': 'Profit Above (%)',
'portfolio.alerts.pnlBelow': 'Loss Below (%)',
'portfolio.alerts.threshold': 'Threshold',
'portfolio.alerts.thresholdRequired': 'Please enter threshold',
'portfolio.alerts.enterPrice': 'Enter price',
'portfolio.alerts.enterPercent': 'Enter percentage',
'portfolio.alerts.currentPrice': 'Current Price',
'portfolio.alerts.currentPriceHint': 'Current price',
'portfolio.alerts.repeatInterval': 'Repeat Alert',
'portfolio.alerts.noRepeat': 'No repeat (trigger once)',
'portfolio.alerts.every5min': 'Every 5 minutes',
'portfolio.alerts.every15min': 'Every 15 minutes',
'portfolio.alerts.every30min': 'Every 30 minutes',
'portfolio.alerts.every1hour': 'Every 1 hour',
'portfolio.alerts.every4hours': 'Every 4 hours',
'portfolio.alerts.onceDaily': 'Once daily',
'portfolio.alerts.enabled': 'Enable Alert',
'portfolio.alerts.enabledDesc': 'Auto-monitor and trigger notifications',
'portfolio.alerts.delete': 'Delete',
'portfolio.alerts.deleteConfirm': 'Are you sure you want to delete this alert?',
'portfolio.modal.addAlert': 'Add Alert',
'portfolio.modal.editAlert': 'Edit Alert',
// User Management
'menu.userManage': 'User Management',
'menu.myProfile': 'My Profile',
'common.actions': 'Actions',
'common.refresh': 'Refresh',
'userManage.title': 'User Management',
'userManage.description': 'Manage system users, roles and permissions',
'userManage.createUser': 'Create User',
'userManage.editUser': 'Edit User',
'userManage.username': 'Username',
'userManage.password': 'Password',
'userManage.nickname': 'Nickname',
'userManage.email': 'Email',
'userManage.role': 'Role',
'userManage.status': 'Status',
'userManage.lastLogin': 'Last Login',
'userManage.active': 'Active',
'userManage.disabled': 'Disabled',
'userManage.neverLogin': 'Never',
'userManage.usernameRequired': 'Please enter username',
'userManage.usernamePlaceholder': 'Enter username',
'userManage.passwordRequired': 'Please enter password',
'userManage.passwordPlaceholder': 'Enter password (min 6 chars)',
'userManage.passwordMin': 'Password must be at least 6 characters',
'userManage.nicknamePlaceholder': 'Enter nickname',
'userManage.emailPlaceholder': 'Enter email',
'userManage.emailInvalid': 'Invalid email format',
'userManage.rolePlaceholder': 'Select role',
'userManage.statusPlaceholder': 'Select status',
'userManage.resetPassword': 'Reset Password',
'userManage.resetPasswordWarning': 'This will reset the user\'s password',
'userManage.newPassword': 'New Password',
'userManage.newPasswordPlaceholder': 'Enter new password',
'userManage.confirmDelete': 'Are you sure to delete this user?',
'userManage.roleAdmin': 'Admin',
'userManage.roleManager': 'Manager',
'userManage.roleUser': 'User',
'userManage.roleViewer': 'Viewer',
// Profile
'profile.title': 'My Profile',
'profile.description': 'Manage your account settings and preferences',
'profile.basicInfo': 'Basic Info',
'profile.changePassword': 'Change Password',
'profile.username': 'Username',
'profile.nickname': 'Nickname',
'profile.email': 'Email',
'profile.lastLogin': 'Last Login',
'profile.nicknamePlaceholder': 'Enter your nickname',
'profile.emailPlaceholder': 'Enter your email',
'profile.emailInvalid': 'Invalid email format',
'profile.passwordHint': 'Password must be at least 6 characters',
'profile.oldPassword': 'Current Password',
'profile.newPassword': 'New Password',
'profile.confirmPassword': 'Confirm Password',
'profile.oldPasswordRequired': 'Please enter current password',
'profile.oldPasswordPlaceholder': 'Enter current password',
'profile.newPasswordRequired': 'Please enter new password',
'profile.newPasswordPlaceholder': 'Enter new password',
'profile.confirmPasswordRequired': 'Please confirm password',
'profile.confirmPasswordPlaceholder': 'Confirm new password',
'profile.passwordMin': 'Password must be at least 6 characters',
'profile.passwordMismatch': 'Passwords do not match'
}
export default {
...components,
...locale
}