Skip to main content

Razvoj


Vodič za razvoj

Uređujte samo englesku verziju; prijevodi se propagiraju

Ažurirajte dokumentaciju samo pod website/docs (engleski). Prijevodi pod website/i18n/<locale>/… generiraju se i ne bi ih trebalo uređivati ručno. Upotrijebite zadatke za prijevod (npr. make translate_web_docs_batch) za osvježavanje lokaliziranog sadržaja.

Preduvjeti

  • Node.js 22+ i npm (testirano s Node 22)
  • Thunderbird 128 ESR ili noviji (za ručno testiranje)

Struktura projekta (na visokoj razini)

  • Korijen: skripta za pakiranje distribution_zip_packer.sh, dokumentacija, snimke zaslona
  • sources/: glavni kôd dodatka (pozadina, UI opcija/skočnog prozora, manifesti, ikone)
  • tests/: skup testova Vitest
  • website/: Docusaurus dokumentacija (s i18n pod website/i18n/de/...)

Instalacija i alati

  • Instaliraj korijenske ovisnosti: npm ci
  • Dokumentacija (neobavezno): cd website && npm ci
  • Otkrij ciljeve: make help

Razvoj uživo (web‑ext run)

  • Brza petlja u Firefox Desktopu (samo osnovni UI testovi):
  • npx web-ext run --source-dir sources --target=firefox-desktop
  • Pokreni u Thunderbirdu (preporučeno za MailExtensions):
  • npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"
  • Savjeti:
  • Držite otvorenu Thunderbirdovu Konzolu pogrešaka (Alati → Alati za razvojne programere → Konzola pogrešaka).
  • MV3 stranice s događajima suspendiraju se kada su neaktivne; ponovno učitajte dodatak nakon promjena u kodu ili dopustite da web‑ext automatski ponovno učita.
  • Neka ponašanja specifična za Firefox razlikuju se; uvijek provjerite u Thunderbirdu radi pariteta API‑ja.
  • Putanje binarki Thunderbirda (primjeri):
  • Linux: thunderbird (npr. /usr/bin/thunderbird)
  • macOS: /Applications/Thunderbird.app/Contents/MacOS/thunderbird
  • Windows: "C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe"
  • Izolacija profila: koristite zaseban Thunderbird profil za razvoj kako biste izbjegli utjecaj na vašu svakodnevnu postavu.

Make ciljevi (abecednim redom)

Makefile standardizira uobičajene razvojne tokove. Pokrenite make help bilo kada za jednoredni sažetak svakog cilja.

Savjet: pokretanje make bez cilja otvara jednostavni Whiptail izbornik za odabir cilja.

CiljJednoredni opis
cleanUkloni lokalne artefakte izgradnje/pregleda (tmp/, web-local-preview/, website/build/).
commitFormatiraj, pokreni testove (uklj. i18n), ažuriraj dnevnik promjena, commitaj i pushaj.
eslintPokreni ESLint putem ravne konfiguracije (npm run -s lint:eslint).
helpPopiši sve ciljeve s jednorednim opisima (sortirano).
lintweb‑ext lint nad sources/ (privremeni manifest; ignorira ZIP‑ove; ne‑fatalno).
menuInteraktivni izbornik za odabir cilja i neobaveznih argumenata.
packIzgradi ATN i LOCAL ZIP‑ove (pokreće linter; poziva skriptu za pakiranje).
prettierFormatira repozitorij na mjestu (zapisuje promjene).
prettier_checkPrettier u check modu (bez pisanja); pada ako je potrebno preformatiranje.
prettier_writeAlias za prettier.
testPrettier (pisanje), ESLint, zatim Vitest (pokrivenost ako je konfigurirano).
test_i18nSamo i18n testovi: rezervirana mjesta/paritet dodatka + paritet web‑stranice.
translate_appAlias za translation_app.
translation_appPrevedi UI stringove aplikacije iz sources/_locales/en/messages.json.
translate_web_docs_batchPrevedi web dokumentaciju putem OpenAI Batch API‑ja (preporučeno).
translate_web_docs_syncPrevedi web dokumentaciju sinkrono (naslijeđeno, bez batcha).
translate_web_indexAlias za translation_web_index.
translation_web_indexPrevedi UI početne stranice/navigacije/podnožja (website/i18n/en/code.json → .../<lang>/code.json).
web_buildIzgradi dokumente u website/build (podržava --locales / BUILD_LOCALES).
web_build_linkcheckProvjera poveznica sigurna za offline (preskače udaljene HTTP[S]).
web_build_local_previewLokalni gh‑pages pregled; automatski poslužuje na 8080–8090; opcionalni testovi/provjera poveznica.
web_push_githubGurni website/build na granu gh-pages.

