← Back
// 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.copies': 'My Copies',
    'nav.portfolio': 'My Trades',
    'nav.markets': 'Markets',
    'nav.more': 'More',
    '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.sub': 'Copy smart money — pick a whale and connect',
    '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.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',
    '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.copies': 'Мои копии',
    'nav.portfolio': 'Мои сделки',
    'nav.markets': 'Рынки',
    'nav.more': 'Ещё',
    'nav.account': 'Аккаунт',
    'nav.wallet': 'Кошелёк',
    'wallet.available': 'Доступно',
    'wallet.inPositions': 'В позициях',
    'wallet.total': 'Всего',
    'nav.signin': 'Войти',
    // Leaders
    'leaders.title': '🐋 Лидеры',
    'leaders.sub': 'Копируй умные деньги — выбери кита и подключись',
    '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.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': '🏆 Топ-кошельки',
    '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

03a2d80chore(save): session 2026-06-22 — Phase2 redesign + 3mo history + realized-PnL fix; staged _impl edits11 days ago
Show last diff
Loading...