Ontwikkeling
Development Guide
Update documentation only under website/docs (English). Translations under website/i18n/<locale>/… are generated and should not be edited manually. Use the translation tasks (e.g., make translate_web_docs_batch) to refresh localized content.
Prerequisites
- Node.js 22+ en npm (getest met Node 22)
 - Thunderbird 128 ESR of nieuwer (voor handmatige tests)
 
Project Layout (high‑level)
- Root: packaging script 
distribution_zip_packer.sh, docs, screenshots sources/: hoofd add-on code (background, options/popup UI, manifests, icons)tests/: Vitest suitewebsite/: Docusaurus docs (met i18n onderwebsite/i18n/de/...)
Install & Tooling
- Installeer root deps: 
npm ci - Docs (optioneel): 
cd website && npm ci - Ontdek targets: 
make help 
Live Dev (web‑ext run)
- Snelle loop in Firefox Desktop (alleen UI smoke‑tests):
 npx web-ext run --source-dir sources --target=firefox-desktop- Uitvoeren in Thunderbird (voorkeur voor MailExtensions):
 npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"- Tips:
 - Houd de Error Console van Thunderbird open (Tools → Developer Tools → Error Console).
 - MV3 event pages worden gepauzeerd wanneer ze inactief zijn; herlaad de add-on na codewijzigingen, of laat web‑ext automatisch herladen.
 - Sommige Firefox‑specifieke gedragingen verschillen; verifieer altijd in Thunderbird voor API-pariteit.
 - Thunderbird binaire paden (voorbeelden):
 - Linux: 
thunderbird(bijv.,/usr/bin/thunderbird) - macOS: 
/Applications/Thunderbird.app/Contents/MacOS/thunderbird - Windows: 
"C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe" - Profielisolatie: gebruik een apart Thunderbird-profiel voor ontwikkeling om te voorkomen dat je dagelijkse setup wordt beïnvloed.
 
