feat: add address book, fix email layout, update dependencies

- Address book with JMAP sync and local fallback (contacts CRUD,
  search/filter, composer autocomplete, i18n for 8 languages)
- Fix email layout: remove horizontal scroll, left-side clipping,
  and empty spaces from blocked external images in newsletters
- Update all dependencies to latest compatible versions
- Expand i18n from 3 to 8 languages (added ES, IT, DE, NL, PT)
- Upgrade Next.js to 16.1.6 for security patches
This commit is contained in:
Matthieu MALVACHE
2026-02-16 17:25:20 +01:00
committed by Matthieu MALVACHE
parent 5d60fe5186
commit 8a5bc9b88d
27 changed files with 2927 additions and 968 deletions
+54
View File
@@ -26,6 +26,7 @@
"search_placeholder": "Rechercher un email...",
"storage": "Stockage",
"sign_out": "Se déconnecter",
"contacts": "Contacts",
"settings": "Paramètres",
"loading_mailboxes": "Chargement des boîtes mail...",
"push_connected": "Mises à jour en temps réel actives",
@@ -742,5 +743,58 @@
"identity_short": "via {name}",
"subaddress_tag": "+{tag}"
}
},
"contacts": {
"title": "Contacts",
"search_placeholder": "Rechercher des contacts...",
"create_new": "Nouveau contact",
"empty_state": "Aucun contact",
"empty_search": "Aucun contact ne correspond à votre recherche",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer ce contact ?",
"local_mode": "Les contacts sont stockés localement (le serveur ne prend pas en charge JMAP Contacts)",
"back_to_mail": "Retour aux e-mails",
"detail": {
"emails": "Adresses e-mail",
"phones": "Numéros de téléphone",
"organizations": "Organisations",
"addresses": "Adresses",
"notes": "Notes",
"no_contact_selected": "Sélectionnez un contact pour voir les détails",
"created": "Créé",
"updated": "Dernière mise à jour"
},
"form": {
"create_title": "Nouveau contact",
"edit_title": "Modifier le contact",
"given_name": "Prénom",
"surname": "Nom",
"email": "E-mail",
"email_placeholder": "email@example.com",
"phone": "Téléphone",
"phone_placeholder": "+33 1 23 45 67 89",
"organization": "Organisation",
"organization_placeholder": "Nom de l'entreprise",
"note": "Notes",
"note_placeholder": "Ajouter une note...",
"context_work": "Professionnel",
"context_private": "Personnel",
"add_email": "Ajouter un e-mail",
"add_phone": "Ajouter un téléphone",
"save": "Enregistrer",
"cancel": "Annuler",
"creating": "Création...",
"updating": "Mise à jour...",
"name_required": "Un prénom ou un nom est requis",
"email_invalid": "Veuillez saisir une adresse e-mail valide",
"save_failed": "Échec de l'enregistrement du contact"
},
"toast": {
"created": "Contact créé",
"updated": "Contact mis à jour",
"deleted": "Contact supprimé",
"error_create": "Échec de la création du contact",
"error_update": "Échec de la mise à jour du contact",
"error_delete": "Échec de la suppression du contact"
}
}
}