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.json
isources/manifest_LOCAL.json
prije 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.html
za 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+K
da 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.languages
i konfigurisanih lokaliteta; vratite se na zadani lokalitet - Preusmjerava na:
en
→/docs/donation
- ostali →
/<locale>/docs/donation
- Koristi
useBaseUrl
za pravilno rukovanje baseUrl-om - Uključuje meta refresh +
noscript
link 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štovalibaseUrl
stranice. - 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
(koristiteen
kao 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.json
datotekom. 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.id
stabilnim kako biste sačuvali kanal ažuriranja
Održavanje postavki
- Skladište: Sve korisničke postavke žive u
storage.local
i 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
→false
confirmDefaultChoice: 'yes'|'no'
→'yes'
warnOnBlacklistExcluded: boolean
→true
- Kod: vidjeti
sources/background.js
→initializeOrMigrateSettings()
iSCHEMA_VERSION
.
Razvojni tok rada (dodavanje nove postavke)
- Uvećajte
SCHEMA_VERSION
usources/background.js
. - Dodajte novi ključ + zadatu vrijednost u
DEFAULTS
objekt 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.js
i 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
settingsVersion
na0
ustorage.local
i 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-html
sa 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.js
iscripts/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 sabaseUrl
stranice. -
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.ico
automatski se generira u svim putanjama izgradnje (Napravite + skripte) putemwebsite/scripts/build-favicon.mjs
. -
Nema potrebe za ručnom radnjom; ažuriranje
icon-*.png
je dovoljno. Savjet o pregledu -
Održavajte prednje stanje
id
nepromijenjeno u prevedenim dokumentima; prevedite samotitle
isidebar_label
kada 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
make
bez argumenata. - Napomene: ako
whiptail
nije 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_*.json
pre 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:i18n
inpm 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/*.md
uwebsite/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
OPTS
izostavljen. Oba načina čuvaju blokove koda/inline kod i drže prednju oznakuid
nepromijenjenu; 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.json
na sve lokalitete podwebsite/i18n/<locale>/code.json
(izuzimajućien
). - Upotreba:
make translate_web_index
ilimake 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 ci
uwebsite/
samo akowebsite/node_modules/@docusaurus
nedostaje.
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 PagesbaseUrl
u/
; 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/build
ugh-pages
granu. - Upotreba:
make web_push_github
Savjet: postavite NPM=…
da biste prepisali upravitelja paketa koji koristi Makefile (zadano npm
).