// Lightweight i18n dictionary. Add a language = add a code here + its block.
// Keys are flat dotted strings; missing keys fall back to English then the key.
export type Lang = 'en' | 'ru';
export const LANGUAGES: { code: Lang; label: string }[] = [
{ code: 'en', label: 'English' },
{ code: 'ru', label: 'Русский' },
];
export const translations: Record<Lang, Record<string, string>> = {
en: {
// Settings
'settings.title': 'Settings',
'settings.appearance': 'Appearance',
'settings.theme': 'Theme',
'settings.theme.desc': 'Switch between dark and light mode',
'settings.dark': '🌙 Dark',
'settings.light': '☀️ Light',
'settings.language': 'Language',
'settings.language.desc': 'Interface language',
'settings.accent': 'Accent color',
'settings.accent.desc': 'App color theme',
'settings.display': 'Display',
'settings.priceFormat': 'Price Format',
'settings.priceFormat.desc': 'How prices are displayed',
'settings.data': 'Data & Cache',
'settings.clearData': 'Clear Local Data',
'settings.clearData.desc': 'Clear search history, filters, and cached data',
'settings.clear': 'Clear',
'settings.cleared': '✓ Cleared',
'settings.resetPwa': 'Update app',
'settings.resetPwa.desc': 'Clear cache & load the latest version',
'settings.reset': 'Update',
'settings.updating': 'Updating…',
'settings.about': 'About',
'settings.version': 'Version',
'settings.dataSource': 'Data Source',
'settings.builder': 'Builder',
'settings.apiStatus': 'API Status',
'settings.disclaimer': 'This app is for informational purposes only. Not financial advice. Trading prediction markets involves risk of loss.',
// Portfolio
'pf.title': 'Portfolio',
'pf.connectTitle': 'Sign in by email',
'pf.connectDesc': 'Sign in (Кошелёк, email) to see your copy-trading positions and P&L',
'pf.positions': 'Positions',
'pf.subs': 'Subscriptions',
'pf.pnl': 'P&L',
'pf.history': 'History',
'pf.totalValue': 'Total Value',
'pf.totalPnl': 'Total P&L',
'pf.positionsCount': 'Positions',
'pf.redeemableValue': 'Redeemable',
'ua.title': 'User Analytics',
'ua.refresh': 'Refresh',
'ua.loading': 'Loading…',
'ua.builderLink': '→ Builder Analytics',
'ua.totalUsers': 'Total Users',
'ua.onboarded': 'Onboarded',
'ua.onboardedSub': 'deposit wallet set up',
'ua.activeCopiers': 'Active Copiers',
'ua.subscriptions': 'Subscriptions',
'ua.subsPaused': '{n} paused',
'ua.copyPositions': 'Copy Positions',
'ua.positionsClosed': '{n} closed',
'ua.totalDeposits': 'On Deposit',
'ua.totalInPositions': 'In Positions',
'ua.realizedPnl': 'Realized P&L',
'ua.leadersTitle': 'Most-Copied Leaders',
'ua.usersTitle': 'Users',
'ua.colLeader': 'Leader',
'ua.colSubs': 'Subs',
'ua.colWin': 'Win %',
'ua.colPnl': 'PnL',
'ua.colVolume': 'Volume',
'ua.colTrades': 'Trades',
'ua.colCategory': 'Category',
'ua.colUser': 'User',
'ua.colCountry': 'Country',
'ua.colDeposit': 'On Deposit',
'ua.colInPositions': 'In Positions',
'ua.colEquity': 'Total',
'ua.colTotalPnl': 'Total PnL',
'ua.colJoined': 'Joined',
'ua.colActive': 'Active',
'ua.colOpen': 'Open',
'ua.colClosed': 'Closed',
'ua.colNotional': 'Notional',
'ua.colBuilderFees': 'Builder Fees',
'ua.builderFeesTip': 'Real builder fees this user generated, from CLOB /builder/trades matched by deposit wallet.',
'ua.colRealized': 'Realized',
'ua.colUnrealized': 'Unrealized',
'ua.rowTip': 'Joined {joined} · active {active} · open {open} · closed {closed} · notional {notional} · realized {realized} · unrealized {unrealized}',
'ua.emptyTitle': 'No users yet',
'ua.emptyDesc': 'Sign-ups and copy activity will appear here',
'pf.redeemBanner': 'You have {n} position(s) to redeem',
'pf.openPositions': 'Open Positions',
'pf.redeemable': 'Redeemable',
'pf.sortBy': 'Sort by:',
'pf.value': 'Value',
'pf.pnlPct': 'P&L %',
'pf.size': 'Size',
'pf.noOpen': 'No open positions',
'pf.close': 'Close',
'pf.closing': 'Closing…',
'pf.redeemBtn': 'Redeem',
'pf.cancel': 'Cancel',
'pf.closeErr': 'Could not request close — try again',
'pf.closeConfirmTitle': 'Close this position?',
'pf.closeConfirmDesc': 'Our trader sells at the current price (up to ~2 min). On a thin market the actual fill can be lower than the estimate.',
'pf.closeEst': 'Est. proceeds',
'pf.redeemConfirmTitle': 'Redeem this position?',
'pf.redeemConfirmDesc': 'Market resolved — payout in USDC is processed automatically (~15 min).',
'pf.nothingRedeem': 'Nothing to redeem',
'pf.findMarkets': 'Find markets →',
'pf.shares': 'Shares',
'pf.avgPrice': 'Avg Price',
'pf.current': 'Current',
'pf.redeem': 'Redeem',
'pf.whaleHolds': 'holds',
'pf.whalesIn': '{n} in this trade',
'pf.whaleHint': 'Leaders you copy currently holding this much in this market',
'pf.entryLeader': 'entered by',
'pf.entryLeaderHint': 'The whale whose trade this copy was opened from',
'pf.redeeming': 'Redeeming…',
'pf.redeemed': 'Redeemed successfully!',
'pf.redeemFailed': 'Redeem failed',
'pf.failedPositions': 'Failed to load positions',
'pf.endsIn': 'ends',
// P&L dashboard
'pnl.loading': 'Loading P&L data...',
'pnl.empty': 'No P&L data yet',
'pnl.emptySub': 'Trade history needs to be loaded first. Switch to History tab, then come back.',
'pnl.realized': 'Realized P&L',
'pnl.netPnl': 'Net P&L',
'pnl.openValue': 'Open',
'pnl.unrealized': 'Unrealized',
'pnl.winRate': 'Win Rate',
'pnl.winLossTrades': '{w}W / {l}L trades',
'pnl.totalTrades': 'Total Trades',
'pnl.markets': '{n} markets',
'pnl.profitFactor': 'Profit Factor',
'pnl.avgWin': 'Avg win',
'pnl.avgLoss': 'Avg loss',
'pnl.dailyPnl': 'Daily P&L',
'pnl.lastDays': 'Last {n} days',
'pnl.equityCurve': 'Equity Curve',
'pnl.cumulative': 'Cumulative',
'pnl.highlights': 'Highlights',
'pnl.bestDay': 'Best Day',
'pnl.worstDay': 'Worst Day',
'pnl.volumeTraded': 'Volume Traded',
// History
'th.empty': 'No trade history yet',
'th.emptySub': 'Trades will appear here after your first trade',
'th.shares': 'shares',
'th.loading': 'Loading...',
'th.loadMore': 'Load more',
'th.unknownMarket': 'Unknown market',
'th.redeem': 'Redeem',
'th.win': 'win',
'th.loss': 'loss',
// Navigation
'nav.leaders': 'Leaders',
'nav.flow': 'Flow',
'nav.copies': 'My Copies',
'nav.portfolio': 'My Trades',
'nav.markets': 'Markets',
'nav.more': 'More',
'more.leaderboard': 'Leaderboard',
'more.nonCustodial': 'Non-custodial · Turnkey',
'nav.account': 'Account',
'nav.wallet': 'Wallet',
'wallet.available': 'Available',
'wallet.inPositions': 'In positions',
'wallet.total': 'Total',
'nav.signin': 'Sign in',
// Leaders
'leaders.title': '🐋 Leaders',
'leaders.titleCopy': '🐋 Winners',
'leaders.titleFade': '💀 Losers',
'leaders.sub': 'Copy smart money — pick a whale and connect',
'leaders.sort.edge': '⚡ EDGE',
'leaders.edgeTip': 'EDGE = composite 0–10 from win-rate, backtest PF, sample size, realized PnL, activity, consistency (Sharpe) & low drawdown. Small settled samples are shrunk so luck can\'t top the board',
'leaders.sort.quality': '⭐ Quality',
'leaders.sort.activity': 'Activity',
'leaders.sort.pnl': 'P&L',
'leaders.sort.volume': 'Volume',
'leaders.sort.winrate': 'Win-rate',
'leaders.sort.trades': 'Trades',
'leaders.qualityTip': 'Quality whale: passed our copy-fit gate (≥25 closed positions, ≥8 active days, backtest PF ≥1.2 under our config, positional win-rate ≥50%, positive realized PnL)',
'leaders.publicData': '📊 Public data',
'leaders.filters': 'Filters',
'leaders.found': 'Found: {n}',
'leaders.filterReset': 'Reset',
'leaders.filterWr': 'Win-rate ≥',
'leaders.filterPf': 'Profit Factor ≥',
'leaders.filterClosed': 'Closed positions ≥',
'leaders.filterAvgSize': 'Avg trade size ≥',
'leaders.filterActiveDays': 'Active days (30d) ≥',
'leaders.filterPnl': 'Realized PnL ≥',
'leaders.filterAvgPrice': 'Avg entry price ≤',
'leaders.filterQuality': '⭐ Quality only',
'leaders.onReal': 'on real $',
'leaders.realPnlTip': 'Our realized P&L copying this whale with real money',
'leaders.styleDir': 'directional',
'leaders.styleFav': 'favorite-farmer',
'leaders.styleActive': 'active mgr',
'leaders.horShort': 'short-term',
'leaders.horMid': 'mid-term',
'leaders.horLong': 'long-term',
'leaders.winRateCap': 'win-rate',
'leaders.volume': 'volume',
'leaders.roi30': 'ROI 30d',
'leaders.mom7d': '📈 7d',
'leaders.trades': 'trades',
'leaders.avgTrade': 'avg trade',
'leaders.category': 'category',
'leaders.emptyTitle': 'No leaders yet',
'leaders.emptySub': 'The leaderboard fills up as the scanner collects data (every 5 min).',
'leaders.active': 'active',
'leaders.max': 'max',
'leaders.copy': 'Copy',
'leaders.badgeActive': 'Already copying',
'leaders.badgePaused': 'Copying paused',
'leaders.badgeArchived': 'Previously copied',
// My Copies
'copy.title': '📋 My Copies',
'copy.sortActive': 'Active first',
'copy.sortPnl': 'P&L',
'copy.sortOpen': 'Open positions',
'copy.sortCopies': 'Most copies',
'copy.sub': 'Who you copy and on what terms',
'copy.bannerActive': '🟢 Copying active: subscriptions are saved on the server, orders execute from your trading wallet. Caps from settings are respected.',
'copy.bannerDemo': '⚠️ Demo mode: sign in by email (Кошелёк) to copy for real. Settings are stored locally only for now.',
'copy.emptyTitle': 'Not copying anyone yet',
'copy.emptySub': 'Open the leaderboard, pick a whale and tap “Copy”.',
'copy.addLeader': '+ Add leader',
'copy.statusActive': '● Copying',
'copy.statusPaused': '⏸ Paused',
'copy.flagMirror': 'mirrors exits',
'copy.flagStop': 'stop −{x}%',
'copy.flagEntry': 'entry {min}–{max}¢',
'copy.allocPercent': '{v}% of budget',
'copy.allocFixed': '${v}/trade',
'copy.allocProp': 'proportional to whale',
'copy.allocTail': 'max ${max}/trade · limit ${exp}',
'copy.pnlNone': 'PnL: — · no copies yet',
'copy.pnlRealized': 'realized',
'copy.pnlOpen': 'open',
'copy.pnlClosed': 'closed',
'copy.btnSettings': 'Settings',
'copy.btnPause': 'Pause',
'copy.btnResume': 'Resume',
'copy.btnStop': 'Stop',
// Copy config modal
'ccm.modePercent': '% of budget',
'ccm.modeFixed': 'Fixed $',
'ccm.modeProp': 'Like whale',
'ccm.titleEdit': 'Copy settings',
'ccm.titleNew': 'Copy',
'ccm.alloc': 'Allocation per trade',
'ccm.unitPercent': '% of budget',
'ccm.unitDollar': '$ per trade',
'ccm.propHint': 'Trade size scales with the whale’s bet.',
'ccm.maxTrade': 'Max per trade',
'ccm.maxExp': 'Max exposure',
'ccm.categories': 'Categories',
'ccm.catEmpty': '(empty = all)',
'ccm.priceRange': 'Entry price range',
'ccm.noLongshots': '(no longshots)',
'ccm.mirror': 'Mirror whale exits',
'ccm.drawdown': 'Drawdown stop',
'ccm.drawdownOff': '(0 = off)',
'ccm.cancel': 'Cancel',
'ccm.save': 'Save',
'ccm.start': 'Start copying',
// Risk disclosure (shown before first copy activation)
'risk.title': 'Before you start',
'risk.p1': 'Copy-trading is risky and is not financial advice. A whale’s past results do not guarantee future ones — you can lose money.',
'risk.p2': 'Copies lag the whale by seconds, so your entry price is usually slightly worse than theirs.',
'risk.p3': 'Your funds stay yours: our server can only place trades, never withdraw. Worst case the bot makes losing trades — it cannot move your money out.',
'risk.p4': 'You alone deposit and withdraw, with your own login. You can pause or stop copying anytime.',
'risk.accept': 'I understand and accept these risks',
'risk.confirm': 'Accept & start',
// Deposit (crypto) to the trading wallet
'dep.title': 'Deposit funds',
'dep.instr': 'Send USDC on the Polygon network to your trading wallet — it is auto-converted to pUSD for trading:',
'dep.copy': 'Copy address',
'dep.copied': 'Copied ✓',
'dep.note': 'It can take a few minutes to detect and convert. Minimum deposit $20.',
'dep.warnTitle': '⚠️ Polygon network · USDC only',
'dep.warnBody': 'Send ONLY USDC on the Polygon network. Any other token or network will be lost permanently.',
'dep.token': 'Token contract (verify before sending)',
'dep.statusWaiting': '⏳ Waiting for your deposit…',
'dep.statusDetected': '🔵 Detected ${amount} — converting to pUSD…',
'dep.statusReady': '✅ ${amount} pUSD ready to trade',
// Withdraw (crypto) from the trading wallet
'wd.title': 'Withdraw',
'wd.avail': 'Available',
'wd.amount': 'Amount (pUSD)',
'wd.max': 'Max',
'wd.to': 'To address',
'wd.btn': 'Withdraw',
'wd.busy': 'Withdrawing…',
'wd.done': 'Withdrawn ✓',
'wd.err': 'Withdraw failed',
'wd.badAmt': 'Enter a valid amount',
'wd.badTo': 'Enter a valid address',
// Markets / screener
'mkt.sort.volume': 'Volume', 'mkt.sort.liquidity': 'Liquidity', 'mkt.sort.spread': 'Spread',
'mkt.sort.endDate': 'Ending', 'mkt.sort.updated': 'New', 'mkt.sort.outcomes': 'Outcomes',
'mkt.anyM': 'Any', 'mkt.anyF': 'Any', 'mkt.anytime': 'Anytime', 'mkt.24h': '24h', 'mkt.week': 'Week',
'mkt.events': '🗂 Events', 'mkt.allMarkets': '📋 All markets',
'mkt.minVolume': 'Min volume', 'mkt.minLiquidity': 'Min liquidity', 'mkt.endsLabel': 'Ends',
'mkt.yesRange': 'YES price range', 'mkt.resetFilters': 'Reset filters', 'mkt.sortLabel': 'Sort',
'mkt.eventsWord': 'events', 'mkt.marketsWord': 'markets', 'mkt.bySearch': 'for “{q}”',
'mkt.inCat': 'in {cat}', 'mkt.filtered': '(filtered)',
'mkt.back': '← Back', 'mkt.next': 'Next →', 'mkt.pageOf': 'of',
'mkt.volShort': 'Vol', 'mkt.liqShort': 'Liq', 'mkt.spreadShort': 'Spread',
'mkt.kpiActive': 'Active markets', 'mkt.kpiVol24': 'Volume 24h', 'mkt.kpiTop': '🔥 Top by volume', 'mkt.kpiEnding': 'Ending in 24h',
'mkt.noEvents': 'No events found', 'mkt.noEventsSub': 'Try changing the filters or search',
'mkt.outcomeOne': 'outcome', 'mkt.outcomeMany': 'outcomes',
// Signals
'sig.title': '🔥 Opportunities',
'sig.desc': 'Whales, longshot fades and volume spikes. Signal strength = how confident the direction; entry quality = spread and liquidity.',
'sig.fAll': 'All', 'sig.fWhale': '🐋 Whales', 'sig.fLongshot': '🎯 Fade', 'sig.fMomentum': '⚡ Momentum', 'sig.fSpike': '📈 Spikes',
'sig.sAny': 'Any strength', 'sig.sStrong': 'Strong', 'sig.sVeryStrong': 'Very strong',
'sig.hAny': 'Any horizon', 'sig.hFast': '⚡ 1-2 days', 'sig.hMid': '📅 Up to 2 weeks', 'sig.hLong': '🗓 2+ weeks',
'sig.titleStrength': 'Toggle min signal strength', 'sig.titleHorizon': 'Toggle time to event end',
'sig.emptyTitle': 'No signals yet', 'sig.emptySub': 'Nothing matches the current filters. Loosen a filter or wait — data refreshes every 2 minutes.',
'sig.badgeWhale': 'WHALE', 'sig.badgeFade': 'FADE', 'sig.badgeMomentum': 'MOMENTUM', 'sig.badgeSpike': 'SPIKE',
'sig.smartTo': 'Smart money → {side} · {vol} · {n} {trades}',
'sig.smartConv': 'Smart money → {side} · {conv}',
'sig.convAll': 'all whale volume', 'sig.convPct': '{pct}% of whale volume',
'sig.priceYes': 'YES price', 'sig.vol24': '24h volume',
'sig.longshotDesc': 'Longshot overpriced → bet the favorite ({side})',
'sig.spikeDesc': 'Sharp jump in market activity',
'sig.volDesc': 'Volume {score}× the 7-day average',
'sig.buyYes': 'Buy YES', 'sig.buyNo': 'Buy NO', 'sig.more': 'Details →',
'sig.smartBadge': '🧠 Smart money',
'sig.bet': 'Bet: {side}', 'sig.prob': 'probability {p}%',
'sig.strength': 'Signal strength', 'sig.entryQuality': 'Entry quality',
'sig.whaleWr': 'Whale WR {wr}%',
'sig.tradeOne': 'trade', 'sig.tradeMany': 'trades',
// Whale feed / profile
'wf.resolvedTitle': 'Show trades on already-resolved markets (≤5¢ / ≥95¢)',
'wf.resolvedShown': '✓ Resolved shown', 'wf.showResolved': 'Show resolved',
'wf.tradesWord': 'trades', 'wf.betTo': 'Bet → {side}', 'wf.bought': 'bought', 'wf.sold': 'sold', 'wf.entry': 'entry',
'wp.backfill': '↻ updating history…', 'wp.unsub': 'Unsubscribe from whale trades', 'wp.sub': 'Notify about new whale trades',
'wp.tracked': '🔔 Tracking', 'wp.alert': '🔔 Alert', 'wp.inPlay': '⏳ in play', 'wp.entryC': 'entry {c}¢',
'wp.page': 'Page {p} of {n}', 'wp.pnlDynamics': 'P&L dynamics', 'wp.byResolved': 'over {n} resolved trades',
// Whales page
'whales.title': '🐋 Whales', 'whales.desc': 'Follow the smart money — big trades, market consensus and top wallets.',
'whales.tabTrades': '🐋 Trades', 'whales.tabConsensus': '🤝 Consensus', 'whales.tabAlerts': '🔔 Alerts', 'whales.tabLeaders': '🏆 Top wallets',
'flow.title': '🌊 Flow', 'flow.desc': 'Where the smart money is moving — whale consensus, fresh inflows and the hottest markets.',
'flow.tabConsensus': '🤝 Consensus', 'flow.tabInsider': '🆕 Insider', 'flow.tabFire': '🔥 Fire Score',
'flow.insiderSoon': 'Insider flow — coming soon', 'flow.fireSoon': 'Fire Score — coming soon',
'flow.dayShort': 'd', 'flow.agreeAll': 'Any', 'flow.hourShort': 'h', 'flow.insiderEmpty': 'No fresh quality-whale entries — check back soon',
'flow.entryNow': 'entry {a}¢ → now {c}¢',
'flow.delta.pricier': '+{p}% pricier', 'flow.delta.cheaper': '−{p}% cheaper', 'flow.delta.same': '≈ like whales',
'flow.fresh.now': 'just now', 'flow.fresh.hours': '{h}h ago', 'flow.fresh.days': '{d}d ago',
'flow.enter': 'Enter →', 'flow.loading': 'Loading…', 'flow.tradeUnavailable': 'Trading unavailable for this market',
'flow.amount': 'Amount (USDC)', 'flow.buyConfirm': 'Enter — ${x}', 'flow.submitting': 'Submitting…',
'flow.needLogin': 'Log in to trade from your deposit', 'flow.estShares': '≈ {n} shares',
'flow.queued': 'Order queued — executing (~8s)', 'flow.alreadyQueued': 'Order already in flight', 'flow.orderFailed': 'Could not submit order',
'flow.custodyNote': 'Buys from your deposit balance (pUSD) — same as copy-trading. No wallet signature.',
'flow.insufficient': 'Not enough pUSD on deposit',
'whales.noConsensus': 'No consensus yet', 'whales.noConsensusSub': 'Consensus appears when ≥2 whales trade the same market. Data accumulates every 5 minutes.',
'whales.agreement': 'agreement {p}%', 'whales.avgEntry': 'avg entry {c}¢',
'whales.whaleOne': 'whale', 'whales.whaleMany': 'whales', 'whales.tradeOne': 'trade', 'whales.tradeMany': 'trades',
'whales.noWallets': 'No wallet data yet', 'whales.noWalletsSub': 'The leaderboard fills up as the scanner collects data (every 5 min).',
'whales.noSubs': 'No whale subscriptions', 'whales.noSubsSub': 'Open a whale profile and tap “🔔 Alert” — their new trades will show up here. The scanner checks every 5 minutes.',
'whales.newCount': '+{n} new', 'whales.unsub': 'Unsubscribe',
'wpp.editCopy': 'Edit copy', 'wpp.copyLeader': 'Copy leader', 'wpp.copiedSoon': 'Copied by others (soon)',
// Custody / account / misc
'cust.title': '💼 Copy-trading wallet', 'cust.soon': 'soon', 'cust.vaultBal': 'vault balance (USDC)',
'cust.noDeleg': 'Delegation not set up', 'cust.delegInfo': '✅ bot can trade · ❌ withdrawals — only you',
'cust.deposit': 'Deposit USDC', 'cust.withdraw': 'Withdraw',
'cust.footer': 'Funds stay in your personal vault. The bot\'s delegate key can only open/close trades — only your wallet can withdraw. Wallet linking and deposit arrive in the next step.',
'acct.errNoSigner': 'VITE_PRIVY_SIGNER_ID not configured (create an Authorization key in Privy)',
'acct.errDeleg': 'Delegation error', 'acct.errSafeAddr': 'Failed to derive Safe address', 'acct.errDeploy': 'Deploy error',
'acct.title': 'Account', 'acct.loading': 'Loading…', 'acct.loggedIn': 'Logged in', 'acct.wallet': 'Wallet', 'acct.tradingSafe': 'Trading Safe',
'acct.walletReady': '✅ Trading wallet ready', 'acct.settingUp': 'Setting up…', 'acct.setupWallet': 'Set up trading wallet',
'acct.autoCopyOn': '✅ Auto-copy enabled', 'acct.confirming': 'Confirming…', 'acct.allowAutoCopy': 'Allow auto-copy', 'acct.logout': 'Log out',
'acct.activateWallet': 'Activate wallet', 'acct.activating': 'Activating…', 'acct.walletActive': '✅ Wallet active — ready to copy',
'acct.deposit': 'Deposit', 'acct.withdraw': 'Withdraw', 'acct.close': 'Close',
'acct.redeem': 'Redeem resolved → pUSD', 'acct.redeeming': 'Redeeming…',
'acct.signinDesc': 'Sign in by email — a copy-trading wallet is created automatically (no MetaMask, no gas).', 'acct.signinEmail': 'Sign in with email',
'wbb.close': 'Close', 'wbb.title': '📱 Losing the signature on mobile?', 'wbb.body': 'Open the screen in your wallet’s browser — the signature works instantly there, without app switching.',
'settings.admin': 'Admin', 'settings.adminDesc': 'Revenue, volume and trades for the SZHub builder code', 'settings.userAnalyticsDesc': 'Sign-ups, copiers, deposits and copy P&L', 'settings.open': 'Open →',
'trade.balance': 'Balance',
'err.connectFirst': 'Connect your wallet first', 'err.signinFailed': 'Sign-in error',
'err.signPending': 'A signature request was already sent — open your wallet and confirm, or reconnect it.',
'err.signPendingLong': 'A signature request was already sent. Open your wallet and confirm it — or reconnect the wallet to clear a stuck request.',
'err.signNotReceived': 'Signature not received. If you confirmed in your wallet — go back and tap “Sign to Trade” again.',
'time.mAgo': '{n}m ago',
'time.hAgo': '{n}h ago',
'time.dAgo': '{n}d ago',
'time.justNow': 'just now', 'time.min': '{n} min', 'time.hr': '{n} h', 'time.day': '{n} d', 'time.mo': '{n} mo', 'time.ended': 'ended', 'time.resolving': 'resolving',
},
ru: {
'settings.title': 'Настройки',
'settings.appearance': 'Оформление',
'settings.theme': 'Тема',
'settings.theme.desc': 'Переключение тёмной и светлой темы',
'settings.dark': '🌙 Тёмная',
'settings.light': '☀️ Светлая',
'settings.language': 'Язык',
'settings.language.desc': 'Язык интерфейса',
'settings.accent': 'Цвет акцента',
'settings.accent.desc': 'Цветовая тема приложения',
'settings.display': 'Отображение',
'settings.priceFormat': 'Формат цены',
'settings.priceFormat.desc': 'Как показывать цены',
'settings.data': 'Данные и кэш',
'settings.clearData': 'Очистить локальные данные',
'settings.clearData.desc': 'Очистить историю поиска, фильтры и кэш',
'settings.clear': 'Очистить',
'settings.cleared': '✓ Очищено',
'settings.resetPwa': 'Обновить приложение',
'settings.resetPwa.desc': 'Очистить кеш и загрузить свежую версию',
'settings.reset': 'Обновить',
'settings.updating': 'Обновляю…',
'settings.about': 'О приложении',
'settings.version': 'Версия',
'settings.dataSource': 'Источник данных',
'settings.builder': 'Билдер',
'settings.apiStatus': 'Статус API',
'settings.disclaimer': 'Приложение носит исключительно информационный характер. Не является финансовым советом. Торговля на рынках предсказаний сопряжена с риском потерь.',
// Portfolio
'pf.title': 'Портфель',
'pf.connectTitle': 'Войдите по email',
'pf.connectDesc': 'Войди через «Кошелёк» (email) — увидишь свои копи-позиции и P&L',
'pf.positions': 'Позиции',
'pf.subs': 'Подписки',
'pf.pnl': 'Доход',
'pf.history': 'История',
'pf.totalValue': 'Стоимость',
'pf.totalPnl': 'Общий P&L',
'pf.positionsCount': 'Позиций',
'pf.redeemableValue': 'К погашению',
'ua.title': 'Анализ пользователей',
'ua.refresh': 'Обновить',
'ua.loading': 'Загрузка…',
'ua.builderLink': '→ Аналитика билдера',
'ua.totalUsers': 'Всего юзеров',
'ua.onboarded': 'С депозитом',
'ua.onboardedSub': 'кошелёк настроен',
'ua.activeCopiers': 'Активных копиров',
'ua.subscriptions': 'Подписок',
'ua.subsPaused': '{n} на паузе',
'ua.copyPositions': 'Копи-позиций',
'ua.positionsClosed': '{n} закрыто',
'ua.totalDeposits': 'На депозите',
'ua.totalInPositions': 'В позициях',
'ua.realizedPnl': 'Реализ. P&L',
'ua.leadersTitle': 'Самые копируемые киты',
'ua.usersTitle': 'Пользователи',
'ua.colLeader': 'Кит',
'ua.colSubs': 'Подписки',
'ua.colWin': 'Винрейт',
'ua.colPnl': 'PnL',
'ua.colVolume': 'Объём',
'ua.colTrades': 'Сделки',
'ua.colCategory': 'Категория',
'ua.colUser': 'Юзер',
'ua.colCountry': 'Страна',
'ua.colDeposit': 'На депозите',
'ua.colInPositions': 'В позициях',
'ua.colEquity': 'Всего',
'ua.colTotalPnl': 'Общий PnL',
'ua.colJoined': 'Регистрация',
'ua.colActive': 'Актив',
'ua.colOpen': 'Открыто',
'ua.colClosed': 'Закрыто',
'ua.colNotional': 'Оборот',
'ua.colBuilderFees': 'Builder Фи',
'ua.builderFeesTip': 'Реальные builder-комиссии, которые принёс юзер — из CLOB /builder/trades по депозитному кошельку.',
'ua.colRealized': 'Реализ.',
'ua.colUnrealized': 'Нереализ.',
'ua.rowTip': 'Регистрация {joined} · актив {active} · открыто {open} · закрыто {closed} · оборот {notional} · реализ. {realized} · нереализ. {unrealized}',
'ua.emptyTitle': 'Пока нет пользователей',
'ua.emptyDesc': 'Регистрации и копи-активность появятся здесь',
'pf.redeemBanner': 'У вас {n} позиц. к погашению',
'pf.openPositions': 'Открытые',
'pf.redeemable': 'К погашению',
'pf.sortBy': 'Сортировка:',
'pf.value': 'Стоимость',
'pf.pnlPct': 'P&L %',
'pf.size': 'Размер',
'pf.noOpen': 'Нет открытых позиций',
'pf.close': 'Закрыть',
'pf.closing': 'Закрываю…',
'pf.redeemBtn': 'Получить',
'pf.cancel': 'Отмена',
'pf.closeErr': 'Не удалось запросить закрытие — попробуй ещё раз',
'pf.closeConfirmTitle': 'Закрыть позицию?',
'pf.closeConfirmDesc': 'Наш трейдер продаст по текущей цене (до ~2 мин). На тонком рынке фактический филл может быть ниже оценки.',
'pf.closeEst': 'Оценка выручки',
'pf.redeemConfirmTitle': 'Получить выплату?',
'pf.redeemConfirmDesc': 'Рынок резолвнут — выплата в USDC пройдёт автоматически (~15 мин).',
'pf.nothingRedeem': 'Нечего погашать',
'pf.findMarkets': 'Найти рынки →',
'pf.shares': 'Шейров',
'pf.avgPrice': 'Ср. цена',
'pf.whaleHolds': 'держит',
'pf.whalesIn': '{n} в этой сделке',
'pf.whaleHint': 'Киты, которых ты копируешь, держат столько в этом рынке',
'pf.entryLeader': 'вошли по нему',
'pf.entryLeaderHint': 'Кит, по чьей сделке открыта эта копия',
'pf.current': 'Текущая',
'pf.redeem': 'Погасить',
'pf.redeeming': 'Погашаю…',
'pf.redeemed': 'Успешно погашено!',
'pf.redeemFailed': 'Не удалось погасить',
'pf.failedPositions': 'Не удалось загрузить позиции',
'pf.endsIn': 'до конца',
// P&L dashboard
'pnl.loading': 'Загрузка данных P&L...',
'pnl.empty': 'Пока нет данных P&L',
'pnl.emptySub': 'Сначала нужно загрузить историю. Открой вкладку «История», затем вернись.',
'pnl.realized': 'Реализованный P&L',
'pnl.netPnl': 'Чистый P&L',
'pnl.openValue': 'Открыто',
'pnl.unrealized': 'Нереализованный',
'pnl.winRate': 'Винрейт',
'pnl.winLossTrades': '{w}В / {l}П сделок',
'pnl.totalTrades': 'Всего сделок',
'pnl.markets': '{n} рынков',
'pnl.profitFactor': 'Профит-фактор',
'pnl.avgWin': 'Ср. выигрыш',
'pnl.avgLoss': 'Ср. проигрыш',
'pnl.dailyPnl': 'Дневной P&L',
'pnl.lastDays': 'Последние {n} дней',
'pnl.equityCurve': 'Кривая капитала',
'pnl.cumulative': 'Накопленный',
'pnl.highlights': 'Итоги',
'pnl.bestDay': 'Лучший день',
'pnl.worstDay': 'Худший день',
'pnl.volumeTraded': 'Оборот',
// History
'th.empty': 'Истории сделок пока нет',
'th.emptySub': 'Сделки появятся здесь после первой торговли',
'th.shares': 'шейров',
'th.loading': 'Загрузка...',
'th.loadMore': 'Показать ещё',
'th.unknownMarket': 'Неизвестный рынок',
'th.redeem': 'Погашение',
'th.win': 'выигрыш',
'th.loss': 'проигрыш',
// Navigation
'nav.leaders': 'Лидеры',
'nav.flow': 'Поток',
'nav.copies': 'Мои копии',
'nav.portfolio': 'Мои сделки',
'nav.markets': 'Рынки',
'nav.more': 'Ещё',
'more.leaderboard': 'Лидерборд',
'more.nonCustodial': 'Non-custodial · Turnkey',
'nav.account': 'Аккаунт',
'nav.wallet': 'Кошелёк',
'wallet.available': 'Доступно',
'wallet.inPositions': 'В позициях',
'wallet.total': 'Всего',
'nav.signin': 'Войти',
// Leaders
'leaders.title': '🐋 Лидеры',
'leaders.titleCopy': '🐋 Победители',
'leaders.titleFade': '💀 Проигравшие',
'leaders.sub': 'Копируй умные деньги — выбери кита и подключись',
'leaders.sort.edge': '⚡ EDGE',
'leaders.edgeTip': 'EDGE = композит 0–10 из win-rate, бэктест-PF, размера выборки, реализованного PnL, активности, консистентности (Sharpe) и низкой просадки. Малые сэмплы ужимаются, чтобы удача не всплывала в топ',
'leaders.sort.quality': '⭐ Качественные',
'leaders.sort.activity': 'Активность',
'leaders.sort.pnl': 'P&L',
'leaders.sort.volume': 'Оборот',
'leaders.sort.winrate': 'Win-rate',
'leaders.sort.trades': 'Сделки',
'leaders.qualityTip': 'Качественный кит: прошёл наш гейт под копи-конфиг (≥25 закрытых позиций, ≥8 активных дней, бэктест PF ≥1.2 под наш конфиг, позиционный win-rate ≥50%, положительный realized PnL)',
'leaders.publicData': '📊 Публичные данные',
'leaders.filters': 'Фильтры',
'leaders.found': 'Найдено: {n}',
'leaders.filterReset': 'Сбросить',
'leaders.filterWr': 'Винрейт ≥',
'leaders.filterPf': 'Profit Factor ≥',
'leaders.filterClosed': 'Закрытых позиций ≥',
'leaders.filterAvgSize': 'Ср. объём сделки ≥',
'leaders.filterActiveDays': 'Активных дней (30д) ≥',
'leaders.filterPnl': 'Realized PnL ≥',
'leaders.filterAvgPrice': 'Ср. цена входа ≤',
'leaders.filterQuality': '⭐ Только качественные',
'leaders.onReal': 'на реале',
'leaders.realPnlTip': 'Наш реальный P&L от копирования этого кита живыми деньгами',
'leaders.styleDir': 'направленный',
'leaders.styleFav': 'фаворит-фарм',
'leaders.styleActive': 'активный',
'leaders.horShort': 'краткосрок',
'leaders.horMid': 'среднесрок',
'leaders.horLong': 'долгосрок',
'leaders.winRateCap': 'win-rate',
'leaders.volume': 'оборот',
'leaders.roi30': 'ROI 30д',
'leaders.mom7d': '📈 7д',
'leaders.trades': 'сделок',
'leaders.avgTrade': 'ср. сделка',
'leaders.category': 'категория',
'leaders.emptyTitle': 'Пока нет лидеров',
'leaders.emptySub': 'Лидерборд наполняется по мере накопления данных сканером (каждые 5 минут).',
'leaders.active': 'актив.',
'leaders.max': 'макс',
'leaders.copy': 'Копировать',
'leaders.badgeActive': 'Уже копируешь',
'leaders.badgePaused': 'Копирование на паузе',
'leaders.badgeArchived': 'Копировался ранее',
// My Copies
'copy.title': '📋 Мои копии',
'copy.sortActive': 'Активные',
'copy.sortPnl': 'P&L',
'copy.sortOpen': 'Открытые',
'copy.sortCopies': 'Больше копий',
'copy.sub': 'Кого ты копируешь и на каких условиях',
'copy.bannerActive': '🟢 Копирование активно: подписки сохраняются на сервере, ордера исполняются с твоего торгового кошелька. Капы из настроек соблюдаются.',
'copy.bannerDemo': '⚠️ Демо-режим: войди по email (Кошелёк), чтобы копировать по-настоящему. Сейчас настройки хранятся только локально.',
'copy.emptyTitle': 'Пока никого не копируешь',
'copy.emptySub': 'Открой лидерборд, выбери кита и нажми «Копировать».',
'copy.addLeader': '+ Добавить лидера',
'copy.statusActive': '● Копируется',
'copy.statusPaused': '⏸ На паузе',
'copy.flagMirror': 'зеркалит выходы',
'copy.flagStop': 'стоп −{x}%',
'copy.flagEntry': 'вход {min}–{max}¢',
'copy.allocPercent': '{v}% бюджета',
'copy.allocFixed': '${v}/сделка',
'copy.allocProp': 'пропорц. киту',
'copy.allocTail': 'макс ${max}/сделка · лимит ${exp}',
'copy.pnlNone': 'PnL: — · ещё нет копий',
'copy.pnlRealized': 'реализ.',
'copy.pnlOpen': 'откр',
'copy.pnlClosed': 'закр',
'copy.btnSettings': 'Настройки',
'copy.btnPause': 'Пауза',
'copy.btnResume': 'Возобновить',
'copy.btnStop': 'Стоп',
// Copy config modal
'ccm.modePercent': '% бюджета',
'ccm.modeFixed': 'Фикс $',
'ccm.modeProp': 'Как кит',
'ccm.titleEdit': 'Настройки копирования',
'ccm.titleNew': 'Копировать',
'ccm.alloc': 'Аллокация на сделку',
'ccm.unitPercent': '% бюджета',
'ccm.unitDollar': '$ на сделку',
'ccm.propHint': 'Размер сделки пропорционален ставке кита.',
'ccm.maxTrade': 'Макс на сделку',
'ccm.maxExp': 'Макс экспозиция',
'ccm.categories': 'Категории',
'ccm.catEmpty': '(пусто = все)',
'ccm.priceRange': 'Диапазон цены входа',
'ccm.noLongshots': '(не лонгшоты)',
'ccm.mirror': 'Зеркалить выходы кита',
'ccm.drawdown': 'Стоп-кран по просадке',
'ccm.drawdownOff': '(0 = выкл)',
'ccm.cancel': 'Отмена',
'ccm.save': 'Сохранить',
'ccm.start': 'Запустить копирование',
// Risk disclosure (показывается перед первой активацией копирования)
'risk.title': 'Перед запуском',
'risk.p1': 'Копитрейдинг — это риск и не финансовый совет. Прошлые результаты кита не гарантируют будущие — вы можете потерять деньги.',
'risk.p2': 'Копии отстают от кита на секунды, поэтому ваша цена входа обычно немного хуже, чем у него.',
'risk.p3': 'Ваши средства остаются вашими: наш сервер может только торговать, но НЕ выводить. В худшем случае бот совершит убыточные сделки — украсть деньги он не может.',
'risk.p4': 'Депозит и вывод делаете только вы, своим входом. Копирование можно поставить на паузу или остановить в любой момент.',
'risk.accept': 'Я понимаю и принимаю эти риски',
'risk.confirm': 'Принять и запустить',
// Deposit (crypto) to the trading wallet
'dep.title': 'Пополнить',
'dep.instr': 'Отправьте USDC в сети Polygon на ваш торговый кошелёк — он автоматически конвертируется в pUSD для торговли:',
'dep.copy': 'Копировать адрес',
'dep.copied': 'Скопировано ✓',
'dep.note': 'Обнаружение и конвертация занимают несколько минут. Минимальный депозит $20.',
'dep.warnTitle': '⚠️ Сеть Polygon · только USDC',
'dep.warnBody': 'Отправляйте ТОЛЬКО USDC в сети Polygon. Любой другой токен или сеть будут потеряны безвозвратно.',
'dep.token': 'Контракт токена (сверьте перед отправкой)',
'dep.statusWaiting': '⏳ Ожидаю ваш депозит…',
'dep.statusDetected': '🔵 Обнаружено ${amount} — конвертирую в pUSD…',
'dep.statusReady': '✅ ${amount} pUSD готово к торговле',
// Withdraw (crypto) from the trading wallet
'wd.title': 'Вывод',
'wd.avail': 'Доступно',
'wd.amount': 'Сумма (pUSD)',
'wd.max': 'Макс',
'wd.to': 'Адрес получателя',
'wd.btn': 'Вывести',
'wd.busy': 'Вывод…',
'wd.done': 'Выведено ✓',
'wd.err': 'Ошибка вывода',
'wd.badAmt': 'Введите корректную сумму',
'wd.badTo': 'Введите корректный адрес',
// Markets / screener
'mkt.sort.volume': 'Объём', 'mkt.sort.liquidity': 'Ликвидность', 'mkt.sort.spread': 'Спред',
'mkt.sort.endDate': 'Заканчивается', 'mkt.sort.updated': 'Новые', 'mkt.sort.outcomes': 'Исходов',
'mkt.anyM': 'Любой', 'mkt.anyF': 'Любая', 'mkt.anytime': 'Когда угодно', 'mkt.24h': 'За 24ч', 'mkt.week': 'За неделю',
'mkt.events': '🗂 События', 'mkt.allMarkets': '📋 Все рынки',
'mkt.minVolume': 'Мин. объём', 'mkt.minLiquidity': 'Мин. ликвидность', 'mkt.endsLabel': 'Завершение',
'mkt.yesRange': 'Диапазон цены YES', 'mkt.resetFilters': 'Сбросить фильтры', 'mkt.sortLabel': 'Сортировка',
'mkt.eventsWord': 'событий', 'mkt.marketsWord': 'рынков', 'mkt.bySearch': 'по «{q}»',
'mkt.inCat': 'в {cat}', 'mkt.filtered': '(фильтр)',
'mkt.back': '← Назад', 'mkt.next': 'Вперёд →', 'mkt.pageOf': 'из',
'mkt.volShort': 'Объём', 'mkt.liqShort': 'Ликв', 'mkt.spreadShort': 'Спред',
'mkt.kpiActive': 'Активных рынков', 'mkt.kpiVol24': 'Объём 24ч', 'mkt.kpiTop': '🔥 Топ по объёму', 'mkt.kpiEnding': 'Заканчиваются за 24ч',
'mkt.noEvents': 'События не найдены', 'mkt.noEventsSub': 'Попробуй изменить фильтры или поиск',
'mkt.outcomeOne': 'исход', 'mkt.outcomeMany': 'исходов',
// Signals
'sig.title': '🔥 Возможности',
'sig.desc': 'Киты, фейд лонгшотов и всплески объёма. Сила сигнала — насколько уверенно направление, качество входа — спред и ликвидность.',
'sig.fAll': 'Все', 'sig.fWhale': '🐋 Киты', 'sig.fLongshot': '🎯 Фейд', 'sig.fMomentum': '⚡ Моментум', 'sig.fSpike': '📈 Спайки',
'sig.sAny': 'Любая сила', 'sig.sStrong': 'Сильные', 'sig.sVeryStrong': 'Очень сильные',
'sig.hAny': 'Любой срок', 'sig.hFast': '⚡ 1-2 дня', 'sig.hMid': '📅 До 2 недель', 'sig.hLong': '🗓 От 2 недель',
'sig.titleStrength': 'Переключить мин. силу сигнала', 'sig.titleHorizon': 'Переключить срок до конца события',
'sig.emptyTitle': 'Пока нет сигналов', 'sig.emptySub': 'По текущим фильтрам ничего не найдено. Попробуй ослабить фильтр или подожди — данные обновляются каждые 2 минуты.',
'sig.badgeWhale': 'КИТ', 'sig.badgeFade': 'ФЕЙД', 'sig.badgeMomentum': 'МОМЕНТУМ', 'sig.badgeSpike': 'СПАЙК',
'sig.smartTo': 'Умные деньги → {side} · {vol} · {n} {trades}',
'sig.smartConv': 'Умные деньги → {side} · {conv}',
'sig.convAll': 'весь объём китов', 'sig.convPct': '{pct}% объёма китов',
'sig.priceYes': 'Цена YES', 'sig.vol24': '24ч объём',
'sig.longshotDesc': 'Лонгшот переоценён → ставка на фаворита ({side})',
'sig.spikeDesc': 'Резкий рост активности рынка',
'sig.volDesc': 'Объём {score}× от среднего за 7 дней',
'sig.buyYes': 'Купить YES', 'sig.buyNo': 'Купить NO', 'sig.more': 'Подробнее →',
'sig.smartBadge': '🧠 Умные деньги',
'sig.bet': 'Ставка: {side}', 'sig.prob': 'вероятность {p}%',
'sig.strength': 'Сила сигнала', 'sig.entryQuality': 'Качество входа',
'sig.whaleWr': 'WR китов {wr}%',
'sig.tradeOne': 'сделка', 'sig.tradeMany': 'сделок',
// Whale feed / profile
'wf.resolvedTitle': 'Показать сделки на уже решённых рынках (≤5¢ / ≥95¢)',
'wf.resolvedShown': '✓ Решённые показаны', 'wf.showResolved': 'Показать решённые',
'wf.tradesWord': 'сделок', 'wf.betTo': 'Ставка → {side}', 'wf.bought': 'купил', 'wf.sold': 'продал', 'wf.entry': 'вход',
'wp.backfill': '↻ обновляю историю…', 'wp.unsub': 'Отписаться от сделок кита', 'wp.sub': 'Уведомлять о новых сделках кита',
'wp.tracked': '🔔 Отслеживается', 'wp.alert': '🔔 Алерт', 'wp.inPlay': '⏳ в игре', 'wp.entryC': 'вход {c}¢',
'wp.page': 'Стр. {p} из {n}', 'wp.pnlDynamics': 'Динамика P&L', 'wp.byResolved': 'по {n} резолвнутым сделкам',
// Whales page
'whales.title': '🐋 Киты', 'whales.desc': 'Следи за умными деньгами — крупные сделки, консенсус по рынкам и топ-кошельки.',
'whales.tabTrades': '🐋 Сделки', 'whales.tabConsensus': '🤝 Консенсус', 'whales.tabAlerts': '🔔 Алерты', 'whales.tabLeaders': '🏆 Топ-кошельки',
'flow.title': '🌊 Поток', 'flow.desc': 'Куда движутся умные деньги — консенсус китов, свежие притоки и самые горячие рынки.',
'flow.tabConsensus': '🤝 Консенсус', 'flow.tabInsider': '🆕 Инсайдер', 'flow.tabFire': '🔥 Жар',
'flow.insiderSoon': 'Инсайдер-поток — скоро', 'flow.fireSoon': 'Жар (Fire Score) — скоро',
'flow.dayShort': 'д', 'flow.agreeAll': 'Любое', 'flow.hourShort': 'ч', 'flow.insiderEmpty': 'Пока нет свежих входов качественных китов — загляни позже',
'flow.entryNow': 'вход {a}¢ → сейчас {c}¢',
'flow.delta.pricier': '+{p}% дороже', 'flow.delta.cheaper': '−{p}% дешевле', 'flow.delta.same': '≈ как киты',
'flow.fresh.now': 'только что', 'flow.fresh.hours': '{h}ч назад', 'flow.fresh.days': '{d}д назад',
'flow.enter': 'Войти →', 'flow.loading': 'Загрузка…', 'flow.tradeUnavailable': 'Торговля по этому рынку недоступна',
'flow.amount': 'Сумма (USDC)', 'flow.buyConfirm': 'Войти — ${x}', 'flow.submitting': 'Отправка…',
'flow.needLogin': 'Войдите, чтобы торговать с депозита', 'flow.estShares': '≈ {n} шаров',
'flow.queued': 'Заявка принята — исполняется (~8с)', 'flow.alreadyQueued': 'Заявка уже в работе', 'flow.orderFailed': 'Не удалось отправить заявку',
'flow.custodyNote': 'Покупка с баланса депозита (pUSD) — как в копитрейде. Без подписи кошелька.',
'flow.insufficient': 'Недостаточно pUSD на депозите',
'whales.noConsensus': 'Пока нет консенсуса', 'whales.noConsensusSub': 'Консенсус появляется, когда на одном рынке торгуют ≥2 кита. Данные накапливаются сканером каждые 5 минут.',
'whales.agreement': 'согласие {p}%', 'whales.avgEntry': 'ср. вход {c}¢',
'whales.whaleOne': 'кит', 'whales.whaleMany': 'китов', 'whales.tradeOne': 'сделка', 'whales.tradeMany': 'сделок',
'whales.noWallets': 'Пока нет данных по кошелькам', 'whales.noWalletsSub': 'Лидерборд наполняется по мере накопления данных сканером (каждые 5 минут).',
'whales.noSubs': 'Нет подписок на китов', 'whales.noSubsSub': 'Открой профиль кита и нажми «🔔 Алерт» — здесь появятся его новые сделки. Сканер проверяет каждые 5 минут.',
'whales.newCount': '+{n} новых', 'whales.unsub': 'Отписаться',
'wpp.editCopy': 'Изменить копию', 'wpp.copyLeader': 'Копировать лидера', 'wpp.copiedSoon': 'Меня копируют (скоро)',
// Custody / account / misc
'cust.title': '💼 Кошелёк для копирования', 'cust.soon': 'скоро', 'cust.vaultBal': 'баланс vault (USDC)',
'cust.noDeleg': 'Делегирование не настроено', 'cust.delegInfo': '✅ бот сможет торговать · ❌ вывод — только ты',
'cust.deposit': 'Депозит USDC', 'cust.withdraw': 'Вывести',
'cust.footer': 'Деньги остаются в твоём личном vault. Делегат-ключ бота может только открывать/закрывать сделки — вывести средства может лишь твой кошелёк. Привязка кошелька и депозит появятся на следующем шаге.',
'acct.errNoSigner': 'Не настроен VITE_PRIVY_SIGNER_ID (создай Authorization key в Privy)',
'acct.errDeleg': 'Ошибка делегирования', 'acct.errSafeAddr': 'Не удалось вывести адрес Safe', 'acct.errDeploy': 'Ошибка деплоя',
'acct.title': 'Аккаунт', 'acct.loading': 'Загрузка…', 'acct.loggedIn': 'Вошёл', 'acct.wallet': 'Кошелёк', 'acct.tradingSafe': 'Торговый Safe',
'acct.walletReady': '✅ Торговый кошелёк готов', 'acct.settingUp': 'Настраиваю…', 'acct.setupWallet': 'Настроить торговый кошелёк',
'acct.autoCopyOn': '✅ Авто-копирование разрешено', 'acct.confirming': 'Подтверждение…', 'acct.allowAutoCopy': 'Разрешить авто-копирование', 'acct.logout': 'Выйти',
'acct.activateWallet': 'Активировать кошелёк', 'acct.activating': 'Активирую…', 'acct.walletActive': '✅ Кошелёк активен — можно копировать',
'acct.deposit': 'Пополнить', 'acct.withdraw': 'Вывести', 'acct.close': 'Закрыть',
'acct.redeem': 'Забрать выигрыши → pUSD', 'acct.redeeming': 'Забираю…',
'acct.signinDesc': 'Войди по email — кошелёк для копирования создастся автоматически (без MetaMask и газа).', 'acct.signinEmail': 'Войти через email',
'wbb.close': 'Закрыть', 'wbb.title': '📱 Подпись на мобиле теряется?', 'wbb.body': 'Откройте экран в браузере кошелька — там подпись срабатывает мгновенно, без переключения приложений.',
'settings.admin': 'Админ', 'settings.adminDesc': 'Доход, объём и сделки по билдер-коду SZHub', 'settings.userAnalyticsDesc': 'Регистрации, копиры, депозиты и P&L копий', 'settings.open': 'Открыть →',
'trade.balance': 'Баланс',
'err.connectFirst': 'Сначала подключи кошелёк', 'err.signinFailed': 'Ошибка входа',
'err.signPending': 'Запрос подписи уже отправлен — откройте кошелёк и подтвердите, либо переподключите его.',
'err.signPendingLong': 'Запрос подписи уже отправлен. Откройте кошелёк и подтвердите его — или переподключите кошелёк, чтобы сбросить зависший запрос.',
'err.signNotReceived': 'Подпись не получена. Если вы подтвердили в кошельке — вернитесь и нажмите «Sign to Trade» ещё раз.',
'time.mAgo': '{n} мин назад',
'time.hAgo': '{n} ч назад',
'time.dAgo': '{n} д назад',
'time.justNow': 'только что', 'time.min': '{n} мин', 'time.hr': '{n} ч', 'time.day': '{n} д', 'time.mo': '{n} мес', 'time.ended': 'завершён', 'time.resolving': 'ожидает',
},
};
📜 Git History
b9c19bfchore(poli): reconcile local Flow/Insider/manual-trade work with deployed state3 days ago
cecbd3afeat(poli): Flow «Войти» custody modal (chunk 3) — manual buy from deposit, no wallet sign4 days ago
eb6fff8feat(poli): Flow chunk 3 — green «Войти» button + trade modal4 days ago
f5cc0aefeat(poli): Flow consensus chunk 2 — entry→now delta, freshness, sort, filters4 days ago
c545cc4feat(poli): add Поток (Flow) section — 5th nav item, /flow route, Консенсус/Инсайдер/Жар sub-tabs4 days ago
a5393b2feat(poli): Leaders title → Winners (copy) / Losers (fade)11 days ago
61b7393feat(leaders): fold Sharpe-consistency & drawdown into EDGE score (P0.2)11 days ago
5cb10f3feat(leaders): 7d momentum metric (real pnl7d from backend chunk B)12 days ago
5631672feat(leaders): EDGE composite score (client-side) — badge + main sort12 days ago
b141bdefeat(more+leaders): localize MorePage + non-custodial badge; fix Leaders 3-col stat grid12 days ago
Show last diff
Loading...