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:
+132
-4
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user