Files
ketopath/apps/web/messages/it.json
T
lucianoandClaude Opus 4.7 f455cbe499 feat(billing): Stripe + abbonamento Pro con trial 30gg (ADR 0004)
Chiude la decisione "payment provider" aperta in CLAUDE.md.

**Modello**: free 30gg post-signup (no carta richiesta) → Pro mensile €9,90 / annuale €89. Allinea il paywall al confine fra fase INTENSIVE e TRANSITION (PRD §5.1), quando l'utente ha già visto i primi risultati. Dopo la scadenza l'app non si "spegne": storico restano consultabili (sola lettura), ma generazione piani / nuove pesate / digiuni / foto / export richiedono abbonamento attivo.

**Schema**: nuova tabella `subscriptions` (1:1 con users) con stati TRIALING/ACTIVE/PAST_DUE/CANCEL_AT_PERIOD_END/CANCELED/EXPIRED + `billing_webhook_events` per idempotenza dei retry Stripe.

**Backend** (`apps/api/src/modules/billing/`):
- `GET /me/billing/status` — snapshot + derived (kind, isPro, trialDaysRemaining)
- `POST /me/billing/checkout` — crea Stripe Checkout Session (subscription mode + Stripe Tax + tax_id_collection)
- `POST /me/billing/portal` — Customer Portal Session
- `POST /webhooks/stripe` — raw body, firma HMAC, idempotenza per `event.id`, dispatch su `customer.subscription.*`, `checkout.session.completed`, `invoice.payment_failed`
- Plugin `requirePro()` (402 payment_required) applicato a 9 rotte: meal-plans CRUD, weight-entries POST, check-ins POST, fast-events POST/PATCH, fasting/pause POST, export.pdf (plan+tracking)

**Shared** (`@ketopath/shared/billing/pro-status`):
- `isProActive(snap)` — verifica live (gestisce anche TRIALING con `trialEndsAt` passato in caso di cron in ritardo)
- `deriveProStatus(snap)` — kind + isPro + trialDaysRemaining + accessEndsAt per l'UI
- `computeTrialEndsAt(signupAt, days=30)`
- 11 unit test

**Frontend** (`apps/web/src/app/[locale]/billing/`):
- Pagina `/billing` editoriale (capitolo VIII) con StatusBlock per ogni kind, BillingActionsBar client (transitions, redirect a Stripe), 3 benefits
- `<TrialBanner>` in SignedInDashboard (3 stati: trial in corso oro / scaduto pomodoro / past_due pomodoro)
- Nav item "Abbonamento" (chapter VI) nel grid asimmetrico
- i18n IT completo (`Billing` namespace)

**Soft-degradation**: env Stripe (`STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_PRICE_ID_*`, `BILLING_RETURN_URL`) sono tutte opzionali. Senza configurazione i route billing rispondono 503 e il banner trial mostra "pagamenti non ancora attivati" — utenti in trial continuano a usare l'app.

99/99 test verdi, lint pulito su tutto il monorepo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 11:27:06 +02:00

