/* i18n.jsx — Dictionary + useT hook + LanguageSwitcher */
/* global React */

// Inline dictionary — covers UI chrome, nav, common actions, page titles
const DICT = {
  en: {
    // Top-level / nav
    'nav.dashboard': 'Dashboard',
    'nav.discovery': 'Discover',
    'nav.campaigns': 'Campaigns',
    'nav.reports': 'Reports',
    'nav.aff': 'AFF tracking',
    'nav.creators': 'My creators',
    'nav.import': 'Import',
    'nav.settings': 'Settings',
    'nav.openCampaigns': 'Open campaigns',
    'nav.applications': 'My applications',
    'nav.myCampaigns': 'My campaigns',
    'nav.earnings': 'Earnings',
    'nav.mediakit': 'Media kit',

    'nav.group.workspace': 'Workspace',
    'nav.group.data': 'Data',
    'nav.group.account': 'Account',

    // Topbar
    'topbar.search': 'Search creators, campaigns…',
    'topbar.newCampaign': 'New campaign',
    'topbar.export': 'Export',

    // User menu
    'user.role.owner': 'Owner',
    'user.role.manager': 'Manager',
    'user.role.creator': 'Creator',
    'user.workspace.brand': 'Brand workspace',
    'user.workspace.creator': 'Creator workspace',
    'user.menu.profile': 'My profile',
    'user.menu.account': 'Account & billing',
    'user.menu.settings': 'Workspace settings',
    'user.menu.team': 'Team & roles',
    'user.menu.help': 'Help & docs',
    'user.menu.changelog': 'What’s new',
    'user.menu.switchTo': 'Switch to {portal}',
    'user.menu.signout': 'Sign out',
    'user.signout.title': 'Sign out of Prime?',
    'user.signout.body': 'You’ll be returned to the sign-in screen. Any unsaved campaign drafts stay safe — they autosave every 2 seconds.',
    'user.signout.confirm': 'Yes, sign out',
    'user.signout.cancel': 'Stay signed in',
    'user.plan.pro': 'Pro plan',
    'user.plan.trial': '12 days left on trial',

    // Common
    'common.viewAll': 'View all',
    'common.cancel': 'Cancel',
    'common.save': 'Save',
    'common.continue': 'Continue',
    'common.back': 'Back',
    'common.next': 'Next',
    'common.submit': 'Submit',
    'common.publish': 'Publish',
    'common.draft': 'Draft',
    'common.delete': 'Delete',
    'common.edit': 'Edit',
    'common.add': 'Add',
    'common.search': 'Search',
    'common.filter': 'Filter',
    'common.sort': 'Sort',
    'common.share': 'Share',
    'common.live': 'Live',
    'common.day': 'day',
    'common.days': 'days',
    'common.week': 'week',
    'common.weeks': 'weeks',
    'common.followers': 'followers',
    'common.engagement': 'Engagement',
    'common.reach': 'Reach',
    'common.match': 'Match',

    // Status
    'status.draft': 'Draft',
    'status.recruiting': 'Recruiting',
    'status.in_progress': 'In progress',
    'status.completed': 'Completed',
    'status.cancelled': 'Cancelled',
    'status.archived': 'Archived',
    // Legacy aliases
    'status.live': 'Live',
    'status.review': 'In review',
    'status.paused': 'Paused',
    'status.published': 'Published',
    'status.rejected': 'Rejected',

    // Brand pages
    'brand.briefs.title': 'Briefs',
    'brand.briefs.subtitle': 'All your campaign briefs in one place',
    'brand.briefs.new': 'New brief',
    'brand.briefDetail.shortlist': 'AI shortlist',
    'brand.briefDetail.requirements': 'Requirements',
    'brand.briefDetail.timeline': 'Timeline',
    'brand.briefDetail.budget': 'Budget',
    'brand.campaigns.title': 'Campaigns',
    'brand.campaigns.subtitle': 'Track every campaign you run',
    'brand.reports.title': 'Reports',
    'brand.reports.subtitle': 'Auto-generated narratives for every campaign',
    'brand.import.title': 'Import data',
    'brand.import.subtitle': 'Upload CSV to refresh influencer stats',
    'brand.settings.title': 'Settings',
    'brand.influencerDetail.about': 'About',
    'brand.influencerDetail.audience': 'Audience',
    'brand.influencerDetail.content': 'Recent content',
    'brand.influencerDetail.stats': 'Performance',
    'brand.influencerDetail.rateCard': 'Rate card',

    // Wizard
    'wizard.step1': 'Basics',
    'wizard.step2': 'Requirements',
    'wizard.step3': 'Budget & timeline',
    'wizard.step4': 'Review',

    // Creator
    'creator.discover.title': 'Open campaigns',
    'creator.discover.subtitle': 'Campaigns from brands looking for creators like you — one-click apply',
    'creator.applications.title': 'My applications',
    'creator.applications.subtitle': 'Track where you stand with every campaign you applied to',
    'creator.campaigns.title': 'My campaigns',
    'creator.earnings.title': 'Earnings',
    'creator.earnings.subtitle': 'Every payout, invoice and affiliate dollar',
    'creator.profile.title': 'Media kit',
    'creator.profile.subtitle': 'Your public profile — auto-built from your last 60 posts',
    'creator.settings.title': 'Settings',

    // Greetings
    'greeting.morning': 'Good morning',
    'greeting.creator': 'Hey {name}, you\u2019re on a streak.',

    // Auth & landing
    'landing.cta.start': 'Start free \u2014 14 days',
    'landing.cta.demo': 'Watch 90s demo',
    'auth.signin': 'Sign in',
    'auth.signup': 'Create account',
    'auth.email': 'Work email',
    'auth.password': 'Password',
    'auth.fullname': 'Full name',
    'auth.forgot': 'Forgot?',
    'auth.welcomeBack': 'Welcome back.',
    'auth.firstMatch': 'Make your first match.',
    'auth.brand': 'Brand / Agency',
    'auth.brandDesc': 'Run campaigns',
    'auth.creator': 'Creator',
    'auth.creatorDesc': 'Find work',
    'auth.subLogin': 'Sign in to keep every campaign traceable.',
    'auth.subSignup': 'Spin up a workspace your team won\u2019t fight.',
    'auth.newHere': 'New here?',
    'auth.alreadyOn': 'Already on Prime?',
    'auth.continueGoogle': 'Continue with Google',
    'auth.continueGoogleSub': 'We never post or read your data without asking.',
    'auth.iAmA': 'I am a\u2026',
    'auth.termsLine': 'By continuing you agree to our',
    'auth.terms': 'Terms',
    'auth.and': 'and',
    'auth.privacy': 'Privacy Policy',
    'auth.language': 'Language',
    'auth.poweredBy': 'by Prime Production',
    'auth.heroBadge': 'Live \u00b7 31,247 creators on the network',
    'auth.heroH1': 'Every campaign,',
    'auth.heroH2': 'traceable to the source.',
    'auth.heroBody': 'AI shortlists, audience science, and provenance \u2014 in one workspace your team won\u2019t fight.',
    'auth.stat1': 'Brief \u2192 shortlist in',
    'auth.stat2': 'Campaigns delivered this week',
    'auth.stat3': 'Total reach tracked',
    'auth.help': 'Need help signing in?',
    'auth.contact': 'Recover access',
    'auth.orContinue': 'OR CONTINUE WITH',
    'auth.moreSoonHint': 'Microsoft and SSO are coming soon.',
    // Forgot / recover
    'forgot.title': 'Recover access',
    'forgot.subtitle': 'Tell us the email on your Prime workspace. We\u2019ll send a one-time link to re-link your Google account or hand it to your workspace admin.',
    'forgot.emailLabel': 'Workspace email',
    'forgot.send': 'Send recovery link',
    'forgot.back': 'Back to sign in',
    'forgot.sentTitle': 'Check your inbox.',
    'forgot.sentBody': 'If {email} matches a Prime workspace, a recovery link is on its way. The link is valid for 30 minutes.',
    'forgot.resend': 'Didn\u2019t get it? Resend',
    'forgot.changeEmail': 'Use a different email',
    'forgot.tip1': 'Most issues are fixed by signing into Google first, then returning here.',
    'forgot.tip2': 'On a corporate domain? Your IT admin may need to approve Prime.',
    'forgot.tip3': 'Still stuck? Email support@prime.io \u2014 we reply within 1 business hour.',
    'forgot.tipsTitle': 'Quick checks',
    'forgot.heroBadge': 'Encrypted recovery \u00b7 zero-knowledge',
    'forgot.heroAccent': '30 min link, then gone.',
    'forgot.proof1': 'Verified via your Google identity',
    'forgot.proof2': 'No password to leak \u2014 there isn\u2019t one',
    'forgot.proof3': 'Workspace admins can revoke any session',
  },

  vi: {
    'nav.dashboard': 'Tổng quan',
    'nav.discovery': 'Khám phá',
    'nav.campaigns': 'Chiến dịch',
    'nav.reports': 'Báo cáo',
    'nav.aff': 'Hiệu suất AFF',
    'nav.creators': 'KOL của tôi',
    'nav.import': 'Nhập dữ liệu',
    'nav.settings': 'Cài đặt',
    'nav.openCampaigns': 'Chiến dịch mở',
    'nav.applications': 'Đơn đăng ký',
    'nav.myCampaigns': 'Chiến dịch của tôi',
    'nav.earnings': 'Doanh thu',
    'nav.mediakit': 'Media kit',

    'nav.group.workspace': 'Không gian làm việc',
    'nav.group.data': 'Dữ liệu',
    'nav.group.account': 'Tài khoản',

    'topbar.search': 'Tìm KOL, chiến dịch…',
    'topbar.newCampaign': 'Tạo chiến dịch',
    'topbar.export': 'Xuất',

    // User menu
    'user.role.owner': 'Chủ sở hữu',
    'user.role.manager': 'Quản lý',
    'user.role.creator': 'Creator',
    'user.workspace.brand': 'Workspace Brand',
    'user.workspace.creator': 'Workspace Creator',
    'user.menu.profile': 'Hồ sơ của tôi',
    'user.menu.account': 'Tài khoản & thanh toán',
    'user.menu.settings': 'Cài đặt workspace',
    'user.menu.team': 'Đội ngũ & phân quyền',
    'user.menu.help': 'Trợ giúp & tài liệu',
    'user.menu.changelog': 'Có gì mới',
    'user.menu.switchTo': 'Về {portal}',
    'user.menu.signout': 'Đăng xuất',
    'user.signout.title': 'Đăng xuất khỏi Prime?',
    'user.signout.body': 'Bạn sẽ quay lại màn đăng nhập. Các bản nháp đang mở vẫn an toàn — tự lưu mỗi 2 giây.',
    'user.signout.confirm': 'Có, đăng xuất',
    'user.signout.cancel': 'Ở lại',
    'user.plan.pro': 'Gói Pro',
    'user.plan.trial': 'Còn 12 ngày dùng thử',

    'common.viewAll': 'Xem tất cả',
    'common.cancel': 'Hủy',
    'common.save': 'Lưu',
    'common.continue': 'Tiếp tục',
    'common.back': 'Quay lại',
    'common.next': 'Tiếp',
    'common.submit': 'Gửi',
    'common.publish': 'Xuất bản',
    'common.draft': 'Bản nháp',
    'common.delete': 'Xóa',
    'common.edit': 'Sửa',
    'common.add': 'Thêm',
    'common.search': 'Tìm kiếm',
    'common.filter': 'Lọc',
    'common.sort': 'Sắp xếp',
    'common.share': 'Chia sẻ',
    'common.live': 'Đang chạy',
    'common.day': 'ngày',
    'common.days': 'ngày',
    'common.week': 'tuần',
    'common.weeks': 'tuần',
    'common.followers': 'người theo dõi',
    'common.engagement': 'Tương tác',
    'common.reach': 'Tiếp cận',
    'common.match': 'Phù hợp',

    'status.draft': 'Nháp',
    'status.recruiting': 'Đang tuyển',
    'status.in_progress': 'Đang chạy',
    'status.completed': 'Hoàn thành',
    'status.cancelled': 'Đã huỷ',
    'status.archived': 'Lưu trữ',
    'status.live': 'Đang chạy',
    'status.review': 'Đang duyệt',
    'status.paused': 'Tạm dừng',
    'status.published': 'Đã xuất bản',
    'status.rejected': 'Từ chối',

    'brand.briefs.title': 'Brief',
    'brand.briefs.subtitle': 'Tất cả brief chiến dịch của bạn',
    'brand.briefs.new': 'Tạo brief',
    'brand.briefDetail.shortlist': 'Shortlist từ AI',
    'brand.briefDetail.requirements': 'Yêu cầu',
    'brand.briefDetail.timeline': 'Thời gian',
    'brand.briefDetail.budget': 'Ngân sách',
    'brand.campaigns.title': 'Chiến dịch',
    'brand.campaigns.subtitle': 'Theo dõi mọi chiến dịch đang chạy',
    'brand.reports.title': 'Báo cáo',
    'brand.reports.subtitle': 'Báo cáo tự động cho từng chiến dịch',
    'brand.import.title': 'Nhập dữ liệu',
    'brand.import.subtitle': 'Tải CSV để cập nhật chỉ số KOL',
    'brand.settings.title': 'Cài đặt',
    'brand.influencerDetail.about': 'Giới thiệu',
    'brand.influencerDetail.audience': 'Khán giả',
    'brand.influencerDetail.content': 'Nội dung gần đây',
    'brand.influencerDetail.stats': 'Hiệu suất',
    'brand.influencerDetail.rateCard': 'Bảng giá',

    'wizard.step1': 'Cơ bản',
    'wizard.step2': 'Yêu cầu',
    'wizard.step3': 'Ngân sách & thời gian',
    'wizard.step4': 'Xem lại',

    'creator.discover.title': 'Chiến dịch mở',
    'creator.discover.subtitle': 'Chiến dịch đang tuyển creator — apply một lượt',
    'creator.applications.title': 'Đơn đăng ký',
    'creator.applications.subtitle': 'Theo dõi tình trạng từng chiến dịch bạn apply',
    'creator.campaigns.title': 'Chiến dịch của tôi',
    'creator.earnings.title': 'Doanh thu',
    'creator.earnings.subtitle': 'Mọi thanh toán, hóa đơn và affiliate',
    'creator.profile.title': 'Media kit',
    'creator.profile.subtitle': 'Hồ sơ công khai — tự tạo từ 60 bài đăng gần nhất',
    'creator.settings.title': 'Cài đặt',

    'greeting.morning': 'Chào buổi sáng',
    'greeting.creator': 'Chào {name}, bạn đang trên đà rực rỡ.',

    'landing.cta.start': 'Dùng thử miễn phí 14 ngày',
    'landing.cta.demo': 'Xem demo 90 giây',
    'auth.signin': 'Đăng nhập',
    'auth.signup': 'Tạo tài khoản',
    'auth.email': 'Email công việc',
    'auth.password': 'Mật khẩu',
    'auth.fullname': 'Họ và tên',
    'auth.forgot': 'Quên?',
    'auth.welcomeBack': 'Chào mừng quay lại.',
    'auth.firstMatch': 'Bắt đầu match đầu tiên.',
    'auth.brand': 'Thương hiệu / Agency',
    'auth.brandDesc': 'Chạy chiến dịch',
    'auth.creator': 'Nhà sáng tạo',
    'auth.creatorDesc': 'Nhận deal',
    'auth.subLogin': 'Đăng nhập để mọi chiến dịch luôn có dấu vết.',
    'auth.subSignup': 'Tạo không gian làm việc để cả đội không có gì phải cãi.',
    'auth.newHere': 'Chưa có tài khoản?',
    'auth.alreadyOn': 'Đã có tài khoản Prime?',
    'auth.continueGoogle': 'Tiếp tục với Google',
    'auth.continueGoogleSub': 'Chúng tôi không đăng bài hay đọc dữ liệu khi chưa xin phép.',
    'auth.iAmA': 'Tôi là…',
    'auth.termsLine': 'Khi tiếp tục, bạn đồng ý với',
    'auth.terms': 'Điều khoản',
    'auth.and': 'và',
    'auth.privacy': 'Chính sách riêng tư',
    'auth.language': 'Ngôn ngữ',
    'auth.poweredBy': 'thuộc Prime Production',
    'auth.heroBadge': 'Đang hoạt động · 31.247 creator trong mạng lưới',
    'auth.heroH1': 'Mọi chiến dịch,',
    'auth.heroH2': 'truy nguồn đến từng nguồn.',
    'auth.heroBody': 'Shortlist AI, khoa học khán giả và truy nguồn — trong một không gian làm việc cả đội không cãi nhau.',
    'auth.stat1': 'Brief → shortlist trong',
    'auth.stat2': 'Chiến dịch hoàn thành tuần này',
    'auth.stat3': 'Reach được đo',
    'auth.help': 'Cần hỗ trợ đăng nhập?',
    'auth.contact': 'Khôi phục truy cập',
    'auth.orContinue': 'HOẶC TIẾP TỤC VỚI',
    'auth.moreSoonHint': 'Microsoft và SSO sắp ra mắt.',
    'forgot.title': 'Khôi phục truy cập',
    'forgot.subtitle': 'Cho chúng tôi biết email của workspace Prime. Chúng tôi sẽ gửi link một lần để liên kết lại Google hoặc chuyển cho admin workspace.',
    'forgot.emailLabel': 'Email workspace',
    'forgot.send': 'Gửi link khôi phục',
    'forgot.back': 'Quay lại đăng nhập',
    'forgot.sentTitle': 'Kiểm tra hộp thư của bạn.',
    'forgot.sentBody': 'Nếu {email} khớp với một workspace Prime, link khôi phục đang được gửi đến. Link có hiệu lực trong 30 phút.',
    'forgot.resend': 'Chưa nhận được? Gửi lại',
    'forgot.changeEmail': 'Dùng email khác',
    'forgot.tip1': 'Phần lớn sự cố được giải quyết bằng cách đăng nhập Google trước, rồi quay lại đây.',
    'forgot.tip2': 'Đang dùng domain công ty? IT admin của bạn có thể cần duyệt Prime.',
    'forgot.tip3': 'Vẫn kẹt? Email support@prime.io — chúng tôi phản hồi trong 1 giờ làm việc.',
    'forgot.tipsTitle': 'Kiểm tra nhanh',
    'forgot.heroBadge': 'Mã hoá · không lưu trữ thông tin',
    'forgot.heroAccent': 'Link 30 phút, sau đó biến mất.',
    'forgot.proof1': 'Xác thực qua danh tính Google của bạn',
    'forgot.proof2': 'Không có mật khẩu để rò rỉ — vì đâu có',
    'forgot.proof3': 'Admin workspace có thể thu hồi mọi phiên',
  },

  ms: {
    'nav.dashboard': 'Papan pemuka',
    'nav.discovery': 'Cari',
    'nav.campaigns': 'Kempen',
    'nav.reports': 'Laporan',
    'nav.aff': 'Prestasi AFF',
    'nav.creators': 'KOL saya',
    'nav.import': 'Import',
    'nav.settings': 'Tetapan',
    'nav.openCampaigns': 'Kempen terbuka',
    'nav.applications': 'Permohonan saya',
    'nav.myCampaigns': 'Kempen saya',
    'nav.earnings': 'Pendapatan',
    'nav.mediakit': 'Kit media',

    'nav.group.workspace': 'Ruang kerja',
    'nav.group.data': 'Data',
    'nav.group.account': 'Akaun',

    'topbar.search': 'Cari pencipta, kempen…',
    'topbar.newCampaign': 'Kempen baharu',
    'topbar.export': 'Eksport',

    'common.viewAll': 'Lihat semua',
    'common.cancel': 'Batal',
    'common.save': 'Simpan',
    'common.continue': 'Teruskan',
    'common.back': 'Kembali',
    'common.next': 'Seterusnya',
    'common.submit': 'Hantar',
    'common.publish': 'Terbitkan',
    'common.draft': 'Draf',
    'common.delete': 'Padam',
    'common.edit': 'Sunting',
    'common.add': 'Tambah',
    'common.search': 'Cari',
    'common.filter': 'Tapis',
    'common.sort': 'Susun',
    'common.share': 'Kongsi',
    'common.live': 'Langsung',
    'common.day': 'hari',
    'common.days': 'hari',
    'common.week': 'minggu',
    'common.weeks': 'minggu',
    'common.followers': 'pengikut',
    'common.engagement': 'Penglibatan',
    'common.reach': 'Jangkauan',
    'common.match': 'Padanan',

    'status.draft': 'Draf',
    'status.recruiting': 'Buka pendaftaran',
    'status.in_progress': 'Sedang berjalan',
    'status.completed': 'Selesai',
    'status.cancelled': 'Dibatalkan',
    'status.archived': 'Diarkib',
    'status.live': 'Langsung',
    'status.review': 'Dalam semakan',
    'status.paused': 'Dijeda',
    'status.published': 'Diterbitkan',
    'status.rejected': 'Ditolak',

    'brand.briefs.title': 'Brief',
    'brand.briefs.subtitle': 'Semua brief kempen anda di satu tempat',
    'brand.briefs.new': 'Brief baharu',
    'brand.briefDetail.shortlist': 'Senarai pendek AI',
    'brand.briefDetail.requirements': 'Keperluan',
    'brand.briefDetail.timeline': 'Garis masa',
    'brand.briefDetail.budget': 'Belanjawan',
    'brand.campaigns.title': 'Kempen',
    'brand.campaigns.subtitle': 'Jejaki setiap kempen yang sedang berjalan',
    'brand.reports.title': 'Laporan',
    'brand.reports.subtitle': 'Naratif auto-jana untuk setiap kempen',
    'brand.import.title': 'Import data',
    'brand.import.subtitle': 'Muat naik CSV untuk menyegarkan statistik KOL',
    'brand.settings.title': 'Tetapan',
    'brand.influencerDetail.about': 'Tentang',
    'brand.influencerDetail.audience': 'Audien',
    'brand.influencerDetail.content': 'Kandungan terkini',
    'brand.influencerDetail.stats': 'Prestasi',
    'brand.influencerDetail.rateCard': 'Kad kadar',

    'wizard.step1': 'Asas',
    'wizard.step2': 'Keperluan',
    'wizard.step3': 'Belanjawan & masa',
    'wizard.step4': 'Semak',

    'creator.discover.title': 'Brief terbuka',
    'creator.discover.subtitle': 'Pasaran brief daripada jenama mencari pencipta',
    'creator.applications.title': 'Permohonan saya',
    'creator.applications.subtitle': 'Jejaki status setiap permohonan',
    'creator.campaigns.title': 'Kempen saya',
    'creator.earnings.title': 'Pendapatan',
    'creator.earnings.subtitle': 'Setiap bayaran, invois & affiliate',
    'creator.profile.title': 'Kit media',
    'creator.profile.subtitle': 'Profil awam anda — auto-jana dari 60 pos terkini',
    'creator.settings.title': 'Tetapan',

    'greeting.morning': 'Selamat pagi',
    'greeting.creator': 'Hai {name}, anda sedang menjalar.',

    'landing.cta.start': 'Mula percuma \u2014 14 hari',
    'landing.cta.demo': 'Tonton demo 90s',
    'auth.signin': 'Log masuk',
    'auth.signup': 'Cipta akaun',
    'auth.email': 'Emel kerja',
    'auth.password': 'Kata laluan',
    'auth.fullname': 'Nama penuh',
    'auth.forgot': 'Lupa?',
    'auth.welcomeBack': 'Selamat kembali.',
    'auth.firstMatch': 'Buat padanan pertama anda.',
    'auth.brand': 'Jenama / Agensi',
    'auth.brandDesc': 'Jalankan kempen',
    'auth.creator': 'Pencipta',
    'auth.creatorDesc': 'Cari kerja',
    'auth.subLogin': 'Log masuk untuk pastikan setiap kempen boleh dijejaki.',
    'auth.subSignup': 'Cipta ruang kerja yang pasukan anda tak bergaduh tentangnya.',
    'auth.newHere': 'Baharu di sini?',
    'auth.alreadyOn': 'Sudah ada akaun Prime?',
    'auth.continueGoogle': 'Teruskan dengan Google',
    'auth.continueGoogleSub': 'Kami tidak pos atau baca data anda tanpa kebenaran.',
    'auth.iAmA': 'Saya seorang…',
    'auth.termsLine': 'Dengan meneruskan, anda bersetuju dengan',
    'auth.terms': 'Syarat',
    'auth.and': 'dan',
    'auth.privacy': 'Dasar Privasi',
    'auth.language': 'Bahasa',
    'auth.poweredBy': 'oleh Prime Production',
    'auth.heroBadge': 'Langsung · 31,247 pencipta dalam rangkaian',
    'auth.heroH1': 'Setiap kempen,',
    'auth.heroH2': 'boleh dijejaki ke puncanya.',
    'auth.heroBody': 'Senarai pendek AI, sains audien dan jejak punca — dalam satu ruang kerja yang pasukan anda tak bergaduh.',
    'auth.stat1': 'Brief → senarai pendek dalam',
    'auth.stat2': 'Kempen disiapkan minggu ini',
    'auth.stat3': 'Jumlah jangkauan dijejaki',
    'auth.help': 'Perlukan bantuan log masuk?',
    'auth.contact': 'Pulihkan akses',
    'auth.orContinue': 'ATAU TERUSKAN DENGAN',
    'auth.moreSoonHint': 'Microsoft dan SSO akan datang.',
    'forgot.title': 'Pulihkan akses',
    'forgot.subtitle': 'Beritahu kami emel ruang kerja Prime anda. Kami akan hantar pautan sekali guna untuk pautkan semula akaun Google atau serahkan kepada admin ruang kerja.',
    'forgot.emailLabel': 'Emel ruang kerja',
    'forgot.send': 'Hantar pautan pemulihan',
    'forgot.back': 'Kembali ke log masuk',
    'forgot.sentTitle': 'Periksa peti masuk anda.',
    'forgot.sentBody': 'Jika {email} sepadan dengan ruang kerja Prime, pautan pemulihan dalam perjalanan. Pautan sah selama 30 minit.',
    'forgot.resend': 'Tak terima? Hantar semula',
    'forgot.changeEmail': 'Guna emel lain',
    'forgot.tip1': 'Kebanyakan isu selesai dengan log masuk Google dahulu, kemudian kembali ke sini.',
    'forgot.tip2': 'Pada domain korporat? Admin IT anda mungkin perlu meluluskan Prime.',
    'forgot.tip3': 'Masih tersekat? Emel support@prime.io — kami balas dalam 1 jam bekerja.',
    'forgot.tipsTitle': 'Semakan pantas',
    'forgot.heroBadge': 'Pemulihan ter-encrypt · tanpa pengetahuan',
    'forgot.heroAccent': 'Pautan 30 minit, kemudian hilang.',
    'forgot.proof1': 'Disahkan melalui identiti Google anda',
    'forgot.proof2': 'Tiada kata laluan untuk bocor — memang tiada',
    'forgot.proof3': 'Admin ruang kerja boleh batalkan mana-mana sesi',
  },
};

