// i18n — runtime DOM translation for every page.
// Loads after shared.jsx, BEFORE site-chrome.jsx, and overrides window.LangToggle.
//
// Strategy: walk the DOM, match each text node's trimmed content against the FR dictionary.
// Toggling EN/FR re-runs the walk. Persists to localStorage.

(function () {
  // ─── Dictionary: exact English → French ────────────────────────────
  // Keys are matched against trimmed text node content.
  // Order of insertion = order of lookup (longer phrases first, then micro-copy).
  const FR = {
    // ——— NAV / UI ———
    "The Agency": "L'Agence",
    "Universes": "Univers",
    "Membership": "Adhésion",
    "Aurum": "Aurum",
    "Request access": "Demander l'accès",
    "Request access →": "Demander l'accès →",

    // ——— FOOTER ———
    "Elite Private Agency": "Elite Private Agency",
    "Paris · London · Dubai": "Paris · Londres · Dubaï",
    "A private atelier, since 2022.": "Un atelier privé, depuis 2022.",
    "Agency": "Agence",
    "About": "À propos",
    "Access": "Accès",
    "Pay as you go": "À la carte",
    "Contact": "Contact",
    "Follow the atelier": "Suivre l'atelier",
    "© 2026 Elite Private Agency · All rights reserved": "© 2026 Elite Private Agency · Tous droits réservés",
    "Legal": "Mentions légales",
    "Privacy": "Confidentialité",
    "Cookies": "Cookies",

    // ——— HOME · HERO ———
    "— Chapitre 01 · Préambule": "— Chapitre 01 · Préambule",
    "A private": "Un atelier",
    "atelier": "privé",
    "of desires.": "de désirs.",
    "Elite Private Agency is not a simple company. It is an atelier — where a handful of concierges compose journeys, evenings, and arrangements for those who require discretion as a standard.":
      "Elite Private Agency n'est pas une simple entreprise. C'est un atelier — où quelques concierges composent voyages, soirées et arrangements pour ceux qui font de la discrétion un standard.",
    "Founder": "Fondateur",
    "On call · 24/7": "À votre service · 24/7",
    "Paris": "Paris",
    "VIP arrangement · Nathan Collins": "Arrangement VIP · Nathan Collins",

    // ——— HOME · MANIFESTO ———
    "— Chapitre 02 · Manifeste": "— Chapitre 02 · Manifeste",
    "“Serving you is not a slogan. It is a protocol — quiet, precise, orchestrated before you have finished asking.”":
      "« Vous servir n'est pas un slogan. C'est un protocole — discret, précis, orchestré avant même que votre demande ne soit formulée. »",

    // ——— HOME · UNIVERSES ———
    "— Chapitre 03 · Univers": "— Chapitre 03 · Univers",
    "Three disciplines,": "Trois disciplines,",
    "one atelier.": "un atelier.",
    "Concierge services": "Services de conciergerie",
    "Conciergerie": "Conciergerie",
    "Your day, arranged before you think of it. A private driver, a florist at sunrise, an unlisted table, a tailor at your suite. The aspects of life that deserve quiet management.":
      "Votre journée, arrangée avant même que vous n'y pensiez. Un chauffeur privé, un fleuriste à l'aube, une table confidentielle, un tailleur à votre suite. Les aspects de la vie qui méritent une gestion silencieuse.",
    "Travel agency": "Agence de voyage",
    "Voyage": "Voyage",
    "Private residences from Saint-Barth to Courchevel. Commercial and private aviation. Yachts crewed and routed. Itineraries composed, not booked.":
      "Résidences privées de Saint-Barth à Courchevel. Aviation commerciale et privée. Yachts équipés et pilotés. Itinéraires composés, non réservés.",
    "Events": "Événements",
    "Événements": "Événements",
    "Birthdays in London. Weddings in Capri. Private concerts, closed venues, access that cannot be purchased — orchestrated end to end.":
      "Anniversaires à Londres. Mariages à Capri. Concerts privés, lieux fermés, accès qui ne s'achètent pas — orchestrés de bout en bout.",

    // ——— HOME · MEMBERSHIP (two ways in) ———
    "— Chapitre 04 · Adhésion": "— Chapitre 04 · Adhésion",
    "Two ways in.": "Deux manières d'entrer.",
    "Pay only for what you request. Or hold a seat at the atelier — with priorities, standing arrangements, and a concierge on retainer.":
      "Payez uniquement ce que vous demandez. Ou occupez une place à l'atelier — priorités, arrangements permanents, concierge dédié.",
    "À la carte": "À la carte",
    "No retainer": "Sans engagement",
    "Engage the atelier one request at a time. Billed per arrangement, fully transparent, at the same tariff as our members.":
      "Sollicitez l'atelier demande par demande. Facturé à la prestation, en toute transparence, au même tarif que nos membres.",
    "One-off requests": "Demandes ponctuelles",
    "Member-equal pricing": "Tarif égal aux membres",
    "48h response time": "Réponse sous 48 h",
    "No commitment": "Sans engagement",
    "Private Circle": "Cercle Privé",
    "By invitation": "Sur invitation",
    "A seat at the atelier. Standing preferences on file. A dedicated concierge. Priority over non-members on every booking.":
      "Une place à l'atelier. Préférences permanentes au dossier. Concierge dédié. Priorité sur les non-membres pour chaque réservation.",
    "Dedicated concierge": "Concierge dédié",
    "2h response · 24/7": "Réponse sous 2 h · 24/7",
    "Standing preferences": "Préférences permanentes",
    "Priority access": "Accès prioritaire",
    "Complimentary upgrades": "Surclassements offerts",
    "Recommended": "Recommandé",
    "Request invitation": "Demander une invitation",
    "Make a request": "Formuler une demande",

    // ——— HOME · PARTNERS ———
    "— Chapitre 05 · Maisons partenaires": "— Chapitre 05 · Maisons partenaires",
    "— Chapitre 05 · Partner houses": "— Chapitre 05 · Maisons partenaires",
    "The houses we work with.": "Les maisons avec lesquelles nous travaillons.",
    "The houses we": "Les maisons avec lesquelles",
    "work with.": "nous travaillons.",
    "Preferred partners across Europe and beyond — where our members are received as ours, not as guests.":
      "Partenaires privilégiés en Europe et au-delà — où nos membres sont reçus comme nos hôtes, non comme des clients.",
    "& forty-two others, on four continents.": "& quarante-deux autres, sur quatre continents.",

    // ——— HOME · TESTIMONIALS ———
    "— Chapitre 06 · Voix": "— Chapitre 06 · Voix",
    "A birthday in London, organised in forty-eight hours — down to the calligrapher who painted our daughter's name on the cake.":
      "Un anniversaire à Londres, organisé en quarante-huit heures — jusqu'au calligraphe qui a peint le prénom de notre fille sur le gâteau.",
    "Member · Geneva": "Membre · Genève",
    "Member · London": "Membre · Londres",
    "Member · Madrid": "Membre · Madrid",
    "Members · Hong Kong": "Membres · Hong Kong",
    "Member · Paris": "Membre · Paris",
    "Concierge": "Conciergerie",
    "Travel": "Voyage",
    "They know my coffee. They know my driver. They know which seat I prefer at Le Cinq. That is the work.":
      "Ils connaissent mon café. Ils connaissent mon chauffeur. Ils savent quelle place je préfère au Cinq. C'est cela, le travail.",
    "Three weeks in the Cyclades — crew, chef, route and last-minute changes. Not one detail I had to manage myself.":
      "Trois semaines dans les Cyclades — équipage, chef, itinéraire et changements de dernière minute. Pas un détail à gérer moi-même.",
    "Our wedding in Capri felt like a private island. Ninety guests, zero press, one brief to the atelier.":
      "Notre mariage à Capri s'est déroulé comme sur une île privée. Quatre-vingt-dix invités, zéro presse, un seul briefing à l'atelier.",
    "A suite, a tailor, a jeweller, a table — arranged before my flight landed. They simply anticipate.":
      "Une suite, un tailleur, un joaillier, une table — arrangés avant même que mon avion ne se pose. Ils anticipent, tout simplement.",

    // ——— HOME · AURUM TEASER ———
    "— Chapitre 07 · Aurum": "— Chapitre 07 · Aurum",
    "in your pocket.": "dans votre poche.",
    "The atelier,": "L'atelier,",
    "Aurum is our companion application — a private line to your concierge, a notebook of preferences, and a curated atlas of places, people and arrangements. By invitation only.":
      "Aurum est notre application compagnon — une ligne privée vers votre concierge, un carnet de préférences et un atlas choisi de lieux, de personnes et d'arrangements. Sur invitation uniquement.",
    "Discover Aurum": "Découvrir Aurum",

    // ——— HOME · INSTAGRAM ———
    "— Follow the atelier —": "— Suivre l'atelier —",
    "Glimpses,": "Aperçus,",
    "in passing.": "au fil de l'eau.",
    "Follow us on Instagram": "Suivez-nous sur Instagram",
    "Paris · Le Bristol": "Paris · Le Bristol",
    "Porto Cervo · July": "Porto Cervo · juillet",
    "Capri · private dinner": "Capri · dîner privé",
    "Gstaad · first light": "Gstaad · première lueur",
    "Monte-Carlo · transfer": "Monte-Carlo · transfert",
    "London · atelier": "Londres · atelier",

    // ——— AGENCY PAGE ———
    "— Chapitre 01 · The agency": "— Chapitre 01 · L'agence",
    "A quiet": "Un atelier",
    "atelier.": "discret.",
    "Elite Private Agency is a private lifestyle management, wealth management and event planning company — composed for individuals and corporations whose time, schedules, and standards require global, all-inclusive service.":
      "Elite Private Agency est une société privée de gestion de style de vie, de gestion de patrimoine et d'organisation d'événements — composée pour les particuliers et les entreprises dont le temps, les agendas et les standards exigent un service global et tout compris.",

    "— Chapitre 02 · Origins": "— Chapitre 02 · Origines",
    "Founded by an ex-banker": "Fondée par un ex-banquier",
    "and athletes.": "et des athlètes.",
    "Elite Private Agency was founded in 2022 by three partners — active and retired professional footballers alongside a seasoned team of investment professionals. A coincidence of worlds: one accustomed to performance and privacy on the pitch, the other to discretion and precision in finance.":
      "Elite Private Agency a été fondée en 2022 par trois associés — footballeurs professionnels en activité et retraités, aux côtés d'une équipe chevronnée de professionnels de l'investissement. Une rencontre de deux mondes : l'un habitué à la performance et à la vie privée sur le terrain, l'autre à la discrétion et à la précision en finance.",
    "From that intersection came a conviction: the people our founders came to serve — athletes, executives, families of standing — were asking for the same thing and finding it nowhere. A private atelier that could arrange a suite, a charter, a wedding, a portfolio introduction, a driver at 3 a.m. — with the same quiet protocol.":
      "De cette intersection est née une conviction : les personnes que nos fondateurs en sont venus à servir — athlètes, dirigeants, familles de rang — demandaient toutes la même chose, introuvable ailleurs. Un atelier privé capable d'arranger une suite, un charter, un mariage, une mise en relation, un chauffeur à 3 h du matin — avec le même protocole silencieux.",
    "Four years later, we remain small by design. The atelier answers, not a call center. Names are on file, preferences remembered, protocols rehearsed.":
      "Quatre ans plus tard, nous restons petits par choix. C'est l'atelier qui répond, pas un centre d'appels. Les noms sont au dossier, les préférences retenues, les protocoles répétés.",
    "VIP arrangement · Benoit Kounkoud": "Arrangement VIP · Benoit Kounkoud",

    "— Chapitre 03 · Figures": "— Chapitre 03 · Chiffres",
    "The atelier in": "L'atelier en",
    "figures.": "chiffres.",
    "Members": "Membres",
    "Requests": "Demandes",
    "Handled each year": "Traitées chaque année",
    "Luxury hotels": "Hôtels de luxe",
    "Worldwide partnerships": "Partenariats mondiaux",
    "Countries": "Pays",
    "Partners on the ground": "Partenaires sur le terrain",
    "Languages": "Langues",
    "French · English · Spanish · German": "Français · anglais · espagnol · allemand",
    "Cities": "Villes",
    "Paris · London · Dubai": "Paris · Londres · Dubaï",
    "Response": "Réponse",
    "2h average, day and night": "2 h en moyenne, jour et nuit",
    "Founded": "Fondée",
    "Four years of service": "Quatre ans de service",

    "— Chapitre 04 · Hotel privileges": "— Chapitre 04 · Privilèges hôteliers",
    "Received": "Reçus",
    "as ours": "comme les nôtres",
    "not as guests.": "non comme des clients.",
    "Through partnerships with five thousand luxury houses worldwide, our members are extended the following privileges at every stay — without request, without negotiation.":
      "Grâce à nos partenariats avec cinq mille maisons de luxe dans le monde, nos membres bénéficient à chaque séjour des privilèges suivants — sans demande, sans négociation.",
    "Daily breakfast": "Petit-déjeuner quotidien",
    "For two guests, each morning": "Pour deux personnes, chaque matin",
    "Room upgrade": "Surclassement",
    "Priority or guaranteed, subject to availability": "Prioritaire ou garanti, selon disponibilité",
    "Hotel credit": "Crédit hôtelier",
    "$100 per stay, applied on property": "100 $ par séjour, appliqué sur place",
    "Early / late arrivals": "Arrivées anticipées / tardives",
    "Priority check-in and check-out": "Check-in et check-out prioritaires",
    "Personal welcome": "Accueil personnalisé",
    "A note, a preference, something remembered": "Un mot, une préférence, un détail retenu",
    "& further privileges": "& autres privilèges",
    "Varying by house — spa, dining, transfers": "Selon la maison — spa, restauration, transferts",
    "Preferred partners · worldwide": "Partenaires privilégiés · dans le monde",

    "— Chapitre 05 · Presence": "— Chapitre 05 · Présence",
    "Three": "Trois",
    "offices,": "bureaux,",
    "one hundred borders.": "cent frontières.",
    "Home offices in three cities. Local partners in over a hundred countries. Multilingual service, day and night.":
      "Maisons mères dans trois villes. Partenaires locaux dans plus de cent pays. Service multilingue, jour et nuit.",
    "Maison mère": "Maison mère",
    "Bureau": "Bureau",
    "London": "Londres",
    "Dubai": "Dubaï",
    "Spoken at the atelier": "Langues parlées à l'atelier",

    "— Chapitre 06 · Clientèle": "— Chapitre 06 · Clientèle",
    "For": "Pour",
    "individuals": "les particuliers",
    "corporations.": "les entreprises.",
    "Private individuals": "Clients particuliers",
    "Members & families": "Membres & familles",
    "Heads of household, heirs, founders, public figures, athletes and their families — for whom discretion is a baseline and time the scarcest asset.":
      "Chefs de famille, héritiers, fondateurs, personnalités publiques, athlètes et leurs familles — pour qui la discrétion est un pré-requis et le temps la ressource la plus rare.",
    "Family travel · multi-generational": "Voyages en famille · multi-générationnels",
    "Relocation & schooling": "Relocation & scolarité",
    "Personal shopping · atelier visits": "Personal shopping · visites d'atelier",
    "Events · anniversaries · weddings": "Événements · anniversaires · mariages",
    "On-call concierge · 24/7": "Concierge disponible · 24/7",
    "Corporate clients": "Clients entreprise",
    "Offices, funds, partnerships": "Bureaux, fonds, partenariats",
    "Investment offices, family offices, clubs and firms retaining the atelier on behalf of their principals and their visiting counterparts.":
      "Bureaux d'investissement, family offices, clubs et cabinets qui sollicitent l'atelier pour le compte de leurs clients et de leurs invités en déplacement.",
    "Executive travel & transfers": "Voyages dirigeants & transferts",
    "Private aviation & yacht charter": "Aviation privée & affrètement de yacht",
    "Board retreats · offsites": "Retraites de conseil · séminaires",
    "Client hospitality · entertainment": "Accueil clients · loisirs",
    "Corporate membership · on retainer": "Adhésion entreprise · forfait annuel",

    "— The atelier": "— L'atelier",
    "Write to us — a concierge replies within one hour.": "Écrivez-nous — un concierge vous répond sous une heure.",
    "Formulate a request": "Formuler une demande",
    "Discover membership": "Découvrir l'adhésion",

    // ——— UNIVERSES PAGE ———
    "— Chapitre 01 · The universes": "— Chapitre 01 · Les univers",
    "one atelier.": "un atelier.",
    "Hover each plate to read its detail. One brief, one concierge — across all three universes.":
      "Survolez chaque planche pour en lire le détail. Un seul briefing, un seul concierge — pour les trois univers.",
    "Your day, arranged.": "Votre journée, arrangée.",
    "A private driver, a florist at sunrise, an unlisted table, a tailor at your suite, a personal shopper at the atelier. The aspects of life that deserve quiet management — rehearsed, remembered, anticipated.":
      "Un chauffeur privé, un fleuriste à l'aube, une table confidentielle, un tailleur à votre suite, un personal shopper à l'atelier. Les aspects de la vie qui méritent une gestion silencieuse — répétés, retenus, anticipés.",
    "Dining · unlisted tables": "Restauration · tables confidentielles",
    "Transfers · drivers": "Transferts · chauffeurs",
    "Florists · gifts · couture": "Fleuristes · cadeaux · couture",
    "Wellness · doctors · spas": "Bien-être · médecins · spas",
    "Relocation · schooling · staff": "Relocation · scolarité · personnel",
    "Itineraries composed, not booked.": "Itinéraires composés, non réservés.",
    "Private residences from Saint-Barth to Courchevel. Commercial and private aviation. Yachts crewed and routed. Itineraries composed by hand — with the 5,000 luxury houses we work with, and our partners in a hundred countries.":
      "Résidences privées de Saint-Barth à Courchevel. Aviation commerciale et privée. Yachts équipés et pilotés. Itinéraires composés à la main — avec les 5 000 maisons de luxe avec lesquelles nous travaillons, et nos partenaires dans une centaine de pays.",
    "Private villas & residences": "Villas & résidences privées",
    "Private aviation & charters": "Aviation privée & affrètements",
    "Yacht charter & routing": "Affrètement & routage de yachts",
    "Hotel benefits (breakfast · upgrade · $100 credit)": "Privilèges hôteliers (petit-déjeuner · surclassement · crédit 100 $)",
    "Ski season · beach season": "Saison ski · saison balnéaire",
    "Family travel · multi-generational": "Voyages en famille · multi-générationnels",
    "Evenings, orchestrated.": "Soirées, orchestrées.",
    "Birthdays in London. Weddings in Capri. Corporate retreats, private concerts, closed venues, access that cannot be purchased — orchestrated end to end, with one brief to the atelier.":
      "Anniversaires à Londres. Mariages à Capri. Séminaires d'entreprise, concerts privés, lieux fermés, accès qui ne s'achètent pas — orchestrés de bout en bout, avec un seul briefing à l'atelier.",
    "Weddings · private ceremonies": "Mariages · cérémonies privées",
    "Birthdays · anniversaries": "Anniversaires · fêtes",
    "Corporate retreats · board offsites": "Séminaires · retraites de conseil",
    "Private concerts · performances": "Concerts privés · représentations",
    "Closed venues · exclusive access": "Lieux fermés · accès exclusifs",
    "Hover each plate — the atelier reveals its detail.": "Survolez chaque planche — l'atelier en révèle le détail.",

    "— Chapitre 02 · The process": "— Chapitre 02 · Le processus",
    "How it": "Comment cela",
    "works.": "fonctionne.",
    "From your first message to your return home — four movements, one concierge, at your service.":
      "De votre premier message à votre retour — quatre mouvements, un concierge, à votre service.",
    "Request": "Demande",
    "Tell us the city, the dates, the budget. In a sentence or two — as you would speak to a friend.":
      "Dites-nous la ville, les dates, le budget. En une phrase ou deux — comme à un ami.",
    "City & dates": "Ville & dates",
    "Budget range": "Fourchette budgétaire",
    "Who is travelling": "Qui voyage",
    "Options": "Propositions",
    "Your concierge returns with options — preferences matched, availabilities checked, nothing confirmed.":
      "Votre concierge revient avec des propositions — préférences prises en compte, disponibilités vérifiées, rien de confirmé.",
    "Hotel type · mood": "Type d'hôtel · ambiance",
    "Activities & dining": "Activités & restauration",
    "Availability verified": "Disponibilités vérifiées",
    "Confirmed": "Confirmation",
    "You select. We confirm — payment, bookings, and a full itinerary delivered to your inbox.":
      "Vous choisissez. Nous confirmons — règlement, réservations, et un itinéraire complet livré dans votre boîte mail.",
    "Single payment": "Règlement unique",
    "Bookings confirmed": "Réservations confirmées",
    "Itinerary delivered": "Itinéraire livré",
    "Support": "Accompagnement",
    "Throughout the journey — a concierge on call, day and night, for any adjustment or unexpected wish.":
      "Tout au long du voyage — un concierge disponible, jour et nuit, pour tout ajustement ou désir imprévu.",
    "24/7 on call": "Disponible 24/7",
    "Changes handled": "Modifications prises en charge",
    "Wishes anticipated": "Désirs anticipés",
    "Average response time — two hours, day and night.": "Temps de réponse moyen — deux heures, jour et nuit.",

    "— Begin": "— Commencer",
    "Write your first request. We take care of the rest.": "Écrivez votre première demande. Nous nous occupons du reste.",
    "Become a member": "Devenir membre",

    // ——— MEMBERSHIP PAGE ———
    "— Chapitre 01 · Private Circle": "— Chapitre 01 · Cercle Privé",
    "A seat": "Une place",
    "at the atelier.": "à l'atelier.",
    "The Private Circle is our membership — closed, small by design, and by invitation only. Names on file, preferences remembered, a dedicated concierge on call day and night.":
      "Le Cercle Privé est notre adhésion — fermée, volontairement restreinte, et sur invitation uniquement. Noms au dossier, préférences retenues, un concierge dédié disponible jour et nuit.",

    "— Chapitre 02 · Two paths": "— Chapitre 02 · Deux voies",
    "Two ways to engage": "Deux manières de solliciter",
    "the atelier.": "l'atelier.",
    "Request by request, or under retainer. Both at the same tariff. Members are served first.":
      "Demande par demande, ou en forfait annuel. Au même tarif dans les deux cas. Les membres sont servis en premier.",

    "No retainer · No commitment": "Sans forfait · Sans engagement",
    "Engage the atelier one request at a time. Fully transparent, at the same tariff as our members — without a retainer. Right for a first arrangement, or for clients whose needs are occasional.":
      "Sollicitez l'atelier demande par demande. En toute transparence, au même tarif que nos membres — sans forfait. Idéal pour un premier arrangement, ou pour des besoins occasionnels.",
    "Open to any request": "Ouvert à toute demande",
    "Member-equal tariff": "Tarif égal aux membres",
    "Quotation before confirmation": "Devis avant confirmation",
    "24-hour response time": "Réponse sous 24 h",
    "20% service charge": "Frais de service de 20 %",

    "Annual · Renewed on review": "Annuel · Renouvelé après entretien",
    "A seat at the atelier. Standing preferences on file, a dedicated concierge, and priority over non-members on every booking. Limited by design — closed between one hundred fifty and two hundred members.":
      "Une place à l'atelier. Préférences permanentes au dossier, concierge dédié, priorité sur les non-membres pour chaque réservation. Volontairement restreint — fermé entre cent cinquante et deux cents membres.",
    "Standing preferences on file": "Préférences permanentes au dossier",
    "Priority over non-members": "Priorité sur les non-membres",
    "Complimentary upgrades (when available)": "Surclassements offerts (selon disponibilité)",
    "10% service charge": "Frais de service de 10 %",
    "0% on hotel bookings": "0 % sur les réservations d'hôtel",
    "Introductions within the Circle": "Mises en relation au sein du Cercle",
    "Request an invitation": "Demander une invitation",

    "— Chapitre 03 · Privileges": "— Chapitre 03 · Privilèges",
    "What the Circle": "Ce que reçoit",
    "receives.": "le Cercle.",
    "Two concierges, day & night": "Deux concierges, jour & nuit",
    "One atelier, two voices — working in relay so you are never out of reach.":
      "Un seul atelier, deux voix — en relais, pour que vous ne soyez jamais hors de portée.",
    "A senior concierge leads your account by day; a night concierge takes the desk from nine in the evening to nine in the morning, Paris time. Both know your preferences, your schedule, and the names of those travelling with you. One call, one message, any hour — a human answers.":
      "Un concierge senior gère votre compte en journée ; un concierge de nuit prend le relais de 21 h à 9 h, heure de Paris. Tous deux connaissent vos préférences, votre agenda, et les noms de ceux qui voyagent avec vous. Un appel, un message, à toute heure — un humain répond.",
    "24h · Paris · London · New York": "24 h · Paris · Londres · New York",
    "Priority, always": "Priorité, toujours",
    "Tables, suites, upgrades, closed events. Members come first.":
      "Tables, suites, surclassements, événements fermés. Les membres passent d'abord.",
    "When availability is scarce — a first night at a three-star, a suite during Couture Week, a box at the opera — your requests sit at the top of the brief. Our partners know the Circle by name, and reserve capacity we then quietly distribute among our members.":
      "Quand la disponibilité se fait rare — une première au trois étoiles, une suite pendant la Semaine de la Couture, une loge à l'opéra — vos demandes sont en tête de liste. Nos partenaires connaissent le Cercle par son nom, et réservent une capacité que nous redistribuons ensuite discrètement à nos membres.",
    "Preferred-partner status · 280 houses": "Statut partenaire privilégié · 280 maisons",
    "Rehearsed once, remembered always — across all three cities.":
      "Noté une fois, retenu toujours — dans nos trois villes.",
    "Your coffee at Le Bristol. Your driver in Milan. Your seat at Le Cinq, and the champagne you prefer poured before you arrive. Every standing arrangement is noted in your dossier and honoured by the atelier, whichever concierge happens to take your call.":
      "Votre café au Bristol. Votre chauffeur à Milan. Votre table au Cinq, et le champagne que vous préférez, servi avant votre arrivée. Chaque arrangement permanent est consigné à votre dossier et honoré par l'atelier, quel que soit le concierge qui prend votre appel.",
    "Private dossier · reviewed yearly": "Dossier privé · révisé chaque année",
    "— Day concierge": "— Concierge de jour",
    "Night concierge —": "Concierge de nuit —",
    "09:00 — 21:00 · Paris": "09 h 00 — 21 h 00 · Paris",
    "21:00 — 09:00 · Paris": "21 h 00 — 09 h 00 · Paris",

    "5,000+ houses,": "5 000+ maisons,",
    "one benefit card.": "une seule carte de privilèges.",
    "Through our partnerships with five thousand luxury houses, every stay booked by the atelier carries the following privileges — for members and pay-as-you-go alike.":
      "Grâce à nos partenariats avec cinq mille maisons de luxe, chaque séjour réservé par l'atelier bénéficie des privilèges suivants — pour les membres comme pour les clients à la carte.",
    "Daily breakfast for two": "Petit-déjeuner quotidien pour deux",
    "Priority or guaranteed upgrade": "Surclassement prioritaire ou garanti",
    "$100 credit per stay": "Crédit de 100 $ par séjour",
    "Early check-in · late check-out priority": "Check-in anticipé · check-out tardif prioritaires",
    "Further privileges per house": "Autres privilèges selon la maison",
    "5,000+ houses, worldwide": "5 000+ maisons, dans le monde",

    "— Chapitre 05 · The door": "— Chapitre 05 · La porte",
    "— Chapitre 06 · The door": "— Chapitre 06 · La porte",
    "How one is": "Comment on est",
    "invited.": "invité.",
    "Three quiet steps. No public enrolment. No waitlist in the conventional sense — only a conversation, and a decision.":
      "Trois étapes discrètes. Aucune inscription publique. Aucune liste d'attente au sens classique — seulement une conversation, et une décision.",
    "An introduction": "Une introduction",
    "Write to us, or be introduced by a member. Tell us a little about yourself — where you live, what you travel for, what you expect of an atelier.":
      "Écrivez-nous, ou soyez introduit par un membre. Parlez-nous un peu de vous — où vous vivez, ce qui vous fait voyager, ce que vous attendez d'un atelier.",
    "A conversation": "Une conversation",
    "A founder or senior concierge calls you. Thirty minutes, no pitch — only to understand whether the atelier can serve you well, and whether you will enjoy being served by us.":
      "Un fondateur ou un concierge senior vous appelle. Trente minutes, aucun discours commercial — seulement pour comprendre si l'atelier peut bien vous servir, et si vous prendrez plaisir à être servi par nous.",
    "The invitation": "L'invitation",
    "If it suits both parties, an invitation is extended. A dedicated concierge is assigned, preferences are taken, and the first arrangement begins.":
      "Si cela convient aux deux parties, une invitation est adressée. Un concierge dédié est affecté, les préférences sont recueillies, et le premier arrangement commence.",

    "— Chapitre 06 · Invitation": "— Chapitre 06 · Invitation",
    "— Chapitre 07 · Invitation": "— Chapitre 07 · Invitation",
    "Request an invitation.": "Demander une invitation.",
    "A founder will reply within twenty-four hours.": "Un fondateur vous répondra sous vingt-quatre heures.",
    "Full name": "Nom complet",
    "Email": "E-mail",
    "City of residence": "Ville de résidence",
    "Introduced by (optional)": "Introduit par (facultatif)",
    "A word about yourself": "Quelques mots sur vous",
    "What do you travel for · what do you expect of an atelier · any houses, cities, or arrangements worth mentioning.":
      "Ce qui vous fait voyager · ce que vous attendez d'un atelier · maisons, villes ou arrangements à mentionner.",
    "Send request": "Envoyer la demande",
    "All correspondence is held in confidence — within the atelier, and no further.":
      "Toute correspondance est tenue confidentielle — au sein de l'atelier, et nulle part ailleurs.",

    // ——— AURUM PAGE ———
    "— Coming · End of 2026 —": "— À paraître · fin 2026 —",
    "— An atelier venture": "— Une initiative de l'atelier",
    "Only the Gold Standard.": "Uniquement le Gold Standard.",
    "The atelier's own address book — made legible. A founder-curated venue intelligence, for members of the Private Circle and those they travel with.":
      "Le carnet d'adresses de l'atelier — rendu lisible. Une intelligence des lieux sélectionnée par les fondateurs, pour les membres du Cercle Privé et ceux qui les accompagnent.",
    "iOS — end of 2026": "iOS — fin 2026",
    "Android — end of 2026": "Android — fin 2026",
    "— At launch": "— Au lancement",
    "Launch cities": "Villes au lancement",
    "Minimum threshold": "Seuil minimum",
    "End of 2026": "Fin 2026",
    "Public release": "Sortie publique",
    "Purchasable placements": "Placements achetables",

    "— Chapitre 01 · The idea": "— Chapitre 01 · L'idée",
    "The venue": "Le lieu",
    "is the evidence.": "est la preuve.",
    "When one of our people arrives in a city they do not know, finding the right table should be effortless.":
      "Quand l'un des nôtres arrive dans une ville qu'il ne connaît pas, trouver la bonne table devrait être sans effort.",
    "Instead, it is noisy. A thousand listings, anonymous reviews, no sense of context nor of the room. The premium traveller does not want more choice — they want":
      "Or, c'est bruyant. Mille fiches, avis anonymes, aucun sens du contexte ni de la salle. Le voyageur exigeant ne veut pas plus de choix — il veut",
    "better choice": "le meilleur choix",
    ", curated by people with the same standards as their own.": ", sélectionné par des gens dont les exigences sont les siennes.",
    "Aurum is that filter. A founder-curated directory of the world's finest venues, validated editorially, enriched with insider intelligence. Soho House's judgement, the Michelin Guide's rigour — built for the pocket.":
      "Aurum est ce filtre. Un répertoire sélectionné par les fondateurs, des plus belles tables du monde, validées éditorialement, enrichies d'informations d'initiés. Le jugement du Soho House, la rigueur du Guide Michelin — conçu pour la poche.",
    "It is, in the simplest terms, the atelier's own address book — and we have chosen to share it.":
      "C'est, en termes simples, le carnet d'adresses de l'atelier — et nous avons choisi de le partager.",

    "— Chapitre 02 · What the app will do": "— Chapitre 02 · Ce que fera l'application",
    "An atelier —": "Un atelier —",
    "in the pocket.": "dans la poche.",
    "Curated discovery": "Découverte choisie",
    "Browse the atelier's shortlist, filtered by city, moment, and mood. Restaurants, hotels, bars, private clubs, jewellers, ateliers — the places our editors would send their own.":
      "Parcourez la liste courte de l'atelier, filtrée par ville, moment et humeur. Restaurants, hôtels, bars, clubs privés, joailliers, ateliers — les lieux où nos éditeurs enverraient les leurs.",
    "Gold Standard rating": "Notation Gold Standard",
    "Three tiers — Listed, Validated, Gold Standard. Each visited by our editors, signed by the founders. No venue may purchase its badge, its rating, or its placement.":
      "Trois niveaux — Listé, Validé, Gold Standard. Chacun visité par nos éditeurs, signé par les fondateurs. Aucun lieu ne peut acheter son badge, sa note, ni son classement.",
    "Insider fiches": "Fiches d'initiés",
    "Every venue comes with the details that matter — best table, signature dish, ideal hour, reservation tip, dress code. Written as if by a friend who knows the room.":
      "Chaque lieu est livré avec les détails qui comptent — meilleure table, plat signature, heure idéale, astuce de réservation, dress code. Écrit comme par un ami qui connaît la salle.",
    "Advanced filters": "Filtres avancés",
    "Noise level, intimacy, dress, budget, service hours, child-friendly, pet-friendly. Find the right room for the evening, in under a minute.":
      "Niveau sonore, intimité, tenue, budget, horaires, adapté aux enfants, aux animaux. Trouvez la bonne salle pour la soirée, en moins d'une minute.",
    "A concierge channel": "Un canal concierge",
    "From any fiche, one line to the atelier. Members of the Private Circle — request a table, a suite, a charter — routed directly to their day and night concierge.":
      "Depuis n'importe quelle fiche, une ligne directe vers l'atelier. Les membres du Cercle Privé — demandez une table, une suite, un charter — acheminés directement vers leur concierge de jour et de nuit.",
    "City guides": "Guides de ville",
    "Curated itineraries for the days you simply want the atelier to plan. Lunch, atelier visit, early dinner, a quiet bar to close — handed over as a single card.":
      "Itinéraires choisis pour les jours où vous souhaitez simplement que l'atelier planifie. Déjeuner, visite d'atelier, dîner précoce, un bar tranquille pour finir — remis sous forme d'une seule carte.",

    "— Chapitre 03 · Two channels, one app": "— Chapitre 03 · Deux canaux, une seule application",
    "How the": "Comment",
    "app divides.": "se partage l'application.",
    "The research tool, open to all approved users. The concierge channel, reserved to the Private Circle.":
      "L'outil de recherche, ouvert à tous les utilisateurs approuvés. Le canal concierge, réservé au Cercle Privé.",
    "Open to approved users": "Ouvert aux utilisateurs approuvés",
    "The research tool": "L'outil de recherche",
    "The directory, editorial fiches, Gold Standard badges, insider intelligence, filters. Decide where to go — and book through the venue yourself.":
      "Le répertoire, les fiches éditoriales, les badges Gold Standard, les informations d'initiés, les filtres. Décidez où aller — et réservez directement auprès du lieu.",
    "Reserved to the Private Circle": "Réservé au Cercle Privé",
    "The concierge channel": "Le canal concierge",
    "From any fiche — or a fresh request — a single line to the atelier. Your day or night concierge picks up, books the table, arranges the car, carries the arrangement end to end.":
      "Depuis n'importe quelle fiche — ou une nouvelle demande — une ligne directe vers l'atelier. Votre concierge de jour ou de nuit décroche, réserve la table, organise la voiture, porte l'arrangement de bout en bout.",

    "— Chapitre 04 · The horizon": "— Chapitre 04 · L'horizon",
    "Three cities,": "Trois villes,",
    "then the world.": "puis le monde.",
    "Aurum opens in Paris, London and Dubai at launch — and in time will cover every major city worldwide, one editorial notebook at a time. No faster than our editors can keep up.":
      "Aurum ouvre à Paris, Londres et Dubaï au lancement — et couvrira, avec le temps, toutes les grandes villes du monde, un carnet éditorial à la fois. Pas plus vite que nos éditeurs ne peuvent suivre.",
    "— At launch · End of 2026": "— Au lancement · fin 2026",
    "— ready": "— prêt",
    "— Next seasons · 2027+": "— Saisons suivantes · 2027 et après",
    "— in preparation": "— en préparation",
    "— and every major city, in time.": "— et toutes les grandes villes, en temps voulu.",
    "One city at a time — no editors before their notebooks are complete.":
      "Une ville à la fois — aucun éditeur tant que son carnet n'est pas complet.",

    "— The door": "— La porte",
    "To enter Aurum first,": "Pour entrer dans Aurum en premier,",
    "write to the atelier.": "écrivez à l'atelier.",
    "Members of the Private Circle receive the app at release — complimentary, without condition. Others may write, and a founder will reply within twenty-four hours.":
      "Les membres du Cercle Privé reçoivent l'application à sa sortie — offerte, sans condition. Les autres peuvent écrire, et un fondateur répondra sous vingt-quatre heures.",
    "Apply to the Circle": "Postuler au Cercle",
    "About Membership": "À propos de l'adhésion",

    // ——— REQUEST ACCESS PAGE ———
    "— Chapitre suivant · Reçu": "— Chapitre suivant · Reçu",
    "Reçu —": "Reçu —",
    "we will write to you.": "nous vous écrirons.",
    "Your letter has arrived at the atelier. A founder will read it in the coming hours and reply within twenty-four.":
      "Votre lettre est arrivée à l'atelier. Un fondateur la lira dans les heures qui viennent et répondra sous vingt-quatre.",
    "Close this letter": "Fermer cette lettre",
    "Telephone": "Téléphone",
    "Please share your full name": "Merci d'indiquer votre nom complet",
    "A valid e-mail address, please": "Une adresse e-mail valide, s'il vous plaît",
    "A number we may reach you on": "Un numéro où vous joindre",
    "Your city of residence": "Votre ville de résidence",

    // ——— MISC ———
    "@eliteprivateagency": "@eliteprivateagency",

    // ——— IMAGE ALT / ARIA LABELS ———
    "Home · Elite Private Agency": "Accueil · Elite Private Agency",
    "Paris by night — the atelier on call": "Paris la nuit — l'atelier à votre service",
    "Grand staircase at a member hotel": "Grand escalier dans un hôtel partenaire",
    "Six Senses Ibiza cliffside pool": "Piscine en falaise · Six Senses Ibiza",
    "Eiffel Tower over the Seine at sunset": "Tour Eiffel sur la Seine au crépuscule",
    "Westminster and Big Ben at night": "Westminster et Big Ben, la nuit",
    "Atlantis The Royal infinity pool over the Palm": "Piscine à débordement · Atlantis The Royal, au-dessus de The Palm",
    "Evening event scene": "Scène de soirée, à l'événement",
    "Private car on a night tarmac": "Véhicule privé sur le tarmac, de nuit",
    "Private residence overlooking the sea": "Résidence privée avec vue sur la mer",

    // ——— REQUEST ACCESS · placeholders & fine copy ———
    "Given and family name": "Nom et prénom",
    "where we may reach you": "où nous pouvons vous joindre",
    "e.g. Paris": "p. ex. Paris",
    "A member's name, if one sent you": "Le nom d'un membre, s'il vous a introduit",
    "What you travel for · what you expect of an atelier · anything worth noting.": "Ce qui vous fait voyager · ce que vous attendez d'un atelier · tout ce qui mérite d'être dit.",
    "Tell the atelier about you.": "Parlez-nous un peu de vous.",
    "The atelier desk · Paris 8ème": "Le bureau de l'atelier · Paris 8ᵉ",
    "— The atelier desk": "— Le bureau de l'atelier",
    "— Application": "— Candidature",
    "read by a founder.": "lue par un fondateur.",
    "Leave blank if human:": "Laissez vide si vous êtes humain :",
    "Apply": "Postuler",
    "City": "Ville",
    "Language": "Langue",
    "Introduced by": "Introduit par",
    "Other": "Autre",
    "Reply window": "Délai de réponse",
    "Cities, for now": "Villes, pour l'instant",
    "Founding members": "Membres fondateurs",
    "No public waitlist": "Aucune liste d'attente publique",
    "English": "Anglais",
    "Français": "Français",
    "Español": "Espagnol",
    "Deutsch": "Allemand",
    "Italiano": "Italien",

    // ——— AURUM PHONE · cards + copy ———
    "Good evening, James.": "Bonsoir, James.",
    "— Private Request —": "— Demande privée —",
    "Sent.": "Envoyé.",
    "See all —": "Voir tout —",
    "Curated": "Sélection",
    "Interactive": "Interactif",
    "per night": "par nuit",
    "Available": "Disponible",
    "From": "À partir de",
    "Check-in": "Arrivée",
    "Dates": "Dates",
    "Travellers": "Voyageurs",
    "Butler": "Majordome",
    "Dining": "Restauration",
    "Discover": "Découvrir",
    "Saved": "Enregistrés",
    "Stays": "Séjours",
    "Transfer": "Transfert",
    "Terrace": "Terrasse",
    "Private": "Privé",
    "Tonight": "Ce soir",
    "Apartment Suite · Carlos Place.": "Suite appartement · Carlos Place.",
    "Bernstein Suite · Concorde terrace.": "Suite Bernstein · terrasse Concorde.",
    "Coco Chanel Suite · place Vendôme.": "Suite Coco Chanel · place Vendôme.",
    "Dubai Suite · Burj Khalifa.": "Suite Dubaï · Burj Khalifa.",
    "Marine Villa · private beach.": "Villa Marine · plage privée.",
    "Panoramic Suite · Sacré-Cœur view.": "Suite panoramique · vue Sacré-Cœur.",
    "Royal Suite · art déco.": "Suite royale · Art déco.",
    "Dubai · Downtown": "Dubaï · Downtown",
    "Dubai · Jumeira Bay": "Dubaï · Jumeira Bay",
    "London · Mayfair": "Londres · Mayfair",
    "Paris · 1st": "Paris · 1ᵉʳ",
    "Paris · 8th": "Paris · 8ᵉ",
    "2 adults": "2 adultes",
    "14 — 18 April 2026": "14 — 18 avril 2026",

    // ——— AURUM INTERACTIONS · demo captions ———
    "— Hover to see it in motion": "— Survolez pour voir l'animation",
    "— GOLD STANDARD —": "— GOLD STANDARD —",
    "ATELIER — LIVE": "ATELIER — EN LIGNE",
    "ON LINE": "EN LIGNE",
    "Tuesday, two. Quiet. Near rue Saint-Dominique.": "Mardi, deux. Discret. Près de la rue Saint-Dominique.",
    "Bien sûr. Le Petit Lune, 20:30 — corner banquette. Confirmed.": "Bien sûr. Le Petit Lune, 20 h 30 — banquette d'angle. Confirmé.",
    "And a car from the Bristol.": "Et une voiture depuis le Bristol.",
    "20:10, the black one. Chauffeur Thierry. À ce soir.": "20 h 10, la noire. Chauffeur Thierry. À ce soir.",
    "20:30 · last table": "20 h 30 · dernière table",
    "21:00 · 2 left": "21 h 00 · 2 restantes",
    "Michelin ★★": "Michelin ★★",
    "Hôtel Grenelle · Dining": "Hôtel Grenelle · Restauration",
    "quiet table, paris, tuesday 20:30": "table discrète, paris, mardi 20 h 30",

    // ——— MISC HOME ———
    "members": "membres"
  };

  // Build inverse map once
  const EN = {};
  for (const k in FR) EN[FR[k]] = k;

  // Current language
  const KEY = "epa-lang";
  const getLang = () => (localStorage.getItem(KEY) || "EN").toUpperCase();
  const setLang = (lang) => {
    localStorage.setItem(KEY, lang);
    document.documentElement.setAttribute("lang", lang === "FR" ? "fr" : "en");
    translateAll(lang);
    // notify any listeners (LangToggle re-render)
    window.dispatchEvent(new Event("epa-lang-change"));
  };

  // Translate a single text node
  function translateNode(node, toFR) {
    try {
      const raw = node.nodeValue;
      if (!raw || !raw.trim()) return;
      // Normalise: collapse any whitespace runs (incl. NBSP) so keys match
      const trimmed = raw.trim().replace(/\s+/g, " ");
      const dict = toFR ? FR : EN;
      if (dict[trimmed]) {
        // Preserve surrounding whitespace
        const lead = raw.match(/^\s*/)[0];
        const tail = raw.match(/\s*$/)[0];
        node.nodeValue = lead + dict[trimmed] + tail;
      }
    } catch (e) { /* swallow — never let a bad node kill the walker */ }
  }

  // Walk entire body; skip <script>, <style>, <svg>
  function translateAll(lang) {
    const toFR = lang === "FR";
    if (!document.body) return;
    try {
      const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
        acceptNode(n) {
          const p = n.parentNode;
          if (!p) return NodeFilter.FILTER_REJECT;
          const tag = p.nodeName;
          if (tag === "SCRIPT" || tag === "STYLE" || tag === "NOSCRIPT") return NodeFilter.FILTER_REJECT;
          if (p.closest && p.closest("svg")) return NodeFilter.FILTER_REJECT;
          // skip the intro overlay
          if (p.closest && p.closest("#epa-intro-overlay")) return NodeFilter.FILTER_REJECT;
          return NodeFilter.FILTER_ACCEPT;
        }
      });
      const nodes = [];
      let cur;
      while ((cur = walker.nextNode())) nodes.push(cur);
      nodes.forEach(n => translateNode(n, toFR));
    } catch (e) {
      console.warn("[EPA i18n] translateAll failed:", e);
    }

    // Translate placeholders on inputs / textareas
    document.querySelectorAll("input[placeholder], textarea[placeholder]").forEach(el => {
      const raw = el.getAttribute("placeholder");
      if (!raw) return;
      const trimmed = raw.trim();
      const dict = toFR ? FR : EN;
      if (dict[trimmed]) el.setAttribute("placeholder", dict[trimmed]);
    });
  }

  // Re-run translation on DOM mutations (React re-renders, reveals, hover state)
  // Debounced + re-entry-guarded — translation itself mutates the DOM, which
  // would otherwise re-trigger the observer in a tight loop.
  let mo;
  let scheduled = false;
  let translating = false;
  function scheduleRetranslate() {
    if (scheduled || translating) return;
    scheduled = true;
    (window.requestAnimationFrame || setTimeout)(() => {
      scheduled = false;
      if (getLang() !== "FR") return;
      translating = true;
      try { translateAll("FR"); } finally { translating = false; }
    }, 50);
  }
  function startObserver() {
    if (mo) mo.disconnect();
    mo = new MutationObserver(scheduleRetranslate);
    mo.observe(document.body, {childList:true, subtree:true, characterData:true});
  }

  // Run once after first paint
  function boot() {
    const lang = getLang();
    document.documentElement.setAttribute("lang", lang === "FR" ? "fr" : "en");
    if (lang === "FR") translateAll("FR");
    startObserver();
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", boot);
  } else {
    boot();
  }

  // ─── Public Lang Toggle — overrides shared.jsx's version ───────────
  const LangToggle = () => {
    const [lang, setL] = React.useState(getLang());
    const [hover, setHover] = React.useState(null);
    React.useEffect(() => {
      const h = () => setL(getLang());
      window.addEventListener("epa-lang-change", h);
      return () => window.removeEventListener("epa-lang-change", h);
    }, []);
    const pick = (code) => { if (code !== lang) setLang(code); };
    const active = hover || lang;
    const col = (code) => active === code ? "var(--epa-gold)" : "var(--epa-text-secondary)";
    const itemStyle = (code) => ({
      color: col(code),
      cursor: "pointer",
      transition: "color .3s ease",
      padding: "2px 0",
      fontWeight: lang === code ? 600 : 500
    });
    return (
      <div style={{display:"flex", gap:2, font:"500 11px/1 var(--font-ui)", letterSpacing:".2em"}}>
        <span style={itemStyle("EN")}
          onClick={() => pick("EN")}
          onMouseEnter={() => setHover("EN")} onMouseLeave={() => setHover(null)}>EN</span>
        <span style={{color:"var(--epa-text-secondary)"}}>/</span>
        <span style={itemStyle("FR")}
          onClick={() => pick("FR")}
          onMouseEnter={() => setHover("FR")} onMouseLeave={() => setHover(null)}>FR</span>
      </div>
    );
  };

  window.LangToggle = LangToggle;
  window.EPA_i18n = { setLang, getLang, translateAll };
})();
