diff --git a/next-i18next.config.js b/next-i18next.config.js index f672d2625..eccc62ec3 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -3,7 +3,7 @@ const path = require("path"); module.exports = { i18n: { defaultLocale: "en", - locales: ["en", "es", "de", "fr", "sv", "pt-BR"], + locales: ["en", "es", "de", "fr", "it", "sv", "pt-BR"], localePath: path.resolve("./public/locales"), reloadOnPrerender: process.env.NODE_ENV === "development", }, diff --git a/public/locales/it/app.json b/public/locales/it/app.json new file mode 100644 index 000000000..94f77f310 --- /dev/null +++ b/public/locales/it/app.json @@ -0,0 +1,128 @@ +{ + "12h": "12 ore", + "24h": "24 ore", + "addParticipant": "Aggiungi partecipante", + "addTimeOption": "Aggiungi opzione orario", + "alreadyVoted": "Hai già votato", + "applyToAllDates": "Applica a tutte le date", + "areYouSure": "Sei sicuro/a?", + "back": "Indietro", + "calendarHelp": "Non puoi creare un sondaggio senza nessuna opzione. Aggiungi almeno un opzione per continuare.", + "calendarHelpTitle": "Dimentichi qualcosa?", + "cancel": "Annulla", + "comment": "Commenta", + "commentPlaceholder": "Lascia un commento su questo sondaggio (visibile a tutti)", + "comments": "Commenti", + "continue": "Continua", + "copied": "Copiato", + "copyLink": "Copia link", + "createdBy": "da {{name}}", + "createPoll": "Crea sondaggio", + "creatingDemo": "Creando sondaggio demo…", + "delete": "Elimina", + "deleteComment": "Elimina commento", + "deleteDate": "Elimina data", + "deletedPoll": "Elimina sondaggio", + "deletedPollInfo": "Questo sondaggio non esiste più.", + "deletePoll": "Elimina sondaggio", + "deletePollDescription": "Tutti i dati relativi a questo sondaggio saranno eliminati. Per confermare, digita “{{confirmText}}” qui sotto:", + "deletingOptionsWarning": "Stai eliminando opzioni per le quali i partecipanti hanno votato. Anche il loro voto sarà eliminato.", + "demoPollNotice": "I sondaggi demo vengono cancellati automaticamente dopo 1 giorno", + "description": "Descrizione", + "descriptionPlaceholder": "Ciao a tutti, scegliete le date che per voi vanno bene!", + "donate": "Dona", + "editDetails": "Modifica i dettagli", + "editOptions": "Modifica opzioni", + "email": "Email", + "emailPlaceholder": "jessie.smith@email.com", + "endingGuestSessionNotice": "Una volta terminata la sessione ospite, la sessione non può essere ripresa. Non sarà possibile modificare alcun voto o commento fatto con questa sessione.", + "endSession": "Termina sessione", + "errorCreate": "Oh oh! Si è verificato un problema durante la creazione del tuo sondaggio. L'errore è stato registrato e proveremo a risolverlo.", + "exportToCsv": "Esporta in CSV", + "finish": "Termina", + "forgetMe": "Dimenticati di me", + "goToAdmin": "Vai a Admin", + "guest": "Ospite", + "guestSessionNotice": "Stai usando una sessione ospite. Questo ci permette di riconoscerti se tornerai più tardi in modo da poter modificare i tuoi voti.", + "guestSessionReadMore": "Leggi altro sulle sessioni ospite.", + "hide": "Nascondi", + "ifNeedBe": "Se necessario", + "linkHasExpired": "Il link è scaduto o non è più valido", + "loading": "Caricamento…", + "loadingParticipants": "Caricamento partecipanti…", + "location": "Posizione", + "locationPlaceholder": "Bar di Joe", + "lockPoll": "Blocca sondaggio", + "login": "Accedi", + "loginCheckInbox": "Verifica la tua posta in arrivo.", + "loginMagicLinkSent": "Un link di accesso è stato inviato a:", + "loginSendMagicLink": "Inviami un link di accesso", + "loginViaMagicLink": "Accedi tramite link di accesso", + "loginViaMagicLinkDescription": "Ti invieremo un email con un link di accesso che puoi usare per effettuare il login.", + "loginWithValidEmail": "Inserisci un indirizzo email valido", + "logout": "Esci", + "manage": "Gestisci", + "menu": "Menu", + "mixedOptionsDescription": "Non puoi avere entrambe le opzioni di data e ora nello stesso sondaggio. Quale vorresti mantenere?", + "mixedOptionsKeepDates": "Mantieni opzioni data", + "mixedOptionsKeepTimes": "Mantieni opzioni tempo", + "mixedOptionsTitle": "Aspetta un minuto…🤔", + "monday": "Lunedì", + "monthView": "Vista mensile", + "name": "Nome", + "namePlaceholder": "Jessie Smith", + "newPoll": "Nuovo sondaggio", + "next": "Avanti", + "nextMonth": "Mese successivo", + "no": "No", + "noDatesSelected": "Nessuna data selezionata", + "notificationsDisabled": "Le notifiche sono state disabilitate", + "notificationsOff": "Notifiche disattive", + "notificationsOn": "Notifiche attive", + "notificationsOnDescription": "Un'email verrà inviata a {{email}} quando c'è attività su questo sondaggio.", + "notificationsVerifyEmail": "Devi verificare la tua email per attivare le notifiche", + "ok": "Ok", + "options": "Opzioni", + "participant": "Partecipante", + "participantCount_other": "{{count}} partecipanti", + "participantCount": "{{count}} partecipante", + "pollHasBeenLocked": "Questo sondaggio è stato bloccato", + "pollHasBeenVerified": "Il tuo sondaggio è stato verificato", + "pollOwnerNotice": "Ehi {{name}}, sembra che tu sia il proprietario di questo sondaggio.", + "pollsEmpty": "Nessun sondaggio creato", + "possibleAnswers": "Possibili risposte", + "preferences": "Impostazioni", + "previousMonth": "Mese precedente", + "profileLogin": "Profilo - Accedi", + "profileUser": "Profilo - {{username}}", + "requiredNameError": "Il nome è obbligatorio", + "save": "Salva", + "saveInstruction": "Seleziona la tua disponibilità e clicca su {{save}}", + "share": "Condividi", + "shareDescription": "Dai questo link ai partecipanti per permette loro di votare al tuo sondaggio.", + "shareLink": "Condividi via link", + "specifyTimes": "Specifica orari", + "specifyTimesDescription": "Includi gli orari di inizio e di fine per ogni opzione", + "stepSummary": "Fase {{current}} di {{total}}", + "sunday": "Domenica", + "timeAndDate": "Data e ora", + "timeFormat": "Formato orario:", + "timeZone": "Fuso orario:", + "title": "Titolo", + "titlePlaceholder": "Riunione Mensile", + "today": "Oggi", + "unlockPoll": "Sblocca sondaggio", + "unverifiedMessage": "Un'email è stata inviata a {{email}} con un link per verificare l'indirizzo email.", + "user": "Utente", + "vote": "Vota", + "voteCount_other": "{{count}} voti", + "voteCount": "{{count}} voti", + "weekStartsOn": "La settimana inizia da", + "weekView": "Vista settimanale", + "whatsThis": "Cos'è questo?", + "yes": "Si", + "you": "Tu", + "yourDetails": "I tuoi dati", + "yourName": "Il tuo nome…", + "yourPolls": "I tuoi sondaggi" +} diff --git a/public/locales/it/common.json b/public/locales/it/common.json new file mode 100644 index 000000000..4d91fb3d1 --- /dev/null +++ b/public/locales/it/common.json @@ -0,0 +1,22 @@ +{ + "blog": "Blog", + "discussions": "Discussioni", + "donate": "Dona", + "english": "Inglese", + "footerCredit": "Realizzato da @imlukevella", + "footerSponsor": "Questo progetto è finanziato dall'utente. Per favore considera di supportarlo donando.", + "french": "Francese", + "german": "Tedesco", + "home": "Home", + "italian": "Italiano", + "language": "Lingua", + "links": "Links", + "portugueseBr": "Portoghese (Brasile)", + "poweredBy": "Powered by", + "privacyPolicy": "Informativa sulla privacy", + "spanish": "Spagnolo", + "starOnGithub": "Aggiungi ai preferiti su Github", + "support": "Assistenza", + "swedish": "Svedese", + "volunteerTranslator": "Aiutaci a tradurre il sito" +} diff --git a/public/locales/it/errors.json b/public/locales/it/errors.json new file mode 100644 index 000000000..b42a2b254 --- /dev/null +++ b/public/locales/it/errors.json @@ -0,0 +1,6 @@ +{ + "notFoundTitle": "404 non trovato", + "notFoundDescription": "Non abbiamo trovato la pagina che stavi cercando.", + "goToHome": "Vai alla home", + "startChat": "Avvia la chat" +} diff --git a/public/locales/it/homepage.json b/public/locales/it/homepage.json new file mode 100644 index 000000000..8fac72b9f --- /dev/null +++ b/public/locales/it/homepage.json @@ -0,0 +1,36 @@ +{ + "3Ls": "Sì—con 3 Ls", + "adFree": "Senza pubblicità", + "adFreeDescription": "Puoi far riposare il tuo ad-blocker — qui non ne avrai bisogno.", + "comments": "Commenti", + "commentsDescription": "I partecipanti possono commentare il sondaggio e i commenti saranno visibili a tutti.", + "features": "Funzionalità", + "featuresSubheading": "Pianificare in modo intelligente", + "follow": "Segui", + "getStarted": "Inizia ora", + "heroSubText": "Trova la data perfetta senza troppi problemi", + "heroText": "Pianifica
riunioni di gruppo
con facilità", + "links": "Links", + "liveDemo": "Demo Live", + "metaDescription": "Crea sondaggi e vota per trovare il miglior giorno o orario. Un alternativa gratuita a Doodle.", + "metaTitle": "Rallly - Programma incontri di gruppo", + "mobileFriendly": "Mobile friendly", + "mobileFriendlyDescription": "Funziona bene su dispositivi mobili in modo che i partecipanti possano rispondere ai sondaggi ovunque si trovino.", + "new": "Nuovo", + "noLoginRequired": "Login non necessario", + "noLoginRequiredDescription": "Non è necessario effettuare il login per creare o partecipare ad un sondaggio", + "notifications": "Notifiche", + "notificationsDescription": "Tieni traccia di chi ha risposto. Ricevi una notifica quando i partecipanti votano o commentano il tuo sondaggio.", + "openSource": "Open-source", + "openSourceDescription": "Il codice è completamente open-source e disponibile su GitHub.", + "participant": "Partecipante", + "participantCount_other": "{{count}} partecipanti", + "participantCount": "{{count}} partecipante", + "perfect": "Perfetto!", + "principles": "Principi", + "principlesSubheading": "Non siamo come gli altri", + "selfHostable": "Self-hostable", + "selfHostableDescription": "Eseguilo sul tuo server personale per avere il pieno controllo dei tuoi dati", + "timeSlots": "Fasce orarie", + "timeSlotsDescription": "Imposta singolarmente i tempi di inizio e fine per ogni opzione nel tuo sondaggio. Gli orari possono essere automaticamente adattati al fuso orario di ogni partecipante o possono essere impostati per ignorare completamente i fuso orari." +} diff --git a/src/components/poll/language-selector.tsx b/src/components/poll/language-selector.tsx index f32cbf351..0035a389d 100644 --- a/src/components/poll/language-selector.tsx +++ b/src/components/poll/language-selector.tsx @@ -21,8 +21,9 @@ export const LanguageSelect: React.VoidFunctionComponent<{ - + + ); diff --git a/src/middleware.ts b/src/middleware.ts index 324198fcc..4effbacc7 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,7 +1,7 @@ import languageParser from "accept-language-parser"; import { NextRequest, NextResponse } from "next/server"; -const supportedLocales = ["en", "es", "de", "fr", "sv", "pt-BR"]; +const supportedLocales = ["en", "es", "de", "fr", "it", "sv", "pt-BR"]; export function middleware({ headers, cookies, nextUrl }: NextRequest) { const newUrl = nextUrl.clone(); diff --git a/src/utils/dayjs.tsx b/src/utils/dayjs.tsx index a2050509b..7b02456b5 100644 --- a/src/utils/dayjs.tsx +++ b/src/utils/dayjs.tsx @@ -45,6 +45,11 @@ const dayjsLocales: Record< timeFormat: "24h", import: () => import("dayjs/locale/fr"), }, + it: { + weekStartsOn: "monday", + timeFormat: "24h", + import: () => import("dayjs/locale/it"), + }, sv: { weekStartsOn: "monday", timeFormat: "24h",