richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits: 74db46f9 by Henry Wilkes at 2024-03-25T21:54:25+00:00 fixup! Bug 40925: Implemented the Security Level component
Bug 42214: Migrate security level strings to Fluent.
- - - - - 142836ed by Henry Wilkes at 2024-03-25T21:54:25+00:00 fixup! Base Browser strings
Bug 42214: Migrate security level strings to Fluent.
Also change some strings to be sentence case in English.
- - - - - 4338bda1 by Henry Wilkes at 2024-03-25T21:54:25+00:00 fixup! Tor Browser localization migration scripts.
Bug 42214: Migrate security level strings to Fluent.
- - - - -
7 changed files:
- browser/components/preferences/preferences.xhtml - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - browser/locales/en-US/browser/base-browser.ftl - browser/locales/jar.mn - + tools/torbrowser/l10n/migrations/bug-42214-security-level.py
Changes:
===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -60,6 +60,7 @@ <link rel="localization" href="security/certificates/certManager.ftl"/> <link rel="localization" href="security/certificates/deviceManager.ftl"/> <link rel="localization" href="toolkit/updates/history.ftl"/> + <link rel="localization" href="browser/base-browser.ftl"/> <link rel="localization" href="browser/tor-browser.ftl"/>
<link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/>
===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter( "resource://gre/modules/SecurityLevel.jsm" );
-XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => { - let strings = { - // Generic terms - security_level: "Security Level", - security_level_standard: "Standard", - security_level_safer: "Safer", - security_level_safest: "Safest", - security_level_tooltip_standard: "Security Level: Standard", - security_level_tooltip_safer: "Security Level: Safer", - security_level_tooltip_safest: "Security Level: Safest", - // Shown only for custom level - security_level_custom: "Custom", - security_level_restore: "Restore Defaults", - security_level_learn_more: "Learn more", - // Panel - security_level_open_settings: "Settings…", - security_level_standard_summary: - "All browser and website features are enabled.", - security_level_safer_summary: - "Disables website features that are often dangerous, causing some sites to lose functionality.", - security_level_safest_summary: - "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.", - security_level_custom_heading: "Custom security level configured", - security_level_custom_summary: - "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.", - // Security level section in about:preferences#privacy - security_level_overview: - "Disable certain web features that can be used to attack your security and anonymity.", - security_level_list_safer: "At the safer setting:", - security_level_list_safest: "At the safest setting:", - // Strings for descriptions - security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.", - security_level_js_disabled: - "JavaScript is disabled by default on all sites.", - security_level_limit_typography: - "Some fonts and math symbols are disabled.", - security_level_limit_typography_svg: - "Some fonts, icons, math symbols, and images are disabled.", - security_level_limit_media: - "Audio and video (HTML5 media), and WebGL are click-to-play.", - }; - let bundle = null; - try { - bundle = Services.strings.createBundle( - "chrome://browser/locale/securityLevel.properties" - ); - } catch (e) { - console.warn("Could not load the Security Level strings"); - } - if (bundle) { - for (const key of Object.keys(strings)) { - try { - strings[key] = bundle.GetStringFromName(key); - } catch (e) {} - } - } - return strings; -}); - /* Security Level Button Code
@@ -100,12 +41,30 @@ var SecurityLevelButton = { if (!level) { return; } - const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : ""; - this._button.setAttribute("level", `${level}${customStr}`); - this._button.setAttribute( - "tooltiptext", - SecurityLevelStrings[`security_level_tooltip_${level}`] - ); + const custom = SecurityLevelPrefs.securityCustom; + this._button.setAttribute("level", custom ? `${level}_custom` : level); + + let l10nIdLevel; + switch (level) { + case "standard": + l10nIdLevel = "security-level-toolbar-button-standard"; + break; + case "safer": + l10nIdLevel = "security-level-toolbar-button-safer"; + break; + case "safest": + l10nIdLevel = "security-level-toolbar-button-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + // Don't distinguish between the different levels when in the custom + // state. We just want to emphasise that it is custom rather than any + // specific level. + l10nIdLevel = "security-level-toolbar-button-custom"; + } + document.l10n.setAttributes(this._button, l10nIdLevel); },
/** @@ -159,7 +118,6 @@ var SecurityLevelButton = { window.gNavToolbox.palette.querySelector("#security-level-button"); // Set a label to be be used as the accessible name, and to be shown in the // overflow menu and during customization. - this._button.setAttribute("label", SecurityLevelStrings.security_level); this._button.addEventListener("command", () => this.openPopup()); // set the initial class based off of the current pref this._configUIFromPrefs(); @@ -213,21 +171,12 @@ var SecurityLevelPanel = { settingsButton: document.getElementById("securityLevel-settings"), };
- document.getElementById("securityLevel-header").textContent = - SecurityLevelStrings.security_level; - this._elements.customName.textContent = - SecurityLevelStrings.security_level_custom; const learnMoreEl = document.getElementById("securityLevel-learnMore"); - learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more; learnMoreEl.addEventListener("click", event => { window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); event.preventDefault(); }); - this._elements.restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; - this._elements.settingsButton.textContent = - SecurityLevelStrings.security_level_open_settings;
this._elements.restoreDefaultsButton.addEventListener("command", () => { this.restoreDefaults(); @@ -268,11 +217,30 @@ var SecurityLevelPanel = {
// Descriptions change based on security level this._elements.background.setAttribute("level", level); - this._elements.levelName.textContent = - SecurityLevelStrings[`security_level_${level}`]; - this._elements.summary.textContent = custom - ? SecurityLevelStrings.security_level_custom_summary - : SecurityLevelStrings[`security_level_${level}_summary`]; + let l10nIdLevel; + let l10nIdSummary; + switch (level) { + case "standard": + l10nIdLevel = "security-level-panel-level-standard"; + l10nIdSummary = "security-level-summary-standard"; + break; + case "safer": + l10nIdLevel = "security-level-panel-level-safer"; + l10nIdSummary = "security-level-summary-safer"; + break; + case "safest": + l10nIdLevel = "security-level-panel-level-safest"; + l10nIdSummary = "security-level-summary-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + l10nIdSummary = "security-level-summary-custom"; + } + + document.l10n.setAttributes(this._elements.levelName, l10nIdLevel); + document.l10n.setAttributes(this._elements.summary, l10nIdSummary); },
/** @@ -358,25 +326,13 @@ var SecurityLevelPreferences = { this._customNotification = document.getElementById( "securityLevel-customNotification" ); - this._radiogroup = document.getElementById("securityLevel-radiogroup"); - - document.querySelector("#securityLevel-groupbox h2").textContent = - SecurityLevelStrings.security_level; - document.getElementById("securityLevel-overview").textContent = - SecurityLevelStrings.security_level_overview; document - .getElementById("securityLevel-learnMore") - .setAttribute("value", SecurityLevelStrings.security_level_learn_more); - - document.getElementById("securityLevel-customHeading").textContent = - SecurityLevelStrings.security_level_custom_heading; - document.getElementById("securityLevel-customDescription").textContent = - SecurityLevelStrings.security_level_custom_summary; - const restoreDefaultsButton = document.getElementById( - "securityLevel-restoreDefaults" - ); - restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; + .getElementById("securityLevel-restoreDefaults") + .addEventListener("command", () => { + SecurityLevelPrefs.securityCustom = false; + }); + + this._radiogroup = document.getElementById("securityLevel-radiogroup");
this._radioOptions = Array.from( this._radiogroup.querySelectorAll(".securityLevel-radio-option"), @@ -384,46 +340,7 @@ var SecurityLevelPreferences = { return { container, radio: container.querySelector("radio") }; } ); - const descListItemsMap = { - safer: [ - SecurityLevelStrings.security_level_js_https_only, - SecurityLevelStrings.security_level_limit_typography, - SecurityLevelStrings.security_level_limit_media, - ], - safest: [ - SecurityLevelStrings.security_level_js_disabled, - SecurityLevelStrings.security_level_limit_typography_svg, - SecurityLevelStrings.security_level_limit_media, - ], - }; - for (const { container, radio } of this._radioOptions) { - const level = radio.value; - radio.setAttribute( - "label", - SecurityLevelStrings[`security_level_${level}`] - ); - container.querySelector(".summary").textContent = - SecurityLevelStrings[`security_level_${level}_summary`]; - const descListItems = descListItemsMap[level]; - if (!descListItems) { - continue; - } - const descrList = container.querySelector( - ".securityLevel-descriptionList" - ); - // TODO: Add the elements in securityLevelPreferences.inc.xhtml again - // when we switch to Fluent - for (const text of descListItems) { - let elem = document.createXULElement("description"); - elem.textContent = text; - elem.className = "indent"; - descrList.append(elem); - } - }
- restoreDefaultsButton.addEventListener("command", () => { - SecurityLevelPrefs.securityCustom = false; - }); this._radiogroup.addEventListener("select", () => { SecurityLevelPrefs.securityLevel = this._radiogroup.value; });
===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -7,20 +7,35 @@ level="top" class="cui-widget-panel panel-no-padding"> <box class="panel-header"> - <html:h1 id="securityLevel-header"></html:h1> + <html:h1 + id="securityLevel-header" + data-l10n-id="security-level-panel-heading" + ></html:h1> </box> <toolbarseparator id="securityLevel-separator"></toolbarseparator> <vbox id="securityLevel-background" class="panel-subview-body"> <html:p id="securityLevel-subheading"> <html:span id="securityLevel-level"></html:span> - <html:span id="securityLevel-custom"></html:span> + <html:span + id="securityLevel-custom" + data-l10n-id="security-level-panel-custom-badge" + ></html:span> </html:p> <html:p id="securityLevel-summary"></html:p> - <html:a id="securityLevel-learnMore" href="about:manual#security-settings"> - </html:a> + <html:a + id="securityLevel-learnMore" + data-l10n-id="security-level-panel-learn-more-link" + href="about:manual#security-settings" + ></html:a> </vbox> <hbox class="panel-footer"> - <button id="securityLevel-settings"/> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-settings" + data-l10n-id="security-level-panel-open-settings-button" + /> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </panel>
===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -2,37 +2,64 @@ data-category="panePrivacy" data-subcategory="securitylevel" hidden="true"> - <label>html:h2</html:h2></label> + <label> + <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2> + </label> <vbox flex="1"> <description flex="1"> - <html:span id="securityLevel-overview" class="tail-with-learn-more"> - </html:span> - <label id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" - href="about:manual#security-settings" - useoriginprincipal="true"/> + <html:span + id="securityLevel-overview" + class="tail-with-learn-more" + data-l10n-id="security-level-preferences-overview" + ></html:span> + <label + id="securityLevel-learnMore" + class="learnMore text-link" + is="text-link" + data-l10n-id="security-level-preferences-learn-more-link" + href="about:manual#security-settings" + useoriginprincipal="true" + /> </description> - <hbox id="securityLevel-customNotification" - class="info-box-container" - flex="1"> + <hbox + id="securityLevel-customNotification" + class="info-box-container" + flex="1" + > <hbox class="info-icon-container"> <image class="info-icon securityLevel-custom-warning-icon"/> </hbox> <vbox flex="1"> - <label id="securityLevel-customHeading"/> - <description id="securityLevel-customDescription" flex="1"/> + <label + id="securityLevel-customHeading" + data-l10n-id="security-level-preferences-custom-heading" + /> + <description + id="securityLevel-customDescription" + data-l10n-id="security-level-summary-custom" + flex="1" + /> </vbox> <hbox align="center"> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </hbox> <radiogroup id="securityLevel-radiogroup"> <vbox class="securityLevel-radio-option"> - <radio value="standard" - aria-describedby="securityLevelSummary-standard"/> + <radio + value="standard" + data-l10n-id="security-level-preferences-level-standard" + aria-describedby="securityLevelSummary-standard" + /> <vbox id="securityLevelSummary-standard"> - <description class="summary indent" flex="1"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-standard" + /> </vbox> </vbox> <vbox class="securityLevel-radio-option"> @@ -41,19 +68,59 @@ - securityLevel-descriptionList is shown or hidden, its text content - is included or excluded from the accessible description, - respectively. --> - <radio value="safer" - aria-describedby="securityLevelSummary-safer"/> + <radio + value="safer" + data-l10n-id="security-level-preferences-level-safer" + aria-describedby="securityLevelSummary-safer" + /> <vbox id="securityLevelSummary-safer"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safer" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-https-only-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> <vbox class="securityLevel-radio-option"> - <radio value="safest" - aria-describedby="securityLevelSummary-safest"/> + <radio + value="safest" + data-l10n-id="security-level-preferences-level-safest" + aria-describedby="securityLevelSummary-safest" + /> <vbox id="securityLevelSummary-safest"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safest" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-disabled-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> </radiogroup>
===================================== browser/locales/en-US/browser/base-browser.ftl ===================================== @@ -70,6 +70,7 @@ new-identity-dialog-confirm = new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session. # Button to continue loading the home page, despite the warning message. new-identity-blocked-home-ignore-button = Load it anyway + ## Preferences - Letterboxing.
# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised. @@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled. # "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages. letterboxing-enable-button = .label = Enable Letterboxing + +## Security level toolbar button. +## Uses sentence case in English (US). +## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar. + +security-level-toolbar-button-standard = + .label = Security level + .tooltiptext = Security level: Standard +security-level-toolbar-button-safer = + .label = Security level + .tooltiptext = Security level: Safer +security-level-toolbar-button-safest = + .label = Security level + .tooltiptext = Security level: Safest +# Used when the user is in some custom configuration that does not match a security level. +security-level-toolbar-button-custom = + .label = Security level + .tooltiptext = Security level: Custom + +## Security level popup panel. + +# Uses sentence case in English (US). +security-level-panel-heading = Security level + +security-level-panel-level-standard = Standard +security-level-panel-level-safer = Safer +security-level-panel-level-safest = Safest +security-level-panel-learn-more-link = Learn more +# Button to open security level settings. +security-level-panel-open-settings-button = Settings… + +## Security level settings. + +security-level-preferences-heading = Security Level +security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity. +security-level-preferences-learn-more-link = Learn more +security-level-preferences-level-standard = + .label = Standard +security-level-preferences-level-safer = + .label = Safer +security-level-preferences-level-safest = + .label = Safest + +## Security level summaries shown in security panel and settings. + +security-level-summary-standard = All browser and website features are enabled. +security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality. +security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. + +## Security level feature bullet points. +## Shown in the settings under the security level when it is selected. + +security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites. +security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled. +security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play. +security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites. +security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled. + +## Custom security level. +## Some custom preferences configuration has placed the user outside one of the standard three levels. + +# Shown in the security level panel as an orange badge next to the expected level. +security-level-panel-custom-badge = Custom +# Shown in the security level settings in a warning box. +security-level-preferences-custom-heading = Custom security level configured +# Description of custom state and recommended action. +# Shown in the security level panel and settings. +security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. +# Button to undo custom changes to the security level and place the user in one of the standard security levels. +# Shown in the security level panel and settings. +security-level-restore-defaults-button = Restore defaults
===================================== browser/locales/jar.mn ===================================== @@ -33,6 +33,5 @@ locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties) locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) - locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties) locale/browser/cryptoSafetyPrompt.properties (%chrome/browser/cryptoSafetyPrompt.properties) % locale browser-region @AB_CD@ %locale/browser-region/
===================================== tools/torbrowser/l10n/migrations/bug-42214-security-level.py ===================================== @@ -0,0 +1,43 @@ +from fluent.migrate.helpers import transforms_from + + +def migrate(ctx): + ctx.add_transforms( + "base-browser.ftl", + "base-browser.ftl", + transforms_from( + """ +security-level-panel-level-standard = { COPY(path, "security_level_standard") } +security-level-panel-level-safer = { COPY(path, "security_level_safer") } +security-level-panel-level-safest = { COPY(path, "security_level_safest") } +security-level-panel-learn-more-link = { COPY(path, "security_level_learn_more") } +security-level-panel-open-settings-button = { COPY(path, "security_level_open_settings") } + +security-level-preferences-heading = { COPY(path, "security_level") } +security-level-preferences-overview = { COPY(path, "security_level_overview") } +security-level-preferences-learn-more-link = { COPY(path, "security_level_learn_more") } +security-level-preferences-level-standard = + .label = { COPY(path, "security_level_standard") } +security-level-preferences-level-safer = + .label = { COPY(path, "security_level_safer") } +security-level-preferences-level-safest = + .label = { COPY(path, "security_level_safest") } + +security-level-summary-standard = { COPY(path, "security_level_standard_summary") } +security-level-summary-safer = { COPY(path, "security_level_safer_summary") } +security-level-summary-safest = { COPY(path, "security_level_safest_summary") } + + +security-level-preferences-bullet-https-only-javascript = { COPY(path, "security_level_js_https_only") } +security-level-preferences-bullet-limit-font-and-symbols = { COPY(path, "security_level_limit_typography") } +security-level-preferences-bullet-limit-media = { COPY(path, "security_level_limit_media") } +security-level-preferences-bullet-disabled-javascript = { COPY(path, "security_level_js_disabled") } +security-level-preferences-bullet-limit-font-and-symbols-and-images = { COPY(path, "security_level_limit_typography_svg") } + +security-level-panel-custom-badge = { COPY(path, "security_level_custom") } +security-level-preferences-custom-heading = { COPY(path, "security_level_custom_heading") } +security-level-summary-custom = { COPY(path, "security_level_custom_summary") } +""", + path="securityLevel.properties", + ), + )
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/966b7f3...
tbb-commits@lists.torproject.org