diff --git a/frontend/next.config.js b/frontend/next.config.js index f9556f48ea..562ecf1c9e 100644 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -15,11 +15,6 @@ const { const nextConfig = { output: "standalone", - i18n: { - locales: ["default", "en", "it"], - defaultLocale: "default", - localeDetection: false, - }, trailingSlash: false, cacheHandler: process.env.VERCEL_ENV === "preview" diff --git a/frontend/src/components/header/index.tsx b/frontend/src/components/header/index.tsx index 5f94a590b0..7450c78796 100644 --- a/frontend/src/components/header/index.tsx +++ b/frontend/src/components/header/index.tsx @@ -2,14 +2,11 @@ import { NavBar } from "@python-italia/pycon-styleguide"; import type { Action } from "@python-italia/pycon-styleguide/dist/navbar/types"; import React, { useEffect, useState } from "react"; -import { useRouter } from "next/router"; - import { useLoginState } from "~/components/profile/hooks"; import { getTranslatedMessage } from "~/helpers/use-translated-message"; import { useCurrentLanguage } from "~/locale/context"; import { useHeaderQuery } from "~/types"; -import { createHref } from "../link"; import { Logo, MobileLogo } from "../logo"; export const Header = () => { @@ -21,25 +18,14 @@ export const Header = () => { code: process.env.conferenceCode!, }, }); - const { route, query } = useRouter(); useEffect(() => { setIsReady(true); }, []); const { - conference: { - conferenceMenuEn, - programMenuEn, - conferenceMenuIt, - programMenuIt, - isRunning, - currentDay, - }, + conference: { conferenceMenuEn, programMenuEn, isRunning }, } = data || { conference: {} }; - // const hasSomethingLive = currentDay?.rooms?.some( - // (room) => !!room.streamingUrl, - // ); const actions: Action[] = [ isRunning @@ -65,19 +51,8 @@ export const Header = () => { }, ]; - const conferenceMenu = - language === "it" ? conferenceMenuIt : conferenceMenuEn; - const programMenu = language === "it" ? programMenuIt : programMenuEn; - - const mainLinks = conferenceMenu?.links ?? []; - const secondaryLinks = programMenu?.links ?? []; - - const languageSwitchHref = createHref({ - path: route, - params: query, - locale: language === "it" ? "en" : "it", - external: false, - }); + const mainLinks = conferenceMenuEn?.links ?? []; + const secondaryLinks = programMenuEn?.links ?? []; return (
@@ -87,10 +62,6 @@ export const Header = () => { actions={actions} logo={Logo} mobileLogo={MobileLogo} - bottomBarLink={{ - text: getTranslatedMessage("header.switchLanguage", language), - link: languageSwitchHref, - }} />
); diff --git a/frontend/src/components/link/index.tsx b/frontend/src/components/link/index.tsx index e3cb6cc48a..889f0945a1 100644 --- a/frontend/src/components/link/index.tsx +++ b/frontend/src/components/link/index.tsx @@ -3,12 +3,11 @@ import type { ParsedUrlQuery } from "querystring"; export const createHref = ({ path, params, - locale, external, }: { path: string; params?: ParsedUrlQuery; - locale: string; + locale?: string; external?: boolean; }) => { if (external) { @@ -37,7 +36,5 @@ export const createHref = ({ .map(([key, value]) => `${key}=${value}`) .join("&"); - return `/${locale}${resolvedPath}${ - queryParams.length > 0 ? `?${queryParams}` : "" - }`; + return `${resolvedPath}${queryParams.length > 0 ? `?${queryParams}` : ""}`; }; diff --git a/frontend/src/components/meta-tags/index.tsx b/frontend/src/components/meta-tags/index.tsx index 15c0b258f0..a5c2d6943b 100644 --- a/frontend/src/components/meta-tags/index.tsx +++ b/frontend/src/components/meta-tags/index.tsx @@ -12,16 +12,12 @@ type Props = { useDefaultSocialCard?: boolean; }; -const getSocialCardURL = ( - asPath: string, - useDefaultSocialCard: boolean, - locale: string, -) => { +const getSocialCardURL = (asPath: string, useDefaultSocialCard: boolean) => { if (useDefaultSocialCard) { - return `${process.env.NEXT_PUBLIC_SITE_URL}api/${locale}/social-card`; + return `${process.env.NEXT_PUBLIC_SITE_URL}api/social-card`; } - return `${process.env.NEXT_PUBLIC_SITE_URL}api/${locale}/${asPath.substring( + return `${process.env.NEXT_PUBLIC_SITE_URL}api/${asPath.substring( 1, )}/social-card`; }; @@ -33,8 +29,8 @@ export const MetaTags = ({ children, }: React.PropsWithChildren) => { const language = useCurrentLanguage(); - const { asPath, locale } = useRouter(); - const socialCard = getSocialCardURL(asPath, useDefaultSocialCard, locale); + const { asPath } = useRouter(); + const socialCard = getSocialCardURL(asPath, useDefaultSocialCard); const titleTemplate = messages[language].titleTemplate; diff --git a/frontend/src/components/page-handler/page-static-props.ts b/frontend/src/components/page-handler/page-static-props.ts index 175b36e3c8..60e20148c7 100644 --- a/frontend/src/components/page-handler/page-static-props.ts +++ b/frontend/src/components/page-handler/page-static-props.ts @@ -3,6 +3,7 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { blocksDataFetching } from "~/components/blocks-renderer"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { type PagePreviewQuery, type PageQuery, diff --git a/frontend/src/locale/context.tsx b/frontend/src/locale/context.tsx index 10973d7741..5042585dee 100644 --- a/frontend/src/locale/context.tsx +++ b/frontend/src/locale/context.tsx @@ -1,28 +1,13 @@ import React from "react"; -import cookies from "next-cookies"; -import { useRouter } from "next/router"; - -import type { Language } from "~/locale/languages"; +import { DEFAULT_LOCALE, type Language } from "~/locale/languages"; export const LocaleProvider = ({ children, }: React.PropsWithChildren<{ lang: string }>) => { - const language = useCurrentLanguage(); - - React.useEffect(() => { - const { pyconLocale } = cookies({ - req: { headers: { cookie: document.cookie } }, - }); - if (language !== pyconLocale) { - document.cookie = `pyconLocale=${language}; path=/`; - } - }, [language]); - return <>{children}; }; -export const useCurrentLanguage = () => { - const { locale } = useRouter(); - return locale as Language; +export const useCurrentLanguage = (): Language => { + return DEFAULT_LOCALE; }; diff --git a/frontend/src/locale/index.ts b/frontend/src/locale/index.ts index 9f832361e6..feaffc3f4a 100644 --- a/frontend/src/locale/index.ts +++ b/frontend/src/locale/index.ts @@ -1177,1209 +1177,6 @@ The sooner you buy your ticket, the more you save!`, "An unexpected error occurred. If this keeps happening, please {reportLink}! In the meantime, here's Ernesto thinking about pineapple pizza 🍕", "errorPage.reportLink": "report the issue", }, - it: { - titleTemplate: "%s | PyCon Italia", - description: - "Partecipa a PyCon Italia! Dal 27 al 30 Maggio 2026 a Bologna!", - "global.submit": "Invia", - "global.pleaseWait": "Attendi", - - "global.accordion.close": "Chiudi", - "global.accordion.readMore": "Apri", - "global.here": "qui", - "global.yes": "Si", - "global.no": "No", - "global.learnMore": "Maggiori informazioni", - "global.loading": "Caricamento in corso...", - "global.button.loading": "Invio {emoji}", - "global.somethingWentWrong": "Qualcosa è andato male, prova di nuovo", - "global.loadMore": "Carica altri", - "global.tryAgain": "Si è verificato un errore: {error}", - "global.selectOption": "Seleziona un'opzione", - - "home.title": "Home", - "home.deadline.begins": "Inizio", - "home.deadline.deadline": "Fine", - "home.voting.vote": "Vota adesso", - "home.cfp.submit": "Invia proposta", - "home.gettingThere": "Come arrivare", - "home.findRoute": "Raggiungici", - "home.conferenceHighlights": "Eventi sociali", - "home.latestNews": "Ultime notizie", - "buttons.save": "Salva", - "profile.title": "Il tuo profilo", - "profile.notSet": "Non impostato", - "profile.country": "Nazionalità", - "profile.dateBirth": "Data di nascita", - "profile.email": "Email", - "profile.name": "Nome", - "profile.fullName": "Nome Completo", - "profile.gender": "Sesso", - "profile.gender.selectGender": "Seleziona un sesso", - "profile.gender.female": "Femmina", - "profile.gender.male": "Maschio", - "profile.gender.other": "Altro", - "profile.gender.not_say": "Preferisco non dirlo", - "profile.header": "Il mio profilo", - "profile.loading": "Caricamento...", - "profile.profileHeader": "Il mio profilo", - "profile.editProfile": "Modifica profilo", - "profile.orderId": "Ordine #", - "profile.status": "Stato", - "profile.price": "Prezzo", - "profile.manageOrder": "Gestisci ordine", - "profile.mySubmissionsHeader": "Le mie submissions", - "profile.myOrders": "I miei ordini", - "profile.sponsorSection": "Sezione sponsor", - "profile.sponsorSection.badgeScans": "Scansioni badge", - "profile.sponsorSection.badgeScansExport": "Esporta tutti in CSV", - "profile.sponsorSection.title": "Sezione sponsor", - "profile.sponsorSection.loading": "Caricamento...", - "profile.sponsorSection.noScan": "Nessuna scansione", - "profile.sponsorSection.loadMore": "Carica altri", - "profile.myTickets": "I miei biglietti", - "profile.myTickets.notickets": ` - Non sono stati trovati biglietti assegnati alla tua email: {email}. - {br} - Assicurati che l'e-mail del partecipante nel tuo ordine ("I miei ordini" qui sopra, puoi modificarlo con "Gestisci l'ordine") - e l'e-mail del tuo profilo ({email}) corrisponda oppure acquista un biglietto {linkTicket}. - {br} - {br} - Se non hai acquistato tu personalmente il biglietto, chiedi alla persona che ha acquistato il biglietto - di aggiungere la tua email {email} come l'email del partecipante per far apparire il tuo biglietto qui - `, - "profile.myTickets.update.AttendeeTicket.message": - "Il biglietto e' stato salvato correttamente!", - "profile.myTickets.update.TicketReassigned.message": - "Il biglietto e' stato correttamente riassegnato a {email}.", - "profile.ticketFor": "Biglietto per", - "profile.status.pending": "In attesa", - "profile.status.paid": "Pagato", - "profile.status.expired": "Scaduto", - "profile.status.canceled": "Cancellato", - "profile.openToNewsletter": - "Desidero ricevere E-mail per le comunicazioni più importanti", - "profile.openToRecruiting": - "Desidero ricevere alcune proposte di lavoro selezionate attraverso PyCon Italia", - "profile.edit.title": "Modifica profilo", - "profile.manageTicket": "Gestisci biglietto", - "profile.edit.personalHeader": "Dati personali", - "profile.edit.privacyHeader": "Impostazioni privacy", - "profile.logout": "Logout", - "profile.seeYourSoon": "A presto 👋", - "login.title": "Login", - "manageTicket.heading": "Gestisci {ticketName}", - "manageTicket.notAnswered": "Non risposta", - "manageTicket.save": "Salva modifiche", - "manageTicket.goBack": "Oppure torna indietro", - "login.email": "Email", - "login.password": "Password", - "login.loginButton": "Accedi", - "login.recoverPassword": "Password dimenticata?", - "login.waitWhileSendingResetPasswordRequest": - "Invio richiesta reset in corso", - "login.checkYourEmails": - "Controlla le tue email per il link per cambiare password! 🥳", - "login.typeEmailToRecoverPassword": - "Password dimenticata? Inserisci la tua email e clicca qui", - "newsletter.header": "Tieniti aggiornato", - "newsletter.text": - "Rimani aggiornato, iscriviti per ricevere aggiornamenti via email su eventi, novità e offerte!", - "newsletter.button": "Iscriviti", - "newsletter.success": "Iscrizione completata con successo! 🎉", - "newsletter.confirmViaEmail": - "Iscrizione completata con successo! 🎉 Controlla le tue email per confermarla!", - "newsletter.error": - "Si è verificato un errore, controlla la tua email sia corretta e riprova.", - "newsletter.optinFormRequired": - "Questo indirizzo email è stato rimosso su richiesta. Se hai cambiato idea, {link}.", - "newsletter.optinFormRequired.link": - "clicca questo link per iscriverti nuovamente", - "signup.title": "Registrati", - "signup.email": "Email", - "signup.password": "Password", - "signup.password2": "Conferma Password", - "signup.passwordMismatch": "Assicurati che le password coincidono", - "signup.signupButton": "Registrati", - "signup.fullname": "Nome completo", - "deadlines.start": "Inizio", - "deadlines.end": "Fine", - "submission.loading": "Caricamento in corso", - "submission.notFound": "Non trovato", - "submission.socialCard.prefix": "Ho proposto:", - "submission.comments": "Commenti", - "submission.commentHead": "{author}, {when}:", - "submission.noComments": "Nessun commento", - "submission.addComment": "Aggiungi commento", - "submission.sendComment": "Invia", - "submission.pleaseWait": "Attendi", - "cfp.needToBeLoggedIn": - "Devi effettuare l'accesso per inviare una proposta", - "cfp.closed.title": "La call for proposal è chiusa!", - "cfp.closed.description": - "Grazie a tutte le persone che hanno fatto una proposta! Manderemo aggiornamenti a breve!", - "cfp.closed.voting": - "Non dimenticare che la votazione comunitaria aprirà presto. Se hai proposto un talk o hai un biglietto per la conferenza puoi vedere la lista di tutti i talk e votare i tuoi preferiti!", - "cfp.closed.buyTicket": "Compra il tuo biglietto ora!", - "cfp.pageTitle": "Invia una proposta", - "cfp.youridea": "La tua idea", - "cfp.choosetype": "Scegli una categoria", - "cfp.choosetypeDescription": "Che tipo di proposta stai inviando?", - "cfp.format": "Categoria", - "cfp.viewSubmission": "Apri proposta", - "cfp.talk": "Talk", - "cfp.tutorial": "Tutorial", - "cfp.title": "Titolo", - "cfp.titleDescription": "Il titolo della tua proposta", - "cfp.introductionHeading": "Invia una proposta", - "cfp.introductionCopy": - "PyCon Italia è alla ricerca di speakers con ogni background per contribuire al nostro programma. Se usi Python professionalmente, come hobbista o semplicemente ti appassiona Python o la programmazione, proponi un talk! Vogliamo sentire ciò che hai da condividere!", - "cfp.introductionDeadline": - "Hai tempo fino al {deadline} per inviare una proposta!", - "cfp.yourProposals": "Le tue proposte", - "cfp.elevatorPitchLabel": "Elevator pitch", - "cfp.elevatorPitchDescription": - "Hai 300 caratteri per vendere la tua idea. Ricordati di renderlo il più interessante possibile", - "cfp.lengthLabel": "Durata", - "cfp.lengthDescription": "La durata del talk o workshop", - "cfp.audienceLevelLabel": "Livello audience", - "cfp.audienceLevelDescription": "Che genere di audience ti aspetti?", - "cfp.abstractLabel": "Descrizione", - "cfp.abstractDescription": - "Questa descrizione verrà mostrata sia ad organizzatori e partecipanti. Dovresti rendere la descrizione il più completa ed interessante possibile - ricordati, stai vendendo la tua idea sia agli organizzatori che ai partecipanti", - "cfp.notesLabel": "Note", - "cfp.notesDescription": - "Le note sono visibili solo agli organizzatori. È qui che dovresti indicare cose come i requisiti tecnici necessari per l'intervento.", - "cfp.trackLabel": "Traccia", - "cfp.topicDescription": "Di cosa tratta questa proposta?", - "cfp.languagesLabel": "Lingua", - "cfp.languagesDescription": - "Puoi inviare la tua proposta in più lingue se lo desideri. I votatori vedranno la lingua che si adatta alle loro preferenze. Non duplicare le tue proposte per lingua o potrebbero essere annullate.", - "cfp.tagsLabel": "Tags", - "cfp.tagsDescription": - "Utilizza fino a 3 tag per descrivere l'argomento della tua proposta. Esempi sono 'Web Frameworks, API'.", - "cfp.submissionSent": "Proposal inviata!", - "cfp.submit": "Invia", - "cfp.minutes": "minuti", - "cfp.selectDuration": "Seleziona una durata", - "cfp.selectTrack": "Seleziona una traccia", - "cfp.selectAudience": "Seleziona livello", - "cfp.selectSpeakerLevel": "Seleziona un livello di esperienza", - "cfp.loading": "Caricamento", - "cfp.cannotEdit": "Non puoi modificare questa submission", - "cfp.validationErrors": "Alcuni campi non sono corretti", - "cfp.speakerLevel": "Esperienza", - "cfp.speakerLevel.new": "Nuovo speaker", - "cfp.speakerLevel.intermediate": "Ho fatto qualche talk (più di 5 talks)", - "cfp.speakerLevel.experienced": "Ho fatto molti talk (più di 15 talks)", - "cfp.speakerLevelDescription": - "Il tuo livello stimato di esperienza come speaker? Questa informazione non è pubblica.", - "cfp.previousTalkVideo": "Talk precedente", - "cfp.previousTalkVideoDescription": - "Link ad un talk che hai fatto in passato. Sarà di grande aiuto durante la review del programma e non visible pubblicamente", - "cfp.aboutYou": "Su di te", - "cfp.aboutYouDescription": - "Questa sezione ci aiuterà a conoscerti meglio come speaker, ed è condivista con tutte le tue proposte", - "cfp.shortSocialSummaryLabel": "Riassunto per social", - "cfp.shortSocialSummaryDescription": - "Qui puoi lasciare un piccolo riassunto che potremmo utilizzare per promuovere la tua proposta sui nostri social, se accettata.", - "header.coronaVirus": "🚨 Aggiornamento COVID-19 - Conferenza annullata 😢", - "header.dashboard": "Dashboard", - "header.login": "Login", - "header.tickets": "Biglietti", - "header.followus": "Seguici", - "header.contact": "Contatti", - "header.becomeASponsor": "Diventa sponsor", - "header.enquiries": "Informazioni", - "header.schedule": "Programma", - "header.switchLanguage": "Change language to English", - - "resetPassword.newPassword": "Nuova Password", - "resetPassword.confirmPassword": "Conferma password", - "resetPassword.changePassword": "Conferma", - "resetPassword.changeYourPassword": "Cambia la tua password", - "resetPassword.youCanNowLogin": "Password cambiata! Puoi ora loggarti", - "requestResetPassword.passwordForgotten": "Recupera password", - "requestResetPassword.email": "Email", - "login.loading": "Caricamento", - "login.loginWithEmail": "Bentornato!", - "login.loginWithSocial": "... o i tuoi account social", - "login.dontHaveAccount": "Non hai un account? {createLink}", - "login.dontHaveAccount.create": "Registrati!", - "login.useGoogle": "Accedi con Gogle", - "signup.signupWithEmail": "Crea un account", - "signup.signupWithSocial": "... o con i tuoi account social", - "signup.useGoogle": "Registrati con Google", - "signup.alreadyHaveAccount": "Hai già un account? {loginLink}", - "blog.title": "Blog", - "blog.readMore": "Continua a leggere", - "blog.author": "Autore", - "inputTag.selectTags": "Scegli dei tag", - "tickets.pageTitle": "Compra il tuo biglietto per PyCon Italia", - "tickets.loading": "Caricamento in corso 🕐", - "tickets.heading": "Acquista biglietti", - "tickets.explanation": "{br}", - - "signup.acceptPrivacyPolicy": "Accetto la {privacyPolicyLink}", - "signup.privacyPolicy": "privacy policy", - - "whatsnext.comingUp": "Evento", - "whatsnext.beings": "Inizio", - "whatsnext.ends": "Fine", - - "order.nextStep": "Continua", - "order.creatingOrder": "Creazione ordine in corso 🕐", - "order.payWithCard": "Paga con carta", - "order.payWithBankTransfer": "Paga con bonifico bancario", - "order.needToSelectProducts": - "Scegli un biglietto o una maglietta prima di continuare", - "order.userAlreadyMember": - "Fai già parte della nostra associazione. Grazie!", - "order.addMembership": "Aggiungi iscrizione", - "order.removeMembership": "Rimuovi iscrizione", - "orderConfirmation.manage": "Fai click qui per gestire il tuo ordine", - "orderConfirmation.home": "Homepage", - "orderConfirmation.heading": "Ordine confermato", - "orderConfirmation.heading.canceled": "Ordine cancellato!", - "orderConfirmation.heading.pending": "Ordine non processato!", - "orderConfirmation.successMessage": - "Grazie per l'ordine, riceverai una email di conferma a breve.", - "orderConfirmation.pendingManage": "Cambia carta o riprova", - "orderConfirmation.pendingMessage": - "Il tuo ordine è ancora pending e non confermato!", - "orderConfirmation.cardMessage": - "Se hai pagato con carta, clicca il pulsante per riprovare", - "orderConfirmation.bankMessage": - "Se hai pagato con bonifico bancario, tieni presente che i bonifici vengono elaborati manualmente e potrebbe essere necessaria fino a una settimana affinché il tuo ordine venga contrassegnato come pagato. Una volta effettuato il bonifico, contattaci a {email} con il tuo codice {code} per aiutarci a confermarlo più velocemente.", - "orderConfirmation.tryAgain": "Prova a creare un nuovo ordine", - "orderConfirmation.tickets": "Biglietti", - "order.soldout": "Sold out", - "order.price": "Prezzo: {price} EUR", - "order.inclVat": "(incl. {taxRate}% IVA)", - "order.selectSize": "Taglia...", - "profile.tickets.size": "Taglia", - "order.availableUntil": "Disponibile fino al {date}", - "order.ticketsLeft": - "{count, plural, =0 {Sold out} one {# rimasto} other {# rimasti}}", - - "orderReview.edit": "Modifica", - "orderReview.usingVoucher": "Codice sconto usato", - "orderReview.ticketPrice": "{finalPrice}", - "orderReview.ticketPriceWithVoucher": "{basePrice} {finalPrice}", - "orderReview.totalAmount": "{total}", - - "voucher.voucherHeading": "Codice sconto", - "voucher.redeemVoucher": "Usa", - "voucher.loading": "Caricamento", - "voucher.noProductsAffected": - "Codice sconto attivato ma nessun prodotto nel carrello può essere scontato", - "voucher.removeVoucher": "Rimuovi: {code}", - "voucher.codeNotValid": "Codice non valido", - - "orderInformation.heading": "Informazioni di fatturazione", - "orderInformation.individualConsumer": "Persona individuale", - "orderInformation.businessConsumer": "Azienda", - "orderInformation.companyName": "Nome azienda", - "orderInformation.givenName": "Nome", - "orderInformation.familyName": "Cognome", - "orderInformation.vatId": "Partita IVA", - "orderInformation.address": "Indirizzo", - "orderInformation.zipCode": "CAP", - "orderInformation.city": "Città", - "orderInformation.country": "Nazione", - "orderInformation.italianInvoice": "Dettagli fattura elettronica", - "orderInformation.fiscalCode": "Codice fiscale", - "orderInformation.invalidFiscalCode": "Codice fiscale non valido", - "orderInformation.pec": "PEC", - "orderInformation.sdi": "SDI", - "orderInformation.invalidSDI": - "Il codice SDI deve essere di 7 caratteri (6 per una PA)", - - "orderQuestions.heading": "Domande aggiuntive", - "orderQuestions.attendeeName": "Nome partecipante", - "orderQuestions.attendeeEmail": "Email partecipante", - "orderQuestions.repeatAttendeeEmail": "Conferma Email partecipante", - - "grants.pageTitle": "Grants", - "grants.introductionHeading": "Grants", - "grants.introductionSubtitle": - "Vorresti essere presente a PyCon Italia ma hai difficoltà economiche? Chiedici aiuto!", - "grants.introductionCopy": - "Grazie all'aiuto della Python Software Foundation siamo lieti di mettere a disposizione di chi ne avesse bisogno un programma di supporto per chi vorrebbe essere presente a PyCon Italia ma per motivi economici non potrebbe riuscirci.", - "grants.introductionDeadline": - "Hai fino al {deadline} per inviare la tua richiesta!", - "grants.comingSoon": "Il form per i grant apre il {start}!", - "grants.closed": - "Il form per richiedere grant è chiuso! Se hai inviato una richiesta ti contatteremo nelle prossime settimane con l'esito.", - - "grants.alreadySubmitted": - "Hai gia' richiesto un grant! Clicca {linkGrant} per editarlo.", - "grants.alreadySubmitted.linkGrant.text": "qui", - - "grants.form.needToBeLoggedIn": - "Devi effettuare l'accesso per chiedere un grant", - "grants.form.title": "Chiedi un grant", - "grants.form.description": `Questo è il modulo di domanda per il grant di PyCon Italia! - -Avendo ricevuto molte domande in passato e operando con un budget limitato, ti chiediamo di dedicare un momento per raccontarci di te e le ragioni per cui stai cercando un grant. Le tue riflessioni sono preziose per noi. Non esiste una risposta sbagliata, e una risposta ben ponderata può fare davvero la differenza. - -Stiamo continuamente lavorando per aumentare il nostro budget grazie al supporto dei nostri sponsor per la diversità, inclusi la Python Software Foundation e la EuroPython Society. Se la tua azienda è interessata a contribuire, visita la nostra pagina degli sponsor per maggiori informazioni. - -Non vediamo l'ora di leggere la tua storia e speriamo di vederti a PyCon Italia! - `, - "grants.form.sendingRequest": "Invio richiesta in corso", - "grants.form.sent": - "Richiesta di grant inviata! Ti invieremo un'email appena ci saranno novità! Nel frattempo, puoi controllare lo stato e modificare il tuo grant nella tua {linkMyGrant} fino al {grantsDeadline}.", - "grants.form.sent.linkMyGrant.text": "pagina del profilo", - "grants.form.aboutYou": "Su di te", - "grants.form.travel": "Viaggio", - "grants.form.optionalInformation": "Informazioni opzionali", - "grants.form.optionalInformation.description": - "Questo informazioni ci aiutano a rendere la conferenza più inclusiva e diversa.", - - "grants.form.fields.fullName": "Nome legale", - "grants.form.fields.fullName.description": - "Il nome come appare sul passaporto, sulla carta d'identità e su altri documenti legali. Questa informazione è essenziale per l'elaborazione dell'eventuale grant assegnato.", - "grants.form.fields.name": "Nome", - "grants.form.fields.name.description": - "Il nome che usi quotidianamente o come preferisci che ci rivolgiamo a te nel caso in cui abbiamo bisogno di contattarti.", - "grants.form.fields.nationality": "Qual è la tua nazionalità?", - "grants.form.fields.nationality.description": "Indica la tua nazionalità.", - "grants.form.fields.ageGroup": "Fascia d'età", - "grants.form.fields.ageGroup.description": - "Seleziona la tua fascia d'età. Questo ci aiuta a comprendere la distribuzione demografica delle persone che fanno richiesta.", - "grants.form.fields.ageGroup.values.range_under_18": "meno di 18 anni", - "grants.form.fields.ageGroup.values.range_18_24": "18 - 24 anni", - "grants.form.fields.ageGroup.values.range_25_34": "25 - 34 anni", - "grants.form.fields.ageGroup.values.range_35_44": "35 - 44 anni", - "grants.form.fields.ageGroup.values.range_45_54": "45 - 54 anni", - "grants.form.fields.ageGroup.values.range_55_64": "55 - 64 anni", - "grants.form.fields.ageGroup.values.range_more_than_65": "65 anni o più", - "grants.form.fields.occupation": "Occupazione", - "grants.form.fields.occupation.description": - "Seleziona la propria attuale occupazione.", - "grants.form.fields.occupation.values.developer": "Sviluppo software", - "grants.form.fields.occupation.values.student": "In formazione", - "grants.form.fields.occupation.values.researcher": "Ricerca", - "grants.form.fields.occupation.values.unemployed": "In cerca di lavoro", - "grants.form.fields.occupation.values.other": "Altro", - "grants.form.fields.grantType": - "Seleziona tutte le categorie di grant che si applicano a te", - "grants.form.fields.grantType.description": `Puoi scegliere più di un'opzione se necessario. -Nota: Se hai inviato una proposta di talk/workshop, non è necessario richiedere un grant come speaker per ottenere il rimborso del biglietto della conferenza. Ti contatteremo per il rimborso del biglietto se la tua proposta viene accettata.`, - "grants.form.fields.grantType.values.diversity": "Diversity", - "grants.form.fields.grantType.values.unemployed": - "Fattori economici e sociali", - "grants.form.fields.grantType.values.speaker": "Speaker", - "grants.form.fields.departureCountry": "Da quale paese partirai?", - "grants.form.fields.departureCountry.description": - "Seleziona il paese da cui partirai per partecipare alla conferenza.", - "grants.form.fields.departureCity": "Da quale città partirai?", - "grants.form.fields.departureCity.description": - "Indica la città da cui inizierai il tuo viaggio.", - "grants.form.fields.needsFundsForTravel": - "Hai bisogno di aiuti finanziari per le spese di viaggio a Pycon Italia?", - "grants.form.fields.needsFundsForTravel.description": - "I fondi a nostra disposizione sono limitati, ma faremo il possibile per aiutare tutte le persone che ne fanno richiesta. Richiedi questo aiuto solo se ti è strettamente necessario!", - "grants.form.fields.needVisa": - "Hai bisogno di una lettera d'invito per la domanda di visto?", - "grants.form.fields.needVisa.description": - "Possiamo fornire una lettera d'invito a supporto della tua domanda di visto. Anche se non possiamo influenzare la decisione sul visto, siamo qui per aiutare a facilitare il processo di domanda.", - "grants.form.fields.needAccommodation": - "Hai bisogno di un alloggio per la durata della conferenza?", - "grants.form.fields.needAccommodation.description": - "Mentre non siamo in grado di prenotare l'alloggio direttamente per te, se il tuo grant include il supporto per l'alloggio, dovrai organizzare la sistemazione in autonomia e ti rimborseremo secondo i termini del grant.", - "grants.form.fields.why": - "Perché stai richiedendo un grant per PyCon Italia?", - "grants.form.fields.why.description": - "Descrivere brevemente perché si sta richiedendo un grant.", - "grants.form.fields.pythonUsage": "Per cosa usi Python?", - "grants.form.fields.pythonUsage.description": - "Come usi Python? Lo stai studiando, lo usi per lavoro o come hobby?", - "grants.form.fields.beenToOtherEvents": - "Hai partecipato a PyCon Italia o ad altri eventi legati a Python? Se sì, quali?", - "grants.form.fields.beenToOtherEvents.description": - "Per favore, limita la risposta a circa 200 parole.", - "grants.form.fields.communityContribution": - "Hai contribuito alla comunità Python o organizzato eventi, conferenze o meetup legati a Python?", - "grants.form.fields.communityContribution.description": - "Che si tratti di programmazione, insegnamento, scrittura, parlare a eventi, o semplicemente essere appassionati di Python e in fase di apprendimento, ci piacerebbe sentire del tuo impegno con Python. Queste informazioni ci aiutano a comprendere la tua connessione con la comunità, ma è completamente normale se stai iniziando con Python o non hai avuto queste opportunità.", - "grants.form.fields.gender": "Sesso", - "grants.form.fields.gender.description": - "Rispettiamo la tua privacy. Se sei a tuo agio nel condividerlo, indica il tuo genere. Questo è facoltativo e ci aiuta a garantire diversità e inclusività.", - "grants.form.fields.notes": "Qualcos'altro da aggiungere?", - "grants.form.fields.notes.description": - "Puoi condividere qualsiasi informazione aggiuntiva o commento che ritieni possa essere rilevante per la tua candidatura.", - "grants.form.fields.website": "URL del sito web", - "grants.form.fields.twitterHandle": "Handle Twitter", - "grants.form.fields.githubHandle": "Profilo GitHub", - "grants.form.fields.linkedinUrl": "URL del profilo LinkedIn", - "grants.form.fields.mastodonHandle": "Handle Mastodon", - - "grants.form.submit": "Invia", - "grants.form.edit.title": "Modifica il tuo Grant", - - "grants.reply.title": "Gestisci il tuo Grant", - "grants.reply.titleApproved": - "Congratulazioni! Il tuo Grant e' stato approvato! ", - "grants.reply.descriptionApproved": `Per favore, conferma la tua presenza entro il {replyDeadline}! -Se non riceveremo una conferma da te prima del {replyDeadline}, assegneremo il tuo grant ad un'altra persona.`, - "grants.reply.confirmed": "Conferma", - "grants.reply.refused": "Rifiuta", - "grants.reply.submitReply": "Invia risposta", - "grants.reply.currentReply": "Risposta attuale: {reply}", - "grants.reply.sendingReply": "Invio della tua risposta!", - "grants.reply.replySentWithSuccess": - "Grazie! La tua risposta è stata correttamente salvata", - "grants.reply.messageDescription": `Se hai domande o hai bisogno di assistenza, non esitare a contattarci all'indirizzo email {grantsEmail}. - Per qualsiasi domanda riguardante la conferenza, aiuto con la richiesta di grant o informazioni generali, siamo qui per assisterti. - -Per le richieste di lettera d'invito per il visto, si prega gentilmente di visitare la nostra {visaPageLink} e di compilare il modulo.`, - "grants.reply.visaPageLink": "pagina Visto", - "schedule.invitation.sendingReply": "Caricamento in corso", - "schedule.invitation.replySentWithSuccess": - "Grazie! La tua risposta è stata salvata", - "schedule.invitation.currentReply": "Risposta attuale: {answer}", - "schedule.invitation.durationChanged": `⚠️ Purtroppo, a causa di vincoli di tempo, abbiamo dovuto modificare la durata della tua presentazione da {originalDuration} minuti a {duration} minuti. Ci scusiamo per l'inconveniente. -Se questo nuovo orario non dovesse andare bene per te, per favore non esitare a farcelo sapere qui sotto. Faremo del nostro meglio per soddisfare le tue esigenze, ma tieni presente che a causa dei limiti di programmazione, potremmo non essere in grado di soddisfare tutte le richieste. Nel raro evento in cui non riusciamo a trovare un'alternativa, potremmo dover annullare la tua presentazione.`, - - "schedule.addToCalendar": "Aggiungi i tuoi preferiti al tuo calendario", - - "orderReview.heading": "Recap ordine", - "orderReview.invoiceInformation": "Informazioni fatturazione", - "orderReview.isBusiness": "Aziendale?", - "orderReview.isBusiness.true": "Sì", - "orderReview.isBusiness.false": "No", - "orderReview.companyName": "Nome azienda", - "orderReview.name": "Nome completo", - "orderReview.vatId": "Partita IVA", - "orderReview.fiscalCode": "Codice fiscale", - "orderReview.address": "Indirizzo", - "orderReview.zipCode": "CAP", - "orderReview.country": "Nazione", - "orderReview.city": "Città", - "orderReview.tickets": "Biglietti", - "orderReview.attendeeName": "Nome partecipante", - "orderReview.attendeeEmail": "Email partecipante", - "orderReview.total": "Totale", - - "keynote.speakers": "Speakers", - "keynote.instagram": "Instagram", - "keynote.twitter": "Twitter", - "keynote.website": "Website", - "keynote.pronouns": "Pronomi", - "keynote.topic": "Topic", - "keynote.socialDescription": "Keynote di {speakersName}", - "keynote.backToKeynotes": "Torna ai keynotes", - "keynote.language": "Lingua", - "keynote.englishLanguage": "Inglese", - - "ranking.heading": "Risultati della votazione comunitaria", - "ranking.introduction.left": `Ecco quì i risultati della votazione comunitaria! 🎉{br} - Grazie a tutti coloro che hanno trovato il tempo per condividere le proprie preferenze - votando i talk. Il vostro impegno e i vostri contributi ci aiuteranno moltissimo nella - definizione del programma per la prossima edizione di PyCon Italia! 🙏 {br} - In totale quest'anno abbiamo ricevuto {proposalNumber} proposte da {speakersNumber} - persone che si sono proposte come speaker! - {br}{br} - La seguente classifica di talk è stata generata in maniera automatica, considerando - esclusivamente le preferenze espresse in fase di votazione comunitaria. Il punteggio - assegnato a ciascun talk è ottenuto dalla media dei voti ricevuti, normalizzata per - il “peso” di ciascun votante (proporzionale al numero di talk votati per ciascuna - track/topic). - `, - "ranking.introduction.right": ` - Nota: Gli esiti della votazione saranno considerati nella definizione del programma, - in quanto indicativi delle preferenze della comunità. Il comitato di programma si riserva - tuttavia il diritto di selezionare proposte considerando criteri aggiuntivi (quali ad - es. diversità di genere, argomenti, esperienza dello speaker, lingua del talk), al - fine di creare un programma equilibrato. - `, - "ranking.topicComment": - "Abbiamo ricevuto {value} proposte per la track {name} quest'anno!", - "ranking.seoTitle": "Ranking", - "ranking.details": "Dettagli", - "ranking.stats.heading": "Alcune statistiche", - "ranking.stats.submissions": "{value} proposte in totale", - "ranking.stats.speakers": "{value} persone si sono proposte come speaker", - "ranking.stats.gender.women": "{value} proposte da speaker donne", - "ranking.stats.gender.men": "{value} proposte da speaker uomini", - "ranking.stats.gender.other": - "{value} proposte da speaker di gender non specificato", - "ranking.stats.language.english": "{value} proposte in Italiano", - "ranking.stats.language.italian": "{value} proposte in Inglese", - "ranking.stats.submissionType": "{value} {name} proposti", - "ranking.stats.audienceLevel": "{value} proposte per livello {name}", - "ranking.stats.topic": "{value} proposte per la track {name}", - - "voteSelector.whatDoYouThink": "Cosa pensi di questa proposta?", - "voteSelector.notInterested": "Non mi interessa", - "voteSelector.maybe": "Forse", - "voteSelector.wantToSee": "Voglio vederlo", - "voteSelector.mustSee": "Devo vederlo", - - "voting.heading": "Votazione comunitaria", - "voting.proposals": "Proposte", - "voting.introduction": `Questa è la tua opportunità per aiutarci a dare forma al programma di PyCon Italia. -Il tuo voto ci aiuterà a creare un programma che più rispecchia ciò che la community vuole vedere.`, - "voting.introductionDeadline": "Hai tempo fino al {deadline} per votare!", - "voting.seoTitle": "Votazione", - "voting.topic": "Argomento", - "voting.tags": "Tags", - "voting.audienceLevel": "Livello audience", - "talk.audienceLevel": "Livello audience", - "voting.length": "Durata", - "voting.languages": "Lingue", - "voting.submissionType": "Categoria", - "voting.saving": "Attendi", - "voting.sendingVote": "Invio in corso", - "voting.voteSent": "Voto inviato!", - "voting.needToBeLoggedIn": "Esegui l'accesso o crea un account per votare", - "voting.errors.cannotVote.heading": "Ci dispiace, non puoi votare!", - "voting.errors.cannotVote.body": - "Controlla le nostre {linkVotingInfo} per votare e acquista il tuo biglietto {linkTicket} per partecipare a PyCon Italia", - "voting.errors.cannotVote.linkVotingInfo.text": "linee guida", - "voting.errors.cannotVote.linkTicket.text": "qui", - "voting.fullDetails": "Continua a leggere", - "voting.allTopics": "Tutti gli argomenti", - "voting.allLanguages": "Tutte le lingue", - "voting.allSubmissionTypes": "Tutte le categorie", - "voting.allAudienceLevels": "Tutti i livelli", - "voting.allSubmissions": "Votate & Non votate", - "voting.notVoted": "Non votate", - "voting.votedOnly": "Votate", - "voting.loading": "Caricamento in corso", - "voting.abstract": "Descrizione", - "voting.elevatorPitch": "Pitch", - "voting.notes": "Note", - "voting.tagsFilter": - "{numFilters, plural, =0 {Tutti i tags} one {1 Tag} other {{numFilters} Tags}}", - "voting.closed.heading": "Le votazioni sono terminate!", - "voting.closed.body": - "Grazie a tutte le persone che hanno votato e comprato un biglietto, seguiteci su {twitter} per aggiornamenti", - "unsubscribe.title": "Annulla l'iscrizione alla Newsletter", - "unsubscribe.button": "Annulla l'iscrizione", - "unsubscribe.succeed.title": "Grazie", - "unsubscribe.succeed.message": - "Sei stato correttamente disinscritto da questa newsletter.", - - "ticketsTable.name": "Nome", - "ticketsTable.price": "Prezzo", - "ticketsTable.from": "Dal", - "ticketsTable.until": "Fino al", - "ticketsTable.untilAndFromMobile": "Disponibile dal {from} al {until}", - "tickets.seeAllTickets": "Tutti i biglietti", - - "schedule.pageTitle": "Schedule {day}", - "schedule.loading": "Caricamento in corso...", - "schedule.backToSchedule": "Torna al programma", - - "jobboard.title": "Offerte di lavoro", - "jobboard.applyNow": "Candidati", - "jobboard.company": "Azienda", - "jobboard.role": "Ruolo", - "jobboard.discoverMore": "Scopri di più", - - "404.goToHomepage": "Homepage", - - "schedule.invitation.congratulations": - "Congratulazioni! La tua submission {submissionTitle} è stata accettata!", - "schedule.invitation.program": "Il tuo intervento è previsto il: {date}", - "schedule.invitation.date": - "{start} a {end}, con durata {duration} minuti.", - "schedule.invitation.confirmPresence": - "Per favore conferma la tua presenza il prima possibile. Richiedi un nuovo slot orario SOLTANTO se per te è impossibile tenere l'orario proposto.", - "schedule.invitation.presence.CONFIRM": "Lo slot orario va bene per me", - "schedule.invitation.presence.MAYBE": - "Lo slot orario va bene ma preferirei un altro", - "schedule.invitation.presence.REJECT": "Lo slot orario non va bene per me", - "schedule.invitation.presence.CANT_ATTEND": - "Non possono più partecipare a PyCon", - "schedule.invitation.presence.notes": - "Spiega qui i motivi per cui lo slot originale non va bene per te. Non possiamo accettare tutte le richieste e potremmo essere costretti a rimuovere il tuo intervento dallo schedule", - "schedule.invitation.submitAnswer": "Invia risposta", - "schedule.invitation.wait": "Caricamento in corso", - "schedule.invitation.sendingAnswer": "Caricamento in corso", - "schedule.invitation.answerSentWithSuccess": - "Grazie! La tua risposta è stata salvata", - "schedule.invitation.unableToFindInvitation": - "Impossibile salvare la tua risposta. Riprova tra qualche minuto o contattaci", - "schedule.invitation.invitationNotValid": - "Impossibile trovare questo invito", - "schedule.invitation.currentAnswer": "Risposta attuale: {answer}", - - "streaming.qa": "Invia domanda", - - "talk.bookToAttend": - "Questo evento ha una capacità limitata, è necessario prenotare un posto per partecipare.", - "talk.bookCta": "Prenota", - "talk.registerToWaitingList": - "Per registrarti nella lista d'attesa, clicca qui", - "talk.spacesLeft": "Posti rimanenti: {spacesLeft}", - "talk.spotReserved": "Sei registrato per questo evento!", - "talk.loginToBook": "Loggati per prenotare", - "talk.unregisterCta": "Cancella registrazione", - "talk.buyATicket": "Devi acquistare un biglietto per registrarti: {link}", - "talk.buyATicketCTA": "Biglietti", - "talk.eventIsFull": "Nessun posto rimasto", - "talk.speaker": "{count, plural, one {Speaker} other {Speaker}}", - "talk.language": "Lingua", - "talk.language.it": "Italiano", - "talk.language.en": "Inglese", - "talk.duration": "Durata", - - "submission.languageSwitch": - "Questa proposta è in più lingue, clicca qui per vederla in {language}", - - "scheduleEasy.title": "Titolo", - "scheduleEasy.day": "Giorno {day}", - "scheduleEasy.duration": "Durata", - "scheduleEasy.when": "Data/Orario", - "scheduleEasy.rooms": "Stanza/e", - "scheduleEasy.type": "Tipo", - "scheduleEasy.durationText": "{duration} minuti", - "scheduleEasy.language": "Lingua", - "scheduleEasy.requiresBooking": "🚨 Prenotazione richiesta", - "scheduleEasy.saveAsPdf": "Salva come pdf / stampa", - "scheduleEasy.bookingInstructions": - "Questo evento ha capacità limitata. Usa il link sotto per prenotarti.", - - "eventDetail.rooms": - "{countRooms, plural, =0 {Stanza} one {Stanza} other {Stanze}}", - - "react-intl-formatted-duration.longFormatting": "{minutes} {seconds}", - "react-intl-formatted-duration.duration": "{value} {unit}", - "react-intl-formatted-duration.timerFormatting": "{minutes}:{seconds}", - "react-intl-formatted-duration.daysUnit": - "{value, plural, one {giorno} other {giorni}}", - "react-intl-formatted-duration.hoursUnit": - "{value, plural, one {ora} other {ore}}", - "react-intl-formatted-duration.minutesUnit": - "{value, plural, one {minuto} other {minuti}}", - "react-intl-formatted-duration.secondsUnit": - "{value, plural, one {secondo} other {secondi}}", - - "multilingualinput.language.it": "Italiano", - "multilingualinput.language.en": "Inglese", - - "textarea.charsCount": "{length}/{maxLength}", - - "cfp.speakerBioLabel": "Biografia", - "cfp.speakerBioDescription": - "Una piccola descrizione su di te, visibile sulla pagina della tua proposal", - "cfp.speakerPhotoLabel": "Foto", - "cfp.speakerPhotoDescription": - "Questa foto sarà mostrata nella pagina della tua proposal e condivisa sui nostri social. Massimo 1MB.", - "cfp.speakerWebsiteLabel": "Sito web", - "cfp.speakerWebsiteDescription": - "Se hai un sito web personale puoi inserire l'indirizzo qui. Sarà pubblicato sulla pagina della tua proposal", - "cfp.socialsLabel": "Socials", - "cfp.speakerTwitterHandleDescription": - "Lascia qui i tuoi contatti e li useremo per taggarti sui social quando annunceremo la tua proposal!{br}{br}Twitter Handle", - "fileInput.placeholder": "Carica un file", - "fileInput.fileSize": "Dimensione massima 10MB", - "fileInput.uploadFailed": "Qualcosa è andato storto!", - "cfp.grantsLabel": "Hai bisogno di un grant?", - "cfp.speakerInstagramHandleDescription": "Instagram Handle", - "cfp.speakerLinkedinUrlDescription": "Profilo Linkedin URL", - "cfp.speakerFacebookUrlDescription": "Profilo Facebook URL", - "cfp.speakerMastodonHandleDescription": "Mastodon Handle", - "cfp.grantsCheckbox": - "Se hai bisogno di supporto finanziario da parte di PyCon Italia per partecipare, {grantsCta}! Invia subito la richiesta di grant, non aspettare l'esito della tua proposta. Non accetteremo richieste di grant dopo la deadline.", - - "cfp.grantsCta": - "clicca qui per aprire una pagina separata per inviarci una richiesta di grant", - - "fileInput.uploading": "Caricamento in corso...", - - "ticketsOverview.buyTicketsSection": "Compra i biglietti", - "ticketsOverview.ticket.student.title": "Studenti", - "ticketsOverview.ticket.student.description": - "Ti piacerebbe imparare Python? Non c'è niente di meglio che partecipare a PyCon Italia a un prezzo ridotto!", - "ticketsOverview.flatPrice": "Prezzo fisso", - - "ticketsOverview.ticket.personal.title": "Personale", - "ticketsOverview.ticket.personal.description": - "Non perderti più di 100 sessioni di interventi e tutorial!", - - "ticketsOverview.ticket.business.title": "Business", - "ticketsOverview.ticket.business.description": - "Aiuta il tuo team a migliorare le proprie competenze e scopri di più su Python e come integrarlo nei tuoi progetti!", - "ticketsOverview.buyTickets.cta": "Biglietti", - - "home.grants.title": "Grants", - "home.grants.description": - "Grazie ai nostri sponsors siamo lieti di mettere a disposizione di chi ne avesse bisogno un programma di supporto per chi vorrebbe essere presente a PyCon Italia ma per motivi economici non potrebbe riuscirci", - "home.grants.cta": "Invia richiesta", - - "login.redirectFromTicketsCheckout": - "Accedi o crea un account per completare l'acquisto", - "login.redirectFromCFP": - "Accedi o crea un account per inviare una proposal", - "login.redirectFromGrants": - "Accedi o crea un account per richiedere un grant", - "login.redirectFromSchedule": - "Accedi o crea un account per salvare i tuoi talk preferiti!", - - "tickets.checkout.voucher.placeholder": "Codice sconto", - "tickets.checkout.recap.price": "{price} (incl. {taxRate}% IVA)", - - "tickets.productsList.soldOut": "Sold-out", - "tickets.checkout.payWithCard": "Paga con carta", - "tickets.checkout.payWithBankTransfer": "Paga con bonifico", - "tickets.checkout.savedAmount": "Hai risparmiato {amount}", - - "scheduleEventDetail.sidebar.spacesLeft": "Posti liberi", - "scheduleEvent.soldout": "Sold-out", - - "tickets.checkout.voucher.fetching": "Verifica codice sconto...", - "tickets.checkout.voucher.noProductsAffected": "Nessun prodotto scontato", - "tickets.checkout.voucher": "Codice sconto", - "tickets.checkout.recap": "Riepilogo", - "tickets.checkout.title": "Checkout", - "tickets.title": "Biglietti", - - "tickets.productsList.joinPythonItalia": "Unisciti a noi", - "tickets.productsList.openDescription": "Scopri di più", - - "tickets.productsList.tshirtTitle": "T-shirt", - - "tickets.personal.title": "Personale", - "tickets.personal.description": - "Acquista il tuo biglietto per la conferenza o per i nostri eventi sociali. Utilizza questa sezione se intendi procedere all'acquisto senza necessità di fattura.", - "tickets.buyTicketsCta": "Compra biglietti", - - "tickets.business.title": "Business", - "tickets.business.description": - "Se intendi acquistare qualsiasi biglietto (conferenza, eventi sociali) e necessiti di fattura accedi a questa sezione per le tariffe dedicate alle Aziende/Liberi Professionisti.", - "tickets.buyTickets": "Acquista Biglietti", - - "tickets.checkout.billing": "Informazioni", - "tickets.checkout.orderCreationFailed": - "Qualcosa è andato storto!{br}Assicurati di aver compilato il form{br}o contattaci a help@pycon.it", - "tickets.checkout.voucher.notFound": "Codice sconto non trovato", - "tickets.checkoutBar.cta": "Checkout", - "tickets.checkout.openAnswerCard": "Dettagli Partecipante", - "tickets.checkout.answerCardAdmissionTitle": "Biglietto di {attendeeName}", - - "tickets.buyTicketsSubtitle": - "Acquista il tuo biglietto per la conferenza, eventi sociali etc..", - - "tickets.landing.title": "Cosa puoi comprare?", - "tickets.landing.ticketsCopy": `Biglietti per partecipare alla conferenza! PyCon Italia é un evento di 4 giorni dove ogni anno più di 600 persone si riuniscono per partecipare a più di 110+ sessioni (talks e workshops) ed eventi sociali dove puoi fare nuove amicizie e goderti la bellissima Firenze. -Affrettati a comprare il biglietto!`, - - "tickets.landing.membership.cta": "Unisciti a noi!", - - "tickets.landing.ticketsTitle": "Biglietti", - "tickets.landing.membershipTitle": "Associazione", - "blog.publishedOn": "{date} - {author}", - - "grants.form.yourGrant": "Grant", - "grants.form.youAndPython": "Tu e Python", - "grants.form.validationErrors": "Il form inviato non è valido", - - "input.placeholder": "Scrivi qui...", - - "ticketsOverview.ticket.personal.fareType": "Regular", - - "scheduleEventDetail.elevatorPitch": "Elevator pitch", - "scheduleEventDetail.abstract": "Descrizione", - "scheduleEventDetail.tags": "Tags", - "scheduleEventDetail.materials": "Materiali", - "scheduleEventDetail.materials.open": "Apri ({hostname})", - "scheduleEventDetail.materials.download": "Scarica ({mimeType})", - - "voting.speaker": "Speaker", - "voting.talks": "Talks", - "voting.workshops": "Workshops", - - "global.sessions": "Sessioni", - - "scheduleEventDetail.eventTime": "{start} - {end}", - "voting.minutes": "{type} ({duration} minuti)", - "voting.pagination": - "Pagina {currentPage} di {totalPages} ({totalItems, plural, one {1 item} other {{totalItems} items}})", - "homepage.followUs": "Seguici su", - - "homepage.sponsorsSectionText": - "PyCon Italia può essere la tua piattaforma per guadagnare riconoscibilità del tuo brand, acquisire nuovi clienti ed opportunità ed assumere personale da una platea di persone altamente qualificate!", - "homepage.sponsorsSectionCTAText": "Diventa sponsor", - - "scheduleView.allRooms": "Tutte le stanze", - "schedule.time": "{start} - {end}", - "schedule.timeNoEnd": "{start}", - "schedule.mySchedule": "Il mio programma", - "schedule.fullSchedule": "Programma completo", - "schedule.live": "Live", - "schedule.invitation.notes.placeholder": "Scrivi qui...", - "schedule.workshop.limitedSeats": "Spazi limitati! Prenota il tuo posto.", - "schedule.workshop.soldout": "Workshop pieno!", - - "profile.welcome": "Ciao {name}!", - "profile.myProfile": "Il mio profilo", - "profile.myProposals": "Le mie proposte", - - "profile.myGrant": "Il mio grant", - "profile.myGrant.nextSteps": "I prossimi passi", - "profile.myGrant.grantType": "Tipo di Grant", - "profile.myGrant.appliedFor": "Richiesto", - "profile.myGrant.appliedFor.ticket": "Biglietto", - "profile.myGrant.appliedFor.travel": "Viaggio", - "profile.myGrant.appliedFor.accommodation": "Alloggio", - "profile.myGrant.edit": "Modifica", - "profile.myGrant.editInfo": - "Assicurati che tutte le informazioni fornite siano corrette. Hai tempo fino al {editDeadline} per modificare il tuo grant.", - "profile.myGrant.manage": "Gestisci", - "profile.myGrant.manage.warning": `Se per qualsiasi motivo non puoi più partecipare alla conferenza, ti preghiamo di comunicarcelo al più presto cliccando sul pulsante 'Gestisci' per rifiutare il grant. - -Il mancato avviso potrebbe influire sulla tua idoneità a ricevere supporto finanziario per eventi futuri.`, - "profile.myGrant.status": "Stato", - "profile.myGrant.status.pending": "In attesa", - "profile.myGrant.status.pending.nextSteps": - "La tua domanda è in fase di revisione. Non è richiesta alcuna azione in questo momento.", - "profile.myGrant.status.rejected": "Respinto", - "profile.myGrant.status.rejected.nextSteps": - "Purtroppo, a causa di fondi limitati e del grande numero di richieste, la tua richiesta di grant non è stata approvata.", - "profile.myGrant.status.approved": "Approvato", - "profile.myGrant.status.approved.nextSteps": - "La tua richiesta di grant è stata approvata! Ti invieremo un'email molto presto con ulteriori istruzioni.", - "profile.myGrant.status.waiting_list": "Lista d'attesa", - "profile.myGrant.status.waiting_list.nextSteps": - "Sei in lista d'attesa. Ti informeremo non appena potremo accettare il tuo grant.", - "profile.myGrant.status.waiting_list_maybe": "Lista d'attesa", - "profile.myGrant.status.waiting_list_maybe.nextSteps": - "Sei in lista d'attesa. Ti informeremo non appena potremo accettare il tuo grant.", - "profile.myGrant.status.waiting_for_confirmation": "Da confermare", - "profile.myGrant.status.waiting_for_confirmation.nextSteps": `Congratulazioni, la tua richiesta di grant è stata approvata! - -Usa il pulsante 'Gestisci' nella pagina per confermare o rifiutare il grant. Hai tempo fino al {replyDeadline} per confermare o rifiutare il grant, dopodiché il tuo grant sarà automaticamente revocato.`, - "profile.myGrant.status.refused": "Rifiutato", - "profile.myGrant.status.refused.nextSteps": - "Hai rifiutato l'offerta di grant. Se si tratta di un errore, contattaci immediatamente.", - "profile.myGrant.status.confirmed": "Confermato", - "profile.myGrant.status.confirmed.nextSteps": - "Grazie per aver confermato il tuo grant. Non vediamo l'ora di vederti alla conferenza! Ti invieremo a breve il voucher per il biglietto, tieni controllata la tua email", - "profile.myGrant.status.did_not_attend": "Non ha partecipato", - "profile.myGrant.status.did_not_attend.nextSteps": - "Non hai partecipato alla conferenza.", - "profile.myGrant.noGrant.heading": "Non hai richiesto un grant", - "profile.myGrant.noGrant.body.deadlineNull": - "Visita la nostra pagina informativa per ulteriori dettagli.", - "profile.myGrant.noGrant.body.canSubmit": - "Se ti trovi in difficoltà economica e desideri partecipare a PyCon Italia, il nostro modulo per la richiesta di grant è al momento aperto.", - "profile.myGrant.noGrant.submitGrant": "Scopri di più", - "profile.myGrant.noGrant.body.closed": - "Il form per la richiesta di grant è al momento chiuso. Purtroppo non possiamo accettare nuove richieste dopo la scadenza.", - "profile.myGrant.noGrant.body.openingSoon": - "Il form per la richiesta del grant aprirà presto! Visita la nostra pagina informativa per ulteriori dettagli.", - "profile.myGrant.infoLink.text": - "Se hai domande o dubbi sul programma di supporto, consulta la nostra pagina informativa:", - "profile.editProfile.generalInformation": "Informazioni generali", - "profile.editProfile.emailPreferences": "Preferenze Email", - "profile.tickets.attendeeName": "Nome partecipante", - "profile.tickets.tagline": "Tagline", - - "profile.tickets.save": "Salva", - - "profile.tickets.noAnswer": "Nessuna risposta", - "profile.tickets.cancel": "Chiudi", - "profile.ticketsEdit.modalTitle": "Personalizza biglietto", - "profile.ticketsEdit.reassignTicket": "Assegna biglietto", - "profile.ticketsEdit.reassignTicketHeading": - "Comprato questo ticket per un'altra persona? Assegna il biglietto a loro!", - "profile.ticketsEdit.reassignTicketDescription": - "Dovranno creare un account per poter accedere al loro biglietto.", - "orderQuestions.emailsDontMatch": "Assicurati siano la stessa email", - - "profile.myTickets.noTickets.heading": "Non hai comprato nessun biglietto!", - "profile.myTickets.noTickets.body": - "Il tuo biglietto è stato comprato da un'altra persona? Chiedigli di assegnarlo alla tua email ({email}) per poterlo vedere qui, personalizzarlo e prenotare workshops!", - "profile.myTickets.buyTickets": "Compra biglietto", - - "profile.editProfile.emailInfo": - "La tua email è: {email}. Vuoi cambiarla? Contattaci a {contact}", - - "profile.myProposals.status.proposed": "Proposta", - "profile.myProposals.status.accepted": "Accettata", - "profile.myProposals.status.canceled": "Cancellata", - "profile.myProposals.status.waiting": "Da confermare", - "profile.myProposals.status.confirmed": "Confermato", - "profile.myProposals.status.speakerRejected": "Rifiutato", - "profile.myProposals.status.speakerCantAttend": "Cancellato", - "profile.myProposals.status.maybe": "Rifiutato", - "profile.myProposals.status.waiting_list": "Lista d'attesa", - - "404.message": "La pagina che stavi cercando non esiste", - - "profile.myProposals.date": "{day} {start} - {end}", - "profile.myProposals.viewInvitation": "Invito", - "profile.myProposals.edit": "Modifica", - - "profile.myProposals.noProposals.heading": - "Non hai inviato nessuna proposal", - "profile.myProposals.noProposals.body.canSubmit": - "La nostra call for proposals è aperta! Invia la tua proposta oggi!", - "profile.myProposals.noProposals.submitProposal": "Call for proposals", - - "profile.myProposals.noProposals.body.closed": - "Sfortunatamente la nostra Call for proposals è chiusa, ma puoi comunque unirti a noi comprando un biglietto!", - - "profile.myProposals.noProposals.body.openingSoon": - "La nostra call for proposal aprirà presto! Dai uno sguardo alla pagina CFP per saperne di più!", - - "profile.myOrders.orderStatus.pending": "Pending", - "profile.myOrders.orderStatus.paid": "Pagato", - "profile.myOrders.orderStatus.canceled": "Cancellato", - "profile.myOrders.orderStatus.expired": "Scaduto", - "profile.myOrders.open": "Apri", - - "profile.myProposals.noOrders.heading": "Non hai nessun ordine", - "profile.myProposals.noOrders.body": - "Compra il tuo biglietto, t-shirt e tanto altro sulla nostra pagina biglietti ed unisciti a noi!", - "profile.logout.title": "Logout", - "profile.logout.body": "{name}, vuoi sloggarti?", - "input.selectCountryPlaceholder": "Seleziona...", - "schedule.entry.endsAt": "Finisce alle {time}", - - "profile.dashboard.title": "Dashboard", - "profile.myOrders.title": "I miei ordini", - "profile.myProposals.title": "Le mie proposte", - "profile.myTickets.title": "I miei biglietti", - "profile.myWorkshops.title": "I miei workshop", - "profile.myWorkshops": "I miei workshop", - "profile.myWorkshops.noWorkshops.heading": - "Non hai ancora prenotato nessun workshop", - "profile.myWorkshops.noWorkshops.body": - "Sfoglia il programma e prenota un posto per i workshop con posti limitati.", - "profile.myWorkshops.browseSchedule": "Vai al programma", - "profile.myWorkshops.viewWorkshop": "Vedi workshop", - "profile.myWorkshops.room": "Sala: {room}", - - "homepage.eventPreviewCard.time": "{start} - {end}", - "homepage.schedulePreviewSection.goToSchedule": "Apri Programma", - "homepage.sponsors": "Sponsors", - - "tickets.productsList.socialEventsTitle": "Eventi sociali", - "tickets.landing.socialEvents.copy": - "PyCon Italia è molto di più di una semplice conferenza! PyDrinks e PyDinner sono i nostri due eventi social principali, dove puoi socializzare e conoscere nuove persone!", - - "tickets.landing.socialEvents.title": "Eventi sociali", - "signup.alreadyHaveAccount.login": "Accedi", - "signup.existingAccount": "Email già registrata", - "login.wrongCredentials": "Email/password sbagliata", - - "requestResetPassword.backToLogin": "Torna al {loginLink}", - "requestResetPassword.backToLogin.login": "Login", - "resetPassword.title": "Recupera password", - "specialGuest.title": "Unisciti a noi per un Q&A speciale!", - "requestResetPassword.title": "Recupera password", - "requestResetPassword.button": "Invia", - "requestResetPasswordSuccess.title": "Richiesta ricevuta", - "requestResetPasswordSuccess.heading": "Richiesta ricevuta", - "requestResetPasswordSuccess.subheading": "Controlla le tue emails", - "requestResetPasswordSuccess.body": - "Se non vedi una email da noi prova ad aspettare un paio di minuti e controlla la tua cartella spam. Se non trovi nessuna email dopo 5 minuti, prova a richiedere una nuova email.", - "resetPassword.confirmNewPassword": "Conferma password", - "resetPassword.changeYourPassword.body": - "Usa una password che non hai mai usato su nessun sito web, ed assicurati che sia sicura creando una password di almeno 8 caratteri!", - "resetPasswordSuccess.title": "Password cambiata", - "resetPasswordSuccess.heading": "Password cambiata!", - "resetPasswordSuccess.subheading": - "La tua password è stata cambiata con successo!", - "resetPasswordSuccess.body": - "Torna alla pagina di login per accedere con la tua nuova password.", - - "footer.stayTuned": "Resta aggiornato!", - "footer.subscribeToNewsletter": "Iscriviti alla newsletter", - - "scheduleView.filter.search": "Ricerca", - "scheduleView.filter.byAudience": "Per Audience", - "scheduleView.filter.byLanguage": "Per Lingua", - "scheduleView.filter.byType": "Per Tipologia", - "scheduleView.filter.byStarred": "Per preferiti", - - "scheduleView.filter.starred": "Salvato", - "scheduleView.filter.notStarred": "Non salvato", - - "global.italian": "Italiano", - "global.english": "Inglese", - "global.all": "Tutti", - - "schedule.room": "Stanza", - - "schedule.listView": "Vista lista", - "schedule.gridView": "Vista griglia", - - "addScheduleToCalendarModal.title": "Aggiungi al calendario", - "addScheduleToCalendarModal.loginRequired": - "Devi effettuare il login per aggiungere talk/workshop ai preferiti ed inserirli nel tuo calendario.", - "addScheduleToCalendarModal.steps": - "Segna i talk o workshop che non vuoi perderti come preferiti ed inseriscili nel tuo calendario! Copia il link qui sotto e aggiungilo alla tua app del calendario.", - "addScheduleToCalendarModal.info": - "A seconda dell'app del calendario, le modifiche potrebbero richiedere alcune ore per essere visualizzate. Puoi rimuovere e aggiungere nuovamente il calendario per forzare un aggiornamento.", - - "tickets.productsList.guidedToursTitle": "Tour Guidati", - - "profile.tickets.noDetails": "Divertiti! 🍻", - - "profile.edit.success": "Profilo aggiornato!", - - "profile.publicProfile.heading": "Profilo pubblico", - "profile.publicProfile.description": - "Questo è il tuo profilo pubblico. Potrebbe essere visibile come parte del tuo profilo speaker o quando qualcuno scansiona il codice QR del tuo badge. Ti invitiamo a non inserire informazioni private o dati che non vuoi rendere pubblici.", - - "profile.publicProfile.yourPhoto": "La tua foto", - "profile.publicProfile.yourPhoto.description": - "Personalizza il tuo profilo", - "profile.publicProfile.yourBio": "La tua bio", - "profile.publicProfile.yourBio.description": - "Scrivi qualcosa su di te: i tuoi interessi, il tuo lavoro attuale e cosi via!", - "profile.publicProfile.yourSocials": "I tuoi social", - "profile.publicProfile.website.description": - "L'URL del tuo sito web (es., https://example.com)", - "profile.publicProfile.mastodon.description": - "Il tuo handle Mastodon (es., utente@mastodon.social)", - "profile.publicProfile.instagram.description": - "Il tuo handle Instagram senza @ (es., pycon.it)", - "profile.publicProfile.linkedin.description": - "L'URL del tuo profilo LinkedIn (es., https://www.linkedin.com/in/il-tuo-profilo)", - "profile.publicProfile.facebook.description": - "L'URL del tuo profilo Facebook (es., https://www.facebook.com/pythonitalia)", - "profile.publicProfile.twitter.description": - "Il tuo handle Twitter senza @ (es., pyconit)", - "profile.ticketsEdit.qrCodeDescription": - "Il QR Code porta al tuo profilo e può essere utilizzato per condividere rapidamente i tuoi contatti con altri partecipanti o sponsors!", - "profile.ticketsEdit.editProfile": - "Clicca qui per attivare e personalizzare il tuo profilo.", - - "profile.tickets.ticketReassigned": - 'Questo biglietto è assegnato a {to}. Email sbagliata? Puoi riassegnarla all\'interno di "I miei ordini"', - "tickets.buyNow": "Compra ora", - - "checkout.billing.businessInvoice": "Hai bisogno di fattura?", - "checkout.billing.businessInvoice.description": - "Attiva questa opzione se hai la necessità di fattura", - "streaming.roomName": "Stanza {name}", - "streaming.eventName": "In corso: {name}", - "streaming.noStreaming": - "La conferenza non è attualmente live, perchè non dai uno sguardo al nostro canale YouTube?", - "header.streaming": "Guarda live", - "profile.myProposals.viewIn": "Preview in {language}", - - "voting.filter.byTag": "Per Tags", - - "global.acceptPrivacyPolicy": - "Ho letto e compreso l'Informativa sulla {link} di Python Italia APS.", - "grants.form.privacyPolicyHeading": - "È importante che tutti coloro che si registrano all'evento leggano l'Elaborazione dei Dati Personali ({link}) da parte dell'organizzatore italiano Python Italia APS e autorizzino il trattamento dei loro dati personali per consentire la raccolta delle registrazioni e l'organizzazione dell'evento.", - - "productQuestions.thisIsMyTicket": "Questo biglietto è mio", - - "modal.cancel": "Chiudi", - "sponsorLeadModal.submit": "Invia", - "sponsorLeadModal.company": "Azienda", - "sponsorLeadModal.completed": - "Grazie! Abbiamo appena inviato la brochure via email. Se non riesci a trovarla, controlla lo spam o contattaci a sponsor@pycon.it!", - "sponsorLeadModal.body": `I nostri pacchetti ti danno un'idea di ciò che offriamo e di come puoi ottimizzare la tua presenza a PyCon Italia, ma non sono definitivi! - -Mettiamoci in contatto per trovare la soluzione migliore per le esigenze della tua azienda!`, - "sponsorLeadModal.acceptPrivacyPolicy.heading": "Privacy Policy", - "sponsorLeadModal.title": "Scarica brochure", - - "sponsorLeadModal.consentToContactViaEmail.heading": "Contattami via email", - "sponsorLeadModal.consentToContactViaEmail.body": - "Do il mio permesso per ricevere comunicazioni via email per discutere opportunità di sponsorizzazione.", - - "orderQuestions.attendeeGivenName": "Nome partecipante", - "orderQuestions.attendeeGivenName.placeholder": "Il tuo nome, e.g. Ada", - "orderQuestions.attendeeFamilyName": "Cognome partecipante", - "orderQuestions.attendeeFamilyName.placeholder": - "Il tuo cognome, e.g. Lovelace", - - "cfp.availability.title": "Disponibilità", - "cfp.availability.description": - "Aiuta il nostro comitato di programma facendoci sapere la tua disponibilità durante la conferenza. Se la tua proposta verrà accettata, useremo queste informazioni per programmare il tuo intervento in un momento che ti sia comodo. Tutti gli orari sono nel fuso orario della conferenza.", - "cfp.availability.explanation": `✔️ Preferito ❌ Non disponibile -Clicca sulla casella per cambiare. Se lasciato vuoto, presumeremo che tu sia disponibile.`, - "cfp.availability.table.morning": "Mattina", - "cfp.availability.table.morning.range": "(11:00 - 13:00)", - "cfp.availability.table.afternoon": "Pomeriggio", - "cfp.availability.table.afternoon.range": "(15:00 - 18:00)", - - "tickets.description": - "Offriamo sconti per gruppi da 6 persone in su, contattaci per saperne di più. Dopo aver acquistato i tuoi biglietti, potrai accedere alla {page} con i nostri codici sconto.", - "tickets.description.page": "pagina hotels", - - "requestInvitationLetter.pageTitle": "Richiedi una lettera d'invito", - "requestInvitationLetter.heading": "Richiedi una lettera d'invito", - "invitationLetterForm.noAdmissionTicket": - "È necessario acquistare un biglietto per richiedere una lettera d'invito.", - "invitationLetterForm.title": "Lettera d'invito", - "invitationLetterForm.onBehalfOf.title": "Per conto di", - "invitationLetterForm.onBehalfOf.description": - "Si prega di richiedere un invito per conto di qualcun altro solo se non sono in grado di creare un proprio account. Sarà necessaria una verifica aggiuntiva.", - "invitationLetterForm.onBehalfOf.value.self": "Per me", - "invitationLetterForm.onBehalfOf.value.other": "Qualcun altro", - "invitationLetterForm.email.title": "Email", - "invitationLetterForm.email.description": - "L'indirizzo email della persona che necessita della lettera d'invito.", - "invitationLetterForm.fullName.title": "Nome completo", - "invitationLetterForm.fullName.description": - "Il nome completo come appare nei documenti ufficiali.", - "invitationLetterForm.nationality.title": "Nazionalità", - "invitationLetterForm.nationality.description": - "Nazionalità come specificata nel passaporto.", - "invitationLetterForm.dateOfBirth.title": "Data di nascita", - "invitationLetterForm.dateOfBirth.description": - "La data di nascita della persona che necessita della lettera d'invito.", - "invitationLetterForm.address.title": "Indirizzo", - "invitationLetterForm.address.description": "L'indirizzo di residenza.", - "invitationLetterForm.passportNumber.title": "Numero di passaporto", - "invitationLetterForm.passportNumber.description": - "Il numero di passaporto della persona che necessita della lettera d'invito.", - "invitationLetterForm.embassyName.title": "Nome dell'ambasciata", - "invitationLetterForm.embassyName.description": - "Il nome dell'ambasciata che riceverà la lettera d'invito.", - "invitationLetterForm.requestAlreadySent": - "Hai già richiesto una lettera di invito!", - "invitationLetterForm.requestStatus.pending": - "Stiamo elaborando la tua richiesta. Ti contatteremo se avremo bisogno di ulteriori informazioni. Se pensi di aver inserito informazioni errate, contattaci (senza condividere dettagli sensibili) e riapriremo il modulo.", - "invitationLetterForm.requestStatus.sent": - "La lettera di invito è stata inviata al tuo indirizzo email. Se hai bisogno di apportare modifiche, contattaci (senza condividere dettagli sensibili).", - "invitationLetterForm.requestStatus.rejected": - "Siamo spiacenti, ma non possiamo emettere una lettera di invito. Contattaci per maggiori informazioni.", - "invitationLetterForm.errors.generic": - "Verifica che il form sia compilato correttamente e riprova.", - "invitationLetterForm.requestSubmitted": "Richiesta inviata!", - "requestInvitationLetter.formOpeningSoon": - "Il form aprirà il {date}. Segui i nostri socials per aggiornamenti e cambiamenti.", - "requestInvitationLetter.formClosed": - "Il form è chiuso. Se hai domande, contattaci.", - - "voting.filterBy": "Filtra per", - "voting.all": "Tutti", - - "cfp.materials.title": "Materiali", - "cfp.materials.description": - "Usa questa sezione per caricare i materiali che vuoi condividere con altri partecipanti. Sono consentiti fino a 3 file/URL.", - "cfp.materials.addFile": "File", - "cfp.materials.addURL": "URL", - "cfp.materials.add": "Aggiungi", - "cfp.materials.remove": "X", - "fileInput.currentFile": "File attuale: {name}", - - "cfp.doNotRecordLabel": "Non registrare", - "cfp.doNotRecordDescription": - "Di norma registriamo tutti i talk e li pubblichiamo successivamente sul nostro canale YouTube. Se non desideri che il tuo intervento venga registrato, seleziona questa opzione. Nota: il talk sarà comunque trasmesso in streaming.", - "cfp.doNotRecordCheckboxLabel": - "Confermo di non voler che il mio talk venga registrato. Comprendo che non verrà caricato sul canale YouTube di Python Italia e che non sarà possibile recuperarlo in futuro.", - - "errorPage.title": "Qualcosa è andato storto", - "errorPage.body": - "Si è verificato un errore inaspettato. Se continua a succedere, {reportLink}! Nel frattempo, ecco Ernesto che pensa alla pizza con l'ananas 🍕", - "errorPage.reportLink": "segnala il problema", - }, }; messages.default = messages.en; diff --git a/frontend/src/locale/languages.ts b/frontend/src/locale/languages.ts index 02eb7af49d..edd13c6b35 100644 --- a/frontend/src/locale/languages.ts +++ b/frontend/src/locale/languages.ts @@ -1,4 +1,3 @@ export const DEFAULT_LOCALE = "en" as const; -export const VALID_LOCALES = [DEFAULT_LOCALE, "it"] as const; -export type Language = (typeof VALID_LOCALES)[number]; +export type Language = typeof DEFAULT_LOCALE; diff --git a/frontend/src/middleware.ts b/frontend/src/middleware.ts index d51f4c3511..503378a1cc 100644 --- a/frontend/src/middleware.ts +++ b/frontend/src/middleware.ts @@ -3,44 +3,14 @@ import { isToday } from "date-fns"; import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; -import { DEFAULT_LOCALE, VALID_LOCALES } from "~/locale/languages"; - import { getApolloClient } from "./apollo/client"; import { queryScheduleDays } from "./types"; -const PUBLIC_FILE = /\.(.*)$/; const LOGIN_REDIRECT_URL = ["/cfp", "/grants", "/voting"]; -const handleLocale = (req: NextRequest) => { - const locale = getLocale( - req.cookies.has("pyconLocale") - ? req.cookies.get("pyconLocale")!.value - : null, - ); - - const url = req.nextUrl.clone(); - url.pathname = `${locale}${url.pathname}`; - - return NextResponse.redirect(url); -}; - export async function middleware(req: NextRequest) { const isLoggedIn = req.cookies.has("pythonitalia_sessionid"); - const shouldHandleLocale = - !PUBLIC_FILE.test(req.nextUrl.pathname) && - !req.nextUrl.pathname.includes("/api/") && - !req.nextUrl.pathname.includes("/admin") && - !req.nextUrl.pathname.includes("/local_files_upload") && - !req.nextUrl.pathname.includes("/media") && - !req.nextUrl.pathname.includes("/graphql") && - !req.nextUrl.pathname.includes("/_next/image") && - req.nextUrl.locale === "default"; - - if (shouldHandleLocale) { - return handleLocale(req); - } - if (LOGIN_REDIRECT_URL.includes(req.nextUrl.pathname) && !isLoggedIn) { const url = req.nextUrl.clone(); url.search = `?next=${req.nextUrl.pathname}`; @@ -70,14 +40,6 @@ export async function middleware(req: NextRequest) { return NextResponse.next(); } -const getLocale = (cookie: string): string => { - if (cookie && VALID_LOCALES.findIndex((e) => e === cookie) !== -1) { - return cookie; - } - - return DEFAULT_LOCALE; -}; - export const config = { matcher: "/:path*", }; diff --git a/frontend/src/pages/[slug]/index.tsx b/frontend/src/pages/[slug]/index.tsx index 0cc691bb12..d623124ae4 100644 --- a/frontend/src/pages/[slug]/index.tsx +++ b/frontend/src/pages/[slug]/index.tsx @@ -5,6 +5,7 @@ import { useRouter } from "next/router"; import { getApolloClient } from "~/apollo/client"; import { PageHandler } from "~/components/page-handler"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryAllPages } from "~/types"; export const FrontendPage = ({ blocksProps, isPreview, previewData }) => { @@ -24,38 +25,18 @@ export { getStaticProps } from "~/components/page-handler/page-static-props"; export const getStaticPaths: GetStaticPaths = async () => { const client = getApolloClient(); - const [ - { - data: { cmsPages: italianPages }, + const { + data: { cmsPages }, + } = await queryAllPages(client, { + hostname: process.env.cmsHostname, + language: DEFAULT_LOCALE, + }); + + const paths = cmsPages.map((page) => ({ + params: { + slug: page.slug, }, - { - data: { cmsPages: englishPages }, - }, - ] = await Promise.all([ - queryAllPages(client, { - hostname: process.env.cmsHostname, - language: "it", - }), - queryAllPages(client, { - hostname: process.env.cmsHostname, - language: "en", - }), - ]); - - const paths = [ - ...italianPages.map((page) => ({ - params: { - slug: page.slug, - }, - locale: "it", - })), - ...englishPages.map((page) => ({ - params: { - slug: page.slug, - }, - locale: "en", - })), - ]; + })); return { paths, diff --git a/frontend/src/pages/_app.tsx b/frontend/src/pages/_app.tsx index 100dc9bb29..12243f047e 100644 --- a/frontend/src/pages/_app.tsx +++ b/frontend/src/pages/_app.tsx @@ -18,12 +18,23 @@ import { ModalStateContext, } from "~/components/modal/context"; import messages from "~/locale"; -import { LocaleProvider, useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import "../global.css"; const intlCache = createIntlCache(); +const intl = createIntl( + { + locale: DEFAULT_LOCALE, + messages: { + ...messages[DEFAULT_LOCALE], + ...getMessagesForLocale(DEFAULT_LOCALE), + }, + }, + intlCache, +); + const MyApp = (props) => { const { Component, pageProps, router, err } = props; const [modalData, setCurrentModalData] = useState<{ @@ -31,7 +42,6 @@ const MyApp = (props) => { props?: ModalProps[keyof ModalProps]; }>({ modalId: null }); const apolloClient = getApolloClient(props.pageProps[APOLLO_STATE_PROP_NAME]); - const locale = useCurrentLanguage(); const setCurrentModal = ( modalId: T, @@ -58,17 +68,6 @@ const MyApp = (props) => { [modalData, setCurrentModal], ); - const intl = createIntl( - { - locale, - messages: { - ...messages[locale], - ...getMessagesForLocale(locale), - }, - }, - intlCache, - ); - if (router.pathname === "/badge") { return (
@@ -79,24 +78,22 @@ const MyApp = (props) => { return ( - - -
- - -
+ +
+ + +
-
- - - -
+
+ + + +
-
- - -
- +
+ + +
); diff --git a/frontend/src/pages/_error.tsx b/frontend/src/pages/_error.tsx index 222a6e416b..628f389eec 100644 --- a/frontend/src/pages/_error.tsx +++ b/frontend/src/pages/_error.tsx @@ -7,6 +7,7 @@ import { FormattedMessage } from "react-intl"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; const ErrorPage = ({ statusCode }) => ( @@ -35,10 +36,10 @@ const ErrorPage = ({ statusCode }) => ( ); -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await Promise.all([prefetchSharedQueries(client, locale)]); + await Promise.all([prefetchSharedQueries(client, DEFAULT_LOCALE)]); return addApolloState(client, { props: {}, @@ -46,11 +47,8 @@ export const getStaticProps: GetStaticProps = async ({ locale }) => { }; export const getInitialProps = async (contextData) => { - // In case this is running in a serverless function, await this in order to give Sentry - // time to send the error before the lambda exits await Sentry.captureUnderscoreErrorException(contextData); - // This will contain the status code of the response return NextErrorComponent.getInitialProps(contextData); }; diff --git a/frontend/src/pages/api/[lang]/event/[slug]/social-card.tsx b/frontend/src/pages/api/event/[slug]/social-card.tsx similarity index 95% rename from frontend/src/pages/api/[lang]/event/[slug]/social-card.tsx rename to frontend/src/pages/api/event/[slug]/social-card.tsx index 9d378ea7f6..a512e1bea9 100644 --- a/frontend/src/pages/api/[lang]/event/[slug]/social-card.tsx +++ b/frontend/src/pages/api/event/[slug]/social-card.tsx @@ -4,6 +4,7 @@ import type { NextRequest } from "next/server"; import { createClient } from "~/apollo/create-client"; import { TitleSubtitleCard } from "~/components/social-card-images/title-subtitle-card"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryTalk } from "~/types"; export const config = { @@ -28,7 +29,6 @@ export const handler = async (req: NextRequest) => { const client = createClient(); const { searchParams } = new URL(req.url); - const language = searchParams.get("lang"); const slug = searchParams.get("slug"); const [ @@ -42,7 +42,7 @@ export const handler = async (req: NextRequest) => { semiBoldFont, queryTalk(client, { slug, - language, + language: DEFAULT_LOCALE, code: process.env.conferenceCode, }), ]); diff --git a/frontend/src/pages/api/[lang]/keynotes/[slug]/social-card.tsx b/frontend/src/pages/api/keynotes/[slug]/social-card.tsx similarity index 95% rename from frontend/src/pages/api/[lang]/keynotes/[slug]/social-card.tsx rename to frontend/src/pages/api/keynotes/[slug]/social-card.tsx index 6402b61316..808caa9599 100644 --- a/frontend/src/pages/api/[lang]/keynotes/[slug]/social-card.tsx +++ b/frontend/src/pages/api/keynotes/[slug]/social-card.tsx @@ -4,6 +4,7 @@ import type { NextRequest } from "next/server"; import { createClient } from "~/apollo/create-client"; import { TitleSubtitleCard } from "~/components/social-card-images/title-subtitle-card"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryTalk } from "~/types"; export const config = { @@ -32,14 +33,13 @@ export const handler = async (req: NextRequest) => { const client = createClient(); const { searchParams } = new URL(req.url); - const language = searchParams.get("lang"); const slug = searchParams.get("slug"); const { data: { conference }, } = await queryTalk(client, { slug, - language, + language: DEFAULT_LOCALE, code: process.env.conferenceCode, }); const talk = conference?.talk; diff --git a/frontend/src/pages/api/[lang]/news/[slug]/social-card.tsx b/frontend/src/pages/api/news/[slug]/social-card.tsx similarity index 95% rename from frontend/src/pages/api/[lang]/news/[slug]/social-card.tsx rename to frontend/src/pages/api/news/[slug]/social-card.tsx index 392208dff1..9fdc6d7924 100644 --- a/frontend/src/pages/api/[lang]/news/[slug]/social-card.tsx +++ b/frontend/src/pages/api/news/[slug]/social-card.tsx @@ -4,6 +4,7 @@ import type { NextRequest } from "next/server"; import { createClient } from "~/apollo/create-client"; import { TitleSubtitleCard } from "~/components/social-card-images/title-subtitle-card"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryNewsArticle } from "~/types"; export const config = { @@ -28,7 +29,6 @@ const handler = async (req: NextRequest) => { const client = createClient(); const { searchParams } = new URL(req.url); - const language = searchParams.get("lang"); const slug = searchParams.get("slug"); const [ @@ -42,7 +42,7 @@ const handler = async (req: NextRequest) => { semiBoldFont, queryNewsArticle(client, { slug, - language, + language: DEFAULT_LOCALE, hostname: process.env.cmsHostname, }), ]); diff --git a/frontend/src/pages/api/[lang]/social-card.tsx b/frontend/src/pages/api/social-card.tsx similarity index 91% rename from frontend/src/pages/api/[lang]/social-card.tsx rename to frontend/src/pages/api/social-card.tsx index b317ec7e32..e53bf64437 100644 --- a/frontend/src/pages/api/[lang]/social-card.tsx +++ b/frontend/src/pages/api/social-card.tsx @@ -4,7 +4,7 @@ import type { NextRequest } from "next/server"; import { createClient } from "~/apollo/create-client"; import { Logo } from "~/components/logo"; -import type { Language } from "~/locale/languages"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { querySocialCard } from "~/types"; export const config = { @@ -13,17 +13,16 @@ export const config = { }; const getDays = ({ start, end }: { start: string; end: string }) => { - // assuming the same month const startDate = new Date(start); const endDate = new Date(end); return `${startDate.getUTCDate()} - ${endDate.getUTCDate()}`; }; -const getMonth = ({ end }: { end: string }, language: Language) => { +const getMonth = ({ end }: { end: string }) => { const endDate = new Date(end); - const formatter = new Intl.DateTimeFormat(language, { + const formatter = new Intl.DateTimeFormat(DEFAULT_LOCALE, { month: "long", }); @@ -62,9 +61,6 @@ const handler = async (req: NextRequest) => { const { data } = await querySocialCard(client, { code: process.env.conferenceCode, }); - const { searchParams } = new URL(req.url); - - const language = searchParams.get("lang") as Language; return new ImageResponse(
{ textTransform: "uppercase", }} > - {getMonth(data.conference, language)} {getYear(data.conference)} + {getMonth(data.conference)} {getYear(data.conference)}
{ @@ -55,16 +56,16 @@ export const TalkPage = () => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale, params }) => { +export const getStaticProps: GetStaticProps = async ({ params }) => { const slug = params.slug as string; const client = getApolloClient(); const [_, event] = await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryTalk(client, { code: process.env.conferenceCode, slug, - language: locale, + language: DEFAULT_LOCALE, }), ]); @@ -90,20 +91,11 @@ export const getStaticPaths: GetStaticPaths = async () => { code: process.env.conferenceCode, }); - const paths = [ - ...talks.map((talk) => ({ - params: { - slug: talk.slug, - }, - locale: "en", - })), - ...talks.map((talk) => ({ - params: { - slug: talk.slug, - }, - locale: "it", - })), - ]; + const paths = talks.map((talk) => ({ + params: { + slug: talk.slug, + }, + })); return { paths, diff --git a/frontend/src/pages/grants/edit/index.tsx b/frontend/src/pages/grants/edit/index.tsx index 4421a9e52b..9eadbb8c0e 100644 --- a/frontend/src/pages/grants/edit/index.tsx +++ b/frontend/src/pages/grants/edit/index.tsx @@ -6,6 +6,7 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { GrantForm } from "~/components/grant-form"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { type UpdateGrantInput, queryCurrentUser, diff --git a/frontend/src/pages/grants/index.tsx b/frontend/src/pages/grants/index.tsx index 63595a0900..8a0f1b3add 100644 --- a/frontend/src/pages/grants/index.tsx +++ b/frontend/src/pages/grants/index.tsx @@ -10,6 +10,7 @@ import { MetaTags } from "~/components/meta-tags"; import { formatDeadlineDateTime } from "~/helpers/deadlines"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { DeadlineStatus, queryCurrentUser, @@ -86,10 +87,7 @@ export const GrantsPage = () => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { diff --git a/frontend/src/pages/grants/reply/index.tsx b/frontend/src/pages/grants/reply/index.tsx index ab9c94bd85..d7490e0964 100644 --- a/frontend/src/pages/grants/reply/index.tsx +++ b/frontend/src/pages/grants/reply/index.tsx @@ -23,6 +23,7 @@ import { PageLoading } from "~/components/page-loading"; import { formatDeadlineDateTime } from "~/helpers/deadlines"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import NotFoundPage from "~/pages/404"; import { Status as GrantStatus, @@ -284,10 +285,7 @@ const GrantReply = () => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -302,7 +300,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryGrantDeadline(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/jobs/[id].tsx b/frontend/src/pages/jobs/[id].tsx index 2edec61e68..1ecd64364d 100644 --- a/frontend/src/pages/jobs/[id].tsx +++ b/frontend/src/pages/jobs/[id].tsx @@ -2,13 +2,14 @@ import type { GetStaticPaths, GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryAllJobListings } from "~/types"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryAllJobListings(client, { conference: process.env.conferenceCode, }), @@ -28,20 +29,11 @@ export const getStaticPaths: GetStaticPaths = async () => { conference: process.env.conferenceCode, }); - const paths = [ - ...jobListings.map((page) => ({ - params: { - id: page.id, - }, - locale: "it", - })), - ...jobListings.map((page) => ({ - params: { - id: page.id, - }, - locale: "en", - })), - ]; + const paths = jobListings.map((page) => ({ + params: { + id: page.id, + }, + })); return { paths, diff --git a/frontend/src/pages/jobs/index.tsx b/frontend/src/pages/jobs/index.tsx index 688130261d..a55979bf4d 100644 --- a/frontend/src/pages/jobs/index.tsx +++ b/frontend/src/pages/jobs/index.tsx @@ -2,13 +2,14 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryAllJobListings } from "~/types"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryAllJobListings(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/keynotes/[slug]/index.tsx b/frontend/src/pages/keynotes/[slug]/index.tsx index 5efff0c9f4..dbdbea4a46 100644 --- a/frontend/src/pages/keynotes/[slug]/index.tsx +++ b/frontend/src/pages/keynotes/[slug]/index.tsx @@ -10,6 +10,7 @@ import { MetaTags } from "~/components/meta-tags"; import { ScheduleEventDetail } from "~/components/schedule-event-detail"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryAllKeynotes, queryKeynote, useKeynoteQuery } from "~/types"; const KeynotePage = () => { @@ -78,16 +79,16 @@ const KeynotePage = () => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale, params }) => { +export const getStaticProps: GetStaticProps = async ({ params }) => { const slug = params.slug as string; const client = getApolloClient(); const [_, keynote] = await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryKeynote(client, { conference: process.env.conferenceCode, slug, - language: locale, + language: DEFAULT_LOCALE, }), ]); @@ -106,36 +107,18 @@ export const getStaticPaths: GetStaticPaths = async () => { const client = getApolloClient(); const { data: { - conference: { keynotes: italianKeynotes }, + conference: { keynotes }, }, } = await queryAllKeynotes(client, { conference: process.env.conferenceCode, - language: "it", + language: DEFAULT_LOCALE, }); - const { - data: { - conference: { keynotes: englishKeynotes }, + const paths = keynotes.map((keynote) => ({ + params: { + slug: keynote.slug, }, - } = await queryAllKeynotes(client, { - conference: process.env.conferenceCode, - language: "en", - }); - - const paths = [ - ...englishKeynotes.map((keynote) => ({ - params: { - slug: keynote.slug, - }, - locale: "en", - })), - ...italianKeynotes.map((keynote) => ({ - params: { - slug: keynote.slug, - }, - locale: "it", - })), - ]; + })); return { paths, diff --git a/frontend/src/pages/login/index.tsx b/frontend/src/pages/login/index.tsx index c76e85b3ee..a2ebdcf457 100644 --- a/frontend/src/pages/login/index.tsx +++ b/frontend/src/pages/login/index.tsx @@ -2,11 +2,12 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/news/[slug]/index.tsx b/frontend/src/pages/news/[slug]/index.tsx index 4fc076ffed..d11ce5248a 100755 --- a/frontend/src/pages/news/[slug]/index.tsx +++ b/frontend/src/pages/news/[slug]/index.tsx @@ -18,6 +18,7 @@ import { MetaTags } from "~/components/meta-tags"; import { usePageOrPreview } from "~/components/page-handler/use-page-or-preview"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { type NewsArticleQuery, type PagePreviewQuery, @@ -84,12 +85,10 @@ export const NewsArticlePage = ({ export const getStaticProps: GetStaticProps = async ({ params, - locale, preview, previewData, }: { params: { slug: string }; - locale: string; preview: boolean; previewData: any; }) => { @@ -97,7 +96,7 @@ export const getStaticProps: GetStaticProps = async ({ const client = getApolloClient(); const [_, newsArticleQuery] = await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), preview ? queryPagePreview(client, { contentType: previewData?.contentType, @@ -106,7 +105,7 @@ export const getStaticProps: GetStaticProps = async ({ : queryNewsArticle(client, { slug, hostname: process.env.cmsHostname, - language: locale, + language: DEFAULT_LOCALE, }), ]); @@ -130,38 +129,18 @@ export const getStaticProps: GetStaticProps = async ({ export const getStaticPaths: GetStaticPaths = async () => { const client = getApolloClient(); - const [ - { - data: { newsArticles: italianNewsArticles }, - }, - { - data: { newsArticles: englishNewsArticles }, - }, - ] = await Promise.all([ - queryAllNewsArticles(client, { - language: "it", - hostname: process.env.cmsHostname, - }), - queryAllNewsArticles(client, { - language: "en", - hostname: process.env.cmsHostname, - }), - ]); + const { + data: { newsArticles }, + } = await queryAllNewsArticles(client, { + language: DEFAULT_LOCALE, + hostname: process.env.cmsHostname, + }); - const paths = [ - ...italianNewsArticles.map((blogPost) => ({ - params: { - slug: blogPost.slug, - }, - locale: "it", - })), - ...englishNewsArticles.map((blogPost) => ({ - params: { - slug: blogPost.slug, - }, - locale: "en", - })), - ]; + const paths = newsArticles.map((blogPost) => ({ + params: { + slug: blogPost.slug, + }, + })); return { paths, diff --git a/frontend/src/pages/orders/[id]/confirmation.tsx b/frontend/src/pages/orders/[id]/confirmation.tsx index ccff91a25a..56f97aca13 100644 --- a/frontend/src/pages/orders/[id]/confirmation.tsx +++ b/frontend/src/pages/orders/[id]/confirmation.tsx @@ -19,6 +19,7 @@ import { Alert } from "~/components/alert"; import { PageLoading } from "~/components/page-loading"; import { useLoginState } from "~/components/profile/hooks"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { useOrderQuery } from "~/types"; const OrderCanceled = () => ( @@ -133,10 +134,10 @@ export const OrderConfirmationPage = () => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/profile/[hashid].tsx b/frontend/src/pages/profile/[hashid].tsx index c91d625a25..e5b97d1dc9 100644 --- a/frontend/src/pages/profile/[hashid].tsx +++ b/frontend/src/pages/profile/[hashid].tsx @@ -2,10 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryParticipantPublicProfile } from "~/types"; export const getServerSideProps: GetServerSideProps = async ({ - locale, req, params, }) => { @@ -13,11 +13,11 @@ export const getServerSideProps: GetServerSideProps = async ({ try { const [_, participantQuery] = await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryParticipantPublicProfile(client, { conference: process.env.conferenceCode, id: params.hashid as string, - language: locale, + language: DEFAULT_LOCALE, }), ]); diff --git a/frontend/src/pages/profile/edit.tsx b/frontend/src/pages/profile/edit.tsx index 2d9fdf9b49..f9348939fa 100644 --- a/frontend/src/pages/profile/edit.tsx +++ b/frontend/src/pages/profile/edit.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCountries, queryMyEditProfile } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - locale, - req, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,7 +20,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryCountries(client), queryMyEditProfile(client, { conference: process.env.conferenceCode, diff --git a/frontend/src/pages/profile/index.tsx b/frontend/src/pages/profile/index.tsx index e5727a8707..34425ec953 100644 --- a/frontend/src/pages/profile/index.tsx +++ b/frontend/src/pages/profile/index.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCountries, queryMyProfile } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,7 +20,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryCountries(client), queryMyProfile(client, { conferenceCode: process.env.conferenceCode, diff --git a/frontend/src/pages/profile/my-grant.tsx b/frontend/src/pages/profile/my-grant.tsx index c49a7816d8..3df64ba02e 100644 --- a/frontend/src/pages/profile/my-grant.tsx +++ b/frontend/src/pages/profile/my-grant.tsx @@ -2,16 +2,14 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCountries, queryMyProfileWithGrant, queryParticipantData, } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -26,7 +24,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryCountries(client), queryMyProfileWithGrant(client, { conference: process.env.conferenceCode, diff --git a/frontend/src/pages/profile/my-orders.tsx b/frontend/src/pages/profile/my-orders.tsx index f53b3a0d84..69cce014fd 100644 --- a/frontend/src/pages/profile/my-orders.tsx +++ b/frontend/src/pages/profile/my-orders.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryMyProfileWithOrders } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,7 +20,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryMyProfileWithOrders(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/profile/my-proposals.tsx b/frontend/src/pages/profile/my-proposals.tsx index 14f2ea2381..797312f042 100644 --- a/frontend/src/pages/profile/my-proposals.tsx +++ b/frontend/src/pages/profile/my-proposals.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryMyProfileWithSubmissions } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,10 +20,10 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryMyProfileWithSubmissions(client, { conference: process.env.conferenceCode, - language: locale, + language: DEFAULT_LOCALE, }), ]); } catch (e) { diff --git a/frontend/src/pages/profile/my-tickets.tsx b/frontend/src/pages/profile/my-tickets.tsx index 056ef07c88..21ad217077 100644 --- a/frontend/src/pages/profile/my-tickets.tsx +++ b/frontend/src/pages/profile/my-tickets.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCountries, queryMyProfileWithTickets } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,11 +20,11 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryCountries(client), queryMyProfileWithTickets(client, { conference: process.env.conferenceCode, - language: locale, + language: DEFAULT_LOCALE, }), ]); } catch (e) { diff --git a/frontend/src/pages/profile/my-workshops.tsx b/frontend/src/pages/profile/my-workshops.tsx index 39df48ccbc..c137793cdc 100644 --- a/frontend/src/pages/profile/my-workshops.tsx +++ b/frontend/src/pages/profile/my-workshops.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryMyProfileWithBookedWorkshops } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,7 +20,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryMyProfileWithBookedWorkshops(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/profile/sponsor.tsx b/frontend/src/pages/profile/sponsor.tsx index 5f75576d43..d7ac0101ca 100644 --- a/frontend/src/pages/profile/sponsor.tsx +++ b/frontend/src/pages/profile/sponsor.tsx @@ -2,12 +2,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryBadgeScans } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -22,7 +20,7 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryBadgeScans(client, { conferenceCode: process.env.conferenceCode, page: 1, diff --git a/frontend/src/pages/request-invitation-letter/index.tsx b/frontend/src/pages/request-invitation-letter/index.tsx index 5d197f98e2..ecce8a16f0 100644 --- a/frontend/src/pages/request-invitation-letter/index.tsx +++ b/frontend/src/pages/request-invitation-letter/index.tsx @@ -1,12 +1,10 @@ import type { GetServerSideProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryRequestInvitationLetterPage } from "~/types"; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -20,7 +18,7 @@ export const getServerSideProps: GetServerSideProps = async ({ const client = getApolloClient(null, req.cookies); try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryRequestInvitationLetterPage(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/reset-password/[token].tsx b/frontend/src/pages/reset-password/[token].tsx index a28198ac42..cdb631cfd9 100644 --- a/frontend/src/pages/reset-password/[token].tsx +++ b/frontend/src/pages/reset-password/[token].tsx @@ -2,11 +2,12 @@ import type { GetStaticPaths, GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/reset-password/index.tsx b/frontend/src/pages/reset-password/index.tsx index cd89998d76..6ffde312bf 100644 --- a/frontend/src/pages/reset-password/index.tsx +++ b/frontend/src/pages/reset-password/index.tsx @@ -2,11 +2,12 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/reset-password/password-changed.tsx b/frontend/src/pages/reset-password/password-changed.tsx index c28bcc52cf..57de817be1 100644 --- a/frontend/src/pages/reset-password/password-changed.tsx +++ b/frontend/src/pages/reset-password/password-changed.tsx @@ -2,11 +2,12 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/reset-password/success.tsx b/frontend/src/pages/reset-password/success.tsx index cf89e9c2e9..71449386e1 100644 --- a/frontend/src/pages/reset-password/success.tsx +++ b/frontend/src/pages/reset-password/success.tsx @@ -2,11 +2,12 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/schedule/[day]/index.tsx b/frontend/src/pages/schedule/[day]/index.tsx index 2309d26bb0..21a617d65b 100644 --- a/frontend/src/pages/schedule/[day]/index.tsx +++ b/frontend/src/pages/schedule/[day]/index.tsx @@ -13,7 +13,7 @@ import { ScheduleView } from "~/components/schedule-view"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentUser } from "~/helpers/use-current-user"; import { useCurrentLanguage } from "~/locale/context"; -import type { Language } from "~/locale/languages"; +import { DEFAULT_LOCALE, type Language } from "~/locale/languages"; import { type ScheduleQuery, querySchedule, @@ -21,10 +21,7 @@ import { useScheduleQuery, } from "~/types"; -export const getDayUrl = (day: string, language: Language | null = null) => { - if (language) { - return `/${language}/schedule/${day}`; - } +export const getDayUrl = (day: string) => { return `/schedule/${day}`; }; @@ -110,14 +107,14 @@ const PageContent = ({ data, day, changeDay }: PageContentProps) => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), querySchedule(client, { code: process.env.conferenceCode, - language: locale, + language: DEFAULT_LOCALE, }), ]); @@ -141,20 +138,11 @@ export const getStaticPaths: GetStaticPaths = async () => { code: process.env.conferenceCode, }); - const paths = [ - ...days.map((day) => ({ - params: { - day: day.day, - }, - locale: "en", - })), - ...days.map((day) => ({ - params: { - day: day.day, - }, - locale: "it", - })), - ]; + const paths = days.map((day) => ({ + params: { + day: day.day, + }, + })); return { paths, diff --git a/frontend/src/pages/schedule/invitation/[submissionId].tsx b/frontend/src/pages/schedule/invitation/[submissionId].tsx index 64eea7d9cf..877c0bf9cd 100644 --- a/frontend/src/pages/schedule/invitation/[submissionId].tsx +++ b/frontend/src/pages/schedule/invitation/[submissionId].tsx @@ -21,7 +21,7 @@ import { Alert } from "~/components/alert"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useTranslatedMessage } from "~/helpers/use-translated-message"; import { useCurrentLanguage } from "~/locale/context"; -import type { Language } from "~/locale/languages"; +import { DEFAULT_LOCALE, type Language } from "~/locale/languages"; import NotFoundPage from "~/pages/404"; import { ScheduleInvitationOption, @@ -287,7 +287,6 @@ const Invitation = () => { export const getServerSideProps: GetServerSideProps = async ({ req, params, - locale, }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { @@ -304,9 +303,9 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryGetScheduleInvitation(client, { - language: locale, + language: DEFAULT_LOCALE, submissionId, }), ]); diff --git a/frontend/src/pages/signup.tsx b/frontend/src/pages/signup.tsx index d50b41b19f..4224120844 100644 --- a/frontend/src/pages/signup.tsx +++ b/frontend/src/pages/signup.tsx @@ -2,11 +2,12 @@ import type { GetStaticProps } from "next"; import { addApolloState, getApolloClient } from "~/apollo/client"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); - await prefetchSharedQueries(client, locale); + await prefetchSharedQueries(client, DEFAULT_LOCALE); return addApolloState(client, { props: {}, diff --git a/frontend/src/pages/submission/[id]/edit/index.tsx b/frontend/src/pages/submission/[id]/edit/index.tsx index c8eb4df999..f58c2c9425 100644 --- a/frontend/src/pages/submission/[id]/edit/index.tsx +++ b/frontend/src/pages/submission/[id]/edit/index.tsx @@ -14,6 +14,7 @@ import { } from "~/components/cfp-form"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCfpForm, queryGetSubmission, @@ -120,7 +121,6 @@ export const EditSubmissionPage = () => { export const getServerSideProps: GetServerSideProps = async ({ req, params, - locale, }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { @@ -136,7 +136,7 @@ export const getServerSideProps: GetServerSideProps = async ({ const client = getApolloClient(null, req.cookies); try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryIsCfpOpen(client, { conference: process.env.conferenceCode, }), @@ -151,7 +151,7 @@ export const getServerSideProps: GetServerSideProps = async ({ }), queryGetSubmission(client, { id, - language: locale, + language: DEFAULT_LOCALE, }), ]); } catch (e) { diff --git a/frontend/src/pages/submission/[id]/index.tsx b/frontend/src/pages/submission/[id]/index.tsx index 2ae64be8e6..567d4f96da 100644 --- a/frontend/src/pages/submission/[id]/index.tsx +++ b/frontend/src/pages/submission/[id]/index.tsx @@ -15,6 +15,7 @@ import { createHref } from "~/components/link"; import { ScheduleEventDetail } from "~/components/schedule-event-detail"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import NotFoundPage from "~/pages/404"; import { getType } from "~/pages/event/[slug]"; import { @@ -141,13 +142,12 @@ export const SubmissionPage = () => { export const getServerSideProps: GetServerSideProps = async ({ req, - locale, params, }) => { const client = getApolloClient(null, req.cookies); const [_, englishSubmission, italianSubmission] = await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryIsVotingClosed(client, { conference: process.env.conferenceCode, }), diff --git a/frontend/src/pages/tickets/business.tsx b/frontend/src/pages/tickets/business.tsx index 5788341030..157e93442e 100644 --- a/frontend/src/pages/tickets/business.tsx +++ b/frontend/src/pages/tickets/business.tsx @@ -8,6 +8,7 @@ import { addApolloState, getApolloClient } from "~/apollo/client"; import { Tickets } from "~/components/tickets-page/tickets"; import { TicketsPageWrapper } from "~/components/tickets-page/wrapper"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { CheckoutCategory, queryCurrentUser, queryTickets } from "~/types"; export const BusinessTicketsPage = ({ cartCookie }) => { @@ -41,21 +42,14 @@ export const BusinessTicketsPage = ({ cartCookie }) => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const client = getApolloClient(null, req.cookies); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryTickets(client, { conference: process.env.conferenceCode, - language: "it", - }), - queryTickets(client, { - conference: process.env.conferenceCode, - language: "en", + language: DEFAULT_LOCALE, }), ]); diff --git a/frontend/src/pages/tickets/checkout.tsx b/frontend/src/pages/tickets/checkout.tsx index 1ce753428d..7a5a41b145 100644 --- a/frontend/src/pages/tickets/checkout.tsx +++ b/frontend/src/pages/tickets/checkout.tsx @@ -6,6 +6,7 @@ import { addApolloState, getApolloClient } from "~/apollo/client"; import { CheckoutPageHandler } from "~/components/checkout-page-handler"; import { TicketsPageWrapper } from "~/components/tickets-page/wrapper"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryCurrentUser, queryTickets } from "~/types"; export const TicketsCheckoutPage = ({ cartCookie }) => { @@ -22,10 +23,7 @@ export const TicketsCheckoutPage = ({ cartCookie }) => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const identityToken = req.cookies.pythonitalia_sessionid; if (!identityToken) { return { @@ -40,14 +38,10 @@ export const getServerSideProps: GetServerSideProps = async ({ try { await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryTickets(client, { conference: process.env.conferenceCode, - language: "it", - }), - queryTickets(client, { - conference: process.env.conferenceCode, - language: "en", + language: DEFAULT_LOCALE, }), queryCurrentUser(client, { conference: process.env.conferenceCode, diff --git a/frontend/src/pages/tickets/index.tsx b/frontend/src/pages/tickets/index.tsx index d24cb7486d..2d656677ec 100644 --- a/frontend/src/pages/tickets/index.tsx +++ b/frontend/src/pages/tickets/index.tsx @@ -18,11 +18,10 @@ import { createHref } from "~/components/link"; import { AvailableProductsLandingSection } from "~/components/tickets-page/available-products-landing-section"; import { TicketsPageWrapper } from "~/components/tickets-page/wrapper"; import { prefetchSharedQueries } from "~/helpers/prefetch"; -import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryTickets } from "~/types"; export const TicketsPage = () => { - const language = useCurrentLanguage(); return ( {({ tickets }) => ( @@ -47,7 +46,6 @@ export const TicketsPage = () => { label: , link: createHref({ path: "/tickets/personal/", - locale: language, }), }} > @@ -67,7 +65,6 @@ export const TicketsPage = () => { label: , link: createHref({ path: "/tickets/business/", - locale: language, }), }} > @@ -90,18 +87,14 @@ export const TicketsPage = () => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryTickets(client, { conference: process.env.conferenceCode, - language: "it", - }), - queryTickets(client, { - conference: process.env.conferenceCode, - language: "en", + language: DEFAULT_LOCALE, }), ]); diff --git a/frontend/src/pages/tickets/personal.tsx b/frontend/src/pages/tickets/personal.tsx index a350092e0d..595870bea6 100644 --- a/frontend/src/pages/tickets/personal.tsx +++ b/frontend/src/pages/tickets/personal.tsx @@ -8,6 +8,7 @@ import { addApolloState, getApolloClient } from "~/apollo/client"; import { Tickets } from "~/components/tickets-page/tickets"; import { TicketsPageWrapper } from "~/components/tickets-page/wrapper"; import { prefetchSharedQueries } from "~/helpers/prefetch"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { CheckoutCategory, queryCurrentUser, queryTickets } from "~/types"; export const PersonalTicketsPage = ({ cartCookie }) => { @@ -41,21 +42,14 @@ export const PersonalTicketsPage = ({ cartCookie }) => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ - req, - locale, -}) => { +export const getServerSideProps: GetServerSideProps = async ({ req }) => { const client = getApolloClient(null, req.cookies); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryTickets(client, { conference: process.env.conferenceCode, - language: "it", - }), - queryTickets(client, { - conference: process.env.conferenceCode, - language: "en", + language: DEFAULT_LOCALE, }), ]); diff --git a/frontend/src/pages/voting/index.tsx b/frontend/src/pages/voting/index.tsx index 74628d580e..26dff6f328 100644 --- a/frontend/src/pages/voting/index.tsx +++ b/frontend/src/pages/voting/index.tsx @@ -26,6 +26,7 @@ import { VotingCard } from "~/components/voting-card"; import { formatDeadlineDateTime } from "~/helpers/deadlines"; import { prefetchSharedQueries } from "~/helpers/prefetch"; import { useCurrentLanguage } from "~/locale/context"; +import { DEFAULT_LOCALE } from "~/locale/languages"; import { queryVotingMetadata, useVotingMetadataQuery, @@ -426,11 +427,11 @@ export const VotingPage = () => { ); }; -export const getStaticProps: GetStaticProps = async ({ locale }) => { +export const getStaticProps: GetStaticProps = async () => { const client = getApolloClient(); await Promise.all([ - prefetchSharedQueries(client, locale), + prefetchSharedQueries(client, DEFAULT_LOCALE), queryVotingMetadata(client, { conference: process.env.conferenceCode, }),