const SUPPORTED_LANGS = ['ko', 'en', 'zh', 'ja'];

const DICT = {
  ko: {
    navChainHome: '체인 홈',
    navHome: 'PLAIFOR 홈',
    navExplorer: 'Explorer',
    navWallet: 'Wallet',
    navWhitepaper: '백서',
    navSource: 'Source',
    navListing: 'Listing',
    navInstall: '설치',
    heroTitle: 'AI 앱 활동과 분산 저장 보상을 검증 가능한 체인 원장으로 연결합니다.',
    heroLead: 'plais Chain은 plais 생태계의 앱 사용 active 보상, 스토리지 보상, 노드 active 보상과 감점 기록을 블록, 지갑, 증명 원장으로 추적하는 AI 서비스형 블록체인입니다.',
    openExplorer: '체인 익스플로러 열기',
    installApp: 'plais 앱 설치',
    viewWhitepaper: '백서 보기'
  },
  en: {
    navChainHome: 'Chain Home',
    navHome: 'PLAIFOR Home',
    navExplorer: 'Explorer',
    navWallet: 'Wallet',
    navWhitepaper: 'Whitepaper',
    navSource: 'Source',
    navListing: 'Listing',
    navInstall: 'Install',
    heroTitle: 'Connect AI app activity and distributed storage rewards to a verifiable chain ledger.',
    heroLead: 'plais Chain tracks app activity rewards, storage rewards, node activity rewards, and penalty records across blocks, wallets, and proof ledgers for the plais ecosystem.',
    openExplorer: 'Open Chain Explorer',
    installApp: 'Install plais App',
    viewWhitepaper: 'View Whitepaper'
  },
  zh: {
    navChainHome: '链首页',
    navHome: 'PLAIFOR 首页',
    navExplorer: '浏览器',
    navWallet: '钱包',
    navWhitepaper: '白皮书',
    navSource: '源码',
    navListing: '上市资料',
    navInstall: '安装',
    heroTitle: '将 AI 应用活动和分布式存储奖励连接到可验证的链上账本。',
    heroLead: 'plais Chain 以区块、钱包和证明账本记录 plais 生态的应用活跃奖励、存储奖励、节点活跃奖励与扣分记录。',
    openExplorer: '打开链浏览器',
    installApp: '安装 plais 应用',
    viewWhitepaper: '查看白皮书'
  },
  ja: {
    navChainHome: 'チェーンホーム',
    navHome: 'PLAIFOR ホーム',
    navExplorer: 'Explorer',
    navWallet: 'Wallet',
    navWhitepaper: 'ホワイトペーパー',
    navSource: 'Source',
    navListing: 'Listing',
    navInstall: 'インストール',
    heroTitle: 'AIアプリ活動と分散ストレージ報酬を検証可能なチェーン台帳につなぎます。',
    heroLead: 'plais Chainは、plaisエコシステムのアプリ利用報酬、ストレージ報酬、ノード活動報酬、減点記録をブロック、ウォレット、証明台帳で追跡します。',
    openExplorer: 'チェーンExplorerを開く',
    installApp: 'plaisアプリをインストール',
    viewWhitepaper: 'ホワイトペーパーを見る'
  }
};

