Skip to content

Instantly share code, notes, and snippets.

@TyDraniu
Forked from flodolo/firefox-pl-l10n-review.md
Last active September 3, 2026 10:39
Show Gist options
  • Select an option

  • Save TyDraniu/fed2e1e3348558a66613090fd2a7ed2e to your computer and use it in GitHub Desktop.

Select an option

Save TyDraniu/fed2e1e3348558a66613090fd2a7ed2e to your computer and use it in GitHub Desktop.
Polish Firefox localization QA (via LLM)

Firefox Polish (pl) localization review

Date 2026-08-06
Locale tree ~/mozilla/git/firefox-l10n/pl @ c700cb6b7d0f0837cab4566a7e298b5ab7de6511
en-US reference ~/mozilla/git/firefox-quarantine @ 7a5fe5860e3d227bb7e55d00772339a25f12af49
Method moz.l10n parser checks (syntax, variables, selectors, accesskeys, markup parity, plural categories, typography), hunspell with the in-repo pl dictionary, cross-file consistency grouping by en-US source string, plus per-directory manual review against en-US and its developer comments

Findings are keyed by Fluent string ID, never by line number. Completeness/sync status is out of scope and not reported.


1. Health check

Check Result
Fluent syntax (l10n-lint) Clean — 0 parse errors
Access keys not present in their label 0 — Polish remaps accesskeys properly throughout
Variable/placeholder set mismatches 2 (both benign, see A1–A2)
Plural selector variable mismatches 2 real (A3–A4) + 1 benign brand-term extension
Markup / data-l10n-name parity vs en-US Clean (18 raw hits, all artifacts of pl having 3 plural variants vs en-US 1)
Plural categories Correct one/few/*[many] almost everywhere; 6 real gaps (A5–A6)
Straight " / ' in translated values 0
... instead of in translated values 0
Wrong closing quote in translated values 0 (all 70 occurrences are inside # comments copied from en-US)
Double spaces / space-before-punctuation in values 0 real
Spellcheck (hunspell, in-repo pl.dic) No genuine misspellings in running text; all unknown tokens are technical terms, proper nouns, deliberate quickactions-cmd-* slang keywords, or the deliberately-unaccented example in findbar-match-diacritics

Typographic conventions detected in this locale (counts over translated values):

Convention Usage
Quotes „…” (U+201E / U+201D) — 449 / 529
Ellipsis — 356, zero ...
Apostrophe where needed — 34
NBSP after single-letter words (w z i a o u) 3607 applied vs 45 missed → ~99% consistent
Dashes em dash 159, en dash 16

The locale is typographically disciplined; the deviations below are individually enumerated rather than treated as systemic problems.


2. Systemic items (decisions, not line items)

S1 — "Service Workers" is translated despite an explicit do-not-translate comment. toolkit/toolkit/about/aboutServiceWorkers.ftl carries the resource comment ### The term "Service Workers" and "Workers" should not be translated, yet every string renders it as wątki usługowe: about-service-workers-title, about-service-workers-main-title, about-service-workers-warning-not-enabled, about-service-workers-warning-no-service-workers, plus app-basics-service-workers (aboutSupport.ftl) and about-processes-web-isolated-property-serviceworker (aboutProcesses.ftl). Consistent across the locale, so this is a standing decision to confirm or reverse — not N separate bugs.

S2 — -mdn-brand-name is translated and declined. toolkit/toolkit/branding/brandings.ftl opens with ## The following feature names must be treated as a brand … They cannot be: Transliterated. Translated. Declension should be avoided. en-US is MDN Web Docs; pl renders every case/capitalization variant as dokumentacja MDN / Dokumentacji MDN / dokumentacją MDN …, i.e. "Web Docs" is replaced by a Polish common noun and the whole term is declined. Same decision applies to whether the case-parameterized brand terms in general should be declined (they are, deliberately and consistently — that part is fine and idiomatic for Polish).

S3 — "bounce tracker" is translated despite a do-not-translate comment. toolkit/toolkit/global/antiTracking.ftl, dev comment Do not translate "bounce tracker". Affects btp-warning-tracker-classified and btp-warning-tracker-purged (all plural variants), rendered as przekierowujący element śledzący.

S4 — DevTools name is inconsistent across the tree. narzędzia dla programistów — 17 occurrences; narzędzia dla twórców witryn — 4 (customkeys-dev-tools, enable-devtools-popup-description2, appmenu-developer-tools-extensions, …). Pick one. quickactions-inspector2 uses the majority form, so aligning the four outliers is the smaller change.

S5 — Missed NBSP after a one-letter word — 45 occurrences vs 3607 correct. Concentrated in browser/browser/genai.ftl (16 — these are AI prompt bodies, arguably not UI text) and toolkit/toolkit/about/aboutRights.ftl (8). Most of the rest are string-initial (rights-title "O prawach…", title-label "O wtyczkach", languages-customize-moveup "W górę"), where no orphan can occur. Low priority; listed here so it isn't mistaken for pervasive.

S6 — "logins" → "passwords/entries" rename only half-applied. The …2 string series in browser/browser/aboutLogins.ftl exists to carry the en-US logins → passwords / entries rename. about-logins-import-dialog-items-added2 was migrated to hasło/hasła, but about-logins-import-dialog-items-modified2, about-logins-import-dialog-items-no-change2, about-logins-import-report-modified2, about-logins-import-report-no-change2, about-logins-import-report-row-description-modified2 and about-logins-import-report-row-description-no-change2 still say dane logowania where en-US says entries.


3. A — Functional / markup

  • monitor-partial-breaches-title (browser/browser/protections.ftl) — A4. Selector changed from $numBreaches to $numBreachesResolved. That is defensible for Polish agreement, but the [one] variant then also drops the z { $numBreaches } part that both other variants and the source have. Current [one]: "{ $numBreachesResolved } wyciek jest oznaczony jako rozwiązany" → Suggest: "{ $numBreachesResolved } z { $numBreaches } wycieków jest oznaczony jako rozwiązany".
  • popup-warning-exceeded-message and popup-warning-exceeded-with-redirect-message (browser/browser/browser.ftl) — A8. The [one] variant drops "more than": "…uniemożliwił tej witrynie otwarcie wyskakującego okna." → Suggest: "…otwarcie więcej niż { $popupCount } wyskakującego okna." (the [few]/[many] variants keep it).
  • protections-panel-cookie-banner-blocker-view-turn-on-for-site (browser/browser/protectionsPanel.ftl) — A1, note. pl introduces { $host } where the source says "this site". $host is documented for this comment block and used by the sibling …-turn-off-for-site, so it should resolve — but it is an added dependency on a variable the source doesn't require. Worth a runtime check.
  • mr2022-onboarding-live-language-continue-in (browser/browser/newtab/onboarding.ftl) — A2, note. pl drops { $appLanguage } ("Nie przełączaj języka" vs "Continue in { $appLanguage }"). Harmless at runtime; flagged only for completeness.

4. B — Mistranslation / wrong sense

browser/

  • user-context-color-purple (toolkit/toolkit/global/contextual-identity.ftl) — "Fioletowy", identical to user-context-color-violet; two container swatches become indistinguishable, notably for screen-reader users. → purple = "Purpurowy", keep violet = "Fioletowy".
  • experimental-features-newtab-widget-timer-description (toolkit/toolkit/firefoxlabs/features.ftl) — "przypomni o konieczności naładowania baterii" for "remind you to recharge", which refers to the user taking a break. → "…przypomni Ci o odpoczynku." Same text repeated in experimental-features-newtab-widget-lists-and-timer-description.
  • main-context-menu-send-to-device / main-context-menu-link-send-to-device (browser/browser/browserContext.ftl) — dangling preposition: "Wyślij stronę do" / "Wyślij odnośnik do". → "Wyślij stronę na urządzenie" / "Wyślij odnośnik na urządzenie" (cf. main-context-menu-send-to-device-2).
  • custom-avatar-crop-view (browser/browser/profiles.ftl) — .aria-label = "Przytnij widoczny obraz" reads as an instruction; "Crop image view" names the view. → "Widok przycinania obrazu".
  • fxa-qrcode-pair-step1 (browser/browser/preferences/fxaPairDevice.ftl) — narrows "mobile device" to "telefon", contradicting the dialog title (fxa-qrcode-pair-title = "…na telefonie lub tablecie"). → "…na urządzeniu mobilnym."
  • autofill-card-network (browser/browser/preferences/formAutofill.ftl) — "Wystawca karty" (= card issuer, i.e. the bank) for "Card Type"; the values listed under autofill-card-network-* are networks (Visa, Mastercard…). → "Typ karty" / "Rodzaj karty".
  • more-from-moz-solo-title (browser/browser/preferences/moreFromMozilla.ftl) — drops the "AI" qualifier present in en-US ("{ -solo-ai-brand-name } AI") and in the sibling more-from-moz-solo-title-2 ("Kreator SI stron internetowych…").

toolkit/about/

  • certificate-viewer-locality / certificate-viewer-inc-locality (toolkit/toolkit/about/certviewer.ftl) — "Region" / "Region założenia" for X.509 L= (city/town), which also blurs the line with certificate-viewer-state-province = "Województwo". → "Miejscowość" / "Miejscowość założenia".
  • abuse-report-unwanted-reason-v2 (toolkit/toolkit/about/abuseReports.ftl) — "Samo się zainstalowało i nie wiem, jak je usunąć" for "I never wanted it and don't know how to get rid of it"; the self-installation claim duplicates abuse-report-unwanted-example. → "Nigdy tego nie chciałem(-am) i nie wiem, jak to usunąć".
  • url-classifier-provider-back-off-time (toolkit/toolkit/about/url-classifier.ftl) — "Wycofano" reads as a status in a column of timestamps. → "Czas wycofania".
  • rights-webservices-term-5 (toolkit/toolkit/about/aboutRights.ftl) — the damages enumeration lists "wyjątkowe" twice and includes the unfinished-looking "będące skutkiem czegoś" for "indirect, special, incidental, consequential, punitive, or exemplary". Needs a rewrite of the list.

toolkit/ (other), devtools/, dom/, security/, netwerk/

  • config-new-pref-value-integer (mobile/android/mobile/android/aboutConfig.ftl) — "Liczba" for the specific Integer pref type; also collides with config-new-pref-number ("Wprowadź liczbę"). → "Liczba całkowita".

5. C — Wrong language / region names

  • language-name-mh (toolkit/toolkit/intl/languageNames.ftl) — "Marshall" names the islands, not the language. → "Marszalski".
  • language-name-na (toolkit/toolkit/intl/languageNames.ftl) — "Nauru" is the country; neighbouring Pacific languages in the same file are adjectivised (Samoański, Tongański, Fidżyjski). → "Nauruański".
  • language-name-rw (toolkit/toolkit/intl/languageNames.ftl) — "Kinya-ruanda" uses the obsolete Polish spelling of Rwanda. → "Kinyarwanda".
  • language-name-meh, language-name-mix, language-name-zam (toolkit/toolkit/intl/languageNames.ftl) — the same Mesoamerican family term is handled three ways ("Południowo-zachodni Tlaxiaco Mixtec" / "Mixtepec Mixtec" / "Zapotecki Miahuatlán"): Mixtec is left in English in two entries while Zapotec is polonised in the third, and English modifier-noun order is kept. → one pattern, e.g. "Mikstecki z południowo-zachodniego Tlaxiaco" / "Mikstecki z Mixtepec" / "Zapotecki z Miahuatlán".
  • region-name-fm (toolkit/toolkit/intl/regionNames.ftl) — the country name appears twice: "Mikronezja, Sfederowane Stany Mikronezji". → "Mikronezja, Sfederowane Stany".
  • region-name-nl and region-name-bq-2018 (toolkit/toolkit/intl/regionNames.ftl) — judgment call. "Holandia" / "Holandia Karaibska"; the official Polish names per KSNG are "Niderlandy" / "Niderlandy Karaibskie". "Holandia" remains the dominant colloquial form, so this is a policy decision rather than an outright error.

regionNames.ftl is otherwise in very good shape — all renamed states are current (Czechy, Macedonia Północna, Eswatini, Sudan Południowy, Timor Wschodni), and "Turcja"/"Birma" correctly mirror en-US "Turkey"/"Burma".


6. D — Brand / do-not-translate

See also S1–S3 above.

  • genai-settings-chat-lechat-links (browser/browser/genai.ftl) — "Mistral AI" is a company name and should not be translated. Current: "…zasady ochrony prywatności sztucznej inteligencji Mistral." → Suggest: "…zasady ochrony prywatności Mistral AI." (the sibling strings correctly keep OpenAI, Microsoft, Anthropic).
  • unified-extensions-empty-reason-zero-extensions-onboarding (browser/browser/unifiedExtensions.ftl) — the dev comment states "Level up" means enhancing the browsing experience. Current: "Podnieś poziom przeglądarki za pomocą rozszerzeń" → Suggest: "Podnieś poziom przeglądania za pomocą rozszerzeń".
  • newtab-widget-lists-empty-cta (browser/browser/newtab/newtab.ftl) — the dev comment says "Add one" refers to adding a task. Current: "Możliwości są nieograniczone. Dodaj jedną." reads as "add one possibility". → "…Dodaj pozycję."
  • console-stacktrace-anonymous-function (mobile/android/mobile/android/geckoViewConsole.ftl) — <anonymous> translated to <anonimowa>. This is a literal stack-trace marker; worth confirming whether it should stay English.

8. F — Verb government / case / mood / prepositions

  • toolbar-button-logins (browser/browser/browser.ftl) — "wyświetlić" takes the accusative, "zarządzać" the instrumental; one shared object is ungrammatical. Current: .tooltiptext = Wyświetl i zarządzaj zachowanymi hasłami → Suggest: "Wyświetl zachowane hasła i zarządzaj nimi".
  • newtab-topic-selection-privacy-link (browser/browser/newtab/newtab.ftl) — same defect. Current: "Dowiedz się, jak chronimy i zarządzamy danymi" → Suggest: "Dowiedz się, jak chronimy dane i jak nimi zarządzamy".
  • tabbrowser-allow-dialogs-to-get-focus (browser/browser/tabbrowser.ftl) — "zezwalać komuś na coś", not "zezwalać komuś robić coś". Current: "Zezwalaj powiadomieniom … przełączać na kartę…" → Suggest: "…na przełączanie na kartę…".
  • content-sharing-modal-description-2 / content-sharing-modal-description-signed-in (browser/browser/contentSharing.ftl) — mixed aspect in a coordinated pair. Current: "Nie można jej zmieniać ani usunąć…" → Suggest: "…zmieniać ani usuwać…".
  • preferences-web-appearance-link (browser/browser/preferences/preferences.ftl) — UI section name left in the nominative after "w". Current: "…w Rozszerzenia i motywy" → Suggest: "…w sekcji „Rozszerzenia i motywy”" (cf. extension-controlled-enable, which uses "przejdź do sekcji …").
  • webrtc-reason-for-no-permanent-allow-screen / webrtc-reason-for-no-permanent-allow-audio (browser/browser/webrtcIndicator.ftl) — source is present tense. Current: "{ -brand-short-name } nie mógł zezwolić…" → Suggest: "…nie może zezwolić…".
  • restore-from-backup-title (browser/browser/newtab/onboarding.ftl) — the relative pronoun takes the case governed by its own clause. Current: "…takiego, jak lubisz" → Suggest: "…takiego, jakiego lubisz".
  • printpreview-custom (toolkit/toolkit/printing/printPreview.ftl) — "Użytkownika…" as a dangling genitive for "Custom…". → "Własny…" (as hf-custom already does).

10. H — Terminology inconsistency

  • enableSafeBrowsing-label (toolkit/toolkit/about/aboutRights.ftl) — quotes a preferences label verbatim, but with different wording: "Blokowanie niebezpiecznych i podejrzanych treści." vs the actual security-enable-safe-browsing = "Blokuj niebezpieczne i podejrzane treści."
  • tabmodalprompt-username (toolkit/toolkit/global/tabprompts.ftl) — .value = "Użytkownik:"; the identical field in common-dialog-username is "Nazwa użytkownika". → "Nazwa użytkownika:".
  • webext-perms-extra-warning-userScripts-long (toolkit/toolkit/global/extensionPermissions.ftl) — uses "działania użytkownika w Internecie", which this file reserves for browsing activity; the source here says website activity. → "działania użytkownika na witrynach".
  • pkcs12-info-no-smartcard-backup (security/manager/security/certificates/certManager.ftl) — "inteligentna karta"; the established Polish term is "karta inteligentna".
  • newtab-sports-widget-round-32 / newtab-sports-widget-round-16 (browser/browser/newtab/newtab.ftl) — "Pierwsza runda" / "Druga runda" for "Round of 32" / "Round of 16"; Polish football usage names these by fraction, and the current wording is ambiguous against the preceding group stage. → "1/16 finału" / "1/8 finału".

11. I — Typography / punctuation

Missing comma before a subordinate clause (Polish requires it; each is a concrete, mechanical fix):

  • windows-10-eos-feature-toast-whats-new-button (browser/browser/newtab/asrouter.ftl), mr2022-onboarding-gratitude-primary-button-label (browser/browser/newtab/onboarding.ftl) — "Zobacz co nowego" → "Zobacz, co nowego" (cf. windows-10-eos-sync-callout-privacy-info-button, which is correct).

Spurious comma (Polish takes none here):

  • newtab-privacy-modal-paragraph-2 (browser/browser/newtab/newtab.ftl) — comma before "i" copied from the English source: "…my jej nie widzimy**,** i nasi sponsorzy też nie." → remove the comma.

12. Findings by area

Area Findings
browser/browser/*.ftl (a–l) 28
browser/browser/*.ftl (m–z) 21
browser/browser/preferences/ 11
browser/browser/newtab/ + policies/ + safebrowsing/ 21
toolkit/toolkit/about/ 19
toolkit/ (excl. about/) 33
devtools/ 12
dom/ + security/ + netwerk/ + mobile/ 13
Automated-only (plural gaps, selectors, trailing space) 11
Total enumerated ≈169
Systemic decisions (S1–S6) 6

13. Not the locale's fault

  • certificate-viewer-tab-unkonwn (toolkit/toolkit/about/certviewer.ftl) — misspelled string ID ("unkonwn"); present in en-US too.
  • content-sharing-modal-more-tabs, about-logins-import-dialog-items-* and several other { $count -> *[other] … } messages have no plural distinction in en-US either; the Polish single-variant rendering is a faithful mirror, and the affected strings show the count in a separate span, so no Polish plural is required.
  • The pl-only grammatical-case parameters on brand terms ({ -brand-short-name(case: "gen") }, nom/gen/dat/acc/ins/loc) and the platform selectors (macos/windows/linux) are correct Fluent and correct practice — they are not defects despite showing up in naive category checks.

Report generated from an automated + manual review pass. No files were modified.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment