feat(todo/web, shared-i18n): complete i18n for Todo web app + add missing common translations

Extract ~120 hardcoded German strings from 14 Svelte components into i18n locale
files using svelte-i18n $t() calls. Add new translation sections (taskForm, filters,
tags, subtasks, durationPicker, kanban, toolbar) across all 5 languages (de/en/fr/es/it).

Also add missing shared common translations for Spanish, French, and Italian
(150+ keys each) in packages/shared-i18n.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-01 14:19:48 +02:00
parent 5c66492279
commit cb85fba820
30 changed files with 2145 additions and 248 deletions

View file

@ -0,0 +1,172 @@
{
"common": {
"actions": {
"save": "Guardar",
"cancel": "Cancelar",
"delete": "Eliminar",
"edit": "Editar",
"create": "Crear",
"update": "Actualizar",
"close": "Cerrar",
"confirm": "Confirmar",
"submit": "Enviar",
"back": "Atrás",
"next": "Siguiente",
"done": "Hecho",
"retry": "Reintentar",
"refresh": "Actualizar",
"search": "Buscar",
"filter": "Filtrar",
"sort": "Ordenar",
"share": "Compartir",
"copy": "Copiar",
"download": "Descargar",
"upload": "Subir",
"select": "Seleccionar",
"clear": "Vaciar",
"reset": "Restablecer",
"apply": "Aplicar",
"continue": "Continuar",
"skip": "Omitir",
"yes": "Sí",
"no": "No",
"ok": "OK"
},
"labels": {
"loading": "Cargando...",
"saving": "Guardando...",
"deleting": "Eliminando...",
"processing": "Procesando...",
"uploading": "Subiendo...",
"downloading": "Descargando...",
"searching": "Buscando...",
"noResults": "No se encontraron resultados",
"noData": "No hay datos disponibles",
"empty": "Vacío",
"all": "Todos",
"none": "Ninguno",
"other": "Otro",
"more": "Más",
"less": "Menos",
"showMore": "Mostrar más",
"showLess": "Mostrar menos",
"viewAll": "Ver todo",
"required": "Obligatorio",
"optional": "Opcional",
"new": "Nuevo",
"recent": "Reciente",
"popular": "Popular",
"featured": "Destacado"
},
"time": {
"now": "Ahora",
"today": "Hoy",
"yesterday": "Ayer",
"tomorrow": "Mañana",
"thisWeek": "Esta semana",
"lastWeek": "La semana pasada",
"thisMonth": "Este mes",
"lastMonth": "El mes pasado",
"thisYear": "Este año",
"ago": "hace",
"in": "en"
},
"status": {
"active": "Activo",
"inactive": "Inactivo",
"pending": "Pendiente",
"completed": "Completado",
"failed": "Fallido",
"cancelled": "Cancelado",
"success": "Éxito",
"error": "Error",
"warning": "Advertencia",
"info": "Info"
}
},
"errors": {
"generic": "Algo salió mal. Por favor, inténtalo de nuevo.",
"network": "Error de red. Por favor, comprueba tu conexión.",
"timeout": "Tiempo de espera agotado. Por favor, inténtalo de nuevo.",
"notFound": "El elemento solicitado no fue encontrado.",
"unauthorized": "No tienes autorización para realizar esta acción.",
"forbidden": "Acceso denegado.",
"serverError": "Error del servidor. Por favor, inténtalo más tarde.",
"validation": "Por favor, revisa tu entrada e inténtalo de nuevo.",
"unknown": "Ocurrió un error desconocido.",
"offline": "Estás sin conexión. Por favor, comprueba tu conexión a internet.",
"sessionExpired": "Tu sesión ha expirado. Por favor, inicia sesión de nuevo.",
"rateLimited": "Demasiadas solicitudes. Por favor, espera un momento e inténtalo de nuevo."
},
"validation": {
"required": "Este campo es obligatorio",
"email": "Por favor, introduce una dirección de correo válida",
"minLength": "Debe tener al menos {min} caracteres",
"maxLength": "Debe tener como máximo {max} caracteres",
"min": "Debe ser al menos {min}",
"max": "Debe ser como máximo {max}",
"pattern": "Formato no válido",
"match": "Los campos no coinciden",
"unique": "Este valor ya está en uso",
"invalid": "Valor no válido",
"url": "Por favor, introduce una URL válida",
"phone": "Por favor, introduce un número de teléfono válido",
"number": "Por favor, introduce un número válido",
"integer": "Por favor, introduce un número entero",
"positive": "Debe ser un número positivo",
"date": "Por favor, introduce una fecha válida",
"futureDate": "La fecha debe ser en el futuro",
"pastDate": "La fecha debe ser en el pasado",
"password": {
"minLength": "La contraseña debe tener al menos {min} caracteres",
"uppercase": "La contraseña debe contener una letra mayúscula",
"lowercase": "La contraseña debe contener una letra minúscula",
"number": "La contraseña debe contener un número",
"special": "La contraseña debe contener un carácter especial",
"weak": "La contraseña es demasiado débil"
}
},
"auth": {
"signIn": "Iniciar sesión",
"signOut": "Cerrar sesión",
"signUp": "Registrarse",
"forgotPassword": "¿Olvidaste tu contraseña?",
"resetPassword": "Restablecer contraseña",
"changePassword": "Cambiar contraseña",
"email": "Correo electrónico",
"password": "Contraseña",
"confirmPassword": "Confirmar contraseña",
"rememberMe": "Recordarme",
"orContinueWith": "O continuar con",
"alreadyHaveAccount": "¿Ya tienes una cuenta?",
"dontHaveAccount": "¿No tienes una cuenta?",
"errors": {
"invalidCredentials": "Correo electrónico o contraseña no válidos",
"emailInUse": "Este correo electrónico ya está en uso",
"weakPassword": "La contraseña es demasiado débil",
"userNotFound": "Usuario no encontrado",
"tooManyAttempts": "Demasiados intentos. Por favor, inténtalo más tarde."
}
},
"settings": {
"title": "Ajustes",
"account": "Cuenta",
"profile": "Perfil",
"preferences": "Preferencias",
"notifications": "Notificaciones",
"privacy": "Privacidad",
"security": "Seguridad",
"language": "Idioma",
"theme": "Tema",
"appearance": "Apariencia",
"darkMode": "Modo oscuro",
"lightMode": "Modo claro",
"systemDefault": "Predeterminado del sistema",
"about": "Acerca de",
"help": "Ayuda",
"feedback": "Comentarios",
"terms": "Términos de servicio",
"privacyPolicy": "Política de privacidad",
"version": "Versión"
}
}

