| 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.
| 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.
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.
monitor-partial-breaches-title(browser/browser/protections.ftl) — A4. Selector changed from$numBreachesto$numBreachesResolved. That is defensible for Polish agreement, but the[one]variant then also drops thez { $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-messageandpopup-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".$hostis 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.
user-context-color-purple(toolkit/toolkit/global/contextual-identity.ftl) — "Fioletowy", identical touser-context-color-violet; two container swatches become indistinguishable, notably for screen-reader users. →purple= "Purpurowy", keepviolet= "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 inexperimental-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 underautofill-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 siblingmore-from-moz-solo-title-2("Kreator SI stron internetowych…").
certificate-viewer-locality/certificate-viewer-inc-locality(toolkit/toolkit/about/certviewer.ftl) — "Region" / "Region założenia" for X.509L=(city/town), which also blurs the line withcertificate-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 duplicatesabuse-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.
config-new-pref-value-integer(mobile/android/mobile/android/aboutConfig.ftl) — "Liczba" for the specificIntegerpref type; also collides withconfig-new-pref-number("Wprowadź liczbę"). → "Liczba całkowita".
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-nlandregion-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".
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.
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…" (ashf-customalready does).
enableSafeBrowsing-label(toolkit/toolkit/about/aboutRights.ftl) — quotes a preferences label verbatim, but with different wording: "Blokowanie niebezpiecznych i podejrzanych treści." vs the actualsecurity-enable-safe-browsing= "Blokuj niebezpieczne i podejrzane treści."tabmodalprompt-username(toolkit/toolkit/global/tabprompts.ftl) —.value = "Użytkownik:"; the identical field incommon-dialog-usernameis "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".
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.
| 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 |
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.