768 lines
37 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"Home": {
"title": "Una keto italiana, sostenibile",
"titleAccent": "sostenibile",
"tagline": "Il sentiero che ti accompagna dalla prima settimana di adattamento al mantenimento — settimana dopo settimana, piatto dopo piatto.",
"ctaPrimary": "Iscriviti",
"ctaSecondary": "Accedi",
"ctaTryFree": "Inizia gratis",
"ctaTryFreeHint": "Niente carta, niente spam. Disinstalla quando vuoi.",
"disclaimer": "KetoPath è uno strumento di stile di vita: suggerisce, non prescrive. Le indicazioni nutrizionali non sostituiscono il parere del tuo medico.",
"signedInAs": "Accesso effettuato come {name}",
"signOut": "Esci",
"completeProfile": "Profilo & calcoli",
"viewPlan": "Piano della settimana",
"viewShopping": "Lista della spesa",
"viewTracking": "Pesata & misure",
"viewFasting": "Digiuno intermittente",
"viewBilling": "Abbonamento & fatture",
"lettura": "Continua la lettura",
"inizia": "Inizia",
"greeting": "Buongiorno, <name>{name}</name>.",
"principle1": "Personalizzazione totale: ciò che vedi è solo ciò che ti riguarda.",
"principle2": "Cucina italiana e mediterranea: ingredienti veri, di stagione, reperibili.",
"principle3": "Progressività: dalla fase intensiva al mantenimento, senza strappi.",
"stat1Label": "Fasi del percorso",
"stat1Value": "3",
"stat1Hint": "Intensiva · Transizione · Mantenimento",
"stat2Label": "Ricette mediterranee",
"stat2Value": "96+",
"stat2Hint": "Tutte stagionali, italiane",
"stat3Label": "Costo del piano",
"stat3Value": "0€",
"stat3Hint": "Gratis durante la beta",
"featureSectionEyebrow": "Cosa fa per te",
"featureSectionTitle": "Tre strumenti, un solo ritmo.",
"feature1Eyebrow": "Cucina",
"feature1Title": "Piano settimanale che si adatta a te",
"feature1Body": "Ogni domenica un menù di sette giorni costruito sui tuoi macros, le tue esclusioni e il tempo che hai in cucina. La lista della spesa si genera da sola.",
"feature2Eyebrow": "Digiuno",
"feature2Title": "Digiuno intermittente, senza ansia",
"feature2Body": "Sei protocolli, dal 14:10 al 5:2. Il timer ti accompagna con micro-promemoria di idratazione, elettroliti, e una proposta morbida per rompere il digiuno.",
"feature3Eyebrow": "Tracking",
"feature3Title": "Numeri che parlano, non urlano",
"feature3Body": "Una pesata a settimana, qualche misura quando vuoi, una foto se ti va. Trend lineare, soglia d'allarme, esportazione PDF per il medico.",
"previewSectionEyebrow": "Sotto il cofano",
"previewSectionTitle": "L'app, in tre schermate.",
"previewSectionBody": "Niente dashboard infinite. Tre superfici essenziali: il piano di oggi, la sessione di digiuno, la pesata della settimana.",
"previewPlanLabel": "Mercoledì · giorno III",
"previewPlanRecipe1": "Frittata di spinaci",
"previewPlanRecipe2": "Tagliata con rucola",
"previewPlanRecipe3": "Branzino al cartoccio",
"previewFastLabel": "16:8 · in corso",
"previewFastTime": "08:42",
"previewFastHint": "Ancora 7h 18m alla finestra alimentare.",
"previewWeightLabel": "−4,2 kg in 8 settimane",
"ctaSectionTitle": "Pronti a partire?",
"ctaSectionBody": "Sette passaggi, dieci minuti, e il tuo primo piano è pronto. Senza carta di credito.",
"principlesEyebrow": "Tre principi non negoziabili",
"footerCopyright": "KetoPath — anno I, Italia."
},
"Welcome": {
"title": "Prima di iniziare",
"subtitle": "KetoPath è uno strumento di stile di vita, non un dispositivo medico. Quattro punti, prima di proseguire.",
"point1": "L'app fornisce solo suggerimenti di stile di vita basati sui parametri che inserisci.",
"point2": "Non diagnostica patologie, non prescrive trattamenti, non sostituisce il parere del tuo medico.",
"point3": "Se hai diabete di tipo 1, sei in gravidanza o allattamento, hai disturbi alimentari, problemi cardiaci o renali — parla prima con il tuo medico.",
"point4": "Prima di iniziare ti consigliamo esami di base: glicemia, colesterolo, profilo lipidico, funzionalità renale ed epatica.",
"checkAdult": "Confermo di essere maggiorenne.",
"checkAware": "Dichiaro di non avere condizioni mediche escludenti, oppure di averle discusse con il mio medico.",
"checkAccepts": "Accetto che KetoPath non sostituisce il parere medico professionale.",
"submit": "Accetto e proseguo",
"submitting": "Salvataggio…",
"legalNote": "Il consenso è registrato con data e ora come previsto dall'art. 7 GDPR."
},
"CookieBanner": {
"aria": "Informativa cookie",
"message": "Usiamo solo cookie essenziali per autenticazione e sessione. Niente analytics o tracker di terze parti.",
"dismiss": "Ho capito"
},
"Metadata": {
"title": "KetoPath — Chetogenica e digiuno intermittente, personalizzati",
"description": "Una keto italiana, sostenibile. Piani adattivi, tracking e lista della spesa automatica — settimana dopo settimana."
},
"Auth": {
"SignIn": {
"title": "Accedi",
"subtitle": "Bentornato. Riprendi da dove avevi lasciato.",
"emailLabel": "Email",
"passwordLabel": "Password",
"submit": "Accedi",
"submitting": "Accesso in corso…",
"google": "Continua con Google",
"or": "oppure",
"noAccount": "Non hai ancora un account? <link>Iscriviti</link>",
"error": "Credenziali non valide. Riprova."
},
"SignUp": {
"title": "Iscriviti",
"subtitle": "Crea il tuo profilo KetoPath in meno di un minuto.",
"nameLabel": "Come ti chiami",
"emailLabel": "Email",
"passwordLabel": "Password",
"passwordHint": "Almeno 8 caratteri",
"submit": "Crea account",
"submitting": "Creazione…",
"google": "Continua con Google",
"or": "oppure",
"haveAccount": "Hai già un account? <link>Accedi</link>",
"error": "Non è stato possibile completare la registrazione. Riprova.",
"disclaimer": "Procedendo accetti che i tuoi dati siano trattati come descritto nell'informativa sulla privacy. KetoPath non sostituisce il parere medico."
}
},
"Fasting": {
"title": "Digiuno intermittente",
"subtitle": "Una finestra alimentare e una di riposo. Il timer scandisce il ritmo, il corpo fa il resto.",
"historyTitle": "Storico sessioni",
"activeBadge": "Sessione in corso",
"inactiveBadge": "Pronto a iniziare",
"startCallToAction": "Scegli un protocollo e parti. Il timer continua a scorrere anche se chiudi l'app.",
"chooseProtocol": "Protocollo",
"start": "Avvia digiuno",
"starting": "Avvio…",
"saving": "Salvataggio…",
"remaining": "Mancano {time}",
"reached": "Obiettivo raggiunto. Puoi rompere il digiuno o proseguire.",
"completeReached": "Concludi",
"completeEarly": "Concludi adesso",
"abort": "Annulla sessione",
"confirmAbort": "Sei sicuro di voler annullare questa sessione?",
"phaseTitle": "Fase metabolica",
"phases": {
"postprandial": {
"label": "Post-prandiale",
"description": "Digestione in corso. Insulina alta, glicemia in salita."
},
"glycogenolysis": {
"label": "Glicogenolisi",
"description": "Il fegato libera glucosio dalle scorte di glicogeno. L'insulina cala."
},
"lipolysis": {
"label": "Lipolisi",
"description": "Le scorte di grasso iniziano a essere mobilitate per produrre energia."
},
"ketogenesis": {
"label": "Chetogenesi",
"description": "Il fegato produce corpi chetonici. Le sensazioni mentali si fanno più nitide."
},
"autophagy": {
"label": "Autofagia",
"description": "Le cellule riciclano componenti danneggiati. Pulizia interna profonda."
}
},
"startedAt": "Iniziato",
"target": "Obiettivo",
"protocolGuideTitle": "Guida ai protocolli",
"protocolHints": {
"FOURTEEN_TEN": {
"title": "Inizio dolce",
"description": "Adatto in fase di mantenimento o per chi inizia. 10 ore di alimentazione."
},
"SIXTEEN_EIGHT": {
"title": "Lo standard",
"description": "Il protocollo più diffuso. Equilibrio tra sostenibilità e benefici metabolici."
},
"EIGHTEEN_SIX": {
"title": "Più aggressivo",
"description": "Inizia a sollecitare la chetogenesi. Per chi è già adattato."
},
"TWENTY_FOUR": {
"title": "Avanzato",
"description": "Solo 4 ore di alimentazione. Da praticare con regolarità ma non quotidianamente."
}
},
"emptyHistory": "Nessuna sessione registrata. Avvia il primo digiuno per iniziare a costruire la serie.",
"statCompleted": "Sessioni concluse",
"statTotal": "Ore totali",
"statSessions": "Sessioni totali",
"statWeekly": "Ore (7 gg)",
"statMonthly": "Ore (30 gg)",
"statCurrentStreak": "Streak attuale",
"statLongestStreak": "Streak record",
"statCompletionRate": "Tasso completamento",
"statStreakValue": "{n, plural, =0 {0 giorni} one {# giorno} other {# giorni}}",
"symptomsTitle": "Come ti senti?",
"symptomsHint": "Aggiorna i sintomi: ti aiuta a capire come reagisci a questo protocollo.",
"symptomHeadache": "Mal di testa",
"symptomEnergy": "Energia",
"symptomHunger": "Fame",
"symptomClarity": "Lucidità",
"symptomOther": "Altre note",
"symptomOtherPlaceholder": "Note libere…",
"symptomsSave": "Salva sintomi",
"symptomsSaved": "Salvato.",
"pauseEyebrow": "Modalità giorno libero",
"pauseUntil": "Reminder in pausa fino a {time}.",
"pauseToday": "Pausa per oggi",
"pauseResume": "Riprendi adesso",
"breakFastShow": "Suggerimenti per riprendere a mangiare",
"breakFastHide": "Nascondi suggerimenti",
"breakFastEmpty": "Nessuna ricetta disponibile in questo momento.",
"working": "Attendere…",
"status": {
"IN_PROGRESS": "In corso",
"COMPLETED": "Completata",
"ABORTED": "Annullata"
}
},
"Tracking": {
"title": "Pesata e misure",
"subtitle": "Pochi numeri, una volta a settimana. La tendenza emerge dalla regolarità — non dalla pesata di oggi.",
"newEntry": "Nuova rilevazione",
"history": "Storico",
"date": "Data",
"weightKg": "Peso (kg)",
"measurements": "Misure (cm) — opzionali",
"waist": "Girovita",
"hips": "Fianchi",
"thigh": "Coscia",
"arm": "Braccio",
"subjective": "Indicatori soggettivi (1–10)",
"energy": "Energia",
"sleep": "Sonno",
"hunger": "Fame",
"save": "Registra",
"saving": "Salvataggio…",
"saved": "Registrato.",
"current": "Peso attuale",
"delta": "Variazione",
"emptyHistory": "Nessuna rilevazione registrata. Inserisci la prima a destra: la tendenza apparirà dopo due o tre pesate.",
"weeklyTrend": "Trend settimanale",
"journey": "Del percorso",
"projection": "Al ritmo attuale raggiungerai {kg} kg il {date}.",
"alertEyebrow": "Soglia di allarme",
"alertMessage": "Il tuo peso è {current} kg, sopra la soglia di {threshold} kg che hai impostato.",
"alertHint": "Suggerimento: una settimana di riparazione — torna al deficit di Fase 1, idratazione alta, sonno regolare. Senza colpa: tornare in carreggiata è normale.",
"measurementsHelpToggle": "Come misurare bene?",
"measurementGuides": {
"waist": "Misura nel punto più stretto del busto, sopra l'ombelico, espirando senza forzare.",
"hips": "Nel punto più sporgente del bacino/glutei, in piedi e con i piedi uniti.",
"thigh": "Coscia dominante, a metà tra inguine e ginocchio, gamba leggermente flessa.",
"arm": "Braccio dominante, a metà tra spalla e gomito, braccio rilassato lungo il fianco.",
"tip": "Misura sempre alla stessa ora, possibilmente al mattino e con lo stesso metro a nastro morbido."
},
"checkInEyebrow": "Check-in di oggi",
"checkInTitle": "Come ti senti oggi? Pochi secondi, una traccia nel tempo.",
"checkInSave": "Registra check-in",
"checkInUpdate": "Aggiorna check-in",
"checkInSaved": "Salvato.",
"checkInAlreadyDone": "Già compilato",
"mood": "Umore",
"exportPdf": "Esporta PDF per medico/nutrizionista"
},
"Onboarding": {
"title": "Configura il tuo percorso",
"subtitle": "Sette passaggi: l'obiettivo, i numeri, la pesata di partenza, le preferenze, le notifiche e via al primo piano.",
"stepsTitle": "Tappe",
"stepEyebrow": "Tappa {n} di {total}",
"next": "Salva e continua",
"back": "← Indietro",
"skipForNow": "Salta per ora",
"working": "Attendere…",
"steps": {
"goal": "L'obiettivo",
"profile": "Anagrafica e attività",
"conditions": "Condizioni mediche",
"weighIn": "Pesata di partenza",
"preferences": "Esclusioni e cucine",
"notifications": "Promemoria",
"done": "Pronti a partire"
},
"conditionsHeading": "Qualcosa di te che dovremmo sapere?",
"conditionsHint": "Indica le condizioni che ti riguardano. Servono ad adattare i calcoli e a segnalarti i casi in cui meglio consultare un medico prima di proseguire.",
"conditionsAdaptive": "Condizioni adattabili",
"conditionsExcluding": "Condizioni che richiedono il medico",
"conditionsExcludingHint": "Se selezioni una di queste l'app non genera piani autonomamente: vai dal tuo medico.",
"conditionsSaveError": "Non è stato possibile salvare. Riprova fra poco.",
"blockedEyebrow": "Importante",
"blockedMessage": "KetoPath non è uno strumento adatto a questa condizione. Ti consigliamo di rivolgerti al tuo medico curante prima di continuare. Puoi comunque proseguire l'esplorazione, ma il piano non verrà generato automaticamente.",
"conditionLabel": {
"THYROID_HYPO": "Ipotiroidismo",
"DIABETES_T2": "Diabete tipo 2",
"IBS": "Intestino irritabile",
"DYSLIPIDEMIA": "Colesterolo / trigliceridi alti",
"HYPERTENSION": "Ipertensione",
"KIDNEY_ISSUES": "Problemi renali",
"LIVER_ISSUES": "Problemi epatici",
"PREGNANCY": "Gravidanza",
"BREASTFEEDING": "Allattamento",
"DIABETES_T1": "Diabete tipo 1",
"EATING_DISORDER": "Disturbi alimentari"
},
"goalHeading": "Perché sei qui?",
"goalHint": "Scegli il motivo principale: ci aiuterà a parlarti nel modo giusto. Potrai sempre cambiarlo.",
"goals": {
"LOSE": {
"title": "Perdere peso",
"hint": "Deficit calorico graduale, fase intensiva poi mantenimento."
},
"MAINTAIN": {
"title": "Mantenere il peso",
"hint": "Equilibrio tra macros e digiuno per restare stabile."
},
"ENERGY": {
"title": "Energia e salute",
"hint": "Lucidità mentale, glicemia stabile, infiammazione bassa."
}
},
"profileHeading": "I numeri che ti riguardano",
"profileHeadingGoal": {
"LOSE": "I numeri da cui partire",
"MAINTAIN": "I numeri da mantenere",
"ENERGY": "I numeri che ti raccontano"
},
"profileHint": "Età, sesso, altezza, peso e attività: bastano per calcolare BMR, TDEE e i target di macros.",
"weighInHeading": "Una pesata, prima di iniziare",
"weighInHint": "Il punto di partenza è la base di tutti i calcoli che seguiranno. Una sola pesata, qui, ora.",
"weighInLabel": "Peso di oggi (kg)",
"weighInTip": "Sulla bilancia al mattino, dopo essere andato in bagno, prima di colazione. Senza vestiti se possibile.",
"weighInSaved": "Pesata registrata: la troverai in /tracking.",
"preferencesHeading": "Cosa eviti, cosa ami",
"preferencesHint": "Le esclusioni filtrano davvero le ricette del piano. Le cucine sono un suggerimento al matchmaking.",
"notificationsHeading": "Vuoi un promemoria?",
"notificationsHint": "Un piccolo nudge il lunedì per la pesata, e altre tappe in arrivo. Niente spam: scegli tu cosa ricevere.",
"notificationsActivate": "Attiva promemoria",
"notificationsActive": "Promemoria attivati. Bene così.",
"notificationsBlocked": "Hai bloccato le notifiche per questo sito. Le potrai riattivare dalle impostazioni del browser.",
"notificationsUnsupported": "Il tuo browser non supporta le notifiche push. Su iOS apri prima KetoPath dalla Home.",
"notificationsError": "Non è stato possibile attivarle. Riprova più tardi dal tuo profilo.",
"summaryPhase": "Fase corrente",
"summaryBmr": "BMR",
"summaryTdee": "Fabbisogno",
"summaryAdherence": "Aderenza target",
"summaryAdherenceHint": "Per fase 1",
"phaseLabel": {
"INTENSIVE": "Intensiva",
"TRANSITION": "Transizione",
"MAINTENANCE": "Mantenimento"
},
"phaseDuration": {
"INTENSIVE": "30-45 giorni",
"TRANSITION": "30-60 giorni",
"MAINTENANCE": "Per sempre"
},
"doneHeading": "Tutto pronto.",
"doneHeadingGoal": {
"LOSE": "Si parte. Un passo alla volta.",
"MAINTAIN": "Si parte. Mantenendo l'equilibrio.",
"ENERGY": "Si parte. Con più lucidità."
},
"doneHint": "Puoi esplorare l'app a tuo ritmo: ogni sezione resta sempre a portata.",
"doneGenerating": "Stiamo preparando il primo piano per la tua settimana…",
"donePlanReady": "Il primo piano è pronto. Dai un'occhiata o tuffati in cucina.",
"nextPlanEyebrow": "Cucina",
"nextPlanTitle": "Il piano della settimana",
"nextPlanHint": "Sette giorni, quattro pasti al dì, scelti dal matchmaking.",
"nextFastingEyebrow": "Digiuno",
"nextFastingTitle": "Una sessione di digiuno",
"nextFastingHint": "Scegli un protocollo, lascia che il timer scandisca il ritmo.",
"nextTrackingEyebrow": "Tracking",
"nextTrackingTitle": "La pesata di oggi",
"nextTrackingHint": "Pochi numeri, una volta a settimana. Costanza prima di tutto.",
"iosInstallEyebrow": "Solo iOS — per ricevere le notifiche",
"iosInstallTitle": "Installa KetoPath sulla Home in tre passaggi.",
"iosInstallStep1": "Tocca il pulsante Condividi (icona quadrato con freccia in alto) nella barra di Safari.",
"iosInstallStep2": "Scorri e seleziona “Aggiungi alla schermata Home”.",
"iosInstallStep3": "Apri KetoPath dalla Home: ora le notifiche funzionano anche su iPhone.",
"goToPlan": "Genera il primo piano",
"skipToHome": "Esplora l'app →"
},
"Preferences": {
"eyebrow": "Preferenze",
"title": "Cucina su misura",
"subtitle": "Le esclusioni filtrano gli ingredienti, le cucine influenzano il matchmaking, il tempo decide quante ricette elaborate proporre.",
"exclusionsTitle": "Esclusioni alimentari",
"exclusionsHint": "Tutte le ricette che contengono almeno uno di questi gruppi verranno escluse dal piano.",
"bannedIngredientsTitle": "Ingredienti specifici da evitare",
"bannedIngredientsHint": "Cerca un ingrediente per nome (es. salmone, tofu, peperone). Le ricette che lo contengono verranno escluse dal piano. Massimo 50.",
"bannedIngredientsSearchPlaceholder": "Cerca un ingrediente…",
"bannedIngredientsSearching": "Sto cercando…",
"bannedIngredientsEmpty": "Nessun ingrediente bandito per ora.",
"bannedIngredientsRemove": "Rimuovi",
"bannedIngredientsCap": "Hai raggiunto il massimo di 50 ingredienti.",
"cuisinesTitle": "Cucine preferite",
"cuisinesHint": "Indicaci le tradizioni che preferisci. È un suggerimento, non un vincolo.",
"cookingTimeTitle": "Tempo in cucina",
"cookingTimeHint": "Quanto tempo vuoi dedicare alla preparazione, in media?",
"fastingTitle": "Protocollo digiuno predefinito",
"fastingHint": "Sarà selezionato in /fasting alla prossima sessione.",
"fastingNone": "Nessuno per ora",
"fastingTutorialToggle": "Cos'è il digiuno intermittente? Apri la guida lampo",
"fastingTutorialPoint1Title": "Cosa significa.",
"fastingTutorialPoint1": "Si alternano una finestra alimentare (in cui si mangia) e una di digiuno (acqua, tè, caffè senza zucchero). Il numero davanti ai due punti indica le ore di digiuno: 16:8 = 16h di digiuno, 8h di pasti.",
"fastingTutorialPoint2Title": "Come iniziare.",
"fastingTutorialPoint2": "Se sei alle prime armi, parti con 14:10 per qualche settimana e sali gradualmente. Lo schema 16:8 è quello più studiato: la finestra di pasto va spesso da mezzogiorno alle 20.",
"fastingTutorialPoint3Title": "Cosa rispettare.",
"fastingTutorialPoint3": "Idratati molto, non saltare gli elettroliti dopo le 18 ore, ascolta il corpo. Se prendi farmaci o hai patologie croniche, parlane prima con il tuo medico.",
"fastingTutorialDisclaimer": "KetoPath non sostituisce il parere di un medico. In gravidanza, allattamento o con disturbi alimentari il digiuno intermittente non è raccomandato.",
"save": "Salva preferenze",
"saving": "Salvataggio…",
"saved": "Preferenze aggiornate.",
"errorGeneric": "Non è stato possibile salvare. Riprova.",
"exclusionLabel": {
"lactose": "Lattosio",
"egg": "Uova",
"fish": "Pesce",
"nuts": "Frutta secca",
"gluten": "Glutine",
"pork": "Maiale",
"beef": "Manzo"
},
"cuisineLabel": {
"mediterranea": "Mediterranea",
"italiana": "Italiana classica",
"pugliese": "Pugliese",
"siciliana": "Siciliana",
"toscana": "Toscana",
"medio-orientale": "Medio-orientale",
"nordica": "Nordica"
},
"cookingTimeLabel": {
"LOW": "Veloce · fino a 15 min",
"MEDIUM": "Medio · 15–30 min",
"HIGH": "Elaborato · oltre 30 min"
},
"fastingProtocolLabel": {
"FOURTEEN_TEN": "14:10 — inizio dolce",
"SIXTEEN_EIGHT": "16:8 — lo standard",
"EIGHTEEN_SIX": "18:6 — più aggressivo",
"TWENTY_FOUR": "20:4 — avanzato",
"ESE_24": "ESE 24h",
"FIVE_TWO": "5:2"
},
"trainingTitle": "Schedule allenamento",
"trainingHint": "Indica i giorni in cui ti alleni di solito: nei training day il piano alza il fabbisogno calorico.",
"trainingType": "Tipo di allenamento",
"trainingNone": "Nessuno per ora",
"trainingTypeLabel": {
"CARDIO": "Cardio (corsa, bici)",
"STRENGTH": "Forza (pesi)",
"MIXED": "Misto / HIIT",
"SPORT": "Sport di squadra"
},
"sessionMinutes": "Durata media (min)",
"mealsPerDayTitle": "Frequenza pasti",
"mealsPerDayHint": "Quanti pasti preferisci fare al giorno? Se hai un protocollo IF attivo, ha la precedenza lui.",
"mealsAuto": "Automatico (4 pasti)",
"mealsLabel": {
"1": "1 pasto al giorno",
"2": "2 pasti (pranzo + cena)",
"3": "3 pasti (no spuntino)",
"4": "4 pasti (con spuntino)"
}
},
"Notifications": {
"eyebrow": "Notifiche",
"title": "Promemoria al momento giusto",
"subtitle": "Decidi tu cosa vuoi ricevere e su quale dispositivo. Niente marketing, niente notifiche di terze parti.",
"thisDevice": "Questo dispositivo",
"thisDeviceActive": "Le notifiche sono attive su questo dispositivo.",
"thisDeviceInactive": "Questo dispositivo non riceve ancora notifiche. Attivalo per il promemoria settimanale.",
"enableHere": "Attiva sul dispositivo",
"sendTest": "Invia notifica di prova",
"weeklyWeighInLabel": "Promemoria pesata settimanale",
"weeklyWeighInHint": "Lunedì alle 09:00 ti ricordiamo la pesata della settimana.",
"fastingMilestonesLabel": "Tappe del digiuno",
"fastingMilestonesHint": "Idratazione ogni 2h, alert elettroliti oltre le 18h, 30 min prima della fine.",
"mealRemindersLabel": "Promemoria pasti",
"mealRemindersHint": "Pranzo alle 13:00, spuntino alle 16:00, cena alle 19:00 — solo nei giorni non in pausa.",
"registeredDevices": "Dispositivi registrati",
"subscribed": "Notifiche attivate.",
"unsubscribed": "Notifiche disattivate su questo dispositivo.",
"testSent": "Notifica di prova inviata.",
"blocked": "Hai bloccato le notifiche per questo sito. Cambia l'impostazione dal browser per riattivarle.",
"unsupported": "Il tuo browser non supporta le notifiche push. Su iOS apri prima KetoPath dalla Home.",
"serverDisabled": "Le notifiche non sono ancora attive sul server.",
"configUnavailable": "Impossibile caricare le impostazioni notifiche. Riprova più tardi.",
"working": "Attendere…",
"errors": {
"unsupported": "Il tuo browser non supporta le notifiche push.",
"permission_denied": "Hai negato il permesso. Modificalo dal browser per riprovare.",
"permission_default": "Permesso non concesso. Riprova e seleziona 'Consenti'.",
"no_vapid_key": "Configurazione mancante. Contatta l'amministratore.",
"api_error": "Errore di rete. Riprova fra poco.",
"sw_error": "Impossibile registrare il service worker.",
"no_devices": "Nessun dispositivo registrato.",
"push_not_configured": "Le notifiche non sono ancora abilitate sul server.",
"unknown": "Si è verificato un errore imprevisto."
}
},
"Shopping": {
"title": "La spesa della settimana",
"subtitle": "Tutto ciò che ti serve per il piano in corso, raggruppato per reparto.",
"noPlan": "Genera prima un piano della settimana: la lista comparirà qui.",
"viewPlan": "Vai al piano",
"groupSize": "{n} articoli",
"totalLabel": "Totale articoli",
"estimatedCost": "Spesa stimata",
"checked": "{n} di {total}",
"remainingCost": "Restano",
"storeModeOn": "✓ Modalità supermercato",
"storeModeOff": "Modalità supermercato",
"extrasTitle": "Articoli extra",
"extrasHint": "Aggiungi qui le cose che ti servono ma non sono nel piano (sale, olio, carta forno…). Restano solo sul tuo dispositivo.",
"extrasPlaceholder": "es. olio extravergine",
"extrasAdd": "Aggiungi",
"extrasToggle": "Spunta articolo",
"extrasRemove": "Rimuovi articolo",
"fromRecipes": "Per: {names}",
"categoryLabel": {
"verdura": "Verdura",
"frutta": "Frutta",
"carne": "Carne",
"pesce": "Pesce",
"latticini": "Latticini",
"uova": "Uova",
"condimenti": "Condimenti",
"panetteria": "Panetteria",
"frutta-secca": "Frutta secca",
"erbe": "Erbe e spezie",
"salumi": "Salumi"
},
"viewCart": "Lista spesa"
},
"Recipe": {
"title": "Ricetta",
"back": "← Torna al piano",
"ingredientsTitle": "Ingredienti",
"ingredientsSubtitle": "Per una porzione singola",
"preparationTitle": "Preparazione",
"preparationFallback": "Mescola gli ingredienti seguendo l'ordine indicato e cuoci come preferisci.",
"macrosTitle": "Valori per porzione",
"kcal": "Calorie",
"protein": "Proteine",
"fat": "Grassi",
"netCarb": "Carb. netti",
"metaTitle": "Scheda ricetta",
"prepTime": "Preparazione",
"minutes": "{n} min",
"difficulty": "Difficoltà",
"phase": "Fase",
"phasesAll": "Tutte le fasi",
"phasesSome": "Fase {phases}",
"notesChef": "Nota dello chef",
"variantsTitle": "Varianti suggerite",
"substitutesPrefix": "Sostituzioni:",
"difficultyLabel": {
"FACILE": "Facile",
"MEDIA": "Media",
"ELABORATA": "Elaborata"
},
"categoryLabel": {
"COLAZIONE": "Colazione",
"PRANZO": "Pranzo",
"SPUNTINO": "Spuntino",
"CENA": "Cena"
},
"notFound": "Ricetta non trovata."
},
"Plan": {
"title": "Il tuo piano",
"weekOf": "Settimana del {date}",
"noPlan": "Non hai ancora un piano. Generalo: l'algoritmo sceglie le ricette adatte alla tua fase e ai tuoi macros.",
"generate": "Genera piano",
"regenerate": "Rigenera",
"noRecipe": "Nessuna ricetta selezionata",
"showAlternatives": "Vedi {n} alternative",
"hideAlternatives": "Nascondi",
"swap": "Scegli",
"regenerateSlot": "Rigenera questo pasto",
"consumedMark": "Segna come consumato",
"consumedUndo": "Annulla consumato",
"adherence": "Aderenza",
"linkShopping": "Lista della spesa",
"exportPdf": "Esporta PDF",
"freeMealMark": "Segna come pasto libero",
"freeMealUndo": "Torna a una ricetta keto",
"freeMealLabel": "Pasto libero pianificato",
"phase2Eyebrow": "Reintroduzione",
"phase2Week": "Settimana {n} di Fase 2",
"phase3Eyebrow": "Mantenimento — Fase 3",
"dayTotal": "{kcal} kcal totali",
"window": "Finestra alimentare",
"avgKcal": "Media kcal/giorno",
"avgProtein": "Proteine medie",
"avgFat": "Grassi medi",
"avgNetCarb": "Carb. netti medi",
"todayPanelTitle": "Oggi · macros del giorno",
"todayPanelTargetHint": "Consumati / target — pianificati in chiaro",
"todayPanelFasting": "Niente pasti pianificati per oggi: è un giorno di digiuno completo.",
"fastingDay": "Giorno di digiuno",
"fastingDayHint": "Acqua, tè e tisane. Niente cibo solido.",
"lightDay": "Giorno leggero",
"lightDayHint": "Solo cena, kcal ridotte (~25% del giornaliero abituale).",
"protocolLabel": {
"FOURTEEN_TEN": "14:10 — finestra di 10h",
"SIXTEEN_EIGHT": "16:8 — finestra di 8h",
"EIGHTEEN_SIX": "18:6 — finestra di 6h",
"TWENTY_FOUR": "20:4 — finestra di 4h",
"ESE_24": "ESE 24h — un giorno di digiuno completo a settimana",
"FIVE_TWO": "5:2 — due giorni leggeri a settimana"
},
"meals": {
"COLAZIONE": "Colazione",
"PRANZO": "Pranzo",
"SPUNTINO": "Spuntino",
"CENA": "Cena"
},
"days": {
"monday": "Lunedì",
"tuesday": "Martedì",
"wednesday": "Mercoledì",
"thursday": "Giovedì",
"friday": "Venerdì",
"saturday": "Sabato",
"sunday": "Domenica"
}
},
"Achievements": {
"eyebrow": "Traguardi",
"title": "Le tappe del tuo percorso",
"subtitle": "Hai sbloccato {got} traguardi su {total}. Continua così.",
"locked": "Da sbloccare",
"category": {
"tracking": "Tracking",
"plan": "Piano",
"fasting": "Digiuno"
},
"key": {
"first_weigh_in": {
"title": "Prima pesata",
"hint": "Hai registrato il tuo peso per la prima volta."
},
"first_plan": {
"title": "Primo piano",
"hint": "Hai generato il tuo primo piano settimanale."
},
"first_fast_complete": {
"title": "Primo digiuno completato",
"hint": "Hai portato a termine la tua prima sessione di digiuno."
},
"ten_meals_consumed": {
"title": "Dieci pasti spuntati",
"hint": "Hai marcato come consumati 10 pasti dal tuo piano."
}
}
},
"Profile": {
"title": "Il tuo profilo",
"subtitle": "I dati che ci servono per calcolare BMR, TDEE e i target di macros della settimana.",
"age": "Età",
"gender": "Sesso",
"heightCm": "Altezza (cm)",
"weightStartKg": "Iniziale",
"weightCurrentKg": "Attuale",
"weightGoalKg": "Obiettivo",
"activityLevel": "Livello di attività",
"measurementsTitle": "Circonferenze (cm) — opzionali",
"measurementsHint": "Se inserisci collo, vita e (per le donne) fianchi, calcoliamo la tua composizione corporea con la formula US Navy e usiamo Katch-McArdle invece di Mifflin: BMR più accurato.",
"neckCm": "Collo",
"waistCm": "Vita",
"hipsCm": "Fianchi",
"targetWeeklyLossKg": "Velocità di calo (kg/settimana)",
"targetWeeklyLossKgHint": "Suggerito: 0.4–0.7 kg/settimana. Oltre 1% del peso corporeo è considerato troppo aggressivo.",
"alertWeightKg": "Soglia di allarme peso (kg)",
"alertWeightKgHint": "Quando ci risali, KetoPath ti suggerisce una settimana di riparazione. Tipicamente 2-3 kg sopra l'obiettivo.",
"dietHistory": "Storia delle diete precedenti",
"dietHistoryHint": "Diete restrittive ripetute (yo-yo) abbassano il metabolismo basale del 5-15%. Indicarcelo ci serve a calibrare il deficit con prudenza.",
"dietHistoryLabel": {
"NONE": "Mai fatto diete restrittive",
"SOME": "1-2 diete negli ultimi 3 anni",
"EXTENSIVE": "Più diete o effetto yo-yo",
"SEVERE": "Periodi di semi-fame o disturbi alim. in remissione"
},
"selectPlaceholder": "Seleziona…",
"save": "Salva profilo",
"saving": "Salvataggio…",
"summary": "Calcolo personalizzato",
"emptySummary": "Salva il profilo per ricevere il tuo BMR, il TDEE e il target calorico giornaliero.",
"bmr": "Metabolismo basale",
"tdee": "Fabbisogno totale",
"activityMultiplier": "Moltiplicatore attività",
"hint": "Valori stimati con la formula Mifflin-St Jeor. Non sostituiscono il parere di un nutrizionista.",
"genderOptions": {
"MALE": "Maschio",
"FEMALE": "Femmina",
"OTHER": "Altro / preferisco non specificare"
},
"activityOptions": {
"SEDENTARY": "Sedentario · lavoro d'ufficio",
"LIGHT": "Leggero · sport 1–3 volte / settimana",
"MODERATE": "Moderato · sport 3–5 volte / settimana",
"INTENSE": "Intenso · sport 6+ volte / settimana"
},
"working": "Attendere…",
"dataEyebrow": "I tuoi dati (GDPR)",
"dataTitle": "I tuoi diritti sui dati personali",
"dataSubtitle": "Puoi scaricare in qualsiasi momento una copia completa dei tuoi dati o eliminare l'account. Le richieste sono evase immediatamente.",
"dataExportEyebrow": "Esporta",
"dataExportDescription": "Scarica un file JSON con profilo, preferenze, pesate, sessioni di digiuno, piani e check-in.",
"dataExportAction": "Esporta i miei dati",
"dataDeleteEyebrow": "Elimina account",
"dataDeleteDescription": "Cancellazione completa e irreversibile di tutti i tuoi dati. Niente backup, niente recupero.",
"dataDeleteAction": "Elimina account",
"dataDeleteWarning": "Questa azione è irreversibile. Conferma con la tua password per procedere.",
"dataDeletePasswordPlaceholder": "La tua password",
"dataDeleteConfirm": "Elimina definitivamente",
"dataDeleteCancel": "Annulla",
"dataDeleteErrors": {
"password_required": "Inserisci la tua password.",
"invalid_password": "Password non corretta.",
"email_required": "Email assente sul tuo account.",
"api_error": "Errore di rete. Riprova fra poco."
}
},
"Billing": {
"title": "Abbonamento",
"subtitle": "Trenta giorni di prova gratuiti, senza carta. Poi un piano semplice — mensile o annuale — che si gestisce in autonomia dal portale Stripe.",
"currentStatus": "Stato attuale",
"actions": "Azioni",
"trialActive": "Sei in prova ({days} giorni rimasti).",
"trialActiveBody": "Hai accesso completo a piani, tracking, digiuno e foto progress fino al {endsAt}. Allo scadere puoi continuare a leggere lo storico — ma per nuove pesate, piani e foto serve l'abbonamento.",
"trialExpired": "La prova è scaduta.",
"trialExpiredBody": "Lo storico resta consultabile. Per ricominciare a generare piani, registrare pesate e completare digiuni, attiva un abbonamento.",
"proActive": "Abbonamento attivo.",
"proActiveBody": "Piano {interval}, prossimo rinnovo il {renewsAt}. Tutto sbloccato.",
"pastDue": "Pagamento in sospeso.",
"pastDueBody": "L'ultimo addebito è fallito. Stripe sta riprovando: aggiorna la carta dal portale per evitare interruzioni.",
"canceling": "Disdetta in corso.",
"cancelingBody": "L'abbonamento resta valido fino al {endsAt}. Puoi riattivarlo in qualsiasi momento dal portale.",
"canceled": "Abbonamento disdetto.",
"canceledBody": "Lo storico resta tuo e consultabile. Quando vuoi rientrare, basta un nuovo upgrade.",
"noSubscription": "Nessun abbonamento attivo.",
"intervalMonth": "mensile",
"intervalYear": "annuale",
"upgradeMonthly": "Abbonati — €9,90 / mese",
"upgradeYearly": "Abbonati — €89 / anno (≈25% di sconto)",
"managePortal": "Gestisci abbonamento",
"opening": "Apertura…",
"checkoutHint": "Verrai reindirizzato al pagamento sicuro su Stripe.",
"notConfigured": "Pagamenti non ancora attivati. La tua prova continua: nessuna interruzione.",
"errorLoading": "Impossibile caricare lo stato dell'abbonamento.",
"whatYouGet": "Cosa è incluso",
"benefit1Title": "Piani settimanali infiniti",
"benefit1Body": "Genera quanti piani vuoi, riadattati alla fase, alle preferenze e alle esclusioni alimentari. Con riadattamento automatico se cambi peso o protocollo.",
"benefit2Title": "Tracking completo",
"benefit2Body": "Pesate quotidiane, check-in soggettivi, foto progress, digiuno con timer e milestone. Tutto cifrato a riposo (art. 9 GDPR).",
"benefit3Title": "Export PDF per il medico",
"benefit3Body": "Un documento sintetico — peso, misure, aderenza — pronto da inviare al nutrizionista o consultare in studio.",
"trialBannerTitle": "Sei in prova",
"trialBannerBody": "{days} giorni rimasti. Tutto sbloccato fino al {endsAt}.",
"trialBannerCta": "Vai all'abbonamento",
"trialEndedBannerTitle": "La prova è scaduta",
"trialEndedBannerBody": "Per generare nuovi piani e registrare pesate serve l'abbonamento.",
"trialEndedBannerCta": "Abbonati",
"paywallTitle": "Funzione Pro",
"paywallBody": "Questa azione richiede un abbonamento attivo.",
"paywallCta": "Vai all'abbonamento",
"navLabel": "Abbonamento",
"error": {
"billing_not_configured": "Il sistema di pagamento non è ancora configurato. Riprova più tardi.",
"no_stripe_customer": "Non hai ancora un abbonamento attivo. Avvia prima il checkout.",
"api_error_400": "Richiesta non valida.",
"api_error_401": "Devi accedere per gestire l'abbonamento.",
"api_error_500": "Errore del server. Riprova fra poco."
}
}
}