Razvoj
Razvojni Vodič
Ažurirajte dokumentaciju samo pod website/docs (engleski). Prevodi pod website/i18n/<locale>/… se generiraju i ne trebaju se ručno uređivati. Koristite zadatke prevođenja (npr. make translate_web_docs_batch) za osvježavanje lokaliziranog sadržaja.
Uslovi
- Node.js 22+ i npm (testirano sa Node 22)
- Thunderbird 128 ESR ili noviji (za ručno testiranje)
Raspored projekta (visoki nivo)
- Koren: skripta za pakovanje
distribution_zip_packer.sh, dokumentacija, snimke ekrana sources/: glavni kod dodatka (pozadina, opcije/popup UI, manifesti, ikone)tests/: Vitest paketwebsite/: Docusaurus dokumentacija (sa i18n podwebsite/i18n/de/...)
Instalacija i alati
- Instalirajte glavne zavisnosti:
npm ci - Dokumentacija (opcionalno):
cd website && npm ci - Otkrijte ciljeve:
make help
Živi razvoj (web‑ext run)
- Brza petlja u Firefox Desktop (samo UI dimne testove):
npx web-ext run --source-dir sources --target=firefox-desktop- Pokrenite u Thunderbirdu (preporučuje se 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 za greške (Alati → Razvojni alati → Konzola za greške).
- MV3 event stranice su suspendovane kada su neaktivne; ponovo učitajte dodatak posle izmjena u kodu ili dozvolite web‑ext automatsko ponovno učitavanje.
- Neka se ponašanja koja su samo za Firefox razlikuju; uvijek provjerite u Thunderbirdu radi pariteta API-ja.
- Putanje binarnih datoteka 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 poseban Thunderbird profil za razvoj kako biste izbjegli uticaj na vašu svakodnevnu postavku.
Ciljevi izrade (abecedno)
Makefile standardizuje uobičajene razvojne tokove. Pokrenite make help u bilo kojem trenutku za sažetak svake oznake.
Savjet: pokretanje make bez cilja otvara jednostavni Whiptail meni za odabir cilja.
| Cilj | Jedna linija opis |
|---|---|
clean | Uklonite lokalne artefakte izrade/pregleda (tmp/, web-local-preview/, website/build/). |
commit | Formatirajte, pokrenite testove (uključujući i18n), ažurirajte changelog, komitujte & učitajte. |
eslint | Pokrenite ESLint putem ravnog konfiguracijskog datoteke (npm run -s lint:eslint). |
help | Ispisujte sve ciljeve sa jednom linijom dokumenata (sortirano). |
lint | web‑ext lint na sources/ (privremeni manifest; ignorira ZIP‑ove; ne‑fatalno). |
menu | Interaktivni meni za odabir cilja i opcionalnih argumenata. |
pack | Izgradite ATN & LOCAL ZIP-ove (pokreće linter; poziva skriptu pakera). |
prettier | Formatirajte repozitorij na licu mjesta (upisuje promjene). |
prettier_check | Prettier u načinu provjere (bez pisanja); neuspijeva ako je potrebno ponovo formatirati. |
prettier_write | Alias za prettier. |
test | Prettier (upis), ESLint, zatim Vitest (pokriće ako je konfigurirano). |
test_i18n | i18n‑samo testovi: dodaci oznake/paritet + paritet stranice po lokalitetu po dokumentu. |
translate_app | Alias za translation_app. |
translation_app | Prevedite UI stringove aplikacije sa sources/_locales/en/messages.json. |
translate_web_docs_batch | Prevedite dokumente web stranica putem OpenAI Batch API (preporučeno). |
translate_web_docs_sync | Prevedite dokumente web stranica sinhronizovano (legacy, ne-batch). |
translate_web_index | Alias za translation_web_index. |
translation_web_index | Prevedite UI website/i18n/en/code.json → .../<lang>/code.json (početna stranica/navigation/footer). |
web_build | Izgradite dokumente u website/build (podržava --locales / BUILD_LOCALES). |
web_build_linkcheck | Offline‑sigurna provjera linkova (preskočite udaljene HTTP[S]). |
web_build_local_preview | Lokalni pregled gh‑pages; automatski poslužite na 8080–8090; opcionalni testovi/provjera linkova. |
web_push_github | Poništite website/build u gh-pages granu. |
Sintaksa za opcije
- Koristite
make <command> OPTS="…"za prosljeđivanje opcija (citatni znakovi su preporučeni). Svaka oznaka u nastavku prikazuje primjer korištenja.
--
Savjeti za izgradnju lokaliteta
- Izgradite podskup lokaliteta: postavite
BUILD_LOCALES="en de"ili proslijediteOPTS="--locales en,de"u web ciljeve. - Pregled specifičnog lokaliteta:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.
Izgradite i paketirajte
- Izgradite ZIP-ove:
make pack - Proizvodi ATN i LOCAL ZIP-ove u korijenu repozitorija (ne uređujte artefakte ručno)
- Savjet: ažurirajte verziju u oba
sources/manifest_ATN.jsonisources/manifest_LOCAL.jsonprije pakovanja - Ručna instalacija (razvoj): Thunderbird → Alati → Dodaci i Temi → zupčanik → Instaliraj dodatak iz datoteke… → odaberite izgrađeni ZIP
Test
- Potpuni paket:
make test(Vitest) - Pokriće (opcionalno):
npm i -D @vitest/coverage-v8- Pokrenite
make test; otvoritecoverage/index.htmlza HTML izvještaj - i18n samo:
make test_i18n(UI ključevi/placeholderi/naslovi + paritet stranice po lokalitetu po dokumentu prema ID/naslova/sidebar_label provjerama)
Debugging i zapisi
- Konzola grešaka: Alati → Razvojni alati → Konzola grešaka
- Prebacite detaljne zapise u vrijeme izvođenja:
- Omogućiti:
messenger.storage.local.set({ debug: true }) - Onemogućiti:
messenger.storage.local.set({ debug: false }) - Zapisi se pojavljuju dok se sastavljaju/šalju odgovori
Dokumenti (web stranica)
- Razvojni server:
cd website && npm run start - Izgradite statičku stranicu:
cd website && npm run build - Napravite ekvivalente (abecedno):
make web_build,make web_build_linkcheck,make web_build_local_preview,make web_push_github - Primjeri korištenja:
- EN samo, preskočite testove/provjeru linkova, bez učitavanja:
make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run" - Svi lokaliteti, sa testovima/provjerom linkova, zatim učitajte:
make web_build_local_preview && make web_push_github - Prije objavljivanja, pokrenite offline‑sigurnu provjeru linkova:
make web_build_linkcheck. - i18n: Engleski se nalazi u
website/docs/*.md; Njemački prevodi uwebsite/i18n/de/docusaurus-plugin-content-docs/current/*.md - Pretraga: Ako su Algolia DocSearch env varijable postavljene u CI (
DOCSEARCH_APP_ID,DOCSEARCH_API_KEY,DOCSEARCH_INDEX_NAME), stranica koristi Algolia pretragu; inače se vraća na lokalnu pretragu. Na početnoj stranici, pritisnite/iliCtrl+Kda otvorite pretraživač.
Putanja za preusmjeravanje donacija
website/src/pages/donate.js- Ruta:
/donate(i/<locale>/donate) - Ponašanje:
- Ako trenutna ruta ima lokalitet (npr.
/de/donate), koristite ga - Inače, odaberite najbolju podudarnost između
navigator.languagesi konfigurisanih lokaliteta; vratite se na zadani lokalitet - Preusmjerava na:
en→/docs/donation- ostali →
/<locale>/docs/donation - Koristi
useBaseUrlza pravilno rukovanje baseUrl-om - Uključuje meta refresh +
noscriptlink kao rezervu
Savjeti za pregled
- Zaustavite pregled Node-a uredno: otvorite
http://localhost:<port>/__stop(ispisano nakonLocal server started). - Ako slike ne učitavaju u MDX/JSX, koristite
useBaseUrl('/img/...')da biste poštovalibaseUrlstranice. - Pregled se pokreće prvi; provjera linkova se izvršava kasnije i nije blokirajuća (pokvareni spoljašnji linkovi neće zaustaviti pregled).
- URL primjera pregleda:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/(ispisano nakon “Lokalni server pokrenut”). - Spoljašnji linkovi u provjeri linkova: Neki spoljašnji sajtovi (npr. addons.thunderbird.net) blokiraju automatizovane pretraživače i mogu pokazati 403 u provjeri linkova. Pregled se i dalje pokreće; ovo se može ignorisati.
Prevedite web stranicu
Šta možete prevesti
- Samo UI web stranice: početna stranica, navigacija, podnožje i drugi UI stringovi. Sadržaj dokumentacije ostaje samo na engleskom za sada.
Gdje uređivati
- Uredite
website/i18n/<locale>/code.json(koristiteenkao referencu). Držite placeholder-e kao{year},{slash},{ctrl},{k},{code1}nepromijenjene.
Generišite ili osvježite datoteke
- Kreirajte nedostajuće stubove za sve lokalitete:
npm --prefix website run i18n:stubs - Prepišite stubove sa engleskog (nakon dodavanja novih stringova):
npm --prefix website run i18n:stubs:force - Alternativa za jedan lokalitet:
npx --prefix website docusaurus write-translations --locale <locale>
Prevedite stringove UI početne stranice/navigacije/podnožja (OpenAI)
- Postavite vjerodajnice jednom (shell ili .env):
export OPENAI_API_KEY=sk-...- Opcionalno:
export OPENAI_MODEL=gpt-4o-mini - Jednokratno (svi lokaliteti, preskočite en):
make translate_web_index - Ograničite se na specifične lokalitete:
make translate_web_index OPTS="--locales de,fr" - Prepišite postojeće vrijednosti:
make translate_web_index OPTS="--force"
Validacija i ponovni pokušaji
- Skripta za prevođenje validira JSON oblik, čuva placeholders u vitičastim zagradama i osigurava da su URL-ovi nepromijenjeni.
- U slučaju neuspeha validacije, ponovo pokušava sa povratnim informacijama do 2 puta pre nego što zadrži postojeće vrijednosti.
Pregledajte svoj lokalitet
- Dev server:
npm --prefix website run start - Posjetite
http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/
Podnošenje
- Otvorite PR sa uređenom
code.jsondatotekom. Držite izmjene fokusirane i uključite brzi snimak kad god je to moguće.
Savjeti za sigurnost i konfiguraciju
- Ne komitujte
sources/manifest.json(privremeno kreirani od gradnje) - Održavajte
browser_specific_settings.gecko.idstabilnim kako biste sačuvali kanal ažuriranja
Održavanje postavki
- Skladište: Sve korisničke postavke žive u
storage.locali ostaju sačuvane kroz ažuriranja dodatka. - Instalacija: Zadane postavke se primjenjuju samo kada ključ strogo nedostaje (neodređeno).
- Ažuriranje: Migracija popunjava samo nedostajuće ključeve; postojeće vrijednosti nikada se ne prepisuju.
- Oznaka sheme:
settingsVersion(trenutno1). - Ključevi i zadate vrijednosti:
blacklistPatterns: string[]→['*intern*', '*secret*', '*passwor*']confirmBeforeAdd: boolean→falseconfirmDefaultChoice: 'yes'|'no'→'yes'warnOnBlacklistExcluded: boolean→true- Kod: vidjeti
sources/background.js→initializeOrMigrateSettings()iSCHEMA_VERSION.
Razvojni tok rada (dodavanje nove postavke)
- Uvećajte
SCHEMA_VERSIONusources/background.js. - Dodajte novi ključ + zadatu vrijednost u
DEFAULTSobjekt uinitializeOrMigrateSettings(). - Koristite pravilo "samo ako je neodređeno" kada seedujete zadatke; nemojte prepisivati postojeće vrijednosti.
- Ako je postavka vidljiva korisnicima, povežite je u
sources/options.jsi dodajte lokalizirane stringove. - Dodajte/izmijenite testove (vidjeti
tests/background.settings.migration.test.js).
Savjeti za manualno testiranje
- Simulirajte svježu instalaciju: očistite direktorij podataka proširenja ili započnite s novim profilom.
- Simulirajte ažuriranje: postavite
settingsVersionna0ustorage.locali ponovo učitajte; potvrdite da postojeće vrijednosti ostaju nepromijenjene i da su dodani samo nedostajući ključevi.
Rješavanje problema
- Osigurajte da je Thunderbird 128 ESR ili noviji
- Koristite konzolu grešaka za probleme pri izvođenju
- Ako se pohranjene postavke ne primjenjuju ispravno, ponovo pokrenite Thunderbird i pokušajte ponovo. (Thunderbird može keširati stanje kroz sesije; ponovno pokretanje osigurava da se učitaju nove postavke.)
CI i pokriće
- GitHub Akcije (
CI — Tests) pokreću vitest sa pragovima pokrića (85% redova/funkcija/grana/statements). Ako pragovi nisu ispunjeni, posao ne uspijeva. - Radni tok učitava artefakt
coverage-htmlsa HTML izvještajem; preuzmite ga sa stranice izvršenja (Akcije → posljednje izvršenje → Artefakti).
Doprinos
- Pogledajte CONTRIBUTING.md za smjernice o granama/commitima/PR-ima
- Savjet: Kreirajte odvojeni Thunderbird razvojni profil za testiranje kako ne biste uticali na svoj svakodnevni profil.
Prevođenje
- Pokretanje velikih "svi → svi" poslova prevođenja može biti sporo i skupo. Započnite sa podskupom (npr. nekim dokumentima i 1-2 lokaliteta), pregledajte rezultat, a zatim proširite.
- Politika ponovnog pokušaja: poslovi prevođenja izvode do 3 ponovna pokušaja s eksponencijalnim povratkom na greške u API-ju; vidi
scripts/translate_web_docs_batch.jsiscripts/translate_web_docs_sync.js.
Snimke ekrana za dokumente
-
Pohranite slike pod
website/static/img/. -
Referencirajte ih u MD/MDX putem
useBaseUrl('/img/<filename>')tako da putanje rade sabaseUrlstranice. -
Nakon dodavanja ili preimenovanja slika pod
website/static/img/, potvrdite da sve reference još uvijek koristeuseBaseUrl('/img/…')i prikazuju se u lokalnom pregledu. Favicons -
Višedimenzionalni
favicon.icoautomatski se generira u svim putanjama izgradnje (Napravite + skripte) putemwebsite/scripts/build-favicon.mjs. -
Nema potrebe za ručnom radnjom; ažuriranje
icon-*.pngje dovoljno. Savjet o pregledu -
Održavajte prednje stanje
idnepromijenjeno u prevedenim dokumentima; prevedite samotitleisidebar_labelkada su prisutni.
clean
- Svrha: uklonite lokalne artefakte izrade/pregleda.
- Upotreba:
make clean - Uklanja (ako je prisutno):
tmp/web-local-preview/website/build/
commit
- Svrha: formatirajte, testirajte, ažurirajte changelog, komitujte i učitajte.
- Upotreba:
make commit - Detalji: pokreće Prettier (upis),
make test,make test_i18n; dodaje changelog kada postoje izmjene u svakom redu; učitava uorigin/<branch>.
eslint
- Svrha: pokrenite ESLint putem ravnog konfiguracijskog datoteke.
- Upotreba:
make eslint
help
- Svrha: ispiši sve ciljeve sa jednom linijom dokumenata.
- Upotreba:
make help
lint
- Svrha: lint MailExtension koristeći
web-ext. - Upotreba:
make lint - Napomene: privremeno kopira
sources/manifest_LOCAL.json→sources/manifest.json; ignorira izgrađene ZIP-ove; upozorenja ne neuspijevaju pipeline.
menu
- Svrha: interaktivni meni za odabir Make cilja i opcionalnih argumenata.
- Upotreba: pokrenite
makebez argumenata. - Napomene: ako
whiptailnije dostupan, meni se vraća namake help.
pack
- Svrha: izgradite ATN i LOCAL ZIP-ove (zavisno od
lint). - Upotreba:
make pack - Savjet: uvećajte verzije u
sources/manifest_*.jsonpre pakovanja.
prettier
- Svrha: formatirati repozitorij na licu mjesta.
- Upotreba:
make prettier
prettier_check
- Svrha: verificirati formatiranje (bez pisanja).
- Upotreba:
make prettier_check
prettier_write
- Svrha: alias za
prettier. - Upotreba:
make prettier_write
test
- Svrha: pokrenuti Prettier (upis), ESLint, zatim Vitest (pokriće ako je instalirano).
- Upotreba:
make test
test_i18n
- Svrha: i18n‑fokusirani testovi za stringove dodataka i dokumente web stranice.
- Upotreba:
make test_i18n - Pokreće:
npm run test:i18ninpm run -s test:website-i18n.
translate_app / translation_app
- Svrha: prevesti UI stringove dodatka sa EN na druge jezike.
- Upotreba:
make translation_app OPTS="--locales all|de,fr" - Napomene: čuva strukturu ključeva i placeholder-e; zapisuje u
translation_app.log. Forma skripte:node scripts/translate_app.js --locales ….
translate_web_docs_batch / translate_web_docs_sync
- Svrha: prevesti dokumente web stranica sa
website/docs/*.mduwebsite/i18n/<locale>/.... - Preporučeno:
translate_web_docs_batch(OpenAI Batch API)- Upotreba (flage):
make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy pozivni parametar je i dalje prihvaćen:
OPTS="<doc|all> <lang|all>"
- Upotreba (flage):
- Ponašanje: gradi JSONL, učitava, kontroliše svake 30s, preuzima rezultate, piše datoteke.
- Napomena: posao obrade može potrajati do 24 sata da se završi (prema OpenAI-ovom vremenskom okviru za obradu). Konzola prikazuje proteklo vreme na svakoj kontroli.
- Env:
OPENAI_API_KEY(obavezno), opcionalnoOPENAI_MODEL,OPENAI_TEMPERATURE,OPENAI_BATCH_WINDOW(zadano 24h),BATCH_POLL_INTERVAL_MS. - Legacy:
translate_web_docs_sync- Upotreba (flage):
make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy pozivni parametar je i dalje prihvaćen:
OPTS="<doc|all> <lang|all>"
- Upotreba (flage):
- Ponašanje: sinhroni zahtevi po pack-ima (bez agregacije paketa).
- Napomene: Interaktivni upiti kada je
OPTSizostavljen. Oba načina čuvaju blokove koda/inline kod i drže prednju oznakuidnepromijenjenu; zapisuje utranslation_web_batch.log(batch) ilitranslation_web_sync.log(sync).
translate_web_index / translation_web_index
- Svrha: prevesti UI stringove web stranice (početna stranica, navigacija, podnožje) sa
website/i18n/en/code.jsonna sve lokalitete podwebsite/i18n/<locale>/code.json(izuzimajućien). - Upotreba:
make translate_web_indexilimake translate_web_index OPTS="--locales de,fr [--force]" - Zahtjevi: izvoz
OPENAI_API_KEY(opcionalno:OPENAI_MODEL=gpt-4o-mini). - Ponašanje: validira strukturu JSON-a, čuva placeholdere, drži URL-ove nepromijenjenim i ponavlja sa povratnim informacijama o greškama validacije.
web_build
- Svrha: izgraditi stranicu dokumentacije u
website/build. - Upotreba:
make web_build OPTS="--locales en|de,en|all"(ili postaviteBUILD_LOCALES="en de") - Interni detalji:
node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …]. - Zavisnosti: pokreće
npm ciuwebsite/samo akowebsite/node_modules/@docusaurusnedostaje.
web_build_linkcheck
- Svrha: offline‑sigurna provjera linkova.
- Upotreba:
make web_build_linkcheck OPTS="--locales en|all" - Napomene: gradi do
tmp_linkcheck_web_pages; prepisuje GH PagesbaseUrlu/; preskoči udaljene HTTP(S) linkove.
web_build_local_preview
- Svrha: lokalni pregled gh‑stranica sa opcionalnim testovima/provjerom linkova.
- Upotreba:
make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]" - Ponašanje: prvo pokušava Node pregled server (
scripts/preview-server.mjs, podržava/__stop), vraća se napython3 -m http.server; poslužuje na 8080–8090; PID naweb-local-preview/.server.pid.
web_push_github
- Svrha: učitajte
website/buildugh-pagesgranu. - Upotreba:
make web_push_github
Savjet: postavite NPM=… da biste prepisali upravitelja paketa koji koristi Makefile (zadano npm).