Sintaksa za opcije

  • Koristite make <command> OPTS="…" za prosljeđivanje opcija (preporučeni navodnici). Svaki cilj dolje prikazuje primjer upotrebe.

--

Savjeti za izgradnju za jezike

  • Izgradite podskup lokalizacija: postavite BUILD_LOCALES="en de" ili proslijedite OPTS="--locales en,de" web ciljevima.
  • Pregled određenog jezika: http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.

Izgradnja i pakiranje

  • Izgradite ZIP‑ove: make pack
  • Stvara ATN i LOCAL ZIP‑ove u korijenu repozitorija (ne uređujte artefakte ručno)
  • Savjet: ažurirajte verziju i u sources/manifest_ATN.json i u sources/manifest_LOCAL.json prije pakiranja
  • Ručna instalacija (dev): Thunderbird → Alati → Dodaci i teme → zupčanik → Install Add‑on From File… → odaberite izgrađeni ZIP

Testiranje

  • Puni paket: make test (Vitest)
  • Pokrivenost (neobavezno):
  • npm i -D @vitest/coverage-v8
  • Pokrenite make test; otvorite coverage/index.html za HTML izvješće
  • Samo i18n: make test_i18n (UI ključevi/rezervirana mjesta/naslovi + paritet web‑stranice po jeziku i dokumentu s provjerama id/title/sidebar_label)

Otklanjanje pogrešaka i logovi

  • Konzola pogrešaka: Alati → Alati za razvojne programere → Konzola pogrešaka
  • Uključi/isključi opširne logove u izvođenju:
  • Uključi: messenger.storage.local.set({ debug: true })
  • Isključi: messenger.storage.local.set({ debug: false })
  • Logovi se pojavljuju tijekom sastavljanja/slanja odgovora

