// Translations for Only Moles. Keys are shared across all languages.
// HTML allowed in strings — they're rendered via dangerouslySetInnerHTML.
// Brand proper nouns kept in Dutch in every locale:
//   "Only Moles", "team Naakte Molratten", "Samenloop Rosmalen"

const LANGS = [
  { code: "en", name: "English",     short: "EN" },
  { code: "nl", name: "Nederlands",  short: "NL" },
  { code: "fr", name: "Français",    short: "FR" },
  { code: "de", name: "Deutsch",     short: "DE" },
  { code: "es", name: "Español",     short: "ES" },
];

const I18N = {
  // ───────── English ─────────
  en: {
    nav_peek: "A peek inside",
    nav_cause: "The cause",
    nav_faq: "FAQ",
    nav_login: "Log in",

    hero_headline: "The internet's most <em>exclusive</em><br/>naked mole rat fanclub.",
    hero_lede: "Daily photos and behind-the-scenes shots of Earth's strangest, wrinkliest mammals. Every subscription is a donation to <strong>team Naakte Molratten</strong> walking the Samenloop Rosmalen for cancer research.",
    hero_cta_subscribe: "Subscribe — from €5/mo",
    hero_cta_member: "I'm already a member",

    stat_members: "members",
    stat_posts: "posts",
    stat_raised: "raised so far",
    live_pill: "New post · 1.2k likes",

    peek_eyebrow: "A peek inside",
    peek_title: "Six new posts this week.<br/>All locked.",
    peek_note: "Subscribe to unfog the colony →",
    members_only: "Members only",
    sneak_preview: "Sneak preview",
    modal_close: "Close",
    modal_locked_msg: "Subscribe to defog this post and the rest of the colony.",
    modal_locked_cta: "Subscribe — from €5/mo",

    press_eyebrow: "As seen in",
    press_quote: "Bold, absurdly stylish, and impossible to click away from.",
    press_attribution: "Caveoir Magazine · June 2026",
    press_cover_alt: "Caveoir Magazine cover — June 2026",
    press_badge: "Cover story",

    tile_0_caption: "Velvet Underground",                tile_0_sub: "Posted today · velvet edition",
    tile_1_caption: "Queen Hilde holds court",            tile_1_sub: "Posted yesterday · 22 photos",
    tile_2_caption: "Communal sand bath",                 tile_2_sub: "Posted today · 11 photos",
    tile_3_caption: "Pup pile, Tuesday morning",          tile_3_sub: "Posted 3d ago · 9 photos",
    tile_4_caption: "Snack o'clock",                      tile_4_sub: "Posted last week · video",
    tile_5_caption: "Eddy poses for the camera",          tile_5_sub: "Posted last week · 18 photos",

    sub_eyebrow: "Join the colony",
    sub_title: "Pick a tier.<br/>The moles thank you.",
    sub_body: "Every euro goes straight to <strong>team Naakte Molratten</strong> in the Samenloop Rosmalen. Cancel anytime — but the wrinkles last forever.",
    perk_1: "Daily uncensored photos from the colony",
    perk_2: "Learn more than you ever wanted to know about the naked mole rat",
    perk_3: "Photo series of a mole rat with your own name from the €25 tier",
    perk_4: "100% of fees go to non-profits in cancer research and support",

    auth_tab_signup: "Subscribe",
    auth_tab_login: "Log in",
    auth_tier_burrow: "Worker",         auth_tier_burrow_sub: "Monthly · entry tier",
    auth_tier_colony: "Colony",          auth_tier_colony_sub: "Monthly · most popular",
    auth_tier_queen:  "Queen",           auth_tier_queen_sub:  "Monthly · top supporter",
    auth_email: "Email",
    auth_password: "Password",
    auth_consent: "I understand my subscription is a donation to <strong>team Naakte Molratten</strong> in the Samenloop Rosmalen, and I promise not to be disappointed that all it gets me is access to some animal photos.",
    auth_submit_signup_tmpl: "Donate & unlock — €${price}/mo",
    auth_submit_login: "Log in",
    auth_forgot: "Forgot password?",
    auth_welcome_signup: "Welcome to the colony",
    auth_welcome_signup_copy: "Your first donation is on its way to team Naakte Molratten. Check your inbox for access details.",
    auth_welcome_login: "Welcome back",
    auth_welcome_login_copy: "Logging you in…",
    auth_back: "← back",
    auth_loading: "One moment…",
    auth_err_invalid_email: "That doesn't look like a valid email address.",
    auth_err_invalid_credentials: "Wrong email or password. Try again.",
    auth_err_email_in_use: "That email already has an account — try logging in.",
    auth_err_weak_password: "Password too weak — use at least 6 characters.",
    auth_err_too_many: "Too many attempts. Take a breath and try again shortly.",
    auth_err_user_disabled: "This account has been disabled.",
    auth_err_network: "Network hiccup — check your connection and retry.",
    auth_err_need_email: "Enter your email above first, then tap “Forgot password?”.",
    auth_err_generic: "Something burrowed wrong. Please try again.",
    auth_reset_sent: "Reset email sent — check your inbox.",
    auth_or: "or",
    auth_google: "Continue with Google",
    auth_facebook: "Continue with Facebook",
    auth_err_account_exists: "You already signed up with a different method — use that to log in.",
    auth_err_popup_blocked: "Your browser blocked the sign-in window. Allow pop-ups and try again.",

    faq_eyebrow: "Frequently — and reasonably — asked",
    faq_title: "You probably have<br/><em>questions</em>.",
    faq_note: "There are no stupid questions. There are stupid websites.",
    faq_q_1: "Is this a joke?",
    faq_a_1: "Yes, but cancer isn't a joke. Please donate.",
    faq_q_2: "Who are you?",
    faq_a_2: "Just some friends trying to raise money for a good cause.",
    faq_q_3: "Why a mole rat?",
    faq_a_3: "Researchers love them: naked mole rats <strong>almost never develop cancer</strong>. Studying them might help us understand how to prevent it in humans.",
    faq_q_4: "Where do naked mole rats live?",
    faq_a_4: "The Horn of Africa — underground, in colonies of up to 300, in tunnels they dig with their teeth.",
    faq_q_5: "Can I donate without having to see those ugly animals?",
    faq_a_5: "Of course. <a class=\"faq-link\" href=\"https://www.samenlooprosmalen.nl/donate-0mqdar\" target=\"_blank\" rel=\"noopener\">Follow this link</a> — or scan the QR code. Eyes safe, conscience clear.",
    faq_q_6: "Are the images AI generated?",
    faq_a_6: "Yes. We tried fitting mini bikinis on real mole rats. It did not work out.",
    faq_q_7: "Do you have even more explicit content?",
    faq_a_7: "No. Please consult a doctor.",
    faq_qr_caption: "Scan to donate directly",
    faq_card_no: "Nº",
    faq_card_row1_label: "Entries",       faq_card_row1_value: "07",
    faq_card_row2_label: "Inquiries",     faq_card_row2_value: "Reasonable",
    faq_card_row3_label: "Answers",       faq_card_row3_value: "Questionable",
    faq_card_row4_label: "Filed under",   faq_card_row4_value: "Digging",

    charity_eyebrow: "The actual point",
    charity_title: "This is a fundraiser<br/>dressed up as a fanclub.",
    charity_body: "<strong>Only Moles</strong> raises money for <strong>team Naakte Molratten</strong> in the <strong>Samenloop Rosmalen</strong> — a 24-hour relay for cancer research. Why the naked mole rat? Researchers have studied it for years because it <strong>almost never gets cancer</strong>, and humans have plenty to learn from that. We may not move underground as fast as a mole rat — but we keep <em>digging</em>. For more research. Better treatments. A world with less cancer. <strong>100% of every subscription goes straight to the team's fundraising page.</strong> Together we dig.",
    charity_raised_tmpl: "€${amount} raised",
    charity_goal_tmpl: "of €${amount} goal",
    charity_cta_primary: "Subscribe & donate",
    charity_cta_secondary: "Donate without subscribing →",
    badge_team: "Team",

    share_eyebrow: "Spread the word",
    share_title: "Help us dig <em>deeper</em>.",
    share_subtitle: "More eyeballs on this page = more donations to team Naakte Molratten. Take three seconds and share.",
    share_message: "Only Moles — the internet's most exclusive naked mole rat fanclub. Every subscription funds cancer research.",
    share_email_subject: "You need to see this naked mole rat fanclub",
    share_copy: "Copy link",
    share_copied: "Link copied!",
    share_paste_hint: "Link copied — paste it in your post!",

    foot_copy: "© 2026 Only Moles · a fundraiser, not a real fanclub",
    foot_privacy: "Privacy",
    foot_contact: "Contact",
    foot_samenloop: "Samenloop Rosmalen ↗",
  },

  // ───────── Nederlands ─────────
  nl: {
    nav_peek: "Even gluren",
    nav_cause: "Het goede doel",
    nav_faq: "FAQ",
    nav_login: "Inloggen",

    hero_headline: "De meest <em>exclusieve</em><br/>naakte-molrattenfanclub van het internet.",
    hero_lede: "Dagelijks foto's en behind-the-scenes van de gerimpeldste zoogdieren op aarde. Elk abonnement is een donatie aan <strong>team Naakte Molratten</strong>, dat de Samenloop Rosmalen loopt voor kankeronderzoek.",
    hero_cta_subscribe: "Abonneer — vanaf €5/mnd",
    hero_cta_member: "Ik ben al lid",

    stat_members: "leden",
    stat_posts: "berichten",
    stat_raised: "tot nu toe opgehaald",
    live_pill: "Nieuw bericht · 1,2k likes",

    peek_eyebrow: "Even gluren",
    peek_title: "Zes nieuwe berichten deze week.<br/>Allemaal vergrendeld.",
    peek_note: "Abonneer en zie de kolonie scherp →",
    members_only: "Alleen voor leden",
    sneak_preview: "Sneak preview",
    modal_close: "Sluiten",
    modal_locked_msg: "Abonneer en zie deze post — en de rest van de kolonie — scherp.",
    modal_locked_cta: "Abonneer — vanaf €5/mnd",

    press_eyebrow: "Zoals gezien in",
    press_quote: "Gedurfd, absurd stijlvol en onmogelijk om weg te klikken.",
    press_attribution: "Caveoir Magazine · juni 2026",
    press_cover_alt: "Caveoir Magazine cover — juni 2026",
    press_badge: "Coververhaal",

    tile_0_caption: "Fluwelen Ondergrond",                tile_0_sub: "Vandaag geplaatst · fluweel-editie",
    tile_1_caption: "Koningin Hilde houdt hof",            tile_1_sub: "Gisteren · 22 foto's",
    tile_2_caption: "Gezamenlijk zandbad",                 tile_2_sub: "Vandaag · 11 foto's",
    tile_3_caption: "Pup-hoop, dinsdagochtend",            tile_3_sub: "3 dagen geleden · 9 foto's",
    tile_4_caption: "Snacktijd",                           tile_4_sub: "Vorige week · video",
    tile_5_caption: "Eddy poseert voor de camera",         tile_5_sub: "Vorige week · 18 foto's",

    sub_eyebrow: "Word lid van de kolonie",
    sub_title: "Kies een niveau.<br/>De molratten bedanken je.",
    sub_body: "Elke euro gaat rechtstreeks naar <strong>team Naakte Molratten</strong> in de Samenloop Rosmalen. Stop wanneer je wilt — de herinnering blijft eeuwig.",
    perk_1: "Dagelijks ongecensureerde foto's uit de kolonie",
    perk_2: "Leer meer dan je wilt weten over de naakte molrat",
    perk_3: "Fotoserie van een molrat met eigen naam vanaf €25-niveau",
    perk_4: "100% van de bijdragen gaat naar non-profits in kankeronderzoek en -zorg",

    auth_tab_signup: "Abonneren",
    auth_tab_login: "Inloggen",
    auth_tier_burrow: "Werker",            auth_tier_burrow_sub: "Maandelijks · instapniveau",
    auth_tier_colony: "Kolonie",         auth_tier_colony_sub: "Maandelijks · populairst",
    auth_tier_queen:  "Koningin",        auth_tier_queen_sub:  "Maandelijks · topsupporter",
    auth_email: "E-mail",
    auth_password: "Wachtwoord",
    auth_consent: "Ik begrijp dat mijn abonnement een donatie is aan <strong>team Naakte Molratten</strong> in de Samenloop Rosmalen, en beloof niet teleurgesteld te zijn als blijkt dat dit mij alleen toegang tot wat spicy dierenfoto's geeft.",
    auth_submit_signup_tmpl: "Doneer & ontgrendel — €${price}/mnd",
    auth_submit_login: "Inloggen",
    auth_forgot: "Wachtwoord vergeten?",
    auth_welcome_signup: "Welkom in de kolonie",
    auth_welcome_signup_copy: "Je eerste donatie is onderweg naar team Naakte Molratten. Check je inbox voor je toegangsgegevens.",
    auth_welcome_login: "Welkom terug",
    auth_welcome_login_copy: "Je wordt aangemeld…",
    auth_back: "← terug",
    auth_loading: "Momentje…",
    auth_err_invalid_email: "Dat lijkt geen geldig e-mailadres.",
    auth_err_invalid_credentials: "Verkeerd e-mailadres of wachtwoord. Probeer opnieuw.",
    auth_err_email_in_use: "Dit e-mailadres heeft al een account — probeer in te loggen.",
    auth_err_weak_password: "Wachtwoord te zwak — gebruik minstens 6 tekens.",
    auth_err_too_many: "Te veel pogingen. Haal even adem en probeer het zo opnieuw.",
    auth_err_user_disabled: "Dit account is uitgeschakeld.",
    auth_err_network: "Netwerkprobleempje — controleer je verbinding en probeer opnieuw.",
    auth_err_need_email: "Vul eerst je e-mailadres hierboven in en tik dan op “Wachtwoord vergeten?”.",
    auth_err_generic: "Er ging iets mis in de tunnel. Probeer het opnieuw.",
    auth_reset_sent: "Herstelmail verstuurd — check je inbox.",
    auth_or: "of",
    auth_google: "Doorgaan met Google",
    auth_facebook: "Doorgaan met Facebook",
    auth_err_account_exists: "Je hebt je al met een andere methode aangemeld — gebruik die om in te loggen.",
    auth_err_popup_blocked: "Je browser blokkeerde het inlogvenster. Sta pop-ups toe en probeer opnieuw.",

    faq_eyebrow: "Veelgestelde — en redelijke — vragen",
    faq_title: "Je hebt vast<br/><em>vragen</em>.",
    faq_note: "Domme vragen bestaan niet. Domme websites wel.",
    faq_q_1: "Is dit een grap?",
    faq_a_1: "Ja, maar kanker is geen grap. Doneer alsjeblieft.",
    faq_q_2: "Wie zijn jullie?",
    faq_a_2: "Gewoon wat vrienden die geld proberen op te halen voor een goed doel.",
    faq_q_3: "Waarom een molrat?",
    faq_a_3: "Onderzoekers zijn er dol op: naakte molratten <strong>krijgen vrijwel nooit kanker</strong>. Ze bestuderen kan helpen begrijpen hoe we het bij mensen kunnen voorkomen.",
    faq_q_4: "Waar leven naakte molratten?",
    faq_a_4: "De Hoorn van Afrika — ondergronds, in kolonies tot 300, in tunnels die ze met hun tanden graven.",
    faq_q_5: "Kan ik doneren zonder die lelijke dieren te hoeven zien?",
    faq_a_5: "Natuurlijk. <a class=\"faq-link\" href=\"https://www.samenlooprosmalen.nl/donate-0mqdar\" target=\"_blank\" rel=\"noopener\">Volg deze link</a> — of scan de QR-code. Ogen veilig, geweten schoon.",
    faq_q_6: "Zijn de foto's met AI gemaakt?",
    faq_a_6: "Ja. We hebben geprobeerd mini-bikini's op echte molratten te passen. Dat liep niet goed af.",
    faq_q_7: "Hebben jullie ook explicietere content?",
    faq_a_7: "Nee. Raadpleeg een arts.",
    faq_qr_caption: "Scan om direct te doneren",
    faq_card_no: "Nr.",
    faq_card_row1_label: "Vragen",        faq_card_row1_value: "07",
    faq_card_row2_label: "Aard",          faq_card_row2_value: "Redelijk",
    faq_card_row3_label: "Antwoorden",    faq_card_row3_value: "Twijfelachtig",
    faq_card_row4_label: "Gearchiveerd",  faq_card_row4_value: "Graven",

    charity_eyebrow: "Waar het echt om gaat",
    charity_title: "Dit is een inzamelingsactie<br/>vermomd als fanclub.",
    charity_body: "<strong>Only Moles</strong> haalt geld op voor <strong>team Naakte Molratten</strong> in de <strong>Samenloop Rosmalen</strong> — een 24-uurs estafette voor kankeronderzoek. Waarom een naakte molrat? Wetenschappers bestuderen hem al jaren omdat hij <strong>bijna nooit kanker krijgt</strong>, en daar kunnen wij mensen nog veel van leren. Wij gaan misschien niet zo snel onder de grond als een molrat — maar we <em>graven</em> wél door. Voor meer onderzoek. Betere behandelingen. Een wereld met minder kanker. <strong>100% van elk abonnement gaat naar de inzamelingspagina van het team.</strong> Samen graven we door.",
    charity_raised_tmpl: "€${amount} opgehaald",
    charity_goal_tmpl: "van €${amount}-doel",
    charity_cta_primary: "Abonneer & doneer",
    charity_cta_secondary: "Doneren zonder abonnement →",
    badge_team: "Team",

    foot_copy: "© 2026 Only Moles · een inzamelingsactie, geen echte fanclub",

    share_eyebrow: "Verspreid het",
    share_title: "Help ons <em>dieper</em> graven.",
    share_subtitle: "Meer mensen op deze pagina = meer donaties aan team Naakte Molratten. Drie seconden van je tijd en je deelt het.",
    share_message: "Only Moles — de meest exclusieve naakte-molrattenfanclub van het internet. Elk abonnement is een donatie aan kankeronderzoek.",
    share_email_subject: "Deze naakte-molrattenfanclub moet je zien",
    share_copy: "Link kopiëren",
    share_copied: "Link gekopieerd!",
    share_paste_hint: "Link gekopieerd — plak 'm in je bericht!",
    foot_privacy: "Privacy",
    foot_contact: "Contact",
    foot_samenloop: "Samenloop Rosmalen ↗",
  },

  // ───────── Français ─────────
  fr: {
    nav_peek: "Un aperçu",
    nav_cause: "La cause",
    nav_faq: "FAQ",
    nav_login: "Connexion",

    hero_headline: "Le fanclub le plus <em>exclusif</em><br/>de rats-taupes nus sur internet.",
    hero_lede: "Photos quotidiennes et coulisses des mammifères les plus étranges et ridés de la planète. Chaque abonnement est un don à <strong>team Naakte Molratten</strong>, qui participe au Samenloop Rosmalen pour la recherche contre le cancer.",
    hero_cta_subscribe: "S'abonner — à partir de 5 €/mois",
    hero_cta_member: "Je suis déjà membre",

    stat_members: "membres",
    stat_posts: "publications",
    stat_raised: "récoltés à ce jour",
    live_pill: "Nouveau post · 1,2k j'aime",

    peek_eyebrow: "Un aperçu",
    peek_title: "Six nouveaux posts cette semaine.<br/>Tous verrouillés.",
    peek_note: "Abonnez-vous pour défloutter la colonie →",
    members_only: "Réservé aux membres",
    sneak_preview: "Avant-goût",
    modal_close: "Fermer",
    modal_locked_msg: "Abonnez-vous pour déflouter ce post et le reste de la colonie.",
    modal_locked_cta: "S'abonner — dès 5 €/mois",

    press_eyebrow: "Vu dans",
    press_quote: "Audacieux, absurdement chic, et impossible à refermer.",
    press_attribution: "Caveoir Magazine · juin 2026",
    press_cover_alt: "Couverture Caveoir Magazine — juin 2026",
    press_badge: "En couverture",

    tile_0_caption: "Velours Underground",                tile_0_sub: "Aujourd'hui · édition velours",
    tile_1_caption: "La reine Hilde tient sa cour",         tile_1_sub: "Hier · 22 photos",
    tile_2_caption: "Bain de sable collectif",              tile_2_sub: "Aujourd'hui · 11 photos",
    tile_3_caption: "Tas de petits, mardi matin",           tile_3_sub: "Il y a 3 j · 9 photos",
    tile_4_caption: "L'heure du goûter",                    tile_4_sub: "La semaine dernière · vidéo",
    tile_5_caption: "Eddy pose pour la caméra",             tile_5_sub: "La semaine dernière · 18 photos",

    sub_eyebrow: "Rejoignez la colonie",
    sub_title: "Choisissez un niveau.<br/>Les rats-taupes vous remercient.",
    sub_body: "Chaque euro va directement à <strong>team Naakte Molratten</strong> dans le cadre du Samenloop Rosmalen. Annulez quand vous voulez — les rides, elles, restent.",
    perk_1: "Photos non censurées quotidiennes de la colonie",
    perk_2: "Apprenez-en plus que vous ne le souhaitez sur le rat-taupe nu",
    perk_3: "Série photo d'un rat-taupe portant votre nom à partir du niveau 25 €",
    perk_4: "100 % des frais vont à des associations dédiées à la recherche et au soutien contre le cancer",

    auth_tab_signup: "S'abonner",
    auth_tab_login: "Connexion",
    auth_tier_burrow: "Ouvrier",        auth_tier_burrow_sub: "Mensuel · niveau d'entrée",
    auth_tier_colony: "Colonie",         auth_tier_colony_sub: "Mensuel · le plus populaire",
    auth_tier_queen:  "Reine",           auth_tier_queen_sub:  "Mensuel · supporter de luxe",
    auth_email: "E-mail",
    auth_password: "Mot de passe",
    auth_consent: "Je comprends que mon abonnement est un don à <strong>team Naakte Molratten</strong> dans le cadre du Samenloop Rosmalen, et je promets de ne pas être déçu·e que cela ne me donne accès qu'à quelques photos d'animaux.",
    auth_submit_signup_tmpl: "Donner & débloquer — ${price} €/mois",
    auth_submit_login: "Se connecter",
    auth_forgot: "Mot de passe oublié ?",
    auth_welcome_signup: "Bienvenue dans la colonie",
    auth_welcome_signup_copy: "Votre premier don est en route vers team Naakte Molratten. Vérifiez votre boîte de réception pour vos accès.",
    auth_welcome_login: "Bon retour",
    auth_welcome_login_copy: "Connexion en cours…",
    auth_back: "← retour",
    auth_loading: "Un instant…",
    auth_err_invalid_email: "Cette adresse e-mail ne semble pas valide.",
    auth_err_invalid_credentials: "E-mail ou mot de passe incorrect. Réessayez.",
    auth_err_email_in_use: "Cette adresse a déjà un compte — essayez de vous connecter.",
    auth_err_weak_password: "Mot de passe trop faible — utilisez au moins 6 caractères.",
    auth_err_too_many: "Trop de tentatives. Respirez un peu et réessayez bientôt.",
    auth_err_user_disabled: "Ce compte a été désactivé.",
    auth_err_network: "Souci de réseau — vérifiez votre connexion et réessayez.",
    auth_err_need_email: "Saisissez d'abord votre e-mail ci-dessus, puis touchez « Mot de passe oublié ? ».",
    auth_err_generic: "Quelque chose a déraillé dans le tunnel. Réessayez.",
    auth_reset_sent: "E-mail de réinitialisation envoyé — vérifiez votre boîte de réception.",
    auth_or: "ou",
    auth_google: "Continuer avec Google",
    auth_facebook: "Continuer avec Facebook",
    auth_err_account_exists: "Vous vous êtes déjà inscrit avec une autre méthode — utilisez-la pour vous connecter.",
    auth_err_popup_blocked: "Votre navigateur a bloqué la fenêtre de connexion. Autorisez les pop-ups et réessayez.",

    faq_eyebrow: "Questions fréquentes — et raisonnables",
    faq_title: "Vous avez sûrement<br/>des <em>questions</em>.",
    faq_note: "Il n'y a pas de questions bêtes. Des sites bêtes, oui.",
    faq_q_1: "C'est une blague ?",
    faq_a_1: "Oui, mais le cancer n'est pas une blague. Faites un don, s'il vous plaît.",
    faq_q_2: "Qui êtes-vous ?",
    faq_a_2: "Juste quelques amis qui essaient de récolter de l'argent pour une bonne cause.",
    faq_q_3: "Pourquoi un rat-taupe ?",
    faq_a_3: "Les chercheurs en raffolent : les rats-taupes nus <strong>ne développent presque jamais de cancer</strong>. Les étudier pourrait nous aider à comprendre comment le prévenir chez l'humain.",
    faq_q_4: "Où vivent les rats-taupes nus ?",
    faq_a_4: "Dans la Corne de l'Afrique — sous terre, en colonies pouvant atteindre 300 individus, dans des tunnels creusés avec leurs dents.",
    faq_q_5: "Puis-je faire un don sans avoir à voir ces animaux moches ?",
    faq_a_5: "Bien sûr. <a class=\"faq-link\" href=\"https://www.samenlooprosmalen.nl/donate-0mqdar\" target=\"_blank\" rel=\"noopener\">Suivez ce lien</a> — ou scannez le QR code. Yeux sauvés, conscience tranquille.",
    faq_q_6: "Les images sont-elles générées par IA ?",
    faq_a_6: "Oui. Nous avons essayé d'enfiler de mini bikinis à de vrais rats-taupes. Ça n'a pas marché.",
    faq_q_7: "Avez-vous du contenu encore plus explicite ?",
    faq_a_7: "Non. Consultez un médecin.",
    faq_qr_caption: "Scannez pour donner directement",
    faq_card_no: "Nº",
    faq_card_row1_label: "Entrées",       faq_card_row1_value: "07",
    faq_card_row2_label: "Demandes",      faq_card_row2_value: "Raisonnables",
    faq_card_row3_label: "Réponses",      faq_card_row3_value: "Douteuses",
    faq_card_row4_label: "Classé sous",   faq_card_row4_value: "Creuser",

    charity_eyebrow: "Le vrai but",
    charity_title: "C'est une collecte de fonds<br/>déguisée en fanclub.",
    charity_body: "<strong>Only Moles</strong> récolte des fonds pour <strong>team Naakte Molratten</strong> au <strong>Samenloop Rosmalen</strong> — un relais de 24 heures pour la recherche contre le cancer. Pourquoi le rat-taupe nu ? Les chercheurs l'étudient depuis des années parce qu'il <strong>ne développe presque jamais de cancer</strong>, et nous, humains, avons beaucoup à en apprendre. On ne creuse peut-être pas aussi vite qu'un rat-taupe — mais on continue à <em>creuser</em>. Pour plus de recherche. De meilleurs traitements. Un monde avec moins de cancer. <strong>100 % de chaque abonnement va directement à la page de collecte de l'équipe.</strong> Ensemble, on creuse.",
    charity_raised_tmpl: "${amount} € récoltés",
    charity_goal_tmpl: "sur un objectif de ${amount} €",
    charity_cta_primary: "S'abonner & faire un don",
    charity_cta_secondary: "Faire un don sans s'abonner →",
    badge_team: "Équipe",

    share_eyebrow: "Faites passer le mot",
    share_title: "Aidez-nous à creuser <em>plus profond</em>.",
    share_subtitle: "Plus de regards sur cette page = plus de dons à team Naakte Molratten. Trois secondes pour partager.",
    share_message: "Only Moles — le fanclub le plus exclusif de rats-taupes nus sur internet. Chaque abonnement finance la recherche contre le cancer.",
    share_email_subject: "Il faut que tu voies ce fanclub de rats-taupes nus",
    share_copy: "Copier le lien",
    share_copied: "Lien copié !",
    share_paste_hint: "Lien copié — colle-le dans ton post !",

    foot_copy: "© 2026 Only Moles · une collecte de fonds, pas un vrai fanclub",
    foot_privacy: "Confidentialité",
    foot_contact: "Contact",
    foot_samenloop: "Samenloop Rosmalen ↗",
  },

  // ───────── Deutsch ─────────
  de: {
    nav_peek: "Ein Blick hinein",
    nav_cause: "Der gute Zweck",
    nav_faq: "FAQ",
    nav_login: "Anmelden",

    hero_headline: "Der <em>exklusivste</em><br/>Nacktmull-Fanclub des Internets.",
    hero_lede: "Täglich Fotos und Behind-the-Scenes der seltsamsten, faltigsten Säugetiere der Welt. Jedes Abo ist eine Spende an <strong>team Naakte Molratten</strong>, das beim Samenloop Rosmalen für die Krebsforschung läuft.",
    hero_cta_subscribe: "Abonnieren — ab 5 €/Monat",
    hero_cta_member: "Ich bin schon Mitglied",

    stat_members: "Mitglieder",
    stat_posts: "Beiträge",
    stat_raised: "bisher gesammelt",
    live_pill: "Neuer Beitrag · 1,2k Likes",

    peek_eyebrow: "Ein Blick hinein",
    peek_title: "Sechs neue Beiträge diese Woche.<br/>Alle gesperrt.",
    peek_note: "Abonniere und sieh die Kolonie scharf →",
    members_only: "Nur für Mitglieder",
    sneak_preview: "Vorschau",
    modal_close: "Schließen",
    modal_locked_msg: "Abonniere und sieh diesen Beitrag — und den Rest der Kolonie — scharf.",
    modal_locked_cta: "Abonnieren — ab 5 €/Monat",

    press_eyebrow: "Gesehen in",
    press_quote: "Mutig, absurd stilvoll und unmöglich wegzuklicken.",
    press_attribution: "Caveoir Magazine · Juni 2026",
    press_cover_alt: "Caveoir Magazine Titelseite — Juni 2026",
    press_badge: "Titelgeschichte",

    tile_0_caption: "Samtuntergrund",                      tile_0_sub: "Heute · Samt-Edition",
    tile_1_caption: "Königin Hilde hält Hof",               tile_1_sub: "Gestern · 22 Fotos",
    tile_2_caption: "Gemeinsames Sandbad",                  tile_2_sub: "Heute · 11 Fotos",
    tile_3_caption: "Welpenhaufen, Dienstagmorgen",         tile_3_sub: "Vor 3 Tg. · 9 Fotos",
    tile_4_caption: "Snackzeit",                            tile_4_sub: "Letzte Woche · Video",
    tile_5_caption: "Eddy posiert für die Kamera",          tile_5_sub: "Letzte Woche · 18 Fotos",

    sub_eyebrow: "Tritt der Kolonie bei",
    sub_title: "Wähle ein Level.<br/>Die Mulle danken dir.",
    sub_body: "Jeder Euro geht direkt an <strong>team Naakte Molratten</strong> beim Samenloop Rosmalen. Jederzeit kündbar — die Falten bleiben für immer.",
    perk_1: "Täglich unzensierte Fotos aus der Kolonie",
    perk_2: "Erfahre mehr über den Nacktmull, als du je wissen wolltest",
    perk_3: "Fotoserie eines Nacktmulls mit deinem Namen ab dem 25-€-Level",
    perk_4: "100 % der Beiträge gehen an gemeinnützige Organisationen für Krebsforschung und -hilfe",

    auth_tab_signup: "Abonnieren",
    auth_tab_login: "Anmelden",
    auth_tier_burrow: "Arbeiter",       auth_tier_burrow_sub: "Monatlich · Einstieg",
    auth_tier_colony: "Kolonie",         auth_tier_colony_sub: "Monatlich · am beliebtesten",
    auth_tier_queen:  "Königin",         auth_tier_queen_sub:  "Monatlich · Top-Supporter",
    auth_email: "E-Mail",
    auth_password: "Passwort",
    auth_consent: "Mir ist klar, dass mein Abo eine Spende an <strong>team Naakte Molratten</strong> beim Samenloop Rosmalen ist, und ich verspreche, nicht enttäuscht zu sein, dass ich dafür nur Zugang zu ein paar Tierfotos bekomme.",
    auth_submit_signup_tmpl: "Spenden & freischalten — ${price} €/Monat",
    auth_submit_login: "Anmelden",
    auth_forgot: "Passwort vergessen?",
    auth_welcome_signup: "Willkommen in der Kolonie",
    auth_welcome_signup_copy: "Deine erste Spende ist auf dem Weg zu team Naakte Molratten. Schau in dein Postfach für deine Zugangsdaten.",
    auth_welcome_login: "Willkommen zurück",
    auth_welcome_login_copy: "Du wirst angemeldet…",
    auth_back: "← zurück",
    auth_loading: "Einen Moment…",
    auth_err_invalid_email: "Das sieht nicht nach einer gültigen E-Mail-Adresse aus.",
    auth_err_invalid_credentials: "Falsche E-Mail oder falsches Passwort. Versuch es erneut.",
    auth_err_email_in_use: "Diese E-Mail hat schon ein Konto — versuch dich anzumelden.",
    auth_err_weak_password: "Passwort zu schwach — verwende mindestens 6 Zeichen.",
    auth_err_too_many: "Zu viele Versuche. Kurz durchatmen und gleich nochmal versuchen.",
    auth_err_user_disabled: "Dieses Konto wurde deaktiviert.",
    auth_err_network: "Netzwerkproblem — prüfe deine Verbindung und versuch es erneut.",
    auth_err_need_email: "Gib zuerst oben deine E-Mail ein und tippe dann auf „Passwort vergessen?“.",
    auth_err_generic: "Im Tunnel ist etwas schiefgelaufen. Bitte versuch es erneut.",
    auth_reset_sent: "Zurücksetzungs-E-Mail gesendet — schau in dein Postfach.",
    auth_or: "oder",
    auth_google: "Weiter mit Google",
    auth_facebook: "Weiter mit Facebook",
    auth_err_account_exists: "Du hast dich bereits mit einer anderen Methode angemeldet — nutze diese zum Einloggen.",
    auth_err_popup_blocked: "Dein Browser hat das Anmeldefenster blockiert. Erlaube Pop-ups und versuch es erneut.",

    faq_eyebrow: "Häufige — und berechtigte — Fragen",
    faq_title: "Du hast bestimmt<br/><em>Fragen</em>.",
    faq_note: "Dumme Fragen gibt es nicht. Dumme Websites schon.",
    faq_q_1: "Ist das ein Witz?",
    faq_a_1: "Ja, aber Krebs ist kein Witz. Bitte spende.",
    faq_q_2: "Wer seid ihr?",
    faq_a_2: "Einfach ein paar Freunde, die Geld sammeln wollen — für einen guten Zweck.",
    faq_q_3: "Warum ein Nacktmull?",
    faq_a_3: "Forscher lieben sie: Nacktmulle <strong>bekommen so gut wie nie Krebs</strong>. Sie zu untersuchen könnte helfen zu verstehen, wie man ihn beim Menschen verhindert.",
    faq_q_4: "Wo leben Nacktmulle?",
    faq_a_4: "Am Horn von Afrika — unterirdisch, in Kolonien von bis zu 300 Tieren, in Tunneln, die sie mit ihren Zähnen graben.",
    faq_q_5: "Kann ich spenden, ohne diese hässlichen Tiere sehen zu müssen?",
    faq_a_5: "Natürlich. <a class=\"faq-link\" href=\"https://www.samenlooprosmalen.nl/donate-0mqdar\" target=\"_blank\" rel=\"noopener\">Folge diesem Link</a> — oder scanne den QR-Code. Augen geschont, Gewissen rein.",
    faq_q_6: "Sind die Bilder KI-generiert?",
    faq_a_6: "Ja. Wir haben versucht, echten Nacktmullen Mini-Bikinis anzuziehen. Hat nicht geklappt.",
    faq_q_7: "Habt ihr noch expliziteren Content?",
    faq_a_7: "Nein. Bitte sprich mit einem Arzt.",
    faq_qr_caption: "Scannen, um direkt zu spenden",
    faq_card_no: "Nr.",
    faq_card_row1_label: "Einträge",      faq_card_row1_value: "07",
    faq_card_row2_label: "Anliegen",      faq_card_row2_value: "Vernünftig",
    faq_card_row3_label: "Antworten",     faq_card_row3_value: "Fragwürdig",
    faq_card_row4_label: "Abgelegt unter",faq_card_row4_value: "Graben",

    charity_eyebrow: "Worum es wirklich geht",
    charity_title: "Das hier ist eine Spendenaktion,<br/>als Fanclub verkleidet.",
    charity_body: "<strong>Only Moles</strong> sammelt Geld für <strong>team Naakte Molratten</strong> beim <strong>Samenloop Rosmalen</strong> — einem 24-Stunden-Staffellauf für die Krebsforschung. Warum ein Nacktmull? Forscher untersuchen ihn seit Jahren, weil er <strong>so gut wie nie Krebs bekommt</strong>, und wir Menschen können viel von ihm lernen. Wir kommen unterirdisch vielleicht nicht so schnell voran wie ein Nacktmull — aber wir <em>graben</em> weiter. Für mehr Forschung. Bessere Behandlungen. Eine Welt mit weniger Krebs. <strong>100 % jedes Abos gehen direkt an die Spendenseite des Teams.</strong> Gemeinsam graben wir weiter.",
    charity_raised_tmpl: "${amount} € gesammelt",
    charity_goal_tmpl: "von ${amount} € Ziel",
    charity_cta_primary: "Abonnieren & spenden",
    charity_cta_secondary: "Spenden ohne Abo →",
    badge_team: "Team",

    foot_copy: "© 2026 Only Moles · eine Spendenaktion, kein echter Fanclub",

    share_eyebrow: "Sag's weiter",
    share_title: "Hilf uns <em>tiefer</em> zu graben.",
    share_subtitle: "Mehr Augen auf dieser Seite = mehr Spenden für team Naakte Molratten. Drei Sekunden — und teilen.",
    share_message: "Only Moles — der exklusivste Nacktmull-Fanclub des Internets. Jedes Abo unterstützt die Krebsforschung.",
    share_email_subject: "Diesen Nacktmull-Fanclub musst du sehen",
    share_copy: "Link kopieren",
    share_copied: "Link kopiert!",
    share_paste_hint: "Link kopiert — füg ihn in deinen Post ein!",
    foot_privacy: "Datenschutz",
    foot_contact: "Kontakt",
    foot_samenloop: "Samenloop Rosmalen ↗",
  },

  // ───────── Español ─────────
  es: {
    nav_peek: "Un vistazo",
    nav_cause: "La causa",
    nav_faq: "FAQ",
    nav_login: "Iniciar sesión",

    hero_headline: "El fanclub más <em>exclusivo</em><br/>de ratas topo desnudas de internet.",
    hero_lede: "Fotos diarias y momentos tras bambalinas de los mamíferos más extraños y arrugados de la Tierra. Cada suscripción es una donación al <strong>team Naakte Molratten</strong>, que recorre la Samenloop Rosmalen para la investigación contra el cáncer.",
    hero_cta_subscribe: "Suscríbete — desde 5 €/mes",
    hero_cta_member: "Ya soy miembro",

    stat_members: "miembros",
    stat_posts: "publicaciones",
    stat_raised: "recaudados hasta ahora",
    live_pill: "Nueva publicación · 1,2k me gusta",

    peek_eyebrow: "Un vistazo",
    peek_title: "Seis publicaciones nuevas esta semana.<br/>Todas bloqueadas.",
    peek_note: "Suscríbete para ver la colonia nítida →",
    members_only: "Solo miembros",
    sneak_preview: "Adelanto",
    modal_close: "Cerrar",
    modal_locked_msg: "Suscríbete para ver esta publicación y el resto de la colonia con nitidez.",
    modal_locked_cta: "Suscríbete — desde 5 €/mes",

    press_eyebrow: "Visto en",
    press_quote: "Atrevida, absurdamente elegante e imposible de cerrar.",
    press_attribution: "Caveoir Magazine · junio 2026",
    press_cover_alt: "Portada de Caveoir Magazine — junio 2026",
    press_badge: "En portada",

    tile_0_caption: "Subterráneo de Terciopelo",            tile_0_sub: "Hoy · edición terciopelo",
    tile_1_caption: "La reina Hilde concede audiencia",      tile_1_sub: "Ayer · 22 fotos",
    tile_2_caption: "Baño de arena en grupo",                tile_2_sub: "Hoy · 11 fotos",
    tile_3_caption: "Montón de crías, martes por la mañana", tile_3_sub: "Hace 3 d · 9 fotos",
    tile_4_caption: "Hora del snack",                        tile_4_sub: "La semana pasada · vídeo",
    tile_5_caption: "Eddy posa para la cámara",              tile_5_sub: "La semana pasada · 18 fotos",

    sub_eyebrow: "Únete a la colonia",
    sub_title: "Elige un nivel.<br/>Las ratas topo te lo agradecen.",
    sub_body: "Cada euro va directo al <strong>team Naakte Molratten</strong> en la Samenloop Rosmalen. Cancela cuando quieras — las arrugas, en cambio, son para siempre.",
    perk_1: "Fotos sin censura a diario desde la colonia",
    perk_2: "Aprende más de lo que querrías saber sobre la rata topo desnuda",
    perk_3: "Serie fotográfica de una rata topo con tu propio nombre desde el nivel de 25 €",
    perk_4: "El 100 % de las cuotas va a entidades sin ánimo de lucro de investigación y apoyo contra el cáncer",

    auth_tab_signup: "Suscribirse",
    auth_tab_login: "Iniciar sesión",
    auth_tier_burrow: "Obrera",         auth_tier_burrow_sub: "Mensual · nivel de entrada",
    auth_tier_colony: "Colonia",         auth_tier_colony_sub: "Mensual · el más popular",
    auth_tier_queen:  "Reina",           auth_tier_queen_sub:  "Mensual · gran patrocinador",
    auth_email: "Correo electrónico",
    auth_password: "Contraseña",
    auth_consent: "Entiendo que mi suscripción es una donación al <strong>team Naakte Molratten</strong> en la Samenloop Rosmalen, y prometo no decepcionarme de que solo me dé acceso a unas cuantas fotos de animales.",
    auth_submit_signup_tmpl: "Donar y desbloquear — ${price} €/mes",
    auth_submit_login: "Iniciar sesión",
    auth_forgot: "¿Olvidaste tu contraseña?",
    auth_welcome_signup: "Bienvenido a la colonia",
    auth_welcome_signup_copy: "Tu primera donación va de camino al team Naakte Molratten. Revisa tu bandeja de entrada.",
    auth_welcome_login: "Bienvenido de nuevo",
    auth_welcome_login_copy: "Iniciando sesión…",
    auth_back: "← volver",
    auth_loading: "Un momento…",
    auth_err_invalid_email: "Eso no parece una dirección de correo válida.",
    auth_err_invalid_credentials: "Correo o contraseña incorrectos. Inténtalo de nuevo.",
    auth_err_email_in_use: "Ese correo ya tiene una cuenta — intenta iniciar sesión.",
    auth_err_weak_password: "Contraseña demasiado débil — usa al menos 6 caracteres.",
    auth_err_too_many: "Demasiados intentos. Respira un poco e inténtalo en breve.",
    auth_err_user_disabled: "Esta cuenta ha sido deshabilitada.",
    auth_err_network: "Problema de red — comprueba tu conexión e inténtalo de nuevo.",
    auth_err_need_email: "Escribe primero tu correo arriba y luego toca «¿Olvidaste tu contraseña?».",
    auth_err_generic: "Algo salió mal en el túnel. Inténtalo de nuevo.",
    auth_reset_sent: "Correo de restablecimiento enviado — revisa tu bandeja de entrada.",
    auth_or: "o",
    auth_google: "Continuar con Google",
    auth_facebook: "Continuar con Facebook",
    auth_err_account_exists: "Ya te registraste con otro método — úsalo para iniciar sesión.",
    auth_err_popup_blocked: "Tu navegador bloqueó la ventana de inicio de sesión. Permite las ventanas emergentes e inténtalo de nuevo.",

    faq_eyebrow: "Preguntas frecuentes — y razonables",
    faq_title: "Seguro que tienes<br/><em>preguntas</em>.",
    faq_note: "No hay preguntas tontas. Webs tontas, sí.",
    faq_q_1: "¿Es esto una broma?",
    faq_a_1: "Sí, pero el cáncer no es ninguna broma. Dona, por favor.",
    faq_q_2: "¿Quiénes sois?",
    faq_a_2: "Solo unos amigos intentando recaudar dinero para una buena causa.",
    faq_q_3: "¿Por qué una rata topo?",
    faq_a_3: "A los investigadores les fascinan: las ratas topo desnudas <strong>casi nunca desarrollan cáncer</strong>. Estudiarlas podría ayudarnos a entender cómo prevenirlo en humanos.",
    faq_q_4: "¿Dónde viven las ratas topo desnudas?",
    faq_a_4: "En el Cuerno de África — bajo tierra, en colonias de hasta 300, en túneles que excavan con los dientes.",
    faq_q_5: "¿Puedo donar sin tener que ver a esos animales feos?",
    faq_a_5: "Claro. <a class=\"faq-link\" href=\"https://www.samenlooprosmalen.nl/donate-0mqdar\" target=\"_blank\" rel=\"noopener\">Sigue este enlace</a> — o escanea el QR. Ojos a salvo, conciencia tranquila.",
    faq_q_6: "¿Las imágenes son generadas por IA?",
    faq_a_6: "Sí. Intentamos ponerle minibikinis a ratas topo reales. No salió bien.",
    faq_q_7: "¿Tenéis contenido aún más explícito?",
    faq_a_7: "No. Consulta a un médico.",
    faq_qr_caption: "Escanea para donar directamente",
    faq_card_no: "N.º",
    faq_card_row1_label: "Entradas",      faq_card_row1_value: "07",
    faq_card_row2_label: "Consultas",     faq_card_row2_value: "Razonables",
    faq_card_row3_label: "Respuestas",    faq_card_row3_value: "Dudosas",
    faq_card_row4_label: "Archivado en",  faq_card_row4_value: "Cavar",

    charity_eyebrow: "El verdadero motivo",
    charity_title: "Esto es una recaudación<br/>disfrazada de fanclub.",
    charity_body: "<strong>Only Moles</strong> recauda fondos para el <strong>team Naakte Molratten</strong> en la <strong>Samenloop Rosmalen</strong> — un relevo de 24 horas para la investigación contra el cáncer. ¿Por qué una rata topo desnuda? Los investigadores la estudian desde hace años porque <strong>casi nunca desarrolla cáncer</strong>, y los humanos tenemos mucho que aprender de ella. Quizá no avanzamos bajo tierra tan rápido como una rata topo — pero seguimos <em>cavando</em>. Por más investigación. Mejores tratamientos. Un mundo con menos cáncer. <strong>El 100 % de cada suscripción va directamente a la página de recaudación del equipo.</strong> Juntos seguimos cavando.",
    charity_raised_tmpl: "${amount} € recaudados",
    charity_goal_tmpl: "de ${amount} € objetivo",
    charity_cta_primary: "Suscribirse y donar",
    charity_cta_secondary: "Donar sin suscribirse →",
    badge_team: "Equipo",

    share_eyebrow: "Corre la voz",
    share_title: "Ayúdanos a cavar <em>más hondo</em>.",
    share_subtitle: "Más miradas en esta página = más donaciones al team Naakte Molratten. Tres segundos y a compartir.",
    share_message: "Only Moles — el fanclub más exclusivo de ratas topo desnudas de internet. Cada suscripción financia la investigación contra el cáncer.",
    share_email_subject: "Tienes que ver este fanclub de ratas topo desnudas",
    share_copy: "Copiar enlace",
    share_copied: "¡Enlace copiado!",
    share_paste_hint: "¡Enlace copiado — pégalo en tu publicación!",

    foot_copy: "© 2026 Only Moles · una recaudación, no un fanclub de verdad",
    foot_privacy: "Privacidad",
    foot_contact: "Contacto",
    foot_samenloop: "Samenloop Rosmalen ↗",
  },
};