const HOME_EXTRA = {
  ko: {
    modeNetwork: '네트워크',
    modeChainStatus: '체인 검증',
    modeReadiness: '준비도',
    modeSymbol: '토큰',
    statLatestBlock: '최신 블록',
    statWallets: '지갑',
    statValidators: '검증자',
    statNodes: '온라인 노드',
    statNetReward: '순 보상',
    networkStatusTitle: '네트워크 상태',
    networkStatusSub: '후보망의 최신 블록, 체인 검증, 공개 메인넷 준비 상태를 실시간으로 표시합니다.',
    finalizedBlocks: '누적 확정 블록',
    chainVerifyTitle: '체인 연결 상태',
    chainVerifyDesc: 'QBFT 체인의 최신 블록과 hash chain을 검증합니다.',
    mainnetReadinessTitle: '공개 메인넷 준비도',
    mainnetOperationTitle: '메인넷 가동 상태',
    mainnetOperating: '정상',
    mainnetChecking: '점검 필요',
    publicActivationCheck: '공개 활성화 점검',
    validatorNodeTitle: 'QBFT 검증자 / 온라인 노드',
    onlineNodes: '현재 heartbeat가 확인된 참여 노드',
    whatTitle: 'plais 블록체인이 하는 일',
    whatSub: '앱에서 발생한 활동, 저장소 기여, 노드 운영 기록을 하나의 보상 원장으로 합치고 검증 가능한 블록 기록으로 남깁니다.',
    symbolTitle: 'PLAIS 코인 심볼',
    symbolSub: 'PLAIS의 정체성과 분산 네트워크의 작동 원리를 하나의 기호로 표현했습니다.',
    symbolPTitle: 'PLAIS의 P',
    symbolPDesc: '중앙의 P는 PLAIS 생태계와 하나의 통합 화폐 단위를 뜻합니다.',
    symbolLoopTitle: '지속되는 순환',
    symbolLoopDesc: '무한 루프는 참여, 검증, 보상이 계속 순환하는 구조를 나타냅니다.',
    symbolNodeTitle: '분산된 합의',
    symbolNodeDesc: '세 개의 금색 노드는 서로 다른 참여자가 연결되어 합의를 만드는 네트워크를 상징합니다.',
    operatingStatus: '운영 상태',
    activityLabel: 'Activity Reward',
    activityTitle: '앱 사용 active 보상',
    activityDesc: 'plais 앱 사용, AI 캐릭터 성장, 클라우드 활동처럼 실제 사용 행동을 보상 원장에 반영합니다.',
    storageLabel: 'Storage Reward',
    storageTitle: '분산 저장 기여',
    storageDesc: 'PC 노드가 암호화 chunk 저장과 검증에 참여하면 저장 성공, 용량 제공, 검증 성공 보상으로 기록됩니다.',
    nodeLabel: 'Node Active',
    nodeTitle: '노드 운영 보상',
    nodeDesc: '온라인 유지, heartbeat, 검증 참여 상태를 기준으로 노드 active 보상과 감점 흐름을 추적합니다.',
    proofLabel: 'Proof Ledger',
    proofTitle: '블록체인 증명',
    proofDesc: '포인트와 코인 보상 흐름을 hash chain과 블록 기록으로 검증하고 Explorer에서 조회합니다.'
  },
  en: {
    modeNetwork: 'Network',
    modeChainStatus: 'Chain verification',
    modeReadiness: 'Readiness',
    modeSymbol: 'Token',
    statLatestBlock: 'Latest block',
    statWallets: 'Wallets',
    statValidators: 'Validators',
    statNodes: 'Online nodes',
    statNetReward: 'Net reward',
    networkStatusTitle: 'Network status',
    networkStatusSub: 'Live candidate-network blocks, chain verification, and public-mainnet readiness.',
    finalizedBlocks: 'Finalized blocks',
    chainVerifyTitle: 'Chain connectivity',
    chainVerifyDesc: 'Verifies the latest QBFT block and hash chain.',
    mainnetReadinessTitle: 'Public mainnet readiness',
    mainnetOperationTitle: 'Mainnet operation',
    mainnetOperating: 'HEALTHY',
    mainnetChecking: 'CHECK',
    publicActivationCheck: 'Public activation checks',
    validatorNodeTitle: 'QBFT validators / online nodes',
    onlineNodes: 'Participating nodes with a current heartbeat',
    whatTitle: 'What the plais blockchain does',
    whatSub: 'It combines app activity, storage contributions, and node operation records into one reward ledger and leaves them as verifiable block records.',
    symbolTitle: 'PLAIS Coin Symbol',
    symbolSub: 'A single mark expressing the identity of PLAIS and the operating principles of its distributed network.',
    symbolPTitle: 'The P of PLAIS',
    symbolPDesc: 'The central P represents the PLAIS ecosystem and its unified currency unit.',
    symbolLoopTitle: 'Continuous circulation',
    symbolLoopDesc: 'The infinity loop represents an ongoing cycle of participation, verification, and rewards.',
    symbolNodeTitle: 'Distributed consensus',
    symbolNodeDesc: 'Three gold nodes symbolize independent participants connecting to form network consensus.',
    operatingStatus: 'Operating status',
    activityLabel: 'Activity Reward',
    activityTitle: 'App usage active reward',
    activityDesc: 'Reflects real usage actions such as using the plais app, growing the AI character, and cloud activity in the reward ledger.',
    storageLabel: 'Storage Reward',
    storageTitle: 'Distributed storage contribution',
    storageDesc: 'When PC nodes participate in encrypted chunk storage and verification, storage success, capacity contribution, and verification rewards are recorded.',
    nodeLabel: 'Node Active',
    nodeTitle: 'Node operation reward',
    nodeDesc: 'Tracks node active rewards and penalty flow based on online uptime, heartbeat, and verification participation.',
    proofLabel: 'Proof Ledger',
    proofTitle: 'Blockchain proof',
    proofDesc: 'Verifies point and coin reward flows through hash chains and block records, and lets users review them in Explorer.'
  },
  zh: {
    modeNetwork: '网络',
    modeChainStatus: '链验证',
    modeReadiness: '准备度',
    modeSymbol: '代币',
    statLatestBlock: '最新区块',
    statWallets: '钱包',
    statValidators: '验证者',
    statNodes: '在线节点',
    statNetReward: '净奖励',
    networkStatusTitle: '网络状态',
    networkStatusSub: '实时显示候选网最新区块、链验证和公开主网准备状态。',
    finalizedBlocks: '已确定区块',
    chainVerifyTitle: '链连接状态',
    chainVerifyDesc: '验证 QBFT 链的最新区块和 hash chain。',
    mainnetReadinessTitle: '公开主网准备度',
    mainnetOperationTitle: '主网运行状态',
    mainnetOperating: '正常',
    mainnetChecking: '需要检查',
    publicActivationCheck: '公开启用检查',
    validatorNodeTitle: 'QBFT 验证者 / 在线节点',
    onlineNodes: '当前 heartbeat 已确认的参与节点',
    whatTitle: 'plais 区块链的作用',
    whatSub: '把应用活动、存储贡献和节点运行记录合并到一个奖励账本，并保存为可验证的区块记录。',
    symbolTitle: 'PLAIS 代币标志',
    symbolSub: '以一个标志呈现 PLAIS 的身份与分布式网络的运行原理。',
    symbolPTitle: 'PLAIS 的 P',
    symbolPDesc: '中央的 P 代表 PLAIS 生态系统及其统一货币单位。',
    symbolLoopTitle: '持续循环',
    symbolLoopDesc: '无限循环代表参与、验证和奖励持续运转的结构。',
    symbolNodeTitle: '分布式共识',
    symbolNodeDesc: '三个金色节点象征不同参与者相互连接并形成网络共识。',
    operatingStatus: '运行状态',
    activityLabel: '活动奖励',
    activityTitle: '应用使用 active 奖励',
    activityDesc: '将 plais 应用使用、AI 角色成长、云端活动等真实使用行为反映到奖励账本中。',
    storageLabel: '存储奖励',
    storageTitle: '分布式存储贡献',
    storageDesc: 'PC 节点参与加密 chunk 存储和验证时，会记录存储成功、容量提供和验证成功奖励。',
    nodeLabel: '节点活跃',
    nodeTitle: '节点运行奖励',
    nodeDesc: '根据在线保持、heartbeat 和验证参与状态，追踪节点 active 奖励与扣分流程。',
    proofLabel: '证明账本',
    proofTitle: '区块链证明',
    proofDesc: '通过 hash chain 和区块记录验证积分与代币奖励流程，并可在 Explorer 中查询。'
  },
  ja: {
    modeNetwork: 'ネットワーク',
    modeChainStatus: 'チェーン検証',
    modeReadiness: '準備度',
    modeSymbol: 'トークン',
    statLatestBlock: '最新ブロック',
    statWallets: 'ウォレット',
    statValidators: '検証者',
    statNodes: 'オンラインノード',
    statNetReward: '純報酬',
    networkStatusTitle: 'ネットワーク状態',
    networkStatusSub: '候補ネットの最新ブロック、チェーン検証、公開メインネットの準備状態をリアルタイムで表示します。',
    finalizedBlocks: '確定済みブロック',
    chainVerifyTitle: 'チェーン接続状態',
    chainVerifyDesc: 'QBFTチェーンの最新ブロックとhash chainを検証します。',
    mainnetReadinessTitle: '公開メインネット準備度',
    mainnetOperationTitle: 'メインネット稼働状態',
    mainnetOperating: '正常',
    mainnetChecking: '要確認',
    publicActivationCheck: '公開有効化チェック',
    validatorNodeTitle: 'QBFT検証者 / オンラインノード',
    onlineNodes: '現在heartbeatが確認された参加ノード',
    whatTitle: 'plaisブロックチェーンの役割',
    whatSub: 'アプリ活動、ストレージ貢献、ノード運用記録をひとつの報酬台帳にまとめ、検証可能なブロック記録として残します。',
    symbolTitle: 'PLAISコインシンボル',
    symbolSub: 'PLAISのアイデンティティと分散ネットワークの仕組みをひとつの記号で表現しています。',
    symbolPTitle: 'PLAISのP',
    symbolPDesc: '中央のPはPLAISエコシステムと統一された通貨単位を表します。',
    symbolLoopTitle: '続く循環',
    symbolLoopDesc: '無限ループは参加、検証、報酬が継続して循環する構造を表します。',
    symbolNodeTitle: '分散型合意',
    symbolNodeDesc: '3つの金色ノードは、異なる参加者がつながり合意を形成するネットワークを象徴します。',
    operatingStatus: '運用状態',
    activityLabel: '活動報酬',
    activityTitle: 'アプリ利用 active 報酬',
    activityDesc: 'plaisアプリの利用、AIキャラクターの成長、クラウド活動など実際の利用行動を報酬台帳に反映します。',
    storageLabel: 'ストレージ報酬',
    storageTitle: '分散ストレージ貢献',
    storageDesc: 'PCノードが暗号化chunkの保存と検証に参加すると、保存成功、容量提供、検証成功報酬として記録されます。',
    nodeLabel: 'ノードアクティブ',
    nodeTitle: 'ノード運用報酬',
    nodeDesc: 'オンライン維持、heartbeat、検証参加状態を基準に、ノードactive報酬と減点の流れを追跡します。',
    proofLabel: '証明台帳',
    proofTitle: 'ブロックチェーン証明',
    proofDesc: 'ポイントとコイン報酬の流れをhash chainとブロック記録で検証し、Explorerで確認できます。'
  }
};

