Skip to content

Instantly share code, notes, and snippets.

@flodolo
Created July 30, 2026 16:45
Show Gist options
  • Select an option

  • Save flodolo/0eff87933b7204abf020e2b3740591fe to your computer and use it in GitHub Desktop.

Select an option

Save flodolo/0eff87933b7204abf020e2b3740591fe to your computer and use it in GitHub Desktop.
Turkish QA LLM test

Firefox Turkish (tr) — localization QA review

  • Date: 2026-07-30
  • Locale tree: ~/mozilla/git/firefox-l10n/tr @ commit b44618a6c48bcce20863f425fdd20e441dad9741
  • en-US reference: ~/mozilla/git/firefox-quarantine @ commit 80731a59444a4beee5113950b54f9dab5276afe5
  • Scope: 240 .ftl files, ~13,850 translated patterns
  • Method: runbook ~/Desktop/firefox-l10n-review-runbook.md — Phase 1 automated (moz.l10n parser checks + hunspell against the locale's own tr.dic), Phase 2 eight parallel per-directory reviewers against en-US with developer comments.

All findings are keyed by string ID, never by line number.


1. Health check

Check Result
Fluent syntax (l10n-lint) Clean — 0 parse errors
Variable / placeholder mismatches 0
Access keys not present in their label 0
Obsolete strings 0
Missing strings 109 across 13 files
Files entirely missing 1toolkit/toolkit/global/theme-picker.ftl

tr is one of the healthiest locales reviewed so far: no functional breakage from the automated layer, and the completeness gap is small.

Missing strings by file (translation work, not a defect to fix)

File Missing
browser/browser/newtab/newtab.ftl 27
toolkit/toolkit/about/url-classifier.ftl 26
browser/browser/ipProtection.ftl 12
browser/browser/firefoxView.ftl 11
browser/browser/newtab/asrouter.ftl 11
browser/browser/newtab/onboarding.ftl 5
browser/browser/aiWindow.ftl 4
browser/browser/appmenu.ftl 3
browser/browser/aiFeatures.ftl 3
browser/browser/menubar.ftl 2
browser/browser/preferences/formAutofill.ftl 2
toolkit/toolkit/about/aboutNetworking.ftl 2
browser/browser/aboutPrivateBrowsing.ftl 1

2. Detected typographic conventions

Counted over message values only (comments, .style, data-l10n-name attributes and markup excluded):

Convention Count Verdict
“…” (U+201C/U+201D) 206 open / 181 close established convention
(U+2019) apostrophe 564 established convention
straight ' in values 17 deviation → section I
straight " in values 2 (rest are HTML attributes) deviation → section I
(U+2026) 362 established
... (three dots) 10 (all inside code/technical strings) fine

Register: the locale uses the formal/polite 2nd person plural (siz, -iniz) throughout. Deviations are enumerated in section F.

Suffixes on brand terms: the locale correctly attaches Turkish suffixes to term references. Where the term resolves to a common noun (-smart-window-brand-name = "Akıllı pencere", -fxaccount-brand-name = "Firefox Hesabı") suffixes are written without an apostrophe — that is correct Turkish and not a defect. Only genuine proper nouns (Firefox’u, Mozilla Vakfı’nın) need the apostrophe.


3. Systemic buckets

These are decisions, not N separate bugs. Affected IDs are listed so they can be fixed in one mechanical pass.

S1. Straight ' where the locale uses (17 instances)

reader-view-enter-button.aria-label (browser/browser.ftl), menu-view-enter-readerview.label (browser/menubar.ftl), connection-dns-over-https-url-item-default.tooltiptext (browser/preferences/connection.ftl), policy-DisableSafeMode, policy-FirefoxHome2 (browser/policies/policies-descriptions.ftl), about-glean-label-for-tag-pings-with-requirements (toolkit/about/aboutGlean.ftl), profiles-opendir (toolkit/about/aboutProfiles.ftl), rights-intro-point-3, rights-intro-point-4, rights-webservices-term-1, rights-webservices-term-5, rights-webservices-term-6 (toolkit/about/aboutRights.ftl), show-dir-label (toolkit/about/aboutSupport.ftl), about-webrtc-save-page-dialog-title (toolkit/about/aboutWebrtc.ftl), experimental-features-media-jxl-description (both toolkit/featuregates/features.ftl and toolkit/firefoxlabs/features.ftl), neterror-unknown-socket-type-psm-installed (toolkit/neterror/netError.ftl).

S2. used as the closing quote (12 instances)

pin-tabs-callout-1-subtitle, pin-tabs-callout-2-subtitle (browser/featureCallout.ftl); import-safari-permissions-string (browser/migration.ftl); tab-groups-onboarding-create-group-title-3, tab-groups-onboarding-saved-groups-title-3, tab-groups-onboarding-session-restore-title-2 (browser/newtab/onboarding.ftl); about-logging-invalid-output, about-logging-unknown-logging-preset, about-logging-unknown-profiler-preset, about-logging-unknown-option (toolkit/about/aboutLogging.ftl); about-telemetry-data-details-current (toolkit/about/aboutTelemetry.ftl); neterror-net-offline (toolkit/neterror/netError.ftl, “…" mixed).

Also ‘:‘ and ‘!‘ in xpath-bad-colon / xpath-bad-bang (dom/dom/xslt.ftl).

Upstream note: en-US carries the same “…“ defect in import-safari-permissions-string, about-logging-* and about-telemetry-data-details-current. The locale copied it rather than introducing it. Fixing forward in tr is still correct.

S3. Stray double spaces in values (not present in en-US)

set-password-reminder (security/…/pippki.ftl), protections-vpn-header-content-subscribed (browser/protections.ftl), permissions-block-popups-exceptions-button4.description (browser/preferences/preferences.ftl), mr2022-onboarding-pin-primary-button-label [macos variant] (browser/newtab/onboarding.ftl), profiles-delete-profile-confirm (toolkit/about/aboutProfiles.ftl), rights-webservices-term-3, rights-webservices-term-4 (toolkit/about/aboutRights.ftl), about-telemetry-data-details-current (toolkit/about/aboutTelemetry.ftl), experimental-features-link-previews-description-no-ai [macos] (toolkit/firefoxlabs/features.ftl), csp-xfo-blocked-long-desc (toolkit/neterror/certError.ftl). Plus a stray space before the full stop in tou-existing-user-spotlight-body (browser/termsofuse.ftl).

S4. Sentence-case vs Title-case drift

The same English string is rendered with different capitalization in different files (~45 pairs found by the cross-file consistency scan). Representative examples: about-glean-about-data-header "Veriler Hakkında" vs about-glean-category-about-data "Veriler hakkında"; clear-site-data-window2.title "Verileri Temizle" vs clear-data-for-site-dialog-accept-button "Verileri temizle"; about-performance-title "Görev Yöneticisi" vs menu-tools-task-manager.label "Görev yöneticisi"; the four fission-status-* strings (two capitalized, two not); the about-webrtc-*-hide-msg / -show-msg pairs (section-level capitalized, item-level not). This is a normalization decision, not a set of individual bugs.

S5. nsserrors.ftl terminology is not internally consistent

toolkit/toolkit/neterror/nsserrors.ftl uses two renderings for several fixed security terms. This file is large and low-visibility; treat as one normalization pass rather than ~15 line items:

Term Renderings in use
peer "eş" (~25) vs "karşı taraf" (~10)
protocol "protokol" vs "iletişim kuralı"
algorithm "algoritma" vs "çözüm yolu"
cipher suite "şifreleme takımı" vs "şifreleme paketi"
token "jeton" vs "işaret" (sec-error-no-slot-selected)
module "modül" vs "birim" (sec-error-js-invalid-module-name, sec-error-js-invalid-dll, sec-error-module-stuck)
CRL left as "CRL" vs "hükümsüzler listesi" vs "Sertifika İptal Listesi" (sec-error-crl-invalid, sec-error-crl-invalid-version)

4. Enumerated findings

A. Functional / markup

  • ai-window-learn-from-browsing-activity.label (browser/browser/aiFeatures.ftl) — the tr definition of -smart-window-brand-name in toolkit/toolkit/branding/brandings.ftl selects on $form (uppercase-singular / uppercase-plural / lowercase-singular / lowercase-plural), but this call passes the en-US parameter plural-form: "true". $form is never supplied, so the selector falls through to the default and the intended parameter is dead. → { -smart-window-brand-name(form: "lowercase-plural") }.
  • fxa-signout-dialog-body-aiwindow (browser/browser/aiWindow.ftl) — same $plural-form vs $form mismatch. → { -smart-window-brand-name(form: "lowercase-plural") }.
  • xml-nostylesheet-xslt-disabled (dom/dom/XMLPrettyPrint.ftl) — stray leading space inside the anchor: <a data-l10n-name="addons-link"> tarayıcı uzantısı… → remove the space so the link text doesn't start with whitespace.
  • about-processes-remote-sandbox-broker-process (toolkit/toolkit/about/aboutProcesses.ftl) — parentheses around { $pid } dropped. Current Uzak sandbox aracısı { $pid }Uzak sandbox aracısı ({ $pid }) (every sibling about-processes-*-process string has them).

B. Mistranslation / meaning changed or reversed

  • about-networking-networkid-status-known (toolkit/toolkit/about/aboutNetworking.ftl) — meaning reversed. Current "Bağlantı durumu bilinmiyor" → "Bağlantı durumu biliniyor" (en "Link status is known").
  • performance-limit-content-process-blocked-desc (browser/browser/preferences/preferences.ftl) — meaning reversed. "Çok işlemin etkin olmadığını kontrol etmeyi öğrenin" → "…etkin olup olmadığını kontrol etmeyi öğrenin" (en "check if multiprocess is enabled").
  • ssl-error-rx-unexpected-uncompressed-record (toolkit/toolkit/neterror/nsserrors.ftl) — meaning reversed. "beklenmeyen bir sıkıştırılmış kayıt" → "…sıkıştırılmamış kayıt" (en "unexpected uncompressed record"); as written it duplicates ssl-error-decompression-failure.
  • pdfjs-editor-ink-opacity-input (toolkit/toolkit/pdfviewer/viewer.ftl) — inverse property. "Saydamlık" (transparency) → "Matlık" (en "Opacity").
  • webrtc-sharing-menu.label (browser/browser/webrtcIndicator.ftl) — subject/object inverted. "Sekme paylaşan cihazlar" → "Cihaz paylaşan sekmeler" (en "Tabs sharing devices"; the menu lists tabs).
  • bookmarks-tools-toolbar-visibility-menuitem.label (browser/browser/browser.ftl) — "Yer imleri kenar çubuğunu gizle" (sidebar) → "Yer imleri araç çubuğunu gizle" (en "Hide Bookmarks Toolbar"); duplicates the sidebar string.
  • windows-10-eos-challenger-callout-title (browser/browser/newtab/asrouter.ftl) — "gereksiz özelliklerle dolu halde gelmez" ≠ en "isn't preloaded like other Big Tech browsers" (= not pre-installed on the device). The second sentence "That's the point." is also dropped.
  • spotlight-better-internet-header (browser/browser/newtab/asrouter.ftl) — "Daha iyi bir interneti seçtiniz" (you chose) → "Daha iyi bir internet sizinle başlıyor" (en "A better internet starts with you").
  • mr2022-background-update-toast-title (browser/browser/newtab/asrouter.ftl) — the fourth sentence "No compromises." is dropped entirely.
  • graph-week-summary (browser/browser/protections.ftl) — "geçen hafta" (the previous calendar week) → "son bir haftada" (en "over the past week", a rolling window).
  • protections-vpn-header-content-subscribed (browser/browser/protections.ftl) — "up to" dropped: "{ $count } ayrı cihazınızda" → "en fazla { $count } cihazınızda".
  • popup-warning-exceeded-message (browser/browser/browser.ftl) — "more than" dropped; sibling popup-warning-exceeded-with-redirect-message includes "en az".
  • urlbar-result-weather-title (browser/browser/browser.ftl) — city and region swapped: { $region }, { $city }{ $city }, { $region } (cf. urlbar-result-weather-title-with-country).
  • containers-disable-alert-cancel-button (browser/browser/preferences/preferences.ftl) — "Vazgeç" → "Etkin kalsın" (en "Keep enabled", not a generic Cancel).
  • sitedata-option-block-all.label (browser/browser/preferences/preferences.ftl) — en "will cause websites to break" rendered as "may". → "Tüm çerezler (Siteler düzgün çalışmaz)"; preferences-etp-custom-cookie-behavior-block-all already gets this right.
  • content-blocking-cross-site-tracking-cookies-plus-isolate (browser/browser/preferences/preferences.ftl) — "takip kodları ve" added; en lists only "Cross-site tracking cookies".
  • settings-keyboard-shortcuts-group.description (browser/browser/preferences/preferences.ftl) — "kolaylaştırın" (make it easier) ≠ en "Control how you move around and interact with".
  • permissions-exceptions-cookie-desc (browser/browser/preferences/permissions.ftl) — "hiç kullanmayacağını" (the site will never use) → "hiçbir zaman kullanamayacağını" (permission sense); sitedata-cookies-exceptions2.description is correct.
  • browsing-use-full-keyboard-navigation.label (browser/browser/preferences/preferences.ftl) — "Form düğmeleri" ≠ en "form controls"; also uses descriptive "kullanabilirsiniz" where every other checkbox in the pane uses the imperative.
  • fonts-langgroup-header (browser/browser/preferences/fonts.ftl) — "Karakter kümesi" (character set) ≠ en "Fonts for" (a language-group selector).
  • set-background-stretch.label (browser/browser/setDesktopBackground.ftl) — "Genişlet", identical to set-background-span; two distinct wallpaper modes collide. → "Uzat".
  • set-background-center.label (browser/browser/setDesktopBackground.ftl) — "Merkez" (the noun) → "Ortala" (matching the sibling imperatives "Döşe", "Doldur", "Sığdır").
  • tab-context-send-to-device2.label (browser/browser/tabContextMenu.ftl) — "Cihazıma gönder" → "Cihazlarıma gönder" (en "Send to Your Devices", plural).
  • newtab-widget-timer-label-play (browser/browser/newtab/newtab.ftl) — "Oynat" (media playback) → "Başlat"; this is the Timer widget's start control.
  • newtab-widget-lists-name-label-checklist (browser/browser/newtab/newtab.ftl) — "Görev listesi" is identical to the Task-list label, so Checklist and Task list collide. → "Kontrol listesi". Same in newtab-widget-lists-name-placeholder-checklist2, newtab-widget-lists-name-default.
  • set-default-menu-message-row-layout-title-variant (browser/browser/newtab/asrouter.ftl) — 1st person "tarayıcım" for en "your default browser" → "varsayılan tarayıcınız yapın".
  • media-count.label (browser/browser/pageInfo.ftl), processes-count, place-database-stats-count (toolkit/toolkit/about/aboutSupport.ftl) — "Sayaç" (counter/meter) → "Sayı" (en "Count" is a quantity column).
  • content-analysis-connected-to-agent, content-analysis-agent-path, content-analysis-agent-failed-signature-verification (toolkit/toolkit/about/aboutSupport.ftl) — "İstemci" (client) → "Aracı" (en "Agent", the external DLP agent process).
  • certificate-viewer-critical-extension.title (toolkit/toolkit/about/certviewer.ftl) — en "clients must reject the certificate if they do not understand it" refers to the extension; also "anlamadılarsa" is a malformed conditional. → "…bu uzantıyı anlamıyorlarsa sertifikayı reddetmelidir."
  • rights-webservices-term-4 (toolkit/toolkit/about/aboutRights.ftl) — "yazılı veya sözlü" (written or oral) → "açık veya zımni" (en "express or implied").
  • rights-webservices-term-7 (toolkit/toolkit/about/aboutRights.ftl) — "korunur" (is protected by) → "tabidir" (en "are governed by the laws of…").
  • about-webauthn-auth-info-max-rpids-for-set-min-pin-length (toolkit/toolkit/about/aboutWebauthn.ftl) — "relying" dropped from "relying party IDs", leaving "taraf kimliği" ambiguous.
  • about-webauthn-auth-info-preferred-platform-uv-attempts (toolkit/toolkit/about/aboutWebauthn.ftl) — parses as "platform user's verification" instead of "platform user verification".
  • discopane-intro (toolkit/toolkit/about/aboutAddons.ftl) — "tarayıcınızın görünümü değiştirmenize" → "görünümünü"; discopane-intro3 is correct.
  • details-notification-soft-blocked-other-disabled (toolkit/toolkit/about/aboutAddons.ftl) — this is the add-on ("other") variant but says "Uzantıyı"; …-disabled2 correctly says "Eklentiyi".
  • profile-directory-explanation (toolkit/toolkit/global/createProfileWizard.ftl) — "yer imleriniz ve parolalarınız" is not in en ("preferences and other user-related data").
  • unknowncontenttype-open-with.label (toolkit/toolkit/global/unknownContentType.ftl) — "Birlikte aç" (open together) → "Şununla aç" (en "Open with").
  • csp-error-illegal-protocol (toolkit/toolkit/global/cspErrors.ftl) — the colon belongs to { $scheme }: "yasaklı bir { $scheme } içeriyor: protokol kaynağı" → "yasaklı bir { $scheme }: protokol kaynağı içeriyor".
  • experimental-features-css-masonry-description (toolkit/toolkit/featuregates/features.ftl) — "anlatıcıya" (narrator) → "açıklama belgesine" (en "the explainer", a document).
  • neterror-nss-failure-not-verified (toolkit/toolkit/neterror/netError.ftl) — "yetkinliği" (competence) → "özgünlüğü" (en "authenticity").
  • mozilla-pkix-error-validity-too-long (toolkit/toolkit/neterror/nsserrors.ftl) — "fazla uzun süredir geçerli olan" (has been valid too long) → "geçerlilik süresi fazla uzun olan".
  • ssl-error-server-cache-not-configured (toolkit/toolkit/neterror/nsserrors.ftl) — "cache" dropped: "SSL sunucusu" → "SSL sunucu önbelleği".
  • ssl-error-handshake-failure-alert — "kabul edilebilir sayıda güvenlik değişkeniyle" ≠ en "an acceptable set of security parameters".
  • ssl-error-renegotiation-not-allowed — "yeniden işleme" → "yeniden görüşmeye"; ssl-error-no-renegotiation-alert is correct.
  • ssl-error-sym-key-context-failure — "içeriği" (content) → "bağlamı" (en "context").
  • ssl-error-md5-digest-failure, ssl-error-sha-digest-failure — "derleme" (compilation) → "özet" (en "digest"); sec-error-digest-not-found already uses "özet".
  • sec-error-krl-bad-signature — "anahtarı geçersiz" → "imzası geçersiz" (en "invalid signature").
  • sec-error-ocsp-bad-http-response, sec-error-ocsp-unknown-response-status — "aldı"/"karşılaştı" → "döndürdü" (en "returned").
  • sec-error-ocsp-malformed-request — "yarıda kesilmiş" (interrupted) → "bozulmuş" (en "corrupted").
  • sec-error-unsupported-elliptic-curve, sec-error-unsupported-ec-point-form — "oval eğri" → "eliptik eğri".
  • sec-error-out-of-search-limits — "Belge doğrulama araması" → "Sertifika doğrulama araması" (en "Cert validation search").
  • sec-error-no-memory — "Bellek paylaşım hatası" → "Bellek ayırma hatası" (en "memory allocation failure").
  • xp-java-remove-principal-error, xp-java-cert-not-exists-error — "Baş bölüm" → "Asıl (principal)".
  • ssl-error-bad-client, ssl-error-bad-server — locative for en "from the client/server": "istemcide" → "istemciden gelen".
  • network-connection-status-looked-up, -read, -wrote (netwerk/netwerk/necko.ftl) — completed actions rendered as progressive; -looked-up is currently byte-identical to -looking-up, so the two states are indistinguishable.
  • xpath-bad-colon (dom/dom/xslt.ftl) — meaning reversed. "‘:‘ bekleniyordu" (expected) → en is "‘:’ unexpected". Cf. the neighbouring xpath-bad-bang.
  • xslt-bad-node-name (dom/dom/xslt.ftl) — "bileşen" (component) → "öğe" (the locale's term for a DOM element).
  • pk11-bad-password (security/…/certManager.ftl) — "Geçerli parola girişi hatalı" introduces a "current password" notion absent from en "The password entered was incorrect."
  • cert-format-base64-chain, cert-format-pkcs7-chain (security/…/certManager.ftl) — "with chain" dropped; each is now byte-identical to its non-chain sibling, so the two export formats cannot be told apart.
  • pkcs12-unknown-err-restore (security/…/certManager.ftl) — "yenilenmesi" (renewal) → "geri yüklenemedi" (en "restore").
  • exception-mgr-supplemental-warning (security/…/certManager.ftl) — "Legitimate" dropped; the whole point of the warning is that legitimate sites never ask this.
  • devmgr-button-unload.label (security/…/deviceManager.ftl) — "Boşalt" (empty/pour out) → "Kaldır" (en "Unload" a PKCS#11 module).
  • fips-nonempty-primary-password-required (security/…/deviceManager.ftl) — two nominative subjects, no case marking; ungrammatical. → "FIPS kipi, her güvenlik aygıtı için bir ana parola belirlemenizi gerektirir."
  • pippki-pw-change2empty-in-fips-mode (security/…/pippki.ftl) — adds "ana" (Primary) where en says only "a non-empty password"; this is the security-device password dialog.
  • about-debugging-runtime-profile-button2 (devtools/client/aboutdebugging.ftl) — "Profil performansı" (the profile's performance) → "Performans profili çıkar" (en "Profile performance", a verb phrase).
  • storage-table-type-indexeddb-hint (devtools/client/storage.ftl) — "Bir sunucu seçerek" → "Bir veritabanı seçerek" (en "by selecting a database").
  • storage-table-type-cache-hint (devtools/client/storage.ftl) — en "View and delete the cache storage entries by selecting a storage"; both the object and the verb are wrong.
  • toolbox-mode-everything-container.title (devtools/client/toolbox.ftl) — "hataları yakala" (catch errors) → "hata ayıkla" (en "Debug everything in all processes").
  • perftools-request-to-stop-profiler (devtools/client/perftools.ftl) — transient status rendered as a button label: "Kaydı durdur" → "Kayıt durduruluyor".
  • inactive-css-at-position-try-not-supported (devtools/client/tooltips.ftl) — { $property } is a CSS property, called a "kural" (rule) here.
  • inactive-css-no-principal-box, inactive-css-ruby-element (devtools/client/tooltips.ftl) — wrong subject: the tr says the property does not create a principal box / is a ruby element; en says the element is.
  • console-stacktrace (mobile/android/mobile/android/geckoViewConsole.ftl) — missing ablative for en "Stack trace from { $filename }".

C. Wrong language / region names

toolkit/toolkit/intl/languageNames.ftl:

ID en-US Current Suggest Why
language-name-gl Galician Galce Galiçyaca "Galce" is Welsh — and is already language-name-cy. Two languages, one name.
language-name-gd Scottish Gaelic İskoçça İskoç Gaelcesi "İskoçça" is Scots — already language-name-sco.
language-name-ab Abkhazian Abazaca Abhazca Abaza (abq) is a different language.
language-name-kab Kabyle Berberice Kabilce "Berberice" names the whole Berber family.
language-name-se Northern Sami Nord Sami Kuzey Samicesi "Nord" is not Turkish.
language-name-si Sinhala Seylanca Sinhalaca outdated exonym from "Ceylon".
language-name-nn Norwegian Nynorsk Norveççe (Nynorsk) Norveççe Nynorsk sibling -nb is "Norveççe Bokmål", no parentheses.
language-name-jv Javanese Cava dili Cava Dili every other "… Dili" entry is capitalized.

toolkit/toolkit/intl/regionNames.ftl:

ID en-US Current Suggest Why
region-name-nr Nauru Nauruca Nauru "Nauruca" is the language, already language-name-na.
region-name-to Tonga Tongaca Tonga "Tongaca" is the language, already language-name-to.
region-name-cy Cyprus Güney Kıbrıs Rum Kesimi Kıbrıs en is the plain ISO 3166 country name; the current string names a different political entity.
region-name-xu Johnston Atoll Johnston Atoll Johnston Atolü untranslated; the parallel region-name-xl is "Palmyra Atolü".
region-name-re Réunion Reunion Réunion diacritic dropped (present in en).
region-name-bl Saint Barthélemy Saint Barthelemy Saint Barthélemy diacritic dropped.

Related:

  • experimental-features-ime-search-description (toolkit/featuregates/features.ftl and toolkit/firefoxlabs/features.ftl) — "Hintçe yazı dillerinde" → "Hint yazı dillerinde" (en "Indic written languages" is the script family, not Hindi).
  • fonts-langgroup-latin.label (browser/browser/preferences/fonts.ftl) — developer comment not followed. The # comment says to translate "Latin" as the script name, not the language. "Latince" → "Latin".

D. Brand / do-not-translate

  • genai-settings-chat-chatgpt-links (browser/browser/genai.ftl) — the brand is written "OpenAl" with a lowercase L (U+006C) instead of a capital I. → "OpenAI".
  • trademarkInfo (browser/branding/official/brand.ftl) — "tescilli markalarıdır" (registered trademarks) ≠ en "are trademarks of the Mozilla Foundation"; also "Mozilla Vakfının" needs the apostrophe → "Mozilla Vakfı'nın" (with ).
  • extension-colorways-bold-name (browser/browser/appExtensionFields.ftl) — developer comment not followed. The comment states "Bold" is used in the sense of bravery. Current "Koyu" means dark and duplicates extension-firefox-compact-dark-name. → "Cesur".
  • accessibility-text-label-issue-document-title (devtools/client/accessibility.ftl) — the token inside <code> is the HTML title attribute name and must stay English. Current <code>başlığı</code><code>title</code>.
  • about-debugging-worker-fetch-listening / -not-listening .label (devtools/client/aboutdebugging.ftl) — .label is the Fetch API event name; translated to "Getir" while the same string's .value correctly keeps "fetch".
  • plugins-openh264-description (toolkit/toolkit/about/aboutAddons.ftl and toolkit/toolkit/about/aboutPlugins.ftl) — stale http://www.openh264.org/; en specifies https://.
  • load-device.title (security/…/deviceManager.ftl) — "PKCS #11" with a space; en and the file's own load-device-modname-default / load-pk11-module-file-picker-title use "PKCS#11".

E. Number / agreement / possessive

  • about-logins-confirm-remove-all-sync-dialog-title (browser/browser/aboutLogins.ftl) — the singular variant reads "{ $count } hesap hepsi tüm cihazlardan kaldırılsın mı?"; "hepsi" is copied from the plural variant and is ungrammatical here.
  • ip-protection-site-exceptions-all-sites-button.description (browser/browser/ipProtection.ftl) — "{ $count } web site" (both variants) → "{ $count } web sitesi" (compound suffix required; the rest of the file uses "web sitesi").
  • content-sharing-modal-too-many-pages.message (browser/browser/contentSharing.ftl) — doubled suffix: "Sayfalarınızınızdan" → "Sayfalarınızdan".
  • update-otherInstanceHandlingUpdates / settings-update-other-instance-handling-updates.label (browser/browser/aboutDialog.ftl) — missing genitive: "{ -brand-short-name } başka bir kopyası" → "{ -brand-short-name }'un başka bir kopyası".
  • about-httpsonly-button-continue-to-site (toolkit/toolkit/about/aboutHttpsOnlyError.ftl) — "HTTP siteye" → "HTTP sitesine".
  • rights-webservices-term-5 (toolkit/toolkit/about/aboutRights.ftl) — "{ -brand-short-name } ürünün" → "ürününün".
  • webext-perms-host-description-one-site (toolkit/toolkit/global/extensions.ftl) — missing locative: "{ $domain } verilerinize erişme" → "{ $domain } sitesindeki verilerinize erişme".
  • webauthn-pin-auth-blocked-prompt (toolkit/toolkit/webauthnDialog.ftl) — missing postposition: "{ $hostname } kullanıcı doğrulaması" → "{ $hostname } sitesinde kullanıcı doğrulaması" (all four siblings have one).
  • sec-error-bad-info-access-method (toolkit/toolkit/neterror/nsserrors.ftl) — stray dative: "bilgiye erişime yöntemi" → "bilgi erişim yöntemi".
  • perftools-thread-jvm-nimbus.title, perftools-thread-jvm-glean.title (devtools/client/perftools.ftl) — "SDK'inin" → "SDK'sının" (SDK is read es-de-ka, ending in /a/).
  • genai-settings-chat-gemini-links (browser/browser/genai.ftl) — "Google Gemini'ı" → "Google Gemini'yi" (front-vowel word needs -yi plus the buffer letter; cf. the correct "Mistral'ı" in the same file).
  • policy-FirefoxHome2 (browser/browser/policies/policies-descriptions.ftl) — vowel harmony: the term resolves to "Firefox Başlangıç", so the accusative is , not 'i.
  • policy-PopupBlocking (browser/browser/policies/policies-descriptions.ftl) — missing genitive: "Belirli web sitelerin" → "Belirli web sitelerinin".
  • cert-error-unsupported-keyalg (toolkit/toolkit/neterror/certError.ftl) — wrong case: "bu siteye ziyaret etmenizi" → "bu siteyi ziyaret etmenizi" (all 15 sibling cert-error-* strings use the accusative).
  • sync-account-in-use-description-merge (browser/browser/sync.ftl) — active voice with an inanimate subject: "veriler … birleştirecektir" → "birleştirilecektir"; sync-profile-different-account-description-merge is correct.
  • custom-avatar-crop-view.aria-label (browser/browser/profiles.ftl) — "Resim görünümü kırp" is ungrammatical either way. → "Resim kırpma görünümü".

F. Verb form / mood / register

  • onboarding-many-tabs-title (browser/browser/newtab/onboarding.ftl) — informal sen: "Senin sekmelerin, senin kararın" → "Sizin sekmeleriniz, sizin kararınız".
  • onboarding-refresh-sync-title (browser/browser/newtab/onboarding.ftl) — informal sen imperatives: "İstediğin yere git, istediğin şeyi eşitle." → "İstediğiniz yere gidin, istediğiniz şeyi eşitleyin."
  • "Learn more" rendered as the informal singular "Daha fazla bilgi al" where the locale otherwise uses "Daha fazla bilgi alın": protections-panel-description-shim-allowed-learn-more (browser/protectionsPanel.ftl), restored-profile-page-learn-more (browser/profiles.ftl), translations-panel-learn-more-link (browser/translations.ftl), existing-user-tou-learn-more (browser/termsofuse.ftl). (The locale is split 71 vs 23 on this phrase overall; these four sit next to a correct sibling in the same file, which is why they're enumerated rather than left to S4.)
  • bookmark-overlay-folders-expander-hide.tooltiptext / .tooltiptextup, bookmark-overlay-tags-expander-hide.tooltiptext / .tooltiptextup (browser/browser/editBookmarkOverlay.ftl) — "Gizler" (3rd-person aorist) → "Gizle" (imperative UI command).
  • preferences-doh-description and preferences-doh-description2 (browser/browser/preferences/preferences.ftl) — malformed verb: "başkalarının görmesi zorlaştır." → "…görmesi zorlaşır."
  • feature-disable-requires-restart (browser/browser/preferences/preferences.ftl) — "için" misplaced, producing "must be restarted for Firefox": "Bu özelliği devre dışı bırakmak { -brand-short-name } için yeniden başlatılmalıdır." → "Bu özelliği devre dışı bırakmak için { -brand-short-name } yeniden başlatılmalıdır." (cf. the correct feature-enable-requires-restart).
  • report-broken-site-panel-intro-text (browser/browser/reportBrokenSite.ftl) — extra "için" after a dative that is already the complement of "yardımcı oluyor".
  • toolbox-local-mode-notice (devtools/client/toolbox.ftl) — passive stem + 2nd-person participle: "etkinleştirilebileceğiniz" → "etkinleştirebileceğiniz".
  • rights-webservices (toolkit/toolkit/about/aboutRights.ftl) — "aşağıdaki açıklanan koşullar" → "aşağıda açıklanan koşullar".
  • whypaused-breakpoint "duraklandı" / whypaused-event-breakpoint "duraklatıldı" / whypaused-promise-rejection "durakladı" (devtools/shared/debugger-paused-reasons.ftl) — the identical en pattern "Paused on X" takes three different verb forms in one file.

G. Spelling / typos

Confirmed by hunspell against the locale's own extensions/spellcheck/hunspell/tr.dic, then verified in context:

ID File Current Suggest
space-alert-over-5gb-message2 browser/preferences/preferences.ftl kulllanılabilen kullanılabilen
space-alert-under-5gb-message2 browser/preferences/preferences.ftl kulllanılabilen … deneyimi içi kullanılabilen … için
preferences-copy-profile-header.description browser/preferences/preferences.ftl parolarar parolalar
pane-experimental-description4 browser/preferences/preferences.ftl olkları oldukları
preferences-etp-advanced-settings-group.description browser/preferences/preferences.ftl "çoğu takip kodunu olarak engelleyerek" "…otomatik olarak engelleyerek" (word dropped)
webrtc-reason-for-no-permanent-allow-audio browser/webrtcIndicator.ftl paylacağınızı paylaşacağınızı
monitor-partial-breaches-motivation-description browser/protections.ftl ihallerinizi ihlallerinizi
firefox-relay-must-login-to-fxa browser/firefoxRelay.ftl kullanak için kullanmak için
callout-firefox-view-tab-pickup-title browser/featureCallout.ftl Sekma taşıma Sekme taşıma
onboarding-refresh-import-subtitle browser/newtab/onboarding.ftl "geçmişinizi ve ve diğer" "…ve diğer"
newtab-weather-menu-temperature-option-celsius browser/newtab/newtab.ftl Celcius Celsius
newtab-shortcuts-highlight-title browser/newtab/newtab.ftl Favorileri siteleriniz Favori siteleriniz
newtab-sports-widget-message-survey-body browser/newtab/newtab.ftl Dünya Kupaları sona erdi Dünya Kupası sona erdi (singular; verb disagrees)
cfr-doorhanger-video-support-header browser/newtab/asrouter.ftl { -brand-short-name }’ güncelleyin …’u güncelleyin (dangling apostrophe, no suffix)
site-data-settings-description browser/preferences/siteDataSettings.ftl "bilgisayarınızda ve çerez ve site verisi" stray "ve"
backup-folder-name browser/backupSettings.ftl Geri Yukleme Geri Yükleme
place-database-last-integrity-corruption-date toolkit/about/aboutSupport.ftl sütünlük bütünlük
media-capabilities-title toolkit/about/aboutSupport.ftl Çoku ortam Çoklu ortam
profiles-rename toolkit/about/aboutProfiles.ftl değiștir (U+0219, Romanian s-comma) değiştir (U+015F)
rights-webservices-term-7 toolkit/about/aboutRights.ftl ihtilafi ihtilafı
privacy-spoof-english toolkit/global/resistFingerPrinting.ftl değştirmek değiştirmek
elevation-error-manual toolkit/updates/elevation.ftl "ziyaretip edip" "ziyaret edip"
ssl-error-cert-kea-mismatch toolkit/neterror/nsserrors.ftl anahtar değiş algoritması anahtar değişim algoritması
sec-error-not-fortezza-issuer toolkit/neterror/nsserrors.ftl "zinciri has FORTEZZA olmayan" stray English word "has"
file-browse-pkcs12-spec security/…/certManager.ftl PKSC12 PKCS12
styleeditor-filter-input.placeholder devtools/client/styleeditor.ftl Stil dosyalarını filtrelere …filtrele

H. Terminology inconsistency

(Surface only — many may be legitimate context differences. Full cross-file scan found 133 divergent groups; these are the ones where a same-file sibling proves one rendering is the intended one.)

  • menu-application-set-as-default.label (browser/menubar.ftl) and set-default-menu-message-split-layout-subtitle [macos] (browser/newtab/asrouter.ftl) — "saptanmış tarayıcı"; every other string in the locale uses "varsayılan".
  • lockwise-header-content-logged-in (browser/protections.ftl) — "senkronize edebilirsiniz" → "eşitleyebilirsiniz" (Sync is "eşitleme" throughout).
  • migration-wizard-safari-permissions-sub-header (browser/migrationWizard.ftl) — "yer işaretleri"; the only occurrence in the whole locale — everywhere else bookmarks are "yer imleri".
  • places-view-sortby-name.label (browser/places.ftl) — "İsme göre sırala" vs places-sortby-name "Ada göre sırala" for the same en string in the same file.
  • remove-engine-remove (browser/preferences/preferences.ftl) — "Sil" vs the triggering control search-remove-engine "Kaldır".
  • security-privacy-issue-warning-safe-browsing.label (browser/preferences/preferences.ftl) — "yanıltıcı" vs "aldatıcı" used for en "deceptive" in security-enable-safe-browsing, security-browsing-protection, browsing-protection-group2.
  • preferences-text-zoom-override-warning2.message (browser/preferences/preferences.ftl) — quotes the option as "Yalnızca metni yakınlaştır" but its actual label preferences-zoom-text-only is "Sadece metni yakınlaştır".
  • preferences-ai-controls-translations-control.label (browser/preferences/preferences.ftl) — "Çeviri" vs "Çeviriler" everywhere else.
  • contextual-manager-password-login-line-with-alert.aria-label / .title (browser/contextual-manager.ftl) — "(Dikkat)" vs "(Uyarı)" in the two parallel strings.
  • reset-pbm-panel-description (browser/browser.ftl) — "özel sekmeleri" vs "gizli" used for "private" everywhere, including reset-pbm-panel-description2 right above.
  • profiles-cyan-theme-title.title (browser/profiles.ftl) — tooltip says "Cyan temayı uygula" but the theme's own label profiles-cyan-theme is "Açık mavi".
  • safeb-blocked-unwanted-page-learn-more (browser/safebrowsing/blockedSite.ftl) — "kötü amaçlı yazılım" vs "zararlı yazılım" in the three sibling strings.
  • webext-perms-update-text2 (toolkit/global/extensions.ftl) — quotes the Cancel button as "İptal", but it is labelled webext-perms-cancel = "Vazgeç"; webext-perms-update-text gets it right.
  • user-context-color-cyan.label (toolkit/global/contextual-identity.ftl) — "Açık mavi" (light blue) for en "Cyan" → "Camgöbeği"; as-is it is confusable with user-context-color-blue.
  • wizard-macos-button-next.label (toolkit/global/wizard.ftl) — "İleri" for the macOS "Continue" variant, while profile-creation-explanation-4 tells macOS users to press "Devam düğmesine".
  • main-thread-no-omtc (toolkit/about/aboutSupport.ftl), about-telemetry-slow-sql-main, about-telemetry-slow-sql-other (toolkit/about/aboutTelemetry.ftl) — "(işlem) parçacığı" for thread; bare "parçacık" means particle. The locale's term elsewhere (aboutProcesses.ftl) is "iş parçacığı".
  • about-telemetry-slow-sql-statement (toolkit/about/aboutTelemetry.ftl) — "İfade" vs the section heading about-telemetry-slow-sql-section "Deyimleri".
  • about-webrtc-nominated (toolkit/about/aboutWebrtc.ftl) — "Aday", the same word already used for Candidate, making the Nominated column meaningless → "Aday gösterildi".
  • certificate-viewer-given-name (toolkit/about/certviewer.ftl) — "Adı", identical to certificate-viewer-name; the two certificate fields become indistinguishable → "Ön adı".
  • about-glean-label-for-tag-pings (toolkit/about/aboutGlean.ftl) — "pinglerinizi"; every other occurrence in the file uses "ping'ler" with an apostrophe.
  • printui-sheets-count (toolkit/printing/printUI.ftl) — "{ $sheetCount } sayfa" for en "sheets of paper", while "sayfa" is already page; printui-pages-per-sheet uses "yaprak".
  • print-setup.title (toolkit/printing/printDialogs.ftl) — "Sayfa Yapısı" vs the menu item that opens it, printpreview-page-setup "Sayfa düzeni…".
  • margin-group-label-inches, margin-group-label-metric (toolkit/printing/printDialogs.ftl) — "Kenarlar" (edges) vs printui-margins "Kenar boşlukları".
  • pdfjs-editor-alt-text-button-label and siblings (toolkit/pdfviewer/viewer.ftl) — "Alternatif metin" in 4 strings vs "Alt metin" in ~20.
  • pdfjs-editor-undo-bar-message-stamp (toolkit/pdfviewer/viewer.ftl) — "Görsel silindi" vs "Resim" used in every other image string.
  • pdfjs-find-match-diacritics-checkbox-label (toolkit/pdfviewer/viewer.ftl) and findbar-match-diacritics / findbar-match-diacritics-status (toolkit/main-window/findbar.ftl) — "Fonetik işaretleri" → "Ayırıcı işaretleri" (diacritics are not phonetic marks).
  • pdfjs-editor-new-alt-text-description, pdfjs-editor-alt-text-settings-create-model-description (toolkit/pdfviewer/viewer.ftl) — "Görme engelli kişilere" narrows en "people who can't see the image"; pdfjs-editor-alt-text-dialog-description renders the same source correctly.
  • exception-mgr.title, exception-mgr-extra-button.label, exception-mgr-permanent.label, delete-ssl-override-title.title, delete-ssl-override-confirm, delete-ssl-override-impact, add-exception-valid-long (security/…/certManager.ftl) — "ayrıcalık" (privilege) for en "exception", while certmgr-add-exception and certmgr-server use "istisna".
  • fips-nonempty-primary-password-required (security/…/deviceManager.ftl), protected-auth-prompt (security/…/pippki.ftl) — "güvenlik cihazı" vs "güvenlik aygıtı" used in devmgr-window, unable-to-toggle-fips, pkcs12-dup-data, certmgr-token-name, change-password-token.
  • xslt-call-to-key-not-allowed (dom/dom/xslt.ftl) — "işlev" vs "fonksiyon" used in xpath-unknown-function, xpath-bad-argument-count, xpath-bad-extension-function; also "the key function" is the XSLT key() function name, not a generic "anahtar işlev".
  • styleeditor-filter-input, styleeditor-visibility-toggle-system, styleeditor-stylesheet-all-filtered vs styleeditor-new-button, styleeditor-visibility-toggle, styleeditor-save-button (devtools/client/styleeditor.ftl) and options-stylesheets-in-the-debugger-label vs -tooltip (devtools/client/toolbox-options.ftl) — "stil dosyası" vs "stil sayfası" for stylesheet in adjacent strings.
  • options-context-triggers-page-refresh-persists (devtools/client/toolbox-options.ftl) — "(sayfayı tazeler)" vs "sayfayı yeniden yükler" in the two sibling strings.
  • newtab-sports-widget-match-aria-label-upcoming-suspended (browser/newtab/newtab.ftl) — "ara verildi" vs the status string newtab-sports-widget-suspended "Askıya alındı".
  • newtab-clock-widget-input-nickname (browser/newtab/newtab.ftl) — ".label = Ad" for en "Nickname"; newtab-clock-widget-edit-item-with-nickname uses "takma adı", and plain "Ad" collides with a real name field (the dev comment warns about this).
  • about-glean-about-data-header / about-glean-category-about-data, autofill-add-new-address-title / autofill-addresses-add-button, add-engine-dialog.buttonlabelaccept / add-engine-dialog2.buttonlabelaccept — see also S4.

I. Typography (non-systemic)

  • rights-webservices (toolkit/about/aboutRights.ftl) — ("Hizmetler") with straight double quotes → (“Hizmetler”).
  • rights-webservices-term-4 (toolkit/about/aboutRights.ftl) — "oldukları gibi" straight quotes → “oldukları gibi”.
  • about-glean-label-for-tag-pings-with-requirements (toolkit/about/aboutGlean.ftl) — "-" straight quotes → “-”.
  • monitor-breaches-unresolved-description (browser/protections.ftl) — "çözüldü" straight quotes → “çözüldü”.
  • connection-proxy-noproxy-localhost-desc-2 (browser/preferences/connection.ftl) — serial comma before "ve" carried over from English: "127.0.0.1/8, ve ::1" → "127.0.0.1/8 ve ::1".

J. Fields collapsing into one label (formAutofill.ftl)

  • autofill-address-country — "Ülke" for en "Country or Region"; "or Region" dropped, and it now collides with autofill-address-country-only = "Ülke".
  • autofill-address-county — "İlçe", already used by autofill-address-district (District). County is a first-level division listed next to Province/State.
  • autofill-address-department — "Bölüm"; the # comment says this is a primary administrative division in Nicaragua/Colombia, not an organizational section → "Departman".
  • autofill-address-name — "Ad", identical to autofill-address-given-name (First Name) → "Ad soyad".

K. Dropped content (en-US says more than tr does)

  • more-from-moz-mozilla-monitor-us-description (browser/preferences/moreFromMozilla.ftl) — "Automatically" dropped.
  • sitedata-total-size (browser/preferences/preferences.ftl) — "cookies" dropped from "Your stored cookies, site data, and cache".
  • preferences-ai-controls-on-device-group.description (browser/preferences/preferences.ftl) — the condition "if you use the feature" dropped, implying unconditional downloads.
  • should-restart-ok (browser/preferences/preferences.ftl) — "now" dropped; the OK button is now byte-identical to should-restart-title.
  • firefoxview-search-text-box-history.placeholder (browser/firefoxView.ftl) — developer comment not followed ("search" is a verb). "Arama geçmişi" (search history, a noun) → "Geçmişte ara", matching the sibling placeholders.

5. Findings by area

Area Findings
browser/browser/preferences/ 34
browser/browser/*.ftl (a–l) 24
browser/browser/*.ftl (m–z) 24
browser/browser/newtab/ + policies/branding/safebrowsing 26
toolkit/toolkit/about/ 38
toolkit/ (excl. about/) 44
devtools/ 17
dom/ + security/ + netwerk/ + mobile/ 22
Total enumerated ~229
Systemic buckets 5 (S1–S5, ~90 affected IDs)

6. Not the locale's fault

  • The “…“ closing-quote bug in import-safari-permissions-string, about-logging-invalid-output, about-logging-unknown-logging-preset, about-logging-unknown-profiler-preset, about-logging-unknown-option and about-telemetry-data-details-current is present in en-US too. tr inherited it. Worth fixing in tr regardless, and worth filing upstream.
  • toolkit/toolkit/global/theme-picker.ftl exists in en-US but not in tr — a new file, i.e. a completeness gap, not a regression.
  • tr/extensions/spellcheck/hunspell/ (the Turkish dictionary) has no en-US counterpart and is legitimately locale-only.

7. Overall

tr is a well-maintained, near-complete locale: zero syntax errors, zero variable mismatches, zero access-key defects, only 109 missing strings, and consistent typographic and register conventions. The defects found are almost entirely quality-level — a handful of genuine typos, a set of reversed or narrowed meanings, and terminology drift concentrated in the low-visibility nsserrors.ftl and in intl/languageNames.ftl / regionNames.ftl.

The highest-value fixes, in order:

  1. ai-window-learn-from-browsing-activity.label and fxa-signout-dialog-body-aiwindow — the only functional defects ($plural-form vs the tr term's $form selector).
  2. Language and region names (section C) — user-visible, unambiguous, and two pairs of distinct languages currently share one name.
  3. The reversed meanings in section B — about-networking-networkid-status-known, performance-limit-content-process-blocked-desc, ssl-error-rx-unexpected-uncompressed-record, pdfjs-editor-ink-opacity-input, xpath-bad-colon, webrtc-sharing-menu.label.
  4. The 26 spelling typos in section G — mechanical, zero-risk.
  5. S1 and S2 (straight apostrophes, unbalanced quotes) — mechanical, 29 strings total.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment