// ─── i18n — language toggle + dictionary ─────────────────── // Default Dutch, English as alternative. Persisted to localStorage. const LangContext = React.createContext({ lang: 'nl', setLang: () => {} }); function LangProvider({ children }) { const [lang, setLangState] = React.useState(() => { try { return localStorage.getItem('eso-lang') || 'nl'; } catch (e) { return 'nl'; } }); const setLang = React.useCallback((l) => { setLangState(l); try { localStorage.setItem('eso-lang', l); } catch (e) {} document.documentElement.lang = l; }, []); React.useEffect(() => { document.documentElement.lang = lang; }, [lang]); return ( {children} ); } function useT() { const { lang } = React.useContext(LangContext); return STRINGS[lang]; } function useLang() { return React.useContext(LangContext); } function LangToggle({ color = '#1A1208' }) { const { lang, setLang } = useLang(); const Btn = ({ code, label }) => ( ); return (
); } // ── Dictionary ────────────────────────────────────────────── const STRINGS = { nl: { // Nav navLinks: [['filosofie', '#filosofie'], ['pijlers', '#pijlers'], ['coaches', '#coaches'], ['programma', '#programma'], ['open clinic', '#open-clinic'], ['inschrijven', '#inschrijven']], marqueePhrases: ['¡eso!', 'techniek', '¡eso!', 'tactiek', '¡eso!', 'fysiek', '¡eso!', 'mentaal'], navOpenClinicLabel: 'Open Clinic', navOpenClinicDate: '14 juni', navWhatsApp: 'WhatsApp', navCTA: 'Gratis intake', waMessage: 'Hoi! Ik wil graag meer weten over de gratis intake bij ¡Eso!.', // Hero heroRibbon: '14 juni · gratis · meld aan', heroRibbonLabel: 'Open Clinic', heroEyebrow: 'tennis academy · dongen · nl', heroTitle1: 'Klein Team.', heroTitle2: 'Groot Vakmanschap.', heroTitle3: 'Echte Progressie.', heroLede: 'Wij begeleiden een select aantal tennistalenten van 8 tot 15 jaar. Twee coaches, één visie. Latijns-Amerikaans coaching-DNA met Nederlandse discipline. Bewust kleinschalig — max 8 talenten per seizoen.', heroPrimaryCTA: 'Boek een Gratis Intake', heroTertiary: 'bekijk het programma', stats: [['02', 'jaar actief'], ['8–15', 'jaar talent'], ['08', 'plekken / seizoen'], ['14', 'weken programma']], // Filosofie filosofieEyebrow: 'filosofie', filosofieTitle1: 'is wat een coach zegt op het moment dat een speler', filosofieTitle2: 'iets goed doet.', filosofiePara1: 'Geen aanmoediging vanaf de tribune — feedback van de baan. Dat is hoe wij werken. Wij begeleiden een select aantal talenten van 8 tot 15 jaar, met persoonlijke aandacht en de discipline die top-tennis vraagt.', filosofiePara2: 'Latijns-Amerikaanse coaching, Nederlandse discipline. Twee coaches die elk talent persoonlijk kennen — geen klas, geen nummer, geen massa-inschrijving. Slechts acht plekken per seizoen.', // Pijlers pijlersEyebrow: 'de vier pijlers', pijlersTitle: 'waar wij op trainen.', pijlersIntro: 'Talent ontwikkelt zich niet door één facet, maar door vier samen. Elke training raakt minstens twee pijlers.', pillars: [ ['techniek', 'wat onder druk standhoudt, niet wat er mooi uitziet.', ['slow-motion video-analyse per slag', 'slag-mechaniek tot op detail', 'voet- en heuppositie corrigeren', 'contactpunt en raket-pad finetunen', 'variatie in spin, tempo en hoogte', 'repetitie tot automatisme']], ['tactiek', 'het juiste shot kiezen, niet de hardste slaan.', ['tegenstanders lezen en zwaktes uitspelen', 'speelpatronen opbouwen en herkennen', 'eerste serve + één opbouwen', 'beslissen op cruciale punten', 'score-bewust spelen (voor- en achterstand)', 'wedstrijdritme controleren']], ['fysiek', 'tennis-specifiek bewegen, een heel seizoen blessurevrij.', ['split-step en eerste-stap-snelheid', 'lateraal voetwerk en recovery', 'tennis-specifieke kracht (benen, romp, schouder)', 'duurvermogen voor lange wedstrijden', 'herstel tussen punten en games', 'blessurepreventie (elleboog, schouder, knie)']], ['mentaal', 'veerkracht onder druk — sterker terugkomen dan je vertrok.', ['routines tussen punten (ademhaling, reset)', 'omgaan met fouten zonder spiraal', 'focus vasthouden over een hele wedstrijd', 'druk hanteren op match- en break-points', 'lichaamstaal als prestatie-tool', 'scenario-denken bij achterstand']], ], // Coaches coachesEyebrow: 'head coaches', coachesTitle: 'Ariana & Jorge.', coachesSubtitle: 'twee coaches · één visie · 16 jaar gecombineerde ervaring', coachesData: [ ['Ariana Osorio', 'Head Coach', 'AO', 'ariana-face', 'Ariana groeide op met tennis in Latijns-Amerika en bouwde haar coaching-stijl op rond persoonlijke aandacht en mentale veerkracht. Ze speelt zelf wedstrijdtennis en specialiseert zich in tactische ontwikkeling en fysieke begeleiding van jeugd.', 'Bij ¡Eso! heeft ze de blik die elk talent ziet, niet de groep — met de discipline om te corrigeren waar het ertoe doet.'], ['Jorge Arevalo', 'Head Coach', 'JA', 'jorge-face', 'Jorge bracht zijn coaching-DNA mee uit Latijns-Amerika: techniek tot in detail, hard werken, plezier door progressie. Hij focust op slag-mechaniek en jeugdtalent en werkte met spelers door alle leeftijden heen.', 'Bij ¡Eso! is hij de coach die op de baan staat en «¡eso!» roept op het juiste moment — niet als beloning, maar als bevestiging dat het klopt.'], ['Franc', 'Fysiek Trainer', 'F', null, '[Placeholder bio] Franc is een ervaren tennistrainer met een specialisatie in fysieke voorbereiding. Hij weet als geen ander hoe je een jong tennislichaam opbouwt: kracht, snelheid, voetwerk en herstel — afgestemd op leeftijd en groeifase.', 'Bij ¡Eso! zorgt hij ervoor dat onze talenten een heel seizoen blessurevrij hun beste tennis kunnen spelen — niet door losse oefeningen, maar door een doorlopend fysiek programma naast de baantraining.'], ], // Programma programmaEyebrow: 'programma 2026', programmaTitle1: '14 weken', programmaTitle2: 'competitietennis.', programmaIntro: 'Start eind augustus 2026, doorlopend tot eind november. Iedere week: groepstraining, individuele of duo-sessies en fysieke training. Toernooi-begeleiding op zaterdagen.', programmaScheduleLabel: 'weekschema', programmaScheduleNote: 'geen training tijdens de meivakantie · individueel/duo flexibel inplanbaar', schedule: [['ma', 'individueel + fysiek', '2 uur'], ['di', 'groepstraining', '1 uur'], ['wo', 'duo + fysiek', '2 uur'], ['vr', 'groepstraining', '1 uur'], ['vr', 'duo-tennis', '1 uur'], ['za', 'duo / individueel', '2 uur']], commitmentTitle: 'commitment: 2 groepstrainingen per week verplicht.', commitmentBody: 'Vaste aanwezigheid, vaste betaling. Alleen toernooi of ziekte zijn geldige redenen voor afwezigheid. Individuele en duo-sessies blijven flexibel. Talenten ontwikkelen zich door consistente herhaling — niet door losse lessen.', // Testimonial testimonial: '"onze dochter is in een jaar 1.5 speelsterkte gestegen. maar belangrijker: ze gaat met plezier naar elke training, durft te falen en pakt zichzelf op na een verloren game."', testimonialAuthor: '— ouder van talent (12 jr)', // Wat krijgt krijgtEyebrow: 'inbegrepen', krijgtTitle: 'wat krijgt het talent.', krijgtItems: [ ['persoonlijk plan', 'individueel ontwikkelingsplan na intake — niet één-grootte voor de groep.'], ['rapportage', 'schriftelijke voortgangsrapportage elke 6 weken, met video-momenten.'], ['starterskit', '¡eso! kit: trainingsshirt × 2, short, polo. niet als gimmick — als deel van het programma.'], ['toernooi-coaching', 'begeleiding op zaterdagse toernooien — coaching tussen de games.'], ['satelliet-clinics', 'toegang tot specialistische clinics op partner-clubs.'], ['video-analyse', 'per blok één slow-motion video-sessie van een kernslag.'], ], // FAQ faqEyebrow: 'veelgestelde vragen', faqTitle: 'eerlijke antwoorden.', faqs: [ ['voor welke leeftijd is ¡eso!?', 'we werken met talenten van 8 tot 15 jaar. de groep is bewust gemengd qua leeftijd zodat oudere talenten als rolmodel fungeren en jongere talenten zien wat mogelijk is.'], ['hoe selecteren jullie?', 'na een gratis intake (30 min) kijken we naar motivatie, commitment en speelniveau. we nemen maximaal 8 talenten per seizoen aan. niet noodzakelijk de beste spelers — wel de meest leerbare.'], ['hoeveel kost het hele programma?', 'de opzet werkt per sessietype, geen vast pakketbedrag. neem contact op via coach@esotennis.nl voor een prijsopgave op maat — afhankelijk van schema en aantal sessies per week.'], ['wat als mijn kind ziek is of een toernooi heeft?', 'ziekte en toernooi zijn geldige redenen voor afwezigheid bij groepstrainingen. individuele en duo-sessies kun je verzetten in overleg. alle andere afwezigheid telt als afgenomen.'], ['waar trainen jullie?', 'op tc bas dongen — een vast complex met goede banen. we trainen er buiten en, in winterperiode, op de hal van een partner-club. exacte adressen krijg je bij intake.'], ['wat als mijn kind nog geen toernooien speelt?', 'dat hoeft niet. we coachen vanaf het niveau «kan een wedstrijdje spelen». binnen het programma stimuleren we wel toernooi-deelname, in eigen tempo.'], ], // Inschrijven inschrijvenEyebrow: 'gratis intake', inschrijvenTitle1: 'boek een', inschrijvenTitle2: 'kennismaking.', inschrijvenBody: '30 minuten op de baan, één-op-één met Jorge of Ariana. We kijken naar techniek, motivatie en of we matchen. Geen verkoopgesprek. Plekken zijn beperkt — voor seizoen 2026 nemen we maximaal 8 talenten aan.', formEyebrow: 'aanmelden voor intake', fieldName: 'naam talent', fieldNamePh: 'bv. nora', fieldAge: 'leeftijd', fieldAgePh: '12', fieldEmail: 'e-mail ouder/voogd', fieldEmailPh: 'ouder@voorbeeld.nl', fieldMsg: 'huidig niveau / opmerkingen', fieldMsgPh: 'bv. speelsterkte 7, focus op forehand', submit: 'vraag intake aan', submitNote: 'geen spam · we mailen alleen om de afspraak te plannen.', thanksTitle: 'bedankt', thanksBody: 'We nemen binnen 48 uur contact op om een datum te plannen. In de tussentijd: leg vast welk shot je het meeste wilt verbeteren.', contactEmail: 'e-mail', contactPhone: 'telefoon', contactLocation: 'locatie', locationText: 'tc bas dongen · trainingen in dongen', // Open Clinic (5) clinicEyebrow: 'open clinic · 14 juni 2026', clinicTitle: 'Een Open Clinic — Speciaal voor Jeugdtalent.', clinicLede: 'Op zondag 14 juni 2026 organiseren wij een open clinic in Dongen. Drie uur intensief tennis voor jeugdspelers van 8 t/m 15 jaar uit de regio. Volledig gratis. Beperkt aantal plekken.', clinicScheduleLabel: 'Programma', clinicSchedule: [ ['10:00', 'Welkom & intro'], ['10:30', 'Clinic deel 1 — techniek'], ['11:30', 'Clinic deel 2 — wedstrijdvormen'], ['12:30', 'Korte 1-op-1 met ouders'], ['13:00', 'Afsluiting'], ], clinicWhoTitle: 'Voor wie', clinicWho: ['Jeugdspelers van 8 t/m 15 jaar', 'Met serieuze tennis-ambitie', 'Uit Dongen en omliggende dorpen'], clinicWhatTitle: 'Wat je krijgt', clinicWhat: ['3 uur training met Jorge & Ariana', 'Schriftelijke terugkoppeling per speler', 'Geen verplichting achteraf — écht gratis'], clinicCTA: 'Meld je aan voor de clinic', clinicNote: 'Aanmelden vóór 1 juni 2026 via coach@esotennis.nl', // Footer footerTagline: 'Een kleine tennisacademie voor talenten van 8–15 jaar. Trainingen in Dongen.', footerNav: 'navigatie', footerNavItems: [['filosofie', '#filosofie'], ['de pijlers', '#pijlers'], ['coaches', '#coaches'], ['programma', '#programma'], ['inschrijven', '#inschrijven']], footerContact: 'contact', footerLocation: 'locatie', footerLocationText: 'tc bas dongen\\ntramstraat 14\\n5104 gr dongen', footerCopyright: '© ¡eso! tennis academy 2026', footerMade: 'made with care · in dongen', }, en: { navLinks: [['philosophy', '#filosofie'], ['pillars', '#pijlers'], ['coaches', '#coaches'], ['programme', '#programma'], ['open clinic', '#open-clinic'], ['sign-up', '#inschrijven']], marqueePhrases: ['¡eso!', 'technique', '¡eso!', 'tactics', '¡eso!', 'physical', '¡eso!', 'mental'], navOpenClinicLabel: 'Open Clinic', navOpenClinicDate: 'Jun 14', navWhatsApp: 'WhatsApp', navCTA: 'Free intro', waMessage: "Hi! I'd like to know more about the free intro at ¡Eso!.", heroRibbon: 'Jun 14 · free · sign up', heroRibbonLabel: 'Open Clinic', heroEyebrow: 'tennis academy · dongen · nl', heroTitle1: 'Small Team.', heroTitle2: 'Big Craftsmanship.', heroTitle3: 'Real Progress.', heroLede: 'We coach a select group of tennis talents aged 8 to 15. Two coaches, one vision. Latin-American coaching DNA combined with Dutch discipline. Deliberately small — max 8 talents per season.', heroPrimaryCTA: 'Book a Free Intro', heroTertiary: 'see the programme', stats: [['02', 'years active'], ['8–15', 'years old'], ['08', 'spots / season'], ['14', 'weeks programme']], filosofieEyebrow: 'philosophy', filosofieTitle1: 'is what a coach says the moment a player', filosofieTitle2: 'does something right.', filosofiePara1: 'Not encouragement from the stands — feedback from the court. That is how we work. We coach a select group of talents from 8 to 15 years old, with personal attention and the discipline top tennis demands.', filosofiePara2: 'Latin-American coaching, Dutch discipline. Two coaches who know every talent personally — no class, no number, no mass enrolment. Just eight spots per season.', pijlersEyebrow: 'the four pillars', pijlersTitle: 'what we train on.', pijlersIntro: 'Talent does not develop through one facet alone, but through four together. Every training session touches at least two pillars.', pillars: [ ['technique', 'what holds up under pressure, not what looks pretty.', ['slow-motion video analysis per stroke', 'stroke mechanics down to the detail', 'correcting foot and hip position', 'fine-tuning contact point and racket path', 'variation in spin, pace and height', 'repetition to automatic']], ['tactics', 'choosing the right shot, not hitting the hardest one.', ['reading opponents and exploiting weaknesses', 'building and recognising patterns', 'first serve + one ball construction', 'deciding on key points', 'score-aware play (ahead and behind)', 'controlling match rhythm']], ['physical', 'tennis-specific movement, a full season injury-free.', ['split-step and first-step speed', 'lateral footwork and recovery', 'tennis-specific strength (legs, core, shoulder)', 'endurance for long matches', 'recovery between points and games', 'injury prevention (elbow, shoulder, knee)']], ['mental', 'resilience under pressure — bouncing back stronger.', ['between-point routines (breathing, reset)', 'handling errors without spiralling', 'holding focus across a full match', 'managing pressure on match and break points', 'body language as a performance tool', 'scenario thinking when trailing']], ], coachesEyebrow: 'head coaches', coachesTitle: 'Ariana & Jorge.', coachesSubtitle: 'two coaches · one vision · 16 years of combined experience', coachesData: [ ['Ariana Osorio', 'Head Coach', 'AO', 'ariana-face', 'Ariana grew up with tennis in Latin America and built her coaching style around personal attention and mental resilience. She plays competitive tennis herself and specialises in tactical development and physical youth coaching.', 'At ¡Eso! she has the eye that sees each talent individually, not the group — with the discipline to correct where it matters.'], ['Jorge Arevalo', 'Head Coach', 'JA', 'jorge-face', 'Jorge brought his coaching DNA from Latin America: technique down to the detail, hard work, joy through progression. He focuses on stroke mechanics and youth talent and has worked with players across all age groups.', 'At ¡Eso! he is the coach on court who shouts «¡eso!» at exactly the right moment — not as reward, but as confirmation that it clicked.'], ['Franc', 'Physical Trainer', 'F', null, '[Placeholder bio] Franc is an experienced tennis trainer specialised in physical preparation. He knows like no one else how to build a young tennis body: strength, speed, footwork and recovery — calibrated to age and growth phase.', 'At ¡Eso! he ensures our talents can play their best tennis injury-free for an entire season — not through one-off exercises, but a continuous physical programme alongside on-court training.'], ], // Programme programmaEyebrow: 'programme 2026', programmaTitle1: '14 weeks', programmaTitle2: 'of competitive tennis.', programmaIntro: 'Starts late August 2026, runs through end of November. Each week: group training, individual or duo sessions and physical training. Tournament coaching on Saturdays.', programmaScheduleLabel: 'weekly schedule', programmaScheduleNote: 'no training during May break · individual/duo flexibly schedulable', schedule: [['Mon', 'individual + physical', '2 hrs'], ['Tue', 'group training', '1 hr'], ['Wed', 'duo + physical', '2 hrs'], ['Fri', 'group training', '1 hr'], ['Fri', 'duo tennis', '1 hr'], ['Sat', 'duo / individual', '2 hrs']], commitmentTitle: 'commitment: 2 group trainings per week required.', commitmentBody: 'Steady attendance, steady payment. Only tournaments or illness count as valid reasons to miss a session. Individual and duo sessions stay flexible. Talents develop through consistent repetition — not through one-off lessons.', testimonial: '"our daughter climbed 1.5 levels in a year. but more importantly: she looks forward to every training, dares to fail and picks herself up after a lost game."', testimonialAuthor: '— parent of a talent (12 yrs)', krijgtEyebrow: 'included', krijgtTitle: 'what the talent gets.', krijgtItems: [ ['personal plan', 'individual development plan after intake — not one-size-fits-all for the group.'], ['reporting', 'written progress report every 6 weeks, with video moments.'], ['starter kit', '¡eso! kit: training shirt × 2, shorts, polo. not a gimmick — part of the programme.'], ['tournament coaching', 'coaching at Saturday tournaments — guidance between games.'], ['satellite clinics', 'access to specialist clinics at partner clubs.'], ['video analysis', 'one slow-motion video session per block on a core stroke.'], ], faqEyebrow: 'frequently asked', faqTitle: 'honest answers.', faqs: [ ['what age range is ¡eso! for?', 'we work with talents aged 8 to 15. the group is deliberately mixed in age so older talents act as role models and younger ones see what is possible.'], ['how do you select talents?', 'after a free intro (30 min) we look at motivation, commitment and playing level. we admit a maximum of 8 talents per season. not necessarily the best players — but the most coachable.'], ['how much does the whole programme cost?', 'the setup works per session type, no fixed package price. get in touch via coach@esotennis.nl for a custom quote — depending on schedule and number of sessions per week.'], ['what if my child is ill or has a tournament?', 'illness and tournaments are valid reasons to miss group trainings. individual and duo sessions can be rescheduled in consultation. all other absences count as taken.'], ['where do you train?', 'at tc bas dongen — a fixed complex with quality courts. we train outdoors there and, in winter, at a partner club indoor hall. exact addresses are shared at intake.'], ["what if my child doesn't play tournaments yet?", "no problem. we coach from the level «can play a match». within the programme we do encourage tournament participation, at their own pace."], ], inschrijvenEyebrow: 'free intro', inschrijvenTitle1: 'book an', inschrijvenTitle2: 'intro session.', inschrijvenBody: '30 minutes on court, one-on-one with Jorge or Ariana. We look at technique, motivation and whether we match. No sales pitch. Spots are limited — for the 2026 season we admit a maximum of 8 talents.', formEyebrow: 'sign up for intro', fieldName: 'talent name', fieldNamePh: 'e.g. Nora', fieldAge: 'age', fieldAgePh: '12', fieldEmail: 'parent/guardian email', fieldEmailPh: 'parent@example.com', fieldMsg: 'current level / notes', fieldMsgPh: 'e.g. level 7, focus on forehand', submit: 'request intro', submitNote: 'no spam · we only email to schedule the appointment.', thanksTitle: 'thank you', thanksBody: "We'll get in touch within 48 hours to schedule. In the meantime: write down which shot you most want to improve.", contactEmail: 'email', contactPhone: 'phone', contactLocation: 'location', locationText: 'tc bas dongen · training in dongen', clinicEyebrow: 'open clinic · jun 14, 2026', clinicTitle: 'An Open Clinic — Specifically for Young Talent.', clinicLede: 'On Sunday June 14, 2026 we are hosting an open clinic in Dongen. Three hours of intense tennis for youth players aged 8 to 15 from the region. Completely free. Limited spots.', clinicScheduleLabel: 'Programme', clinicSchedule: [ ['10:00', 'Welcome & intro'], ['10:30', 'Clinic part 1 — technique'], ['11:30', 'Clinic part 2 — match play'], ['12:30', 'Short 1-on-1 with parents'], ['13:00', 'Wrap-up'], ], clinicWhoTitle: 'For whom', clinicWho: ['Youth players aged 8 to 15', 'With serious tennis ambition', 'From Dongen and the surrounding region'], clinicWhatTitle: 'What you get', clinicWhat: ['3 hours of training with Jorge & Ariana', 'Written feedback per player', 'No obligation afterwards — genuinely free'], clinicCTA: 'Sign up for the clinic', clinicNote: 'Sign up before June 1, 2026 via coach@esotennis.nl', footerTagline: 'A small tennis academy for talents aged 8–15. Training in Dongen.', footerNav: 'navigation', footerNavItems: [['philosophy', '#filosofie'], ['the pillars', '#pijlers'], ['coaches', '#coaches'], ['programme', '#programma'], ['sign-up', '#inschrijven']], footerContact: 'contact', footerLocation: 'location', footerLocationText: 'tc bas dongen\\ntramstraat 14\\n5104 gr dongen', footerCopyright: '© ¡eso! tennis academy 2026', footerMade: 'made with care · in dongen', }, }; window.LangContext = LangContext; window.LangProvider = LangProvider; window.LangToggle = LangToggle; window.useT = useT; window.useLang = useLang; window.STRINGS = STRINGS;