const HOME_SECTIONS = {
  ko: {
    mainNavigation: '주요 메뉴',
    languageLabel: '언어 선택',
    mainnetLabel: 'plais Chain 메인넷',
    testnetLabel: 'plais Chain 테스트넷',
    whitepaperTitle: '백서와 메인넷 정책',
    whitepaperDesc: 'plais Chain의 보상 구조, 토크노믹스, 테스트넷 운영 범위, 메인넷 전환 기준은 백서와 정책 문서로 관리합니다. 현재 화면은 테스트넷과 메인넷 전환 이후에도 같은 구조로 사용할 수 있게 설계했습니다.',
    koreanWhitepaper: '한국어 백서',
    englishWhitepaper: '영문 백서',
    rewardLedgerLink: '보상 원장 확인',
    supplyLabel: '공급량',
    supplyTitle: '총 발행 한도',
    supplyDesc: '메인넷 전환 전 정책값과 원장 상태를 분리해서 확인합니다.',
    circulationLabel: '유통량',
    circulationTitle: '현재 유통량',
    circulationDesc: '지갑 서비스 기준으로 집계되는 체인 내 유통 흐름입니다.',
    rewardLedgerLabel: '보상 원장',
    rewardLedgerTitle: '원장 기록',
    countSuffix: '건',
    rewardTotalLabel: '보상 합계',
    penaltyLabel: '감점',
    servicesTitle: '연결되는 앱과 서비스',
    servicesDesc: 'plais Chain은 하나의 앱이 아니라 plais 생태계 전체의 활동 원장을 받는 구조입니다.',
    appServiceTitle: 'AI 비서 앱',
    appServiceDesc: '메모, 녹음, 클라우드, AI펫 성장 활동이 앱 사용 active 보상으로 연결됩니다.',
    talkServiceTitle: '대화와 그룹 활동',
    talkServiceDesc: '커뮤니티와 그룹 활동은 별도 연동 후 생태계 보상 항목으로 확장할 수 있습니다.',
    mallServiceTitle: '상거래 연동',
    mallServiceDesc: '주문, 결제, 리뷰, 스토어 활동을 정책 검토 후 보상 또는 검증 원장으로 연결합니다.',
    nodeServiceTitle: 'PC 저장 노드',
    nodeServiceDesc: '사용자 PC가 저장, 검증, 복구 기여에 참여하고 노드 보상과 담보 상태를 확인합니다.',
    patentTitle: '특허출원 기술 기반 PLAIS 생태계',
    patentDesc: 'PLAIS 생태계에서 활용되는 데이터 수명주기, 분산 저장 보상, 양방향 통역 및 전자적 가치 확정 기술을 직접 개발하고 권리화하고 있습니다.',
    patentSummaryAria: '대한민국 특허출원 중 네 건',
    patentPending: '특허출원 중',
    countryFour: '대한민국 4건',
    patent1Label: '제1특허 · DATA LIFECYCLE',
    patent1Title: '다중 보관 검증 및 제거 의도 상태에 기초한 서버 원본의 선택적 제거와 차등 재구성 방법 및 시스템',
    patent1Desc: '단말 사본과 분산 단편의 보관 상태를 검증하고, 원본 제거 의도와 사용자 삭제 상태에 따라 임시 제공·영구 복구·재구성 억제를 구분합니다.',
    patent2Label: '제2특허 · NODE REWARD',
    patent2Title: '암호화 분산 저장 노드의 저장·검증·복구 기여 증거에 기초한 보상 산정 방법 및 시스템',
    patent2Desc: '저장·검증·복구 과정에서 생성되는 기여 증거를 검증하고, 유효한 노드 기여에 대응하는 보상을 산정합니다.',
    patent3Label: '제3특허 · AI INTERPRETATION',
    patent3Title: '병렬 번역 엔진의 지연 기반 결과 선택을 이용한 양방향 메신저 통역 방법 및 시스템',
    patent3Desc: '로컬 번역과 원격 인공지능 번역을 병렬 실행하고 지연·실패·결과 유효성에 따라 통역 결과를 선택해 메신저로 전달합니다.',
    patent4Label: '제4특허 · COIN FINALITY',
    patent4Title: '복수 서비스 기여 사건의 교차 중복 검증과 분산원장 최종성에 기초한 전자적 가치 확정 방법 및 시스템',
    patent4Desc: '복수 서비스의 동일 기여 사건을 교차 검증하고, 분산원장의 최종성 확인 후에만 코인 등 전자적 가치를 확정하여 중복 지급과 미확정 지급을 방지합니다.',
    coinCoreLabel: 'PLAIS Coin 핵심 처리 기술',
    patentNotice: '위 기술은 대한민국 특허출원 중이며, 특허출원은 특허등록 또는 권리 확정을 의미하지 않습니다.',
    copyrightTitle: '프로그램 저작권 등록',
    copyrightDesc: 'PLAIS 생태계의 핵심 소프트웨어 6종이 한국저작권위원회에 정식 등록되었습니다.',
    copyrightSummaryAria: '프로그램 저작권 등록 여섯 건',
    registeredSoftware: '등록 소프트웨어',
    countrySix: '대한민국 6건',
    plaiforName: 'PLAIFOR (플레이포)',
    plaiforDesc: 'PLAIS 생태계 통합 서비스 및 운영 소프트웨어',
    plaitalkName: 'PLAITALK (플레이톡)',
    plaitalkDesc: '메신저와 인공지능 통역 기능을 제공하는 소프트웨어',
    plaigroupName: 'PLAIGROUP (플레이그룹)',
    plaigroupDesc: '그룹 커뮤니티와 협업 활동을 지원하는 소프트웨어',
    plaisharingName: 'PLAISHARING (플레이쉐어링)',
    plaisharingDesc: '사용자 간 콘텐츠 및 자원 공유를 위한 소프트웨어',
    plaimallName: 'PLAIMALL (플레이몰)',
    plaimallDesc: '상품·주문·결제를 연결하는 전자상거래 소프트웨어',
    plaischainName: 'PLAISCHAIN (플레이스체인)',
    plaischainDesc: '분산 저장·검증·원장 처리를 수행하는 체인 소프트웨어',
    certificateLabel: '프로그램등록증',
    certificateOpen: '원본 열기',
    certificateView: '등록증 원본 크게 보기',
    copyrightNotice: '위 등록정보와 이미지는 한국저작권위원회가 발급한 프로그램등록증을 기준으로 게시했습니다. 이미지를 선택하면 등록증 원본을 크게 확인할 수 있습니다.',
    installTitle: '설치하고 확인하는 순서',
    installDesc: '일반 사용자는 plais 앱과 포인트 화면을 먼저 보면 되고, 세부 검증은 Explorer에서 확인합니다.',
    step1Title: 'plais 앱 설치',
    step1Desc: '최신 APK를 설치하고 로그인하면 앱 활동 포인트와 체인 지갑 연결을 사용할 수 있습니다.',
    step2Title: 'plais Point 확인',
    step2Desc: '평소에는 포인트 화면에서 총 포인트, 앱 활동 포인트, 저장 포인트, 감점을 확인합니다.',
    step3Title: 'Explorer로 검증',
    step3Desc: '보상 원장, 블록 높이, txHash, proof id/hash가 필요할 때 체인 익스플로러에서 확인합니다.',
    step4Title: 'Node Pool 참여',
    step4Desc: 'PC 저장 노드를 켜면 저장소 제공과 검증 기여 기록이 노드 원장에 반영됩니다.',
    downloadTitle: 'plais 앱과 노드 도구',
    downloadDesc: '모바일 앱은 사용자 활동과 포인트 확인의 중심이고, PC 노드는 저장소 기여와 검증 참여의 중심입니다. 메인넷 전환 후에도 사용 흐름은 동일하게 유지하는 방향입니다.',
    rewardFlowAria: 'plais 보상 원장 흐름 애니메이션',
    latestApk: '최신 APK',
    footerPlaifor: '앱 홈으로 이동',
    footerExplorer: '보상, 블록, TX',
    footerWallet: 'PLAIS 메인넷 지갑',
    footerWhitepaper: '정책과 구조',
    footerSource: '공개 소스 다운로드',
    footerListing: '상장 심사 자료',
    footerStatusTitle: '운영 상태',
    footerStatus: '체인 점검 화면',
    modalTitle: '프로그램등록증',
    modalClose: '등록증 닫기'
  },
  en: {
    mainNavigation: 'Main navigation', languageLabel: 'Language selection', mainnetLabel: 'plais Chain Mainnet', testnetLabel: 'plais Chain Testnet',
    whitepaperTitle: 'Whitepaper and Mainnet Policy', whitepaperDesc: 'The plais Chain reward model, tokenomics, testnet operating scope, and mainnet transition criteria are maintained in the whitepaper and policy documents. This page is designed to retain the same structure after the transition to mainnet.', koreanWhitepaper: 'Korean Whitepaper', englishWhitepaper: 'English Whitepaper', rewardLedgerLink: 'View Reward Ledger',
    supplyLabel: 'Supply', supplyTitle: 'Maximum Supply', supplyDesc: 'Policy values and ledger state are shown separately before the mainnet transition.', circulationLabel: 'Circulation', circulationTitle: 'Current Circulation', circulationDesc: 'The on-chain circulation flow aggregated by the wallet service.', rewardLedgerLabel: 'Reward Ledger', rewardLedgerTitle: 'Ledger Records', countSuffix: ' records', rewardTotalLabel: 'Total rewards', penaltyLabel: 'penalties',
    servicesTitle: 'Connected Apps and Services', servicesDesc: 'plais Chain receives activity ledgers from the entire plais ecosystem, not from a single app.', appServiceTitle: 'AI Assistant App', appServiceDesc: 'Notes, recordings, cloud activity, and AI pet growth connect to app activity rewards.', talkServiceTitle: 'Messaging and Group Activity', talkServiceDesc: 'Community and group activity can expand into ecosystem reward categories after separate integration.', mallServiceTitle: 'Commerce Integration', mallServiceDesc: 'Orders, payments, reviews, and store activity connect to reward or verification ledgers after policy review.', nodeServiceTitle: 'PC Storage Nodes', nodeServiceDesc: 'User PCs contribute storage, verification, and recovery while tracking node rewards and collateral status.',
    patentTitle: 'PLAIS Ecosystem Built on Patent-Pending Technology', patentDesc: 'We develop and pursue protection for the data lifecycle, distributed-storage rewards, two-way interpretation, and electronic-value finality technologies used across the PLAIS ecosystem.', patentSummaryAria: 'Four patent applications in the Republic of Korea', patentPending: 'Patent Pending', countryFour: 'Republic of Korea · 4',
    patent1Label: 'Patent 1 · DATA LIFECYCLE', patent1Title: 'Method and system for selective removal and differentiated reconstruction of server originals based on multi-copy retention verification and removal-intent state', patent1Desc: 'Verifies retention of device copies and distributed fragments, then distinguishes temporary delivery, permanent recovery, and reconstruction suppression according to removal intent and user-deletion state.',
    patent2Label: 'Patent 2 · NODE REWARD', patent2Title: 'Method and system for calculating rewards based on evidence of storage, verification, and recovery contributions by encrypted distributed-storage nodes', patent2Desc: 'Verifies contribution evidence produced during storage, verification, and recovery, then calculates rewards corresponding to valid node contributions.',
    patent3Label: 'Patent 3 · AI INTERPRETATION', patent3Title: 'Method and system for two-way messenger interpretation using latency-based result selection from parallel translation engines', patent3Desc: 'Runs local and remote AI translation in parallel and selects a valid interpretation result based on latency and failures before delivering it to the messenger.',
    patent4Label: 'Patent 4 · COIN FINALITY', patent4Title: 'Method and system for confirming electronic value based on cross-duplicate verification of multi-service contribution events and distributed-ledger finality', patent4Desc: 'Cross-checks duplicate contribution events across services and confirms electronic value only after distributed-ledger finality, preventing duplicate and unconfirmed payments.', coinCoreLabel: 'Core PLAIS Coin Processing Technology', patentNotice: 'These technologies are the subject of patent applications in the Republic of Korea. A patent application does not mean that a patent has been granted or that rights have been confirmed.',
    copyrightTitle: 'Software Copyright Registrations', copyrightDesc: 'Six core PLAIS ecosystem software products are officially registered with the Korea Copyright Commission.', copyrightSummaryAria: 'Six software copyright registrations', registeredSoftware: 'Registered Software', countrySix: 'Republic of Korea · 6',
    plaiforName: 'PLAIFOR', plaiforDesc: 'Integrated PLAIS ecosystem services and operations software', plaitalkName: 'PLAITALK', plaitalkDesc: 'Software providing messenger and AI interpretation features', plaigroupName: 'PLAIGROUP', plaigroupDesc: 'Software supporting group communities and collaborative activity', plaisharingName: 'PLAISHARING', plaisharingDesc: 'Software for sharing content and resources between users', plaimallName: 'PLAIMALL', plaimallDesc: 'E-commerce software connecting products, orders, and payments', plaischainName: 'PLAISCHAIN', plaischainDesc: 'Chain software for distributed storage, verification, and ledger processing', certificateLabel: 'Software Registration Certificate', certificateOpen: 'Open original', certificateView: 'View full certificate', copyrightNotice: 'The registration details and images are published from software registration certificates issued by the Korea Copyright Commission. Select an image to view the full certificate.',
    installTitle: 'Install and Verify', installDesc: 'Most users can start with the plais app and point screen, then use Explorer for detailed verification.', step1Title: 'Install the plais App', step1Desc: 'Install the latest APK and sign in to use app activity points and connect a chain wallet.', step2Title: 'Check plais Point', step2Desc: 'Use the point screen to review total points, app activity points, storage points, and penalties.', step3Title: 'Verify in Explorer', step3Desc: 'Use the chain Explorer when you need reward ledger records, block heights, txHash, or proof IDs and hashes.', step4Title: 'Join the Node Pool', step4Desc: 'Run a PC storage node to record storage capacity and verification contributions in the node ledger.', downloadTitle: 'plais App and Node Tools', downloadDesc: 'The mobile app centers on user activity and point tracking, while PC nodes center on storage and verification contributions. The same user flow is intended to remain after the mainnet transition.', rewardFlowAria: 'plais reward ledger flow animation', latestApk: 'Latest APK',
    footerPlaifor: 'Go to app home', footerExplorer: 'Rewards, blocks, and TX', footerWallet: 'PLAIS mainnet wallet', footerWhitepaper: 'Policy and architecture', footerSource: 'Download public source', footerListing: 'Listing review materials', footerStatusTitle: 'Operating Status', footerStatus: 'Chain health dashboard', modalTitle: 'Software Registration Certificate', modalClose: 'Close certificate'
  },
  zh: {
    mainNavigation: '主导航', languageLabel: '语言选择', mainnetLabel: 'plais Chain 主网', testnetLabel: 'plais Chain 测试网',
    whitepaperTitle: '白皮书与主网政策', whitepaperDesc: 'plais Chain 的奖励结构、代币经济、测试网运行范围和主网迁移标准均由白皮书及政策文件管理。本页面采用可在主网迁移后继续使用的统一结构。', koreanWhitepaper: '韩文白皮书', englishWhitepaper: '英文白皮书', rewardLedgerLink: '查看奖励账本',
    supplyLabel: '供应量', supplyTitle: '最大发行量', supplyDesc: '在主网迁移前，将政策数值与账本状态分开显示。', circulationLabel: '流通量', circulationTitle: '当前流通量', circulationDesc: '由钱包服务汇总的链上流通情况。', rewardLedgerLabel: '奖励账本', rewardLedgerTitle: '账本记录', countSuffix: ' 条', rewardTotalLabel: '奖励合计', penaltyLabel: '扣减',
    servicesTitle: '已连接的应用与服务', servicesDesc: 'plais Chain 接收整个 plais 生态的活动账本，而非仅服务于单一应用。', appServiceTitle: 'AI 助手应用', appServiceDesc: '备忘录、录音、云端活动和 AI 宠物成长将连接到应用活跃奖励。', talkServiceTitle: '对话与群组活动', talkServiceDesc: '社区和群组活动可在单独集成后扩展为生态奖励项目。', mallServiceTitle: '商业集成', mallServiceDesc: '订单、支付、评论和商店活动经政策审核后连接到奖励或验证账本。', nodeServiceTitle: 'PC 存储节点', nodeServiceDesc: '用户 PC 参与存储、验证和恢复贡献，并查看节点奖励与质押状态。',
    patentTitle: '基于专利申请技术的 PLAIS 生态', patentDesc: '我们自主开发并推进保护 PLAIS 生态使用的数据生命周期、分布式存储奖励、双向翻译和电子价值确认技术。', patentSummaryAria: '四项韩国专利申请', patentPending: '专利申请中', countryFour: '韩国 · 4 项',
    patent1Label: '专利 1 · DATA LIFECYCLE', patent1Title: '基于多重保管验证及删除意图状态的服务器原件选择性删除与差异化重构方法及系统', patent1Desc: '验证终端副本和分布式分片的保管状态，并根据原件删除意图和用户删除状态区分临时提供、永久恢复及抑制重构。',
    patent2Label: '专利 2 · NODE REWARD', patent2Title: '基于加密分布式存储节点的存储、验证与恢复贡献证据的奖励计算方法及系统', patent2Desc: '验证存储、验证和恢复过程中生成的贡献证据，并计算与有效节点贡献相对应的奖励。',
    patent3Label: '专利 3 · AI INTERPRETATION', patent3Title: '利用并行翻译引擎延迟结果选择的双向即时通信翻译方法及系统', patent3Desc: '并行运行本地翻译与远程 AI 翻译，并根据延迟、失败和结果有效性选择翻译结果后传送至即时通信应用。',
    patent4Label: '专利 4 · COIN FINALITY', patent4Title: '基于多服务贡献事件交叉重复验证与分布式账本最终性的电子价值确认方法及系统', patent4Desc: '交叉验证多个服务中的相同贡献事件，并仅在确认分布式账本最终性后确定电子价值，防止重复支付和未确认支付。', coinCoreLabel: 'PLAIS Coin 核心处理技术', patentNotice: '上述技术正在韩国申请专利。专利申请并不表示已获得专利或相关权利已经确定。',
    copyrightTitle: '软件著作权登记', copyrightDesc: 'PLAIS 生态的六款核心软件已在韩国著作权委员会正式登记。', copyrightSummaryAria: '六项软件著作权登记', registeredSoftware: '已登记软件', countrySix: '韩国 · 6 项',
    plaiforName: 'PLAIFOR', plaiforDesc: 'PLAIS 生态综合服务与运营软件', plaitalkName: 'PLAITALK', plaitalkDesc: '提供即时通信和 AI 翻译功能的软件', plaigroupName: 'PLAIGROUP', plaigroupDesc: '支持群组社区与协作活动的软件', plaisharingName: 'PLAISHARING', plaisharingDesc: '用于用户间内容和资源共享的软件', plaimallName: 'PLAIMALL', plaimallDesc: '连接商品、订单与支付的电子商务软件', plaischainName: 'PLAISCHAIN', plaischainDesc: '执行分布式存储、验证和账本处理的链软件', certificateLabel: '软件登记证书', certificateOpen: '打开原件', certificateView: '查看完整证书', copyrightNotice: '以上登记信息和图片依据韩国著作权委员会签发的软件登记证书发布。选择图片可查看完整证书。',
    installTitle: '安装与验证步骤', installDesc: '普通用户可先查看 plais 应用和积分页面，详细验证则可在 Explorer 中进行。', step1Title: '安装 plais 应用', step1Desc: '安装最新 APK 并登录，即可使用应用活动积分及链钱包连接。', step2Title: '查看 plais Point', step2Desc: '在积分页面查看总积分、应用活动积分、存储积分和扣减。', step3Title: '使用 Explorer 验证', step3Desc: '需要奖励账本、区块高度、txHash 或 proof ID/hash 时，可在链浏览器中查询。', step4Title: '加入 Node Pool', step4Desc: '运行 PC 存储节点后，存储提供和验证贡献将记录到节点账本。', downloadTitle: 'plais 应用与节点工具', downloadDesc: '移动应用用于管理用户活动和积分，PC 节点用于存储贡献与验证参与。主网迁移后也将保持相同的使用流程。', rewardFlowAria: 'plais 奖励账本流程动画', latestApk: '最新 APK',
    footerPlaifor: '前往应用首页', footerExplorer: '奖励、区块和交易', footerWallet: 'PLAIS 主网钱包', footerWhitepaper: '政策与架构', footerSource: '下载公开源码', footerListing: '上市审核资料', footerStatusTitle: '运行状态', footerStatus: '链检查页面', modalTitle: '软件登记证书', modalClose: '关闭证书'
  },
  ja: {
    mainNavigation: 'メインナビゲーション', languageLabel: '言語選択', mainnetLabel: 'plais Chain メインネット', testnetLabel: 'plais Chain テストネット',
    whitepaperTitle: 'ホワイトペーパーとメインネット方針', whitepaperDesc: 'plais Chainの報酬構造、トークノミクス、テストネットの運用範囲、メインネット移行基準は、ホワイトペーパーと方針文書で管理します。このページはメインネット移行後も同じ構成で利用できるよう設計されています。', koreanWhitepaper: '韓国語ホワイトペーパー', englishWhitepaper: '英語ホワイトペーパー', rewardLedgerLink: '報酬台帳を確認',
    supplyLabel: '供給量', supplyTitle: '最大発行量', supplyDesc: 'メインネット移行前の方針値と台帳状態を分けて表示します。', circulationLabel: '流通量', circulationTitle: '現在の流通量', circulationDesc: 'ウォレットサービスを基準に集計したチェーン内の流通状況です。', rewardLedgerLabel: '報酬台帳', rewardLedgerTitle: '台帳記録', countSuffix: '件', rewardTotalLabel: '報酬合計', penaltyLabel: '減点',
    servicesTitle: '連携するアプリとサービス', servicesDesc: 'plais Chainは単一アプリではなく、plaisエコシステム全体の活動台帳を受け取ります。', appServiceTitle: 'AIアシスタントアプリ', appServiceDesc: 'メモ、録音、クラウド活動、AIペットの成長がアプリ活動報酬につながります。', talkServiceTitle: '会話とグループ活動', talkServiceDesc: 'コミュニティとグループ活動は、個別連携後にエコシステム報酬項目へ拡張できます。', mallServiceTitle: 'コマース連携', mallServiceDesc: '注文、決済、レビュー、ストア活動を方針審査後に報酬または検証台帳へ接続します。', nodeServiceTitle: 'PCストレージノード', nodeServiceDesc: 'ユーザーPCが保存、検証、復旧に貢献し、ノード報酬と担保状態を確認します。',
    patentTitle: '特許出願技術に基づくPLAISエコシステム', patentDesc: 'PLAISエコシステムで利用するデータライフサイクル、分散ストレージ報酬、双方向通訳、電子的価値確定技術を独自に開発し、権利化を進めています。', patentSummaryAria: '韓国で出願中の4件の特許', patentPending: '特許出願中', countryFour: '韓国 · 4件',
    patent1Label: '特許1 · DATA LIFECYCLE', patent1Title: '複数保管の検証および削除意図状態に基づくサーバー原本の選択的削除と差分再構成の方法およびシステム', patent1Desc: '端末コピーと分散フラグメントの保管状態を検証し、原本削除意図とユーザー削除状態に応じて一時提供、恒久復旧、再構成抑止を区別します。',
    patent2Label: '特許2 · NODE REWARD', patent2Title: '暗号化分散ストレージノードの保存・検証・復旧貢献証拠に基づく報酬算定方法およびシステム', patent2Desc: '保存、検証、復旧の過程で生成される貢献証拠を検証し、有効なノード貢献に対応する報酬を算定します。',
    patent3Label: '特許3 · AI INTERPRETATION', patent3Title: '並列翻訳エンジンの遅延ベース結果選択を利用した双方向メッセンジャー通訳方法およびシステム', patent3Desc: 'ローカル翻訳とリモートAI翻訳を並列実行し、遅延、失敗、結果の有効性に応じて通訳結果を選択してメッセンジャーへ届けます。',
    patent4Label: '特許4 · COIN FINALITY', patent4Title: '複数サービス貢献イベントの交差重複検証と分散台帳ファイナリティに基づく電子的価値確定方法およびシステム', patent4Desc: '複数サービスの同一貢献イベントを交差検証し、分散台帳のファイナリティ確認後にのみ電子的価値を確定して、重複支給と未確定支給を防止します。', coinCoreLabel: 'PLAIS Coinの中核処理技術', patentNotice: 'これらの技術は韓国で特許出願中です。特許出願は、特許登録または権利確定を意味するものではありません。',
    copyrightTitle: 'プログラム著作権登録', copyrightDesc: 'PLAISエコシステムの中核ソフトウェア6製品が韓国著作権委員会に正式登録されました。', copyrightSummaryAria: '6件のプログラム著作権登録', registeredSoftware: '登録ソフトウェア', countrySix: '韓国 · 6件',
    plaiforName: 'PLAIFOR', plaiforDesc: 'PLAISエコシステム統合サービスおよび運用ソフトウェア', plaitalkName: 'PLAITALK', plaitalkDesc: 'メッセンジャーとAI通訳機能を提供するソフトウェア', plaigroupName: 'PLAIGROUP', plaigroupDesc: 'グループコミュニティと協業活動を支援するソフトウェア', plaisharingName: 'PLAISHARING', plaisharingDesc: 'ユーザー間のコンテンツとリソース共有用ソフトウェア', plaimallName: 'PLAIMALL', plaimallDesc: '商品、注文、決済を接続するEコマースソフトウェア', plaischainName: 'PLAISCHAIN', plaischainDesc: '分散保存、検証、台帳処理を行うチェーンソフトウェア', certificateLabel: 'プログラム登録証', certificateOpen: '原本を開く', certificateView: '登録証を拡大表示', copyrightNotice: '登録情報と画像は、韓国著作権委員会が発行したプログラム登録証に基づいて掲載しています。画像を選択すると登録証を拡大表示できます。',
    installTitle: 'インストールと確認の手順', installDesc: '一般ユーザーはplaisアプリとポイント画面から始め、詳細な検証はExplorerで確認できます。', step1Title: 'plaisアプリをインストール', step1Desc: '最新APKをインストールしてログインすると、アプリ活動ポイントとチェーンウォレット連携を利用できます。', step2Title: 'plais Pointを確認', step2Desc: 'ポイント画面で総ポイント、アプリ活動ポイント、ストレージポイント、減点を確認します。', step3Title: 'Explorerで検証', step3Desc: '報酬台帳、ブロック高、txHash、proof ID/hashが必要な場合はチェーンExplorerで確認します。', step4Title: 'Node Poolに参加', step4Desc: 'PCストレージノードを稼働すると、ストレージ提供と検証貢献がノード台帳に反映されます。', downloadTitle: 'plaisアプリとノードツール', downloadDesc: 'モバイルアプリはユーザー活動とポイント確認、PCノードはストレージ貢献と検証参加の中心です。メインネット移行後も同じ利用フローを維持する方針です。', rewardFlowAria: 'plais報酬台帳フローのアニメーション', latestApk: '最新APK',
    footerPlaifor: 'アプリホームへ', footerExplorer: '報酬、ブロック、TX', footerWallet: 'PLAISメインネットウォレット', footerWhitepaper: '方針と構成', footerSource: '公開ソースをダウンロード', footerListing: '上場審査資料', footerStatusTitle: '運用状態', footerStatus: 'チェーン点検画面', modalTitle: 'プログラム登録証', modalClose: '登録証を閉じる'
  }
};