Make Targets (Alphabetical)
The Makefile standardizes common dev flows. Run make help anytime for a one‑line summary of every target.
Tip: running make with no target opens a simple Whiptail menu to pick a target.
| Target | One‑line description | 
|---|---|
clean | Verwijder lokale build/preview artefacten (tmp/, web-local-preview/, website/build/). | 
commit | Formatteer, voer tests uit (incl. i18n), werk changelog bij, commit & push. | 
eslint | Voer ESLint uit via flat config (npm run -s lint:eslint). | 
help | Lijst alle targets met one‑line docs (gesorteerd). | 
lint | web‑ext lint op sources/ (tijdelijk manifest; negeert ZIP's; niet-fatale). | 
menu | Interactief menu om een target en optionele argumenten te selecteren. | 
pack | Bouw ATN & LOKALE ZIP's (loopt linter; roept packer script aan). | 
prettier | Formatteer de repository ter plekke (schrijft wijzigingen). | 
prettier_check | Prettier in controlemodus (geen schrijfbewerkingen); faalt als herformattering nodig is. | 
prettier_write | Alias voor prettier. | 
test | Prettier (schrijven), ESLint, dan Vitest (dekking indien geconfigureerd). | 
test_i18n | i18n‑alleen tests: add‑on placeholders/pariteit + website pariteit per taal per document. | 
translate_app | Alias voor translation_app. | 
translation_app | Vertaal app UI-strings van sources/_locales/en/messages.json. | 
translate_web_docs_batch | Vertaal website docs via OpenAI Batch API (voorkeur). | 
translate_web_docs_sync | Vertaal website docs synchronously (legacy, non-batch). | 
translate_web_index | Alias voor translation_web_index. | 
translation_web_index | Vertaal homepage/navbar/footer UI (website/i18n/en/code.json → .../<lang>/code.json). | 
web_build | Bouw docs naar website/build (ondersteunt --locales / BUILD_LOCALES). | 
web_build_linkcheck | Offline‑veilige link check (negeert externe HTTP[S]). | 
web_build_local_preview | Lokale gh‑pages preview; auto‑serve op 8080–8090; optionele tests/link‑check. | 
web_push_github | Push website/build naar de gh-pages branch. | 
Syntax for options
- Gebruik 
make <command> OPTS="…"om opties door te geven (aanhalingstekens aanbevolen). Elk target hieronder toont voorbeeldgebruik. 
--
Locale build tips
- Bouw een subset van locale: stel 
BUILD_LOCALES="en de"in of geefOPTS="--locales en,de"door aan web targets. - Preview een specifieke locale: 
http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/. 
Build & Package
- Bouw ZIP's: 
make pack - Produceert ATN en LOKALE ZIP's in de repo root (bewerk artefacten niet met de hand)
 - Tip: werk versie bij in zowel 
sources/manifest_ATN.jsonalssources/manifest_LOCAL.jsonvoor het verpakken - Handmatige installatie (dev): Thunderbird → Tools → Add‑ons and Themes → gear → Install Add‑on From File… → selecteer de gebouwde ZIP
 
Test
- Volledige suite: 
make test(Vitest) - Dekking (optioneel):
 npm i -D @vitest/coverage-v8- Voer 
make testuit; opencoverage/index.htmlvoor HTML-rapport - i18n alleen: 
make test_i18n(UI-sleutels/placeholders/titels + website per-locale per-doc pariteit met id/title/sidebar_label checks) 
Debugging & Logs
- Error Console: Tools → Developer Tools → Error Console
 - Wissel tussen gedetailleerde logs tijdens runtime:
 - Inschakelen: 
messenger.storage.local.set({ debug: true }) - Uitschakelen: 
messenger.storage.local.set({ debug: false }) - Logs verschijnen tijdens het opstellen/verzenden van antwoorden
 
Docs (website)
- Dev server: 
cd website && npm run start - Bouw statische site: 
cd website && npm run build - Maak equivalente (alfabetisch): 
make web_build,make web_build_linkcheck,make web_build_local_preview,make web_push_github - Voorbeeldgebruik:
 - Alleen EN, overslaan van tests/link‑check, geen push: 
make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run" - Alle locales, met tests/link‑check, daarna push: 
make web_build_local_preview && make web_push_github - Voordat je publiceert, voer de offline‑veilige link check uit: 
make web_build_linkcheck. - i18n: Engels leeft in 
website/docs/*.md; Duitse vertalingen inwebsite/i18n/de/docusaurus-plugin-content-docs/current/*.md - Zoekopdracht: Als Algolia DocSearch omgevingsvariabelen zijn ingesteld in CI (
DOCSEARCH_APP_ID,DOCSEARCH_API_KEY,DOCSEARCH_INDEX_NAME), gebruikt de site Algolia-zoekopdracht; anders valt het terug op lokale zoekopdracht. Op de homepage druk/ofCtrl+Kom het zoekvak te openen. 
Donate redirect route
website/src/pages/donate.js- Route: 
/donate(en/<locale>/donate) - Gedrag:
 - Als de huidige route een locale heeft (bijv., 
/de/donate), gebruik deze dan - Anders, kies de beste match van 
navigator.languagesversus geconfigureerde locales; val terug naar standaard locale - Redirects naar:
 en→/docs/donation- anderen → 
/<locale>/docs/donation - Gebruikt 
useBaseUrlvoor correcte baseUrl-afhandeling - Bevat meta-refresh + 
noscriptlink als fallback 
Preview Tips
- Stop Node preview schoon: open 
http://localhost:<port>/__stop(afgedrukt naLocal server started). - Als afbeeldingen niet laden in MDX/JSX, gebruik dan 
useBaseUrl('/img/...')om de sitebaseUrlte respecteren. - De preview start eerst; de linkcheck draait daarna en is niet-blokkerend (gebroken externe links zullen de preview niet stoppen).
 - Voorbeeld preview URL: 
http://localhost:<port>/Thunderbird-Reply-with-Attachments/(afgedrukt na “Lokale server gestart”). - Externe links in link-check: Sommige externe sites (bijv. addons.thunderbird.net) blokkeren geautomatiseerde crawlers en kunnen 403 tonen in link checks. De preview start nog steeds; deze kunnen veilig worden genegeerd.
 
Translate the Website
Wat je kunt vertalen
- Website-ui alleen: homepage, navbar, footer en andere UI-strings. Docs-inhoud blijft voorlopig alleen in het Engels.
 
Waar te bewerken
- Bewerk 
website/i18n/<locale>/code.json(gebruikenals referentie). Houd placeholders zoals{year},{slash},{ctrl},{k},{code1}ongewijzigd. 
Genereer of ververs bestanden
- Maak ontbrekende stubs voor alle locales: 
npm --prefix website run i18n:stubs - Overschrijf stubs vanuit het Engels (na het toevoegen van nieuwe strings): 
npm --prefix website run i18n:stubs:force - Alternatief voor een enkele locale: 
npx --prefix website docusaurus write-translations --locale <locale> 
Vertaal homepage/navbar/footer UI-strings (OpenAI)
- Stel inloggegevens één keer in (shell of .env):
 export OPENAI_API_KEY=sk-...- Optioneel: 
export OPENAI_MODEL=gpt-4o-mini - Eenmalig (alle locales, sla en over): 
make translate_web_index - Beperk tot specifieke locales: 
make translate_web_index OPTS="--locales de,fr" - Overschrijf bestaande waarden: 
make translate_web_index OPTS="--force" 
Validatie & herhalingen
- Het vertaalscript valideert JSON-vorm, behoudt accolades-plaatsقدen, en zorgt ervoor dat URL's ongewijzigd blijven.
 - Bij validatiefouten probeert het tot 2 keer opnieuw met feedback voordat bestaande waarden behouden blijven.
 
Preview je locale
- Dev server: 
npm --prefix website run start - Bezoek 
http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/ 
Indien indienen
- Open een PR met de bewerkte 
code.jsonbestand(en). Houd wijzigingen gefocust en voeg indien mogelijk een snelle screenshot toe. 
Security & Configuration Tips
- Commit 
sources/manifest.jsonniet (tijdelijk gemaakt door de build) - Houd 
browser_specific_settings.gecko.idstabiel om het updatekanaal te behouden 
Settings Persistence
- Opslag: Alle gebruikersinstellingen leven in 
storage.localen blijven bestaan tijdens add-on-updates. - Installeren: Standaarden worden alleen toegepast wanneer een sleutel strikt ontbreekt (onbepaald).
 - Update: Een migratie vult alleen ontbrekende sleutels; bestaande waarden worden nooit overschreven.
 - Schema-markering: 
settingsVersion(momenteel1). - Sleutels en standaardwaarden:
 blacklistPatterns: string[]→['*intern*', '*secret*', '*passwor*']confirmBeforeAdd: boolean→falseconfirmDefaultChoice: 'yes'|'no'→'yes'warnOnBlacklistExcluded: boolean→true- Code: zie 
sources/background.js→initializeOrMigrateSettings()enSCHEMA_VERSION. 
Dev workflow (een nieuwe instelling toevoegen)
- Verhoog 
SCHEMA_VERSIONinsources/background.js. - Voeg de nieuwe sleutel + standaardwaarde toe aan de 
DEFAULTSobject ininitializeOrMigrateSettings(). - Gebruik de "only-if-undefined" regel bij het zaaien van standaardwaarden; overschrijf bestaande waarden niet.
 - Als de instelling zichtbaar is voor de gebruiker, verbind deze dan in 
sources/options.jsen voeg gelokaliseerde strings toe. - Voeg/benut tests toe (zie 
tests/background.settings.migration.test.js). 
Handmatige testtips
- Simuleer een schone installatie: wis de gegevensmap van de extensie of begin met een nieuw profiel.
 - Simuleer een update: stel 
settingsVersionin op0instorage.localen herlaad opnieuw; bevestig dat bestaande waarden ongewijzigd blijven en alleen ontbrekende sleutels worden toegevoegd. 
Troubleshooting
- Zorg ervoor dat Thunderbird 128 ESR of nieuwer is
 - Gebruik de Error Console voor runtime-problemen
 - Als opgeslagen instellingen niet correct lijken toe te passen, herstart dan Thunderbird en probeer het opnieuw. (Thunderbird kan de staat tussen sessies cachen; een herstart zorgt ervoor dat nieuwe instellingen worden geladen.)
 
CI & Coverage
- GitHub Actions (
CI — Tests) voert vitest uit met de dekking drempels (85% regels/functies takken/statements). Als drempels niet worden gehaald, faalt de taak. - De workflow uploadt een artefact 
coverage-htmlmet het HTML-rapport; download het vanaf de runpagina (Acties → laatste run → Artefacten). 
Contributing
- Zie CONTRIBUTING.md voor branch/commit/PR-richtlijnen
 - Tip: Maak een apart Thunderbird-ontwikkelingsprofiel voor tests om te voorkomen dat je dagelijkse profiel wordt beïnvloed.
 
Translations
- Het uitvoeren van grote “all → all” vertaaljobs kan traag en duur zijn. Begin met een subset (bijv. een paar docs en 1–2 locale), beoordeel het resultaat, en breid vervolgens uit.
 
- Retrybeleid: vertaaljobs voeren tot 3 herhalingen uit met exponentiële terugval bij API-fouten; zie 
scripts/translate_web_docs_batch.jsenscripts/translate_web_docs_sync.js. 
Screenshots voor docs
- 
Bewaar afbeeldingen onder
website/static/img/. - 
Verwijs ernaar in MD/MDX via
useBaseUrl('/img/<filename>')zodat paden werken met de sitebaseUrl. - 
Na het toevoegen of hernoemen van afbeeldingen onder
website/static/img/, bevestig dat alle verwijzingen nog steedsuseBaseUrl('/img/…')gebruiken en worden weergegeven in een lokale preview. Favicons - 
De multi‑size
favicon.icowordt automatisch gegenereerd in alle buildpaden (Make + scripts) viawebsite/scripts/build-favicon.mjs. - 
Er is geen handmatige stap nodig; het bijwerken van
icon-*.pngis voldoende. Review tip - 
Houd de front‑matter
idongewijzigd in vertaalde docs; vertaal alleentitleensidebar_labelwanneer aanwezig. 
clean
- Doel: lokale build/preview artefacten verwijderen.
 - Gebruik: 
make clean - Verwijdert (indien aanwezig):
 tmp/web-local-preview/website/build/
commit
- Doel: formatteren, testen, changelog bijwerken, commit, en push.
 - Gebruik: 
make commit - Details: voert Prettier uit (schrijven), 
make test,make test_i18n; voegt changelog toe wanneer er staged diffs zijn; pusht naarorigin/<branch>. 
eslint
- Doel: voer ESLint uit via flat config.
 - Gebruik: 
make eslint 
help
- Doel: lijst alle targets met one‑line docs.
 - Gebruik: 
make help 
lint
- Doel: lint de MailExtension met 
web-ext. - Gebruik: 
make lint - Opmerkingen: temp‑copies 
sources/manifest_LOCAL.json→sources/manifest.json; negeert gebouwde ZIP's; waarschuwingen leiden niet tot het mislukken van de pipeline. 
menu
- Doel: interactief menu om een Make doeltarget en optionele argumenten te selecteren.
 - Gebruik: voer 
makeuit zonder argumenten. - Opmerkingen: als 
whiptailniet beschikbaar is, valt het menu terug opmake help. 
pack
- Doel: bouw ATN en lokale ZIP's (afhankelijk van 
lint). - Gebruik: 
make pack - Tip: verhoog versies in zowel 
sources/manifest_*.jsonvoor het verpakken. 
prettier
- Doel: formatteer de repo ter plaatse.
 - Gebruik: 
make prettier 
prettier_check
- Doel: verifieer opmaak (geen schrijfbewerkingen).
 - Gebruik: 
make prettier_check 
prettier_write
- Doel: alias voor 
prettier. - Gebruik: 
make prettier_write 
test
- Doel: voer Prettier (schrijven), ESLint, dan Vitest (dekking als geïnstalleerd) uit.
 - Gebruik: 
make test 
test_i18n
- Doel: i18n-georiënteerde tests voor add-on strings en website docs.
 - Gebruik: 
make test_i18n - Voert uit: 
npm run test:i18nennpm run -s test:website-i18n. 
translate_app / translation_app
- Doel: vertaal add-on UI strings van EN naar andere locales.
 - Gebruik: 
make translation_app OPTS="--locales all|de,fr" - Opmerkingen: behoudt sleutelstructuur en placeholders; logt naar 
translation_app.log. Script vorm:node scripts/translate_app.js --locales …. 
translate_web_docs_batch / translate_web_docs_sync
- Doel: vertaal website docs van 
website/docs/*.mdnaarwebsite/i18n/<locale>/.... - Voorkeur: 
translate_web_docs_batch(OpenAI Batch API)- Gebruik (vlaggen): 
make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy posities worden nog steeds geaccepteerd: 
OPTS="<doc|all> <lang|all>" 
 - Gebruik (vlaggen): 
 - Gedrag: bouwt JSONL, uploadt, polst elke 30s, downloadt resultaten, schrijft bestanden.
 - Opmerking: een batchjob kan tot 24 uur duren om te voltooien (per OpenAI's batchvenster). De console toont de verstreken tijd bij elke poll.
 - Env: 
OPENAI_API_KEY(vereist), optioneleOPENAI_MODEL,OPENAI_TEMPERATURE,OPENAI_BATCH_WINDOW(standaard 24u),BATCH_POLL_INTERVAL_MS. - Legacy: 
translate_web_docs_sync- Gebruik (vlaggen): 
make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy posities worden nog steeds geaccepteerd: 
OPTS="<doc|all> <lang|all>" 
 - Gebruik (vlaggen): 
 - Gedrag: synchrone aanvragen per paar (geen batchaggregatie).
 - Opmerkingen: Interactieve prompts wanneer 
OPTSweggelaten. Beide modi behouden codeblokken/inline-code en houden front-matteridongewijzigd; logt naartranslation_web_batch.log(batch) oftranslation_web_sync.log(sync). 
translate_web_index / translation_web_index
- Doel: vertaal website UI strings (homepage, navbar, footer) van 
website/i18n/en/code.jsonnaar alle locales onderwebsite/i18n/<locale>/code.json(exclusiefen). - Gebruik: 
make translate_web_indexofmake translate_web_index OPTS="--locales de,fr [--force]" - Vereisten: export 
OPENAI_API_KEY(optioneel:OPENAI_MODEL=gpt-4o-mini). - Gedrag: valideert de JSON-structuur, behoudt accolades placeholders, houdt URLs ongewijzigd en probeert opnieuw met feedback bij validatiefouten.
 
web_build
- Doel: bouw de docs site naar 
website/build. - Gebruik: 
make web_build OPTS="--locales en|de,en|all"(of stelBUILD_LOCALES="en de"in) - Internals: 
node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …]. - Deps: draait 
npm ciinwebsite/alleen alswebsite/node_modules/@docusaurusontbreekt. 
web_build_linkcheck
- Doel: offline-veilige link check.
 - Gebruik: 
make web_build_linkcheck OPTS="--locales en|all" - Opmerkingen: bouwt naar 
tmp_linkcheck_web_pages; herschrijft GH-pagina'sbaseUrlnaar/; negeert externe HTTP(S)-links. 
web_build_local_preview
- Doel: lokale gh‑pages preview met optionele tests/link-check.
 - Gebruik: 
make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]" - Gedrag: probeert eerst Node preview server (
scripts/preview-server.mjs, ondersteunt/__stop), valt terug naarpython3 -m http.server; serveert op 8080–8090; PID opweb-local-preview/.server.pid. 
web_push_github
- Doel: push 
website/buildnaar degh-pagesbranch. - Gebruik: 
make web_push_github 
Tip: stel NPM=… in om de package manager die door het Makefile wordt gebruikt te overschrijven (standaard npm).