View file

@ -0,0 +1,172 @@
{
"common": {
"actions": {
"save": "Enregistrer",
"cancel": "Annuler",
"delete": "Supprimer",
"edit": "Modifier",
"create": "Créer",
"update": "Mettre à jour",
"close": "Fermer",
"confirm": "Confirmer",
"submit": "Envoyer",
"back": "Retour",
"next": "Suivant",
"done": "Terminé",
"retry": "Réessayer",
"refresh": "Actualiser",
"search": "Rechercher",
"filter": "Filtrer",
"sort": "Trier",
"share": "Partager",
"copy": "Copier",
"download": "Télécharger",
"upload": "Importer",
"select": "Sélectionner",
"clear": "Vider",
"reset": "Réinitialiser",
"apply": "Appliquer",
"continue": "Continuer",
"skip": "Passer",
"yes": "Oui",
"no": "Non",
"ok": "OK"
},
"labels": {
"loading": "Chargement...",
"saving": "Enregistrement...",
"deleting": "Suppression...",
"processing": "Traitement...",
"uploading": "Importation...",
"downloading": "Téléchargement...",
"searching": "Recherche...",
"noResults": "Aucun résultat trouvé",
"noData": "Aucune donnée disponible",
"empty": "Vide",
"all": "Tous",
"none": "Aucun",
"other": "Autre",
"more": "Plus",
"less": "Moins",
"showMore": "Afficher plus",
"showLess": "Afficher moins",
"viewAll": "Tout afficher",
"required": "Obligatoire",
"optional": "Facultatif",
"new": "Nouveau",
"recent": "Récent",
"popular": "Populaire",
"featured": "En vedette"
},
"time": {
"now": "Maintenant",
"today": "Aujourd'hui",
"yesterday": "Hier",
"tomorrow": "Demain",
"thisWeek": "Cette semaine",
"lastWeek": "La semaine dernière",
"thisMonth": "Ce mois-ci",
"lastMonth": "Le mois dernier",
"thisYear": "Cette année",
"ago": "il y a",
"in": "dans"
},
"status": {
"active": "Actif",
"inactive": "Inactif",
"pending": "En attente",
"completed": "Terminé",
"failed": "Échoué",
"cancelled": "Annulé",
"success": "Succès",
"error": "Erreur",
"warning": "Avertissement",
"info": "Info"
}
},
"errors": {
"generic": "Une erreur s'est produite. Veuillez réessayer.",
"network": "Erreur réseau. Veuillez vérifier votre connexion.",
"timeout": "Délai d'attente dépassé. Veuillez réessayer.",
"notFound": "L'élément demandé n'a pas été trouvé.",
"unauthorized": "Vous n'êtes pas autorisé à effectuer cette action.",
"forbidden": "Accès refusé.",
"serverError": "Erreur serveur. Veuillez réessayer plus tard.",
"validation": "Veuillez vérifier votre saisie et réessayer.",
"unknown": "Une erreur inconnue s'est produite.",
"offline": "Vous êtes hors ligne. Veuillez vérifier votre connexion internet.",
"sessionExpired": "Votre session a expiré. Veuillez vous reconnecter.",
"rateLimited": "Trop de requêtes. Veuillez patienter un instant et réessayer."
},
"validation": {
"required": "Ce champ est obligatoire",
"email": "Veuillez saisir une adresse e-mail valide",
"minLength": "Doit contenir au moins {min} caractères",
"maxLength": "Doit contenir au maximum {max} caractères",
"min": "Doit être au moins {min}",
"max": "Doit être au maximum {max}",
"pattern": "Format non valide",
"match": "Les champs ne correspondent pas",
"unique": "Cette valeur est déjà utilisée",
"invalid": "Valeur non valide",
"url": "Veuillez saisir une URL valide",
"phone": "Veuillez saisir un numéro de téléphone valide",
"number": "Veuillez saisir un nombre valide",
"integer": "Veuillez saisir un nombre entier",
"positive": "Doit être un nombre positif",
"date": "Veuillez saisir une date valide",
"futureDate": "La date doit être dans le futur",
"pastDate": "La date doit être dans le passé",
"password": {
"minLength": "Le mot de passe doit contenir au moins {min} caractères",
"uppercase": "Le mot de passe doit contenir une lettre majuscule",
"lowercase": "Le mot de passe doit contenir une lettre minuscule",
"number": "Le mot de passe doit contenir un chiffre",
"special": "Le mot de passe doit contenir un caractère spécial",
"weak": "Le mot de passe est trop faible"
}
},
"auth": {
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"signUp": "S'inscrire",
"forgotPassword": "Mot de passe oublié ?",
"resetPassword": "Réinitialiser le mot de passe",
"changePassword": "Changer le mot de passe",
"email": "E-mail",
"password": "Mot de passe",
"confirmPassword": "Confirmer le mot de passe",
"rememberMe": "Se souvenir de moi",
"orContinueWith": "Ou continuer avec",
"alreadyHaveAccount": "Vous avez déjà un compte ?",
"dontHaveAccount": "Vous n'avez pas de compte ?",
"errors": {
"invalidCredentials": "E-mail ou mot de passe non valide",
"emailInUse": "Cet e-mail est déjà utilisé",
"weakPassword": "Le mot de passe est trop faible",
"userNotFound": "Utilisateur non trouvé",
"tooManyAttempts": "Trop de tentatives. Veuillez réessayer plus tard."
}
},
"settings": {
"title": "Paramètres",
"account": "Compte",
"profile": "Profil",
"preferences": "Préférences",
"notifications": "Notifications",
"privacy": "Confidentialité",
"security": "Sécurité",
"language": "Langue",
"theme": "Thème",
"appearance": "Apparence",
"darkMode": "Mode sombre",
"lightMode": "Mode clair",
"systemDefault": "Par défaut du système",
"about": "À propos",
"help": "Aide",
"feedback": "Commentaires",
"terms": "Conditions d'utilisation",
"privacyPolicy": "Politique de confidentialité",
"version": "Version"
}
}