// ─── useLang hook ───────────────────────────────────────────────────────
function useLang() {
  const [lang, setLangState] = React.useState(() => {
    try {
      const saved = localStorage.getItem("om-lang");
      if (saved && I18N[saved]) return saved;
    } catch (_) {}
    return "nl";
  });
  const setLang = React.useCallback((l) => {
    setLangState(l);
    try { localStorage.setItem("om-lang", l); } catch (_) {}
    document.documentElement.lang = l;
  }, []);
  React.useEffect(() => { document.documentElement.lang = lang; }, [lang]);

  const dict = I18N[lang] || I18N.en;
  const t = React.useCallback((key, vars) => {
    let str = dict[key] != null ? dict[key] : (I18N.en[key] != null ? I18N.en[key] : key);
    if (vars) {
      for (const k of Object.keys(vars)) {
        str = str.split("${" + k + "}").join(String(vars[k]));
      }
    }
    return str;
  }, [dict]);
  // Inline-HTML helper for dangerouslySetInnerHTML props
  const tHtml = React.useCallback((key, vars) => ({
    dangerouslySetInnerHTML: { __html: t(key, vars) },
  }), [t]);

  return { lang, setLang, t, tHtml };
}

// ─── LanguageSwitcher ───────────────────────────────────────────────────
function LanguageSwitcher({ lang, setLang }) {
  const [open, setOpen] = React.useState(false);
  const ref = React.useRef(null);

  React.useEffect(() => {
    if (!open) return;
    const close = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    const esc = (e) => { if (e.key === "Escape") setOpen(false); };
    document.addEventListener("mousedown", close);
    document.addEventListener("keydown", esc);
    return () => {
      document.removeEventListener("mousedown", close);
      document.removeEventListener("keydown", esc);
    };
  }, [open]);

  const current = LANGS.find((l) => l.code === lang) || LANGS[0];

  return (
    <div className="lang-switch" ref={ref}>
      <button className={`lang-btn ${open ? "is-open" : ""}`} onClick={() => setOpen((o) => !o)} aria-haspopup="listbox" aria-expanded={open}>
        <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
          <circle cx="12" cy="12" r="9" />
          <path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18" />
        </svg>
        <span>{current.short}</span>
        <svg viewBox="0 0 24 24" width="11" height="11" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
          <path d="M6 9l6 6 6-6" />
        </svg>
      </button>
      {open && (
        <div className="lang-menu" role="listbox">
          {LANGS.map((l) => (
            <button
              key={l.code}
              role="option"
              aria-selected={l.code === lang}
              className={`lang-opt ${l.code === lang ? "is-active" : ""}`}
              onClick={() => { setLang(l.code); setOpen(false); }}
            >
              <span className="lang-opt-short">{l.short}</span>
              <span className="lang-opt-name">{l.name}</span>
              {l.code === lang && (
                <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
                  <path d="M4 12.5l5 5L20 7" />
                </svg>
              )}
            </button>
          ))}
        </div>
      )}
    </div>
  );
}

Object.assign(window, { LANGS, I18N, useLang, LanguageSwitcher });
