feat: add contacts phase 2, advanced search, vacation responder, Docker & TOTP 2FA

- Contact groups/lists, vCard import/export (RFC 6350), bulk operations
- Advanced search with JMAP filter panel, search chips, cross-mailbox queries
- Vacation responder with JMAP VacationResponse, settings tab, sidebar indicator
- TOTP two-factor authentication support
- Docker multi-stage build with standalone output and docker-compose
- CSP Report-Only headers and security headers via proxy middleware
- Virtual scrolling for large email lists
- Structured server-side logger (text/JSON, configurable level)
- 450+ tests (contacts, vCard, threads, headers, identity, components)
- Playwright E2E framework setup
- Updated README and ROADMAP with all new features
This commit is contained in:
Matthieu MALVACHE
2026-02-16 18:51:30 +01:00
committed by Matthieu MALVACHE
parent 8a5bc9b88d
commit fb414bf2c9
70 changed files with 8160 additions and 547 deletions
+132 -4
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Ungültige E-Mail-Adresse oder Passwort",
"connection_failed": "Verbindung zum Server fehlgeschlagen",
"generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
"generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
"totp_invalid": "Ungültiger Authentifizierungscode. Überprüfen Sie Ihre Authenticator-App."
},
"config_error": {
"title": "Konfigurationsfehler",
"fetch_failed": "Die Anwendungskonfiguration kann nicht geladen werden. Bitte versuchen Sie es später erneut.",
"server_not_configured": "Der E-Mail-Server wurde nicht konfiguriert. Bitte kontaktieren Sie Ihren Administrator."
},
"remove_from_history": "Aus Verlauf entfernen"
"remove_from_history": "Aus Verlauf entfernen",
"totp_toggle": "Ich habe Zwei-Faktor-Authentifizierung",
"totp_label": "Authentifizierungscode",
"totp_placeholder": "000000",
"totp_hide": "Zwei-Faktor-Authentifizierung ausblenden"
},
"sidebar": {
"close": "Schließen",
@@ -59,7 +64,8 @@
"compose": "Verfassen",
"go_back": "Zurück"
},
"clear_search": "Suche löschen"
"clear_search": "Suche löschen",
"vacation_active": "Abwesenheitsnotiz ist aktiv"
},
"email_list": {
"no_emails": "Keine E-Mails",
@@ -313,7 +319,9 @@
"identity_update_failed": "Identität aktualisieren fehlgeschlagen: {{error}}",
"identity_delete_failed": "Identität löschen fehlgeschlagen: {{error}}",
"identity_unauthorized": "Sie sind nicht autorisiert, von dieser E-Mail-Adresse zu senden",
"identity_not_found": "Identität nicht gefunden"
"identity_not_found": "Identität nicht gefunden",
"vacation_saved": "Abwesenheitsnotiz-Einstellungen gespeichert",
"vacation_save_failed": "Fehler beim Speichern der Abwesenheitsnotiz-Einstellungen"
},
"date": {
"today": "Heute",
@@ -366,6 +374,7 @@
"privacy": "Datenschutz & Sicherheit",
"account": "Konto",
"identities": "Identitäten",
"vacation": "Abwesenheitsnotiz",
"advanced": "Erweitert"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Mehr erfahren"
}
},
"vacation": {
"title": "Abwesenheitsnotiz",
"description": "Automatisch auf eingehende E-Mails antworten, während Sie abwesend sind",
"loading": "Abwesenheitseinstellungen werden geladen...",
"not_supported": "Ihr Mailserver unterstützt keine Abwesenheitsantworten.",
"fetch_error": "Fehler beim Laden der Abwesenheitseinstellungen. Bitte versuchen Sie es erneut.",
"status": {
"label": "Abwesenheitsnotiz",
"description": "Senden Sie eine automatische Antwort an Personen, die Ihnen eine E-Mail senden",
"active": "Aktiv",
"inactive": "Inaktiv"
},
"date_range": {
"title": "Zeitraum",
"description": "Optional die automatische Antwort auf einen bestimmten Zeitraum beschränken",
"start": "Startdatum",
"start_description": "Leer lassen für kein Startlimit",
"end": "Enddatum",
"end_description": "Leer lassen für kein Endlimit"
},
"message": {
"title": "Automatische Antwortnachricht",
"description": "Die Nachricht, die als Antwort gesendet wird",
"subject_label": "Betreff",
"subject_description": "Betreffzeile der automatischen Antwort",
"subject_placeholder": "Abwesenheitsnotiz",
"body_label": "Nachrichtentext",
"body_description": "Nur-Text-Nachrichteninhalt",
"body_placeholder": "Vielen Dank für Ihre E-Mail. Ich bin derzeit nicht im Büro und werde nach meiner Rückkehr antworten."
},
"preview": {
"title": "Vorschau",
"show": "Vorschau anzeigen",
"hide": "Vorschau ausblenden"
},
"save": "Änderungen speichern",
"saving": "Speichern...",
"warnings": {
"end_before_start": "Das Enddatum muss nach dem Startdatum liegen",
"start_in_past": "Das Startdatum liegt in der Vergangenheit",
"empty_body": "Der Nachrichtentext ist leer — Empfänger erhalten eine leere Antwort"
}
},
"advanced": {
"title": "Erweitert",
"description": "Erweiterte Optionen und Entwicklereinstellungen",
@@ -753,6 +805,10 @@
"delete_confirm": "Möchten Sie diesen Kontakt wirklich löschen?",
"local_mode": "Kontakte werden lokal gespeichert (Server unterstützt kein JMAP Contacts)",
"back_to_mail": "Zurück zur E-Mail",
"tabs": {
"all": "Alle",
"groups": "Gruppen"
},
"detail": {
"emails": "E-Mail-Adressen",
"phones": "Telefonnummern",
@@ -788,6 +844,55 @@
"email_invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein",
"save_failed": "Kontakt konnte nicht gespeichert werden"
},
"groups": {
"create": "Neue Gruppe",
"edit": "Gruppe bearbeiten",
"empty": "Keine Gruppen",
"delete_confirm": "Möchten Sie diese Gruppe wirklich löschen?",
"name_label": "Gruppenname",
"name_placeholder": "z.B. Team, Familie",
"name_required": "Gruppenname ist erforderlich",
"save_failed": "Gruppe konnte nicht gespeichert werden",
"members_label": "Mitglieder",
"search_members": "Kontakte zum Hinzufügen suchen...",
"no_members": "Keine Mitglieder in dieser Gruppe",
"member_count": "{count, plural, =0 {Keine Mitglieder} one {1 Mitglied} other {# Mitglieder}}"
},
"import": {
"title": "Kontakte importieren",
"drop_hint": "Klicken Sie, um eine vCard-Datei auszuwählen",
"file_types": ".vcf- oder .vcard-Dateien",
"no_contacts": "Keine Kontakte in der Datei gefunden",
"parse_error": "vCard-Datei konnte nicht gelesen werden",
"found": "{count, plural, one {1 Kontakt gefunden} other {# Kontakte gefunden}}",
"duplicate": "Duplikat",
"select_all": "Alle auswählen",
"deselect_all": "Alle abwählen",
"selected": "{count, plural, one {1 ausgewählt} other {# ausgewählt}}",
"import_button": "Importieren",
"importing": "Wird importiert...",
"success": "{count, plural, one {1 Kontakt importiert} other {# Kontakte importiert}}",
"failed": "Import fehlgeschlagen",
"close": "Schließen",
"file_too_large": "Datei ist zu groß (max. 5 MB)"
},
"export": {
"title": "Kontakte exportieren",
"success": "{count, plural, one {1 Kontakt exportiert} other {# Kontakte exportiert}}"
},
"bulk": {
"selected": "{count, plural, one {1 ausgewählt} other {# ausgewählt}}",
"select_all": "Alle auswählen",
"delete": "Löschen",
"delete_confirm": "{count, plural, one {1 Kontakt} other {# Kontakte}} löschen?",
"deleted": "{count, plural, one {1 Kontakt gelöscht} other {# Kontakte gelöscht}}",
"add_to_group": "Zur Gruppe hinzufügen",
"choose_group": "Gruppe wählen",
"adding_contacts": "{count, plural, one {1 Kontakt} other {# Kontakte}} hinzufügen",
"added_to_group": "Kontakte zur Gruppe hinzugefügt",
"export": "Exportieren",
"clear": "Auswahl aufheben"
},
"toast": {
"created": "Kontakt erstellt",
"updated": "Kontakt aktualisiert",
@@ -796,5 +901,28 @@
"error_update": "Kontakt konnte nicht aktualisiert werden",
"error_delete": "Kontakt konnte nicht gelöscht werden"
}
},
"advanced_search": {
"title": "Erweiterte Suche",
"from": "Von",
"from_placeholder": "E-Mail oder Name des Absenders",
"to": "An",
"to_placeholder": "E-Mail oder Name des Empfängers",
"subject": "Betreff",
"subject_placeholder": "Betreff enthält...",
"body": "Nachricht",
"has_attachment": "Anhänge",
"date_after": "Nach dem",
"date_before": "Vor dem",
"starred": "Markiert",
"unread": "Ungelesen",
"read": "Gelesen",
"yes": "Ja",
"no": "Nein",
"clear": "Löschen",
"clear_all": "Alle löschen",
"filters_active": "{count} Filter",
"filters_active_plural": "{count} Filter",
"toggle_filters": "Filter"
}
}
+133 -5
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Invalid email or password",
"connection_failed": "Failed to connect to the server",
"generic": "An error occurred. Please try again."
"generic": "An error occurred. Please try again.",
"totp_invalid": "Invalid authentication code. Please check your authenticator app."
},
"config_error": {
"title": "Configuration Error",
"fetch_failed": "Unable to load application configuration. Please try again later.",
"server_not_configured": "The mail server has not been configured. Please contact your administrator."
},
"remove_from_history": "Remove from history"
"remove_from_history": "Remove from history",
"totp_toggle": "I have two-factor authentication",
"totp_label": "Authentication code",
"totp_placeholder": "000000",
"totp_hide": "Hide two-factor authentication"
},
"sidebar": {
"close": "Close",
@@ -59,7 +64,8 @@
"compose": "Compose",
"go_back": "Go back"
},
"clear_search": "Clear search"
"clear_search": "Clear search",
"vacation_active": "Vacation responder is active"
},
"email_list": {
"no_emails": "No emails",
@@ -313,7 +319,9 @@
"identity_update_failed": "Failed to update identity: {{error}}",
"identity_delete_failed": "Failed to delete identity: {{error}}",
"identity_unauthorized": "You are not authorized to send from this email address",
"identity_not_found": "Identity not found"
"identity_not_found": "Identity not found",
"vacation_saved": "Vacation responder settings saved",
"vacation_save_failed": "Failed to save vacation responder settings"
},
"date": {
"today": "Today",
@@ -366,6 +374,7 @@
"privacy": "Privacy & Security",
"account": "Account",
"identities": "Identities",
"vacation": "Vacation Responder",
"advanced": "Advanced"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Learn More"
}
},
"vacation": {
"title": "Vacation Responder",
"description": "Automatically reply to incoming emails while you're away",
"loading": "Loading vacation settings...",
"not_supported": "Your mail server does not support vacation responses.",
"fetch_error": "Failed to load vacation settings. Please try again.",
"status": {
"label": "Vacation Responder",
"description": "Send an automatic reply to people who email you",
"active": "Active",
"inactive": "Inactive"
},
"date_range": {
"title": "Date Range",
"description": "Optionally limit the auto-reply to a specific period",
"start": "Start Date",
"start_description": "Leave empty for no start limit",
"end": "End Date",
"end_description": "Leave empty for no end limit"
},
"message": {
"title": "Auto-Reply Message",
"description": "The message that will be sent as a reply",
"subject_label": "Subject",
"subject_description": "Subject line of the auto-reply",
"subject_placeholder": "Out of Office",
"body_label": "Message Body",
"body_description": "Plain text message content",
"body_placeholder": "Thank you for your email. I am currently out of the office and will respond when I return."
},
"preview": {
"title": "Preview",
"show": "Show preview",
"hide": "Hide preview"
},
"save": "Save Changes",
"saving": "Saving...",
"warnings": {
"end_before_start": "End date must be after start date",
"start_in_past": "Start date is in the past",
"empty_body": "Message body is empty — recipients will receive a blank reply"
}
},
"advanced": {
"title": "Advanced",
"description": "Advanced options and developer settings",
@@ -753,6 +805,10 @@
"delete_confirm": "Are you sure you want to delete this contact?",
"local_mode": "Contacts are stored locally (server does not support JMAP Contacts)",
"back_to_mail": "Back to mail",
"tabs": {
"all": "All",
"groups": "Groups"
},
"detail": {
"emails": "Email Addresses",
"phones": "Phone Numbers",
@@ -788,6 +844,55 @@
"email_invalid": "Please enter a valid email address",
"save_failed": "Failed to save contact"
},
"groups": {
"create": "New Group",
"edit": "Edit Group",
"empty": "No groups yet",
"delete_confirm": "Are you sure you want to delete this group?",
"name_label": "Group Name",
"name_placeholder": "e.g., Team, Family",
"name_required": "Group name is required",
"save_failed": "Failed to save group",
"members_label": "Members",
"search_members": "Search contacts to add...",
"no_members": "No members in this group",
"member_count": "{count, plural, =0 {No members} one {1 member} other {# members}}"
},
"import": {
"title": "Import Contacts",
"drop_hint": "Click to select a vCard file",
"file_types": ".vcf or .vcard files",
"no_contacts": "No contacts found in file",
"parse_error": "Failed to parse vCard file",
"found": "{count, plural, one {1 contact found} other {# contacts found}}",
"duplicate": "Duplicate",
"select_all": "Select all",
"deselect_all": "Deselect all",
"selected": "{count, plural, one {1 selected} other {# selected}}",
"import_button": "Import",
"importing": "Importing...",
"success": "{count, plural, one {1 contact imported} other {# contacts imported}}",
"failed": "Import failed",
"close": "Close",
"file_too_large": "File is too large (max 5 MB)"
},
"export": {
"title": "Export Contacts",
"success": "{count, plural, one {1 contact exported} other {# contacts exported}}"
},
"bulk": {
"selected": "{count, plural, one {1 selected} other {# selected}}",
"select_all": "Select all",
"delete": "Delete",
"delete_confirm": "Delete {count, plural, one {1 contact} other {# contacts}}?",
"deleted": "{count, plural, one {1 contact deleted} other {# contacts deleted}}",
"add_to_group": "Add to group",
"choose_group": "Choose a group",
"adding_contacts": "Adding {count, plural, one {1 contact} other {# contacts}}",
"added_to_group": "Contacts added to group",
"export": "Export",
"clear": "Clear selection"
},
"toast": {
"created": "Contact created",
"updated": "Contact updated",
@@ -796,5 +901,28 @@
"error_update": "Failed to update contact",
"error_delete": "Failed to delete contact"
}
},
"advanced_search": {
"title": "Advanced Search",
"from": "From",
"from_placeholder": "Sender email or name",
"to": "To",
"to_placeholder": "Recipient email or name",
"subject": "Subject",
"subject_placeholder": "Subject contains...",
"body": "Body",
"has_attachment": "Attachments",
"date_after": "After",
"date_before": "Before",
"starred": "Starred",
"unread": "Unread",
"read": "Read",
"yes": "Yes",
"no": "No",
"clear": "Clear",
"clear_all": "Clear all",
"filters_active": "{count} filter",
"filters_active_plural": "{count} filters",
"toggle_filters": "Filters"
}
}
}
+132 -4
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Correo electrónico o contraseña inválidos",
"connection_failed": "No se pudo conectar con el servidor",
"generic": "Ocurrió un error. Por favor, inténtelo de nuevo."
"generic": "Ocurrió un error. Por favor, inténtelo de nuevo.",
"totp_invalid": "Código de autenticación inválido. Verifica tu aplicación de autenticación."
},
"config_error": {
"title": "Error de Configuración",
"fetch_failed": "No se pudo cargar la configuración de la aplicación. Por favor, inténtelo más tarde.",
"server_not_configured": "El servidor de correo no ha sido configurado. Por favor, contacte a su administrador."
},
"remove_from_history": "Eliminar del historial"
"remove_from_history": "Eliminar del historial",
"totp_toggle": "Tengo autenticación de dos factores",
"totp_label": "Código de autenticación",
"totp_placeholder": "000000",
"totp_hide": "Ocultar autenticación de dos factores"
},
"sidebar": {
"close": "Cerrar",
@@ -59,7 +64,8 @@
"compose": "Redactar",
"go_back": "Volver"
},
"clear_search": "Limpiar búsqueda"
"clear_search": "Limpiar búsqueda",
"vacation_active": "Respuesta automática activa"
},
"email_list": {
"no_emails": "Sin correos",
@@ -313,7 +319,9 @@
"identity_update_failed": "Error al actualizar identidad: {{error}}",
"identity_delete_failed": "Error al eliminar identidad: {{error}}",
"identity_unauthorized": "No está autorizado para enviar desde esta dirección de correo",
"identity_not_found": "Identidad no encontrada"
"identity_not_found": "Identidad no encontrada",
"vacation_saved": "Configuración de respuesta automática guardada",
"vacation_save_failed": "Error al guardar la configuración de respuesta automática"
},
"date": {
"today": "Hoy",
@@ -366,6 +374,7 @@
"privacy": "Privacidad y Seguridad",
"account": "Cuenta",
"identities": "Identidades",
"vacation": "Respuesta automática",
"advanced": "Avanzado"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Más Información"
}
},
"vacation": {
"title": "Respuesta automática",
"description": "Responder automáticamente a los correos entrantes mientras está ausente",
"loading": "Cargando configuración de respuesta automática...",
"not_supported": "Su servidor de correo no admite respuestas automáticas de ausencia.",
"fetch_error": "Error al cargar la configuración de respuesta automática. Inténtelo de nuevo.",
"status": {
"label": "Respuesta automática",
"description": "Enviar una respuesta automática a quienes le envíen un correo",
"active": "Activo",
"inactive": "Inactivo"
},
"date_range": {
"title": "Período",
"description": "Opcionalmente limitar la respuesta automática a un período específico",
"start": "Fecha de inicio",
"start_description": "Dejar vacío para sin límite de inicio",
"end": "Fecha de fin",
"end_description": "Dejar vacío para sin límite de fin"
},
"message": {
"title": "Mensaje de respuesta automática",
"description": "El mensaje que se enviará como respuesta",
"subject_label": "Asunto",
"subject_description": "Línea de asunto de la respuesta automática",
"subject_placeholder": "Fuera de la oficina",
"body_label": "Cuerpo del mensaje",
"body_description": "Contenido del mensaje en texto plano",
"body_placeholder": "Gracias por su correo. Actualmente estoy fuera de la oficina y responderé cuando regrese."
},
"preview": {
"title": "Vista previa",
"show": "Mostrar vista previa",
"hide": "Ocultar vista previa"
},
"save": "Guardar cambios",
"saving": "Guardando...",
"warnings": {
"end_before_start": "La fecha de fin debe ser posterior a la fecha de inicio",
"start_in_past": "La fecha de inicio está en el pasado",
"empty_body": "El cuerpo del mensaje está vacío — los destinatarios recibirán una respuesta en blanco"
}
},
"advanced": {
"title": "Avanzado",
"description": "Opciones avanzadas y configuración de desarrollador",
@@ -753,6 +805,10 @@
"delete_confirm": "¿Estás seguro de que quieres eliminar este contacto?",
"local_mode": "Los contactos se almacenan localmente (el servidor no soporta JMAP Contacts)",
"back_to_mail": "Volver al correo",
"tabs": {
"all": "Todos",
"groups": "Grupos"
},
"detail": {
"emails": "Direcciones de correo",
"phones": "Números de teléfono",
@@ -788,6 +844,55 @@
"email_invalid": "Introduce una dirección de correo válida",
"save_failed": "Error al guardar el contacto"
},
"groups": {
"create": "Nuevo grupo",
"edit": "Editar grupo",
"empty": "No hay grupos",
"delete_confirm": "¿Estás seguro de que quieres eliminar este grupo?",
"name_label": "Nombre del grupo",
"name_placeholder": "ej. Equipo, Familia",
"name_required": "El nombre del grupo es obligatorio",
"save_failed": "Error al guardar el grupo",
"members_label": "Miembros",
"search_members": "Buscar contactos para agregar...",
"no_members": "No hay miembros en este grupo",
"member_count": "{count, plural, =0 {Sin miembros} one {1 miembro} other {# miembros}}"
},
"import": {
"title": "Importar contactos",
"drop_hint": "Haz clic para seleccionar un archivo vCard",
"file_types": "Archivos .vcf o .vcard",
"no_contacts": "No se encontraron contactos en el archivo",
"parse_error": "Error al analizar el archivo vCard",
"found": "{count, plural, one {1 contacto encontrado} other {# contactos encontrados}}",
"duplicate": "Duplicado",
"select_all": "Seleccionar todo",
"deselect_all": "Deseleccionar todo",
"selected": "{count, plural, one {1 seleccionado} other {# seleccionados}}",
"import_button": "Importar",
"importing": "Importando...",
"success": "{count, plural, one {1 contacto importado} other {# contactos importados}}",
"failed": "Error en la importación",
"close": "Cerrar",
"file_too_large": "El archivo es demasiado grande (máx. 5 MB)"
},
"export": {
"title": "Exportar contactos",
"success": "{count, plural, one {1 contacto exportado} other {# contactos exportados}}"
},
"bulk": {
"selected": "{count, plural, one {1 seleccionado} other {# seleccionados}}",
"select_all": "Seleccionar todo",
"delete": "Eliminar",
"delete_confirm": "¿Eliminar {count, plural, one {1 contacto} other {# contactos}}?",
"deleted": "{count, plural, one {1 contacto eliminado} other {# contactos eliminados}}",
"add_to_group": "Agregar al grupo",
"choose_group": "Elegir un grupo",
"adding_contacts": "Agregando {count, plural, one {1 contacto} other {# contactos}}",
"added_to_group": "Contactos agregados al grupo",
"export": "Exportar",
"clear": "Limpiar selección"
},
"toast": {
"created": "Contacto creado",
"updated": "Contacto actualizado",
@@ -796,5 +901,28 @@
"error_update": "Error al actualizar el contacto",
"error_delete": "Error al eliminar el contacto"
}
},
"advanced_search": {
"title": "Búsqueda avanzada",
"from": "De",
"from_placeholder": "Email o nombre del remitente",
"to": "Para",
"to_placeholder": "Email o nombre del destinatario",
"subject": "Asunto",
"subject_placeholder": "El asunto contiene...",
"body": "Cuerpo",
"has_attachment": "Adjuntos",
"date_after": "Después de",
"date_before": "Antes de",
"starred": "Destacados",
"unread": "No leídos",
"read": "Leídos",
"yes": "Sí",
"no": "No",
"clear": "Limpiar",
"clear_all": "Limpiar todo",
"filters_active": "{count} filtro",
"filters_active_plural": "{count} filtros",
"toggle_filters": "Filtros"
}
}
+133 -5
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Email ou mot de passe invalide",
"connection_failed": "Échec de la connexion au serveur",
"generic": "Une erreur s'est produite. Veuillez réessayer."
"generic": "Une erreur s'est produite. Veuillez réessayer.",
"totp_invalid": "Code d'authentification invalide. Vérifiez votre application d'authentification."
},
"config_error": {
"title": "Erreur de configuration",
"fetch_failed": "Impossible de charger la configuration de l'application. Veuillez réessayer plus tard.",
"server_not_configured": "Le serveur de messagerie n'a pas été configuré. Veuillez contacter votre administrateur."
},
"remove_from_history": "Supprimer de l'historique"
"remove_from_history": "Supprimer de l'historique",
"totp_toggle": "J'ai l'authentification à deux facteurs",
"totp_label": "Code d'authentification",
"totp_placeholder": "000000",
"totp_hide": "Masquer l'authentification à deux facteurs"
},
"sidebar": {
"close": "Fermer",
@@ -59,7 +64,8 @@
"compose": "Composer",
"go_back": "Retour"
},
"clear_search": "Effacer la recherche"
"clear_search": "Effacer la recherche",
"vacation_active": "Répondeur d'absence activé"
},
"email_list": {
"no_emails": "Aucun email",
@@ -313,7 +319,9 @@
"identity_update_failed": "Échec de la mise à jour de l'identité: {{error}}",
"identity_delete_failed": "Échec de la suppression de l'identité: {{error}}",
"identity_unauthorized": "Vous n'êtes pas autorisé à envoyer depuis cette adresse email",
"identity_not_found": "Identité introuvable"
"identity_not_found": "Identité introuvable",
"vacation_saved": "Paramètres du répondeur d'absence enregistrés",
"vacation_save_failed": "Échec de l'enregistrement des paramètres du répondeur d'absence"
},
"date": {
"today": "Aujourd'hui",
@@ -366,6 +374,7 @@
"privacy": "Confidentialité et sécurité",
"account": "Compte",
"identities": "Identités",
"vacation": "Répondeur d'absence",
"advanced": "Avancé"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "En savoir plus"
}
},
"vacation": {
"title": "Répondeur d'absence",
"description": "Répondre automatiquement aux emails entrants pendant votre absence",
"loading": "Chargement des paramètres d'absence...",
"not_supported": "Votre serveur de messagerie ne prend pas en charge les réponses d'absence.",
"fetch_error": "Échec du chargement des paramètres d'absence. Veuillez réessayer.",
"status": {
"label": "Répondeur d'absence",
"description": "Envoyer une réponse automatique aux personnes qui vous envoient un email",
"active": "Actif",
"inactive": "Inactif"
},
"date_range": {
"title": "Période",
"description": "Limiter optionnellement la réponse automatique à une période spécifique",
"start": "Date de début",
"start_description": "Laisser vide pour aucune limite de début",
"end": "Date de fin",
"end_description": "Laisser vide pour aucune limite de fin"
},
"message": {
"title": "Message de réponse automatique",
"description": "Le message qui sera envoyé en réponse",
"subject_label": "Objet",
"subject_description": "Ligne d'objet de la réponse automatique",
"subject_placeholder": "Absence du bureau",
"body_label": "Corps du message",
"body_description": "Contenu du message en texte brut",
"body_placeholder": "Merci pour votre email. Je suis actuellement absent du bureau et vous répondrai à mon retour."
},
"preview": {
"title": "Aperçu",
"show": "Afficher l'aperçu",
"hide": "Masquer l'aperçu"
},
"save": "Enregistrer les modifications",
"saving": "Enregistrement...",
"warnings": {
"end_before_start": "La date de fin doit être postérieure à la date de début",
"start_in_past": "La date de début est dans le passé",
"empty_body": "Le corps du message est vide — les destinataires recevront une réponse vide"
}
},
"advanced": {
"title": "Avancé",
"description": "Options avancées et paramètres développeur",
@@ -753,6 +805,10 @@
"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",
"tabs": {
"all": "Tous",
"groups": "Groupes"
},
"detail": {
"emails": "Adresses e-mail",
"phones": "Numéros de téléphone",
@@ -788,6 +844,55 @@
"email_invalid": "Veuillez saisir une adresse e-mail valide",
"save_failed": "Échec de l'enregistrement du contact"
},
"groups": {
"create": "Nouveau groupe",
"edit": "Modifier le groupe",
"empty": "Aucun groupe",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer ce groupe ?",
"name_label": "Nom du groupe",
"name_placeholder": "ex. Équipe, Famille",
"name_required": "Le nom du groupe est requis",
"save_failed": "Échec de l'enregistrement du groupe",
"members_label": "Membres",
"search_members": "Rechercher des contacts à ajouter...",
"no_members": "Aucun membre dans ce groupe",
"member_count": "{count, plural, =0 {Aucun membre} one {1 membre} other {# membres}}"
},
"import": {
"title": "Importer des contacts",
"drop_hint": "Cliquez pour sélectionner un fichier vCard",
"file_types": "Fichiers .vcf ou .vcard",
"no_contacts": "Aucun contact trouvé dans le fichier",
"parse_error": "Échec de l'analyse du fichier vCard",
"found": "{count, plural, one {1 contact trouvé} other {# contacts trouvés}}",
"duplicate": "Doublon",
"select_all": "Tout sélectionner",
"deselect_all": "Tout désélectionner",
"selected": "{count, plural, one {1 sélectionné} other {# sélectionnés}}",
"import_button": "Importer",
"importing": "Importation...",
"success": "{count, plural, one {1 contact importé} other {# contacts importés}}",
"failed": "Échec de l'importation",
"close": "Fermer",
"file_too_large": "Fichier trop volumineux (max 5 Mo)"
},
"export": {
"title": "Exporter les contacts",
"success": "{count, plural, one {1 contact exporté} other {# contacts exportés}}"
},
"bulk": {
"selected": "{count, plural, one {1 sélectionné} other {# sélectionnés}}",
"select_all": "Tout sélectionner",
"delete": "Supprimer",
"delete_confirm": "Supprimer {count, plural, one {1 contact} other {# contacts}} ?",
"deleted": "{count, plural, one {1 contact supprimé} other {# contacts supprimés}}",
"add_to_group": "Ajouter au groupe",
"choose_group": "Choisir un groupe",
"adding_contacts": "Ajout de {count, plural, one {1 contact} other {# contacts}}",
"added_to_group": "Contacts ajoutés au groupe",
"export": "Exporter",
"clear": "Effacer la sélection"
},
"toast": {
"created": "Contact créé",
"updated": "Contact mis à jour",
@@ -796,5 +901,28 @@
"error_update": "Échec de la mise à jour du contact",
"error_delete": "Échec de la suppression du contact"
}
},
"advanced_search": {
"title": "Recherche avancée",
"from": "De",
"from_placeholder": "Email ou nom de l'expéditeur",
"to": "À",
"to_placeholder": "Email ou nom du destinataire",
"subject": "Objet",
"subject_placeholder": "L'objet contient...",
"body": "Corps",
"has_attachment": "Pièces jointes",
"date_after": "Après le",
"date_before": "Avant le",
"starred": "Suivis",
"unread": "Non lus",
"read": "Lus",
"yes": "Oui",
"no": "Non",
"clear": "Effacer",
"clear_all": "Tout effacer",
"filters_active": "{count} filtre",
"filters_active_plural": "{count} filtres",
"toggle_filters": "Filtres"
}
}
}
+133 -5
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Email o password non valida",
"connection_failed": "Impossibile connettersi al server",
"generic": "Si è verificato un errore. Riprova."
"generic": "Si è verificato un errore. Riprova.",
"totp_invalid": "Codice di autenticazione non valido. Controlla la tua app di autenticazione."
},
"config_error": {
"title": "Errore di configurazione",
"fetch_failed": "Impossibile caricare la configurazione dell'applicazione. Riprovare più tardi.",
"server_not_configured": "Il server di posta non è stato configurato. Contattare l'amministratore."
},
"remove_from_history": "Rimuovi dalla cronologia"
"remove_from_history": "Rimuovi dalla cronologia",
"totp_toggle": "Ho l'autenticazione a due fattori",
"totp_label": "Codice di autenticazione",
"totp_placeholder": "000000",
"totp_hide": "Nascondi autenticazione a due fattori"
},
"sidebar": {
"close": "Chiudi",
@@ -59,7 +64,8 @@
"compose": "Scrivi",
"go_back": "Indietro"
},
"clear_search": "Cancella ricerca"
"clear_search": "Cancella ricerca",
"vacation_active": "Risponditore automatico attivo"
},
"email_list": {
"no_emails": "Nessun messaggio",
@@ -313,7 +319,9 @@
"identity_update_failed": "Impossibile aggiornare l'identità: {{error}}",
"identity_delete_failed": "Impossibile eliminare l'identità: {{error}}",
"identity_unauthorized": "Non sei autorizzato a inviare da questo indirizzo email",
"identity_not_found": "Identità non trovata"
"identity_not_found": "Identità non trovata",
"vacation_saved": "Impostazioni del risponditore automatico salvate",
"vacation_save_failed": "Impossibile salvare le impostazioni del risponditore automatico"
},
"date": {
"today": "Oggi",
@@ -366,6 +374,7 @@
"privacy": "Privacy e sicurezza",
"account": "Account",
"identities": "Identità",
"vacation": "Risponditore automatico",
"advanced": "Avanzate"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Scopri di più"
}
},
"vacation": {
"title": "Risponditore automatico",
"description": "Rispondi automaticamente alle email in arrivo durante la tua assenza",
"loading": "Caricamento impostazioni di risposta automatica...",
"not_supported": "Il server di posta non supporta le risposte automatiche di assenza.",
"fetch_error": "Impossibile caricare le impostazioni di risposta automatica. Riprova.",
"status": {
"label": "Risponditore automatico",
"description": "Invia una risposta automatica a chi ti scrive",
"active": "Attivo",
"inactive": "Inattivo"
},
"date_range": {
"title": "Periodo",
"description": "Limita opzionalmente la risposta automatica a un periodo specifico",
"start": "Data di inizio",
"start_description": "Lascia vuoto per nessun limite di inizio",
"end": "Data di fine",
"end_description": "Lascia vuoto per nessun limite di fine"
},
"message": {
"title": "Messaggio di risposta automatica",
"description": "Il messaggio che verrà inviato come risposta",
"subject_label": "Oggetto",
"subject_description": "Oggetto della risposta automatica",
"subject_placeholder": "Fuori ufficio",
"body_label": "Corpo del messaggio",
"body_description": "Contenuto del messaggio in testo semplice",
"body_placeholder": "Grazie per la tua email. Sono attualmente fuori ufficio e risponderò al mio ritorno."
},
"preview": {
"title": "Anteprima",
"show": "Mostra anteprima",
"hide": "Nascondi anteprima"
},
"save": "Salva modifiche",
"saving": "Salvataggio...",
"warnings": {
"end_before_start": "La data di fine deve essere successiva alla data di inizio",
"start_in_past": "La data di inizio è nel passato",
"empty_body": "Il corpo del messaggio è vuoto — i destinatari riceveranno una risposta vuota"
}
},
"advanced": {
"title": "Avanzate",
"description": "Opzioni avanzate e impostazioni per sviluppatori",
@@ -753,6 +805,10 @@
"delete_confirm": "Sei sicuro di voler eliminare questo contatto?",
"local_mode": "I contatti sono salvati localmente (il server non supporta JMAP Contacts)",
"back_to_mail": "Torna alla posta",
"tabs": {
"all": "Tutti",
"groups": "Gruppi"
},
"detail": {
"emails": "Indirizzi email",
"phones": "Numeri di telefono",
@@ -788,6 +844,55 @@
"email_invalid": "Inserisci un indirizzo email valido",
"save_failed": "Impossibile salvare il contatto"
},
"groups": {
"create": "Nuovo gruppo",
"edit": "Modifica gruppo",
"empty": "Nessun gruppo",
"delete_confirm": "Sei sicuro di voler eliminare questo gruppo?",
"name_label": "Nome del gruppo",
"name_placeholder": "es. Team, Famiglia",
"name_required": "Il nome del gruppo è obbligatorio",
"save_failed": "Impossibile salvare il gruppo",
"members_label": "Membri",
"search_members": "Cerca contatti da aggiungere...",
"no_members": "Nessun membro in questo gruppo",
"member_count": "{count, plural, =0 {Nessun membro} one {1 membro} other {# membri}}"
},
"import": {
"title": "Importa contatti",
"drop_hint": "Clicca per selezionare un file vCard",
"file_types": "File .vcf o .vcard",
"no_contacts": "Nessun contatto trovato nel file",
"parse_error": "Impossibile analizzare il file vCard",
"found": "{count, plural, one {1 contatto trovato} other {# contatti trovati}}",
"duplicate": "Duplicato",
"select_all": "Seleziona tutto",
"deselect_all": "Deseleziona tutto",
"selected": "{count, plural, one {1 selezionato} other {# selezionati}}",
"import_button": "Importa",
"importing": "Importazione...",
"success": "{count, plural, one {1 contatto importato} other {# contatti importati}}",
"failed": "Importazione fallita",
"close": "Chiudi",
"file_too_large": "Il file è troppo grande (max 5 MB)"
},
"export": {
"title": "Esporta contatti",
"success": "{count, plural, one {1 contatto esportato} other {# contatti esportati}}"
},
"bulk": {
"selected": "{count, plural, one {1 selezionato} other {# selezionati}}",
"select_all": "Seleziona tutto",
"delete": "Elimina",
"delete_confirm": "Eliminare {count, plural, one {1 contatto} other {# contatti}}?",
"deleted": "{count, plural, one {1 contatto eliminato} other {# contatti eliminati}}",
"add_to_group": "Aggiungi al gruppo",
"choose_group": "Scegli un gruppo",
"adding_contacts": "Aggiunta di {count, plural, one {1 contatto} other {# contatti}}",
"added_to_group": "Contatti aggiunti al gruppo",
"export": "Esporta",
"clear": "Cancella selezione"
},
"toast": {
"created": "Contatto creato",
"updated": "Contatto aggiornato",
@@ -796,5 +901,28 @@
"error_update": "Impossibile aggiornare il contatto",
"error_delete": "Impossibile eliminare il contatto"
}
},
"advanced_search": {
"title": "Ricerca avanzata",
"from": "Da",
"from_placeholder": "Email o nome del mittente",
"to": "A",
"to_placeholder": "Email o nome del destinatario",
"subject": "Oggetto",
"subject_placeholder": "L'oggetto contiene...",
"body": "Corpo",
"has_attachment": "Allegati",
"date_after": "Dopo il",
"date_before": "Prima del",
"starred": "Preferiti",
"unread": "Non letti",
"read": "Letti",
"yes": "Sì",
"no": "No",
"clear": "Cancella",
"clear_all": "Cancella tutto",
"filters_active": "{count} filtro",
"filters_active_plural": "{count} filtri",
"toggle_filters": "Filtri"
}
}
}
+133 -5
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "メールアドレスまたはパスワードが無効です",
"connection_failed": "サーバーへの接続に失敗しました",
"generic": "エラーが発生しました。もう一度お試しください。"
"generic": "エラーが発生しました。もう一度お試しください。",
"totp_invalid": "認証コードが無効です。認証アプリを確認してください。"
},
"config_error": {
"title": "設定エラー",
"fetch_failed": "アプリケーション設定を読み込めません。後でもう一度お試しください。",
"server_not_configured": "メールサーバーが設定されていません。管理者にお問い合わせください。"
},
"remove_from_history": "履歴から削除"
"remove_from_history": "履歴から削除",
"totp_toggle": "二要素認証を使用",
"totp_label": "認証コード",
"totp_placeholder": "000000",
"totp_hide": "二要素認証を非表示"
},
"sidebar": {
"close": "閉じる",
@@ -59,7 +64,8 @@
"compose": "作成",
"go_back": "戻る"
},
"clear_search": "検索をクリア"
"clear_search": "検索をクリア",
"vacation_active": "不在応答が有効です"
},
"email_list": {
"no_emails": "メールがありません",
@@ -313,7 +319,9 @@
"identity_update_failed": "送信者情報の更新に失敗しました: {{error}}",
"identity_delete_failed": "送信者情報の削除に失敗しました: {{error}}",
"identity_unauthorized": "このメールアドレスからの送信は許可されていません",
"identity_not_found": "送信者情報が見つかりません"
"identity_not_found": "送信者情報が見つかりません",
"vacation_saved": "不在応答の設定を保存しました",
"vacation_save_failed": "不在応答の設定の保存に失敗しました"
},
"date": {
"today": "今日",
@@ -366,6 +374,7 @@
"privacy": "プライバシーとセキュリティ",
"account": "アカウント",
"identities": "送信者情報",
"vacation": "不在応答",
"advanced": "詳細設定"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "詳細"
}
},
"vacation": {
"title": "不在応答",
"description": "不在時に受信メールへ自動返信します",
"loading": "不在応答設定を読み込み中...",
"not_supported": "メールサーバーは不在応答をサポートしていません。",
"fetch_error": "不在応答設定の読み込みに失敗しました。もう一度お試しください。",
"status": {
"label": "不在応答",
"description": "メールを送信してきた方に自動返信を送信します",
"active": "有効",
"inactive": "無効"
},
"date_range": {
"title": "期間",
"description": "オプションで自動返信を特定の期間に限定します",
"start": "開始日",
"start_description": "空白のままにすると開始制限なし",
"end": "終了日",
"end_description": "空白のままにすると終了制限なし"
},
"message": {
"title": "自動返信メッセージ",
"description": "返信として送信されるメッセージ",
"subject_label": "件名",
"subject_description": "自動返信の件名",
"subject_placeholder": "不在通知",
"body_label": "メッセージ本文",
"body_description": "テキスト形式のメッセージ内容",
"body_placeholder": "メールをいただきありがとうございます。現在不在にしており、戻り次第ご返信いたします。"
},
"preview": {
"title": "プレビュー",
"show": "プレビューを表示",
"hide": "プレビューを非表示"
},
"save": "変更を保存",
"saving": "保存中...",
"warnings": {
"end_before_start": "終了日は開始日より後に設定してください",
"start_in_past": "開始日が過去の日付です",
"empty_body": "メッセージ本文が空です — 受信者には空の返信が届きます"
}
},
"advanced": {
"title": "詳細設定",
"description": "詳細オプションと開発者設定",
@@ -753,6 +805,10 @@
"delete_confirm": "この連絡先を削除してもよろしいですか?",
"local_mode": "連絡先はローカルに保存されています(サーバーがJMAPコンタクトをサポートしていません)",
"back_to_mail": "メールに戻る",
"tabs": {
"all": "すべて",
"groups": "グループ"
},
"detail": {
"emails": "メールアドレス",
"phones": "電話番号",
@@ -788,6 +844,55 @@
"email_invalid": "有効なメールアドレスを入力してください",
"save_failed": "連絡先の保存に失敗しました"
},
"groups": {
"create": "新しいグループ",
"edit": "グループを編集",
"empty": "グループがありません",
"delete_confirm": "このグループを削除してもよろしいですか?",
"name_label": "グループ名",
"name_placeholder": "例:チーム、家族",
"name_required": "グループ名は必須です",
"save_failed": "グループの保存に失敗しました",
"members_label": "メンバー",
"search_members": "追加する連絡先を検索...",
"no_members": "このグループにメンバーがいません",
"member_count": "{count, plural, =0 {メンバーなし} other {#人のメンバー}}"
},
"import": {
"title": "連絡先をインポート",
"drop_hint": "vCardファイルを選択してください",
"file_types": ".vcf または .vcard ファイル",
"no_contacts": "ファイルに連絡先が見つかりません",
"parse_error": "vCardファイルの解析に失敗しました",
"found": "{count, plural, other {#件の連絡先が見つかりました}}",
"duplicate": "重複",
"select_all": "すべて選択",
"deselect_all": "すべて解除",
"selected": "{count, plural, other {#件選択中}}",
"import_button": "インポート",
"importing": "インポート中...",
"success": "{count, plural, other {#件の連絡先をインポートしました}}",
"failed": "インポートに失敗しました",
"close": "閉じる",
"file_too_large": "ファイルが大きすぎます(最大5 MB)"
},
"export": {
"title": "連絡先をエクスポート",
"success": "{count, plural, other {#件の連絡先をエクスポートしました}}"
},
"bulk": {
"selected": "{count, plural, other {#件選択中}}",
"select_all": "すべて選択",
"delete": "削除",
"delete_confirm": "{count, plural, other {#件の連絡先}}を削除しますか?",
"deleted": "{count, plural, other {#件の連絡先を削除しました}}",
"add_to_group": "グループに追加",
"choose_group": "グループを選択",
"adding_contacts": "{count, plural, other {#件の連絡先}}を追加",
"added_to_group": "連絡先をグループに追加しました",
"export": "エクスポート",
"clear": "選択を解除"
},
"toast": {
"created": "連絡先を作成しました",
"updated": "連絡先を更新しました",
@@ -796,5 +901,28 @@
"error_update": "連絡先の更新に失敗しました",
"error_delete": "連絡先の削除に失敗しました"
}
},
"advanced_search": {
"title": "詳細検索",
"from": "差出人",
"from_placeholder": "差出人のメールまたは名前",
"to": "宛先",
"to_placeholder": "宛先のメールまたは名前",
"subject": "件名",
"subject_placeholder": "件名に含まれる...",
"body": "本文",
"has_attachment": "添付ファイル",
"date_after": "以降",
"date_before": "以前",
"starred": "スター付き",
"unread": "未読",
"read": "既読",
"yes": "はい",
"no": "いいえ",
"clear": "クリア",
"clear_all": "すべてクリア",
"filters_active": "{count}件のフィルター",
"filters_active_plural": "{count}件のフィルター",
"toggle_filters": "フィルター"
}
}
}
+132 -4
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "Ongeldig e-mailadres of wachtwoord",
"connection_failed": "Kan geen verbinding maken met de server",
"generic": "Er is een fout opgetreden. Probeer het opnieuw."
"generic": "Er is een fout opgetreden. Probeer het opnieuw.",
"totp_invalid": "Ongeldige authenticatiecode. Controleer uw authenticator-app."
},
"config_error": {
"title": "Configuratiefout",
"fetch_failed": "Kan de applicatieconfiguratie niet laden. Probeer het later opnieuw.",
"server_not_configured": "De mailserver is niet geconfigureerd. Neem contact op met je beheerder."
},
"remove_from_history": "Verwijder uit geschiedenis"
"remove_from_history": "Verwijder uit geschiedenis",
"totp_toggle": "Ik heb tweefactorauthenticatie",
"totp_label": "Authenticatiecode",
"totp_placeholder": "000000",
"totp_hide": "Tweefactorauthenticatie verbergen"
},
"sidebar": {
"close": "Sluiten",
@@ -59,7 +64,8 @@
"compose": "Opstellen",
"go_back": "Terug"
},
"clear_search": "Zoekopdracht wissen"
"clear_search": "Zoekopdracht wissen",
"vacation_active": "Afwezigheidsmelder is actief"
},
"email_list": {
"no_emails": "Geen e-mails",
@@ -313,7 +319,9 @@
"identity_update_failed": "Kan identiteit niet bijwerken: {{error}}",
"identity_delete_failed": "Kan identiteit niet verwijderen: {{error}}",
"identity_unauthorized": "Je bent niet geautoriseerd om vanaf dit e-mailadres te verzenden",
"identity_not_found": "Identiteit niet gevonden"
"identity_not_found": "Identiteit niet gevonden",
"vacation_saved": "Afwezigheidsinstellingen opgeslagen",
"vacation_save_failed": "Kan afwezigheidsinstellingen niet opslaan"
},
"date": {
"today": "Vandaag",
@@ -366,6 +374,7 @@
"privacy": "Privacy & Beveiliging",
"account": "Account",
"identities": "Identiteiten",
"vacation": "Afwezigheidsmelder",
"advanced": "Geavanceerd"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Meer informatie"
}
},
"vacation": {
"title": "Afwezigheidsmelder",
"description": "Automatisch antwoorden op inkomende e-mails terwijl je afwezig bent",
"loading": "Afwezigheidsinstellingen laden...",
"not_supported": "Je mailserver ondersteunt geen afwezigheidsantwoorden.",
"fetch_error": "Kan afwezigheidsinstellingen niet laden. Probeer het opnieuw.",
"status": {
"label": "Afwezigheidsmelder",
"description": "Stuur een automatisch antwoord naar mensen die je mailen",
"active": "Actief",
"inactive": "Inactief"
},
"date_range": {
"title": "Periode",
"description": "Beperk optioneel het automatische antwoord tot een specifieke periode",
"start": "Startdatum",
"start_description": "Leeg laten voor geen startlimiet",
"end": "Einddatum",
"end_description": "Leeg laten voor geen eindlimiet"
},
"message": {
"title": "Automatisch antwoordbericht",
"description": "Het bericht dat als antwoord wordt verzonden",
"subject_label": "Onderwerp",
"subject_description": "Onderwerpregel van het automatische antwoord",
"subject_placeholder": "Afwezigheidsbericht",
"body_label": "Berichttekst",
"body_description": "Inhoud van het bericht in platte tekst",
"body_placeholder": "Bedankt voor je e-mail. Ik ben momenteel niet aanwezig en zal reageren bij terugkomst."
},
"preview": {
"title": "Voorbeeld",
"show": "Voorbeeld tonen",
"hide": "Voorbeeld verbergen"
},
"save": "Wijzigingen opslaan",
"saving": "Opslaan...",
"warnings": {
"end_before_start": "De einddatum moet na de startdatum liggen",
"start_in_past": "De startdatum ligt in het verleden",
"empty_body": "De berichttekst is leeg — ontvangers krijgen een leeg antwoord"
}
},
"advanced": {
"title": "Geavanceerd",
"description": "Geavanceerde opties en ontwikkelaarsinstellingen",
@@ -753,6 +805,10 @@
"delete_confirm": "Weet u zeker dat u dit contact wilt verwijderen?",
"local_mode": "Contacten worden lokaal opgeslagen (server ondersteunt geen JMAP Contacts)",
"back_to_mail": "Terug naar e-mail",
"tabs": {
"all": "Alle",
"groups": "Groepen"
},
"detail": {
"emails": "E-mailadressen",
"phones": "Telefoonnummers",
@@ -788,6 +844,55 @@
"email_invalid": "Voer een geldig e-mailadres in",
"save_failed": "Kon contact niet opslaan"
},
"groups": {
"create": "Nieuwe groep",
"edit": "Groep bewerken",
"empty": "Geen groepen",
"delete_confirm": "Weet u zeker dat u deze groep wilt verwijderen?",
"name_label": "Groepsnaam",
"name_placeholder": "bijv. Team, Familie",
"name_required": "Groepsnaam is vereist",
"save_failed": "Kon groep niet opslaan",
"members_label": "Leden",
"search_members": "Contacten zoeken om toe te voegen...",
"no_members": "Geen leden in deze groep",
"member_count": "{count, plural, =0 {Geen leden} one {1 lid} other {# leden}}"
},
"import": {
"title": "Contacten importeren",
"drop_hint": "Klik om een vCard-bestand te selecteren",
"file_types": ".vcf- of .vcard-bestanden",
"no_contacts": "Geen contacten gevonden in bestand",
"parse_error": "Kon vCard-bestand niet lezen",
"found": "{count, plural, one {1 contact gevonden} other {# contacten gevonden}}",
"duplicate": "Duplicaat",
"select_all": "Alles selecteren",
"deselect_all": "Alles deselecteren",
"selected": "{count, plural, one {1 geselecteerd} other {# geselecteerd}}",
"import_button": "Importeren",
"importing": "Importeren...",
"success": "{count, plural, one {1 contact geïmporteerd} other {# contacten geïmporteerd}}",
"failed": "Import mislukt",
"close": "Sluiten",
"file_too_large": "Bestand is te groot (max 5 MB)"
},
"export": {
"title": "Contacten exporteren",
"success": "{count, plural, one {1 contact geëxporteerd} other {# contacten geëxporteerd}}"
},
"bulk": {
"selected": "{count, plural, one {1 geselecteerd} other {# geselecteerd}}",
"select_all": "Alles selecteren",
"delete": "Verwijderen",
"delete_confirm": "{count, plural, one {1 contact} other {# contacten}} verwijderen?",
"deleted": "{count, plural, one {1 contact verwijderd} other {# contacten verwijderd}}",
"add_to_group": "Aan groep toevoegen",
"choose_group": "Kies een groep",
"adding_contacts": "{count, plural, one {1 contact} other {# contacten}} toevoegen",
"added_to_group": "Contacten aan groep toegevoegd",
"export": "Exporteren",
"clear": "Selectie wissen"
},
"toast": {
"created": "Contact aangemaakt",
"updated": "Contact bijgewerkt",
@@ -796,5 +901,28 @@
"error_update": "Kon contact niet bijwerken",
"error_delete": "Kon contact niet verwijderen"
}
},
"advanced_search": {
"title": "Geavanceerd zoeken",
"from": "Van",
"from_placeholder": "E-mail of naam afzender",
"to": "Aan",
"to_placeholder": "E-mail of naam ontvanger",
"subject": "Onderwerp",
"subject_placeholder": "Onderwerp bevat...",
"body": "Inhoud",
"has_attachment": "Bijlagen",
"date_after": "Na",
"date_before": "Voor",
"starred": "Met ster",
"unread": "Ongelezen",
"read": "Gelezen",
"yes": "Ja",
"no": "Nee",
"clear": "Wissen",
"clear_all": "Alles wissen",
"filters_active": "{count} filter",
"filters_active_plural": "{count} filters",
"toggle_filters": "Filters"
}
}
+133 -5
View File
@@ -11,14 +11,19 @@
"error": {
"invalid_credentials": "E-mail ou senha inválidos",
"connection_failed": "Falha ao conectar com o servidor",
"generic": "Ocorreu um erro. Por favor, tente novamente."
"generic": "Ocorreu um erro. Por favor, tente novamente.",
"totp_invalid": "Código de autenticação inválido. Verifique seu aplicativo de autenticação."
},
"config_error": {
"title": "Erro de Configuração",
"fetch_failed": "Não foi possível carregar a configuração do aplicativo. Por favor, tente novamente mais tarde.",
"server_not_configured": "O servidor de e-mail não foi configurado. Por favor, contate seu administrador."
},
"remove_from_history": "Remover do histórico"
"remove_from_history": "Remover do histórico",
"totp_toggle": "Tenho autenticação de dois fatores",
"totp_label": "Código de autenticação",
"totp_placeholder": "000000",
"totp_hide": "Ocultar autenticação de dois fatores"
},
"sidebar": {
"close": "Fechar",
@@ -59,7 +64,8 @@
"compose": "Escrever",
"go_back": "Voltar"
},
"clear_search": "Limpar busca"
"clear_search": "Limpar busca",
"vacation_active": "Resposta automática ativa"
},
"email_list": {
"no_emails": "Nenhum e-mail",
@@ -313,7 +319,9 @@
"identity_update_failed": "Falha ao atualizar identidade: {{error}}",
"identity_delete_failed": "Falha ao excluir identidade: {{error}}",
"identity_unauthorized": "Você não está autorizado a enviar deste endereço de e-mail",
"identity_not_found": "Identidade não encontrada"
"identity_not_found": "Identidade não encontrada",
"vacation_saved": "Configurações de resposta automática salvas",
"vacation_save_failed": "Falha ao salvar configurações de resposta automática"
},
"date": {
"today": "Hoje",
@@ -366,6 +374,7 @@
"privacy": "Privacidade e Segurança",
"account": "Conta",
"identities": "Identidades",
"vacation": "Resposta automática",
"advanced": "Avançado"
},
"appearance": {
@@ -568,6 +577,49 @@
"learn_more": "Saiba Mais"
}
},
"vacation": {
"title": "Resposta automática",
"description": "Responder automaticamente a e-mails recebidos enquanto estiver ausente",
"loading": "Carregando configurações de resposta automática...",
"not_supported": "Seu servidor de e-mail não suporta respostas automáticas de ausência.",
"fetch_error": "Falha ao carregar as configurações de resposta automática. Tente novamente.",
"status": {
"label": "Resposta automática",
"description": "Enviar uma resposta automática para quem lhe enviar um e-mail",
"active": "Ativo",
"inactive": "Inativo"
},
"date_range": {
"title": "Período",
"description": "Opcionalmente limitar a resposta automática a um período específico",
"start": "Data de início",
"start_description": "Deixe vazio para sem limite de início",
"end": "Data de fim",
"end_description": "Deixe vazio para sem limite de fim"
},
"message": {
"title": "Mensagem de resposta automática",
"description": "A mensagem que será enviada como resposta",
"subject_label": "Assunto",
"subject_description": "Linha de assunto da resposta automática",
"subject_placeholder": "Fora do escritório",
"body_label": "Corpo da mensagem",
"body_description": "Conteúdo da mensagem em texto simples",
"body_placeholder": "Obrigado pelo seu e-mail. Estou atualmente fora do escritório e responderei quando retornar."
},
"preview": {
"title": "Pré-visualização",
"show": "Mostrar pré-visualização",
"hide": "Ocultar pré-visualização"
},
"save": "Salvar alterações",
"saving": "Salvando...",
"warnings": {
"end_before_start": "A data de fim deve ser posterior à data de início",
"start_in_past": "A data de início está no passado",
"empty_body": "O corpo da mensagem está vazio — os destinatários receberão uma resposta em branco"
}
},
"advanced": {
"title": "Avançado",
"description": "Opções avançadas e configurações de desenvolvedor",
@@ -753,6 +805,10 @@
"delete_confirm": "Tem certeza de que deseja excluir este contato?",
"local_mode": "Os contatos são armazenados localmente (o servidor não suporta JMAP Contacts)",
"back_to_mail": "Voltar ao e-mail",
"tabs": {
"all": "Todos",
"groups": "Grupos"
},
"detail": {
"emails": "Endereços de e-mail",
"phones": "Números de telefone",
@@ -788,6 +844,55 @@
"email_invalid": "Por favor, insira um endereço de e-mail válido",
"save_failed": "Falha ao salvar contato"
},
"groups": {
"create": "Novo grupo",
"edit": "Editar grupo",
"empty": "Nenhum grupo",
"delete_confirm": "Tem certeza de que deseja excluir este grupo?",
"name_label": "Nome do grupo",
"name_placeholder": "ex. Equipe, Família",
"name_required": "O nome do grupo é obrigatório",
"save_failed": "Falha ao salvar grupo",
"members_label": "Membros",
"search_members": "Pesquisar contatos para adicionar...",
"no_members": "Nenhum membro neste grupo",
"member_count": "{count, plural, =0 {Nenhum membro} one {1 membro} other {# membros}}"
},
"import": {
"title": "Importar contatos",
"drop_hint": "Clique para selecionar um arquivo vCard",
"file_types": "Arquivos .vcf ou .vcard",
"no_contacts": "Nenhum contato encontrado no arquivo",
"parse_error": "Falha ao analisar o arquivo vCard",
"found": "{count, plural, one {1 contato encontrado} other {# contatos encontrados}}",
"duplicate": "Duplicado",
"select_all": "Selecionar tudo",
"deselect_all": "Desmarcar tudo",
"selected": "{count, plural, one {1 selecionado} other {# selecionados}}",
"import_button": "Importar",
"importing": "Importando...",
"success": "{count, plural, one {1 contato importado} other {# contatos importados}}",
"failed": "Falha na importação",
"close": "Fechar",
"file_too_large": "Arquivo muito grande (máx. 5 MB)"
},
"export": {
"title": "Exportar contatos",
"success": "{count, plural, one {1 contato exportado} other {# contatos exportados}}"
},
"bulk": {
"selected": "{count, plural, one {1 selecionado} other {# selecionados}}",
"select_all": "Selecionar tudo",
"delete": "Excluir",
"delete_confirm": "Excluir {count, plural, one {1 contato} other {# contatos}}?",
"deleted": "{count, plural, one {1 contato excluído} other {# contatos excluídos}}",
"add_to_group": "Adicionar ao grupo",
"choose_group": "Escolher um grupo",
"adding_contacts": "Adicionando {count, plural, one {1 contato} other {# contatos}}",
"added_to_group": "Contatos adicionados ao grupo",
"export": "Exportar",
"clear": "Limpar seleção"
},
"toast": {
"created": "Contato criado",
"updated": "Contato atualizado",
@@ -796,5 +901,28 @@
"error_update": "Falha ao atualizar contato",
"error_delete": "Falha ao excluir contato"
}
},
"advanced_search": {
"title": "Pesquisa avançada",
"from": "De",
"from_placeholder": "E-mail ou nome do remetente",
"to": "Para",
"to_placeholder": "E-mail ou nome do destinatário",
"subject": "Assunto",
"subject_placeholder": "O assunto contém...",
"body": "Corpo",
"has_attachment": "Anexos",
"date_after": "Após",
"date_before": "Antes de",
"starred": "Favoritos",
"unread": "Não lidos",
"read": "Lidos",
"yes": "Sim",
"no": "Não",
"clear": "Limpar",
"clear_all": "Limpar tudo",
"filters_active": "{count} filtro",
"filters_active_plural": "{count} filtros",
"toggle_filters": "Filtros"
}
}
}