Lumaktaw patungo sa pangunahing content

Pag-unlad


Gabay sa Pag-develop

I-edit ang English lang; kusang kumakalat ang mga salin

I-update ang dokumentasyon tanging sa ilalim ng website/docs (English). Ang mga salin sa ilalim ng website/i18n/<locale>/… ay awtomatikong ginagawa at hindi dapat mano-manong i-edit. Gamitin ang mga gawain sa pagsasalin (hal., make translate_web_docs_batch) para i-refresh ang lokalisadong nilalaman.

Mga Kinakailangan

  • Node.js 22+ at npm (nasubukan sa Node 22)
  • Thunderbird 128 ESR o mas bago (para sa manual na pag-test)

Istruktura ng Proyekto (high‑level)

  • Root: packaging script distribution_zip_packer.sh, docs, mga screenshot
  • sources/: pangunahing code ng add-on (background, options/popup UI, manifests, icons)
  • tests/: suite ng Vitest
  • website/: mga docs ng Docusaurus (na may i18n sa ilalim ng website/i18n/de/...)

Pag-install at mga Tool

  • I-install ang mga dependency sa root: npm ci
  • Docs (opsyonal): cd website && npm ci
  • Tuklasin ang mga target: make help

Live Dev (web‑ext run)

  • Mabilis na loop sa Firefox Desktop (UI smoke‑tests lang):
  • npx web-ext run --source-dir sources --target=firefox-desktop
  • Patakbuhin sa Thunderbird (inirerekomenda para sa MailExtensions):
  • npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"
  • Mga tip:
  • Panatilihing bukas ang Error Console ng Thunderbird (Tools → Developer Tools → Error Console).
  • Ang MV3 event pages ay nasususpinde kapag idle; i-reload ang add‑on pagkatapos ng pagbabago sa code, o hayaan ang web‑ext na mag-auto‑reload.
  • May ilang pagkakaibang pang-Firefox lang; laging i-verify sa Thunderbird para sa API parity.
  • Mga path ng Thunderbird binary (mga halimbawa):
  • Linux: thunderbird (hal., /usr/bin/thunderbird)
  • macOS: /Applications/Thunderbird.app/Contents/MacOS/thunderbird
  • Windows: "C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe"
  • Paghiwalay ng profile: Gumamit ng hiwalay na Thunderbird profile para sa development upang maiwasang maapektuhan ang iyong araw‑araw na setup.

Mga Target ng Make (Alpabetikal)

Istandardisa ng Makefile ang mga karaniwang daloy ng dev. Patakbuhin ang make help anumang oras para sa isang one‑line na buod ng bawat target.

Tip: ang pagpapatakbo ng make nang walang target ay magbubukas ng simpleng Whiptail menu para pumili ng target.

TargetIsang linyang deskripsyon
cleanAlisin ang lokal na build/preview artifacts (tmp/, web-local-preview/, website/build/).
commitI-format, patakbuhin ang mga test (kasama ang i18n), i-update ang changelog, mag-commit at mag-push.
eslintPatakbuhin ang ESLint via flat config (npm run -s lint:eslint).
helpIlista ang lahat ng target na may one‑line na docs (nakaayos).
lintweb‑ext lint sa sources/ (pansamantalang manifest; hindi pinapansin ang mga ZIP; hindi fatal).
menuInteraktibong menu para pumili ng target at opsyonal na argumento.
packBumuo ng ATN at LOCAL ZIPs (pinapatakbo ang linter; tinatawag ang packer script).
prettierI-format ang repository in place (nagsusulat ng mga pagbabago).
prettier_checkPrettier sa check mode (walang isinusulat); babagsak kung kailangan ng reformat.
prettier_writeAlias para sa prettier.
testPrettier (write), ESLint, saka Vitest (coverage kung naka-configure).
test_i18nMga test na pang‑i18n lang: placeholders/parity ng add‑on + parity ng website.
translate_appAlias para sa translation_app.
translation_appIsalin ang mga string ng UI ng app mula sa sources/_locales/en/messages.json.
translate_web_docs_batchIsalin ang mga docs ng website sa pamamagitan ng OpenAI Batch API (inirerekomenda).
translate_web_docs_syncIsalin ang mga docs ng website nang sabay‑sabay (legacy, hindi batch).
translate_web_indexAlias para sa translation_web_index.
translation_web_indexIsalin ang UI ng homepage/navbar/footer (website/i18n/en/code.json → .../<lang>/code.json).
web_buildI-build ang docs sa website/build (sumusuporta sa --locales / BUILD_LOCALES).
web_build_linkcheckOffline‑safe na link check (nilalaktawan ang remote HTTP[S]).
web_build_local_previewLokal na gh‑pages preview; auto‑serve sa 8080–8090; opsyonal na tests/link‑check.
web_push_githubI-push ang website/build sa sangang gh-pages.

Syntax para sa mga opsyon

  • Gamitin ang make <command> OPTS="…" para ipasa ang mga opsyon (inirerekomenda ang quotes). Ipinapakita ng bawat target sa ibaba ang halimbawang paggamit.

--

Mga tip sa build ng locale

  • Bumuo ng subset ng mga locale: itakda ang BUILD_LOCALES="en de" o ipasa ang OPTS="--locales en,de" sa mga web target.
  • I-preview ang isang partikular na locale: http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.

Pag-build at Pag-package

  • Bumuo ng mga ZIP: make pack
  • Gumagawa ng ATN at LOCAL ZIPs sa repo root (huwag mano-manong i-edit ang mga artifact)
  • Tip: i-update ang bersyon sa parehong sources/manifest_ATN.json at sources/manifest_LOCAL.json bago mag-package
  • Manual na pag-install (dev): Thunderbird → Tools → Add‑ons and Themes → gear → Install Add‑on From File… → piliin ang na-build na ZIP

Test

  • Buong suite: make test (Vitest)
  • Coverage (opsyonal):
  • npm i -D @vitest/coverage-v8
  • Patakbuhin ang make test; buksan ang coverage/index.html para sa HTML report
  • i18n lang: make test_i18n (mga UI key/placeholders/titles + parity ng website per‑locale per‑doc na may id/title/sidebar_label checks)

Pag-debug at Mga Log

  • Error Console: Tools → Developer Tools → Error Console
  • I-toggle ang verbose logs sa runtime:
  • Enable: messenger.storage.local.set({ debug: true })
  • Disable: messenger.storage.local.set({ debug: false })
  • Lumilitaw ang mga log habang gumagawa/nagpapadala ng mga reply

