/* global window */
// ============================================================
// js/minamoto/i18n.jsx
// Strings for the Minamoto SPA. EN + ES at launch.
// Keys are hierarchical; reads via t('section.key').
// ============================================================

window.MN = window.MN || {};

(function (MN) {
  const STR = {
    en: {
      'app.title': 'SoraMetrics — Minamoto',
      'app.tagline': 'mainnet sora minamoto',
      'app.back': 'Networks',
      'app.network.minamoto': 'Minamoto',
      'app.network.sorav2': 'SORA v2',
      'nav.featured': 'Featured',
      'nav.my': 'My',
      'nav.network': 'Network',
      'nav.toolsGroup': 'Tools',
      'nav.pulse': 'Network Pulse',
      'nav.crosschain': 'XOR migration',
      'nav.wallet': 'Wallet',
      'nav.overview': 'Overview',
      'nav.blocks': 'Blocks',
      'nav.transactions': 'Transactions',
      'nav.transfers': 'Transfers',
      'nav.mints': 'Mints',
      'nav.burns': 'Burns',
      'nav.instructions': 'All instructions',
      'nav.accounts': 'Accounts',
      'nav.domains': 'Domains',
      'nav.assets': 'Assets',
      'nav.peers': 'Peers',
      'nav.lanes': 'Lanes',
      'nav.prometheus': 'Prometheus',
      'kpi.block': 'Block height',
      'kpi.finalized': 'Finalized',
      'kpi.peers': 'Peers',
      'kpi.domains': 'Domains',
      'kpi.accounts': 'Accounts',
      'kpi.assets': 'Assets',
      'kpi.tx_accepted': 'Tx committed',
      'kpi.tx_rejected': 'Tx rejected',
      'kpi.commit_time': 'Avg commit',
      'kpi.block_time': 'Avg block',
      'kpi.iroha': 'Iroha version',
      'kpi.last_block': 'Last block',
      'common.loading': 'Loading…',
      'common.error': 'Error',
      'common.empty': 'No data yet',
      'common.copy': 'Copy',
      'common.height': 'Height',
      'common.hash': 'Hash',
      'common.created': 'Created',
      'common.status': 'Status',
      'common.authority': 'Authority',
      'common.kind': 'Kind',
      'common.id': 'ID',
      'common.owner': 'Owner',
      'common.value': 'Value',
      'common.alias': 'Alias',
      'common.address': 'Address',
      'common.public_key': 'Public key',
      'common.last_seen': 'Last seen',
      'common.committed': 'Committed',
      'common.rejected': 'Rejected',
      'common.failed': 'failed',
      'tx.executable.instructions': 'Instructions',
      'overview.title': 'Network overview',
      'overview.subtitle': 'Live state of the Minamoto chain — refreshed every 10 s.',
      'pulse.title': 'Network Pulse',
      'pulse.subtitle': 'Live activity on Minamoto: blocks, instructions and asset state.',
      'pulse.connected': 'connected',
      'pulse.liveFeed': 'Live feed',
      'pulse.events': 'events',
      'pulse.assets': 'Assets · Mainnet',
      'pulse.health': 'Network health',
      'pulse.validators': 'Validators',
      'pulse.active': 'active',
      'pulse.iroha': 'Iroha runtime',
      'pulse.blockHeight': 'Block height',
      'pulse.finalized': 'Finalized',
      'pulse.avgBlock': 'Avg block time',
      'pulse.avgCommit': 'Avg commit time',
      'pulse.queueSize': 'Queue size',
      'pulse.viewChanges': 'View changes',
      'pulse.kpi.height': 'Block height',
      'pulse.kpi.peers': 'Peers',
      'pulse.kpi.peersSub': 'connected nodes',
      'pulse.kpi.accounts': 'Accounts',
      'pulse.kpi.xorSupply': 'XOR supply',
      'pulse.kpi.migrated': 'XOR migrated',
      'pulse.kpi.blockTime': 'Avg block time',
      'blocks.title': 'Blocks',
      'transactions.title': 'Transactions',
      'instructions.title': 'All instructions',
      'instructions.subtitle': 'Power-user view: every Iroha 3 ISI on-chain (mint, burn, transfer, register, grant…). The verb-specific tabs above (Transfers / Mints / Burns) are friendlier for everyday browsing.',
      'verb.from': 'From',
      'verb.to': 'To',
      'verb.asset': 'Asset',
      'verb.amount': 'Amount',
      'verb.recipient': 'Recipient',
      'verb.minter': 'Minted by',
      'verb.burner': 'Burned by',
      'verb.transfersTitle': 'Transfers',
      'verb.transfersSub': 'On-chain asset transfers between accounts. Equivalent to v2 Transfers — same function, Iroha 3 implementation.',
      'verb.mintsTitle': 'Mints',
      'verb.mintsSub': 'Issuance events: tokens created and credited to a recipient. XOR claim mints from cross-chain migrations show up here too.',
      'verb.burnsTitle': 'Burns',
      'verb.burnsSub': 'Tokens destroyed. Equivalent to v2 Burns tracker — Iroha 3 emits a Burn ISI per destruction event.',
      'nav.governance': 'Governance',
      'nav.nfts': 'NFTs',
      'nav.rwas': 'RWAs',
      'nav.kaigi': 'Kaigi relays',
      'gov.title': 'Governance',
      'gov.subtitle': 'Council, lock unlocks and Sumeragi consensus telemetry. Most fields read zero today because the network just launched — VRF rounds and proposals will populate them.',
      'gov.council': 'Council',
      'gov.epoch': 'Epoch',
      'gov.members': 'Members',
      'gov.alternates': 'Alternates',
      'gov.candidates': 'Candidates',
      'gov.verified': 'VRF verified',
      'gov.fallbackHint': 'No council yet — chain is in fallback mode. The genesis admin acts as default authority until VRF elects the first council.',
      'gov.unlocks': 'Lock unlocks',
      'gov.heightNow': 'Current height',
      'gov.expiredLocksNow': 'Expired locks now',
      'gov.referendaWithExpired': 'Referenda with expired',
      'gov.lastSweep': 'Last sweep height',
      'gov.consensus': 'Sumeragi consensus',
      'gov.validatorSet': 'Validator set size',
      'gov.leaderIndex': 'Leader index',
      'gov.highestQc': 'Highest QC',
      'gov.lockedQc': 'Locked QC',
      'gov.viewChanges': 'View changes',
      'gov.queueSize': 'Queue size',
      'gov.vrfEpoch': 'Epoch',
      'gov.vrfFinalized': 'Finalized',
      'gov.vrfParticipants': 'Participants',
      'gov.vrfCommits': 'Commits',
      'gov.vrfLateReveals': 'Late reveals',
      'gov.rbcSessions': 'Pending sessions',
      'gov.rbcChunks': 'Pending chunks',
      'gov.rbcBytes': 'Pending bytes',
      'gov.rbcTtl': 'Session TTL',
      'gov.availability': 'Availability',
      'gov.collectors': 'Collectors',
      'gov.votesIngested': 'Votes ingested',
      'nft.title': 'NFTs',
      'nft.subtitle': 'Non-fungible assets registered on Minamoto.',
      'nft.emptyLabel': 'No NFTs registered yet',
      'nft.emptyHint': 'Once accounts start minting NFTs (via Register::Nft), they will show up here automatically.',
      'rwa.title': 'Real-World Assets',
      'rwa.subtitle': 'Tokenized off-chain assets (real estate, securities, commodities) anchored on Minamoto.',
      'rwa.emptyLabel': 'No RWAs anchored yet',
      'rwa.emptyHint': 'RWAs are the institutional rail Minamoto was built for. The pallet is live; first issuances will appear here as soon as a custodian onboards.',
      'kaigi.title': 'Kaigi relays',
      'kaigi.subtitle': 'Cross-chain message relays that bridge Minamoto with external chains (substrate, parachains, TON).',
      'kaigi.emptyLabel': 'No Kaigi relays registered',
      'kaigi.emptyHint': 'When a relay registers itself with the network, it will appear here with health and routing info.',
      'cc.title': 'XOR cross-chain migration',
      'cc.subtitle': 'XOR enters Minamoto via burn-and-claim from SORA v2 (eligibility from v2 block #25,867,650). Each Minamoto claim tx carries the originating burn-tx hash on-chain — that lets us track every migration end-to-end.',
      'cc.totalClaims': 'Claims',
      'cc.totalXor': 'XOR via cross-chain',
      'cc.supplyTotal': 'XOR supply on Minamoto',
      'cc.supplyTotalSub': 'all sources combined',
      'cc.otherMint': 'Other XOR (genesis / direct)',
      'cc.otherMintSub': 'minted without v2 burn proof',
      'cc.ofSupply': 'of total supply',
      'cc.viaClaim': 'verified via burn-and-claim',
      'cc.discrepancyNote': 'Only mints whose Minamoto tx carries a "sora_v2_claim_tx_hash" in metadata count as cross-chain migrated. Other XOR on Minamoto came from the genesis block (validator allocations) and from direct admin mints during early bootstrap — those are NOT migrations and have no v2 burn counterpart. As real users start burning XOR on v2 to claim on Minamoto, the migrated number grows.',
      'cc.uniqueRecipients': 'Unique recipients',
      'cc.firstClaim': 'First claim',
      'cc.lastClaim': 'Last claim',
      'cc.timeChart': 'Claims & XOR over time',
      'cc.recipient': 'Recipient',
      'cc.mnBlock': 'MN block',
      'cc.mnTx': 'MN tx',
      'cc.mnRecipient': 'MN recipient',
      'cc.v2Block': 'v2 block',
      'cc.v2Tx': 'v2 burn tx',
      'cc.v2Signer': 'v2 signer',
      'cc.noClaims': 'No cross-chain claims indexed yet — the enricher checks every committed tx and pulls metadata when it appears.',
      'accounts.title': 'Accounts',
      'domains.title': 'Domains',
      'peers.title': 'Peers',
      'peers.nodes': 'nodes',
      'peers.online': 'online',
      'peers.note': 'Each Iroha 3 node reports the OTHER peers it sees (it does not list itself), which is why a single node’s /peers endpoint returns N−1 entries while /v1/explorer/metrics counts the full N nodes.',
      'peers.propagation': 'Block propagation',
      'peers.propagationNote': 'spread_ms = time between the first and last node that reported the block. <1 s = green (gossip flowing), 1–5 s = yellow (back-pressure), >5 s = red (a peer is lagging).',
      'peers.blocks': 'blocks',
      'peers.avg': 'avg',
      'peers.max': 'max',
      'prometheus.title': 'Prometheus metrics',
      'prometheus.subtitle': 'Time-series metrics streamed from Iroha 3 /metrics.',
      'wallet.title': 'Wallet',
      'wallet.searchSub': 'Open any I105 account to see balances, permissions, transactions and multisig info. Paste an account ID, pick a recent one, or click any account elsewhere on the dashboard.',
      'wallet.recent': 'Recent accounts',
      'wallet.balances': 'Balances',
      'wallet.permissions': 'Permissions',
      'wallet.txs': 'Recent transactions',
      'wallet.firstSeen': 'First seen',
      'wallet.changeWallet': 'Change',
      'wallet.portfolio': 'Wallet portfolio',
      'wallet.portfolioSub': 'Saved Minamoto wallets. Stored locally in your browser — only account IDs, never private keys. Backup to JSON anytime.',
      'wallet.addWallet': 'Add wallet',
      'wallet.aliasPlaceholder': 'Alias (optional)',
      'wallet.unnamed': '(unnamed — click to label)',
      'wallet.renameHint': 'Click to rename',
      'wallet.remove': 'Remove from portfolio',
      'wallet.confirmRemove': 'Remove this wallet from your portfolio? (account itself stays on-chain)',
      'wallet.openDetail': 'Open detail',
      'wallet.export': 'Export JSON',
      'wallet.import': 'Import JSON',
      'wallet.savedCount': 'saved',
      'wallet.emptyLabel': 'No wallets saved yet',
      'wallet.emptyHint': 'Paste an account ID above to start tracking. Use the export/import buttons to back up your portfolio across devices.',
      'wallet.recentNetwork': 'Recent network accounts',
      'wallet.savePortfolio': 'Save to portfolio',
      'wallet.saved': 'Saved',
      'wallet.saveAliasPrompt': 'Optional alias for this wallet:',
      'wallet.noAssets': 'No assets held',
      'wallet.tab.assets': 'Assets',
      'wallet.tab.transfers': 'Transfers',
      'wallet.tab.extrinsics': 'Transactions',
      'wallet.tab.permissions': 'Permissions',
      'wallet.tab.info': 'Info',
      'wallet.aliasLabel': 'ALIAS · IN MY WALLETS',
      'wallet.address': 'ADDRESS',
      'wallet.breakdown': 'BREAKDOWN BY ASSET',
      'wallet.tokens': 'tokens',
      'wallet.save': 'Save',
      'wallet.savedAlias': 'Saved alias',
      'wallet.localId': 'Local id',
      'common.close': 'Close',
      'wallet.assetsCreated': 'Asset definitions created',
      'wallet.assetsCreatedHint': 'This wallet registered these token types on-chain. Owning a definition does NOT mean holding tokens of it — that is shown in Balances above.',
      'wallet.info.activity': 'ACTIVITY',
      'wallet.info.firstTx': 'First tx',
      'wallet.info.lastTx': 'Last tx',
      'wallet.info.totalTxs': 'Total txs',
      'wallet.info.successRate': 'success',
      'wallet.info.daysActive': 'Days active',
      'wallet.info.assetsHeld': 'Tokens held',
      'wallet.info.identity': 'IDENTITY',
      'wallet.info.alias': 'Primary alias',
      'wallet.info.multisig': 'Multisig',
      'wallet.info.firstSeen': 'First seen on-chain',
      'wallet.info.lastSeen': 'Last seen on-chain',
      'wallet.info.topKinds': 'TOP INSTRUCTION KINDS',
      'wallet.info.topKindsHint': 'Most-used Iroha 3 ISI kinds emitted by this account.',
      'wallet.info.domainsOwned': 'DOMAINS OWNED',
      'wallet.info.domainsHint': 'Domains where this account is the owner. Each domain hosts its own accounts and asset definitions.',
      'wallet.info.assetsCreated': 'ASSET DEFINITIONS CREATED',
      'wallet.info.assetsCreatedHint': 'Token types this wallet registered on-chain. Holding the definition is not the same as holding the token.',
      'wallet.info.crossChain': 'CROSS-CHAIN BRIDGE',
      'wallet.info.crossChainHint': 'XOR migrated from SORA v2 (burn) and claimed on Minamoto.',
      'wallet.info.claimsReceived': 'XOR claims received',
      'wallet.info.xorClaimed': 'Total XOR claimed',
      'wallet.info.localAlias': 'LOCAL PORTFOLIO',
      'wallet.info.noActivity': 'No on-chain activity yet for this account.',
      'wallet.info.noKinds': 'No instructions emitted by this account yet.',
      'wallet.info.noDomains': 'This account does not own any domains.',
      'wallet.info.noAssets': 'This account has not registered any asset definitions.',
      'wallet.info.noCrossChain': 'This wallet has not received any cross-chain XOR claim.',
      'wallet.info.received': 'Received',
      'wallet.info.whaleScore': 'WHALE SCORE',
      'wallet.info.whaleVolume': 'Volume',
      'wallet.info.whaleFrequency': 'Frequency',
      'wallet.info.whaleDiversity': 'Diversity',
      'wallet.info.movements': 'MOVEMENTS',
      'wallet.info.sent': 'Sent',
      'wallet.info.volumeXor': 'Volume XOR',
      'wallet.info.avgXor': 'Average',
      'wallet.info.maxXor': 'Max',
      'wallet.info.topTokens': 'TOP TOKENS',
      'wallet.info.topTokensHint': 'Tokens this wallet interacted with. Counts Transfer ISIs (sent + received) + Mint receipts. Minamoto (Iroha 3) has no DEX deployed in mainnet yet — SoraSwap is in development at sora-xor/soraswap and rolling out to Taira testnet first, so these are NOT swaps. Volume is in raw on-chain units (no decimal scaling applied).',
      'wallet.info.token': 'Token',
      'wallet.info.trades': 'Interactions',
      'wallet.info.volume': 'Volume (raw)',
      'wallet.info.noMovements': 'This wallet has not sent or received any tokens yet.',
      'wallet.info.noTopTokens': 'No token interactions recorded yet.',

      // Accounts page
      'accounts.kpi.total':         'Total accounts',
      'accounts.kpi.totalSub':      'on-chain identities',
      'accounts.kpi.multisig':      'Multisig',
      'accounts.kpi.aliased':       'Aliased',
      'accounts.kpi.ofAll':         'of all',
      'accounts.kpi.active24h':     'Active · 24h',
      'accounts.kpi.active24hSub':  'last_seen ≤ 24h',
      'accounts.kpi.new7d':         'New · 7d',
      'accounts.kpi.lastSub':       'last activity',
      'accounts.searchPlaceholder': 'Search by id or alias…',
      'accounts.filter.all':        'All',
      'accounts.filter.multisig':   'Multisig',
      'accounts.filter.aliased':    'Aliased',
      'accounts.filter.active24h':  'Active 24h',
      'accounts.col.account':       'Account',
      'accounts.col.alias':         'Alias',
      'accounts.col.multisig':      'Multisig',
      'accounts.col.firstSeen':     'First seen',
      'accounts.col.lastSeen':      'Last seen',
      'accounts.activeNow':         'active 24h',

      // Transactions KPIs
      'tx.kpi.total24h':    'Transactions · 24h',
      'tx.kpi.total24hSub': 'last 24 hours',
      'tx.kpi.successRate': 'Success rate',
      'tx.kpi.signers':     'Unique signers',
      'tx.kpi.signersSub':  'distinct authorities',
      'tx.kpi.topAuthor':   'Top authority',
      'tx.kpi.txs':         'txs',
      'tx.kpi.total':       'Total all-time',
      'tx.fee.title':            'FEE SPONSORSHIP',
      'tx.fee.subtitle':         '· Iroha 3 fee model · the block payload does not expose the fee amount, so this surface counts only',
      'tx.fee.sponsored':        'Sponsored txs',
      'tx.fee.ofAll':            'of all',
      'tx.fee.sponsored24h':     'Sponsored · 24h',
      'tx.fee.last24h':          'last 24 hours',
      'tx.fee.sponsors':         'Sponsors',
      'tx.fee.distinct':         'distinct sponsors',
      'tx.fee.beneficiaries':    'Beneficiaries',
      'tx.fee.distinctSigners':  'distinct signers benefiting',
      'tx.fee.topSponsors':      'Top sponsors',
      'tx.fee.txs':              'txs',

      // Verb (transfers/mints/burns) KPIs
      'verb.kpi.total24h':       'Transfers · 24h',
      'verb.kpi.totalSub':       'last 24 hours',
      'verb.kpi.volume24h':      'Volume · 24h',
      'verb.kpi.equiv':          'units',
      'verb.kpi.uniqueSenders':  'Unique senders',
      'verb.kpi.unique':         'distinct authors',
      'verb.kpi.topAsset':       'Top asset',
      'verb.kpi.transfers':      'transfers',
      'verb.kpi.total':          'Total all-time',
      'verb.kpi.totalMintSub':   'minting events',
      'verb.kpi.totalBurnSub':   'burning events',
      'verb.kpi.pageVolume':     'Volume · this page',
      'verb.kpi.thisPage':       'this page',
      'verb.kpi.pageActors':     'Authors · this page',
      'verb.kpi.uniqueOnPage':   'distinct on page',
      'verb.kpi.pageRows':       'Rows · this page',

      // Domains KPIs
      'domains.accounts':        'Accounts',
      'domains.assets':          'Assets',
      'domains.updated':         'Updated',
      'domains.kpi.total':       'Domains',
      'domains.kpi.accounts':    'Total accounts',
      'domains.kpi.accountsSub': 'across all domains',
      'domains.kpi.assets':      'Total assets',
      'domains.kpi.assetsSub':   'asset definitions',
      'domains.kpi.nfts':        'Total NFTs',
      'domains.kpi.nftsSub':     'minted',
      'domains.kpi.largestAcc':  'Largest · accounts',
      'domains.kpi.largestAst':  'Largest · assets',

      // Blocks KPIs
      'blocks.kpi.height':       'Latest height',
      'blocks.kpi.heightSub':    'best block',
      'blocks.kpi.blocks24h':    'Blocks · 24h',
      'blocks.kpi.blocks24hSub': 'finalized',
      'blocks.kpi.tx24h':        'Tx · 24h',
      'blocks.kpi.tx24hSub':     'committed',
      'blocks.kpi.empty24h':     'Empty · 24h',
      'blocks.kpi.avgBlock':     'Avg block time',
      'blocks.kpi.avgBlockSub':  'last 100 intervals',

      // Assets KPIs / filter
      'assets.kpi.total':         'Asset definitions',
      'assets.kpi.zk':            'ZK Convertible',
      'assets.kpi.mintInf':       'Mintable',
      'assets.kpi.mintInfSub':    'infinitely',
      'assets.kpi.mintOnce':      'Fixed supply',
      'assets.kpi.mintOnceSub':   'mint once',
      'assets.kpi.holders':       'Total holder slots',
      'assets.kpi.holdersSub':    'sum across assets',
      'assets.searchPlaceholder': 'Search by name, alias or id…',
      'assets.filter.mintable':   'Mintable',
      'assets.filter.fixed':      'Fixed',

      // Peers KPIs
      'peers.kpi.total':         'Total peers',
      'peers.kpi.online':        'Online',
      'peers.kpi.offline':       'Offline',
      'peers.kpi.avgSpread':     'Avg propagation',
      'peers.kpi.maxSpread':     'Worst propagation',
      'peers.kpi.maxSpreadSub':  'last sample',

      // Governance KPIs
      'gov.kpi.epoch':           'Epoch',
      'gov.kpi.epochSub':        'governance term',
      'gov.kpi.councilMembers':  'Council members',
      'gov.kpi.candidates':      'candidates',
      'gov.kpi.validators':      'Validators',
      'gov.kpi.viewChanges':     'View changes',
      'gov.kpi.viewChangesSub':  'consensus instability',
      'gov.kpi.expiredLocks':    'Expired locks',

      // Cross-chain extra mini stats
      'cc.largestClaim':    'Largest claim',
      'cc.largestClaimSub': 'biggest single migration',
      'cc.avgClaim':        'Average claim',
      'cc.avgClaimSub':     'XOR per migration',
      'cc.mint.title':         'XOR mint history',
      'cc.mint.subtitle':      'Every XOR ever minted on Minamoto, by source — genesis premint, cross-chain claim, or admin/runtime mint',
      'cc.mint.genesis':       'Genesis premint',
      'cc.mint.genesisHint':   'Block #1 mints — fresh bootstrap supply OR balances carried over from a previous chain reset (no v2 burn link).',
      'cc.mint.bridge':        'Cross-chain claim',
      'cc.mint.bridgeHint':    'Migrated from SORA v2 (verified by burn proof)',
      'cc.mint.other':         'Other mint',
      'cc.mint.total':         'TOTAL XOR MINTED',
      'cc.mint.totalMints':    'mint events',
      'cc.mint.mints':         'mints',
      'cc.mint.recipients':    'recipients',
      'cc.mint.timeline':      'Chronological timeline',
      'cc.mint.chronological': 'oldest first · all sources',
      'cc.mint.col.when':      'When',
      'cc.mint.col.block':     'Block',
      'cc.mint.col.source':    'Source',
      'cc.mint.col.recipient': 'Recipient',
      'cc.mint.col.proof':     'Proof',
      'cc.mint.note':          'GENESIS premint = administrative supply minted at block #1. On Minamoto today this means EITHER fresh bootstrap allocation OR balances carried over from a previous chain reset. When a Minamoto reset happens, v2 burns are irreversible (the v2 chain keeps running) so the operator preserves user XOR by snapshotting balances and re-minting them at the new genesis as direct admin Mints — without carrying the original sora_v2_claim_tx_hash. The "messy" amounts here (e.g. 0.745, 4.3862, 11.99) are the signature of preserved balances rather than clean test allocations. CROSS-CHAIN claims keep their v2 burn link only for burns processed AFTER the most recent reset; older claims get reabsorbed into the genesis premint. Global conservation (XOR burned on v2 = XOR live on Minamoto) is maintained by the snapshot mechanism.',
      'cc.pending.title':       'Pending cross-chain burns',
      'cc.pending.subtitle':    'Sora v2 burns waiting on the Soramitsu operator to mint XOR on Minamoto',
      'cc.pending.filter':      'Filter',
      'cc.pending.all':         'All',
      'cc.pending.statusPending':'Pending',
      'cc.pending.statusClaimed':'Claimed',
      'cc.pending.statusPreReset':'Pre-reset',
      'cc.pending.when':        'Burned',
      'cc.pending.recipient':   'Minamoto recipient',
      'cc.pending.status':      'Status',
      'cc.pending.mnTx':        'Mn claim',
      'cc.pending.waiting':     'waiting',
      'cc.pending.preResetHint':'link severed at chain reset',
      'cc.pending.empty':       'No burns recorded yet for this filter.',
      'cc.pending.note':        'Each row is a `assets.burn` + `system.remark` pair on Sora v2 with the `soraNexusXorClaim` JSON tag. The Soramitsu operator monitors these and submits a Mint::Asset on Minamoto referencing the v2 tx hash. The bridge is custodial — there is no on-chain enforcement of processing time. Burns from before the most recent Minamoto chain genesis are tagged `Pre-reset`: their original claim records were wiped during the chain reset and cannot be processed on the current chain, but the XOR value may have been preserved via the genesis premint snapshot.',

      // Sumeragi roles panel
      'roles.title':              'Validator set & Sumeragi roles',
      'roles.subtitle':           'Live consensus topology, leader election and lane assignments',
      'roles.kpi.leader':         'Current leader',
      'roles.kpi.leaderUnresolved': 'pubkey unresolved',
      'roles.kpi.view':           'View',
      'roles.kpi.viewChanges':    'view changes',
      'roles.kpi.quorum':         'Quorum',
      'roles.kpi.quorumSub':      'BFT 2f+1',
      'roles.kpi.height':         'Committed height',
      'roles.kpi.heightSub':      'last finalised QC',
      'roles.kpi.epoch':          'Epoch',
      'roles.kpi.epochLen':       'blocks',
      'roles.kpi.laneStake':      'Lane stake bonded',
      'roles.kpi.laneStakeSub':   'sum across public lanes',
      'roles.resolution.label':   'Leader resolution',
      'roles.resolution.method':  'Blake2b-512 PRF',
      'roles.resolution.sortedBy': 'roster sorted by',
      'roles.resolution.genesisSeed': 'current epoch seed is all-zeros — replaced at epoch rollover via Blake2b(seed ‖ reveals)',
      'roles.resolution.empiricalMethod': 'Empirical (collectors-complement)',
      'roles.resolution.prfMatches':      'PRF formula matches ✓',
      'roles.resolution.prfDiverges':     'PRF formula diverges ⚠',
      'roles.resolution.prfDivergesNote': 'The PRF replay (Blake2b-512 of seed‖height‖view) does not match the live leader because /status reports prf_epoch_seed as a placeholder (zeros). The actual seed used internally is chain_epoch_seed(chain_id), and Torii does not expose chain_id, so we cannot reproduce the formula from outside. The collectors API gives ground truth; this divergence is expected and not a bug.',
      'staking.title':                 'Public Lane Staking Lifecycle',
      'staking.subtitle':              'NX-9 — validator status derived from RegisterPublicLaneValidator + ActivatePublicLaneValidator ISIs',
      'staking.kpi.totalValidators':   'Total validators',
      'staking.kpi.active':            'Active',
      'staking.kpi.pending':           'Pending activation',
      'staking.kpi.jailedExiting':     'Jailed/Exiting/Slashed',
      'staking.kpi.totalEvents':       'Lifecycle events',
      'staking.kpi.totalEventsSub':    'Register + Activate ISIs',
      'staking.roster':                'Validator roster',
      'staking.derived':               'derived from on-chain ISIs',
      'staking.col.pubkey':            'Public key',
      'staking.col.status':            'Status',
      'staking.col.registered':        'Registered',
      'staking.col.activated':         'Activated',
      'staking.col.events':            'Events',
      'staking.note':                  'Status flows: Register → PendingActivation → Active → (Jailed | Exiting | Exited | Slashed). Iroha currently emits Register + Activate ISIs only; later lifecycle states will appear when their dedicated ISI kinds are observed on-chain.',
      'wallet.perms.live':             'Live permissions',
      'wallet.perms.liveSub':          'currently held on-chain',
      'wallet.perms.granted':          'Grants received',
      'wallet.perms.grantedSub':       'historical Grant ISIs',
      'wallet.perms.uniqueTypes':      'Permission types',
      'wallet.perms.uniqueTypesSub':   'distinct names',
      'wallet.perms.activeTitle':      'Active permissions',
      'wallet.perms.empty':            'This account holds no permissions.',
      'wallet.perms.grant':            'grant',
      'wallet.perms.grants':           'grants',
      'wallet.perms.grantedBy':        'Granted by:',
      'wallet.perms.historyTitle':     'Permissions in audit trail (not currently held)',
      'wallet.perms.historyHint':      'Permissions appear here when they were granted historically but the account does NOT currently hold them — typically indicates a Revoke ISI happened or the grant expired.',
      'common.more':                   'more',
      'roles.roster':             'Validator roster',
      'roles.col.pubkey':         'Public key',
      'roles.col.torii':          'Torii API',
      'roles.col.p2p':            'P2P',
      'roles.col.roles':          'Roles',
      'roles.col.posts':          'Posts',
      'roles.col.rbcQueue':       'RBC queue',
      'roles.col.status':         'Status',
      'roles.ownership.selfTip':  'this validator self-disclosed its public_key in /telemetry/peers-info config',
      'roles.ownership.deducedTip': 'public_key inferred via cross-referencing connected_peers across the mesh',
      'roles.badge.leader':       'Leader',
      'roles.badge.leaderTip':    'Currently elected block proposer for (height, view) — verified via Blake2b-512 PRF',
      'roles.badge.voter':        'Voter',
      'roles.badge.voterTip':     'Signs QCs (Quorum Certificates) when voting on blocks',
      'roles.badge.vrf':          'VRF',
      'roles.badge.vrfTip':       'Participates in commit-reveal randomness for next-epoch leader election',
      'roles.badge.rbc':          'RBC',
      'roles.badge.rbcTip':       'Disseminates block chunks via Reliable Broadcast',
      'roles.lanes':              'Public lane assignments',
      'roles.active':             'active',
      'roles.pending':            'pending',
      'roles.lanesHint':          'Public Lanes are independent staking units (NX-9 Public Lane Staking). Each lane carries its own bonded stake and validator subset; permissionless validators bond stake to a specific lane to service blocks for it.',
      'roles.vrf':                'VRF · next-epoch leader election',
      'roles.vrf.commits':        'Commits',
      'roles.vrf.reveals':        'Reveals',
      'roles.vrf.finalized':      'Finalised',
      'roles.vrf.yes':            'YES',
      'roles.vrf.pending':        'PENDING',
      'roles.vrf.lateReveals':    'Late reveals',
      'roles.vrf.hint':           'Once epoch finalises, the VRF seed replaces zeros and the leader rotation becomes randomized per (height, view).',

      // Governance — extended (mode banner, epoch progress, current leader row)
      'gov.kpi.leader':            'Current leader',
      'gov.kpi.validatorsSub':     'in active set',
      'gov.mode.label':            'Consensus mode',
      'gov.mode.fallback':         'Fallback (genesis admin)',
      'gov.mode.vrf':              'VRF · randomized rotation',
      'gov.mode.fallbackBody':     'No on-chain council yet. Until VRF for epoch 0 finalises and the first council is elected, the genesis admin acts as default authority and leader rotation uses a deterministic seed.',
      'gov.mode.transitionBody':   'Council elected, but VRF for the current epoch has not finalised yet. Leader rotation is still using the previous-epoch seed.',
      'gov.mode.vrfBody':          'VRF finalised. Leader rotation per (height, view) uses a randomly-derived seed; nobody can predict the next leader without breaking the VRF.',
      'gov.mode.genesisSeed':      'genesis seed, replaced once epoch 0 reveals are aggregated',
      'gov.epoch.title':           'Epoch progress',
      'gov.epoch.block':           'Block',
      'gov.epoch.remaining':       'remaining',
      'gov.epoch.commitDeadline':  'Commit deadline',
      'gov.epoch.revealDeadline':  'Reveal deadline',
      'gov.epoch.fromEpochStart':  'from epoch start',
      'gov.epoch.commits':         'Commits',
      'gov.epoch.reveals':         'Reveals',
      'gov.epoch.finalisesAtEnd':  'finalises at end of epoch',
      'gov.epoch.phaseCommit':     'COMMIT phase',
      'gov.epoch.phaseReveal':     'REVEAL phase',
      'gov.epoch.phaseIdle':       'idle',
      'gov.currentLeader':         'Current leader',

      // Permissions / Grants
      'nav.permissions':                'Permissions',
      'permissions.title':              'Permissions & Grants',
      'permissions.subtitle':           'Iroha 3 access control via Grant ISIs (PermissionToAccount + RoleToAccount)',
      'permissions.kpi.totalGrants':    'Total grants',
      'permissions.kpi.distinctPerms':  'Permission types',
      'permissions.kpi.distinctPermsSub': 'unique names',
      'permissions.kpi.grantors':       'Grantors',
      'permissions.kpi.grantorsSub':    'distinct authorities',
      'permissions.kpi.recipients':     'Recipients',
      'permissions.kpi.recipientsSub':  'distinct accounts',
      'permissions.kpi.roles':          'Role grants',
      'permissions.kpi.rolesSub':       'RoleToAccount variant',
      'permissions.search.authority':   'Filter by grantor account…',
      'permissions.search.destination': 'Filter by recipient account…',
      'permissions.matching':           'matching',
      'permissions.col.permission':     'Permission',
      'permissions.col.args':           'Args',
      'permissions.col.grantor':        'Granted by',
      'permissions.col.grantee':        'Granted to',

      // Common shared
      'common.all':    'All',
      'common.shown':  'shown',
      'common.onPage': 'on page',
      'common.page':   'page',
      'assets.createdBy': 'Created by',
      'assets.subtitle': 'asset definitions registered on Minamoto',
      'asset.totalSupply': 'Total supply',
      'asset.holders': 'Holders',
      'asset.balance': 'Balance',
      'asset.holdersTitle': 'Holders',
      'block.title': 'Block',
      'block.height': 'Height',
      'block.hash': 'Hash',
      'block.prevHash': 'Previous',
      'block.txsHash': 'Txs root',
      'block.created': 'Created',
      'block.txTotal': 'Transactions',
      'block.txRejected': 'Rejected',
      'block.txList': 'Transactions in this block',
      'block.instructionsTitle': 'Instructions in this block',
      'tx.title': 'Transaction',
      'tx.executable': 'Executable',
      'tx.instructions': 'Instructions',
      'tx.feeSponsor': 'Fee sponsor',
      'tx.crossChain': 'Cross-chain claim',
      'tx.v2BurnTx': 'SORA v2 burn tx',
      'tx.recipient': 'Claim recipient',
      'tx.metadata': 'Metadata',
      'tx.signature': 'Signature',
      'tx.instructionsTitle': 'Instructions emitted by this tx',
    },
    es: {
      'app.title': 'SoraMetrics — Minamoto',
      'app.tagline': 'mainnet sora minamoto',
      'app.back': 'Redes',
      'app.network.minamoto': 'Minamoto',
      'app.network.sorav2': 'SORA v2',
      'nav.featured': 'Destacados',
      'nav.my': 'Mi',
      'nav.network': 'Red',
      'nav.toolsGroup': 'Herramientas',
      'nav.pulse': 'Pulso de la Red',
      'nav.crosschain': 'Migración XOR',
      'nav.wallet': 'Cartera',
      'nav.overview': 'Resumen',
      'nav.blocks': 'Bloques',
      'nav.transactions': 'Transacciones',
      'nav.transfers': 'Transferencias',
      'nav.mints': 'Mints',
      'nav.burns': 'Burns',
      'nav.instructions': 'Todas las instrucciones',
      'nav.accounts': 'Cuentas',
      'nav.domains': 'Dominios',
      'nav.assets': 'Activos',
      'nav.peers': 'Peers',
      'nav.lanes': 'Lanes',
      'nav.prometheus': 'Prometheus',
      'kpi.block': 'Altura de bloque',
      'kpi.finalized': 'Finalizado',
      'kpi.peers': 'Peers',
      'kpi.domains': 'Dominios',
      'kpi.accounts': 'Cuentas',
      'kpi.assets': 'Activos',
      'kpi.tx_accepted': 'Tx aceptadas',
      'kpi.tx_rejected': 'Tx rechazadas',
      'kpi.commit_time': 'Commit medio',
      'kpi.block_time': 'Bloque medio',
      'kpi.iroha': 'Versión Iroha',
      'kpi.last_block': 'Último bloque',
      'common.loading': 'Cargando…',
      'common.error': 'Error',
      'common.empty': 'Sin datos aún',
      'common.copy': 'Copiar',
      'common.height': 'Altura',
      'common.hash': 'Hash',
      'common.created': 'Creado',
      'common.status': 'Estado',
      'common.authority': 'Autoridad',
      'common.kind': 'Tipo',
      'common.id': 'ID',
      'common.owner': 'Dueño',
      'common.value': 'Valor',
      'common.alias': 'Alias',
      'common.address': 'Dirección',
      'common.public_key': 'Clave pública',
      'common.last_seen': 'Visto',
      'common.committed': 'Aceptado',
      'common.rejected': 'Rechazado',
      'common.failed': 'fallidas',
      'tx.executable.instructions': 'Instrucciones',
      'overview.title': 'Resumen de red',
      'overview.subtitle': 'Estado en vivo de la cadena Minamoto — refresco cada 10 s.',
      'pulse.title': 'Pulso de la Red',
      'pulse.subtitle': 'Actividad en cadena en vivo: bloques, instrucciones y estado de activos.',
      'pulse.connected': 'conectado',
      'pulse.liveFeed': 'Live feed',
      'pulse.events': 'eventos',
      'pulse.assets': 'Activos · Mainnet',
      'pulse.health': 'Salud de la red',
      'pulse.validators': 'Validadores',
      'pulse.active': 'activos',
      'pulse.iroha': 'Runtime Iroha',
      'pulse.blockHeight': 'Altura de bloque',
      'pulse.finalized': 'Finalizado',
      'pulse.avgBlock': 'Tiempo medio de bloque',
      'pulse.avgCommit': 'Tiempo medio de commit',
      'pulse.queueSize': 'Cola',
      'pulse.viewChanges': 'Cambios de vista',
      'pulse.kpi.height': 'Altura de bloque',
      'pulse.kpi.peers': 'Peers',
      'pulse.kpi.peersSub': 'nodos conectados',
      'pulse.kpi.accounts': 'Cuentas',
      'pulse.kpi.xorSupply': 'Supply XOR',
      'pulse.kpi.migrated': 'XOR migrado',
      'pulse.kpi.blockTime': 'Tiempo medio de bloque',
      'blocks.title': 'Bloques',
      'transactions.title': 'Transacciones',
      'instructions.title': 'Todas las instrucciones',
      'instructions.subtitle': 'Vista avanzada: cada ISI de Iroha 3 on-chain (mint, burn, transfer, register, grant…). Las pestañas por verbo arriba (Transfers / Mints / Burns) son más cómodas para el día a día.',
      'verb.from': 'De',
      'verb.to': 'A',
      'verb.asset': 'Activo',
      'verb.amount': 'Cantidad',
      'verb.recipient': 'Destinatario',
      'verb.minter': 'Minteado por',
      'verb.burner': 'Quemado por',
      'verb.transfersTitle': 'Transferencias',
      'verb.transfersSub': 'Transferencias on-chain de activos entre cuentas. Equivalente a Transfers de v2 — misma función, implementación Iroha 3.',
      'verb.mintsTitle': 'Mints',
      'verb.mintsSub': 'Eventos de emisión: tokens creados y acreditados a un destinatario. Los mints de claims XOR cross-chain también aparecen aquí.',
      'verb.burnsTitle': 'Burns',
      'verb.burnsSub': 'Tokens destruidos. Equivalente al Burn tracker de v2 — Iroha 3 emite una ISI Burn por cada destrucción.',
      'nav.governance': 'Gobernanza',
      'nav.nfts': 'NFTs',
      'nav.rwas': 'RWAs',
      'nav.kaigi': 'Kaigi relays',
      'gov.title': 'Gobernanza',
      'gov.subtitle': 'Consejo, unlocks de bloqueos y telemetría del consenso Sumeragi. Casi todo es cero hoy porque la red recién arrancó — las rondas VRF y propuestas lo poblarán.',
      'gov.council': 'Consejo',
      'gov.epoch': 'Época',
      'gov.members': 'Miembros',
      'gov.alternates': 'Suplentes',
      'gov.candidates': 'Candidatos',
      'gov.verified': 'VRF verificadas',
      'gov.fallbackHint': 'No hay consejo aún — la cadena está en modo fallback. El genesis admin actúa como autoridad por defecto hasta que VRF elija el primer consejo.',
      'gov.unlocks': 'Unlocks de bloqueos',
      'gov.heightNow': 'Altura actual',
      'gov.expiredLocksNow': 'Bloqueos expirados ahora',
      'gov.referendaWithExpired': 'Referenda con expirados',
      'gov.lastSweep': 'Última altura de sweep',
      'gov.consensus': 'Consenso Sumeragi',
      'gov.validatorSet': 'Tamaño set validadores',
      'gov.leaderIndex': 'Índice del líder',
      'gov.highestQc': 'QC más alto',
      'gov.lockedQc': 'QC bloqueado',
      'gov.viewChanges': 'Cambios de vista',
      'gov.queueSize': 'Tamaño cola',
      'gov.vrfEpoch': 'Época',
      'gov.vrfFinalized': 'Finalizada',
      'gov.vrfParticipants': 'Participantes',
      'gov.vrfCommits': 'Commits',
      'gov.vrfLateReveals': 'Reveals tardíos',
      'gov.rbcSessions': 'Sesiones pendientes',
      'gov.rbcChunks': 'Chunks pendientes',
      'gov.rbcBytes': 'Bytes pendientes',
      'gov.rbcTtl': 'TTL de sesión',
      'gov.availability': 'Disponibilidad',
      'gov.collectors': 'Recolectores',
      'gov.votesIngested': 'Votos ingestados',
      'nft.title': 'NFTs',
      'nft.subtitle': 'Activos no fungibles registrados en Minamoto.',
      'nft.emptyLabel': 'Sin NFTs registrados aún',
      'nft.emptyHint': 'Cuando las cuentas empiecen a mintear NFTs (vía Register::Nft), aparecerán aquí automáticamente.',
      'rwa.title': 'Activos del mundo real (RWAs)',
      'rwa.subtitle': 'Activos off-chain tokenizados (inmuebles, valores, commodities) anclados en Minamoto.',
      'rwa.emptyLabel': 'Sin RWAs anclados aún',
      'rwa.emptyHint': 'Los RWAs son la vía institucional para la que Minamoto fue construida. El pallet está vivo; las primeras emisiones aparecerán cuando se incorpore un custodio.',
      'kaigi.title': 'Kaigi relays',
      'kaigi.subtitle': 'Relays cross-chain que conectan Minamoto con cadenas externas (substrate, parachains, TON).',
      'kaigi.emptyLabel': 'Sin relays Kaigi registrados',
      'kaigi.emptyHint': 'Cuando un relay se registre con la red, aparecerá aquí con su salud y routing.',
      'cc.title': 'Migración cross-chain de XOR',
      'cc.subtitle': 'XOR entra a Minamoto vía burn-and-claim desde SORA v2 (elegibilidad desde el bloque v2 #25.867.650). Cada tx de claim en Minamoto trae on-chain el hash del burn original — eso nos permite trackear cada migración de extremo a extremo.',
      'cc.totalClaims': 'Claims',
      'cc.totalXor': 'XOR vía cross-chain',
      'cc.supplyTotal': 'Supply XOR en Minamoto',
      'cc.supplyTotalSub': 'todas las fuentes combinadas',
      'cc.otherMint': 'Otro XOR (genesis / directo)',
      'cc.otherMintSub': 'minteado sin v2 burn proof',
      'cc.ofSupply': 'del supply total',
      'cc.viaClaim': 'verificado via burn-and-claim',
      'cc.discrepancyNote': 'Sólo los mints cuya tx Minamoto trae "sora_v2_claim_tx_hash" en metadata cuentan como migración cross-chain. El resto del XOR en Minamoto viene del bloque genesis (asignaciones a validadores) y de mints administrativos directos durante el bootstrap inicial — esos NO son migraciones y no tienen burn correspondiente en v2. Cuando usuarios reales empiecen a quemar XOR en v2 para reclamar en Minamoto, el número migrado crecerá.',
      'cc.uniqueRecipients': 'Recipientes únicos',
      'cc.firstClaim': 'Primer claim',
      'cc.lastClaim': 'Último claim',
      'cc.timeChart': 'Claims & XOR a lo largo del tiempo',
      'cc.recipient': 'Recipiente',
      'cc.mnBlock': 'Bloque MN',
      'cc.mnTx': 'Tx MN',
      'cc.mnRecipient': 'Recipiente MN',
      'cc.v2Block': 'Bloque v2',
      'cc.v2Tx': 'Tx burn v2',
      'cc.v2Signer': 'Firmante v2',
      'cc.noClaims': 'No hay claims cross-chain indexados aún — el enricher revisa cada tx commiteada y persiste la metadata cuando aparece.',
      'accounts.title': 'Cuentas',
      'domains.title': 'Dominios',
      'peers.title': 'Peers',
      'peers.nodes': 'nodos',
      'peers.online': 'online',
      'peers.note': 'Cada nodo Iroha 3 reporta los OTROS peers que ve (no se cuenta a sí mismo); por eso el endpoint /peers de un nodo devuelve N−1 entradas mientras /v1/explorer/metrics cuenta los N nodos totales.',
      'peers.propagation': 'Propagación de bloques',
      'peers.propagationNote': 'spread_ms = tiempo entre el primer y último nodo que reportó el bloque. <1 s = verde (gossip fluido), 1–5 s = amarillo (presión), >5 s = rojo (algún peer va atrasado).',
      'peers.blocks': 'bloques',
      'peers.avg': 'medio',
      'peers.max': 'máx',
      'prometheus.title': 'Métricas Prometheus',
      'prometheus.subtitle': 'Series temporales emitidas por Iroha 3 /metrics.',
      'wallet.title': 'Cartera',
      'wallet.searchSub': 'Abre cualquier cuenta I105 para ver balances, permisos, transacciones y configuración multisig. Pega un account ID, elige uno reciente, o haz click en una cuenta del dashboard.',
      'wallet.recent': 'Cuentas recientes',
      'wallet.balances': 'Balances',
      'wallet.permissions': 'Permisos',
      'wallet.txs': 'Transacciones recientes',
      'wallet.firstSeen': 'Primera vez',
      'wallet.changeWallet': 'Cambiar',
      'wallet.portfolio': 'Portfolio de carteras',
      'wallet.portfolioSub': 'Carteras Minamoto guardadas. Se almacenan localmente en tu navegador — sólo account IDs, nunca claves privadas. Backup en JSON cuando quieras.',
      'wallet.addWallet': 'Añadir cartera',
      'wallet.aliasPlaceholder': 'Alias (opcional)',
      'wallet.unnamed': '(sin nombre — click para etiquetar)',
      'wallet.renameHint': 'Click para renombrar',
      'wallet.remove': 'Quitar del portfolio',
      'wallet.confirmRemove': '¿Quitar esta cartera del portfolio? (la cuenta sigue existiendo on-chain)',
      'wallet.openDetail': 'Abrir detalle',
      'wallet.export': 'Exportar JSON',
      'wallet.import': 'Importar JSON',
      'wallet.savedCount': 'guardadas',
      'wallet.emptyLabel': 'Sin carteras guardadas todavía',
      'wallet.emptyHint': 'Pega un account ID arriba para empezar a trackear. Usa los botones export/import para mover tu portfolio entre dispositivos.',
      'wallet.recentNetwork': 'Cuentas recientes en la red',
      'wallet.savePortfolio': 'Guardar en portfolio',
      'wallet.saved': 'Guardada',
      'wallet.saveAliasPrompt': 'Alias opcional para esta cartera:',
      'wallet.noAssets': 'Sin activos',
      'wallet.tab.assets': 'Activos',
      'wallet.tab.transfers': 'Transferencias',
      'wallet.tab.extrinsics': 'Transacciones',
      'wallet.tab.permissions': 'Permisos',
      'wallet.tab.info': 'Info',
      'wallet.aliasLabel': 'ALIAS · EN MIS WALLETS',
      'wallet.address': 'DIRECCIÓN',
      'wallet.breakdown': 'DESGLOSE POR ACTIVO',
      'wallet.tokens': 'tokens',
      'wallet.save': 'Guardar',
      'wallet.savedAlias': 'Alias guardado',
      'wallet.localId': 'Id local',
      'common.close': 'Cerrar',
      'wallet.assetsCreated': 'Asset definitions creadas',
      'wallet.assetsCreatedHint': 'Esta cartera registró estos tipos de token on-chain. Ser owner de una definición NO implica tener balance — eso aparece en Balances arriba.',
      'wallet.info.activity': 'ACTIVIDAD',
      'wallet.info.firstTx': 'Primera tx',
      'wallet.info.lastTx': 'Última tx',
      'wallet.info.totalTxs': 'Total txs',
      'wallet.info.successRate': 'éxito',
      'wallet.info.daysActive': 'Días activos',
      'wallet.info.assetsHeld': 'Tokens en cartera',
      'wallet.info.identity': 'IDENTIDAD',
      'wallet.info.alias': 'Alias primario',
      'wallet.info.multisig': 'Multisig',
      'wallet.info.firstSeen': 'Primera vez on-chain',
      'wallet.info.lastSeen': 'Última vez on-chain',
      'wallet.info.topKinds': 'INSTRUCCIONES TOP',
      'wallet.info.topKindsHint': 'Tipos de ISI Iroha 3 más emitidos por esta cuenta.',
      'wallet.info.domainsOwned': 'DOMINIOS POSEÍDOS',
      'wallet.info.domainsHint': 'Dominios donde esta cuenta es owner. Cada dominio aloja sus propias cuentas y asset definitions.',
      'wallet.info.assetsCreated': 'ASSET DEFINITIONS CREADAS',
      'wallet.info.assetsCreatedHint': 'Tipos de token registrados on-chain por esta cartera. Tener la definición no implica tener balance del token.',
      'wallet.info.crossChain': 'PUENTE CROSS-CHAIN',
      'wallet.info.crossChainHint': 'XOR migrado desde SORA v2 (burn) y reclamado en Minamoto.',
      'wallet.info.claimsReceived': 'Claims XOR recibidas',
      'wallet.info.xorClaimed': 'XOR total reclamado',
      'wallet.info.localAlias': 'PORTFOLIO LOCAL',
      'wallet.info.noActivity': 'Esta cuenta no tiene actividad on-chain todavía.',
      'wallet.info.noKinds': 'Esta cuenta no ha emitido instrucciones todavía.',
      'wallet.info.noDomains': 'Esta cuenta no es owner de ningún dominio.',
      'wallet.info.noAssets': 'Esta cuenta no ha registrado asset definitions.',
      'wallet.info.noCrossChain': 'Esta cartera no ha recibido ninguna claim cross-chain de XOR.',
      'wallet.info.received': 'Recibidas',
      'wallet.info.whaleScore': 'WHALE SCORE',
      'wallet.info.whaleVolume': 'Volumen',
      'wallet.info.whaleFrequency': 'Frecuencia',
      'wallet.info.whaleDiversity': 'Diversidad',
      'wallet.info.movements': 'MOVIMIENTOS',
      'wallet.info.sent': 'Enviadas',
      'wallet.info.volumeXor': 'Volumen XOR',
      'wallet.info.avgXor': 'Promedio',
      'wallet.info.maxXor': 'Máximo',
      'wallet.info.topTokens': 'TOP TOKENS',
      'wallet.info.topTokensHint': 'Tokens con los que ha interactuado esta cartera. Cuenta ISIs Transfer (enviados + recibidos) + Mints recibidos. Minamoto (Iroha 3) no tiene DEX desplegado en mainnet — SoraSwap está en desarrollo en sora-xor/soraswap y se está desplegando primero en testnet Taira, así que estos NO son swaps. El volumen está en unidades raw on-chain (sin aplicar decimales).',
      'wallet.info.token': 'Token',
      'wallet.info.trades': 'Interacciones',
      'wallet.info.volume': 'Volumen (raw)',
      'wallet.info.noMovements': 'Esta cartera no ha enviado ni recibido tokens todavía.',
      'wallet.info.noTopTokens': 'No hay interacciones con tokens registradas todavía.',

      // Accounts
      'accounts.kpi.total':         'Cuentas totales',
      'accounts.kpi.totalSub':      'identidades on-chain',
      'accounts.kpi.multisig':      'Multisig',
      'accounts.kpi.aliased':       'Con alias',
      'accounts.kpi.ofAll':         'del total',
      'accounts.kpi.active24h':     'Activas · 24h',
      'accounts.kpi.active24hSub':  'last_seen ≤ 24h',
      'accounts.kpi.new7d':         'Nuevas · 7d',
      'accounts.kpi.lastSub':       'última actividad',
      'accounts.searchPlaceholder': 'Buscar por id o alias…',
      'accounts.filter.all':        'Todas',
      'accounts.filter.multisig':   'Multisig',
      'accounts.filter.aliased':    'Con alias',
      'accounts.filter.active24h':  'Activas 24h',
      'accounts.col.account':       'Cuenta',
      'accounts.col.alias':         'Alias',
      'accounts.col.multisig':      'Multisig',
      'accounts.col.firstSeen':     'Primera vez',
      'accounts.col.lastSeen':      'Última vez',
      'accounts.activeNow':         'activa 24h',

      // Transactions KPIs
      'tx.kpi.total24h':    'Transacciones · 24h',
      'tx.kpi.total24hSub': 'últimas 24h',
      'tx.kpi.successRate': 'Tasa de éxito',
      'tx.kpi.signers':     'Firmantes únicos',
      'tx.kpi.signersSub':  'distintas authorities',
      'tx.kpi.topAuthor':   'Top authority',
      'tx.kpi.txs':         'txs',
      'tx.kpi.total':       'Total histórico',
      'tx.fee.title':            'PATROCINIO DE FEES',
      'tx.fee.subtitle':         '· modelo Iroha 3 · el payload del bloque NO expone la cantidad del fee, solo se ven recuentos',
      'tx.fee.sponsored':        'Tx patrocinadas',
      'tx.fee.ofAll':            'del total',
      'tx.fee.sponsored24h':     'Patrocinadas · 24h',
      'tx.fee.last24h':          'últimas 24h',
      'tx.fee.sponsors':         'Patrocinadores',
      'tx.fee.distinct':         'distintos sponsors',
      'tx.fee.beneficiaries':    'Beneficiarios',
      'tx.fee.distinctSigners':  'distintos firmantes beneficiados',
      'tx.fee.topSponsors':      'Top patrocinadores',
      'tx.fee.txs':              'txs',

      // Verb KPIs
      'verb.kpi.total24h':       'Transferencias · 24h',
      'verb.kpi.totalSub':       'últimas 24h',
      'verb.kpi.volume24h':      'Volumen · 24h',
      'verb.kpi.equiv':          'unidades',
      'verb.kpi.uniqueSenders':  'Emisores únicos',
      'verb.kpi.unique':         'distintos',
      'verb.kpi.topAsset':       'Asset top',
      'verb.kpi.transfers':      'transferencias',
      'verb.kpi.total':          'Total histórico',
      'verb.kpi.totalMintSub':   'mints',
      'verb.kpi.totalBurnSub':   'burns',
      'verb.kpi.pageVolume':     'Volumen · página',
      'verb.kpi.thisPage':       'esta página',
      'verb.kpi.pageActors':     'Actores · página',
      'verb.kpi.uniqueOnPage':   'distintos en página',
      'verb.kpi.pageRows':       'Filas · página',

      // Domains
      'domains.accounts':        'Cuentas',
      'domains.assets':          'Assets',
      'domains.updated':         'Actualizado',
      'domains.kpi.total':       'Dominios',
      'domains.kpi.accounts':    'Cuentas totales',
      'domains.kpi.accountsSub': 'en todos los dominios',
      'domains.kpi.assets':      'Assets totales',
      'domains.kpi.assetsSub':   'definiciones',
      'domains.kpi.nfts':        'NFTs totales',
      'domains.kpi.nftsSub':     'acuñados',
      'domains.kpi.largestAcc':  'Mayor · cuentas',
      'domains.kpi.largestAst':  'Mayor · assets',

      // Blocks KPIs
      'blocks.kpi.height':       'Altura actual',
      'blocks.kpi.heightSub':    'mejor bloque',
      'blocks.kpi.blocks24h':    'Bloques · 24h',
      'blocks.kpi.blocks24hSub': 'finalizados',
      'blocks.kpi.tx24h':        'Tx · 24h',
      'blocks.kpi.tx24hSub':     'commiteadas',
      'blocks.kpi.empty24h':     'Vacíos · 24h',
      'blocks.kpi.avgBlock':     'Tiempo de bloque',
      'blocks.kpi.avgBlockSub':  'últimos 100 intervalos',

      // Assets KPIs
      'assets.kpi.total':         'Definiciones',
      'assets.kpi.zk':            'ZK Convertible',
      'assets.kpi.mintInf':       'Inflacionarios',
      'assets.kpi.mintInfSub':    'mint infinito',
      'assets.kpi.mintOnce':      'Supply fijo',
      'assets.kpi.mintOnceSub':   'mint único',
      'assets.kpi.holders':       'Slots holder totales',
      'assets.kpi.holdersSub':    'suma entre assets',
      'assets.searchPlaceholder': 'Buscar por nombre, alias o id…',
      'assets.filter.mintable':   'Inflacionarios',
      'assets.filter.fixed':      'Supply fijo',

      // Peers KPIs
      'peers.kpi.total':         'Peers totales',
      'peers.kpi.online':        'Online',
      'peers.kpi.offline':       'Offline',
      'peers.kpi.avgSpread':     'Propagación media',
      'peers.kpi.maxSpread':     'Peor propagación',
      'peers.kpi.maxSpreadSub':  'última muestra',

      // Governance KPIs
      'gov.kpi.epoch':           'Epoch',
      'gov.kpi.epochSub':        'periodo de gobernanza',
      'gov.kpi.councilMembers':  'Miembros del consejo',
      'gov.kpi.candidates':      'candidatos',
      'gov.kpi.validators':      'Validadores',
      'gov.kpi.viewChanges':     'Cambios de vista',
      'gov.kpi.viewChangesSub':  'inestabilidad consenso',
      'gov.kpi.expiredLocks':    'Locks expirados',

      // Cross-chain
      'cc.largestClaim':    'Claim mayor',
      'cc.largestClaimSub': 'mayor migración individual',
      'cc.avgClaim':        'Claim media',
      'cc.avgClaimSub':     'XOR por migración',
      'cc.mint.title':         'Historial de XOR acuñado',
      'cc.mint.subtitle':      'Cada XOR creado en Minamoto, por fuente — premint de génesis, claim cross-chain, o mint admin/runtime',
      'cc.mint.genesis':       'Premint génesis',
      'cc.mint.genesisHint':   'Mints en bloque #1 — supply de bootstrap nuevo O balances arrastrados de un reset previo del chain (sin link a burn v2).',
      'cc.mint.bridge':        'Claim cross-chain',
      'cc.mint.bridgeHint':    'Migrado desde SORA v2 (verificado por burn proof)',
      'cc.mint.other':         'Otro mint',
      'cc.mint.total':         'TOTAL XOR ACUÑADO',
      'cc.mint.totalMints':    'eventos de mint',
      'cc.mint.mints':         'mints',
      'cc.mint.recipients':    'recipientes',
      'cc.mint.timeline':      'Línea de tiempo cronológica',
      'cc.mint.chronological': 'antiguo primero · todas las fuentes',
      'cc.mint.col.when':      'Cuándo',
      'cc.mint.col.block':     'Bloque',
      'cc.mint.col.source':    'Fuente',
      'cc.mint.col.recipient': 'Recipiente',
      'cc.mint.col.proof':     'Prueba',
      'cc.mint.note':          'GÉNESIS premint = supply administrativo acuñado en el bloque #1. En Minamoto esto puede significar O bien una asignación de bootstrap nueva, O bien balances arrastrados de un reset previo del chain. Cuando Minamoto se resetea, los burns en v2 son irreversibles (la cadena v2 sigue corriendo) — así que el operador preserva el XOR de los usuarios haciendo un snapshot de balances y re-acuñándolos en el nuevo génesis como Mints directos del admin, SIN preservar el sora_v2_claim_tx_hash original. Las cantidades "messy" (e.g. 0.745, 4.3862, 11.99) son la firma de balances preservados — NO de asignaciones limpias de testnet. Los claims CROSS-CHAIN mantienen su link a burn v2 solo para burns procesados DESPUÉS del último reset; los anteriores se reabsorben en el génesis premint. La conservación global (XOR quemado en v2 = XOR vivo en Minamoto) se mantiene vía el mecanismo de snapshot.',
      'cc.pending.title':       'Burns cross-chain pendientes',
      'cc.pending.subtitle':    'Burns en Sora v2 esperando a que el operator de Soramitsu acuñe XOR en Minamoto',
      'cc.pending.filter':      'Filtrar',
      'cc.pending.all':         'Todos',
      'cc.pending.statusPending':'Pendiente',
      'cc.pending.statusClaimed':'Procesado',
      'cc.pending.statusPreReset':'Pre-reset',
      'cc.pending.when':        'Quemado',
      'cc.pending.recipient':   'Destinatario en Minamoto',
      'cc.pending.status':      'Estado',
      'cc.pending.mnTx':        'Tx en Mn',
      'cc.pending.waiting':     'esperando',
      'cc.pending.preResetHint':'link cortado en reset de chain',
      'cc.pending.empty':       'No hay burns registrados con este filtro.',
      'cc.pending.note':        'Cada fila es un par `assets.burn` + `system.remark` en Sora v2 con el JSON `soraNexusXorClaim`. El operator de Soramitsu monitoriza estas tx y submite un Mint::Asset en Minamoto referenciando el tx hash de v2. El bridge es custodial — no hay garantía on-chain de tiempo de procesado. Los burns anteriores al génesis del chain Minamoto actual se marcan `Pre-reset`: sus registros de claim originales fueron borrados al reset y no pueden procesarse en el chain actual, pero el valor XOR puede haberse preservado vía el snapshot de genesis premint.',

      // Sumeragi roles
      'roles.title':              'Validator set y roles Sumeragi',
      'roles.subtitle':           'Topología de consenso en vivo, elección de líder y asignación de lanes',
      'roles.kpi.leader':         'Líder actual',
      'roles.kpi.leaderUnresolved': 'pubkey no resuelto',
      'roles.kpi.view':           'Vista',
      'roles.kpi.viewChanges':    'cambios de vista',
      'roles.kpi.quorum':         'Quórum',
      'roles.kpi.quorumSub':      'BFT 2f+1',
      'roles.kpi.height':         'Altura commiteada',
      'roles.kpi.heightSub':      'última QC finalizada',
      'roles.kpi.epoch':          'Epoch',
      'roles.kpi.epochLen':       'bloques',
      'roles.kpi.laneStake':      'Stake en lanes',
      'roles.kpi.laneStakeSub':   'suma de lanes públicas',
      'roles.resolution.label':   'Resolución de líder',
      'roles.resolution.method':  'PRF Blake2b-512',
      'roles.resolution.sortedBy': 'roster sorteado por',
      'roles.resolution.genesisSeed': 'el seed de la epoch actual son ceros — se reemplaza al cierre de epoch via Blake2b(seed ‖ reveals)',
      'roles.resolution.empiricalMethod': 'Empírico (complemento de collectors)',
      'roles.resolution.prfMatches':      'Fórmula PRF coincide ✓',
      'roles.resolution.prfDiverges':     'Fórmula PRF diverge ⚠',
      'roles.resolution.prfDivergesNote': 'El cálculo PRF (Blake2b-512 de seed‖height‖view) no coincide con el líder vivo porque /status reporta prf_epoch_seed como placeholder (ceros). El seed real usado internamente es chain_epoch_seed(chain_id), y Torii no expone chain_id, así que no podemos reproducir la fórmula desde fuera. La API de collectors da ground truth; esta divergencia es esperada y no es un bug.',
      'staking.title':                 'Ciclo de vida del Public Lane Staking',
      'staking.subtitle':              'NX-9 — estado del validator derivado de los ISIs RegisterPublicLaneValidator + ActivatePublicLaneValidator',
      'staking.kpi.totalValidators':   'Total validators',
      'staking.kpi.active':            'Activos',
      'staking.kpi.pending':           'Pendientes',
      'staking.kpi.jailedExiting':     'Jailed/Saliendo/Slashed',
      'staking.kpi.totalEvents':       'Eventos lifecycle',
      'staking.kpi.totalEventsSub':    'ISIs Register + Activate',
      'staking.roster':                'Roster de validators',
      'staking.derived':               'derivado de ISIs on-chain',
      'staking.col.pubkey':            'Public key',
      'staking.col.status':            'Estado',
      'staking.col.registered':        'Registrado',
      'staking.col.activated':         'Activado',
      'staking.col.events':            'Eventos',
      'staking.note':                  'Flujo: Register → PendingActivation → Active → (Jailed | Exiting | Exited | Slashed). Iroha emite ISIs Register + Activate por ahora; los siguientes estados aparecerán cuando sus ISIs dedicados se observen on-chain.',
      'wallet.perms.live':             'Permisos vivos',
      'wallet.perms.liveSub':          'actualmente activos on-chain',
      'wallet.perms.granted':          'Grants recibidos',
      'wallet.perms.grantedSub':       'ISIs Grant históricos',
      'wallet.perms.uniqueTypes':      'Tipos de permiso',
      'wallet.perms.uniqueTypesSub':   'nombres distintos',
      'wallet.perms.activeTitle':      'Permisos activos',
      'wallet.perms.empty':            'Esta cuenta no tiene permisos.',
      'wallet.perms.grant':            'grant',
      'wallet.perms.grants':           'grants',
      'wallet.perms.grantedBy':        'Otorgado por:',
      'wallet.perms.historyTitle':     'Permisos en histórico (no activos ahora)',
      'wallet.perms.historyHint':      'Aparecen aquí los permisos que se otorgaron históricamente pero la cuenta NO los tiene actualmente — típicamente indica un Revoke ISI o que el grant expiró.',
      'common.more':                   'más',
      'roles.roster':             'Roster de validators',
      'roles.col.pubkey':         'Public key',
      'roles.col.torii':          'API Torii',
      'roles.col.p2p':            'P2P',
      'roles.col.roles':          'Roles',
      'roles.col.posts':          'Posts',
      'roles.col.rbcQueue':       'Cola RBC',
      'roles.col.status':         'Estado',
      'roles.ownership.selfTip':  'este validator publicó su public_key en su config de /telemetry/peers-info',
      'roles.ownership.deducedTip': 'public_key inferida cruzando connected_peers de los demás nodos',
      'roles.badge.leader':       'Líder',
      'roles.badge.leaderTip':    'Proponedor del bloque actual para (height, view) — verificado vía PRF Blake2b-512',
      'roles.badge.voter':        'Votante',
      'roles.badge.voterTip':     'Firma QCs (Quorum Certificates) al votar bloques',
      'roles.badge.vrf':          'VRF',
      'roles.badge.vrfTip':       'Participa en commit-reveal de aleatoriedad para elegir líder de la siguiente epoch',
      'roles.badge.rbc':          'RBC',
      'roles.badge.rbcTip':       'Disemina chunks de bloque vía Reliable Broadcast',
      'roles.lanes':              'Asignación de Public Lanes',
      'roles.active':             'activos',
      'roles.pending':            'pendientes',
      'roles.lanesHint':          'Las Public Lanes son unidades independientes de staking (NX-9 Public Lane Staking). Cada lane tiene su propio bonded stake y subset de validators; los validators permissionless bondean stake a una lane específica para servir bloques de esa lane.',
      'roles.vrf':                'VRF · elección líder próxima epoch',
      'roles.vrf.commits':        'Commits',
      'roles.vrf.reveals':        'Reveals',
      'roles.vrf.finalized':      'Finalizada',
      'roles.vrf.yes':            'SÍ',
      'roles.vrf.pending':        'PENDIENTE',
      'roles.vrf.lateReveals':    'Reveals tardíos',
      'roles.vrf.hint':           'Cuando la epoch finalice, el seed VRF reemplazará los ceros y la rotación de líder será aleatoria por (height, view).',

      // Governance — extendido
      'gov.kpi.leader':            'Líder actual',
      'gov.kpi.validatorsSub':     'en set activo',
      'gov.mode.label':            'Modo de consenso',
      'gov.mode.fallback':         'Fallback (genesis admin)',
      'gov.mode.vrf':              'VRF · rotación aleatoria',
      'gov.mode.fallbackBody':     'Aún no hay consejo on-chain. Hasta que la VRF de la epoch 0 finalice y se elija el primer consejo, el genesis admin actúa como autoridad por defecto y la rotación de líder usa un seed determinista.',
      'gov.mode.transitionBody':   'Consejo elegido, pero la VRF de la epoch actual aún no ha finalizado. La rotación de líder sigue usando el seed de la epoch anterior.',
      'gov.mode.vrfBody':          'VRF finalizada. La rotación de líder por (height, view) usa un seed derivado aleatoriamente; nadie puede predecir el próximo líder sin romper la VRF.',
      'gov.mode.genesisSeed':      'seed de génesis, se reemplaza cuando los reveals de la epoch 0 se agregan',
      'gov.epoch.title':           'Progreso de epoch',
      'gov.epoch.block':           'Bloque',
      'gov.epoch.remaining':       'restantes',
      'gov.epoch.commitDeadline':  'Deadline commit',
      'gov.epoch.revealDeadline':  'Deadline reveal',
      'gov.epoch.fromEpochStart':  'desde inicio de epoch',
      'gov.epoch.commits':         'Commits',
      'gov.epoch.reveals':         'Reveals',
      'gov.epoch.finalisesAtEnd':  'finaliza al cerrar la epoch',
      'gov.epoch.phaseCommit':     'Fase COMMIT',
      'gov.epoch.phaseReveal':     'Fase REVEAL',
      'gov.epoch.phaseIdle':       'inactiva',
      'gov.currentLeader':         'Líder actual',

      // Permissions / Grants
      'nav.permissions':                'Permisos',
      'permissions.title':              'Permisos y Grants',
      'permissions.subtitle':           'Control de acceso Iroha 3 vía ISIs Grant (PermissionToAccount + RoleToAccount)',
      'permissions.kpi.totalGrants':    'Grants totales',
      'permissions.kpi.distinctPerms':  'Tipos de permiso',
      'permissions.kpi.distinctPermsSub': 'nombres únicos',
      'permissions.kpi.grantors':       'Grantors',
      'permissions.kpi.grantorsSub':    'authorities distintas',
      'permissions.kpi.recipients':     'Destinatarios',
      'permissions.kpi.recipientsSub':  'cuentas distintas',
      'permissions.kpi.roles':          'Grants de rol',
      'permissions.kpi.rolesSub':       'variant RoleToAccount',
      'permissions.search.authority':   'Filtrar por grantor…',
      'permissions.search.destination': 'Filtrar por destinatario…',
      'permissions.matching':           'coinciden',
      'permissions.col.permission':     'Permiso',
      'permissions.col.args':           'Args',
      'permissions.col.grantor':        'Otorgado por',
      'permissions.col.grantee':        'Otorgado a',

      // Common
      'common.all':    'Todas',
      'common.shown':  'visibles',
      'common.onPage': 'en página',
      'common.page':   'página',
      'assets.createdBy': 'Creado por',
      'assets.subtitle': 'definiciones de activos registradas en Minamoto',
      'asset.totalSupply': 'Supply total',
      'asset.holders': 'Holders',
      'asset.balance': 'Balance',
      'asset.holdersTitle': 'Holders',
      'block.title': 'Bloque',
      'block.height': 'Altura',
      'block.hash': 'Hash',
      'block.prevHash': 'Anterior',
      'block.txsHash': 'Tx root',
      'block.created': 'Creado',
      'block.txTotal': 'Transacciones',
      'block.txRejected': 'Rechazadas',
      'block.txList': 'Transacciones en este bloque',
      'block.instructionsTitle': 'Instrucciones en este bloque',
      'tx.title': 'Transacción',
      'tx.executable': 'Ejecutable',
      'tx.instructions': 'Instrucciones',
      'tx.feeSponsor': 'Pagador de fees',
      'tx.crossChain': 'Claim cross-chain',
      'tx.v2BurnTx': 'Tx de burn en SORA v2',
      'tx.recipient': 'Receptor del claim',
      'tx.metadata': 'Metadata',
      'tx.signature': 'Firma',
      'tx.instructionsTitle': 'Instrucciones emitidas por esta tx',
    },
  };

  const STORAGE_KEY = 'mn.lang';

  function detect() {
    try {
      const stored = localStorage.getItem(STORAGE_KEY);
      if (stored && STR[stored]) return stored;
    } catch (_) {}
    const nav = (navigator.language || 'en').toLowerCase();
    if (nav.startsWith('es')) return 'es';
    return 'en';
  }

  let _lang = detect();
  const _listeners = new Set();

  function lang() { return _lang; }
  function setLang(l) {
    if (!STR[l]) return;
    _lang = l;
    try { localStorage.setItem(STORAGE_KEY, l); } catch (_) {}
    _listeners.forEach(fn => { try { fn(l); } catch (_) {} });
  }
  function onChange(fn) { _listeners.add(fn); return () => _listeners.delete(fn); }

  function t(key) {
    const dict = STR[_lang] || STR.en;
    return dict[key] || STR.en[key] || key;
  }

  // React hook so components re-render when language changes
  function useT() {
    const [, setTick] = React.useState(0);
    React.useEffect(() => onChange(() => setTick(x => x + 1)), []);
    return t;
  }

  MN.i18n = { t, useT, lang, setLang, onChange, available: Object.keys(STR) };
})(window.MN);
