Rozwój
Przewodnik programistyczny
Aktualizuj dokumentację wyłącznie pod website/docs (angielski). Tłumaczenia pod website/i18n/<locale>/… są generowane i nie powinny być edytowane ręcznie. Użyj zadań tłumaczeń (np. make translate_web_docs_batch), aby odświeżyć zlokalizowaną treść.
Wymagania wstępne
- Node.js 22+ i npm (testowane z Node 22)
- Thunderbird 128 ESR lub nowszy (do testów ręcznych)
Struktura projektu (wysoki poziom)
- Katalog główny: skrypt pakowania
distribution_zip_packer.sh, dokumentacja, zrzuty ekranu sources/: główny kod dodatku (skrypt w tle, UI opcji/popupu, manifesty, ikony)tests/: zestaw testów Vitestwebsite/: dokumentacja Docusaurusa (z i18n wwebsite/i18n/de/...)
Instalacja i narzędzia
- Zainstaluj zależności w katalogu głównym:
npm ci - Dokumentacja (opcjonalnie):
cd website && npm ci - Wyświetl cele:
make help
Tryb deweloperski na żywo (web‑ext run)
- Szybka pętla w Firefox Desktop (tylko smoke testy UI):
npx web-ext run --source-dir sources --target=firefox-desktop- Uruchom w Thunderbirdzie (zalecane dla MailExtensions):
npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"- Wskazówki:
- Trzymaj otwartą Konsolę błędów Thunderbirda (Narzędzia → Narzędzia deweloperskie → Konsola błędów).
- Strony zdarzeń MV3 są wstrzymywane w bezczynności; przeładuj dodatek po zmianach w kodzie albo pozwól web‑ext na automatyczny reload.
- Niektóre zachowania specyficzne dla Firefoksa różnią się; zawsze weryfikuj w Thunderbirdzie, aby zachować zgodność API.
- Ścieżki do binariów Thunderbirda (przykłady):
- Linux:
thunderbird(np./usr/bin/thunderbird) - macOS:
/Applications/Thunderbird.app/Contents/MacOS/thunderbird - Windows:
"C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe" - Izolacja profilu: Używaj osobnego profilu Thunderbirda do developmentu, aby nie wpływać na codzienną konfigurację.
Cele Make (alfabetycznie)
Makefile standaryzuje typowe przepływy developerskie. Uruchom make help w dowolnym momencie, aby zobaczyć jednolinijkowe podsumowanie każdego celu.
Wskazówka: uruchomienie make bez celu otwiera proste menu Whiptail do wyboru celu.
| Cel | Jednolinijkowy opis |
|---|---|
clean | Usuń lokalne artefakty build/preview (tmp/, web-local-preview/, website/build/). |
commit | Sformatuj, uruchom testy (w tym i18n), zaktualizuj changelog, commit i push. |
eslint | Uruchom ESLint przez flat config (npm run -s lint:eslint). |
help | Wypisz wszystkie cele z jednolinijkowymi opisami (posortowane). |
lint | web‑ext lint na sources/ (tymczasowy manifest; ignoruje pliki ZIP; niekrytyczne). |
menu | Interaktywne menu do wyboru celu i opcjonalnych argumentów. |
pack | Zbuduj ZIPy ATN i LOCAL (uruchamia linter; wywołuje skrypt pakujący). |
prettier | Sformatuj repozytorium w miejscu (zapisuje zmiany). |
prettier_check | Prettier w trybie sprawdzania (bez zapisów); kończy się błędem, jeśli wymagane jest przeformatowanie. |
prettier_write | Alias dla prettier. |
test | Prettier (zapis), ESLint, potem Vitest (pokrycie, jeśli skonfigurowane). |
test_i18n | Testy tylko i18n: placeholdery/parytet dodatku + parytet strony. |
translate_app | Alias dla translation_app. |
translation_app | Przetłumacz ciągi UI aplikacji z sources/_locales/en/messages.json. |
translate_web_docs_batch | Tłumacz dokumenty strony przez OpenAI Batch API (zalecane). |
translate_web_docs_sync | Tłumacz dokumenty strony synchronicznie (legacy, bez batcha). |
translate_web_index | Alias dla translation_web_index. |
translation_web_index | Przetłumacz UI strony głównej/paska nawigacji/stopki (website/i18n/en/code.json → .../<lang>/code.json). |
web_build | Zbuduj dokumentację do website/build (obsługuje --locales / BUILD_LOCALES). |
web_build_linkcheck | Bezpieczne offline sprawdzanie linków (pomija zdalne HTTP[S]). |
web_build_local_preview | Lokalny podgląd gh‑pages; automatyczny serwer na 8080–8090; opcjonalne testy/sprawdzanie linków. |
web_push_github | Wypchnij website/build na gałąź gh-pages. |
Składnia opcji
- Użyj
make <command> OPTS="…"do przekazywania opcji (zalecane cudzysłowy). Każdy cel poniżej pokazuje przykładowe użycie.
--
Wskazówki dla budowania lokalizacji
- Buduj podzbiór lokalizacji: ustaw
BUILD_LOCALES="en de"lub przekażOPTS="--locales en,de"do celów webowych. - Podgląd konkretnej lokalizacji:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.
Budowanie i pakowanie
- Zbuduj ZIPy:
make pack - Tworzy ZIPy ATN i LOCAL w katalogu głównym repo (nie edytuj artefaktów ręcznie)
- Wskazówka: zaktualizuj wersję zarówno w
sources/manifest_ATN.json, jak i wsources/manifest_LOCAL.jsonprzed pakowaniem - Instalacja ręczna (dev): Thunderbird → Narzędzia → Dodatki i Motywy → koło zębate → Zainstaluj dodatek z pliku… → wybierz zbudowany ZIP
Test
- Pełny zestaw:
make test(Vitest) - Pokrycie (opcjonalnie):
npm i -D @vitest/coverage-v8- Uruchom
make test; otwórzcoverage/index.htmlpo raport HTML - Tylko i18n:
make test_i18n(klucze UI/placeholdery/tytuły + parytet strony per‑locale per‑doc z kontrolą id/title/sidebar_label)
Debugowanie i logi
- Konsola błędów: Narzędzia → Narzędzia deweloperskie → Konsola błędów
- Przełącz szczegółowe logi w czasie działania:
- Włącz:
messenger.storage.local.set({ debug: true }) - Wyłącz:
messenger.storage.local.set({ debug: false }) - Logi pojawiają się podczas komponowania/wysyłania odpowiedzi
Dokumentacja (strona)
- Serwer deweloperski:
cd website && npm run start - Zbuduj statyczną stronę:
cd website && npm run build - Odpowiedniki Make (alfabetycznie):
make web_build,make web_build_linkcheck,make web_build_local_preview,make web_push_github - Przykłady użycia:
- Tylko EN, pomiń testy/sprawdzanie linków, bez push:
make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run" - Wszystkie lokalizacje, z testami/sprawdzaniem linków, potem push:
make web_build_local_preview && make web_push_github - Przed publikacją uruchom bezpieczne offline sprawdzanie linków:
make web_build_linkcheck. - i18n: angielski znajduje się w
website/docs/*.md; niemieckie tłumaczenia wwebsite/i18n/de/docusaurus-plugin-content-docs/current/*.md - Wyszukiwanie: Jeśli w CI ustawiono zmienne środowiskowe Algolia DocSearch (
DOCSEARCH_APP_ID,DOCSEARCH_API_KEY,DOCSEARCH_INDEX_NAME), strona używa wyszukiwarki Algolia; w przeciwnym razie korzysta z wyszukiwania lokalnego. Na stronie głównej naciśnij/lubCtrl+K, aby otworzyć pole wyszukiwania.
Trasa przekierowania darowizn
website/src/pages/donate.js- Trasa:
/donate(oraz/<locale>/donate) - Zachowanie:
- Jeśli bieżąca trasa ma locale (np.
/de/donate), użyj go - W przeciwnym razie wybierz najlepsze dopasowanie z
navigator.languageswzględem skonfigurowanych lokalizacji; w razie potrzeby użyj domyślnej lokalizacji - Przekierowuje do:
en→/docs/donation- pozostałe →
/<locale>/docs/donation - Używa
useBaseUrldo poprawnej obsługi baseUrl - Zawiera meta refresh + link
noscriptjako awaryjny
Wskazówki dot. podglądu
- Zatrzymaj podgląd Node w sposób czysty: otwórz
http://localhost:<port>/__stop(wypisywane poLocal server started). - Jeśli obrazy nie ładują się w MDX/JSX, użyj
useBaseUrl('/img/...'), aby uwzględnićbaseUrlwitryny. - Podgląd startuje najpierw; sprawdzanie linków uruchamia się później i nie blokuje (zepsute linki zewnętrzne nie zatrzymają podglądu).
- Przykładowy URL podglądu:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/(wypisywany po „Local server started”). - Linki zewnętrzne w kontroli linków: Niektóre zewnętrzne serwisy (np. addons.thunderbird.net) blokują automatyczne crawlery i mogą zwracać 403 podczas sprawdzania linków. Podgląd i tak się uruchamia; można to zignorować.
Przetłumacz stronę
Co możesz tłumaczyć
- Tylko interfejs strony: strona główna, pasek nawigacyjny, stopka i inne ciągi UI. Treść dokumentów pozostaje na razie tylko po angielsku.
Gdzie edytować
- Edytuj
website/i18n/<locale>/code.json(użyjenjako odniesienia). Zachowaj bez zmian placeholdery takie jak{year},{slash},{ctrl},{k},{code1}.
Generuj lub odśwież pliki
- Utwórz brakujące stuby dla wszystkich lokalizacji:
npm --prefix website run i18n:stubs - Nadpisz stuby z angielskiego (po dodaniu nowych ciągów):
npm --prefix website run i18n:stubs:force - Alternatywa dla pojedynczej lokalizacji:
npx --prefix website docusaurus write-translations --locale <locale>
Przetłumacz ciągi UI strony głównej/paska nawigacji/stopki (OpenAI)
- Ustaw poświadczenia raz (shell lub .env):
export OPENAI_API_KEY=sk-...- Opcjonalnie:
export OPENAI_MODEL=gpt-4o-mini - Jednorazowo (wszystkie lokalizacje, pomiń en):
make translate_web_index - Ogranicz do konkretnych lokalizacji:
make translate_web_index OPTS="--locales de,fr" - Nadpisz istniejące wartości:
make translate_web_index OPTS="--force"
Walidacja i ponowienia
- Skrypt tłumaczenia weryfikuje kształt JSON, zachowuje placeholdery w klamrach i upewnia się, że adresy URL są niezmienione.
- W razie niepowodzenia walidacji ponawia z informacją zwrotną do 2 razy, zanim pozostawi istniejące wartości.
Podejrzyj swoją lokalizację
- Serwer deweloperski:
npm --prefix website run start - Odwiedź
http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/
Wysyłanie zmian
- Otwórz PR z edytowanym(i) plikiem(ami)
code.json. Zachowaj skupiony zakres zmian i jeśli to możliwe, dołącz szybki zrzut ekranu.
Wskazówki dotyczące bezpieczeństwa i konfiguracji
- Nie commituj
sources/manifest.json(tworzony tymczasowo przez build) - Utrzymuj
browser_specific_settings.gecko.idstabilny, aby zachować kanał aktualizacji
Trwałość ustawień
- Przechowywanie: Wszystkie ustawienia użytkownika znajdują się w
storage.locali przetrwają aktualizacje dodatku. - Instalacja: Wartości domyślne są stosowane tylko wtedy, gdy klucza ściśle brakuje (undefined).
- Aktualizacja: Migracja uzupełnia tylko brakujące klucze; istniejące wartości nigdy nie są nadpisywane.
- Znacznik schematu:
settingsVersion(obecnie1). - Klucze i wartości domyślne:
blacklistPatterns: string[]→['*intern*', '*secret*', '*passwor*']confirmBeforeAdd: boolean→falseconfirmDefaultChoice: 'yes'|'no'→'yes'warnOnBlacklistExcluded: boolean→true- Kod: zobacz
sources/background.js→initializeOrMigrateSettings()orazSCHEMA_VERSION.
Przepływ dev (dodawanie nowego ustawienia)
- Zwiększ
SCHEMA_VERSIONwsources/background.js. - Dodaj nowy klucz + domyślną wartość do obiektu
DEFAULTSwinitializeOrMigrateSettings(). - Stosuj zasadę „only-if-undefined” podczas nadawania domyślnych wartości; nie nadpisuj istniejących wartości.
- Jeśli ustawienie jest widoczne dla użytkownika, podłącz je w
sources/options.jsi dodaj zlokalizowane ciągi. - Dodaj/dostosuj testy (zob.
tests/background.settings.migration.test.js).
Wskazówki do testów ręcznych
- Symuluj świeżą instalację: wyczyść katalog danych rozszerzenia lub zacznij od nowego profilu.
- Symuluj aktualizację: ustaw
settingsVersionna0wstorage.locali przeładuj; potwierdź, że istniejące wartości pozostają niezmienione, a dodawane są tylko brakujące klucze.
Rozwiązywanie problemów
- Upewnij się, że Thunderbird ma wersję 128 ESR lub nowszą
- Używaj Konsoli błędów do problemów w czasie działania
- Jeśli zapisane ustawienia wydają się nie stosować poprawnie, uruchom ponownie Thunderbirda i spróbuj ponownie. (Thunderbird może buforować stan między sesjami; restart zapewnia wczytanie świeżych ustawień.)
CI i pokrycie
- GitHub Actions (
CI — Tests) uruchamia vitest z progami pokrycia (85% linii/funkcji/gałęzi/instrukcji). Jeśli progi nie są spełnione, zadanie kończy się niepowodzeniem. - Workflow przesyła artefakt
coverage-htmlz raportem HTML; pobierz go ze strony uruchomienia (Actions → najnowsze uruchomienie → Artifacts).
Wkład
- Zobacz CONTRIBUTING.md, aby poznać wytyczne dotyczące branchy/commitów/PR
- Wskazówka: Utwórz osobny profil deweloperski Thunderbirda do testów, aby nie wpływać na codzienny profil.
Tłumaczenia
- Uruchamianie dużych zadań tłumaczeń „all → all” może być wolne i kosztowne. Zacznij od podzbioru (np. kilka dokumentów i 1–2 lokalizacje), przejrzyj wynik, a następnie rozszerz.
- Polityka ponowień: zadania tłumaczeń wykonują do 3 ponowień z wykładniczym opóźnieniem przy błędach API; zob.
scripts/translate_web_docs_batch.jsiscripts/translate_web_docs_sync.js.
Zrzuty ekranu do dokumentacji
-
Przechowuj obrazy w
website/static/img/. -
Odwołuj się do nich w MD/MDX poprzez
useBaseUrl('/img/<filename>'), aby ścieżki działały zbaseUrlwitryny. -
Po dodaniu lub zmianie nazw obrazów w
website/static/img/potwierdź, że wszystkie odwołania nadal używająuseBaseUrl('/img/…')i renderują się w lokalnym podglądzie. Favikony -
Wielorozmiarowy
favicon.icojest generowany automatycznie we wszystkich ścieżkach builda (Make + skrypty) przezwebsite/scripts/build-favicon.mjs. -
Nie jest wymagany żaden krok ręczny; wystarczy zaktualizować
icon-*.png. Wskazówka dot. przeglądu -
Pozostaw
idw front‑matter bez zmian w tłumaczonych dokumentach; tłumacz tylkotitleisidebar_label, jeśli występują.
clean
- Cel: usuń lokalne artefakty build/preview.
- Użycie:
make clean - Usuwa (jeśli istnieje):
tmp/web-local-preview/website/build/
commit
- Cel: formatowanie, testy, aktualizacja changeloga, commit i push.
- Użycie:
make commit - Szczegóły: uruchamia Prettier (zapis),
make test,make test_i18n; dopisuje changelog, gdy są zindeksowane zmiany; wypycha naorigin/<branch>.
eslint
- Cel: uruchom ESLint przez flat config.
- Użycie:
make eslint
help
- Cel: wypisz wszystkie cele z jednolinijkowymi opisami.
- Użycie:
make help
lint
- Cel: lint MailExtension przy użyciu
web-ext. - Użycie:
make lint - Uwagi: tymczasowo kopiuje
sources/manifest_LOCAL.json→sources/manifest.json; ignoruje zbudowane ZIPy; ostrzeżenia nie powodują niepowodzenia potoku.
menu
- Cel: interaktywne menu do wyboru celu Make i opcjonalnych argumentów.
- Użycie: uruchom
makebez argumentów. - Uwagi: jeśli
whiptailnie jest dostępne, menu używamake helpjako zapasowego.
pack
- Cel: zbuduj ZIPy ATN i LOCAL (zależy od
lint). - Użycie:
make pack - Wskazówka: podnieś wersje w obu
sources/manifest_*.jsonprzed pakowaniem.
prettier
- Cel: sformatuj repozytorium w miejscu.
- Użycie:
make prettier
prettier_check
- Cel: zweryfikuj formatowanie (bez zapisów).
- Użycie:
make prettier_check
prettier_write
- Cel: alias dla
prettier. - Użycie:
make prettier_write
test
- Cel: uruchom Prettier (zapis), ESLint, a następnie Vitest (pokrycie, jeśli zainstalowane).
- Użycie:
make test
test_i18n
- Cel: testy skupione na i18n dla ciągów dodatku i dokumentacji strony.
- Użycie:
make test_i18n - Uruchamia:
npm run test:i18ninpm run -s test:website-i18n.
translate_app / translation_app
- Cel: przetłumacz ciągi UI dodatku z EN na inne lokalizacje.
- Użycie:
make translation_app OPTS="--locales all|de,fr" - Uwagi: zachowuje strukturę kluczy i placeholdery; loguje do
translation_app.log. Forma skryptu:node scripts/translate_app.js --locales ….
translate_web_docs_batch / translate_web_docs_sync
- Cel: przetłumacz dokumenty strony z
website/docs/*.mdnawebsite/i18n/<locale>/.... - Preferowane:
translate_web_docs_batch(OpenAI Batch API)- Użycie (flagi):
make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Starsza składnia pozycyjna jest nadal akceptowana:
OPTS="<doc|all> <lang|all>"
- Użycie (flagi):
- Zachowanie: buduje JSONL, wysyła, odpytuje co 30 s, pobiera wyniki, zapisuje pliki.
- Uwaga: zadanie wsadowe może zająć do 24 godzin (zgodnie z oknem wsadowym OpenAI). Konsola pokazuje upływ czasu przy każdym odpytywaniu.
- Zmienne środowiskowe:
OPENAI_API_KEY(wymagane), opcjonalneOPENAI_MODEL,OPENAI_TEMPERATURE,OPENAI_BATCH_WINDOW(domyślnie 24 h),BATCH_POLL_INTERVAL_MS. - Legacy:
translate_web_docs_sync- Użycie (flagi):
make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Starsza składnia pozycyjna jest nadal akceptowana:
OPTS="<doc|all> <lang|all>"
- Użycie (flagi):
- Zachowanie: synchroniczne żądania per‑para (bez agregacji wsadowej).
- Uwagi: Interaktywne pytania, gdy pominięto
OPTS. Oba tryby zachowują bloki kodu/kod inline i pozostawiająidw front‑matter bez zmian; logują dotranslation_web_batch.log(batch) lubtranslation_web_sync.log(sync).
translate_web_index / translation_web_index
- Cel: przetłumacz ciągi UI strony (strona główna, pasek nawigacji, stopka) z
website/i18n/en/code.jsonna wszystkie lokalizacje podwebsite/i18n/<locale>/code.json(z wyłączeniemen). - Użycie:
make translate_web_indexlubmake translate_web_index OPTS="--locales de,fr [--force]" - Wymagania: wyeksportuj
OPENAI_API_KEY(opcjonalnie:OPENAI_MODEL=gpt-4o-mini). - Zachowanie: weryfikuje strukturę JSON, zachowuje placeholdery w klamrach, utrzymuje niezmienione adresy URL i ponawia z informacją zwrotną przy błędach walidacji.
web_build
- Cel: zbuduj stronę dokumentacji do
website/build. - Użycie:
make web_build OPTS="--locales en|de,en|all"(lub ustawBUILD_LOCALES="en de") - Wewnątrz:
node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …]. - Zależności: uruchamia
npm ciwwebsite/tylko jeśli brakujewebsite/node_modules/@docusaurus.
web_build_linkcheck
- Cel: bezpieczne offline sprawdzanie linków.
- Użycie:
make web_build_linkcheck OPTS="--locales en|all" - Uwagi: buduje do
tmp_linkcheck_web_pages; przepisujebaseUrlGH Pages na/; pomija zdalne linki HTTP(S).
web_build_local_preview
- Cel: lokalny podgląd gh‑pages z opcjonalnymi testami/sprawdzaniem linków.
- Użycie:
make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]" - Zachowanie: najpierw próbuje serwera podglądu Node (
scripts/preview-server.mjs, obsługuje/__stop), w razie potrzeby przełącza się napython3 -m http.server; serwuje na 8080–8090; PID wweb-local-preview/.server.pid.
web_push_github
- Cel: wypchnij
website/buildna gałąźgh-pages. - Użycie:
make web_push_github
Wskazówka: ustaw NPM=…, aby nadpisać menedżera pakietów używanego przez Makefile (domyślnie npm).