// Internationalization: French (default) + English
const I18N = {
  fr: {
    // Nav
    nav: { services: 'Services', menu: 'Carte', visit: 'Nous trouver', reserve: 'Réserver', orderPickup: 'Commander à emporter' },

    // Hero
    hero: {
      eyebrow: 'Depuis 2014 · Paris 11e · Méditerranéen',
      titleA: 'Une table, un wrap,',
      titleB: 'ou le scooter',
      titleC: 'à votre porte — ',
      titleD: 'à vous de voir.',
      lede: 'Brochettes grillées au charbon, falafels pressés à la main, mezzés fouettés à la commande. Trois façons de vous régaler.',
      choose: 'Choisissez votre formule',
      openNow: 'Cuisine ouverte · ferme à 23h',
      // split variant
      splitA: 'Méditerranée',
      splitB: 'cuisinée au feu',
      splitC: '& recettes de famille.',
      splitLede: 'Brochettes grillées au charbon, falafels pressés à la main, mezzés fouettés à la commande. Sur place, à emporter ou en livraison.',
      ctaPickup: 'Commander à emporter',
      ctaReserve: 'Réserver une table',
    },

    // Services
    services: {
      eyebrow: '— Trois services',
      title: 'Choisissez comment vous régaler ce soir.',
      sub: 'Toutes nos formules partent du même endroit — notre cuisine, aujourd\'hui, frais.',
      takeaway: {
        label: 'À emporter',
        title: 'Commander à emporter',
        desc: 'Composez votre panier, choisissez un horaire, récupérez au comptoir encore chaud. Sans frais, sans intermédiaire — direct de la cuisine.',
        cta: 'Lancer une commande',
        badge: 'Le plus commandé',
      },
      reserve: {
        label: 'Sur place',
        title: 'Réserver une table',
        desc: 'Réservez en quelques secondes — choisissez la date, l\'heure et le nombre de convives. Tables gardées 15 minutes après l\'heure.',
        cta: 'Trouver une table',
      },
      delivery: {
        label: 'Livraison',
        title: 'Commander sur Uber Eats',
        desc: 'La livraison est assurée par Uber Eats. Un clic vous redirige pour finaliser votre commande ; les délais et frais sont fixés par Uber.',
        cta: 'Ouvrir Uber Eats',
      },
    },

    // Menu preview
    menuPreview: {
      eyebrow: '— De la cuisine',
      title: 'Quelques favoris de la maison',
      seeAll: 'Voir la carte complète',
    },

    // Visit
    visit: {
      eyebrow: '— Nous trouver',
      title: '27 rue des Oliviers,',
      title2: 'Paris 11',
      titleSup: 'e',
      period: '.',
      metro: 'M° Parmentier · parking rue Saint-Maur',
      hoursShort: 'Mar–Dim · 12h–15h · 19h–23h',
    },

    // Footer
    footer: {
      about: 'Cuisine méditerranéenne, ouverte depuis 2014. Tout ici est fait main, à l\'ancienne.',
      hours: 'Horaires',
      hoursBody: ['Mar–Ven · 12h–15h · 19h–23h','Sam · 12h–23h','Dim · 12h–22h','Lun · Fermé'],
      contact: 'Contact',
      follow: 'Nous suivre',
      social: ['Instagram', 'Facebook', 'Avis Google'],
      rights: '© {year} Los Nobles Tacos',
      built: 'Cuisiné au feu à Paris',
    },

    // Service mode fallbacks (when admin switches off a service)
    fallback: {
      phoneTitle: 'Commandez par téléphone',
      phoneTitleReserve: 'Réservez par téléphone',
      phoneBody: 'Notre prise de commande en ligne est temporairement indisponible. Appelez-nous, on prépare votre commande avec plaisir.',
      phoneBodyReserve: 'Les réservations en ligne sont temporairement suspendues. Appelez-nous, on vous trouve une table.',
      phoneBodyDelivery: 'La livraison en ligne est temporairement indisponible. Appelez-nous pour un retrait au comptoir.',
      callNow: 'Appeler maintenant',
      closedTitle: 'Service indisponible',
      closedBodyTakeaway: 'Les commandes à emporter sont fermées pour le moment. Retrouvez-nous bientôt !',
      closedBodyReserve: 'Les réservations sont fermées pour le moment. Revenez plus tard ou passez-nous voir.',
      closedBodyDelivery: 'La livraison est indisponible aujourd\'hui.',
      backToSite: 'Retour au site',
    },
    serviceBadge: {
      phone: 'Par téléphone',
      closed: 'Fermé',
    },

    admin: {
      brand: 'Back-office',
      nav: { orders: 'Commandes', reservations: 'Réservations', settings: 'Réglages' },
      openPublic: 'Voir le site public',
      live: 'En direct',
      paused: 'Prise en ligne suspendue',
      serviceStatus: 'Statut des services',
      modes: { online: 'En ligne', phone: 'Par téléphone', closed: 'Fermé' },
      modeHints: {
        online: 'Les clients commandent et réservent normalement.',
        phone: 'Un message remplace le formulaire avec le numéro de téléphone.',
        closed: 'Le service est indisponible pour les clients.',
      },
      ordersTitle: 'Commandes à emporter',
      ordersSub: 'Elles arrivent en temps réel. Passez-les en cuisine → prêtes → retirées.',
      noOrders: 'Aucune commande pour le moment.',
      status: { new: 'Nouvelle', preparing: 'En cuisine', ready: 'Prête', completed: 'Retirée', cancelled: 'Annulée' },
      statusAction: { preparing: 'Démarrer', ready: 'Marquer prête', completed: 'Retirée', cancelled: 'Annuler' },
      pickup: { asap: 'Dès que prêt', '15min': 'Dans 15 min', '30min': 'Dans 30 min', '45min': 'Dans 45 min', '60min': 'Dans 1h' },
      paid: { card: 'CB en ligne', counter: 'Au comptoir' },
      items: { one: 'article', many: 'articles' },
      reservationsTitle: 'Réservations',
      reservationsSub: 'Plan des tables pour aujourd\u2019hui et les jours à venir.',
      rsvStatus: { confirmed: 'Confirmée', seated: 'Installée', cancelled: 'Annulée', 'no-show': 'Non présentée' },
      rsvAction: { seated: 'Installer', cancelled: 'Annuler', 'no-show': 'No-show' },
      today: 'Aujourd\u2019hui',
      tomorrow: 'Demain',
      noReservations: 'Aucune réservation pour cette date.',
      covers: 'couverts',
      settingsTitle: 'Réglages',
      phoneLabel: 'Numéro de téléphone',
      hoursLabel: 'Horaires affichés en mode téléphone',
      uberLabel: 'URL Uber Eats',
      dangerTitle: 'Données de démonstration',
      dangerBody: 'Effacer les commandes et réservations affichées dans ce back-office de démo.',
      clear: 'Effacer les données',
      minAgo: (n) => n <= 0 ? 'il y a quelques secondes' : `il y a ${n} min`,
      newPing: 'Nouvelle commande !',
    },

    // Takeaway
    takeaway: {
      titleMenu: 'Commander à emporter',
      titleCheckout: 'Paiement',
      backToMenu: '← Retour à la carte',
      yourOrder: 'Votre commande',
      items: { one: 'article', many: 'articles' },
      empty1: 'Votre panier est vide.',
      empty2: 'Ajoutez un plat sur la gauche.',
      pickupTime: 'Heure de retrait',
      pickupOptions: [
        { v: 'asap', t: 'Le plus tôt possible (~25 min)' },
        { v: '30',   t: 'Dans 30 minutes' },
        { v: '45',   t: 'Dans 45 minutes' },
        { v: '60',   t: 'Dans 1 heure' },
        { v: '90',   t: 'Dans 1 heure 30' },
      ],
      subtotal: 'Sous-total',
      fee: 'Frais de service',
      total: 'Total',
      continue: 'Continuer vers le paiement',
      add: 'Ajouter',
      fullName: 'Nom complet',
      phone: 'Téléphone',
      phoneHint: 'Nous vous écrivons quand la commande est prête',
      email: 'Email (facultatif)',
      kitchenNote: 'Mot pour la cuisine',
      kitchenNotePh: 'Allergies, piquant, toum en plus…',
      payment: 'Paiement',
      paymentCard: 'Carte en ligne',
      paymentCounter: 'Payer au comptoir',
      orderSummary: 'Récapitulatif',
      placeOrder: 'Passer la commande',
      terms: 'En passant commande vous acceptez nos conditions. Aucun prélèvement dans cette démo.',
      doneTitle: 'Commande confirmée',
      doneBody: (name, ref, addr, time) => `Merci ${name}. Votre commande ${ref} est en préparation. Retrait au ${addr} ${time}.`,
      doneTimeAsap: 'dans environ 25 minutes',
      doneTimeIn: (m) => `dans ${m} minutes`,
      back: 'Retour au site',
      newOrder: 'Nouvelle commande',
      errReq: 'Obligatoire',
      errPhone: 'Téléphone invalide',
      errEmail: 'Email invalide',
      placeholders: { name: 'Camille Dufour', phone: '+33 6 ...', email: 'vous@email.com' },
    },

    // Reservation
    reservation: {
      title: 'Réserver une table',
      intro: 'Choisissez une date, une heure et le nombre de convives. Les tables sont gardées 15 minutes après l\'heure — appelez-nous si vous êtes en retard.',
      party: 'Nombre de convives',
      call: '9+ (appeler)',
      date: 'Date',
      timeFor: (party, date) => `Horaires pour ${party} — ${date}`,
      greyed: 'Les horaires grisés sont complets.',
      cancel: 'Annuler',
      continue: 'Continuer',
      changeSlot: '← Modifier le créneau',
      guest: 'convive',
      guests: 'convives',
      resName: 'Nom de la réservation',
      phone: 'Téléphone',
      email: 'Email (facultatif)',
      occasion: 'Occasion (facultatif)',
      occasionNone: 'Aucune occasion particulière',
      occasions: ['Anniversaire', 'Anniversaire de mariage', 'Dîner d\'affaires', 'Dîner en amoureux', 'Réunion de famille'],
      request: 'Demande particulière',
      requestPh: 'Allergies, préférence de table, chaise haute…',
      back: 'Retour',
      confirm: 'Confirmer la réservation',
      doneTitle: 'Table réservée',
      doneBody: (name, party, date, time, ref) => `À bientôt ${name}. Votre table pour ${party} est réservée le ${date} à ${time}. Confirmation ${ref} envoyée par SMS.`,
      backToSite: 'Retour au site',
      errReq: 'Obligatoire',
      errPhone: 'Téléphone invalide',
      errEmail: 'Email invalide',
      placeholders: { name: 'Camille Dufour', phone: '+33 6 ...', email: 'vous@email.com' },
    },

    // Delivery
    delivery: {
      title: 'La livraison est assurée par Uber Eats',
      body: 'Vous allez être redirigé vers notre page Uber Eats pour finaliser votre commande. Les délais et frais sont fixés par Uber.',
      external: 'Externe',
      time: '25–40 min',
      cancel: 'Annuler',
      go: 'Continuer vers Uber Eats',
      redirecting: (s) => `Redirection dans ${s}…`,
    },

    // Tags
    tags: { signature: 'Signature', popular: 'Populaire', vegan: 'Vegan' },

    // Menu data (names, descriptions, categories)
    cats: {
      mezze: 'Mezzés & entrées',
      wraps: 'Wraps & sandwichs',
      grill: 'Au grill',
      sides: 'Accompagnements & salades',
      boxes: 'Formules famille',
    },
    dishes: {
      moutabal: {
        name: 'Moutabal',
        desc: 'Aubergine fumée fouettée au tahini, grains de grenade, huile au paprika, persil ciselé.',
      },
      tabbouleh: {
        name: 'Taboulé',
        desc: 'Persil finement haché, boulgour, tomate, oignon, citron, huile d\'olive première pression.',
      },
      'falafel-box': {
        name: 'Assiette de falafels',
        desc: 'Dix falafels croustillants, houmous, salade fraîche, pickles et pain pita tiède.',
      },
      kebbeh: {
        name: 'Kebbeh',
        desc: 'Coques de boulgour farcies d\'agneau épicé, pignons et oignon. À la pièce ou à la douzaine.',
      },
      'wrap-falafel': {
        name: 'Wrap falafel',
        desc: 'Pita grillé, falafels, tahini, navet mariné, tomate, salade croquante.',
      },
      'wrap-chicken': {
        name: 'Wrap poulet croustillant',
        desc: 'Tender de poulet pané, yaourt à l\'ail, laitue, tomate, pickles.',
      },
      'shish-taouk': {
        name: 'Chich taouk',
        desc: 'Brochettes de poulet marinées grillées au charbon, pita, frites, tomate et oignon grillés, toum.',
      },
      wings: {
        name: 'Ailes grillées',
        desc: 'Ailes entières marinées au sumac et à l\'ail, grillées à la flamme, piments verts grillés.',
      },
      tenders: {
        name: 'Tenders croustillants',
        desc: 'Tenders de poulet panés maison, basilic, ketchup à la harissa.',
      },
      fattoush: {
        name: 'Fattoush',
        desc: 'Tomate, concombre, radis, sumac, éclats de pita croustillant, mélasse de grenade.',
      },
      hummus: {
        name: 'Houmous beyrouthin',
        desc: 'Pois chiches, tahini, citron, ruban d\'huile pimentée. Servi avec pain pita tiède.',
      },
      fries: {
        name: 'Frites au sumac',
        desc: 'Frites maison coupées et cuites deux fois, sumac, toum à part.',
      },
      'box-family': {
        name: 'Box famille Los Nobles',
        desc: 'Pour 4. Deux plateaux grillés, trio de mezzés, pickles, pita et sauces maison.',
      },
      'box-mezze': {
        name: 'Dégustation mezzés',
        desc: 'Six mezzés froids, falafels, kebbeh et pita tiède. Pour deux.',
      },
    },
  },

  en: {
    nav: { services: 'Services', menu: 'Menu', visit: 'Visit', reserve: 'Reserve', orderPickup: 'Order pickup' },

    hero: {
      eyebrow: 'Since 2014 · Paris 11e · Mediterranean',
      titleA: 'A table, a wrap,',
      titleB: 'or the moped',
      titleC: 'at your door — ',
      titleD: 'your call.',
      lede: 'Charcoal-grilled skewers, hand-pressed falafel, mezze whipped to order. Three ways to get it.',
      choose: 'Choose your service',
      openNow: 'Kitchen is open · closes 23h',
      splitA: 'Mediterranean',
      splitB: 'cooked with fire',
      splitC: '& family recipes.',
      splitLede: 'Charcoal-grilled skewers, hand-pressed falafel, mezze whipped to order. Sit down, take it away, or have it delivered.',
      ctaPickup: 'Order for pickup',
      ctaReserve: 'Reserve a table',
    },

    services: {
      eyebrow: '— Three services',
      title: 'Choose how you want to eat tonight.',
      sub: 'Every option starts the same way — from our kitchen, today, fresh.',
      takeaway: {
        label: 'Takeaway',
        title: 'Order to pick up',
        desc: 'Build your basket, choose a time, grab it hot from our counter. No fees, no intermediaries — straight from the kitchen.',
        cta: 'Start an order',
        badge: 'Most ordered',
      },
      reserve: {
        label: 'Dine in',
        title: 'Reserve a table',
        desc: 'Book a table in seconds — pick a date, time and party size. Tables held 15 minutes past your booking.',
        cta: 'Find a table',
      },
      delivery: {
        label: 'Delivery',
        title: 'Order with Uber Eats',
        desc: 'Delivery is handled by Uber Eats. Tap through to their platform to complete your order; times and fees are set by Uber.',
        cta: 'Open Uber Eats',
      },
    },

    menuPreview: {
      eyebrow: '— From the kitchen',
      title: 'A handful of favourites',
      seeAll: 'See the full menu',
    },

    visit: {
      eyebrow: '— Visit',
      title: '27 rue des Oliviers,',
      title2: 'Paris 11',
      titleSup: 'e',
      period: '.',
      metro: 'M° Parmentier · closest parking rue Saint-Maur',
      hoursShort: 'Tue–Sun · 12h–15h · 19h–23h',
    },

    footer: {
      about: 'Mediterranean kitchen, open since 2014. Everything here is made by hand, the slow way.',
      hours: 'Hours',
      hoursBody: ['Tue–Fri · 12h–15h · 19h–23h','Sat · 12h–23h','Sun · 12h–22h','Mon · Closed'],
      contact: 'Contact',
      follow: 'Follow',
      social: ['Instagram', 'Facebook', 'Google Reviews'],
      rights: '© {year} Los Nobles Tacos',
      built: 'Built with fire in Paris',
    },

    takeaway: {
      titleMenu: 'Order for pickup',
      titleCheckout: 'Checkout',
      backToMenu: '← Back to menu',
      yourOrder: 'Your order',
      items: { one: 'item', many: 'items' },
      empty1: 'Your basket is empty.',
      empty2: 'Pick something tasty on the left.',
      pickupTime: 'Pickup time',
      pickupOptions: [
        { v: 'asap', t: 'As soon as possible (~25 min)' },
        { v: '30',   t: 'In 30 minutes' },
        { v: '45',   t: 'In 45 minutes' },
        { v: '60',   t: 'In 1 hour' },
        { v: '90',   t: 'In 1 hour 30' },
      ],
      subtotal: 'Subtotal',
      fee: 'Service fee',
      total: 'Total',
      continue: 'Continue to checkout',
      add: 'Add',
      fullName: 'Full name',
      phone: 'Phone',
      phoneHint: "We'll text you when the order is ready",
      email: 'Email (optional)',
      kitchenNote: 'Note for the kitchen',
      kitchenNotePh: 'Allergies, spice level, extra toum…',
      payment: 'Payment',
      paymentCard: 'Card online',
      paymentCounter: 'Pay at counter',
      orderSummary: 'Order summary',
      placeOrder: 'Place order',
      terms: 'By placing the order you agree to our terms. No charge in this demo.',
      doneTitle: 'Order confirmed',
      doneBody: (name, ref, addr, time) => `Thanks, ${name}. Your order ${ref} is being prepared. Pickup at ${addr} ${time}.`,
      doneTimeAsap: 'in about 25 minutes',
      doneTimeIn: (m) => `in ${m} minutes`,
      back: 'Back to site',
      newOrder: 'Start a new order',
      errReq: 'Required',
      errPhone: 'Enter a valid phone',
      errEmail: 'Invalid email',
      placeholders: { name: 'Camille Dufour', phone: '+33 6 ...', email: 'you@email.com' },
    },

    reservation: {
      title: 'Reserve a table',
      intro: "Select a date, time and party size. We hold tables for 15 minutes past your booking — please give us a call if you're running late.",
      party: 'Party size',
      call: '9+ (call us)',
      date: 'Date',
      timeFor: (party, date) => `Time for ${party} — ${date}`,
      greyed: 'Greyed times are fully booked.',
      cancel: 'Cancel',
      continue: 'Continue',
      changeSlot: '← Change slot',
      guest: 'guest',
      guests: 'guests',
      resName: 'Name on reservation',
      phone: 'Phone',
      email: 'Email (optional)',
      occasion: 'Occasion (optional)',
      occasionNone: 'No particular occasion',
      occasions: ['Birthday', 'Anniversary', 'Business dinner', 'Date night', 'Family gathering'],
      request: 'Special request',
      requestPh: 'Allergies, seating preference, high chair…',
      back: 'Back',
      confirm: 'Confirm reservation',
      doneTitle: 'Table reserved',
      doneBody: (name, party, date, time, ref) => `See you soon, ${name}. Your table for ${party} is booked on ${date} at ${time}. Confirmation ${ref} has been sent to your phone.`,
      backToSite: 'Back to site',
      errReq: 'Required',
      errPhone: 'Enter a valid phone',
      errEmail: 'Invalid email',
      placeholders: { name: 'Camille Dufour', phone: '+33 6 ...', email: 'you@email.com' },
    },

    delivery: {
      title: 'Delivery is handled by Uber Eats',
      body: "You'll be taken to our page on Uber Eats to complete your order. Delivery times and fees are set by Uber.",
      external: 'External',
      time: '25–40 min',
      cancel: 'Cancel',
      go: 'Continue to Uber Eats',
      redirecting: (s) => `Redirecting in ${s}…`,
    },

    fallback: {
      phoneTitle: 'Order by phone',
      phoneTitleReserve: 'Reserve by phone',
      phoneBody: 'Online ordering is temporarily paused. Give us a call, we\'ll happily take your order.',
      phoneBodyReserve: 'Online reservations are paused. Give us a ring and we\'ll find you a table.',
      phoneBodyDelivery: 'Online delivery is paused. Call us for counter pickup.',
      callNow: 'Call now',
      closedTitle: 'Service unavailable',
      closedBodyTakeaway: 'Takeaway is closed right now. See you soon!',
      closedBodyReserve: 'Reservations are closed right now. Check back later or walk in.',
      closedBodyDelivery: 'Delivery is unavailable today.',
      backToSite: 'Back to site',
    },
    serviceBadge: {
      phone: 'By phone',
      closed: 'Closed',
    },

    admin: {
      brand: 'Back office',
      nav: { orders: 'Orders', reservations: 'Reservations', settings: 'Settings' },
      openPublic: 'View public site',
      live: 'Live',
      paused: 'Online intake paused',
      serviceStatus: 'Service status',
      modes: { online: 'Online', phone: 'By phone', closed: 'Closed' },
      modeHints: {
        online: 'Customers can order and book normally.',
        phone: 'Customers see a message with the phone number instead of the form.',
        closed: 'The service is unavailable to customers.',
      },
      ordersTitle: 'Takeaway orders',
      ordersSub: 'Orders drop in live. Move them into the kitchen \u2192 ready \u2192 picked up.',
      noOrders: 'No orders yet.',
      status: { new: 'New', preparing: 'In kitchen', ready: 'Ready', completed: 'Picked up', cancelled: 'Cancelled' },
      statusAction: { preparing: 'Start', ready: 'Mark ready', completed: 'Picked up', cancelled: 'Cancel' },
      pickup: { asap: 'As soon as ready', '15min': 'In 15 min', '30min': 'In 30 min', '45min': 'In 45 min', '60min': 'In 1 hour' },
      paid: { card: 'Card online', counter: 'At counter' },
      items: { one: 'item', many: 'items' },
      reservationsTitle: 'Reservations',
      reservationsSub: 'Seating plan for today and upcoming days.',
      rsvStatus: { confirmed: 'Confirmed', seated: 'Seated', cancelled: 'Cancelled', 'no-show': 'No-show' },
      rsvAction: { seated: 'Seat', cancelled: 'Cancel', 'no-show': 'No-show' },
      today: 'Today',
      tomorrow: 'Tomorrow',
      noReservations: 'No reservations for this date.',
      covers: 'guests',
      settingsTitle: 'Settings',
      phoneLabel: 'Phone number',
      hoursLabel: 'Hours shown on phone fallback',
      uberLabel: 'Uber Eats URL',
      dangerTitle: 'Demo data',
      dangerBody: 'Clear the orders and reservations shown in this demo back office.',
      clear: 'Clear data',
      minAgo: (n) => n <= 0 ? 'just now' : `${n} min ago`,
      newPing: 'New order!',
    },

    tags: { signature: 'Signature', popular: 'Popular', vegan: 'Vegan' },

    cats: {
      mezze: 'Mezze & Starters',
      wraps: 'Wraps & Sandwiches',
      grill: 'From the Grill',
      sides: 'Sides & Salads',
      boxes: 'Family Boxes',
    },
    dishes: {
      moutabal: { name: 'Moutabal', desc: 'Smoked eggplant whipped with tahini, pomegranate seeds, paprika oil, chopped parsley.' },
      tabbouleh: { name: 'Tabbouleh', desc: 'Finely chopped parsley, bulgur, tomato, onion, lemon, cold-pressed olive oil.' },
      'falafel-box': { name: 'Falafel Platter', desc: 'Ten crisp falafel with hummus, fresh salad, pickles and warm pita.' },
      kebbeh: { name: 'Kebbeh', desc: 'Bulgur shells filled with spiced lamb, pine nuts and onion. Sold by the piece or dozen.' },
      'wrap-falafel': { name: 'Falafel Wrap', desc: 'Toasted pita, falafel, tahini, pickled turnip, tomato, crunchy greens.' },
      'wrap-chicken': { name: 'Crispy Chicken Wrap', desc: 'Buttermilk chicken tender, garlic yogurt, lettuce, tomato, pickles.' },
      'shish-taouk': { name: 'Shish Taouk', desc: 'Char-grilled marinated chicken skewers, pita, fries, grilled tomato and onion, toum.' },
      wings: { name: 'Grilled Wings', desc: 'Whole wings marinated in sumac and garlic, flame-grilled with charred green chilli.' },
      tenders: { name: 'Crispy Tenders', desc: 'House-breaded chicken tenders, basil, harissa ketchup.' },
      fattoush: { name: 'Fattoush', desc: 'Tomato, cucumber, radish, sumac, crispy pita shards, pomegranate molasses.' },
      hummus: { name: 'Hummus Beiruti', desc: 'Chickpeas, tahini, lemon, a ribbon of chilli oil. Served with warm pita.' },
      fries: { name: 'Sumac Fries', desc: 'Double-cooked hand-cut fries, sumac, garlic toum on the side.' },
      'box-family': { name: 'Los Nobles Family Box', desc: 'For 4. Two grilled platters, mezze trio, pickles, pita and house dips.' },
      'box-mezze': { name: 'Mezze Tasting', desc: 'Six cold mezze, falafel, kebbeh and warm pita. Serves two.' },
    },
  },
};

const LangContext = React.createContext({ lang: 'fr', t: I18N.fr, setLang: () => {} });
const useT = () => React.useContext(LangContext);

function LangProvider({ children }) {
  const [lang, setLang] = React.useState(() => localStorage.getItem('ln-lang') || 'fr');
  React.useEffect(() => {
    localStorage.setItem('ln-lang', lang);
    document.documentElement.setAttribute('lang', lang);
  }, [lang]);
  const t = I18N[lang];
  return (
    <LangContext.Provider value={{ lang, t, setLang }}>
      {children}
    </LangContext.Provider>
  );
}

// Locale-aware date formatting
function formatDate(iso, lang, opts) {
  const locale = lang === 'fr' ? 'fr-FR' : 'en-GB';
  return new Date(iso).toLocaleDateString(locale, opts);
}

Object.assign(window, { I18N, LangContext, useT, LangProvider, formatDate });