View file

@ -4,8 +4,11 @@
import en from './en.json';
import de from './de.json';
import es from './es.json';
import fr from './fr.json';
import it from './it.json';
export { en, de };
export { en, de, es, fr, it };
/**
* Common translations type
@ -19,6 +22,12 @@ export function getCommonTranslations(locale: string): CommonTranslations {
switch (locale) {
case 'de':
return de;
case 'es':
return es;
case 'fr':
return fr;
case 'it':
return it;
case 'en':
default:
return en;

View file

@ -0,0 +1,172 @@
{
"common": {
"actions": {
"save": "Salva",
"cancel": "Annulla",
"delete": "Elimina",
"edit": "Modifica",
"create": "Crea",
"update": "Aggiorna",
"close": "Chiudi",
"confirm": "Conferma",
"submit": "Invia",
"back": "Indietro",
"next": "Avanti",
"done": "Fatto",
"retry": "Riprova",
"refresh": "Aggiorna",
"search": "Cerca",
"filter": "Filtra",
"sort": "Ordina",
"share": "Condividi",
"copy": "Copia",
"download": "Scarica",
"upload": "Carica",
"select": "Seleziona",
"clear": "Svuota",
"reset": "Reimposta",
"apply": "Applica",
"continue": "Continua",
"skip": "Salta",
"yes": "Sì",
"no": "No",
"ok": "OK"
},
"labels": {
"loading": "Caricamento...",
"saving": "Salvataggio...",
"deleting": "Eliminazione...",
"processing": "Elaborazione...",
"uploading": "Caricamento...",
"downloading": "Scaricamento...",
"searching": "Ricerca...",
"noResults": "Nessun risultato trovato",
"noData": "Nessun dato disponibile",
"empty": "Vuoto",
"all": "Tutti",
"none": "Nessuno",
"other": "Altro",
"more": "Di più",
"less": "Di meno",
"showMore": "Mostra di più",
"showLess": "Mostra di meno",
"viewAll": "Mostra tutto",
"required": "Obbligatorio",
"optional": "Facoltativo",
"new": "Nuovo",
"recent": "Recente",
"popular": "Popolare",
"featured": "In evidenza"
},
"time": {
"now": "Ora",
"today": "Oggi",
"yesterday": "Ieri",
"tomorrow": "Domani",
"thisWeek": "Questa settimana",
"lastWeek": "La settimana scorsa",
"thisMonth": "Questo mese",
"lastMonth": "Il mese scorso",
"thisYear": "Quest'anno",
"ago": "fa",
"in": "tra"
},
"status": {
"active": "Attivo",
"inactive": "Inattivo",
"pending": "In sospeso",
"completed": "Completato",
"failed": "Non riuscito",
"cancelled": "Annullato",
"success": "Successo",
"error": "Errore",
"warning": "Avviso",
"info": "Info"
}
},
"errors": {
"generic": "Qualcosa è andato storto. Per favore, riprova.",
"network": "Errore di rete. Per favore, controlla la tua connessione.",
"timeout": "Tempo scaduto. Per favore, riprova.",
"notFound": "L'elemento richiesto non è stato trovato.",
"unauthorized": "Non sei autorizzato a eseguire questa azione.",
"forbidden": "Accesso negato.",
"serverError": "Errore del server. Per favore, riprova più tardi.",
"validation": "Per favore, controlla i tuoi dati e riprova.",
"unknown": "Si è verificato un errore sconosciuto.",
"offline": "Sei offline. Per favore, controlla la tua connessione internet.",
"sessionExpired": "La tua sessione è scaduta. Per favore, accedi di nuovo.",
"rateLimited": "Troppe richieste. Per favore, attendi un momento e riprova."
},
"validation": {
"required": "Questo campo è obbligatorio",
"email": "Per favore, inserisci un indirizzo e-mail valido",
"minLength": "Deve contenere almeno {min} caratteri",
"maxLength": "Deve contenere al massimo {max} caratteri",
"min": "Deve essere almeno {min}",
"max": "Deve essere al massimo {max}",
"pattern": "Formato non valido",
"match": "I campi non corrispondono",
"unique": "Questo valore è già in uso",
"invalid": "Valore non valido",
"url": "Per favore, inserisci un URL valido",
"phone": "Per favore, inserisci un numero di telefono valido",
"number": "Per favore, inserisci un numero valido",
"integer": "Per favore, inserisci un numero intero",
"positive": "Deve essere un numero positivo",
"date": "Per favore, inserisci una data valida",
"futureDate": "La data deve essere nel futuro",
"pastDate": "La data deve essere nel passato",
"password": {
"minLength": "La password deve contenere almeno {min} caratteri",
"uppercase": "La password deve contenere una lettera maiuscola",
"lowercase": "La password deve contenere una lettera minuscola",
"number": "La password deve contenere un numero",
"special": "La password deve contenere un carattere speciale",
"weak": "La password è troppo debole"
}
},
"auth": {
"signIn": "Accedi",
"signOut": "Esci",
"signUp": "Registrati",
"forgotPassword": "Password dimenticata?",
"resetPassword": "Reimposta password",
"changePassword": "Cambia password",
"email": "E-mail",
"password": "Password",
"confirmPassword": "Conferma password",
"rememberMe": "Ricordami",
"orContinueWith": "Oppure continua con",
"alreadyHaveAccount": "Hai già un account?",
"dontHaveAccount": "Non hai un account?",
"errors": {
"invalidCredentials": "E-mail o password non validi",
"emailInUse": "Questa e-mail è già in uso",
"weakPassword": "La password è troppo debole",
"userNotFound": "Utente non trovato",
"tooManyAttempts": "Troppi tentativi. Per favore, riprova più tardi."
}
},
"settings": {
"title": "Impostazioni",
"account": "Account",
"profile": "Profilo",
"preferences": "Preferenze",
"notifications": "Notifiche",
"privacy": "Privacy",
"security": "Sicurezza",
"language": "Lingua",
"theme": "Tema",
"appearance": "Aspetto",
"darkMode": "Modalità scura",
"lightMode": "Modalità chiara",
"systemDefault": "Predefinito di sistema",
"about": "Informazioni",
"help": "Aiuto",
"feedback": "Feedback",
"terms": "Termini di servizio",
"privacyPolicy": "Informativa sulla privacy",
"version": "Versione"
}
}