function chainText(lang, key) {
  return (HOME_SECTIONS[lang] && HOME_SECTIONS[lang][key])
    || (HOME_EXTRA[lang] && HOME_EXTRA[lang][key])
    || (DICT[lang] && DICT[lang][key])
    || HOME_SECTIONS.ko[key]
    || HOME_EXTRA.ko[key]
    || DICT.ko[key]
    || key;
}

function normalizeLang(value) {
  const lang = String(value || '').toLowerCase();
  return SUPPORTED_LANGS.includes(lang) ? lang : 'ko';
}

function chainLangUrl(req, nextLang) {
  const url = new URL(req.originalUrl || '/', 'https://chain.aisfor.kr');
  url.searchParams.set('lang', normalizeLang(nextLang));
  return url.pathname + url.search + url.hash;
}

function chainI18nMiddleware(req, res, next) {
  const lang = normalizeLang(req.query.lang || req.cookies?.chain_lang || req.headers['x-chain-lang']);
  if (typeof res.cookie === 'function') {
    res.cookie('chain_lang', lang, { maxAge: 31536000000, sameSite: 'lax' });
  }
  res.locals.chainLang = lang;
  res.locals.chainLangs = SUPPORTED_LANGS;
  res.locals.chainLangUrl = (nextLang) => chainLangUrl(req, nextLang);
  res.locals.chainT = (key) => chainText(lang, key);
  next();
}

module.exports = { chainI18nMiddleware, normalizeLang, SUPPORTED_LANGS };