const LOCALES = [
  { code: 'en', label: 'English', flag: '🇬🇧' },
  { code: 'vi', label: 'Tiếng Việt', flag: '🇻🇳' },
  { code: 'ms', label: 'Bahasa Malaysia', flag: '🇲🇾' },
];

const I18nCtx = React.createContext({ locale: 'en', t: (k) => k });

function I18nProvider({ locale, children }) {
  const t = React.useCallback((key, vars) => {
    const lang = DICT[locale] || DICT.en;
    let s = lang[key] ?? DICT.en[key] ?? key;
    if (vars) Object.keys(vars).forEach(v => { s = s.replace(`{${v}}`, vars[v]); });
    return s;
  }, [locale]);
  return <I18nCtx.Provider value={{ locale, t }}>{children}</I18nCtx.Provider>;
}

function useT() {
  return React.useContext(I18nCtx);
}

function LanguageSwitcher({ locale, onChange }) {
  const [open, setOpen] = React.useState(false);
  const cur = LOCALES.find(l => l.code === locale) || LOCALES[0];
  return (
    <div style={{ position: 'relative' }}>
      <button
        onClick={() => setOpen(o => !o)}
        style={{
          background: 'white', border: '1px solid var(--line)',
          borderRadius: 999, padding: '8px 14px',
          display: 'flex', alignItems: 'center', gap: 6,
          fontSize: 12, fontWeight: 700, fontFamily: 'inherit',
          cursor: 'pointer', color: 'var(--ink)'
        }}>
        <span style={{ fontSize: 14 }}>{cur.flag}</span>
        {cur.code.toUpperCase()}
        <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"><path d="m6 9 6 6 6-6" /></svg>
      </button>
      {open && (
        <>
          <div style={{ position: 'fixed', inset: 0, zIndex: 50 }} onClick={() => setOpen(false)} />
          <div style={{
            position: 'absolute', top: 'calc(100% + 6px)', right: 0,
            background: 'white', borderRadius: 12,
            boxShadow: '0 12px 30px rgba(0,43,80,0.16)',
            border: '1px solid var(--line)',
            minWidth: 180, padding: 4, zIndex: 51
          }}>
            {LOCALES.map(l => (
              <button key={l.code} onClick={() => { onChange(l.code); setOpen(false); }}
                style={{
                  display: 'flex', alignItems: 'center', gap: 8,
                  width: '100%', padding: '8px 10px',
                  border: 0, background: l.code === locale ? 'var(--bg-soft)' : 'transparent',
                  borderRadius: 8, fontSize: 13, fontWeight: 600,
                  cursor: 'pointer', textAlign: 'left', color: 'var(--ink)',
                  fontFamily: 'inherit'
                }}>
                <span style={{ fontSize: 16 }}>{l.flag}</span>
                {l.label}
                {l.code === locale && <span style={{ marginLeft: 'auto', color: 'var(--cyan-dark)' }}>✓</span>}
              </button>
            ))}
          </div>
        </>
      )}
    </div>
  );
}

Object.assign(window, { I18nProvider, useT, LanguageSwitcher, LOCALES, DICT });
