// i18n.jsx — IRON GT SERIES translations (EN / RO / DE / FR / ES)
// Provides: LANGS, LangContext, useT() hook (t, lang, setLang, country, cond, fmtDate, fmtShort)

const LANGS = [
  { code: "en", label: "EN", name: "English" },
  { code: "ro", label: "RO", name: "Română" },
  { code: "de", label: "DE", name: "Deutsch" },
  { code: "fr", label: "FR", name: "Français" },
  { code: "es", label: "ES", name: "Español" },
];

const MON = {
  en: ["", "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
  ro: ["", "Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec"],
  de: ["", "Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],
  fr: ["", "Jan","Fév","Mar","Avr","Mai","Juin","Juil","Aoû","Sep","Oct","Nov","Déc"],
  es: ["", "Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],
};
const DOW = {
  en: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],
  ro: ["Lun","Mar","Mie","Joi","Vin","Sâm","Dum"],
  de: ["Mo","Di","Mi","Do","Fr","Sa","So"],
  fr: ["Lun","Mar","Mer","Jeu","Ven","Sam","Dim"],
  es: ["Lun","Mar","Mié","Jue","Vie","Sáb","Dom"],
};
const COUNTRY = {
  BEL: { en:"Belgium",   ro:"Belgia",    de:"Belgien",     fr:"Belgique",  es:"Bélgica" },
  DEU: { en:"Germany",   ro:"Germania",  de:"Deutschland", fr:"Allemagne", es:"Alemania" },
  ITA: { en:"Italy",     ro:"Italia",    de:"Italien",     fr:"Italie",    es:"Italia" },
  AUS: { en:"Australia", ro:"Australia", de:"Australien",  fr:"Australie", es:"Australia" },
  ESP: { en:"Spain",     ro:"Spania",    de:"Spanien",     fr:"Espagne",   es:"España" },
};
const COND = {
  day:      { en:"Day",            ro:"Zi",              de:"Tag",                 fr:"Jour",             es:"Día" },
  dusk:     { en:"Dusk",           ro:"Înserare",        de:"Dämmerung",           fr:"Crépuscule",       es:"Atardecer" },
  night:    { en:"Night",          ro:"Noapte",          de:"Nacht",               fr:"Nuit",             es:"Noche" },
  clear:    { en:"clear sky",      ro:"cer senin",       de:"klarer Himmel",       fr:"ciel dégagé",      es:"cielo despejado" },
  dynamic:  { en:"dynamic weather",ro:"vreme dinamică",  de:"dynamisches Wetter",  fr:"météo dynamique",  es:"clima dinámico" },
  variable: { en:"variable weather",ro:"vreme variabilă",de:"wechselhaftes Wetter",fr:"météo variable",   es:"clima variable" },
  dry:      { en:"dry",            ro:"uscat",           de:"trocken",             fr:"sec",              es:"seco" },
  lit:      { en:"partly lit",     ro:"iluminat parțial",de:"teils beleuchtet",    fr:"éclairage partiel",es:"iluminación parcial" },
  finale:   { en:"Finale",         ro:"Finală",          de:"Finale",              fr:"Finale",           es:"Final" },
};

const S = {
  en: {
    "nav.home":"Home","nav.races":"Races","nav.clasament":"Standings","nav.about":"About","nav.signup":"Sign up",
    "btn.viewRaces":"View races","btn.signup":"Sign up","btn.signupNow":"Sign up now",
    "btn.allCalendar":"Full calendar","btn.detailsRaces":"Race details","btn.enterDiscord":"Join Discord",
    "btn.backToCalendar":"Back to calendar","btn.signupAt":"Sign up for {name}","btn.reserve":"Reserve list",
    "btn.confirmEntry":"Confirm entry","btn.confirmDiscord":"Confirm on Discord",
    "btn.coffee":"Patreon",
    "chip.enrollOpen":"ENTRIES OPEN",
    "hero.eyebrow":"iRACING · GT3 CHAMPIONSHIP · SEASON 2026",
    "hero.lead":"An amateur GT3 championship in iRacing. One-class grid, the same format every round, clean racing. You drive — we organise.",
    "hero.next":"NEXT","hero.freeSpots":"{n} SPOTS LEFT",
    "home.do.eyebrow":"What we do","home.do.title":"One class.\nReal racing.",
    "home.do.lead":"We run a GT3 championship with weekly rounds in iRacing. No chaos, no car-to-car gaps — just you, the grid and the clock.",
    "home.next.eyebrow":"Up next","home.next.title":"The round ahead",
    "home.cal.eyebrow":"Calendar 2026","home.cal.title":"All {n} rounds","home.cal.soon":"Season coming soon","home.cal.soonText":"Calendar under construction — races will appear here once confirmed.",
    "feat.1.t":"All classes","feat.1.p":"GT3, LMP2, GTP and more — multi-class grids where BoP keeps it fair and every class fights its own battle.",
    "feat.2.t":"Diverse formats","feat.2.p":"Sprint races, endurance events, multi-class specials — the format adapts to the track and the season. Always competitive.",
    "feat.3.t":"Community","feat.3.p":"IronGTSeries Discord: briefings, results, highlights and voice on track.",
    "feat.4.t":"Clean racing","feat.4.p":"Clear etiquette rules, incident review and a code of conduct everyone respects.",
    "status.open":"GRID OPEN","status.filling":"FILLING UP","status.full":"GRID FULL","status.done":"FINISHED",
    "card.spots":"{n} spots","card.data":"Date","card.start":"Start","card.race":"Race","card.grid":"Grid",
    "card.laps":"laps","card.free":"{n} free","card.occ":"GRID FILLED",
    "weather.cloud":"Cloud Cover","weather.temp":"Temperature","weather.wind":"Wind","weather.humidity":"Humidity","weather.track":"Track",
    "banner.start":"Start","banner.discord":"🔒 Password on Discord",
    "pill.practice":"PRACTICE","pill.quali":"QUALI","pill.raceWord":"RACE",
    "val.practice":"{n} min","val.qualiLaps":"{n} laps","val.laps":"{n} laps",
    "feature.next":"NEXT ROUND","cd.days":"DAYS","cd.hrs":"HRS","cd.min":"MIN","cd.sec":"SEC",
    "feature.format":"Format","feature.practice":"Practice","feature.quali":"Quali","feature.grid":"Grid",
    "lbl.free":"free","lbl.hotlap":"hotlap",
    "sched.finale":"FINALE",
    "cta.title":"Ready for the grid?\nYour seat is waiting.","cta.text":"Join the Discord for the briefing and sign up for the next round in under a minute.",
    "races.eyebrow":"Season {y} · {n} rounds","races.title":"Championship\ncalendar",
    "races.lead":"Every round of the IRON GT3 Championship 2026. Each race: 3-lap qualifying, then the race. Entries close 2 hours before the start.",
    "races.rest":"Rest of the season","filter.all":"All","filter.open":"Grid open","filter.filling":"Filling up","races.empty":"No rounds in this category.",
    "about.eyebrow":"About","about.titleA":"What is","about.titleB":"IRON GT SERIES",
    "about.p1":"<b>IRON GT SERIES</b> is a sim racing championship in iRacing, organised by the community for amateur drivers and enthusiasts who want close, fair races and a clear competition format.",
    "about.p2":"Although our core started with the <b>GT3</b> class, the platform constantly evolves to offer diversity and challenges that match the community:<br><br><b>Diverse Formats:</b> From intense sprints to endurance races where strategy becomes essential.<br><br><b>Multi-Class Racing:</b> Special events where the grid expands with top prototypes (LMP2 and GTP), bringing the atmosphere of great endurance races to our server.<br><br><b>Full Balance:</b> For classes where needed, we activate Balance of Performance (BoP) — ensuring that on track it's the driver's skill and race management that counts, not just the choice of car.",
    "about.p3":"The <b>IronGTSeries Discord</b> server is our command centre. Here you'll find official briefings, dedicated voice channels, results, live standings and highlight sections. The process is simple: sign up on the site, join the Discord community and you're ready to race. <b>See you on the grid!</b>",
    "about.fmt.eyebrow":"Round format","about.fmt.title":"Three steps, every time",
    "step.step":"STEP {n}",
    "step.practice.t":"PRACTICE","step.practice.h":"","step.practice.p":"Free practice session to get comfortable with the track and make the final car adjustments.",
    "step.quali.t":"QUALIFYING","step.quali.h":"3 laps","step.quali.p":"A focused 3-lap qualifying session to set the grid order.",
    "step.race.t":"RACE","step.race.h":"The race","step.race.p":"The official start and the action on track.",
    "about.rules.eyebrow":"Regulations","about.rules.title":"Code of conduct","about.rules.lead":"A few simple rules keep us all on track. You accept them at sign-up.",
    "rule.a.t":"Clean racing","rule.a.p":"Leave room, don't divebomb into corners, give back a position gained unfairly.",
    "rule.b.t":"Incident review","rule.b.p":"Major incidents are reviewed after the race. Penalties are announced on Discord.",
    "rule.c.t":"Track limits","rule.c.p":"Respect track limits. Repeated warnings lead to a time penalty.",
    "rule.d.t":"Mandatory briefing","rule.d.p":"Before every round, read the pinned briefing on the round's channel.",
    "stat.class.k":"Class","stat.class.v":"mono-class, BoP","stat.rounds.k":"Rounds","stat.rounds.v":"season {y}",
    "stat.grid.k":"Grid","stat.grid.v":"spots / race","stat.platform.k":"Platform","stat.platform.v":"PC",
    "signup.eyebrow":"Round entry","signup.title":"Join the grid",
    "signup.lead":"Fill in your driver details and pick the round. Your seat is reserved instantly; final confirmation is on Discord.",
    "f.name":"Driver name","f.iracing":"iRacing customer ID","f.num":"Preferred car number","f.num2":"2nd choice car number","f.country":"Country",
    "f.race":"Round","f.car":"GT3 car","f.discord":"Discord handle","f.exp":"Experience level",
    "f.team":"Team name","f.help":"Help with league operations","f.notes":"Anything staff should know?",
    "exp.beginner":"Beginner","exp.inter":"Intermediate","exp.adv":"Advanced","exp.pro":"Pro",
    "signup.helpYes":"Yes, I'm interested","signup.helpNo":"No, not interested",
    "signup.lockConfirm":"I understand that my car and team choice are locked for the season unless league staff gives special permission.",
    "signup.agreePre":"I have read and accept the ","signup.agreeLink":"code of conduct","signup.agreePost":" and the round format (quali 3 laps · race).",
    "signup.submit":"Confirm entry","summary.title":"Grid pass","summary.completeName":"enter your name","summary.optional":"optional",
    "sline.round":"Round","sline.race":"Round","sline.date":"Date","sline.start":"Start","sline.driver":"Driver","sline.car":"Car","sline.num":"Number","sline.team":"Team","sline.free":"Grid free",
    "ph.name":"e.g. Mihai Voicu","ph.iracing":"e.g. 845321","ph.num":"e.g. 7","ph.num2":"e.g. 11","ph.discord":"e.g. mihai_v","ph.team":"e.g. Team Rossa","ph.notes":"Questions, suggestions, anything...",
    "ok.eyebrow":"Entry confirmed","ok.title":"You're on the grid","ok.note":"You'll get the round briefing on the Discord channel 24h before the start.",
    "footer.tagline":"Amateur GT3 championship in iRacing. Balanced racing, clear format, clean racing.",
    "footer.nav":"Navigation","footer.champ":"Championship","footer.community":"Community",
    "footer.calendar":"Calendar 2026","footer.formatRules":"Format & rules","footer.signupRound":"Round entry","footer.results":"Results (Discord)",
    "footer.twitch":"Twitch / Stream","footer.coc":"Code of conduct","footer.discordLink":"Discord","footer.discordBtn":"Join the Discord",
    "footer.bottom1":"© 2026 IRON GT SERIES — unofficial iRacing community project.","footer.bottom2":"NOT AFFILIATED WITH IRACING.COM MOTORSPORT SIMULATIONS",
    "standings.title":"STANDINGS","standings.lead":"Championship standings and round results. Updated after every race.",
    "standings.tab.general":"GENERAL","standings.tab.rounds":"ROUNDS",
    "standings.empty":"No results recorded yet. Standings appear after the first round.",
    "standings.noRounds":"No round results available.",
    "standings.loading":"Loading...","standings.laps":"LAPS",
    "standings.col.driver":"DRIVER","standings.col.car":"CAR","standings.col.races":"RACES",
    "standings.col.wins":"WINS","standings.col.podiums":"PODIUMS","standings.col.team":"TEAM",
    "standings.legend.win":"Win","standings.legend.pts":"Points: 25-18-15-12-10-8-6-4-2-1",
    "tower.title":"Live Timing","tower.lap":"LAP {a}/{b}",
    "ticker.next":"NEXT ROUND · <b>{name}</b> · RND {rnd} · {date} · {time} {tz}",
    "ticker.spots":"<b>{n} SPOTS LEFT</b> on the {name} grid — entries open",
    "ticker.filling":"<b>{name} RND {rnd}</b> · FILLING FAST · only {n} spots left",
    "ticker.format":"FORMAT · PRACTICE / QUALI <b>{q} LAPS</b> / RACE",
    "ticker.season":"SEASON <b>{y}</b> · {n} ROUNDS · GT3 ONLY · BoP ON",
    "ticker.clean":"CLEAN RACING · incident review after every race","ticker.soon1":"◈ IRON GT SERIES 2026 — SEASON INCOMING","ticker.soon2":"◈ CALENDAR DROPPING SOON · STAY TUNED","ticker.soon3":"◈ GT3 CHAMPIONSHIP · iRACING · COMPETITIVE GRID","ticker.soon4":"◈ JOIN DISCORD · BE FIRST TO KNOW WHEN SIGNUPS OPEN",
    "dw.online":"online now","dw.loading":"Loading...","dw.onlineNow":"ONLINE NOW","dw.info1":"GT3 Championship · iRacing · 2026","dw.info2":"Briefings, results, highlights","dw.info3":"Dedicated voice channels during races",
  },

  ro: {
    "nav.home":"Acasă","nav.races":"Curse","nav.clasament":"Clasament","nav.about":"Despre noi","nav.signup":"Înscriere",
    "btn.viewRaces":"Vezi cursele","btn.signup":"Înscrie-te","btn.signupNow":"Înscrie-te acum",
    "btn.allCalendar":"Tot calendarul","btn.detailsRaces":"Detalii curse","btn.enterDiscord":"Intră pe Discord",
    "btn.backToCalendar":"Înapoi la calendar","btn.signupAt":"Înscrie-te la {name}","btn.reserve":"Listă rezervă",
    "btn.confirmEntry":"Confirmă înscrierea","btn.confirmDiscord":"Confirmă pe Discord",
    "btn.coffee":"Patreon",
    "chip.enrollOpen":"ÎNSCRIERI DESCHISE",
    "hero.eyebrow":"iRACING · GT3 CHAMPIONSHIP · SEZON 2026",
    "hero.lead":"Campionat GT3 amator în iRacing. Grilă mono-clasă, format identic la fiecare etapă, curse curate. Tu conduci — noi organizăm.",
    "hero.next":"URMĂTOAREA","hero.freeSpots":"{n} LOCURI LIBERE",
    "home.do.eyebrow":"Ce facem","home.do.title":"O singură clasă.\nCurse pe bune.",
    "home.do.lead":"Organizăm un campionat GT3 cu etape săptămânale în iRacing. Fără haos, fără diferențe de mașini — doar tu, grila și cronometrul.",
    "home.next.eyebrow":"În așteptare","home.next.title":"Etapa care urmează",
    "home.cal.eyebrow":"Calendar 2026","home.cal.title":"Toate cele {n} etape","home.cal.soon":"Sezon în curând","home.cal.soonText":"Calendarul se construiește — cursele apar aici imediat ce sunt confirmate.",
    "feat.1.t":"Toate clasele","feat.1.p":"GT3, LMP2, GTP și altele — grile multi-clasă unde BoP menține echilibrul și fiecare clasă își dispută propria bătălie.",
    "feat.2.t":"Format diversificat","feat.2.p":"Sprinturi, curse de anduranță, speciale multi-clasă — formatul se adaptează circuitului și sezonului. Mereu competitiv.",
    "feat.3.t":"Comunitate","feat.3.p":"Server Discord IronGTSeries: briefing, rezultate, highlight-uri și voce în cursă.",
    "feat.4.t":"Clean racing","feat.4.p":"Reguli clare de etichetă, incident review și un cod de conduită respectat de toți.",
    "status.open":"GRILĂ DESCHISĂ","status.filling":"SE UMPLE","status.full":"GRILĂ PLINĂ","status.done":"TERMINATĂ",
    "card.spots":"{n} locuri","card.data":"Data","card.start":"Start","card.race":"Cursă","card.grid":"Grilă",
    "card.laps":"ture","card.free":"{n} libere","card.occ":"OCUPARE GRILĂ",
    "weather.cloud":"Nebulozitate","weather.temp":"Temperatură","weather.wind":"Vânt","weather.humidity":"Umiditate","weather.track":"Pistă",
    "banner.start":"Start","banner.discord":"🔒 Parolă pe Discord",
    "pill.practice":"PRACTICE","pill.quali":"QUALI","pill.raceWord":"CURSĂ",
    "val.practice":"{n} min","val.qualiLaps":"{n} ture","val.laps":"{n} ture",
    "feature.next":"URMĂTOAREA ETAPĂ","cd.days":"ZILE","cd.hrs":"ORE","cd.min":"MIN","cd.sec":"SEC",
    "feature.format":"Format","feature.practice":"Practice","feature.quali":"Quali","feature.grid":"Grilă",
    "lbl.free":"liber","lbl.hotlap":"hotlap",
    "sched.finale":"FINALĂ",
    "cta.title":"Gata de grilă?\nLocul tău te așteaptă.","cta.text":"Intră pe Discord pentru briefing și înscrie-te la următoarea etapă în mai puțin de un minut.",
    "races.eyebrow":"Sezon {y} · {n} etape","races.title":"Calendarul\ncampionatului",
    "races.lead":"Toate etapele IRON GT3 Championship 2026. Fiecare cursă: calificări pe 3 ture, apoi cursa. Înscrierile se închid cu 2 ore înainte de start.",
    "races.rest":"Restul sezonului","filter.all":"Toate","filter.open":"Grilă deschisă","filter.filling":"Se umple","races.empty":"Nicio etapă în această categorie.",
    "about.eyebrow":"Despre noi","about.titleA":"Ce este","about.titleB":"IRON GT SERIES",
    "about.p1":"<b>IRON GT SERIES</b> este un campionat de sim racing în iRacing, organizat de comunitate pentru piloți amatori și pasionați care își doresc curse strânse, corecte și un format clar de competiție.",
    "about.p2":"Deși nucleul nostru a pornit de la clasa <b>GT3</b>, platforma evoluează constant pentru a oferi diversitate și provocări pe măsura comunității:<br><br><b>Formate Diverse:</b> De la sprinturi intense la curse de anduranță unde strategia devine esențială.<br><br><b>Curse Multi-Clasă:</b> Evenimente speciale unde grila se extinde cu prototipuri de top (LMP2 și GTP), aducând atmosfera marilor curse de anduranță direct pe serverul nostru.<br><br><b>Echilibru Total:</b> Pentru clasele unde este necesar, activăm Balance of Performance (BoP), asigurându-ne că pe circuit contează abilitatea pilotului și managementul cursei, nu doar alegerea mașinii.",
    "about.p3":"Serverul de <b>Discord IronGTSeries</b> este centrul nostru de comandă. Aici găsești briefing-uri oficiale, canale de voce dedicate, rezultate, clasamente la zi și secțiuni de highlight-uri. Procesul este simplu: te înscrii pe site, te alături comunității de pe Discord și ești gata de cursă. <b>Ne vedem pe grilă!</b>",
    "about.fmt.eyebrow":"Formatul unei etape","about.fmt.title":"Trei pași, de fiecare dată",
    "step.step":"PASUL {n}",
    "step.practice.t":"PRACTICE","step.practice.h":"","step.practice.p":"Sesiune de practică liberă pentru acomodare cu circuitul și ultimele reglaje.",
    "step.quali.t":"QUALIFYING","step.quali.h":"3 ture","step.quali.p":"Sesiune concentrată pe 3 tururi pentru stabilirea grilei.",
    "step.race.t":"RACE","step.race.h":"Cursa","step.race.p":"Startul oficial și acțiunea pe circuit.",
    "about.rules.eyebrow":"Regulament","about.rules.title":"Codul de conduită","about.rules.lead":"Câteva reguli simple ne țin pe toți pe pistă. Le accepți la înscriere.",
    "rule.a.t":"Clean racing","rule.a.p":"Lasă spațiu, nu împinge în viraje, returnează poziția câștigată cu avantaj nesportiv.",
    "rule.b.t":"Incident review","rule.b.p":"Incidentele majore sunt analizate după cursă. Penalizările se anunță pe Discord.",
    "rule.c.t":"Track limits","rule.c.p":"Respectă limitele pistei. Avertismentele repetate duc la penalizare de timp.",
    "rule.d.t":"Briefing obligatoriu","rule.d.p":"Înainte de fiecare etapă, citește briefing-ul pinned pe canalul etapei.",
    "stat.class.k":"Clasă","stat.class.v":"mono-clasă, BoP","stat.rounds.k":"Etape","stat.rounds.v":"sezon {y}",
    "stat.grid.k":"Grilă","stat.grid.v":"locuri / cursă","stat.platform.k":"Platformă","stat.platform.v":"PC",
    "signup.eyebrow":"Înscriere etapă","signup.title":"Intră în grilă",
    "signup.lead":"Completează datele de pilot și alege etapa. Locul se rezervă instant; confirmarea finală se face pe Discord.",
    "f.name":"Nume pilot","f.iracing":"iRacing customer ID","f.num":"Număr mașină preferat","f.num2":"A 2-a opțiune număr","f.country":"Țară",
    "f.race":"Etapă","f.car":"Mașină GT3","f.discord":"Discord handle","f.exp":"Nivel experiență",
    "f.team":"Nume echipă","f.help":"Ajutor operațiuni ligă","f.notes":"Ceva pentru staff?",
    "exp.beginner":"Începător","exp.inter":"Intermediar","exp.adv":"Avansat","exp.pro":"Pro",
    "signup.helpYes":"Da, sunt interesat(ă)","signup.helpNo":"Nu, mulțumesc",
    "signup.lockConfirm":"Înțeleg că alegerea mașinii și echipei este blocată pentru tot sezonul, cu excepția permisiunii speciale a staff-ului.",
    "signup.agreePre":"Am citit și accept ","signup.agreeLink":"codul de conduită","signup.agreePost":" și formatul etapei (quali 3 ture · cursă).",
    "signup.submit":"Confirmă înscrierea","summary.title":"Bilet de grilă","summary.completeName":"completează numele","summary.optional":"opțional",
    "sline.round":"Etapă","sline.race":"Etapă","sline.date":"Data","sline.start":"Start","sline.driver":"Pilot","sline.car":"Mașină","sline.num":"Număr","sline.team":"Echipă","sline.free":"Grilă liberă",
    "ph.name":"ex. Mihai Voicu","ph.iracing":"ex. 845321","ph.num":"ex. 7","ph.num2":"ex. 11","ph.discord":"ex. mihai_v","ph.team":"ex. Team Rossa","ph.notes":"Întrebări, sugestii, orice...",
    "ok.eyebrow":"Înscriere confirmată","ok.title":"Ești în grilă","ok.note":"Vei primi briefing-ul etapei pe canalul de Discord cu 24h înainte de start.",
    "footer.tagline":"Campionat GT3 amator în iRacing. Curse echilibrate, format clar, clean racing.",
    "footer.nav":"Navigare","footer.champ":"Campionat","footer.community":"Comunitate",
    "footer.calendar":"Calendar 2026","footer.formatRules":"Format & reguli","footer.signupRound":"Înscriere etapă","footer.results":"Rezultate (Discord)",
    "footer.twitch":"Twitch / Stream","footer.coc":"Cod de conduită","footer.discordLink":"Discord","footer.discordBtn":"Intră pe Discord",
    "footer.bottom1":"© 2026 IRON GT SERIES — proiect neoficial al comunității iRacing.","footer.bottom2":"NEAFILIAT CU IRACING.COM MOTORSPORT SIMULATIONS",
    "standings.title":"CLASAMENT","standings.lead":"Clasamentul campionatului și rezultatele etapelor. Actualizat după fiecare cursă.",
    "standings.tab.general":"GENERAL","standings.tab.rounds":"ETAPE",
    "standings.empty":"Niciun rezultat înregistrat încă. Clasamentul apare după prima etapă.",
    "standings.noRounds":"Niciun rezultat de etapă disponibil.",
    "standings.loading":"Se încarcă...","standings.laps":"TURE",
    "standings.col.driver":"PILOT","standings.col.car":"MAȘINĂ","standings.col.races":"CURSE",
    "standings.col.wins":"VICTORII","standings.col.podiums":"PODIUM","standings.col.team":"ECHIPĂ",
    "standings.legend.win":"Victorie","standings.legend.pts":"Sistem puncte: 25-18-15-12-10-8-6-4-2-1",
    "tower.title":"Live Timing","tower.lap":"TUR {a}/{b}",
    "ticker.next":"ETAPA VIITOARE · <b>{name}</b> · RND {rnd} · {date} · {time} {tz}",
    "ticker.spots":"<b>{n} LOCURI LIBERE</b> la {name} — înscrieri deschise",
    "ticker.filling":"<b>{name} RND {rnd}</b> · SE UMPLE · doar {n} locuri rămase",
    "ticker.format":"FORMAT · PRACTICE / QUALI <b>{q} TURE</b> / CURSĂ",
    "ticker.season":"SEZON <b>{y}</b> · {n} ETAPE · DOAR GT3 · BoP ACTIV",
    "ticker.clean":"CLEAN RACING · incident review după fiecare cursă","ticker.soon1":"◈ IRON GT SERIES 2026 — SEZONUL SE ANUNȚĂ","ticker.soon2":"◈ CALENDARUL VINE CURÂND · FII PRIMUL CU OCHII PE NOI","ticker.soon3":"◈ CAMPIONAT GT3 · iRACING · GRILĂ COMPETITIVĂ","ticker.soon4":"◈ INTRĂ PE DISCORD · FII PRIMUL CÂND SE DESCHID ÎNSCRIERILE",
    "dw.online":"online acum","dw.loading":"Se încarcă...","dw.onlineNow":"ONLINE ACUM","dw.info1":"Campionat GT3 · iRacing · 2026","dw.info2":"Briefing-uri, rezultate, highlights","dw.info3":"Canale voice dedicate în cursă",
  },

  de: {
    "nav.home":"Start","nav.races":"Rennen","nav.clasament":"Ergebnisse","nav.about":"Über uns","nav.signup":"Anmeldung",
    "btn.viewRaces":"Rennen ansehen","btn.signup":"Anmelden","btn.signupNow":"Jetzt anmelden",
    "btn.allCalendar":"Ganzer Kalender","btn.detailsRaces":"Renndetails","btn.enterDiscord":"Discord beitreten",
    "btn.backToCalendar":"Zurück zum Kalender","btn.signupAt":"Für {name} anmelden","btn.reserve":"Warteliste",
    "btn.confirmEntry":"Anmeldung bestätigen","btn.confirmDiscord":"Auf Discord bestätigen",
    "btn.coffee":"Patreon",
    "chip.enrollOpen":"ANMELDUNG OFFEN",
    "hero.eyebrow":"iRACING · GT3 CHAMPIONSHIP · SAISON 2026",
    "hero.lead":"Eine Amateur-GT3-Meisterschaft in iRacing. Einklassen-Grid, gleiches Format bei jedem Lauf, sauberes Racing. Du fährst — wir organisieren.",
    "hero.next":"NÄCHSTER","hero.freeSpots":"{n} PLÄTZE FREI",
    "home.do.eyebrow":"Was wir machen","home.do.title":"Eine Klasse.\nEchtes Racing.",
    "home.do.lead":"Wir veranstalten eine GT3-Meisterschaft mit wöchentlichen Läufen in iRacing. Kein Chaos, keine Fahrzeugunterschiede — nur du, das Grid und die Uhr.",
    "home.next.eyebrow":"Als Nächstes","home.next.title":"Der nächste Lauf",
    "home.cal.eyebrow":"Kalender 2026","home.cal.title":"Alle {n} Läufe","home.cal.soon":"Saison kommt bald","home.cal.soonText":"Kalender im Aufbau — Läufe erscheinen hier, sobald sie bestätigt sind.",
    "feat.1.t":"Alle Klassen","feat.1.p":"GT3, LMP2, GTP und mehr — Multi-Klassen-Grids, bei denen BoP für Ausgeglichenheit sorgt und jede Klasse ihr eigenes Duell ausficht.",
    "feat.2.t":"Vielfältige Formate","feat.2.p":"Sprintrennen, Ausdauerrennen, Multi-Klassen-Events — das Format passt sich an Strecke und Saison an. Immer kompetitiv.",
    "feat.3.t":"Community","feat.3.p":"IronGTSeries-Discord: Briefings, Ergebnisse, Highlights und Voice on Track.",
    "feat.4.t":"Sauberes Racing","feat.4.p":"Klare Etikette-Regeln, Incident-Review und ein Verhaltenskodex, den alle respektieren.",
    "status.open":"GRID OFFEN","status.filling":"FÜLLT SICH","status.full":"GRID VOLL","status.done":"BEENDET",
    "card.spots":"{n} Plätze","card.data":"Datum","card.start":"Start","card.race":"Rennen","card.grid":"Grid",
    "card.laps":"Runden","card.free":"{n} frei","card.occ":"GRID-AUSLASTUNG",
    "weather.cloud":"Bewölkung","weather.temp":"Temperatur","weather.wind":"Wind","weather.humidity":"Luftfeuchtigkeit","weather.track":"Strecke",
    "banner.start":"Start","banner.discord":"🔒 Passwort auf Discord",
    "pill.practice":"PRACTICE","pill.quali":"QUALI","pill.raceWord":"RENNEN",
    "val.practice":"{n} Min","val.qualiLaps":"{n} Runden","val.laps":"{n} Runden",
    "feature.next":"NÄCHSTER LAUF","cd.days":"TAGE","cd.hrs":"STD","cd.min":"MIN","cd.sec":"SEK",
    "feature.format":"Format","feature.practice":"Training","feature.quali":"Quali","feature.grid":"Grid",
    "lbl.free":"frei","lbl.hotlap":"Hotlap",
    "sched.finale":"FINALE",
    "cta.title":"Bereit fürs Grid?\nDein Platz wartet.","cta.text":"Komm auf den Discord für das Briefing und melde dich in unter einer Minute für den nächsten Lauf an.",
    "races.eyebrow":"Saison {y} · {n} Läufe","races.title":"Meisterschafts-\nkalender",
    "races.lead":"Jeder Lauf der IRON GT3 Championship 2026. Jedes Rennen: 3-Runden-Qualifying, dann das Rennen. Anmeldungen schließen 2 Stunden vor dem Start.",
    "races.rest":"Rest der Saison","filter.all":"Alle","filter.open":"Grid offen","filter.filling":"Füllt sich","races.empty":"Keine Läufe in dieser Kategorie.",
    "about.eyebrow":"Über uns","about.titleA":"Was ist","about.titleB":"IRON GT SERIES",
    "about.p1":"<b>IRON GT SERIES</b> ist eine Sim-Racing-Meisterschaft in iRacing, von der Community für Amateurfahrer und Enthusiasten organisiert, die enge, faire Rennen und ein klares Wettbewerbsformat suchen.",
    "about.p2":"Obwohl unser Kern mit der <b>GT3</b>-Klasse begann, entwickelt sich die Plattform ständig weiter, um Vielfalt und Herausforderungen für die Community zu bieten:<br><br><b>Vielfältige Formate:</b> Von intensiven Sprints bis zu Ausdauerrennen, bei denen Strategie entscheidend wird.<br><br><b>Multi-Klassen-Rennen:</b> Sonderevents, bei denen das Grid um Top-Prototypen (LMP2 und GTP) erweitert wird und die Atmosphäre der großen Ausdauerrennen auf unseren Server bringt.<br><br><b>Vollständiges Gleichgewicht:</b> Wo es nötig ist, aktivieren wir den Balance of Performance (BoP) — auf der Strecke zählen Fahrkönnen und Rennmanagement, nicht nur die Wahl des Fahrzeugs.",
    "about.p3":"Der <b>IronGTSeries Discord</b>-Server ist unser Kommandozentrum. Hier findest du offizielle Briefings, dedizierte Voice-Kanäle, Ergebnisse, aktuelle Standings und Highlight-Bereiche. Der Prozess ist einfach: Melde dich auf der Seite an, tritt der Discord-Community bei und du bist rennbereit. <b>Wir sehen uns im Grid!</b>",
    "about.fmt.eyebrow":"Laufformat","about.fmt.title":"Drei Schritte, jedes Mal",
    "step.step":"SCHRITT {n}",
    "step.practice.t":"TRAINING","step.practice.h":"","step.practice.p":"Freies Training zur Eingewöhnung an die Strecke und für die letzten Fahrzeugeinstellungen.",
    "step.quali.t":"QUALIFYING","step.quali.h":"3 Runden","step.quali.p":"Eine konzentrierte 3-Runden-Qualifying-Session zur Ermittlung der Startaufstellung.",
    "step.race.t":"RENNEN","step.race.h":"Das Rennen","step.race.p":"Offizieller Start und Action auf der Strecke.",
    "about.rules.eyebrow":"Reglement","about.rules.title":"Verhaltenskodex","about.rules.lead":"Ein paar einfache Regeln halten uns alle auf der Strecke. Du akzeptierst sie bei der Anmeldung.",
    "rule.a.t":"Sauberes Racing","rule.a.p":"Lass Platz, kein Reinbremsen in Kurven, gib eine unfair gewonnene Position zurück.",
    "rule.b.t":"Incident-Review","rule.b.p":"Schwere Vorfälle werden nach dem Rennen geprüft. Strafen werden auf Discord bekanntgegeben.",
    "rule.c.t":"Track Limits","rule.c.p":"Streckengrenzen respektieren. Wiederholte Verwarnungen führen zu einer Zeitstrafe.",
    "rule.d.t":"Pflicht-Briefing","rule.d.p":"Lies vor jedem Lauf das angepinnte Briefing im Kanal des Laufs.",
    "stat.class.k":"Klasse","stat.class.v":"Einklasse, BoP","stat.rounds.k":"Läufe","stat.rounds.v":"Saison {y}",
    "stat.grid.k":"Grid","stat.grid.v":"Plätze / Rennen","stat.platform.k":"Plattform","stat.platform.v":"PC",
    "signup.eyebrow":"Lauf-Anmeldung","signup.title":"Ins Grid einsteigen",
    "signup.lead":"Trag deine Fahrerdaten ein und wähl den Lauf. Dein Platz wird sofort reserviert; die endgültige Bestätigung erfolgt auf Discord.",
    "f.name":"Fahrername","f.iracing":"iRacing-Kundennummer","f.num":"Wunschstartnummer","f.num2":"2. Wunschnummer","f.country":"Land",
    "f.race":"Lauf","f.car":"GT3-Auto","f.discord":"Discord-Handle","f.exp":"Erfahrungslevel",
    "f.team":"Teamname","f.help":"Mitarbeit im Liga-Betrieb","f.notes":"Anmerkungen für die Rennleitung?",
    "exp.beginner":"Anfänger","exp.inter":"Mittel","exp.adv":"Fortgeschritten","exp.pro":"Pro",
    "signup.helpYes":"Ja, ich bin interessiert","signup.helpNo":"Nein, danke",
    "signup.lockConfirm":"Ich verstehe, dass meine Auto- und Teamwahl für die Saison festgelegt ist, sofern die Rennleitung keine Sondergenehmigung erteilt.",
    "signup.agreePre":"Ich habe den ","signup.agreeLink":"Verhaltenskodex","signup.agreePost":" und das Laufformat (Quali 3 Runden · Rennen) gelesen und akzeptiert.",
    "signup.submit":"Anmeldung bestätigen","summary.title":"Grid-Pass","summary.completeName":"Namen eingeben","summary.optional":"optional",
    "sline.round":"Lauf","sline.race":"Lauf","sline.date":"Datum","sline.start":"Start","sline.driver":"Fahrer","sline.car":"Auto","sline.num":"Nummer","sline.team":"Team","sline.free":"Grid frei",
    "ph.name":"z. B. Mihai Voicu","ph.iracing":"z. B. 845321","ph.num":"z. B. 7","ph.num2":"z. B. 11","ph.discord":"z. B. mihai_v","ph.team":"z. B. Team Rossa","ph.notes":"Fragen, Vorschläge, alles...",
    "ok.eyebrow":"Anmeldung bestätigt","ok.title":"Du bist im Grid","ok.note":"Du erhältst das Lauf-Briefing 24h vor dem Start im Discord-Kanal.",
    "footer.tagline":"Amateur-GT3-Meisterschaft in iRacing. Ausgeglichenes Racing, klares Format, sauberes Racing.",
    "footer.nav":"Navigation","footer.champ":"Meisterschaft","footer.community":"Community",
    "footer.calendar":"Kalender 2026","footer.formatRules":"Format & Regeln","footer.signupRound":"Lauf-Anmeldung","footer.results":"Ergebnisse (Discord)",
    "footer.twitch":"Twitch / Stream","footer.coc":"Verhaltenskodex","footer.discordLink":"Discord","footer.discordBtn":"Discord beitreten",
    "footer.bottom1":"© 2026 IRON GT SERIES — inoffizielles iRacing-Community-Projekt.","footer.bottom2":"NICHT MIT IRACING.COM MOTORSPORT SIMULATIONS VERBUNDEN",
    "standings.title":"ERGEBNISSE","standings.lead":"Meisterschaftsstand und Laufergebnisse. Aktualisiert nach jedem Rennen.",
    "standings.tab.general":"GESAMT","standings.tab.rounds":"LÄUFE",
    "standings.empty":"Noch keine Ergebnisse eingetragen. Das Ranking erscheint nach dem ersten Lauf.",
    "standings.noRounds":"Keine Laufergebnisse verfügbar.",
    "standings.loading":"Wird geladen...","standings.laps":"RUNDEN",
    "standings.col.driver":"FAHRER","standings.col.car":"AUTO","standings.col.races":"RENNEN",
    "standings.col.wins":"SIEGE","standings.col.podiums":"PODIUM","standings.col.team":"TEAM",
    "standings.legend.win":"Sieg","standings.legend.pts":"Punktesystem: 25-18-15-12-10-8-6-4-2-1",
    "tower.title":"Live Timing","tower.lap":"RUNDE {a}/{b}",
    "ticker.next":"NÄCHSTER LAUF · <b>{name}</b> · RND {rnd} · {date} · {time} {tz}",
    "ticker.spots":"<b>{n} PLÄTZE FREI</b> beim {name} — Anmeldungen offen",
    "ticker.filling":"<b>{name} RND {rnd}</b> · FÜLLT SICH · nur noch {n} Plätze",
    "ticker.format":"FORMAT · TRAINING / QUALI <b>{q} RUNDEN</b> / RENNEN",
    "ticker.season":"SAISON <b>{y}</b> · {n} LÄUFE · NUR GT3 · BoP AKTIV",
    "ticker.clean":"SAUBERES RACING · Incident-Review nach jedem Rennen","ticker.soon1":"◈ IRON GT SERIES 2026 — SAISON KOMMT","ticker.soon2":"◈ KALENDER BALD VERFÜGBAR · BLEIB DRAN","ticker.soon3":"◈ GT3-MEISTERSCHAFT · iRACING · KOMPETITIVES GRID","ticker.soon4":"◈ TRITT DISCORD BEI · SEI DER ERSTE WENN ANMELDUNGEN ÖFFNEN",
    "dw.online":"online jetzt","dw.loading":"Lädt...","dw.onlineNow":"JETZT ONLINE","dw.info1":"GT3-Meisterschaft · iRacing · 2026","dw.info2":"Briefings, Ergebnisse, Highlights","dw.info3":"Dedizierte Voice-Kanäle während des Rennens",
  },

  fr: {
    "nav.home":"Accueil","nav.races":"Courses","nav.clasament":"Classement","nav.about":"À propos","nav.signup":"Inscription",
    "btn.viewRaces":"Voir les courses","btn.signup":"S'inscrire","btn.signupNow":"S'inscrire maintenant",
    "btn.allCalendar":"Calendrier complet","btn.detailsRaces":"Détails des courses","btn.enterDiscord":"Rejoindre Discord",
    "btn.backToCalendar":"Retour au calendrier","btn.signupAt":"S'inscrire à {name}","btn.reserve":"Liste d'attente",
    "btn.confirmEntry":"Confirmer l'inscription","btn.confirmDiscord":"Confirmer sur Discord",
    "btn.coffee":"Patreon",
    "chip.enrollOpen":"INSCRIPTIONS OUVERTES",
    "hero.eyebrow":"iRACING · GT3 CHAMPIONSHIP · SAISON 2026",
    "hero.lead":"Un championnat GT3 amateur sur iRacing. Grille mono-classe, même format à chaque manche, du fair-play. Tu pilotes — on organise.",
    "hero.next":"PROCHAINE","hero.freeSpots":"{n} PLACES LIBRES",
    "home.do.eyebrow":"Ce qu'on fait","home.do.title":"Une seule classe.\nDe la vraie course.",
    "home.do.lead":"On organise un championnat GT3 avec des manches hebdomadaires sur iRacing. Pas de chaos, pas d'écarts entre voitures — juste toi, la grille et le chrono.",
    "home.next.eyebrow":"À venir","home.next.title":"La prochaine manche",
    "home.cal.eyebrow":"Calendrier 2026","home.cal.title":"Les {n} manches","home.cal.soon":"Saison bientôt","home.cal.soonText":"Calendrier en construction — les manches apparaîtront ici une fois confirmées.",
    "feat.1.t":"Toutes les classes","feat.1.p":"GT3, LMP2, GTP et plus — des grilles multi-classes où le BoP maintient l'équilibre et chaque classe dispute sa propre bataille.",
    "feat.2.t":"Formats diversifiés","feat.2.p":"Sprints, courses d'endurance, événements multi-classes — le format s'adapte au circuit et à la saison. Toujours compétitif.",
    "feat.3.t":"Communauté","feat.3.p":"Discord IronGTSeries : briefings, résultats, highlights et voix en course.",
    "feat.4.t":"Fair-play","feat.4.p":"Des règles d'étiquette claires, un incident review et un code de conduite respecté par tous.",
    "status.open":"GRILLE OUVERTE","status.filling":"SE REMPLIT","status.full":"GRILLE PLEINE","status.done":"TERMINÉE",
    "card.spots":"{n} places","card.data":"Date","card.start":"Départ","card.race":"Course","card.grid":"Grille",
    "card.laps":"tours","card.free":"{n} libres","card.occ":"REMPLISSAGE GRILLE",
    "weather.cloud":"Nuages","weather.temp":"Température","weather.wind":"Vent","weather.humidity":"Humidité","weather.track":"Piste",
    "banner.start":"Départ","banner.discord":"🔒 Mot de passe sur Discord",
    "pill.practice":"ESSAIS","pill.quali":"QUALIF","pill.raceWord":"COURSE",
    "val.practice":"{n} min","val.qualiLaps":"{n} tours","val.laps":"{n} tours",
    "feature.next":"PROCHAINE MANCHE","cd.days":"JOURS","cd.hrs":"H","cd.min":"MIN","cd.sec":"SEC",
    "feature.format":"Format","feature.practice":"Essais","feature.quali":"Qualif","feature.grid":"Grille",
    "lbl.free":"libre","lbl.hotlap":"hotlap",
    "sched.finale":"FINALE",
    "cta.title":"Prêt pour la grille ?\nTa place t'attend.","cta.text":"Rejoins le Discord pour le briefing et inscris-toi à la prochaine manche en moins d'une minute.",
    "races.eyebrow":"Saison {y} · {n} manches","races.title":"Calendrier du\nchampionnat",
    "races.lead":"Toutes les manches du IRON GT3 Championship 2026. Chaque course : qualifs en 3 tours, puis la course. Les inscriptions ferment 2 heures avant le départ.",
    "races.rest":"Le reste de la saison","filter.all":"Toutes","filter.open":"Grille ouverte","filter.filling":"Se remplit","races.empty":"Aucune manche dans cette catégorie.",
    "about.eyebrow":"À propos","about.titleA":"Qu'est-ce que","about.titleB":"IRON GT SERIES",
    "about.p1":"<b>IRON GT SERIES</b> est un championnat de sim racing sur iRacing, organisé par la communauté pour les pilotes amateurs et les passionnés qui souhaitent des courses serrées, équitables et un format de compétition clair.",
    "about.p2":"Bien que notre noyau soit parti de la classe <b>GT3</b>, la plateforme évolue constamment pour offrir diversité et défis à la mesure de la communauté :<br><br><b>Formats Diversifiés :</b> Des sprints intenses aux courses d'endurance où la stratégie devient essentielle.<br><br><b>Course Multi-Classe :</b> Événements spéciaux où la grille s'élargit avec les meilleurs prototypes (LMP2 et GTP), apportant l'atmosphère des grandes courses d'endurance sur notre serveur.<br><br><b>Équilibre Total :</b> Pour les classes où c'est nécessaire, nous activons le Balance of Performance (BoP) — sur piste, c'est la compétence du pilote et la gestion de course qui comptent, pas seulement le choix de la voiture.",
    "about.p3":"Le serveur <b>Discord IronGTSeries</b> est notre centre de commandement. Tu y trouveras les briefings officiels, des salons vocaux dédiés, les résultats, le classement en direct et des sections de highlights. Le processus est simple : inscris-toi sur le site, rejoins la communauté Discord et tu es prêt à piloter. <b>On se retrouve sur la grille !</b>",
    "about.fmt.eyebrow":"Format d'une manche","about.fmt.title":"Trois étapes, à chaque fois",
    "step.step":"ÉTAPE {n}",
    "step.practice.t":"ESSAIS","step.practice.h":"","step.practice.p":"Essais libres pour se familiariser avec le circuit et effectuer les derniers réglages.",
    "step.quali.t":"QUALIFICATIONS","step.quali.h":"3 tours","step.quali.p":"Une séance de qualifications concentrée sur 3 tours pour établir l'ordre de la grille.",
    "step.race.t":"COURSE","step.race.h":"La course","step.race.p":"Le départ officiel et l'action sur la piste.",
    "about.rules.eyebrow":"Règlement","about.rules.title":"Code de conduite","about.rules.lead":"Quelques règles simples nous gardent tous en piste. Tu les acceptes à l'inscription.",
    "rule.a.t":"Fair-play","rule.a.p":"Laisse de la place, pas de plongeon en virage, rends une position gagnée déloyalement.",
    "rule.b.t":"Incident review","rule.b.p":"Les incidents majeurs sont revus après la course. Les pénalités sont annoncées sur Discord.",
    "rule.c.t":"Limites de piste","rule.c.p":"Respecte les limites de piste. Des avertissements répétés mènent à une pénalité en temps.",
    "rule.d.t":"Briefing obligatoire","rule.d.p":"Avant chaque manche, lis le briefing épinglé sur le canal de la manche.",
    "stat.class.k":"Classe","stat.class.v":"mono-classe, BoP","stat.rounds.k":"Manches","stat.rounds.v":"saison {y}",
    "stat.grid.k":"Grille","stat.grid.v":"places / course","stat.platform.k":"Plateforme","stat.platform.v":"PC",
    "signup.eyebrow":"Inscription manche","signup.title":"Prends la grille",
    "signup.lead":"Renseigne tes infos de pilote et choisis la manche. Ta place est réservée instantanément ; la confirmation finale se fait sur Discord.",
    "f.name":"Nom du pilote","f.iracing":"ID client iRacing","f.num":"Numéro préféré","f.num2":"2e choix de numéro","f.country":"Pays",
    "f.race":"Manche","f.car":"Voiture GT3","f.discord":"Pseudo Discord","f.exp":"Niveau d'expérience",
    "f.team":"Nom de l'équipe","f.help":"Aide aux opérations de la ligue","f.notes":"Remarques pour le staff ?",
    "exp.beginner":"Débutant","exp.inter":"Intermédiaire","exp.adv":"Avancé","exp.pro":"Pro",
    "signup.helpYes":"Oui, je suis intéressé(e)","signup.helpNo":"Non, merci",
    "signup.lockConfirm":"Je comprends que mon choix de voiture et d'équipe est verrouillé pour la saison, sauf autorisation spéciale du staff.",
    "signup.agreePre":"J'ai lu et j'accepte le ","signup.agreeLink":"code de conduite","signup.agreePost":" et le format de la manche (qualif 3 tours · course).",
    "signup.submit":"Confirmer l'inscription","summary.title":"Pass grille","summary.completeName":"saisis ton nom","summary.optional":"optionnel",
    "sline.round":"Manche","sline.race":"Manche","sline.date":"Date","sline.start":"Départ","sline.driver":"Pilote","sline.car":"Voiture","sline.num":"Numéro","sline.team":"Équipe","sline.free":"Grille libre",
    "ph.name":"ex. Mihai Voicu","ph.iracing":"ex. 845321","ph.num":"ex. 7","ph.num2":"ex. 11","ph.discord":"ex. mihai_v","ph.team":"ex. Team Rossa","ph.notes":"Questions, suggestions, tout...",
    "ok.eyebrow":"Inscription confirmée","ok.title":"Tu es sur la grille","ok.note":"Tu recevras le briefing de la manche sur le canal Discord 24h avant le départ.",
    "footer.tagline":"Championnat GT3 amateur sur iRacing. Courses équilibrées, format clair, fair-play.",
    "footer.nav":"Navigation","footer.champ":"Championnat","footer.community":"Communauté",
    "footer.calendar":"Calendrier 2026","footer.formatRules":"Format & règles","footer.signupRound":"Inscription manche","footer.results":"Résultats (Discord)",
    "footer.twitch":"Twitch / Stream","footer.coc":"Code de conduite","footer.discordLink":"Discord","footer.discordBtn":"Rejoindre le Discord",
    "footer.bottom1":"© 2026 IRON GT SERIES — projet communautaire iRacing non officiel.","footer.bottom2":"NON AFFILIÉ À IRACING.COM MOTORSPORT SIMULATIONS",
    "standings.title":"CLASSEMENT","standings.lead":"Classement du championnat et résultats des manches. Mis à jour après chaque course.",
    "standings.tab.general":"GÉNÉRAL","standings.tab.rounds":"MANCHES",
    "standings.empty":"Aucun résultat enregistré. Le classement apparaît après la première manche.",
    "standings.noRounds":"Aucun résultat de manche disponible.",
    "standings.loading":"Chargement...","standings.laps":"TOURS",
    "standings.col.driver":"PILOTE","standings.col.car":"VOITURE","standings.col.races":"COURSES",
    "standings.col.wins":"VICTOIRES","standings.col.podiums":"PODIUMS","standings.col.team":"ÉQUIPE",
    "standings.legend.win":"Victoire","standings.legend.pts":"Barème: 25-18-15-12-10-8-6-4-2-1",
    "tower.title":"Live Timing","tower.lap":"TOUR {a}/{b}",
    "ticker.next":"PROCHAINE MANCHE · <b>{name}</b> · RND {rnd} · {date} · {time} {tz}",
    "ticker.spots":"<b>{n} PLACES LIBRES</b> à {name} — inscriptions ouvertes",
    "ticker.filling":"<b>{name} RND {rnd}</b> · SE REMPLIT · plus que {n} places",
    "ticker.format":"FORMAT · ESSAIS / QUALIF <b>{q} TOURS</b> / COURSE",
    "ticker.season":"SAISON <b>{y}</b> · {n} MANCHES · GT3 UNIQUEMENT · BoP ACTIF",
    "ticker.clean":"FAIR-PLAY · incident review après chaque course","ticker.soon1":"◈ IRON GT SERIES 2026 — LA SAISON ARRIVE","ticker.soon2":"◈ CALENDRIER BIENTÔT · RESTEZ CONNECTÉS","ticker.soon3":"◈ CHAMPIONNAT GT3 · iRACING · GRILLE COMPÉTITIVE","ticker.soon4":"◈ REJOIGNEZ DISCORD · SOYEZ LES PREMIERS QUAND LES INSCRIPTIONS OUVRENT",
    "dw.online":"en ligne maintenant","dw.loading":"Chargement...","dw.onlineNow":"EN LIGNE MAINTENANT","dw.info1":"Championnat GT3 · iRacing · 2026","dw.info2":"Briefings, résultats, highlights","dw.info3":"Canaux voice dédiés pendant les courses",
  },

  es: {
    "nav.home":"Inicio","nav.races":"Carreras","nav.clasament":"Clasificación","nav.about":"Nosotros","nav.signup":"Inscripción",
    "btn.viewRaces":"Ver carreras","btn.signup":"Inscríbete","btn.signupNow":"Inscríbete ya",
    "btn.allCalendar":"Calendario completo","btn.detailsRaces":"Detalles de carreras","btn.enterDiscord":"Entrar a Discord",
    "btn.backToCalendar":"Volver al calendario","btn.signupAt":"Inscríbete en {name}","btn.reserve":"Lista de espera",
    "btn.confirmEntry":"Confirmar inscripción","btn.confirmDiscord":"Confirmar en Discord",
    "btn.coffee":"Patreon",
    "chip.enrollOpen":"INSCRIPCIONES ABIERTAS",
    "hero.eyebrow":"iRACING · GT3 CHAMPIONSHIP · TEMPORADA 2026",
    "hero.lead":"Un campeonato GT3 amateur en iRacing. Parrilla monoclase, mismo formato en cada cita, carreras limpias. Tú conduces — nosotros organizamos.",
    "hero.next":"PRÓXIMA","hero.freeSpots":"{n} PLAZAS LIBRES",
    "home.do.eyebrow":"Qué hacemos","home.do.title":"Una sola clase.\nCarreras de verdad.",
    "home.do.lead":"Organizamos un campeonato GT3 con citas semanales en iRacing. Sin caos, sin diferencias entre coches — solo tú, la parrilla y el crono.",
    "home.next.eyebrow":"A continuación","home.next.title":"La próxima cita",
    "home.cal.eyebrow":"Calendario 2026","home.cal.title":"Las {n} citas","home.cal.soon":"Temporada próximamente","home.cal.soonText":"Calendario en construcción — las citas aparecerán aquí cuando estén confirmadas.",
    "feat.1.t":"Todas las clases","feat.1.p":"GT3, LMP2, GTP y más — parrillas multi-clase donde el BoP mantiene el equilibrio y cada clase disputa su propia batalla.",
    "feat.2.t":"Formatos diversos","feat.2.p":"Sprints, carreras de resistencia, eventos multi-clase — el formato se adapta al circuito y a la temporada. Siempre competitivo.",
    "feat.3.t":"Comunidad","feat.3.p":"Discord IronGTSeries: briefings, resultados, highlights y voz en carrera.",
    "feat.4.t":"Carreras limpias","feat.4.p":"Reglas de etiqueta claras, incident review y un código de conducta que todos respetan.",
    "status.open":"PARRILLA ABIERTA","status.filling":"SE LLENA","status.full":"PARRILLA LLENA","status.done":"FINALIZADA",
    "card.spots":"{n} plazas","card.data":"Fecha","card.start":"Salida","card.race":"Carrera","card.grid":"Parrilla",
    "card.laps":"vueltas","card.free":"{n} libres","card.occ":"OCUPACIÓN PARRILLA",
    "weather.cloud":"Nubosidad","weather.temp":"Temperatura","weather.wind":"Viento","weather.humidity":"Humedad","weather.track":"Pista",
    "banner.start":"Salida","banner.discord":"🔒 Contraseña en Discord",
    "pill.practice":"PRÁCTICA","pill.quali":"CLASIF","pill.raceWord":"CARRERA",
    "val.practice":"{n} min","val.qualiLaps":"{n} vueltas","val.laps":"{n} vueltas",
    "feature.next":"PRÓXIMA CITA","cd.days":"DÍAS","cd.hrs":"H","cd.min":"MIN","cd.sec":"SEG",
    "feature.format":"Formato","feature.practice":"Práctica","feature.quali":"Clasif","feature.grid":"Parrilla",
    "lbl.free":"libre","lbl.hotlap":"hotlap",
    "sched.finale":"FINAL",
    "cta.title":"¿Listo para la parrilla?\nTu plaza te espera.","cta.text":"Entra al Discord para el briefing e inscríbete en la próxima cita en menos de un minuto.",
    "races.eyebrow":"Temporada {y} · {n} citas","races.title":"Calendario del\ncampeonato",
    "races.lead":"Todas las citas del IRON GT3 Championship 2026. Cada carrera: clasificación a 3 vueltas, luego la carrera. Las inscripciones cierran 2 horas antes de la salida.",
    "races.rest":"El resto de la temporada","filter.all":"Todas","filter.open":"Parrilla abierta","filter.filling":"Se llena","races.empty":"No hay citas en esta categoría.",
    "about.eyebrow":"Nosotros","about.titleA":"Qué es","about.titleB":"IRON GT SERIES",
    "about.p1":"<b>IRON GT SERIES</b> es un campeonato de sim racing en iRacing, organizado por la comunidad para pilotos aficionados y entusiastas que buscan carreras cerradas, justas y un formato de competición claro.",
    "about.p2":"Aunque nuestro núcleo empezó con la clase <b>GT3</b>, la plataforma evoluciona constantemente para ofrecer diversidad y retos a la altura de la comunidad:<br><br><b>Formatos Diversos:</b> Desde sprints intensos hasta carreras de resistencia donde la estrategia se vuelve esencial.<br><br><b>Carreras Multi-Clase:</b> Eventos especiales donde la parrilla se amplía con prototipos de alto nivel (LMP2 y GTP), trayendo la atmósfera de las grandes carreras de resistencia a nuestro servidor.<br><br><b>Equilibrio Total:</b> Para las clases donde es necesario, activamos el Balance of Performance (BoP) — en pista, cuenta la habilidad del piloto y la gestión de la carrera, no solo la elección del coche.",
    "about.p3":"El servidor de <b>Discord IronGTSeries</b> es nuestro centro de mando. Aquí encontrarás briefings oficiales, canales de voz dedicados, resultados, clasificaciones actualizadas y secciones de highlights. El proceso es sencillo: inscríbete en la web, únete a la comunidad de Discord y estarás listo para correr. <b>¡Nos vemos en la parrilla!</b>",
    "about.fmt.eyebrow":"Formato de una cita","about.fmt.title":"Tres pasos, cada vez",
    "step.step":"PASO {n}",
    "step.practice.t":"PRÁCTICA","step.practice.h":"","step.practice.p":"Sesión de práctica libre para adaptarse al circuito y realizar los últimos ajustes al coche.",
    "step.quali.t":"CLASIFICACIÓN","step.quali.h":"3 vueltas","step.quali.p":"Sesión de clasificación concentrada en 3 vueltas para establecer el orden de la parrilla.",
    "step.race.t":"CARRERA","step.race.h":"La carrera","step.race.p":"La salida oficial y la acción en pista.",
    "about.rules.eyebrow":"Reglamento","about.rules.title":"Código de conducta","about.rules.lead":"Unas pocas reglas simples nos mantienen a todos en pista. Las aceptas al inscribirte.",
    "rule.a.t":"Carreras limpias","rule.a.p":"Deja sitio, no te lances en las curvas, devuelve una posición ganada de forma desleal.",
    "rule.b.t":"Incident review","rule.b.p":"Los incidentes graves se revisan tras la carrera. Las sanciones se anuncian en Discord.",
    "rule.c.t":"Límites de pista","rule.c.p":"Respeta los límites de pista. Los avisos repetidos llevan a una penalización de tiempo.",
    "rule.d.t":"Briefing obligatorio","rule.d.p":"Antes de cada cita, lee el briefing fijado en el canal de la cita.",
    "stat.class.k":"Clase","stat.class.v":"monoclase, BoP","stat.rounds.k":"Citas","stat.rounds.v":"temporada {y}",
    "stat.grid.k":"Parrilla","stat.grid.v":"plazas / carrera","stat.platform.k":"Plataforma","stat.platform.v":"PC",
    "signup.eyebrow":"Inscripción a la cita","signup.title":"Súbete a la parrilla",
    "signup.lead":"Rellena tus datos de piloto y elige la cita. Tu plaza se reserva al instante; la confirmación final es en Discord.",
    "f.name":"Nombre del piloto","f.iracing":"ID de cliente iRacing","f.num":"Número preferido","f.num2":"2.ª opción de número","f.country":"País",
    "f.race":"Cita","f.car":"Coche GT3","f.discord":"Usuario de Discord","f.exp":"Nivel de experiencia",
    "f.team":"Nombre del equipo","f.help":"Ayuda con operaciones de la liga","f.notes":"¿Algo que el staff deba saber?",
    "exp.beginner":"Principiante","exp.inter":"Intermedio","exp.adv":"Avanzado","exp.pro":"Pro",
    "signup.helpYes":"Sí, estoy interesado/a","signup.helpNo":"No, gracias",
    "signup.lockConfirm":"Entiendo que mi elección de coche y equipo está bloqueada para la temporada salvo permiso especial del staff.",
    "signup.agreePre":"He leído y acepto el ","signup.agreeLink":"código de conducta","signup.agreePost":" y el formato de la cita (clasif 3 vueltas · carrera).",
    "signup.submit":"Confirmar inscripción","summary.title":"Pase de parrilla","summary.completeName":"escribe tu nombre","summary.optional":"opcional",
    "sline.round":"Cita","sline.race":"Cita","sline.date":"Fecha","sline.start":"Salida","sline.driver":"Piloto","sline.car":"Coche","sline.num":"Número","sline.team":"Equipo","sline.free":"Parrilla libre",
    "ph.name":"ej. Mihai Voicu","ph.iracing":"ej. 845321","ph.num":"ej. 7","ph.num2":"ej. 11","ph.discord":"ej. mihai_v","ph.team":"ej. Team Rossa","ph.notes":"Preguntas, sugerencias, lo que sea...",
    "ok.eyebrow":"Inscripción confirmada","ok.title":"Estás en la parrilla","ok.note":"Recibirás el briefing de la cita en el canal de Discord 24h antes de la salida.",
    "footer.tagline":"Campeonato GT3 amateur en iRacing. Carreras equilibradas, formato claro, carreras limpias.",
    "footer.nav":"Navegación","footer.champ":"Campeonato","footer.community":"Comunidad",
    "footer.calendar":"Calendario 2026","footer.formatRules":"Formato y reglas","footer.signupRound":"Inscripción a la cita","footer.results":"Resultados (Discord)",
    "footer.twitch":"Twitch / Stream","footer.coc":"Código de conducta","footer.discordLink":"Discord","footer.discordBtn":"Entrar al Discord",
    "footer.bottom1":"© 2026 IRON GT SERIES — proyecto no oficial de la comunidad iRacing.","footer.bottom2":"NO AFILIADO A IRACING.COM MOTORSPORT SIMULATIONS",
    "standings.title":"CLASIFICACIÓN","standings.lead":"Clasificación del campeonato y resultados de las citas. Actualizado tras cada carrera.",
    "standings.tab.general":"GENERAL","standings.tab.rounds":"CITAS",
    "standings.empty":"Aún no hay resultados registrados. La clasificación aparece tras la primera cita.",
    "standings.noRounds":"No hay resultados de citas disponibles.",
    "standings.loading":"Cargando...","standings.laps":"VUELTAS",
    "standings.col.driver":"PILOTO","standings.col.car":"COCHE","standings.col.races":"CARRERAS",
    "standings.col.wins":"VICTORIAS","standings.col.podiums":"PODIOS","standings.col.team":"EQUIPO",
    "standings.legend.win":"Victoria","standings.legend.pts":"Puntos: 25-18-15-12-10-8-6-4-2-1",
    "tower.title":"Live Timing","tower.lap":"VUELTA {a}/{b}",
    "ticker.next":"PRÓXIMA CITA · <b>{name}</b> · RND {rnd} · {date} · {time} {tz}",
    "ticker.spots":"<b>{n} PLAZAS LIBRES</b> en {name} — inscripciones abiertas",
    "ticker.filling":"<b>{name} RND {rnd}</b> · SE LLENA · solo quedan {n} plazas",
    "ticker.format":"FORMATO · PRÁCTICA / CLASIF <b>{q} VUELTAS</b> / CARRERA",
    "ticker.season":"TEMPORADA <b>{y}</b> · {n} CITAS · SOLO GT3 · BoP ACTIVO",
    "ticker.clean":"CARRERAS LIMPIAS · incident review tras cada carrera","ticker.soon1":"◈ IRON GT SERIES 2026 — TEMPORADA EN CAMINO","ticker.soon2":"◈ CALENDARIO MUY PRONTO · MANTENTE ATENTO","ticker.soon3":"◈ CAMPEONATO GT3 · iRACING · PARRILLA COMPETITIVA","ticker.soon4":"◈ ÚNETE A DISCORD · SÉ EL PRIMERO CUANDO ABRAN LAS INSCRIPCIONES",
    "dw.online":"en línea ahora","dw.loading":"Cargando...","dw.onlineNow":"AHORA EN LÍNEA","dw.info1":"Campeonato GT3 · iRacing · 2026","dw.info2":"Briefings, resultados, highlights","dw.info3":"Canales de voz dedicados durante las carreras",
  },
};

function interp(str, vars) {
  if (!vars) return str;
  return str.replace(/\{(\w+)\}/g, (m, k) => (vars[k] != null ? vars[k] : m));
}

const LangContext = React.createContext({ lang: "en", setLang: () => {} });

function loadTextOverrides() {
  try { const s = localStorage.getItem('igs-text'); return s ? JSON.parse(s) : {}; } catch(e) { return {}; }
}
function saveTextOverride(lang, key, val) {
  try {
    const all = loadTextOverrides();
    if (!all[lang]) all[lang] = {};
    if (val === null || val === undefined) delete all[lang][key];
    else all[lang][key] = val;
    localStorage.setItem('igs-text', JSON.stringify(all));
    if (window.sbClient) {
      window.sbClient.from('site_config').upsert({ id: 'text', value: all, updated_at: new Date().toISOString() }, { onConflict: 'id' });
    }
  } catch(e) {}
}

function useT() {
  const { lang, setLang } = React.useContext(LangContext);
  const dict = S[lang] || S.en;
  const overrides = loadTextOverrides();
  const t = (key, vars) => {
    const ov = overrides[lang];
    const raw = (ov && ov[key] != null) ? ov[key] : (dict[key] != null ? dict[key] : (S.en[key] != null ? S.en[key] : key));
    return interp(raw, vars);
  };
  const country = (cc) => (COUNTRY[cc] && COUNTRY[cc][lang]) || cc;
  const cond = (tokens) => tokens.map((k) => (COND[k] && COND[k][lang]) || k).join(" · ");
  const fmtDate = (d) => `${DOW[lang][d.dow]} ${d.d} ${MON[lang][d.mon]} ${d.y}`;
  const fmtShort = (d) => `${d.d} ${MON[lang][d.mon]}`.toUpperCase();
  const fmtYear = (d) => String(d.y);
  return { t, lang, setLang, country, cond, fmtDate, fmtShort, fmtYear };
}

Object.assign(window, { LANGS, LangContext, useT, S, loadTextOverrides, saveTextOverride });
