diff --git a/frontend/components/Profile/ProfileSettings.tsx b/frontend/components/Profile/ProfileSettings.tsx index 0e07829..2e7350f 100644 --- a/frontend/components/Profile/ProfileSettings.tsx +++ b/frontend/components/Profile/ProfileSettings.tsx @@ -25,6 +25,7 @@ import { import TelegramIcon from '../Icons/TelegramIcon'; import { useToast } from '../Shared/ToastContext'; import { dispatchTelegramStatusChange } from '../../contexts/TelegramStatusContext'; +import LanguageDropdown from '../Shared/LanguageDropdown'; interface ProfileSettingsProps { currentUser: { id: number; email: string }; @@ -845,31 +846,12 @@ const ProfileSettings: React.FC = ({ - + { + setFormData(prev => ({ ...prev, language: languageCode })); + }} + />
diff --git a/frontend/components/Shared/LanguageDropdown.tsx b/frontend/components/Shared/LanguageDropdown.tsx new file mode 100644 index 0000000..f2bc9bd --- /dev/null +++ b/frontend/components/Shared/LanguageDropdown.tsx @@ -0,0 +1,108 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; +import { ChevronDownIcon } from '@heroicons/react/24/outline'; + +interface LanguageOption { + code: string; + name: string; + flag: string; +} + +interface LanguageDropdownProps { + value: string; + onChange: (languageCode: string) => void; + className?: string; +} + +const LanguageDropdown: React.FC = ({ + value, + onChange, + className = '', +}) => { + const { t } = useTranslation(); + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + + const languages: LanguageOption[] = [ + { code: 'de', name: t('profile.deutsch'), flag: '🇩🇪' }, + { code: 'en', name: t('profile.english'), flag: '🇺🇸' }, + { code: 'el', name: t('profile.greek'), flag: '🇬🇷' }, + { code: 'it', name: t('profile.italian'), flag: '🇮🇹' }, + { code: 'jp', name: t('profile.japanese'), flag: '🇯🇵' }, + { code: 'es', name: t('profile.spanish'), flag: '🇪🇸' }, + { code: 'ua', name: t('profile.ukrainian'), flag: '🇺🇦' }, + ].sort((a, b) => a.name.localeCompare(b.name)); + + const selectedLanguage = languages.find(lang => lang.code === value) || languages[0]; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + const handleSelect = (languageCode: string) => { + onChange(languageCode); + setIsOpen(false); + }; + + return ( +
+ + + {isOpen && ( +
+ {languages.map((language) => ( + + ))} +
+ )} +
+ ); +}; + +export default LanguageDropdown; \ No newline at end of file diff --git a/frontend/i18n.ts b/frontend/i18n.ts index 8195c73..ed48671 100644 --- a/frontend/i18n.ts +++ b/frontend/i18n.ts @@ -42,7 +42,7 @@ i18nInstance fallbackLng: 'en', debug: false, load: 'languageOnly', - supportedLngs: ['en', 'es', 'el', 'jp', 'ua', 'de'], + supportedLngs: ['en', 'es', 'el', 'jp', 'ua', 'de', 'it'], nonExplicitSupportedLngs: true, resources: devResources, detection: { diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index ba3ed4f..c5f4ba1 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -187,7 +187,8 @@ "browseImage": "Bild durchsuchen", "noNotes": "Keine Notizen für dieses Projekt.", "deleteProject": "Projekt löschen", - "showCompleted": "Abgeschlossene anzeigen" + "showCompleted": "Abgeschlossene anzeigen", + "createSuccess": "Projekt erfolgreich erstellt!" }, "profile": { "title": "Profil-Einstellungen", @@ -200,6 +201,7 @@ "ukrainian": "Ukrainisch", "deutsch": "Deutsch", "japanese": "Japanisch", + "italian": "Italienisch", "pollingNote": "Das Polling prüft regelmäßig neue Nachrichten von Telegram und fügt sie zu Ihrem Posteingang hinzu.", "pollingDescription": "Das Polling prüft regelmäßig neue Nachrichten von Telegram und fügt sie zu Ihrem Posteingang hinzu.", "startPolling": "Polling starten", @@ -333,6 +335,15 @@ "friday": "Fr", "saturday": "Sa", "sunday": "So" + }, + "dateFormats": { + "long": "EEEE, d. MMMM yyyy", + "short": "d. MMM yyyy", + "monthYear": "MMMM yyyy", + "dayMonth": "d. MMMM", + "time": "HH:mm", + "dateTime": "d. MMM yyyy, HH:mm", + "todayHeader": "dddd, d. MMMM yyyy" } } diff --git a/public/locales/el/translation.json b/public/locales/el/translation.json index bf5ca39..38405f4 100644 --- a/public/locales/el/translation.json +++ b/public/locales/el/translation.json @@ -96,6 +96,7 @@ "japanese": "Ιαπωνικά", "ukrainian": "Ουκρανικά", "deutsch": "Γερμανικά", + "italian": "Ιταλικά", "languagePreference": "Προτίμηση Γλώσσας", "personalInfo": "Προσωπικές Πληροφορίες", "notifications": "Ειδοποιήσεις", @@ -604,7 +605,8 @@ "browseImage": "Περιήγηση Εικόνας", "noNotes": "Δεν υπάρχουν σημειώσεις για αυτό το έργο.", "deleteProject": "Διαγραφή Έργου", - "showCompleted": "Εμφάνιση Ολοκληρωμένων" + "showCompleted": "Εμφάνιση Ολοκληρωμένων", + "createSuccess": "Το έργο δημιουργήθηκε με επιτυχία!" }, "pomodoro": { "play": "Αναπαραγωγή", @@ -664,5 +666,14 @@ "friday": "Παρ", "saturday": "Σαβ", "sunday": "Κυρ" + }, + "dateFormats": { + "long": "EEEE, d MMMM yyyy", + "short": "d MMM yyyy", + "monthYear": "MMMM yyyy", + "dayMonth": "d MMMM", + "time": "HH:mm", + "dateTime": "d MMM yyyy, HH:mm", + "todayHeader": "dddd, d MMMM yyyy" } } diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 88a19fd..3d497d2 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -141,6 +141,7 @@ "japanese": "Japanese", "ukrainian": "Ukrainian", "deutsch": "German", + "italian": "Italian", "title": "Profile Settings", "appearance": "Appearance", "lightMode": "Light Mode", @@ -434,7 +435,8 @@ "uploadImageHint": "Upload an image for your project (max 5MB)", "browseImage": "Browse Image", "noNotes": "No notes for this project.", - "deleteProject": "Delete Project" + "deleteProject": "Delete Project", + "createSuccess": "Project created successfully!" }, "errors": { "required": "This field is required", @@ -496,7 +498,8 @@ "monthYear": "MMMM yyyy", "dayMonth": "MMMM d", "time": "h:mm a", - "dateTime": "MMM d, yyyy h:mm a" + "dateTime": "MMM d, yyyy h:mm a", + "todayHeader": "dddd, MMMM do, yyyy" }, "dateIndicators": { "today": "TODAY", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index f32384f..1746de8 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -98,6 +98,7 @@ "ukrainian": "Ucraniano", "deutsch": "Alemán", "japanese": "Japonés", + "italian": "Italiano", "languagePreference": "Preferencia de Idioma", "personalInfo": "Información Personal", "notifications": "Notificaciones", @@ -347,7 +348,8 @@ "monthYear": "MMMM 'de' yyyy", "dayMonth": "d 'de' MMMM", "time": "H:mm", - "dateTime": "d MMM yyyy, H:mm" + "dateTime": "d MMM yyyy, H:mm", + "todayHeader": "dddd, d 'de' MMMM 'de' yyyy" }, "taskViews": { "project": { @@ -530,7 +532,8 @@ "browseImage": "Examinar Imagen", "noNotes": "No hay notas para este proyecto.", "deleteProject": "Eliminar Proyecto", - "showCompleted": "Mostrar Completados" + "showCompleted": "Mostrar Completados", + "createSuccess": "¡Proyecto creado exitosamente!" }, "pomodoro": { "play": "Reproducir", diff --git a/public/locales/it/quotes.json b/public/locales/it/quotes.json new file mode 100644 index 0000000..08970e4 --- /dev/null +++ b/public/locales/it/quotes.json @@ -0,0 +1,19 @@ +{ + "quotes": [ + "Credi di poterlo fare e sei già a metà strada.", + "L'unico modo per fare un gran lavoro è amare quello che fai.", + "Il successo non è definitivo, il fallimento non è fatale: è il coraggio di continuare che conta.", + "Sembra sempre impossibile finché non viene fatto.", + "Il tuo tempo è limitato, non sprecarlo vivendo la vita di qualcun altro.", + "Il futuro appartiene a coloro che credono nella bellezza dei propri sogni.", + "Non guardare l'orologio; fai quello che fa lui. Continua ad andare.", + "La qualità non è un atto, è un'abitudine.", + "La vita è quello che ti succede mentre sei impegnato a fare altri progetti.", + "Il modo migliore per predire il futuro è crearlo.", + "Non aspettare il momento perfetto, prendi il momento e rendilo perfetto.", + "Il successo è camminare da fallimento in fallimento senza perdere il tuo entusiasmo.", + "Ogni grande sogno inizia con un sognatore.", + "Non puoi tornare indietro e cambiare l'inizio, ma puoi iniziare dove sei e cambiare il finale.", + "La motivazione ti fa iniziare. L'abitudine ti fa andare avanti." + ] +} \ No newline at end of file diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json new file mode 100644 index 0000000..9525f77 --- /dev/null +++ b/public/locales/it/translation.json @@ -0,0 +1,723 @@ +{ + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "create": "Crea", + "submit": "Invia", + "close": "Chiudi", + "back": "Indietro", + "next": "Avanti", + "loading": "Caricamento...", + "appLoading": "Caricamento applicazione... Attendere prego.", + "completed": "Completato", + "error": "Errore", + "success": "Successo", + "area": "Area", + "status": "Stato", + "saving": "Salvataggio...", + "settings": "Impostazioni", + "none": "Nessuno" + }, + "sidebar": { + "dashboard": "Dashboard", + "projects": "Progetti", + "tasks": "Attività", + "calendar": "Calendario", + "notes": "Note", + "settings": "Impostazioni", + "areas": "Aree", + "tags": "Tag", + "addAreaAriaLabel": "Aggiungi Area", + "addAreaTitle": "Aggiungi Area", + "addTagAriaLabel": "Aggiungi Tag", + "addTagTitle": "Aggiungi Tag", + "today": "Oggi", + "upcoming": "Prossimi", + "nextActions": "Prossime Azioni", + "inbox": "Inbox", + "completed": "Completati", + "allTasks": "Tutte le Attività" + }, + "navigation": { + "home": "Home", + "dashboard": "Dashboard", + "profile": "Profilo", + "profileSettings": "Impostazioni Profilo", + "settings": "Impostazioni", + "about": "Informazioni", + "logout": "Disconnetti" + }, + "settings": { + "todayPageSettings": "Impostazioni Pagina Oggi", + "showDailyQuote": "Mostra Citazione Giornaliera", + "showMetrics": "Mostra Metriche", + "showProductivity": "Mostra Insights di Produttività", + "showIntelligence": "Mostra Suggerimenti Intelligenti", + "showNextTaskSuggestion": "Suggerimento Prossima Attività", + "showSuggestions": "Mostra Suggeriti", + "showDueToday": "Mostra Attività in Scadenza Oggi", + "showCompleted": "Mostra Attività Completate" + }, + "dashboard": { + "overview": "Panoramica", + "sameAsYesterday": "Come ieri", + "betterThanYesterday": "{{percentage}}% in più di ieri", + "worseThanYesterday": "{{percentage}}% in meno di ieri", + "sameAsAverage": "Come la media", + "betterThanAverage": "{{percentage}}% sopra la media", + "worseThanAverage": "{{percentage}}% sotto la media", + "metrics": "Metriche", + "showMetrics": "Mostra Metriche", + "hideMetrics": "Nascondi Metriche", + "insights": "Insights", + "showInsights": "Mostra Insights", + "hideInsights": "Nascondi Insights", + "intelligence": "Intelligenza", + "showIntelligence": "Mostra Suggerimenti Intelligenti", + "hideIntelligence": "Nascondi Suggerimenti Intelligenti", + "completed": "Completato", + "showCompleted": "Mostra Attività Completate", + "hideCompleted": "Nascondi Attività Completate" + }, + "tasks": { + "title": "Attività", + "today": "Oggi", + "backlog": "Backlog", + "inProgress": "In Corso", + "dueToday": "In Scadenza Oggi", + "stale": "Obsolete", + "suggested": "Suggerite", + "completedToday": "Completate Oggi", + "weeklyCompletions": "Progresso Settimanale", + "taskCompleted": "attività completata", + "tasksCompleted": "attività completate", + "noTasksAvailable": "Nessuna attività disponibile.", + "searchPlaceholder": "Cerca attività...", + "addNewTask": "Aggiungi Nuova Attività", + "metrics": "Metriche", + "myPlanToday": "Il Mio Piano per Oggi", + "noPlanToday": "Nessuna attività pianificata per oggi", + "addToPlanHint": "Clicca sull'icona 🗓 'aggiungi al piano di oggi' a destra di qualsiasi attività per aggiungerla qui", + "blankSlateHint": "Inizia creando una nuova attività o cambiando i tuoi filtri.", + "addToToday": "Aggiungi al piano di oggi", + "removeFromToday": "Rimuovi dal piano di oggi", + "setInProgress": "Imposta in corso", + "setNotStarted": "Imposta come non iniziata" + }, + "timeline": { + "activityTimeline": "Timeline delle Attività", + "showActivityTimeline": "Mostra Timeline delle Attività", + "hideActivityTimeline": "Nascondi Timeline delle Attività", + "hideTimeline": "Nascondi Timeline", + "failedToLoad": "Impossibile caricare la timeline", + "events": { + "taskCreated": "Attività creata", + "statusChanged": "Stato cambiato", + "priorityChanged": "Priorità cambiata", + "dueDateChanged": "Data di scadenza cambiata", + "nameUpdated": "Nome aggiornato", + "descriptionUpdated": "Descrizione aggiornata", + "noteUpdated": "Nota aggiornata", + "projectChanged": "Progetto cambiato", + "tagsUpdated": "Tag aggiornati", + "taskArchived": "Attività archiviata", + "todayFlagChanged": "Flag Oggi Cambiato", + "status": "Stato", + "priority": "Priorità", + "dueDate": "Data di scadenza", + "none": "Nessuno" + } + }, + "profile": { + "settings": "Impostazioni Profilo", + "language": "Lingua", + "theme": "Tema", + "notifications": "Notifiche", + "english": "Inglese", + "spanish": "Spagnolo", + "greek": "Greco", + "japanese": "Giapponese", + "ukrainian": "Ucraino", + "deutsch": "Tedesco", + "italian": "Italiano", + "title": "Impostazioni Profilo", + "appearance": "Aspetto", + "lightMode": "Modalità Chiara", + "darkMode": "Modalità Scura", + "light": "Chiaro", + "dark": "Scuro", + "timezone": "Fuso Orario", + "saveChanges": "Salva Modifiche", + "successMessage": "Profilo aggiornato con successo!", + "languageChangedNote": "Le modifiche alla lingua vengono applicate immediatamente", + "languageChanging": "Cambio lingua...", + "languagePreference": "Preferenza Lingua", + "personalInfo": "Informazioni Personali", + "errorMessage": "Impossibile aggiornare il profilo", + "telegramIntegration": "Integrazione Telegram", + "telegramDescription": "Collega il tuo account tududi a un bot Telegram per aggiungere elementi alla tua inbox tramite messaggi Telegram.", + "telegramBotToken": "Token Bot Telegram", + "telegramTokenDescription": "Crea un bot con @BotFather su Telegram e incolla il token qui.", + "telegramConnected": "Il tuo account Telegram è connesso! Invia messaggi al tuo bot per aggiungere elementi alla tua inbox tududi.", + "setupTelegram": "Configura Telegram", + "setupTelegramLower": "configura telegram", + "settingUp": "Configurazione...", + "telegramSetupSuccess": "Bot Telegram \"{{botName}}\" configurato con successo!", + "telegramSetupFailed": "Impossibile configurare il bot Telegram.", + "invalidTelegramToken": "Formato token bot Telegram non valido.", + "telegramInstructions": "Vai su https://t.me/{{botUsername}} e inizia a chattare con il tuo bot per collegarlo al tuo account tududi.", + "botConfigured": "Bot configurato con successo!", + "botUsername": "Nome utente Bot:", + "pollingStatus": "Stato Polling:", + "pollingActive": "Attivo - Riceve messaggi", + "pollingInactive": "Inattivo - Non riceve messaggi", + "pollingNote": "Il polling controlla periodicamente i nuovi messaggi da Telegram e li aggiunge alla tua inbox.", + "pollingDescription": "Il polling controlla periodicamente i nuovi messaggi da Telegram e li aggiunge alla tua inbox.", + "startPolling": "Avvia Polling", + "stopPolling": "Ferma Polling", + "startPollingLower": "avvia polling", + "stopPollingLower": "ferma polling", + "pollingStarted": "Polling Telegram avviato", + "pollingStopped": "Polling Telegram fermato", + "pollingError": "Errore nella gestione del polling Telegram", + "startPollingFailed": "Impossibile avviare il polling", + "stopPollingFailed": "Impossibile fermare il polling", + "openTelegram": "Apri in Telegram", + "openInTelegram": "apri in telegram", + "testTelegramMessage": "Testa Telegram", + "testMessageSent": "Messaggio di test inviato con successo!", + "testMessageFailed": "Impossibile inviare il messaggio di test.", + "testMessageError": "Errore nell'invio del messaggio di test.", + "taskSummaryNotifications": "Notifiche Riassunto Attività", + "taskSummaryDescription": "Ricevi riassunti regolari delle tue attività tramite Telegram. Questa funzione richiede che l'integrazione Telegram sia configurata.", + "enableTaskSummaries": "Abilita Riassunti Attività", + "enableTaskSummary": "Abilita Riassunti Attività", + "summaryFrequency": "Frequenza riassunto", + "summaryFrequencyDescription": "Scegli quanto spesso vuoi ricevere i riassunti delle attività", + "sendTestSummary": "Invia riassunto di test", + "frequency": { + "1h": "1 ora", + "2h": "2 ore", + "4h": "4 ore", + "8h": "8 ore", + "12h": "12 ore", + "daily": "1 giorno", + "weekly": "1 settimana" + }, + "frequencyHelp": "Scegli quanto spesso vuoi ricevere i riassunti delle attività", + "taskIntelligence": "Intelligenza Attività", + "taskIntelligenceDescription": "Ricevi suggerimenti utili per rendere i nomi delle tue attività più descrittivi e attuabili.", + "enableTaskIntelligence": "Abilita Assistente Intelligenza Attività", + "autoSuggestNextActions": "Suggerisci Automaticamente Prossime Azioni", + "autoSuggestNextActionsDescription": "Quando crei un progetto, suggerisci automaticamente la prossima azione fisica da intraprendere.", + "enableAutoSuggestNextActions": "Abilita Suggerimenti Prossima Azione", + "productivityFeatures": "Funzioni di Produttività", + "pomodoroDescription": "Abilita il timer Pomodoro nella barra di navigazione per sessioni di lavoro focalizzato.", + "enablePomodoro": "Abilita Timer Pomodoro", + "productivityAssistant": "Assistente di Produttività", + "productivityAssistantDescription": "Mostra insights di produttività che aiutano a identificare progetti bloccati, attività vaghe e miglioramenti del flusso di lavoro nella tua pagina Oggi.", + "enableProductivityAssistant": "Abilita Insights di Produttività", + "nextTaskSuggestion": "Suggerimento Prossima Attività", + "nextTaskSuggestionDescription": "Suggerisci automaticamente la prossima migliore attività su cui lavorare quando non hai nulla in corso, dando priorità alle attività in scadenza oggi, poi a quelle suggerite dalla tua pagina Oggi.", + "enableNextTaskSuggestion": "Abilita Suggerimenti Prossima Attività", + "nextActionPrompt": "Qual è la prossima azione fisica per questo progetto?", + "nextActionPlaceholder": "es. Chiamare il cliente per programmare un incontro, Ricercare concorrenti online, Creare cartella progetto...", + "addNextAction": "Aggiungi Prossima Azione", + "skipNextAction": "Salta per ora", + "nextActionHint": "Pensa al passo più piccolo e concreto che puoi fare ora per far avanzare questo progetto.", + "tabs": { + "general": "Generale", + "security": "Sicurezza", + "productivity": "Produttività", + "telegram": "Telegram", + "ai": "Funzioni AI" + }, + "security": "Impostazioni Sicurezza", + "changePassword": "Cambia Password", + "currentPassword": "Password Attuale", + "newPassword": "Nuova Password", + "confirmPassword": "Conferma Nuova Password", + "enterCurrentPassword": "Inserisci la tua password attuale", + "enterNewPassword": "Inserisci la tua nuova password", + "confirmNewPassword": "Conferma la tua nuova password", + "currentPasswordRequired": "Password attuale richiesta", + "newPasswordRequired": "Nuova password richiesta", + "passwordTooShort": "La password deve essere di almeno 6 caratteri", + "passwordMismatch": "Le password non corrispondono", + "passwordChangeError": "Impossibile cambiare la password", + "passwordChangeSuccess": "Password cambiata con successo!", + "changingPassword": "Cambio password...", + "accountSettings": "Account e Preferenze", + "aiProductivityFeatures": "Funzioni AI e Produttività", + "botSetup": "Configurazione Bot", + "passwordChangeNote": "Le modifiche alla password verranno salvate quando clicchi \"Salva Modifiche\" in fondo al modulo.", + "passwordChangeOptional": "Lascia vuoti i campi password per aggiornare altre impostazioni senza cambiare la password." + }, + "productivity": { + "stalledProjects": "Progetti Bloccati", + "stalledProjectsDesc": "Questi progetti non hanno attività o azioni", + "needsNextAction": "Progetti Necessitano Prossima Azione", + "needsNextActionDesc": "Questi progetti hanno attività completate ma nessuna prossima azione", + "tasksAreProjects": "Attività che Sembrano Progetti", + "tasksAreProjectsDesc": "Queste attività potrebbero dover essere suddivise", + "vagueTasks": "Attività Senza Azione Chiara", + "vagueTasksDesc": "Queste attività necessitano di verbi d'azione più chiari", + "staleTasks": "Attività Obsolete", + "staleTasksDesc": "Attività non aggiornate da {{days}} giorni", + "stuckProjects": "Progetti Bloccati", + "stuckProjectsDesc": "Progetti non aggiornati di recente", + "issuesFound": "Trovati {{count}} problema(i) di produttività che necessitano attenzione", + "reviewItems": "Clicca per rivedere e migliorare il tuo flusso di lavoro", + "suggestion": "Clicca su qualsiasi elemento sopra per aprirlo e apportare miglioramenti." + }, + "nextTask": { + "suggestion": "Dato che non c'è nulla in corso, che ne dici di iniziare con", + "suggestionTodayPlan": "Dato che non c'è nulla in corso, che ne dici di iniziare con questa attività dal tuo piano di oggi", + "suggestionDueToday": "Dato che non c'è nulla in corso, che ne dici di iniziare con questa attività in scadenza oggi", + "suggestionSuggested": "Dato che non c'è nulla in corso, che ne dici di iniziare con questa attività suggerita", + "letsDoIt": "Sì, facciamolo!", + "starting": "Avvio...", + "startedSuccessfully": "Attività avviata con successo!", + "giveMeSomethingElse": "Dammi qualcos'altro" + }, + "modals": { + "confirmDelete": "Sei sicuro di voler eliminare?", + "taskCreation": "Crea Nuova Attività", + "taskEdit": "Modifica Attività", + "deleteTask": { + "title": "Elimina Attività", + "confirmation": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata." + }, + "noteCreation": "Crea Nuova Nota", + "noteEdit": "Modifica Nota", + "updateNote": "Aggiorna Nota", + "createNote": "Crea Nota", + "submitting": "Invio...", + "areaCreation": "Crea Nuova Area", + "areaEdit": "Modifica Area", + "updateArea": "Aggiorna Area", + "createArea": "Crea Area", + "updateTag": "Aggiorna Tag", + "createTag": "Crea Tag", + "createProject": "Crea Progetto", + "updateProject": "Aggiorna Progetto", + "deleteTag": { + "title": "Elimina Tag", + "message": "Sei sicuro di voler eliminare il tag \"{{tagName}}\"?" + }, + "deleteArea": { + "title": "Elimina Area", + "message": "Sei sicuro di voler eliminare l'area \"{{areaName}}\"?" + }, + "deleteNote": { + "title": "Elimina Nota", + "message": "Sei sicuro di voler eliminare la nota \"{{noteTitle}}\"?" + }, + "deleteProject": { + "title": "Elimina Progetto", + "message": "Sei sicuro di voler eliminare il progetto \"{{projectName}}\"?" + } + }, + "forms": { + "title": "Titolo", + "description": "Descrizione", + "dueDate": "Data di Scadenza", + "priority": "Priorità", + "status": "Stato", + "assignedTo": "Assegnato a", + "category": "Categoria", + "tags": "Tag", + "required": "Questo campo è obbligatorio", + "optional": "Opzionale", + "task": { + "namePlaceholder": "Aggiungi Nome Attività", + "statusAndOptions": "Stato e Opzioni", + "recurrence": "Ricorrenza", + "labels": { + "tags": "Tag", + "project": "Progetto", + "status": "Stato", + "priority": "Priorità", + "dueDate": "Data di Scadenza", + "note": "Nota", + "recurrenceType": "Ripeti", + "recurrenceInterval": "Ogni", + "weekday": "Nel giorno", + "monthDay": "Giorno del mese", + "weekOfMonth": "Settimana del mese", + "recurrenceEndDate": "Data di fine (opzionale)", + "completionBased": "Ripeti dopo il completamento" + }, + "projectSearchPlaceholder": "Cerca o crea un progetto...", + "noMatchingProjects": "Nessun progetto corrispondente", + "creatingProject": "Creazione...", + "createProject": "+ Crea", + "recurrenceSettings": "Impostazioni Ricorrenza", + "completionBasedHelp": "Se selezionato, la prossima attività verrà creata basandosi sulla data di completamento invece che sulla data di scadenza", + "dueDatePlaceholder": "Seleziona data di scadenza", + "endDatePlaceholder": "Seleziona data di fine", + "nameHelper": { + "title": "Rendila più descrittiva!", + "suggestion": "Prova ad aggiungere più dettagli come \"Chiamare il dentista per programmare l'appuntamento per la pulizia\" invece di solo \"Chiamare il dentista\"", + "short": "Rendila più descrittiva!", + "noVerb": "Aggiungi un verbo d'azione!", + "vague": "Sii più specifico!" + }, + "suggestions": { + "short": "Prova a essere più specifico su cosa deve essere fatto", + "noVerb": "Quale azione specifica devi intraprendere? Prova a iniziare con un verbo.", + "vague": "Prova a iniziare con un verbo d'azione come \"Chiamare\", \"Scrivere\", \"Programmare\", o \"Ricercare\"" + } + }, + "noteTitle": "Titolo Nota", + "noteContent": "Contenuto Nota", + "noteTitlePlaceholder": "Inserisci titolo nota", + "noteContentPlaceholder": "Inserisci contenuto nota", + "areaName": "Nome Area", + "areaDescription": "Descrizione Area", + "areaNamePlaceholder": "Inserisci nome area", + "areaDescriptionPlaceholder": "Inserisci descrizione area", + "tagName": "Nome Tag", + "tagNamePlaceholder": "Inserisci nome tag", + "tagInputPlaceholder": "Digita per aggiungere un tag", + "createTagOption": "+ Crea \"{{tagName}}\"", + "removeTagAriaLabel": "Rimuovi tag {{tagName}}" + }, + "auth": { + "login": "Accedi", + "register": "Registrati", + "forgotPassword": "Password Dimenticata", + "email": "Email", + "password": "Password", + "confirmPassword": "Conferma Password", + "username": "Nome Utente", + "signup": "Iscriviti", + "signin": "Accedi", + "signout": "Disconnetti", + "resetPassword": "Reimposta Password", + "newPassword": "Nuova Password", + "rememberMe": "Ricordami", + "loginSuccess": "Accesso Riuscito", + "loginFailed": "Accesso Fallito", + "logoutSuccess": "Disconnessione Riuscita" + }, + "dropdown": { + "createNew": "Crea Nuovo", + "task": "Attività", + "project": "Progetto", + "note": "Nota", + "area": "Area" + }, + "sort": { + "due_date": "Data di Scadenza", + "name": "Nome", + "priority": "Priorità", + "status": "Stato", + "created_at": "Data di Creazione" + }, + "priority": { + "low": "Bassa", + "medium": "Media", + "high": "Alta" + }, + "status": { + "notStarted": "Non Iniziata", + "inProgress": "In Corso", + "done": "Completata", + "archived": "Archiviata", + "unknown": "Sconosciuto" + }, + "project": { + "name": "Nome Progetto", + "projectImage": "Immagine Progetto", + "uploadImageHint": "Carica un'immagine per il tuo progetto (max 5MB)", + "browseImage": "Sfoglia Immagine", + "noNotes": "Nessuna nota per questo progetto.", + "deleteProject": "Elimina Progetto", + "createSuccess": "Progetto creato con successo!" + }, + "errors": { + "required": "Questo campo è obbligatorio", + "invalidEmail": "Indirizzo email non valido", + "projectCreationFailed": "Creazione progetto fallita.", + "passwordMismatch": "Le password non corrispondono", + "minLength": "La lunghezza minima è {{length}} caratteri", + "maxLength": "La lunghezza massima è {{length}} caratteri", + "serverError": "Errore del server, riprova più tardi", + "networkError": "Errore di rete, controlla la tua connessione", + "somethingWentWrong": "Qualcosa è andato storto, riprova", + "taskFetch": "Impossibile recuperare le attività.", + "projectFetch": "Impossibile recuperare i progetti.", + "taskCreate": "Impossibile creare l'attività.", + "taskUpdate": "Impossibile aggiornare l'attività.", + "taskDelete": "Impossibile eliminare l'attività.", + "noteTitleRequired": "Il titolo della nota è obbligatorio.", + "failedToLoadTags": "Impossibile caricare i tag disponibili.", + "failedToSaveNote": "Impossibile salvare la nota.", + "areaNameRequired": "Il nome dell'area è obbligatorio.", + "failedToSaveArea": "Impossibile salvare l'area.", + "tagNameRequired": "Il nome del tag è obbligatorio.", + "failedToSaveTag": "Impossibile salvare il tag.", + "projectNameRequired": "Il nome del progetto è obbligatorio.", + "projectSaveFailed": "Impossibile salvare il progetto." + }, + "inbox": { + "title": "Inbox", + "empty": "La tua inbox è vuota", + "emptyDescription": "Cattura pensieri e idee rapidamente usando l'icona ⚡ nella barra di navigazione superiore o il pulsante + nella barra laterale", + "description": "L'Inbox è dove si trovano tutte le attività non categorizzate. Le attività che non sono state assegnate a un progetto o non hanno una data di scadenza appariranno qui. Questa è la tua area di 'scarico mentale' dove puoi annotare rapidamente le attività e organizzarle in seguito.", + "captureThought": "Cattura il tuo pensiero...", + "saveToInbox": "Salva nell'Inbox", + "itemAdded": "Elemento aggiunto all'inbox", + "itemProcessed": "Elemento elaborato", + "itemDeleted": "Elemento eliminato", + "itemUpdated": "Elemento aggiornato", + "newTelegramItem": "Nuovo elemento da Telegram: {{content}}", + "newItem": "Nuovo elemento inbox aggiunto: {{content}}", + "multipleNewItems": "{{count}} altri nuovi elementi aggiunti", + "loadError": "Impossibile caricare gli elementi dell'inbox", + "addError": "Impossibile aggiungere l'elemento all'inbox", + "processError": "Impossibile elaborare l'elemento dell'inbox", + "deleteError": "Impossibile eliminare l'elemento dell'inbox", + "updateError": "Impossibile aggiornare l'elemento dell'inbox", + "contentRequired": "Il contenuto non può essere vuoto", + "createTask": "Crea attività", + "createProject": "Crea progetto", + "createNote": "Crea nota", + "convertTo": "Converti in", + "unprocessedItems": "Hai {{count}} elemento(i) nella tua inbox", + "processNow": "Elabora ora", + "deleteConfirmTitle": "Elimina Elemento", + "deleteConfirmMessage": "Sei sicuro di voler eliminare questo elemento dalla tua inbox? Questa azione non può essere annullata." + }, + "dateFormats": { + "long": "EEEE, d MMMM yyyy", + "short": "d MMM yyyy", + "monthYear": "MMMM yyyy", + "dayMonth": "d MMMM", + "time": "HH:mm", + "dateTime": "d MMM yyyy HH:mm", + "todayHeader": "dddd, d MMMM yyyy" + }, + "dateIndicators": { + "today": "OGGI", + "tomorrow": "DOMANI", + "yesterday": "IERI" + }, + "taskViews": { + "project": { + "withName": "Stai attualmente visualizzando tutte le attività associate al progetto \"{{projectName}}\". Puoi organizzare le attività all'interno di questo progetto, impostare la loro priorità e tracciare il loro completamento. Usa questo spazio per concentrarti sulle attività che appartengono specificamente a questo progetto.", + "noName": "Stai visualizzando le attività per un progetto specifico. Usa questo spazio per gestire e tracciare le attività associate a questo progetto." + }, + "today": "Queste sono le attività che scadono oggi o che hai programmato per l'attenzione immediata. Usa questa vista per concentrarti su ciò che deve essere completato oggi. Contrassegna le attività come completate, aggiorna il loro stato o regola le loro date di scadenza se necessario.", + "inbox": "L'inbox è dove vivono tutte le attività non categorizzate. Le attività che non sono state assegnate a un progetto o non hanno una data di scadenza appariranno qui. Questa è la tua area di \"scarico mentale\" dove puoi annotare rapidamente le attività e organizzarle in seguito.", + "next": "Questa vista mostra tutte le attività che sono attuabili nel prossimo futuro. Queste attività sono pronte per essere lavorate e non hanno scadenze a lungo termine. È un buon posto su cui concentrarsi quando stai cercando di fare progressi rapidi sulle attività.", + "upcoming": "Questa vista evidenzia le attività che sono programmate per la prossima settimana. Ti aiuta a prepararti e stare avanti alle scadenze dandoti una panoramica del lavoro che devi affrontare nel prossimo futuro. Le attività con date di scadenza entro i prossimi 7 giorni appariranno qui.", + "someday": "La vista \"Un giorno\" è per le attività che non sono urgenti e non hanno una data di scadenza specifica. Queste sono attività che potresti voler fare a un certo punto, ma non sono una priorità al momento. Usa questa sezione per tenere traccia di idee o obiettivi a lungo termine.", + "completed": "Qui puoi vedere tutte le attività che hai completato. È un ottimo modo per rivedere i tuoi risultati e riflettere sul lavoro che hai finito. Puoi anche trovare attività che potrebbero aver bisogno di essere ripristinate o referenziate in futuro.", + "allTasks": "Stai visualizzando tutte le attività. Questo include attività da diversi progetti, attività senza date di scadenza specifiche e attività con livelli di priorità diversi. Usa questa vista per una panoramica generale di tutto nella tua lista delle cose da fare." + }, + "success": { + "noteUpdated": "Nota aggiornata con successo!", + "noteCreated": "Nota creata con successo!", + "areaUpdated": "Area aggiornata con successo!", + "areaCreated": "Area creata con successo!", + "tagUpdated": "Tag aggiornato con successo!", + "tagCreated": "Tag creato con successo!", + "projectCreated": "Progetto creato con successo!", + "projectDeleted": "Progetto eliminato con successo!", + "nextActionAdded": "Prossima azione aggiunta con successo!", + "taskCreated": "Attività creata con successo!", + "taskUpdated": "Attività aggiornata con successo!", + "taskDeleted": "Attività eliminata con successo!", + "noteDeleted": "Nota eliminata con successo!" + }, + "note": { + "title": "Titolo", + "content": "Contenuto", + "titlePlaceholder": "Inserisci titolo nota", + "contentPlaceholder": "Inserisci contenuto nota", + "project": "Progetto Correlato (Opzionale)", + "createSuccess": "Nota creata con successo", + "createError": "Errore nella creazione della nota" + }, + "task": { + "labels": { + "tags": "Tag", + "project": "Progetto", + "status": "Stato", + "priority": "Priorità", + "dueDate": "Data di Scadenza", + "note": "Nota" + }, + "create": "Crea", + "addTaskName": "Aggiungi nome attività", + "createSuccess": "Attività creata con successo", + "createError": "Impossibile creare l'attività", + "saveAsTask": "Salva come Attività", + "updateSuccess": "Attività aggiornata con successo", + "updateError": "Impossibile aggiornare l'attività", + "deleteSuccess": "Attività eliminata con successo", + "deleteError": "Impossibile eliminare l'attività", + "startedSuccessfully": "Attività avviata con successo!", + "created": "Attività", + "createdSuccessfully": "creata con successo!", + "updated": "Attività", + "updatedSuccessfully": "aggiornata con successo!", + "deleted": "Attività", + "deletedSuccessfully": "eliminata con successo!", + "suggestions": { + "short": "Prova a essere più specifico su cosa deve essere fatto" + }, + "nameHelper": { + "title": "Rendila più descrittiva!", + "suggestion": "Prova ad aggiungere più dettagli come \"Chiamare il dentista per programmare l'appuntamento per la pulizia\" invece di solo \"Chiamare il dentista\"" + } + }, + "projects": { + "loading": "Caricamento progetti...", + "error": "Errore nel caricamento dei progetti", + "searchPlaceholder": "Cerca progetti...", + "title": "Progetti", + "noProjectsFound": "Nessun progetto trovato", + "cardViewAriaLabel": "Vista a Carte", + "listViewAriaLabel": "Vista a Lista", + "active": "Attivo", + "inactive": "Inattivo", + "metrics": "Progetti", + "filters": { + "active": "Attivo", + "inactive": "Inattivo", + "all": "Tutti", + "allAreas": "Tutte le Aree" + } + }, + "projectItem": { + "edit": "Modifica", + "delete": "Elimina", + "completion": "Completamento", + "completionPercentage": "{{percentage}}% completato", + "toggleDropdownMenu": "Attiva/disattiva menu a discesa", + "projectInitials": "Iniziali progetto" + }, + "areas": { + "title": "Aree", + "noAreasFound": "Nessuna area trovata", + "editAreaAriaLabel": "Modifica area {{name}}", + "editAreaTitle": "Modifica area {{name}}", + "deleteAreaAriaLabel": "Elimina area {{name}}", + "deleteAreaTitle": "Elimina area {{name}}", + "addArea": "Aggiungi Area", + "loading": "Caricamento dettagli area...", + "error": "Errore nel caricamento dei dettagli dell'area.", + "notFound": "Area non trovata.", + "details": "Dettagli Area", + "viewProjects": "Visualizza Progetti in {{name}}" + }, + "notes": { + "loading": "Caricamento note...", + "error": "Errore nel caricamento delle note", + "searchPlaceholder": "Cerca note...", + "noNotesFound": "Nessuna nota trovata", + "title": "Note", + "deleteNoteAriaLabel": "Elimina nota {{noteTitle}}", + "deleteNoteTitle": "Elimina nota {{noteTitle}}", + "editNoteAriaLabel": "Modifica nota {{noteTitle}}", + "editNoteTitle": "Modifica nota {{noteTitle}}" + }, + "tags": { + "loading": "Caricamento tag...", + "searchPlaceholder": "Cerca tag...", + "title": "Tag", + "noTagsFound": "Nessun tag trovato", + "editTagAriaLabel": "Modifica tag {{tagName}}", + "editTagTitle": "Modifica tag {{tagName}}", + "deleteTagAriaLabel": "Elimina tag {{tagName}}", + "deleteTagTitle": "Elimina tag {{tagName}}", + "error": "Errore nel recupero del tag.", + "notFound": "Tag non trovato.", + "details": "Dettagli Tag", + "name": "Nome", + "status": "Stato", + "active": "Attivo", + "inactive": "Inattivo", + "viewTasksWithTag": "Visualizza attività con questo tag", + "typeToAdd": "Digita per aggiungere un tag", + "noItemsWithTag": "Nessun elemento trovato con questo tag" + }, + "recurrence": { + "none": "Nessuna", + "daily": "Giornaliera", + "weekly": "Settimanale", + "monthly": "Mensile", + "monthlyWeekday": "Mensile nel giorno della settimana", + "monthlyLastDay": "Mensile nell'ultimo giorno", + "firstWeek": "Prima settimana", + "secondWeek": "Seconda settimana", + "thirdWeek": "Terza settimana", + "fourthWeek": "Quarta settimana", + "lastWeek": "Ultima settimana", + "days": "giorni" + }, + "weekdays": { + "sunday": "Domenica", + "monday": "Lunedì", + "tuesday": "Martedì", + "wednesday": "Mercoledì", + "thursday": "Giovedì", + "friday": "Venerdì", + "saturday": "Sabato" + }, + "pomodoro": { + "play": "Riproduci", + "pause": "Pausa", + "reset": "Reimposta", + "close": "Chiudi", + "complete": "Pomodoro Completato!", + "completeMessage": "Ottimo lavoro! È ora di una pausa.", + "done": "Fatto" + }, + "calendar": { + "month": "Mese", + "week": "Settimana", + "day": "Giorno", + "today": "Oggi", + "addEvent": "Aggiungi Evento", + "weekView": "Vista Settimana", + "dayView": "Vista Giorno", + "loadingTasks": "Caricamento attività...", + "noEvents": "Nessun evento per questo giorno", + "moreEvents": "altro", + "googleIntegration": "Integrazione Google Calendar", + "googleDescription": "Collega il tuo Google Calendar per sincronizzare gli eventi e vederli insieme alle tue attività.", + "googleStatus": "Stato", + "notConnected": "Non Connesso", + "connected": "Connesso", + "connectGoogle": "Collega Google Calendar", + "disconnectGoogle": "Scollega Google Calendar", + "connecting": "Connessione...", + "connectionError": "Impossibile connettersi a Google Calendar. Riprova.", + "disconnectionError": "Impossibile scollegarsi da Google Calendar. Riprova.", + "taskDetails": "Dettagli Attività", + "editTask": "Modifica Attività", + "goToTasks": "Vai alle Attività", + "close": "Chiudi", + "title": "Titolo", + "status": "Stato", + "dueDate": "Data di Scadenza", + "priority": "Priorità", + "project": "Progetto", + "area": "Area", + "description": "Descrizione", + "created": "Creato", + "completed": "Completato", + "pending": "In Sospeso", + "high": "Alta", + "medium": "Media", + "low": "Bassa", + "time": "Ora", + "allDay": "Tutto il giorno" + } +} \ No newline at end of file diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 3528fe9..f67dfe9 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -117,6 +117,7 @@ "ukrainian": "ウクライナ語", "deutsch": "ドイツ語", "japanese": "日本語", + "italian": "イタリア語", "pollingNote": "ポーリングはTelegramからの新しいメッセージを定期的にチェックし、受信トレイに追加します。", "pollingDescription": "ポーリングはTelegramからの新しいメッセージを定期的にチェックし、受信トレイに追加します。", "startPolling": "ポーリング開始", @@ -264,7 +265,8 @@ "monthYear": "MMMM yyyy", "dayMonth": "MMMM d", "time": "h:mm a", - "dateTime": "MMM d, yyyy h:mm a" + "dateTime": "MMM d, yyyy h:mm a", + "todayHeader": "dddd, yyyy年M月d日" }, "taskViews": { "project": { @@ -374,7 +376,8 @@ "browseImage": "画像を参照", "noNotes": "このプロジェクトにはメモがありません。", "deleteProject": "プロジェクトを削除", - "showCompleted": "完了済みを表示" + "showCompleted": "完了済みを表示", + "createSuccess": "プロジェクトが正常に作成されました!" }, "profile": { "taskIntelligence": "タスクインテリジェンス", diff --git a/public/locales/ua/translation.json b/public/locales/ua/translation.json index 1d7d5f6..ad0d78e 100644 --- a/public/locales/ua/translation.json +++ b/public/locales/ua/translation.json @@ -241,7 +241,8 @@ "browseImage": "Вибрати Зображення", "noNotes": "Немає нотаток для цього проекту.", "deleteProject": "Видалити Проект", - "showCompleted": "Показати Завершені" + "showCompleted": "Показати Завершені", + "createSuccess": "Проект успішно створено!" }, "profile": { "title": "Налаштування Профілю", @@ -254,6 +255,7 @@ "ukrainian": "Українська", "deutsch": "Німецька", "japanese": "Японська", + "italian": "Італійська", "pollingNote": "Опитування періодично перевіряє нові повідомлення з Telegram і додає їх до вашої вхідної скриньки.", "pollingDescription": "Опитування періодично перевіряє нові повідомлення з Telegram і додає їх до вашої вхідної скриньки.", "startPolling": "Почати опитування", @@ -377,5 +379,14 @@ "friday": "Пт", "saturday": "Сб", "sunday": "Нд" + }, + "dateFormats": { + "long": "EEEE, d MMMM yyyy", + "short": "d MMM yyyy", + "monthYear": "MMMM yyyy", + "dayMonth": "d MMMM", + "time": "HH:mm", + "dateTime": "d MMM yyyy, HH:mm", + "todayHeader": "dddd, d MMMM yyyy 'р.'" } }