Docs (website)

  • Dev server: cd website && npm run start
  • I-build ang static site: cd website && npm run build
  • Mga katumbas sa Make (alpabetikal): make web_build, make web_build_linkcheck, make web_build_local_preview, make web_push_github
  • Mga halimbawa ng paggamit:
  • EN lang, laktawan ang tests/link‑check, walang push: make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run"
  • Lahat ng locale, may tests/link‑check, tapos push: make web_build_local_preview && make web_push_github
  • Bago mag-publish, patakbuhin ang offline‑safe na link check: make web_build_linkcheck.
  • i18n: Ang English ay nasa website/docs/*.md; ang German na mga salin ay nasa website/i18n/de/docusaurus-plugin-content-docs/current/*.md
  • Paghahanap: Kung nakatakda sa CI ang mga env var ng Algolia DocSearch (DOCSEARCH_APP_ID, DOCSEARCH_API_KEY, DOCSEARCH_INDEX_NAME), gagamit ang site ng Algolia search; kung hindi, lilipat ito sa lokal na search. Sa homepage, pindutin ang / o Ctrl+K para buksan ang search box.

  • website/src/pages/donate.js
  • Ruta: /donate (at /<locale>/donate)
  • Asal:
  • Kung ang kasalukuyang ruta ay may locale (hal., /de/donate), gamitin ito
  • Kung hindi, pumili ng pinakamahusay na tugma mula sa navigator.languages kumpara sa naka-configure na mga locale; fallback sa default na locale
  • Nagre-redirect sa:
  • en/docs/donation
  • iba pa → /<locale>/docs/donation
  • Ginagamit ang useBaseUrl para sa tamang paghawak ng baseUrl
  • Kabilang ang meta refresh + link na noscript bilang fallback


Mga Tip sa Preview

  • Itigil nang malinis ang Node preview: buksan ang http://localhost:<port>/__stop (napi-print pagkatapos ng Local server started).
  • Kung hindi naglo-load ang mga larawan sa MDX/JSX, gamitin ang useBaseUrl('/img/...') para igalang ang site na baseUrl.
  • Ang preview ang nauuna; ang link check ay tatakbo pagkatapos at hindi nakahahadlang (ang sirang panlabas na mga link ay hindi pipigil sa preview).
  • Halimbawang preview URL: http://localhost:<port>/Thunderbird-Reply-with-Attachments/ (napi-print pagkatapos ng “Local server started”).
  • Mga panlabas na link sa link‑check: May ilang panlabas na site (hal., addons.thunderbird.net) na humaharang sa automated crawlers at maaaring magpakita ng 403 sa link checks. Magpapatuloy pa rin ang preview; ligtas na balewalain ang mga ito.

Isalin ang Website

Ano ang maaari mong isalin

  • Website UI lang: homepage, navbar, footer, at iba pang mga UI string. Mananatiling English‑only muna ang nilalaman ng Docs.

Saan mag-e-edit

  • I-edit ang website/i18n/<locale>/code.json (gamitin ang en bilang sanggunian). Panatilihing hindi nababago ang mga placeholder gaya ng {year}, {slash}, {ctrl}, {k}, {code1}.

Gumawa o i-refresh ang mga file

  • Gumawa ng mga nawawalang stub para sa lahat ng locale: npm --prefix website run i18n:stubs
  • I-overwrite ang mga stub mula English (pagkatapos magdagdag ng mga bagong string): npm --prefix website run i18n:stubs:force
  • Alternatibo para sa isang locale lang: npx --prefix website docusaurus write-translations --locale <locale>

Isalin ang mga string ng UI ng homepage/navbar/footer (OpenAI)

  • Itakda ang mga kredensyal minsan (shell o .env):
  • export OPENAI_API_KEY=sk-...
  • Opsyonal: export OPENAI_MODEL=gpt-4o-mini
  • Isang pasada (lahat ng locale, laktawan ang en): make translate_web_index
  • Limitahan sa partikular na mga locale: make translate_web_index OPTS="--locales de,fr"
  • I-overwrite ang mga umiiral na value: make translate_web_index OPTS="--force"

Pag-validate at mga retry

  • Sina-validate ng translation script ang hugis ng JSON, pinapanatili ang mga curly‑brace placeholder, at tinitiyak na hindi nagbabago ang mga URL.
  • Kapag nabigo ang validation, nagre-retry ito na may feedback hanggang 2 beses bago panatilihin ang umiiral na mga value.

I-preview ang iyong locale

  • Dev server: npm --prefix website run start
  • Bisitahin ang http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/

Pagsusumite

  • Magbukas ng PR na may na-edit na file(s) na code.json. Panatilihing nakatuon ang mga pagbabago at magdagdag ng mabilis na screenshot kung maaari.

Mga Tip sa Seguridad at Konfigurasyon

  • Huwag i-commit ang sources/manifest.json (pansamantalang ginagawa ng build)
  • Panatilihing stable ang browser_specific_settings.gecko.id upang mapanatili ang update channel

Pagpapanatili ng Mga Setting

  • Storage: Nasa storage.local ang lahat ng user settings at nananatili sa mga update ng add‑on.
  • Install: Ina-apply lang ang mga default kapag ang isang key ay talagang wala (undefined).
  • Update: Pinupunan lang ng migration ang mga nawawalang key; ang umiiral na mga value ay hindi kailanman overwriten.
  • Schema marker: settingsVersion (kasalukuyang 1).
  • Mga key at default:
  • blacklistPatterns: string[]['*intern*', '*secret*', '*passwor*']
  • confirmBeforeAdd: booleanfalse
  • confirmDefaultChoice: 'yes'|'no''yes'
  • warnOnBlacklistExcluded: booleantrue
  • Code: tingnan ang sources/background.jsinitializeOrMigrateSettings() at SCHEMA_VERSION.

Daloy ng dev (pagdaragdag ng bagong setting)

  • I-bump ang SCHEMA_VERSION sa sources/background.js.
  • Idagdag ang bagong key + default sa object na DEFAULTS sa initializeOrMigrateSettings().
  • Gamitin ang patakarang "only-if-undefined" kapag nagse-seed ng mga default; huwag i-overwrite ang umiiral na mga value.
  • Kung user‑visible ang setting, i-wire ito sa sources/options.js at magdagdag ng mga lokalisadong string.
  • Magdagdag/magbago ng mga test (tingnan ang tests/background.settings.migration.test.js).

Mga tip sa manu-manong pag-test

  • I-simulate ang fresh install: i-clear ang data dir ng extension o magsimula sa bagong profile.
  • I-simulate ang update: itakda ang settingsVersion sa 0 sa storage.local at i-reload; tiyaking nananatiling hindi nagbabago ang umiiral na mga value at tanging mga nawawalang key lang ang idinadagdag.

Pag-troubleshoot

  • Tiyaking 128 ESR o mas bago ang Thunderbird
  • Gamitin ang Error Console para sa mga isyu sa runtime
  • Kung tila hindi maayos na naia-apply ang mga naimbak na setting, i-restart ang Thunderbird at subukan muli. (Maaaring mag-cache ang Thunderbird ng state sa mga session; tinitiyak ng restart na sariwang mga setting ang naloload.)

CI at Coverage

  • Ang GitHub Actions (CI — Tests) ay nagpapatakbo ng vitest na may coverage thresholds (85% lines/functions/branches/statements). Kung hindi naabot ang mga threshold, babagsak ang job.
  • Nag-u-upload ang workflow ng artifact na coverage-html na may HTML report; i-download ito mula sa run page (Actions → latest run → Artifacts).

Pag-ambag

  • Tingnan ang CONTRIBUTING.md para sa mga patnubay sa branch/commit/PR
  • Tip: Gumawa ng hiwalay na Thunderbird development profile para sa pag-test upang maiwasang maapektuhan ang iyong daily profile.

Mga Pagsasalin

  • Ang pagpapatakbo ng malalaking “all → all” na translation jobs ay maaaring mabagal at magastos. Magsimula sa subset (hal., ilang docs at 1–2 locale), suriin ang resulta, saka palawakin.

  • Patakaran sa retry: ang mga translation job ay gumagawa ng hanggang 3 retry na may exponential backoff sa mga error ng API; tingnan ang scripts/translate_web_docs_batch.js at scripts/translate_web_docs_sync.js.

Mga screenshot para sa docs

  • Iimbak ang mga imahe sa ilalim ng website/static/img/.

  • I-refer ang mga ito sa MD/MDX sa pamamagitan ng useBaseUrl('/img/<filename>') para gumana ang mga path sa site na baseUrl.

  • Pagkatapos magdagdag o mag-rename ng mga imahe sa ilalim ng website/static/img/, tiyaking lahat ng references ay gumagamit pa rin ng useBaseUrl('/img/…') at nagre-render sa lokal na preview. Mga favicon

  • Ang multi‑size na favicon.ico ay awtomatikong ginagawa sa lahat ng build path (Make + scripts) sa pamamagitan ng website/scripts/build-favicon.mjs.

  • Walang kailangang manual na hakbang; sapat na ang pag-update ng icon-*.png. Tip sa pagrebisa

  • Panatilihing hindi nababago ang front‑matter na id sa mga isinaling docs; isalin lamang ang title at sidebar_label kapag naroroon.

clean

  • Layunin: alisin ang lokal na build/preview artifacts.
  • Paggamit: make clean
  • Inaalis (kung naroroon):
  • tmp/
  • web-local-preview/
  • website/build/

commit

  • Layunin: i-format, i-test, i-update ang changelog, mag-commit, at mag-push.
  • Paggamit: make commit
  • Mga detalye: nagpapatakbo ng Prettier (write), make test, make test_i18n; nagdadagdag sa changelog kapag may staged diffs; nagpu-push sa origin/<branch>.

eslint

  • Layunin: patakbuhin ang ESLint via flat config.
  • Paggamit: make eslint

help

  • Layunin: ilista ang lahat ng target na may one‑line na docs.
  • Paggamit: make help

lint

  • Layunin: i-lint ang MailExtension gamit ang web-ext.
  • Paggamit: make lint
  • Tala: pansamantalang kinokopya ang sources/manifest_LOCAL.jsonsources/manifest.json; hindi isinasama ang mga na-build na ZIP; ang mga babala ay hindi nagpapabagsak ng pipeline.

menu

  • Layunin: interaktibong menu para pumili ng Make target at opsyonal na argumento.
  • Paggamit: patakbuhin ang make nang walang argumento.
  • Tala: kung hindi available ang whiptail, babagsak ang menu sa make help.

pack

  • Layunin: bumuo ng ATN at LOCAL ZIPs (nakadepende sa lint).
  • Paggamit: make pack
  • Tip: i-bump ang mga bersyon sa parehong sources/manifest_*.json bago mag-package.

prettier

  • Layunin: i-format ang repo in place.
  • Paggamit: make prettier

prettier_check

  • Layunin: beripikahin ang formatting (walang isinusulat).
  • Paggamit: make prettier_check

prettier_write

  • Layunin: alias para sa prettier.
  • Paggamit: make prettier_write

test

  • Layunin: patakbuhin ang Prettier (write), ESLint, saka Vitest (coverage kung naka-install).
  • Paggamit: make test

test_i18n

  • Layunin: mga test na nakatuon sa i18n para sa mga string ng add‑on at website docs.
  • Paggamit: make test_i18n
  • Pinapatakbo: npm run test:i18n at npm run -s test:website-i18n.

translate_app / translation_app

  • Layunin: isalin ang mga string ng UI ng add‑on mula EN patungo sa ibang mga locale.
  • Paggamit: make translation_app OPTS="--locales all|de,fr"
  • Tala: pinapanatili ang istruktura ng key at mga placeholder; nagla-log sa translation_app.log. Script form: node scripts/translate_app.js --locales ….

translate_web_docs_batch / translate_web_docs_sync

  • Layunin: isalin ang mga website docs mula website/docs/*.md tungo sa website/i18n/<locale>/....
  • Inirerekomenda: translate_web_docs_batch (OpenAI Batch API)
    • Paggamit (flags): make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • Tinatanggap pa rin ang legacy positional: OPTS="<doc|all> <lang|all>"
  • Asal: bumubuo ng JSONL, nag-a-upload, nagpo-poll bawat 30s, nagda-download ng resulta, nagsusulat ng mga file.
  • Tala: maaaring umabot ng hanggang 24 na oras ang isang batch job (ayon sa batch window ng OpenAI). Ipinapakita ng console ang lumipas na oras sa bawat poll.
  • Env: OPENAI_API_KEY (kailangan), opsyonal ang OPENAI_MODEL, OPENAI_TEMPERATURE, OPENAI_BATCH_WINDOW (default 24h), BATCH_POLL_INTERVAL_MS.
  • Legacy: translate_web_docs_sync
    • Paggamit (flags): make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • Tinatanggap pa rin ang legacy positional: OPTS="<doc|all> <lang|all>"
  • Asal: synchronous na per‑pair na mga request (walang batch aggregation).
  • Mga tala: Interaktibong mga prompt kapag hindi ibinigay ang OPTS. Pinapanatili ng parehong mode ang mga code block/inline code at pinananatiling hindi nababago ang front‑matter na id; nagla-log sa translation_web_batch.log (batch) o translation_web_sync.log (sync).

translate_web_index / translation_web_index

  • Layunin: isalin ang mga string ng UI ng website (homepage, navbar, footer) mula website/i18n/en/code.json sa lahat ng locale sa ilalim ng website/i18n/<locale>/code.json (maliban sa en).
  • Paggamit: make translate_web_index o make translate_web_index OPTS="--locales de,fr [--force]"
  • Mga kailangan: i-export ang OPENAI_API_KEY (opsyonal: OPENAI_MODEL=gpt-4o-mini).
  • Asal: bina-validate ang istruktura ng JSON, pinapanatili ang mga curly‑brace placeholder, pinananatiling hindi nagbabago ang mga URL, at nagre-retry na may feedback kapag may validation errors.

web_build

  • Layunin: i-build ang docs site sa website/build.
  • Paggamit: make web_build OPTS="--locales en|de,en|all" (o itakda ang BUILD_LOCALES="en de")
  • Internal: node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …].
  • Mga Dep: pinapatakbo ang npm ci sa website/ lamang kung nawawala ang website/node_modules/@docusaurus.

web_build_linkcheck

  • Layunin: offline‑safe na link check.
  • Paggamit: make web_build_linkcheck OPTS="--locales en|all"
  • Tala: bina-build sa tmp_linkcheck_web_pages; nire-rewrite ang GH Pages baseUrl tungo sa /; nilalaktawan ang mga remote na HTTP(S) link.

web_build_local_preview

  • Layunin: lokal na gh‑pages preview na may opsyonal na tests/link‑check.
  • Paggamit: make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]"
  • Asal: sinusubukan muna ang Node preview server (scripts/preview-server.mjs, sumusuporta sa /__stop), babagsak sa python3 -m http.server; nagsi-serve sa 8080–8090; PID sa web-local-preview/.server.pid.

web_push_github

  • Layunin: i-push ang website/build sa sangang gh-pages.
  • Paggamit: make web_push_github

Tip: itakda ang NPM=… para i-override ang package manager na ginagamit ng Makefile (default sa npm).