Dokumentacija (web‑stranica)

  • Razvojni poslužitelj: cd website && npm run start
  • Izgradi statičku stranicu: cd website && npm run build
  • Make ekvivalenti (abecedno): make web_build, make web_build_linkcheck, make web_build_local_preview, make web_push_github
  • Primjeri upotrebe:
  • Samo EN, preskoči testove/provjeru poveznica, bez pushanja: make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run"
  • Svi jezici, s testovima/provjerom poveznica, zatim push: make web_build_local_preview && make web_push_github
  • Prije objave pokrenite provjeru poveznica sigurnu za offline: make web_build_linkcheck.
  • i18n: Engleski je u website/docs/*.md; njemački prijevodi u website/i18n/de/docusaurus-plugin-content-docs/current/*.md
  • Pretraživanje: Ako su Algolia DocSearch varijable okoline postavljene u CI‑ju (DOCSEARCH_APP_ID, DOCSEARCH_API_KEY, DOCSEARCH_INDEX_NAME), stranica koristi Algolia pretraživanje; u suprotnom se vraća na lokalno pretraživanje. Na početnoj stranici pritisnite / ili Ctrl+K za otvaranje okvira za pretraživanje.

  • website/src/pages/donate.js
  • Ruta: /donate (i /<locale>/donate)
  • Ponašanje:
  • Ako trenutna ruta ima lokalitet (npr. /de/donate), upotrijebite ga
  • Inače, odaberite najbolji podudarnik iz navigator.languages prema konfiguriranim jezicima; vratite se na zadani jezik
  • Preusmjerava na:
  • en/docs/donation
  • ostale → /<locale>/docs/donation
  • Koristi useBaseUrl za ispravno rukovanje baseUrl‑om
  • Uključuje meta refresh + noscript poveznicu kao rezervu


Savjeti za pregled

  • Čisto zaustavite Node pregled: otvorite http://localhost:<port>/__stop (ispisano nakon Local server started).
  • Ako se slike ne učitavaju u MDX/JSX, koristite useBaseUrl('/img/...') kako biste poštovali baseUrl web‑mjesta.
  • Pregled započinje prvo; provjera poveznica pokreće se nakon i ne blokira (pokvarene vanjske poveznice neće zaustaviti pregled).
  • Primjer URL‑a pregleda: http://localhost:<port>/Thunderbird-Reply-with-Attachments/ (ispisano nakon “Local server started”).
  • Vanjske poveznice u provjeri poveznica: Neka vanjska web‑mjesta (npr. addons.thunderbird.net) blokiraju automatizirane crawlere i mogu prikazati 403 u provjerama poveznica. Pregled se i dalje pokreće; ovo je sigurno ignorirati.

Prevedite web‑stranicu

Što možete prevesti

  • Samo UI web‑stranice: početna stranica, navigacija, podnožje i ostali UI stringovi. Sadržaj dokumenata za sada ostaje samo na engleskom.

Gdje uređivati

  • Uredite website/i18n/<locale>/code.json (koristite en kao referencu). Zadržite rezervirana mjesta poput {year}, {slash}, {ctrl}, {k}, {code1} nepromijenjenima.

Generiranje ili osvježavanje datoteka

  • Kreirajte nedostajuće stubove za sve jezike: npm --prefix website run i18n:stubs
  • Prepišite stubove iz engleskog (nakon dodavanja novih stringova): npm --prefix website run i18n:stubs:force
  • Alternativa za jedan jezik: npx --prefix website docusaurus write-translations --locale <locale>

Prevedite UI stringove početne stranice/navigacije/podnožja (OpenAI)

  • Postavite vjerodajnice jednom (shell ili .env):
  • export OPENAI_API_KEY=sk-...
  • Neobavezno: export OPENAI_MODEL=gpt-4o-mini
  • Jednokratno (svi jezici, bez en): make translate_web_index
  • Ograniči na određene jezike: make translate_web_index OPTS="--locales de,fr"
  • Prepiši postojeće vrijednosti: make translate_web_index OPTS="--force"

Validacija i ponovni pokušaji

  • Skripta za prijevod validira oblik JSON‑a, čuva rezervirana mjesta u vitičastim zagradama i osigurava da URL‑ovi ostanu nepromijenjeni.
  • U slučaju neuspjele validacije, pokušava ponovno s povratnom informacijom do 2 puta prije nego što zadrži postojeće vrijednosti.

Pregledajte svoj jezik

  • Razvojni poslužitelj: npm --prefix website run start
  • Posjetite http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/

Slanje

  • Otvorite PR s uređenim datotekama code.json. Održite promjene fokusiranima i uključite brzi screenshot kad je moguće.

Savjeti za sigurnost i konfiguraciju

  • Ne committajte sources/manifest.json (privremeno stvoren tijekom izgradnje)
  • Zadržite browser_specific_settings.gecko.id stabilnim kako biste sačuvali kanal ažuriranja

Postojanost postavki

  • Pohrana: Sve korisničke postavke nalaze se u storage.local i ostaju postojane kroz ažuriranja dodatka.
  • Instalacija: Zadane vrijednosti primjenjuju se samo kada ključ strogo nedostaje (undefined).
  • Ažuriranje: Migracija popunjava samo nedostajuće ključeve; postojeće vrijednosti se nikada ne prepisuju.
  • Oznaka sheme: settingsVersion (trenutno 1).
  • Ključevi i zadane vrijednosti:
  • blacklistPatterns: string[]['*intern*', '*secret*', '*passwor*']
  • confirmBeforeAdd: booleanfalse
  • confirmDefaultChoice: 'yes'|'no''yes'
  • warnOnBlacklistExcluded: booleantrue
  • Kod: vidi sources/background.jsinitializeOrMigrateSettings() i SCHEMA_VERSION.

Razvojni tijek rada (dodavanje nove postavke)

  • Povećajte SCHEMA_VERSION u sources/background.js.
  • Dodajte novi ključ + zadanu vrijednost u objekt DEFAULTS u initializeOrMigrateSettings().
  • Koristite pravilo "samo‑ako‑je‑undefined" pri inicijalnom postavljanju zadanih vrijednosti; ne prepisujte postojeće vrijednosti.
  • Ako je postavka vidljiva korisniku, povežite je u sources/options.js i dodajte lokalizirane stringove.
  • Dodajte/prilagodite testove (vidi tests/background.settings.migration.test.js).

Savjeti za ručno testiranje

  • Simulirajte svježu instalaciju: obrišite direktorij podataka proširenja ili započnite s novim profilom.
  • Simulirajte ažuriranje: postavite settingsVersion na 0 u storage.local i ponovno učitajte; potvrdite da postojeće vrijednosti ostaju nepromijenjene i da se dodaju samo nedostajući ključevi.

Rješavanje problema

  • Provjerite da je Thunderbird 128 ESR ili noviji
  • Koristite Konzolu pogrešaka za probleme u izvođenju
  • Ako se čini da se pohranjene postavke ne primjenjuju pravilno, ponovno pokrenite Thunderbird i pokušajte ponovno. (Thunderbird može keširati stanje kroz sesije; ponovno pokretanje osigurava učitavanje svježih postavki.)

CI i pokrivenost

  • GitHub Actions (CI — Tests) pokreće vitest s pragovima pokrivenosti (85% linije/funkcije/grane/izrazi). Ako pragovi nisu ispunjeni, posao pada.
  • Tijek rada učitava artefakt coverage-html s HTML izvješćem; preuzmite ga sa stranice pokretanja (Actions → najnovije pokretanje → Artifacts).

Doprinos

  • Pogledajte CONTRIBUTING.md za smjernice o granama/commitovima/PR‑ovima
  • Savjet: Kreirajte zaseban Thunderbird razvojni profil za testiranje kako biste izbjegli utjecaj na svoj svakodnevni profil.

Prijevodi

  • Pokretanje velikih poslova prevođenja “sve → sve” može biti sporo i skupo. Započnite s podskupom (npr. nekoliko dokumenata i 1–2 jezika), pregledajte rezultat, zatim proširite.

  • Politika ponovnih pokušaja: poslovi prijevoda izvode do 3 ponovna pokušaja s eksponencijalnim backoffom na pogreškama API‑ja; vidi scripts/translate_web_docs_batch.js i scripts/translate_web_docs_sync.js.

Snimke zaslona za dokumentaciju

  • Pohranite slike pod website/static/img/.

  • Referencirajte ih u MD/MDX putem useBaseUrl('/img/<filename>') kako bi putanje radile s baseUrl web‑mjesta.

  • Nakon dodavanja ili preimenovanja slika pod website/static/img/, potvrdite da sve reference i dalje koriste useBaseUrl('/img/…') i da se renderiraju u lokalnom pregledu. Favikone

  • Viševeličinski favicon.ico generira se automatski u svim putanjama izgradnje (Make + skripte) putem website/scripts/build-favicon.mjs.

  • Nije potreban nikakav ručni korak; dovoljno je ažurirati icon-*.png. Savjet za pregled

  • Zadržite front‑matter id nepromijenjen u prevedenim dokumentima; prevedite samo title i sidebar_label kada su prisutni.

clean

  • Svrha: ukloniti lokalne artefakte izgradnje/pregleda.
  • Upotreba: make clean
  • Uklanja (ako je prisutno):
  • tmp/
  • web-local-preview/
  • website/build/

commit

  • Svrha: formatirati, testirati, ažurirati dnevnik promjena, commitati i pushati.
  • Upotreba: make commit
  • Detalji: pokreće Prettier (pisanje), make test, make test_i18n; dodaje dnevnik promjena kada postoje postavljene razlike; push na origin/<branch>.

eslint

  • Svrha: pokrenuti ESLint putem ravne konfiguracije.
  • Upotreba: make eslint

help

  • Svrha: popisati sve ciljeve s jednorednim opisima.
  • Upotreba: make help

lint

  • Svrha: lintati MailExtension koristeći web-ext.
  • Upotreba: make lint
  • Napomene: privremeno kopira sources/manifest_LOCAL.jsonsources/manifest.json; ignorira izgrađene ZIP‑ove; upozorenja ne ruše pipeline.

menu

  • Svrha: interaktivni izbornik za odabir Make cilja i neobaveznih argumenata.
  • Upotreba: pokrenite make bez argumenata.
  • Napomene: ako whiptail nije dostupan, izbornik se vraća na make help.

pack

  • Svrha: izgraditi ATN i LOCAL ZIP‑ove (ovisi o lint).
  • Upotreba: make pack
  • Savjet: povećajte verzije u oba sources/manifest_*.json prije pakiranja.

prettier

  • Svrha: formatirati repozitorij na mjestu.
  • Upotreba: make prettier

prettier_check

  • Svrha: provjeriti formatiranje (bez pisanja).
  • Upotreba: make prettier_check

prettier_write

  • Svrha: alias za prettier.
  • Upotreba: make prettier_write

test

  • Svrha: pokrenuti Prettier (pisanje), ESLint, zatim Vitest (pokrivenost ako je instalirana).
  • Upotreba: make test

test_i18n

  • Svrha: i18n‑fokusirani testovi za stringove dodatka i dokumente web‑stranice.
  • Upotreba: make test_i18n
  • Pokreće: npm run test:i18n i npm run -s test:website-i18n.

translate_app / translation_app

  • Svrha: prevesti UI stringove dodatka iz EN u druge jezike.
  • Upotreba: make translation_app OPTS="--locales all|de,fr"
  • Napomene: čuva strukturu ključeva i rezervirana mjesta; zapisuje u translation_app.log. Skripta: node scripts/translate_app.js --locales ….

translate_web_docs_batch / translate_web_docs_sync

  • Svrha: prevesti web dokumente iz website/docs/*.md u website/i18n/<locale>/....
  • Preferirano: translate_web_docs_batch (OpenAI Batch API)
    • Upotreba (zastavice): make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • Naslijeđeni pozicijski se i dalje prihvaća: OPTS="<doc|all> <lang|all>"
  • Ponašanje: gradi JSONL, učitava, provjerava svakih 30 s, preuzima rezultate, zapisuje datoteke.
  • Napomena: batch posao može potrajati do 24 sata (prema OpenAI prozoru). Konzola prikazuje proteklo vrijeme pri svakoj provjeri.
  • Okolina: OPENAI_API_KEY (obavezno), neobavezno OPENAI_MODEL, OPENAI_TEMPERATURE, OPENAI_BATCH_WINDOW (zadano 24h), BATCH_POLL_INTERVAL_MS.
  • Naslijeđeno: translate_web_docs_sync
    • Upotreba (zastavice): make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • Naslijeđeni pozicijski se i dalje prihvaća: OPTS="<doc|all> <lang|all>"
  • Ponašanje: sinkrone zahtjeve po paru (bez batch agregacije).
  • Napomene: Interaktivni upiti kada je OPTS izostavljen. Oba moda čuvaju blokove koda/inline kôd i ostavljaju front‑matter id nepromijenjenim; zapisuje u translation_web_batch.log (batch) ili translation_web_sync.log (sync).

translate_web_index / translation_web_index

  • Svrha: prevesti UI stringove web‑stranice (početna, navigacija, podnožje) iz website/i18n/en/code.json na sve jezike pod website/i18n/<locale>/code.json (isključujući en).
  • Upotreba: make translate_web_index ili make translate_web_index OPTS="--locales de,fr [--force]"
  • Zahtjevi: izvezite OPENAI_API_KEY (neobavezno: OPENAI_MODEL=gpt-4o-mini).
  • Ponašanje: validira JSON strukturu, čuva rezervirana mjesta u vitičastim zagradama, zadržava URL‑ove nepromijenjenima i ponovno pokušava s povratnim informacijama na greške validacije.

web_build

  • Svrha: izgraditi web stranicu dokumentacije u website/build.
  • Upotreba: make web_build OPTS="--locales en|de,en|all" (ili postavite BUILD_LOCALES="en de")
  • Unutarnje: node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …].
  • Ovisnosti: pokreće npm ci u website/ samo ako website/node_modules/@docusaurus nedostaje.

web_build_linkcheck

  • Svrha: provjera poveznica sigurna za offline.
  • Upotreba: make web_build_linkcheck OPTS="--locales en|all"
  • Napomene: gradi u tmp_linkcheck_web_pages; prepisuje GH Pages baseUrl u /; preskače udaljene HTTP(S) poveznice.

web_build_local_preview

  • Svrha: lokalni gh‑pages pregled s neobaveznim testovima/provjerom poveznica.
  • Upotreba: make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]"
  • Ponašanje: najprije pokušava Node preview poslužitelj (scripts/preview-server.mjs, podržava /__stop), vraća se na python3 -m http.server; poslužuje na 8080–8090; PID na web-local-preview/.server.pid.

web_push_github

  • Svrha: gurnuti website/build na granu gh-pages.
  • Upotreba: make web_push_github

Savjet: postavite NPM=… za nadjačavanje upravitelja paketa kojeg koristi Makefile (zadano je npm).