[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-102.5.0esr-12.5-1] 3 commits: fixup! Add TorStrings module for localization

Pier Angelo Vendrame (@pierov) git at gitlab.torproject.org
Mon Dec 12 19:25:00 UTC 2022



Pier Angelo Vendrame pushed to branch tor-browser-102.5.0esr-12.5-1 at The Tor Project / Applications / Tor Browser


Commits:
5688cd7a by Pier Angelo Vendrame at 2022-12-12T20:17:45+01:00
fixup! Add TorStrings module for localization

Bug 41375: Cleared unused strings

- - - - -
6ae67e05 by Pier Angelo Vendrame at 2022-12-12T20:17:45+01:00
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser

Changed placeholders for strings as we switched from dtd to .properties.

- - - - -
96d9ec71 by Pier Angelo Vendrame at 2022-12-12T20:17:45+01:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection

Changed placeholders for strings as we switched from dtd to .properties.

- - - - -


18 changed files:

- browser/components/torconnect/content/aboutTorConnect.js
- browser/components/torpreferences/content/connectionPane.js
- browser/modules/TorStrings.jsm
- toolkit/torbutton/chrome/locale/en-US/aboutDialog.dtd
- toolkit/torbutton/chrome/locale/en-US/aboutTBUpdate.dtd
- toolkit/torbutton/chrome/locale/en-US/aboutTor.dtd
- toolkit/torbutton/chrome/locale/en-US/brand.dtd
- toolkit/torbutton/chrome/locale/en-US/brand.properties
- toolkit/torbutton/chrome/locale/en-US/browserOnboarding.properties
- + toolkit/torbutton/chrome/locale/en-US/cryptoSafetyPrompt.properties
- − toolkit/torbutton/chrome/locale/en-US/network-settings.dtd
- + toolkit/torbutton/chrome/locale/en-US/onionLocation.properties
- + toolkit/torbutton/chrome/locale/en-US/rulesets.properties
- + toolkit/torbutton/chrome/locale/en-US/settings.properties
- + toolkit/torbutton/chrome/locale/en-US/torConnect.properties
- toolkit/torbutton/chrome/locale/en-US/torbutton.dtd
- toolkit/torbutton/chrome/locale/en-US/torbutton.properties
- toolkit/torbutton/chrome/locale/en-US/torlauncher.properties


Changes:

=====================================
browser/components/torconnect/content/aboutTorConnect.js
=====================================
@@ -1,4 +1,7 @@
 // Copyright (c) 2021, The Tor Project, Inc.
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 /* eslint-env mozilla/frame-script */
 
@@ -608,7 +611,7 @@ class AboutTorConnect {
   }
 
   showConfigureConnectionLink(text) {
-    const pieces = text.split("#1");
+    const pieces = text.split("%S");
     const link = document.createElement("a");
     link.textContent = TorStrings.torConnect.configureConnection;
     link.setAttribute("href", "#");


=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -1,3 +1,8 @@
+// Copyright (c) 2022, The Tor Project, Inc.
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 "use strict";
 
 /* global Services, gSubDialog */
@@ -518,10 +523,10 @@ const gConnectionPane = (function() {
           details && details.transport !== undefined
             ? details.transport
             : "vanilla";
-        for (const piece of idString.split(/(#[12])/)) {
-          if (piece == "#1") {
+        for (const piece of idString.split(/(%[12]\$S)/)) {
+          if (piece == "%1$S") {
             id.append(type);
-          } else if (piece == "#2") {
+          } else if (piece == "%2$S") {
             id.append(...emojis);
           } else {
             id.append(piece);


=====================================
browser/modules/TorStrings.jsm
=====================================
@@ -1,74 +1,20 @@
+// Copyright (c) 2022, The Tor Project, Inc.
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 "use strict";
 
 var EXPORTED_SYMBOLS = ["TorStrings"];
 
-const { XPCOMUtils } = ChromeUtils.import(
-  "resource://gre/modules/XPCOMUtils.jsm"
-);
 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { AppConstants } = ChromeUtils.import(
+  "resource://gre/modules/AppConstants.jsm"
+);
 const { getLocale } = ChromeUtils.import(
   "resource://torbutton/modules/utils.js"
 );
 
-XPCOMUtils.defineLazyGlobalGetters(this, ["DOMParser"]);
-XPCOMUtils.defineLazyGetter(this, "domParser", () => {
-  const parser = new DOMParser();
-  parser.forceEnableDTD();
-  return parser;
-});
-
-/*
-  Tor DTD String Bundle
-
-  DTD strings loaded from torbutton/tor-launcher, but provide a fallback in case they aren't available
-*/
-class TorDTDStringBundle {
-  constructor(aBundleURLs, aPrefix) {
-    const locations = [];
-    for (const [index, url] of aBundleURLs.entries()) {
-      locations.push(`<!ENTITY % dtd_${index} SYSTEM "${url}">%dtd_${index};`);
-    }
-    this._locations = locations;
-    this._prefix = aPrefix;
-    const idx = aBundleURLs.lastIndexOf("/");
-    this._filename = idx === -1 ? aBundleURLs : aBundleURLs.substring(idx);
-  }
-
-  // copied from testing/marionette/l10n.js
-  localizeEntity(urls, id) {
-    // Use the DOM parser to resolve the entity and extract its real value
-    const header = `<?xml version="1.0"?><!DOCTYPE elem [${this._locations.join(
-      ""
-    )}]>`;
-    const elem = `<elem id="elementID">&${id};</elem>`;
-    const doc = domParser.parseFromString(header + elem, "text/xml");
-    const element = doc.querySelector("elem[id='elementID']");
-
-    if (element === null) {
-      throw new Error(`Entity with id='${id}' hasn't been found`);
-    }
-
-    return element.textContent;
-  }
-
-  getString(key, fallback) {
-    if (key) {
-      try {
-        return this.localizeEntity(this._bundleURLs, `${this._prefix}${key}`);
-      } catch (e) {
-        console.warn(`[TorStrings] Cannot get ${key} on ${this._filename}`, e);
-      }
-    }
-
-    // on failure, assign the fallback if it exists
-    if (fallback) {
-      return fallback;
-    }
-    // otherwise return string key
-    return `$(${key})`;
-  }
-}
-
 /*
   Tor Property String Bundle
 
@@ -78,16 +24,28 @@ class TorPropertyStringBundle {
   constructor(aBundleURL, aPrefix) {
     try {
       this._bundle = Services.strings.createBundle(aBundleURL);
-    } catch (e) {}
+      this._bundleURL = aBundleURL;
+    } catch (e) {
+      console.error(`[TorStrings] Cannot load ${aBundleURL}`, e);
+    }
 
     this._prefix = aPrefix;
   }
 
   getString(key, fallback) {
+    const reportError =
+      AppConstants.TOR_BROWSER_VERSION === "dev-build" && !!this._bundle;
     if (key) {
       try {
         return this._bundle.GetStringFromName(`${this._prefix}${key}`);
-      } catch (e) {}
+      } catch (e) {
+        if (reportError) {
+          console.warn(
+            `[TorStrings] Cannot get ${this._prefix}${key} from ${this._bundleURL}`,
+            e
+          );
+        }
+      }
     }
 
     // on failure, assign the fallback if it exists
@@ -97,6 +55,15 @@ class TorPropertyStringBundle {
     // otherwise return string key
     return `$(${key})`;
   }
+
+  getStrings(strings) {
+    return Object.fromEntries(
+      Object.entries(strings).map(([key, fallback]) => [
+        key,
+        this.getString(key, fallback),
+      ])
+    );
+  }
 }
 
 const Loader = {
@@ -105,7 +72,7 @@ const Loader = {
   */
   cryptoSafetyPrompt() {
     const tsb = new TorPropertyStringBundle(
-      "chrome://torbutton/locale/torbutton.properties",
+      "chrome://torbutton/locale/cryptoSafetyPrompt.properties",
       "cryptoSafetyPrompt."
     );
     const getString = tsb.getString.bind(tsb);
@@ -138,499 +105,209 @@ const Loader = {
     Tor about:preferences#connection Strings
   */
   settings() {
-    const tsb = new TorDTDStringBundle(
-      ["chrome://torbutton/locale/network-settings.dtd"],
-      ""
-    );
-    const getString = tsb.getString.bind(tsb);
-
-    const retval = {
-      categoryTitle: getString("torPreferences.categoryTitle", "Connection"),
+    const strings = {
+      categoryTitle: "Connection",
       // Message box
-      torPreferencesDescription: getString(
-        "torPreferences.torSettingsDescription",
-        "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world."
-      ),
+      torPreferencesDescription:
+        "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.",
       // Status
-      statusInternetLabel: getString(
-        "torPreferences.statusInternetLabel",
-        "Internet:"
-      ),
-      statusInternetTest: getString(
-        "torPreferences.statusInternetTest",
-        "Test"
-      ),
-      statusInternetOnline: getString(
-        "torPreferences.statusInternetOnline",
-        "Online"
-      ),
-      statusInternetOffline: getString(
-        "torPreferences.statusInternetOffline",
-        "Offline"
-      ),
-      statusTorLabel: getString(
-        "torPreferences.statusTorLabel",
-        "Tor Network:"
-      ),
-      statusTorConnected: getString(
-        "torPreferences.statusTorConnected",
-        "Connected"
-      ),
-      statusTorNotConnected: getString(
-        "torPreferences.statusTorNotConnected",
-        "Not Connected"
-      ),
-      statusTorBlocked: getString(
-        "torPreferences.statusTorBlocked",
-        "Potentially Blocked"
-      ),
-      learnMore: getString("torPreferences.learnMore", "Learn more"),
+      statusInternetLabel: "Internet:",
+      statusInternetTest: "Test",
+      statusInternetOnline: "Online",
+      statusInternetOffline: "Offline",
+      statusTorLabel: "Tor Network:",
+      statusTorConnected: "Connected",
+      statusTorNotConnected: "Not Connected",
+      statusTorBlocked: "Potentially Blocked",
+      learnMore: "Learn more",
       // Quickstart
-      quickstartHeading: getString("torPreferences.quickstart", "Quickstart"),
-      quickstartDescription: getString(
-        "torPreferences.quickstartDescriptionLong",
-        "Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings."
-      ),
-      quickstartCheckbox: getString(
-        "torPreferences.quickstartCheckbox",
-        "Always connect automatically"
-      ),
+      quickstartHeading: "Quickstart",
+      quickstartDescription:
+        "Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings.",
+      quickstartCheckbox: "Always connect automatically",
       // Bridge settings
-      bridgesHeading: getString("torPreferences.bridges", "Bridges"),
-      bridgesDescription: getString(
-        "torPreferences.bridgesDescription",
-        "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another."
-      ),
-      bridgeLocation: getString(
-        "torPreferences.bridgeLocation",
-        "Your location"
-      ),
-      bridgeLocationAutomatic: getString(
-        "torPreferences.bridgeLocationAutomatic",
-        "Automatic"
-      ),
-      bridgeLocationFrequent: getString(
-        "torPreferences.bridgeLocationFrequent",
-        "Frequently selected locations"
-      ),
-      bridgeLocationOther: getString(
-        "torPreferences.bridgeLocationOther",
-        "Other locations"
-      ),
-      bridgeChooseForMe: getString(
-        "torPreferences.bridgeChooseForMe",
-        "Choose a Bridge For Me\u2026"
-      ),
-      bridgeCurrent: getString(
-        "torPreferences.bridgeBadgeCurrent",
-        "Your Current Bridges"
-      ),
-      bridgeCurrentDescription: getString(
-        "torPreferences.bridgeBadgeCurrentDescription",
-        "You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed."
-      ),
-      bridgeId: getString("torPreferences.bridgeId", "#1 bridge: #2"),
-      remove: getString("torPreferences.remove", "Remove"),
-      bridgeDisableBuiltIn: getString(
-        "torPreferences.bridgeDisableBuiltIn",
-        "Disable built-in bridges"
-      ),
-      bridgeShare: getString(
-        "torPreferences.bridgeShare",
-        "Share this bridge using the QR code or by copying its address:"
-      ),
-      bridgeCopy: getString("torPreferences.bridgeCopy", "Copy Bridge Address"),
-      copied: getString("torPreferences.copied", "Copied!"),
-      bridgeShowAll: getString(
-        "torPreferences.bridgeShowAll",
-        "Show All Bridges"
-      ),
-      bridgeRemoveAll: getString(
-        "torPreferences.bridgeRemoveAll",
-        "Remove All Bridges"
-      ),
-      bridgeAdd: getString("torPreferences.bridgeAdd", "Add a New Bridge"),
-      bridgeSelectBrowserBuiltin: getString(
-        "torPreferences.bridgeSelectBrowserBuiltin",
-        "Choose from one of Tor Browser’s built-in bridges"
-      ),
-      bridgeSelectBuiltin: getString(
-        "torPreferences.bridgeSelectBuiltin",
-        "Select a Built-In Bridge\u2026"
-      ),
-      bridgeRequestFromTorProject: getString(
-        "torsettings.useBridges.bridgeDB",
-        "Request a bridge from torproject.org"
-      ),
-      bridgeRequest: getString(
-        "torPreferences.bridgeRequest",
-        "Request a Bridge\u2026"
-      ),
-      bridgeEnterKnown: getString(
-        "torPreferences.bridgeEnterKnown",
-        "Enter a bridge address you already know"
-      ),
-      bridgeAddManually: getString(
-        "torPreferences.bridgeAddManually",
-        "Add a Bridge Manually\u2026"
-      ),
+      bridgesHeading: "Bridges",
+      bridgesDescription:
+        "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.",
+      bridgeLocation: "Your location",
+      bridgeLocationAutomatic: "Automatic",
+      bridgeLocationFrequent: "Frequently selected locations",
+      bridgeLocationOther: "Other locations",
+      bridgeChooseForMe: "Choose a Bridge For Me…",
+      bridgeCurrent: "Your Current Bridges",
+      bridgeCurrentDescription:
+        "You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.",
+      bridgeId: "#1 bridge: #2",
+      remove: "Remove",
+      bridgeDisableBuiltIn: "Disable built-in bridges",
+      bridgeShare:
+        "Share this bridge using the QR code or by copying its address:",
+      bridgeCopy: "Copy Bridge Address",
+      copied: "Copied!",
+      bridgeShowAll: "Show All Bridges",
+      bridgeRemoveAll: "Remove All Bridges",
+      bridgeAdd: "Add a New Bridge",
+      bridgeSelectBrowserBuiltin:
+        "Choose from one of Tor Browser’s built-in bridges",
+      bridgeSelectBuiltin: "Select a Built-In Bridge…",
+      bridgeRequestFromTorProject: "Request a bridge from torproject.org",
+      bridgeRequest: "Request a Bridge…",
+      bridgeEnterKnown: "Enter a bridge address you already know",
+      bridgeAddManually: "Add a Bridge Manually…",
       // Advanced settings
-      advancedHeading: getString("torPreferences.advanced", "Advanced"),
-      advancedLabel: getString(
-        "torPreferences.advancedDescription",
-        "Configure how Tor Browser connects to the internet"
-      ),
-      advancedButton: getString(
-        "torPreferences.advancedButton",
-        "Settings\u2026"
-      ),
-      showTorDaemonLogs: getString(
-        "torPreferences.viewTorLogs",
-        "View the Tor logs"
-      ),
-      showLogs: getString("torPreferences.viewLogs", "View Logs\u2026"),
+      advancedHeading: "Advanced",
+      advancedLabel: "Configure how Tor Browser connects to the internet",
+      advancedButton: "Settings…",
+      showTorDaemonLogs: "View the Tor logs",
+      showLogs: "View Logs…",
       // Remove all bridges dialog
-      removeBridgesQuestion: getString(
-        "torPreferences.removeBridgesQuestion",
-        "Remove all the bridges?"
-      ),
-      removeBridgesWarning: getString(
-        "torPreferences.removeBridgesWarning",
-        "This action cannot be undone."
-      ),
-      cancel: getString("torPreferences.cancel", "Cancel"),
+      removeBridgesQuestion: "Remove all the bridges?",
+      removeBridgesWarning: "This action cannot be undone.",
+      cancel: "Cancel",
       // Scan bridge QR dialog
-      scanQrTitle: getString("torPreferences.scanQrTitle", "Scan the QR code"),
+      scanQrTitle: "Scan the QR code",
       // Builtin bridges dialog
-      builtinBridgeTitle: getString(
-        "torPreferences.builtinBridgeTitle",
-        "Built-In Bridges"
-      ),
-      builtinBridgeHeader: getString(
-        "torsettings.useBridges.default",
-        "Select a Built-In Bridge"
-      ),
-      builtinBridgeDescription: getString(
-        "torPreferences.builtinBridgeDescription",
-        "Tor Browser includes some specific types of bridges known as “pluggable transports”."
-      ),
-      builtinBridgeObfs4: getString(
-        "torPreferences.builtinBridgeObfs4",
-        "obfs4"
-      ),
-      builtinBridgeObfs4Description: getString(
-        "torPreferences.builtinBridgeObfs4Description",
-        "obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges."
-      ),
-      builtinBridgeSnowflake: getString(
-        "torPreferences.builtinBridgeSnowflake",
-        "Snowflake"
-      ),
-      builtinBridgeSnowflakeDescription: getString(
-        "torPreferences.builtinBridgeSnowflakeDescription",
-        "Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers."
-      ),
-      builtinBridgeMeekAzure: getString(
-        "torPreferences.builtinBridgeMeekAzure",
-        "meek-azure"
-      ),
-      builtinBridgeMeekAzureDescription: getString(
-        "torPreferences.builtinBridgeMeekAzureDescription",
-        "meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor."
-      ),
+      builtinBridgeTitle: "Built-In Bridges",
+      builtinBridgeHeader: "Select a Built-In Bridge",
+      builtinBridgeDescription:
+        "Tor Browser includes some specific types of bridges known as “pluggable transports”.",
+      builtinBridgeObfs4: "obfs4",
+      builtinBridgeObfs4Description:
+        "obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges.",
+      builtinBridgeSnowflake: "Snowflake",
+      builtinBridgeSnowflakeDescription:
+        "Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers.",
+      builtinBridgeMeekAzure: "meek-azure",
+      builtinBridgeMeekAzureDescription:
+        "meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor.",
       // Request bridges dialog
-      requestBridgeDialogTitle: getString(
-        "torPreferences.requestBridgeDialogTitle",
-        "Request Bridge"
-      ),
-      submitCaptcha: getString(
-        "torsettings.useBridges.captchaSubmit",
-        "Submit"
-      ),
-      contactingBridgeDB: getString(
-        "torPreferences.requestBridgeDialogWaitPrompt",
-        "Contacting BridgeDB. Please Wait."
-      ),
-      solveTheCaptcha: getString(
-        "torPreferences.requestBridgeDialogSolvePrompt",
-        "Solve the CAPTCHA to request a bridge."
-      ),
-      captchaTextboxPlaceholder: getString(
-        "torsettings.useBridges.captchaSolution.placeholder",
-        "Enter the characters from the image"
-      ),
-      incorrectCaptcha: getString(
-        "torPreferences.requestBridgeErrorBadSolution",
-        "The solution is not correct. Please try again."
-      ),
+      requestBridgeDialogTitle: "Request Bridge",
+      submitCaptcha: "Submit",
+      contactingBridgeDB: "Contacting BridgeDB. Please Wait.",
+      solveTheCaptcha: "Solve the CAPTCHA to request a bridge.",
+      captchaTextboxPlaceholder: "Enter the characters from the image",
+      incorrectCaptcha: "The solution is not correct. Please try again.",
       // Provide bridge dialog
-      provideBridgeTitle: getString(
-        "torPreferences.provideBridgeTitle",
-        "Provide Bridge"
-      ),
-      provideBridgeHeader: getString(
-        "torPreferences.provideBridgeHeader",
-        "Enter bridge information from a trusted source"
-      ),
-      provideBridgePlaceholder: getString(
-        "torsettings.useBridges.placeholder",
-        "type address:port (one per line)"
-      ),
+      provideBridgeTitle: "Provide Bridge",
+      provideBridgeHeader: "Enter bridge information from a trusted source",
+      provideBridgePlaceholder: "type address:port (one per line)",
       // Connection settings dialog
-      connectionSettingsDialogTitle: getString(
-        "torPreferences.connectionSettingsDialogTitle",
-        "Connection Settings"
-      ),
-      connectionSettingsDialogHeader: getString(
-        "torPreferences.connectionSettingsDialogHeader",
-        "Configure how Tor Browser connects to the Internet"
-      ),
-      useLocalProxy: getString(
-        "torsettings.useProxy.checkbox",
-        "I use a proxy to connect to the Internet"
-      ),
-      proxyType: getString("torsettings.useProxy.type", "Proxy Type"),
-      proxyTypeSOCKS4: getString("torsettings.useProxy.type.socks4", "SOCKS4"),
-      proxyTypeSOCKS5: getString("torsettings.useProxy.type.socks5", "SOCKS5"),
-      proxyTypeHTTP: getString("torsettings.useProxy.type.http", "HTTP/HTTPS"),
-      proxyAddress: getString("torsettings.useProxy.address", "Address"),
-      proxyAddressPlaceholder: getString(
-        "torsettings.useProxy.address.placeholder",
-        "IP address or hostname"
-      ),
-      proxyPort: getString("torsettings.useProxy.port", "Port"),
-      proxyUsername: getString("torsettings.useProxy.username", "Username"),
-      proxyPassword: getString("torsettings.useProxy.password", "Password"),
-      proxyUsernamePasswordPlaceholder: getString(
-        "torsettings.optional",
-        "Optional"
-      ),
-      useFirewall: getString(
-        "torsettings.firewall.checkbox",
-        "This computer goes through a firewall that only allows connections to certain ports"
-      ),
-      allowedPorts: getString(
-        "torsettings.firewall.allowedPorts",
-        "Allowed Ports"
-      ),
-      allowedPortsPlaceholder: getString(
-        "torPreferences.firewallPortsPlaceholder",
-        "Comma-seperated values"
-      ),
+      connectionSettingsDialogTitle: "Connection Settings",
+      connectionSettingsDialogHeader:
+        "Configure how Tor Browser connects to the Internet",
+      useLocalProxy: "I use a proxy to connect to the Internet",
+      proxyType: "Proxy Type",
+      proxyTypeSOCKS4: "SOCKS4",
+      proxyTypeSOCKS5: "SOCKS5",
+      proxyTypeHTTP: "HTTP/HTTPS",
+      proxyAddress: "Address",
+      proxyAddressPlaceholder: "IP address or hostname",
+      proxyPort: "Port",
+      proxyUsername: "Username",
+      proxyPassword: "Password",
+      proxyUsernamePasswordPlaceholder: "Optional",
+      useFirewall:
+        "This computer goes through a firewall that only allows connections to certain ports",
+      allowedPorts: "Allowed Ports",
+      allowedPortsPlaceholder: "Comma-seperated values",
       // Log dialog
-      torLogDialogTitle: getString(
-        "torPreferences.torLogsDialogTitle",
-        "Tor Logs"
-      ),
-      copyLog: getString("torsettings.copyLog", "Copy Tor Log to Clipboard"),
+      torLogDialogTitle: "Tor Logs",
+      copyLog: "Copy Tor Log to Clipboard",
+    };
 
+    const tsb = new TorPropertyStringBundle(
+      "chrome://torbutton/locale/settings.properties",
+      "settings."
+    );
+    return {
+      ...tsb.getStrings(strings),
       learnMoreTorBrowserURL: "about:manual#about",
       learnMoreBridgesURL: "about:manual#bridges",
       learnMoreBridgesCardURL: "about:manual#bridges_bridge-moji",
       learnMoreCircumventionURL: "about:manual#circumvention",
     };
-
-    return retval;
   } /* Tor Network Settings Strings */,
 
   torConnect() {
-    const tsbNetwork = new TorDTDStringBundle(
-      ["chrome://torbutton/locale/network-settings.dtd"],
-      ""
-    );
-    const tsbLauncher = new TorPropertyStringBundle(
-      "chrome://torbutton/locale/torlauncher.properties",
-      "torlauncher."
-    );
-    const tsbCommon = new TorPropertyStringBundle(
-      "chrome://global/locale/commonDialogs.properties",
-      ""
-    );
-
-    const getStringNet = tsbNetwork.getString.bind(tsbNetwork);
-    const getStringLauncher = tsbLauncher.getString.bind(tsbLauncher);
-    const getStringCommon = tsbCommon.getString.bind(tsbCommon);
-
-    return {
-      torConnect: getStringNet(
-        "torsettings.wizard.title.default",
-        "Connect to Tor"
-      ),
-
-      torConnecting: getStringNet(
-        "torsettings.wizard.title.connecting",
-        "Establishing a Connection"
-      ),
-
-      torNotConnectedConcise: getStringNet(
-        "torConnect.notConnectedConcise",
-        "Not Connected"
-      ),
-
-      torConnectingConcise: getStringNet(
-        "torConnect.connectingConcise",
-        "Connecting…"
-      ),
-
-      tryingAgain: getStringNet("torConnect.tryingAgain", "Trying again…"),
-
-      noInternet: getStringNet(
-        "torConnect.noInternet",
-        "Tor Browser couldn’t reach the Internet"
-      ),
+    const strings = {
+      torConnect: "Connect to Tor",
 
-      noInternetDescription: getStringNet(
-        "torConnect.noInternetDescription",
-        "This could be due to a connection issue rather than Tor being blocked. Check your Internet connection, proxy and firewall settings before trying again."
-      ),
+      torConnecting: "Establishing a Connection",
 
-      torBootstrapFailed: getStringLauncher(
-        "tor_bootstrap_failed",
-        "Tor failed to establish a Tor network connection."
-      ),
+      torNotConnectedConcise: "Not Connected",
 
-      couldNotConnect: getStringNet(
-        "torConnect.couldNotConnect",
-        "Tor Browser could not connect to Tor"
-      ),
+      torConnectingConcise: "Connecting…",
 
-      configureConnection: getStringNet(
-        "torConnect.assistDescriptionConfigure",
-        "configure your connection"
-      ),
+      tryingAgain: "Trying again…",
 
-      assistDescription: getStringNet(
-        "torConnect.assistDescription",
-        "If Tor is blocked in your location, trying a bridge may help. Connection assist can choose one for you using your location, or you can #1 manually instead."
-      ),
+      noInternet: "Tor Browser couldn’t reach the Internet",
+      noInternetDescription:
+        "This could be due to a connection issue rather than Tor being blocked. Check your Internet connection, proxy and firewall settings before trying again.",
+      torBootstrapFailed: "Tor failed to establish a Tor network connection.",
+      couldNotConnect: "Tor Browser could not connect to Tor",
+      configureConnection: "configure your connection",
+      assistDescription:
+        "If Tor is blocked in your location, trying a bridge may help. Connection assist can choose one for you using your location, or you can #1 manually instead.",
+      tryingBridge: "Trying a bridge…",
 
-      tryingBridge: getStringNet("torConnect.tryingBridge", "Trying a bridge…"),
+      tryingBridgeAgain: "Trying one more time…",
+      errorLocation: "Tor Browser couldn’t locate you",
+      errorLocationDescription:
+        "Tor Browser needs to know your location in order to choose the right bridge for you. If you’d rather not share your location, #1 manually instead.",
+      isLocationCorrect: "Are these location settings correct?",
+      isLocationCorrectDescription:
+        "Tor Browser still couldn’t connect to Tor. Please check your location settings are correct and try again, or #1 instead.",
+      finalError: "Tor Browser still cannot connect",
 
-      tryingBridgeAgain: getStringNet(
-        "torConnect.tryingBridgeAgain",
-        "Trying one more time…"
-      ),
+      finalErrorDescription:
+        "Despite its best efforts, connection assist was not able to connect to Tor. Try troubleshooting your connection and adding a bridge manually instead.",
+      breadcrumbAssist: "Connection assist",
+      breadcrumbLocation: "Location settings",
+      breadcrumbTryBridge: "Try a bridge",
 
-      errorLocation: getStringNet(
-        "torConnect.errorLocation",
-        "Tor Browser couldn’t locate you"
-      ),
+      restartTorBrowser: "Restart Tor Browser",
 
-      errorLocationDescription: getStringNet(
-        "torConnect.errorLocationDescription",
-        "Tor Browser needs to know your location in order to choose the right bridge for you. If you’d rather not share your location, #1 manually instead."
-      ),
+      torConfigure: "Configure Connection…",
 
-      isLocationCorrect: getStringNet(
-        "torConnect.isLocationCorrect",
-        "Are these location settings correct?"
-      ),
+      viewLog: "View logs…",
 
-      isLocationCorrectDescription: getStringNet(
-        "torConnect.isLocationCorrectDescription",
-        "Tor Browser still couldn’t connect to Tor. Please check your location settings are correct and try again, or #1 instead."
-      ),
+      torConnectButton: "Connect",
 
-      finalError: getStringNet(
-        "torConnect.finalError",
-        "Tor Browser still cannot connect"
-      ),
+      cancel: "Cancel",
 
-      finalErrorDescription: getStringNet(
-        "torConnect.finalErrorDescription",
-        "Despite its best efforts, connection assist was not able to connect to Tor. Try troubleshooting your connection and adding a bridge manually instead."
-      ),
+      torConnected: "Connected to the Tor network",
 
-      breadcrumbAssist: getStringNet(
-        "torConnect.breadcrumbAssist",
-        "Connection assist"
-      ),
-
-      breadcrumbLocation: getStringNet(
-        "torConnect.breadcrumbLocation",
-        "Location settings"
-      ),
-
-      breadcrumbTryBridge: getStringNet(
-        "torConnect.breadcrumbTryBridge",
-        "Try a bridge"
-      ),
-
-      restartTorBrowser: getStringNet(
-        "torConnect.restartTorBrowser",
-        "Restart Tor Browser"
-      ),
-
-      torConfigure: getStringNet(
-        "torConnect.configureConnection",
-        "Configure Connection…"
-      ),
+      torConnectedConcise: "Connected",
 
-      viewLog: getStringNet("torConnect.viewLog", "View logs…"),
-
-      torConnectButton: getStringNet("torSettings.connect", "Connect"),
-
-      cancel: getStringCommon("Cancel", "Cancel"),
-
-      torConnected: getStringLauncher(
-        "torlauncher.bootstrapStatus.done",
-        "Connected to the Tor network"
-      ),
-
-      torConnectedConcise: getStringLauncher(
-        "torConnect.connectedConcise",
-        "Connected"
-      ),
-
-      tryAgain: getStringNet("torConnect.tryAgain", "Try Again"),
+      tryAgain: "Try Again",
 
       // tor connect strings for message box in about:preferences#connection
-      connectMessage: getStringNet(
-        "torConnect.connectMessage",
-        "Changes to Tor Settings will not take effect until you connect"
-      ),
-      tryAgainMessage: getStringNet(
-        "torConnect.tryAgainMessage",
-        "Tor Browser has failed to establish a connection to the Tor Network"
-      ),
+      connectMessage:
+        "Changes to Tor Settings will not take effect until you connect",
+      tryAgainMessage:
+        "Tor Browser has failed to establish a connection to the Tor Network",
+      yourLocation: "Your Location",
 
-      yourLocation: getStringNet("torConnect.yourLocation", "Your Location"),
+      tryBridge: "Try a Bridge",
 
-      tryBridge: getStringNet("torConnect.tryBridge", "Try a Bridge"),
-
-      automatic: getStringNet("torConnect.automatic", "Automatic"),
-      selectCountryRegion: getStringNet(
-        "torConnect.selectCountryRegion",
-        "Select Country or Region"
-      ),
-      frequentLocations: getStringNet(
-        "torConnect.frequentLocations",
-        "Frequently selected locations"
-      ),
-      otherLocations: getStringNet(
-        "torConnect.otherLocations",
-        "Other locations"
-      ),
+      automatic: "Automatic",
+      selectCountryRegion: "Select Country or Region",
+      frequentLocations: "Frequently selected locations",
+      otherLocations: "Other locations",
 
       // TorConnect.jsm error messages
-      offline: getStringNet("torConnect.offline", "Internet not reachable"),
-      autoBootstrappingFailed: getStringNet(
-        "torConnect.autoBootstrappingFailed",
-        "Automatic configuration failed"
-      ),
-      autoBootstrappingAllFailed: getStringNet(
-        "torConnect.autoBootstrappingFailed",
-        "None of the configurations we tried worked"
-      ),
-      cannotDetermineCountry: getStringNet(
-        "torConnect.cannotDetermineCountry",
-        "Unable to determine user country"
-      ),
-      noSettingsForCountry: getStringNet(
-        "torConnect.noSettingsForCountry",
-        "No settings available for your location"
-      ),
+      offline: "Internet not reachable",
+      autoBootstrappingFailed: "Automatic configuration failed",
+      autoBootstrappingAllFailed: "None of the configurations we tried worked",
+      cannotDetermineCountry: "Unable to determine user country",
+      noSettingsForCountry: "No settings available for your location",
     };
+
+    const tsb = new TorPropertyStringBundle(
+      "chrome://torbutton/locale/torConnect.properties",
+      "torConnect."
+    );
+    return tsb.getStrings(strings);
   },
 
   /*
@@ -819,116 +496,81 @@ const Loader = {
     OnionLocation
   */
   onionLocation() {
+    const strings = {
+      alwaysPrioritize: "Always Prioritize Onionsites",
+      alwaysPrioritizeAccessKey: "a",
+      notNow: "Not Now",
+      notNowAccessKey: "n",
+      description:
+        "Website publishers can protect users by adding a security layer. This prevents eavesdroppers from knowing that you are the one visiting that website.",
+      tryThis: "Try this: Onionsite",
+      onionAvailable: "Onionsite available",
+      learnMore: "Learn more",
+      always: "Always",
+      askEverytime: "Ask you every time",
+      prioritizeOnionsDescription:
+        "Prioritize onionsites when they are available.",
+      onionServicesTitle: "Onion Services",
+    };
+
     const tsb = new TorPropertyStringBundle(
-      ["chrome://torbutton/locale/torbutton.properties"],
+      ["chrome://torbutton/locale/onionLocation.properties"],
       "onionLocation."
     );
-    const getString = tsb.getString.bind(tsb);
-
-    const retval = {
-      alwaysPrioritize: getString(
-        "alwaysPrioritize",
-        "Always Prioritize Onionsites"
-      ),
-      alwaysPrioritizeAccessKey: getString("alwaysPrioritizeAccessKey", "a"),
-      notNow: getString("notNow", "Not Now"),
-      notNowAccessKey: getString("notNowAccessKey", "n"),
-      description: getString(
-        "description",
-        "Website publishers can protect users by adding a security layer. This prevents eavesdroppers from knowing that you are the one visiting that website."
-      ),
-      tryThis: getString("tryThis", "Try this: Onionsite"),
-      onionAvailable: getString("onionAvailable", "Onionsite available"),
-      learnMore: getString("learnMore", "Learn more"),
+    return {
+      ...tsb.getStrings(strings),
       learnMoreURL: "about:manual#onion-services",
       // XUL popups cannot open about: URLs, but we are online when showing the notification, so just use the online version
       learnMoreURLNotification: `https://tb-manual.torproject.org/${getLocale()}/onion-services/`,
-      always: getString("always", "Always"),
-      askEverytime: getString("askEverytime", "Ask you every time"),
-      prioritizeOnionsDescription: getString(
-        "prioritizeOnionsDescription",
-        "Prioritize onionsites when they are available."
-      ),
-      onionServicesTitle: getString("onionServicesTitle", "Onion Services"),
     };
-
-    return retval;
   } /* OnionLocation */,
 
   /*
     Rulesets
   */
   rulesets() {
-    const tsb = new TorPropertyStringBundle(
-      ["chrome://torbutton/locale/torbutton.properties"],
-      "rulesets."
-    );
-    const getString = tsb.getString.bind(tsb);
-
-    const retval = {
+    const strings = {
       // Initial warning
-      warningTitle: getString("warningTitle", "Proceed with Caution"),
-      warningDescription: getString(
-        "warningDescription",
-        "Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing."
-      ),
-      warningEnable: getString(
-        "warningEnable",
-        "Warn me when I attempt to access these preferences"
-      ),
-      warningButton: getString("warningButton", "Accept the Risk and Continue"),
+      warningTitle: "Proceed with Caution",
+      warningDescription:
+        "Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing.",
+      warningEnable: "Warn me when I attempt to access these preferences",
+      warningButton: "Accept the Risk and Continue",
       // Ruleset list
-      rulesets: getString("rulesets", "Rulesets"),
-      noRulesets: getString("noRulesets", "No rulesets found"),
-      noRulesetsDescr: getString(
-        "noRulesetsDescr",
-        "When you save a ruleset in Tor Browser, it will show up here."
-      ),
-      lastUpdated: getString("lastUpdated", "Last updated %S"),
-      neverUpdated: getString(
-        "neverUpdated",
-        "Never updated, or last update failed"
-      ),
-      enabled: getString("enabled", "Enabled"),
-      disabled: getString("disabled", "Disabled"),
+      rulesets: "Rulesets",
+      noRulesets: "No rulesets found",
+      noRulesetsDescr:
+        "When you save a ruleset in Tor Browser, it will show up here.",
+      lastUpdated: "Last updated %S",
+      neverUpdated: "Never updated, or last update failed",
+      enabled: "Enabled",
+      disabled: "Disabled",
       // Ruleset details
-      edit: getString("edit", "Edit"),
-      name: getString("name", "Name"),
-      jwk: getString("jwk", "JWK"),
-      pathPrefix: getString("pathPrefix", "Path Prefix"),
-      scope: getString("scope", "Scope"),
-      enable: getString("enable", "Enable this ruleset"),
-      checkUpdates: getString("checkUpdates", "Check for Updates"),
+      edit: "Edit",
+      name: "Name",
+      jwk: "JWK",
+      pathPrefix: "Path Prefix",
+      scope: "Scope",
+      enable: "Enable this ruleset",
+      checkUpdates: "Check for Updates",
       // Add ruleset
-      jwkPlaceholder: getString(
-        "jwkPlaceholder",
-        "The key used to sign this ruleset in the JWK (JSON Web Key) format"
-      ),
-      jwkInvalid: getString(
-        "jwkInvalid",
-        "The JWK could not be parsed, or it is not a valid key"
-      ),
-      pathPrefixPlaceholder: getString(
-        "pathPrefixPlaceholder",
-        "URL prefix that contains the files needed by the ruleset"
-      ),
-      pathPrefixInvalid: getString(
-        "pathPrefixInvalid",
-        "The path prefix is not a valid HTTP(S) URL"
-      ),
-      scopePlaceholder: getString(
-        "scopePlaceholder",
-        "Regular expression for the scope of the rules"
-      ),
-      scopeInvalid: getString(
-        "scopeInvalid",
-        "The scope could not be parsed as a regular expression"
-      ),
-      save: getString("save", "Save"),
-      cancel: getString("cancel", "Cancel"),
+      jwkPlaceholder:
+        "The key used to sign this ruleset in the JWK (JSON Web Key) format",
+      jwkInvalid: "The JWK could not be parsed, or it is not a valid key",
+      pathPrefixPlaceholder:
+        "URL prefix that contains the files needed by the ruleset",
+      pathPrefixInvalid: "The path prefix is not a valid HTTP(S) URL",
+      scopePlaceholder: "Regular expression for the scope of the rules",
+      scopeInvalid: "The scope could not be parsed as a regular expression",
+      save: "Save",
+      cancel: "Cancel",
     };
 
-    return retval;
+    const tsb = new TorPropertyStringBundle(
+      ["chrome://torbutton/locale/rulesets.properties"],
+      "rulesets."
+    );
+    return tsb.getStrings(strings);
   } /* Rulesets */,
 };
 


=====================================
toolkit/torbutton/chrome/locale/en-US/aboutDialog.dtd
=====================================
@@ -1,3 +1,8 @@
+<!-- Copyright (c) 2022, The Tor Project, Inc.
+   - This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
 <!ENTITY project.start           "&brandShortName; is developed by ">
 <!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
 <!ENTITY project.tpoLink         "the &vendorShortName;">


=====================================
toolkit/torbutton/chrome/locale/en-US/aboutTBUpdate.dtd
=====================================
@@ -1,3 +1,8 @@
+<!-- Copyright (c) 2022, The Tor Project, Inc.
+   - This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
 <!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
 <!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
 <!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">


=====================================
toolkit/torbutton/chrome/locale/en-US/aboutTor.dtd
=====================================
@@ -1,8 +1,7 @@
-<!--
-   - Copyright (c) 2019, The Tor Project, Inc.
-   - See LICENSE for licensing information.
-   - vim: set sw=2 sts=2 ts=8 et syntax=xml:
-  -->
+<!-- Copyright (c) 2022, The Tor Project, Inc.
+   - This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!ENTITY aboutTor.title "About Tor">
 


=====================================
toolkit/torbutton/chrome/locale/en-US/brand.dtd
=====================================
@@ -1,19 +1,9 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
+<!-- Copyright (c) 2022, The Tor Project, Inc.
+   - This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
-<!ENTITY  brandShorterName      "Tor Browser">
 <!ENTITY  brandShortName        "Tor Browser">
-<!ENTITY  brandFullName         "Tor Browser">
-<!ENTITY  vendorShortName       "Tor Project">
-<!ENTITY  trademarkInfo.part1   "'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.">
-<!-- LOCALIZATION NOTE (brandProductName):
-   This brand name can be used in messages where the product name needs to
-   remain unchanged across different versions (Nightly, Beta, etc.). -->
-<!ENTITY  brandProductName      "Tor Browser">
 
-<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
-<!ENTITY plugins.installed.find "Click to load installed system plugins">
-<!ENTITY plugins.installed.enable "Enable plugins">
-<!ENTITY plugins.installed.disable "Disable plugins">
-<!ENTITY plugins.installed.disable.tip "Click to prevent loading system plugins">
+<!-- Still used in aboutDialog -->
+<!ENTITY  vendorShortName       "Tor Project">


=====================================
toolkit/torbutton/chrome/locale/en-US/brand.properties
=====================================
@@ -1,3 +1,4 @@
+# Copyright (c) 2022, The Tor Project, Inc.
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -5,16 +6,3 @@
 brandShorterName=Tor Browser
 brandShortName=Tor Browser
 brandFullName=Tor Browser
-# LOCALIZATION NOTE(brandProductName):
-# This brand name can be used in messages where the product name needs to
-# remain unchanged across different versions (Nightly, Beta, etc.).
-brandProductName=Tor Browser
-vendorShortName=Tor Project
-
-homePageSingleStartMain=Firefox Start, a fast home page with built-in search
-homePageImport=Import your home page from %S
-
-homePageMigrationPageTitle=Home Page Selection
-homePageMigrationDescription=Please select the home page you wish to use:
-
-syncBrandShortName=Sync


=====================================
toolkit/torbutton/chrome/locale/en-US/browserOnboarding.properties
=====================================
@@ -1,6 +1,7 @@
 # Copyright (c) 2019, The Tor Project, Inc.
-# See LICENSE for licensing information.
-# vim: set sw=2 sts=2 ts=8 et:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 onboarding.tour-tor-welcome=Welcome
 onboarding.tour-tor-welcome.title=You’re ready.


=====================================
toolkit/torbutton/chrome/locale/en-US/cryptoSafetyPrompt.properties
=====================================
@@ -0,0 +1,14 @@
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address..
+cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
+cryptoSafetyPrompt.whatCanHeading=What can you do about it?
+cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+cryptoSafetyPrompt.learnMore=Learn more
+cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryActionAccessKey=R
+cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryActionAccessKey=B


=====================================
toolkit/torbutton/chrome/locale/en-US/network-settings.dtd deleted
=====================================
@@ -1,179 +0,0 @@
-<!ENTITY torsettings.dialog.title "Tor Network Settings">
-<!ENTITY torsettings.wizard.title.default "Connect to Tor">
-<!ENTITY torsettings.wizard.title.configure "Tor Network Settings">
-<!ENTITY torsettings.wizard.title.connecting "Establishing a Connection">
-
-<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
-<!ENTITY torlauncher.localePicker.prompt "Please select a language.">
-
-<!-- For "first run" wizard: -->
-
-<!ENTITY torSettings.connectPrompt "Click “Connect” to connect to Tor.">
-<!ENTITY torSettings.configurePrompt "Click “Configure” to adjust network settings if you are in a country that censors Tor (such as Egypt, China, Turkey) or if you are connecting from a private network that requires a proxy.">
-<!ENTITY torSettings.configure "Configure">
-<!ENTITY torSettings.connect "Connect">
-
-<!-- Other: -->
-
-<!ENTITY torsettings.startingTor "Waiting for Tor to start…">
-<!ENTITY torsettings.restartTor "Restart Tor">
-<!ENTITY torsettings.reconfigTor "Reconfigure">
-
-<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
-
-<!ENTITY torsettings.optional "Optional">
-
-<!ENTITY torsettings.useProxy.checkbox "I use a proxy to connect to the Internet">
-<!ENTITY torsettings.useProxy.type "Proxy Type">
-<!ENTITY torsettings.useProxy.type.placeholder "select a proxy type">
-<!ENTITY torsettings.useProxy.address "Address">
-<!ENTITY torsettings.useProxy.address.placeholder "IP address or hostname">
-<!ENTITY torsettings.useProxy.port "Port">
-<!ENTITY torsettings.useProxy.username "Username">
-<!ENTITY torsettings.useProxy.password "Password">
-<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
-<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
-<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "This computer goes through a firewall that only allows connections to certain ports">
-<!ENTITY torsettings.firewall.allowedPorts "Allowed Ports">
-<!ENTITY torsettings.useBridges.checkbox "Tor is censored in my country">
-<!ENTITY torsettings.useBridges.default "Select a Built-In Bridge">
-<!ENTITY torsettings.useBridges.default.placeholder "select a bridge">
-<!ENTITY torsettings.useBridges.bridgeDB "Request a bridge from torproject.org">
-<!ENTITY torsettings.useBridges.captchaSolution.placeholder "Enter the characters from the image">
-<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "Get a new challenge">
-<!ENTITY torsettings.useBridges.captchaSubmit "Submit">
-<!ENTITY torsettings.useBridges.custom "Provide a bridge I know">
-<!ENTITY torsettings.useBridges.label "Enter bridge information from a trusted source.">
-<!ENTITY torsettings.useBridges.placeholder "type address:port (one per line)">
-
-<!ENTITY torsettings.copyLog "Copy Tor Log To Clipboard">
-
-<!ENTITY torsettings.proxyHelpTitle "Proxy Help">
-<!ENTITY torsettings.proxyHelp1 "A local proxy might be needed when connecting through a company, school, or university network. If you are not sure whether a proxy is needed, look at the Internet settings in another browser or check your system's network settings.">
-
-<!ENTITY torsettings.bridgeHelpTitle "Bridge Relay Help">
-<!ENTITY torsettings.bridgeHelp1 "Bridges are unlisted relays that make it more difficult to block connections to the Tor Network.  Each type of bridge uses a different method to avoid censorship.  The obfs ones make your traffic look like random noise, and the meek ones make your traffic look like it's connecting to that service instead of Tor.">
-<!ENTITY torsettings.bridgeHelp2 "Because of how certain countries try to block Tor, certain bridges work in certain countries but not others.  If you are unsure about which bridges work in your country, visit torproject.org/about/contact.html#support">
-
-<!-- Progress -->
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
-
-<!-- #31286 about:preferences strings -->
-<!ENTITY torPreferences.categoryTitle "Connection">
-<!ENTITY torPreferences.torSettings "Tor Settings">
-<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
-<!ENTITY torPreferences.learnMore "Learn more">
-<!-- Status -->
-<!ENTITY torPreferences.statusInternetLabel "Internet:">
-<!ENTITY torPreferences.statusInternetTest "Test">
-<!ENTITY torPreferences.statusInternetOnline "Online">
-<!ENTITY torPreferences.statusInternetOffline "Offline">
-<!ENTITY torPreferences.statusTorLabel "Tor Network:">
-<!ENTITY torPreferences.statusTorConnected "Connected">
-<!ENTITY torPreferences.statusTorNotConnected "Not Connected">
-<!ENTITY torPreferences.statusTorBlocked "Potentially Blocked">
-<!ENTITY torPreferences.learnMore "Learn more">
-<!-- Quickstart -->
-<!ENTITY torPreferences.quickstart "Quickstart">
-<!ENTITY torPreferences.quickstartDescriptionLong "Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings.">
-<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
-<!-- Bridge settings -->
-<!ENTITY torPreferences.bridges "Bridges">
-<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
-<!ENTITY torPreferences.bridgeLocation "Your location">
-<!ENTITY torPreferences.bridgeLocationAutomatic "Automatic">
-<!ENTITY torPreferences.bridgeLocationFrequent "Frequently selected locations">
-<!ENTITY torPreferences.bridgeLocationOther "Other locations">
-<!ENTITY torPreferences.bridgeChooseForMe "Choose a Bridge For Me…">
-<!ENTITY torPreferences.bridgeBadgeCurrent "Your Current Bridges">
-<!ENTITY torPreferences.bridgeBadgeCurrentDescription "You can save one or more bridges, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.">
-<!ENTITY torPreferences.bridgeId "#1 bridge: #2"> <!-- #1 = bridge type; #2 = bridge emoji id -->
-<!ENTITY torPreferences.remove "Remove">
-<!ENTITY torPreferences.bridgeDisableBuiltIn "Disable built-in bridges">
-<!ENTITY torPreferences.bridgeShare "Share this bridge using the QR code or by copying its address:">
-<!ENTITY torPreferences.bridgeCopy "Copy Bridge Address">
-<!ENTITY torPreferences.copied "Copied!">
-<!ENTITY torPreferences.bridgeShowAll "Show All Bridges">
-<!ENTITY torPreferences.bridgeRemoveAll "Remove All Bridges">
-<!ENTITY torPreferences.bridgeAdd "Add a New Bridge">
-<!ENTITY torPreferences.bridgeSelectBrowserBuiltin "Choose from one of Tor Browser’s built-in bridges">
-<!ENTITY torPreferences.bridgeSelectBuiltin "Select a Built-In Bridge…">
-<!ENTITY torPreferences.bridgeRequest "Request a Bridge…">
-<!ENTITY torPreferences.bridgeEnterKnown "Enter a bridge address you already know">
-<!ENTITY torPreferences.bridgeAddManually "Add a Bridge Manually…">
-<!-- Advanced settings -->
-<!ENTITY torPreferences.advanced "Advanced">
-<!ENTITY torPreferences.advancedDescription "Configure how Tor Browser connects to the internet">
-<!ENTITY torPreferences.advancedButton "Settings…">
-<!ENTITY torPreferences.viewTorLogs "View the Tor logs">
-<!ENTITY torPreferences.viewLogs "View Logs…">
-<!-- Remove all bridges dialog -->
-<!ENTITY torPreferences.removeBridgesQuestion "Remove all the bridges?">
-<!ENTITY torPreferences.removeBridgesWarning "This action cannot be undone.">
-<!ENTITY torPreferences.cancel "Cancel">
-<!-- Scan bridge QR dialog -->
-<!ENTITY torPreferences.scanQrTitle "Scan the QR code">
-<!-- Builtin bridges dialog -->
-<!ENTITY torPreferences.builtinBridgeTitle "Built-In Bridges">
-<!ENTITY torPreferences.builtinBridgeDescription "Tor Browser includes some specific types of bridges known as “pluggable transports”.">
-<!ENTITY torPreferences.builtinBridgeObfs4 "obfs4">
-<!ENTITY torPreferences.builtinBridgeObfs4Description "obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges.">
-<!ENTITY torPreferences.builtinBridgeSnowflake "Snowflake">
-<!ENTITY torPreferences.builtinBridgeSnowflakeDescription "Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers.">
-<!ENTITY torPreferences.builtinBridgeMeekAzure "meek-azure">
-<!ENTITY torPreferences.builtinBridgeMeekAzureDescription "meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor.">
-<!-- Request bridges dialog -->
-<!ENTITY torPreferences.requestBridgeDialogTitle "Request Bridge">
-<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Contacting BridgeDB. Please Wait.">
-<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Solve the CAPTCHA to request a bridge.">
-<!ENTITY torPreferences.requestBridgeErrorBadSolution "The solution is not correct. Please try again.">
-<!-- Provide bridge dialog -->
-<!ENTITY torPreferences.provideBridgeTitle "Provide Bridge">
-<!ENTITY torPreferences.provideBridgeHeader "Enter bridge information from a trusted source">
-<!-- Connection settings dialog -->
-<!ENTITY torPreferences.connectionSettingsDialogTitle "Connection Settings">
-<!ENTITY torPreferences.connectionSettingsDialogHeader "Configure how Tor Browser connects to the Internet">
-<!ENTITY torPreferences.firewallPortsPlaceholder "Comma-seperated values">
-<!-- Log dialog -->
-<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
-
-<!-- #24746 about:torconnect strings -->
-<!ENTITY torConnect.notConnectedConcise "Not Connected">
-<!ENTITY torConnect.connectingConcise "Connecting…">
-<!ENTITY torConnect.tryingAgain "Trying again…">
-<!ENTITY torConnect.noInternet "Tor Browser couldn’t reach the Internet">
-<!ENTITY torConnect.noInternetDescription "This could be due to a connection issue rather than Tor being blocked. Check your Internet connection, proxy and firewall settings before trying again.">
-<!ENTITY torConnect.couldNotConnect "Tor Browser could not connect to Tor">
-<!ENTITY torConnect.assistDescriptionConfigure "configure your connection"> <!-- used as a text to insert as a link on several strings (#1) -->
-<!ENTITY torConnect.assistDescription "If Tor is blocked in your location, trying a bridge may help. Connection assist can choose one for you using your location, or you can #1 manually instead."> <!-- #1 = "configure your connection" link -->
-<!ENTITY torConnect.tryingBridge "Trying a bridge…">
-<!ENTITY torConnect.tryingBridgeAgain "Trying one more time…">
-<!ENTITY torConnect.errorLocation "Tor Browser couldn’t locate you">
-<!ENTITY torConnect.errorLocationDescription "Tor Browser needs to know your location in order to choose the right bridge for you. If you’d rather not share your location, #1 manually instead."> <!-- #1 = "configure your connection" link -->
-<!ENTITY torConnect.isLocationCorrect "Are these location settings correct?">
-<!ENTITY torConnect.isLocationCorrectDescription "Tor Browser still couldn’t connect to Tor. Please check your location settings are correct and try again, or #1 instead."> <!-- #1 = "configure your connection" link -->
-<!ENTITY torConnect.finalError "Tor Browser still cannot connect">
-<!ENTITY torConnect.finalErrorDescription "Despite its best efforts, connection assist was not able to connect to Tor. Try troubleshooting your connection and adding a bridge manually instead.">
-<!ENTITY torConnect.breadcrumbAssist "Connection assist">
-<!ENTITY torConnect.breadcrumbLocation "Location settings">
-<!ENTITY torConnect.breadcrumbTryBridge "Try a bridge">
-<!ENTITY torConnect.automatic "Automatic">
-<!ENTITY torConnect.selectCountryRegion "Select Country or Region">
-<!ENTITY torConnect.frequentLocations "Frequently selected locations">
-<!ENTITY torConnect.otherLocations "Other locations">
-<!ENTITY torConnect.restartTorBrowser "Restart Tor Browser">
-<!ENTITY torConnect.configureConnection "Configure Connection…">
-<!ENTITY torConnect.viewLog "View logs…">
-<!ENTITY torConnect.tryAgain "Try Again">
-<!ENTITY torConnect.offline "Internet not reachable">
-<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect">
-<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
-<!ENTITY torConnect.yourLocation "Your Location">
-<!ENTITY torConnect.tryBridge "Try a Bridge">
-<!ENTITY torConnect.autoBootstrappingFailed "Automatic configuration failed">
-<!ENTITY torConnect.autoBootstrappingFailed "None of the configurations we tried worked">
-<!ENTITY torConnect.cannotDetermineCountry "Unable to determine user country">
-<!ENTITY torConnect.noSettingsForCountry "No settings available for your location">


=====================================
toolkit/torbutton/chrome/locale/en-US/onionLocation.properties
=====================================
@@ -0,0 +1,18 @@
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Onion-Location strings.
+onionLocation.alwaysPrioritize=Always Prioritize Onions
+onionLocation.alwaysPrioritizeAccessKey=a
+onionLocation.notNow=Not Now
+onionLocation.notNowAccessKey=n
+onionLocation.description=There's a more private and secure version of this site available over the Tor network via onion services. Onion services help website publishers and their visitors defeat surveillance and censorship.
+onionLocation.tryThis=Try Onion Services
+onionLocation.onionAvailable=.onion available
+onionLocation.learnMore=Learn more…
+onionLocation.always=Always
+onionLocation.askEverytime=Ask every time
+onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
+onionLocation.onionServicesTitle=Onion Services


=====================================
toolkit/torbutton/chrome/locale/en-US/rulesets.properties
=====================================
@@ -0,0 +1,35 @@
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# about:rulesets strings.
+rulesets.warningTitle=Proceed with Caution
+rulesets.warningDescription=Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing.
+rulesets.warningEnable=Warn me when I attempt to access these preferences
+rulesets.warningButton=Accept the Risk and Continue
+# Ruleset list
+rulesets.rulesets=Rulesets
+rulesets.noRulesets=No rulesets found
+rulesets.noRulesetsDescr=When you save a ruleset in Tor Browser, it will show up here.
+# LOCALIZATION NOTE: %S will be replaced by the update date (automatically formatted by Firefox's l10n component)
+rulesets.lastUpdated=Last updated %S
+rulesets.neverUpdated=Never updated, or last update failed
+rulesets.enabled=Enabled
+rulesets.disabled=Disabled
+# Ruleset details/edit ruleset
+rulesets.edit=Edit
+rulesets.name=Name
+rulesets.jwk=JWK
+rulesets.pathPrefix=Path Prefix
+rulesets.scope=Scope
+rulesets.enable=Enable this ruleset
+rulesets.checkUpdates=Check for Updates
+rulesets.jwkPlaceholder=The key used to sign this ruleset in the JWK (JSON Web Key) format
+rulesets.jwkInvalid=The JWK could not be parsed, or it is not a valid key
+rulesets.pathPrefixPlaceholder=URL prefix that contains the files needed by the ruleset
+rulesets.pathPrefixInvalid=The path prefix is not a valid HTTP(S) URL
+rulesets.scopePlaceholder=Regular expression for the scope of the rules
+rulesets.scopeInvalid=The scope could not be parsed as a regular expression
+rulesets.save=Save
+rulesets.cancel=Cancel


=====================================
toolkit/torbutton/chrome/locale/en-US/settings.properties
=====================================
@@ -0,0 +1,114 @@
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+settings.categoryTitle=Connection
+
+# Message box
+settings.torPreferencesDescription=Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.
+
+# Status
+settings.statusInternetLabel=Internet:
+settings.statusInternetTest=Test
+settings.statusInternetOnline=Online
+settings.statusInternetOffline=Offline
+settings.statusTorLabel=Tor Network:
+settings.statusTorConnected=Connected
+settings.statusTorNotConnected=Not Connected
+settings.statusTorBlocked=Potentially Blocked
+settings.learnMore=Learn more
+
+# Quickstart
+settings.quickstartHeading=Quickstart
+settings.quickstartDescription=Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings.
+settings.quickstartCheckbox=Always connect automatically
+
+# Bridge settings
+settings.bridgesHeading=Bridges
+settings.bridgesDescription=Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
+settings.bridgeLocation=Your location
+settings.bridgeLocationAutomatic=Automatic
+settings.bridgeLocationFrequent=Frequently selected locations
+settings.bridgeLocationOther=Other locations
+settings.bridgeChooseForMe=Choose a Bridge For Me…
+settings.bridgeCurrent=Your Current Bridges
+settings.bridgeCurrentDescription=You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.
+
+# Translation note: %1$S = bridge type; %2$S = bridge emoji id
+settings.bridgeId=%1$S bridge: %2$S
+settings.remove=Remove
+settings.bridgeDisableBuiltIn=Disable built-in bridges
+settings.bridgeShare=Share this bridge using the QR code or by copying its address:
+settings.bridgeCopy=Copy Bridge Address
+settings.copied=Copied!
+settings.bridgeShowAll=Show All Bridges
+settings.bridgeRemoveAll=Remove All Bridges
+settings.bridgeAdd=Add a New Bridge
+settings.bridgeSelectBrowserBuiltin=Choose from one of Tor Browser’s built-in bridges
+settings.bridgeSelectBuiltin=Select a Built-In Bridge…
+settings.bridgeRequestFromTorProject=Request a bridge from torproject.org
+settings.bridgeRequest=Request a Bridge…
+settings.bridgeEnterKnown=Enter a bridge address you already know
+settings.bridgeAddManually=Add a Bridge Manually…
+
+# Advanced settings
+settings.advancedHeading=Advanced
+settings.advancedLabel=Configure how Tor Browser connects to the internet
+settings.advancedButton=Settings…
+settings.showTorDaemonLogs=View the Tor logs
+settings.showLogs=View Logs…
+
+# Remove all bridges dialog
+settings.removeBridgesQuestion=Remove all the bridges?
+settings.removeBridgesWarning=This action cannot be undone.
+settings.cancel=Cancel
+
+# Scan bridge QR dialog
+settings.scanQrTitle=Scan the QR code
+
+# Builtin bridges dialog
+settings.builtinBridgeTitle=Built-In Bridges
+settings.builtinBridgeHeader=Select a Built-In Bridge
+settings.builtinBridgeDescription=Tor Browser includes some specific types of bridges known as “pluggable transports”.
+settings.builtinBridgeObfs4=obfs4
+settings.builtinBridgeObfs4Description=obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges.
+settings.builtinBridgeSnowflake=Snowflake
+settings.builtinBridgeSnowflakeDescription=Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers.
+settings.builtinBridgeMeekAzure=meek-azure
+settings.builtinBridgeMeekAzureDescription=meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor.
+
+# Request bridges dialog
+settings.requestBridgeDialogTitle=Request Bridge
+settings.submitCaptcha=Submit
+settings.contactingBridgeDB=Contacting BridgeDB. Please Wait.
+settings.solveTheCaptcha=Solve the CAPTCHA to request a bridge.
+settings.captchaTextboxPlaceholder=Enter the characters from the image
+settings.incorrectCaptcha=The solution is not correct. Please try again.
+
+# Provide bridge dialog
+settings.provideBridgeTitle=Provide Bridge
+settings.provideBridgeHeader=Enter bridge information from a trusted source
+settings.provideBridgePlaceholder=type address:port (one per line)
+
+# Connection settings dialog
+settings.connectionSettingsDialogTitle=Connection Settings
+settings.connectionSettingsDialogHeader=Configure how Tor Browser connects to the Internet
+settings.useLocalProxy=I use a proxy to connect to the Internet
+settings.proxyType=Proxy Type
+settings.proxyTypeSOCKS4=SOCKS4
+settings.proxyTypeSOCKS5=SOCKS5
+settings.proxyTypeHTTP=HTTP/HTTPS
+settings.proxyAddress=Address
+settings.proxyAddressPlaceholder=IP address or hostname
+settings.proxyPort=Port
+settings.proxyUsername=Username
+settings.proxyPassword=Password
+settings.proxyUsernamePasswordPlaceholder=Optional
+settings.useFirewall=This computer goes through a firewall that only allows connections to certain ports
+settings.allowedPorts=Allowed Ports
+settings.allowedPortsPlaceholder=Comma-seperated values
+
+# Log dialog
+settings.torLogDialogTitle=Tor Logs
+settings.copyLog=Copy Tor Log to Clipboard


=====================================
toolkit/torbutton/chrome/locale/en-US/torConnect.properties
=====================================
@@ -0,0 +1,52 @@
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+torConnect.torConnect=Connect to Tor
+torConnect.torConnecting=Establishing a Connection
+torConnect.torNotConnectedConcise=Not Connected
+torConnect.torConnectingConcise=Connecting…
+torConnect.tryingAgain=Trying again…
+torConnect.noInternet=Tor Browser couldn’t reach the Internet
+torConnect.noInternetDescription=This could be due to a connection issue rather than Tor being blocked. Check your Internet connection, proxy and firewall settings before trying again.
+torConnect.torBootstrapFailed=Tor failed to establish a Tor network connection.
+torConnect.couldNotConnect=Tor Browser could not connect to Tor
+# Translation note: used as a text to insert as a link on several strings (%S)
+torConnect.configureConnection=configure your connection
+# Translation note: %S = "configure your connection" link
+torConnect.assistDescription=If Tor is blocked in your location, trying a bridge may help. Connection assist can choose one for you using your location, or you can %S manually instead.
+torConnect.tryingBridge=Trying a bridge…
+torConnect.tryingBridgeAgain=Trying one more time…
+torConnect.errorLocation=Tor Browser couldn’t locate you
+# Translation note: %S = "configure your connection" link
+torConnect.errorLocationDescription=Tor Browser needs to know your location in order to choose the right bridge for you. If you’d rather not share your location, %S manually instead.
+torConnect.isLocationCorrect=Are these location settings correct?
+# Translation note: %S = "configure your connection" link
+torConnect.isLocationCorrectDescription=Tor Browser still couldn’t connect to Tor. Please check your location settings are correct and try again, or %S instead.
+torConnect.finalError=Tor Browser still cannot connect
+torConnect.finalErrorDescription=Despite its best efforts, connection assist was not able to connect to Tor. Try troubleshooting your connection and adding a bridge manually instead.
+torConnect.breadcrumbAssist=Connection assist
+torConnect.breadcrumbLocation=Location settings
+torConnect.breadcrumbTryBridge=Try a bridge
+torConnect.restartTorBrowser=Restart Tor Browser
+torConnect.torConfigure=Configure Connection…
+torConnect.viewLog=View logs…
+torConnect.torConnectButton=Connect
+torConnect.cancel=Cancel
+torConnect.torConnected=Connected to the Tor network!
+torConnect.torConnectedConcise=Connected
+torConnect.tryAgain=Try Again
+torConnect.connectMessage=Changes to Tor Settings will not take effect until you connect
+torConnect.tryAgainMessage=Tor Browser has failed to establish a connection to the Tor Network
+torConnect.yourLocation=Your Location
+torConnect.tryBridge=Try a Bridge
+torConnect.automatic=Automatic
+torConnect.selectCountryRegion=Select Country or Region
+torConnect.frequentLocations=Frequently selected locations
+torConnect.otherLocations=Other locations
+torConnect.offline=Internet not reachable
+torConnect.autoBootstrappingFailed=Automatic configuration failed
+torConnect.autoBootstrappingAllFailed=None of the configurations we tried worked
+torConnect.cannotDetermineCountry=Unable to determine user country
+torConnect.noSettingsForCountry=No settings available for your location


=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.dtd
=====================================
@@ -1,28 +1,20 @@
-<!ENTITY torbutton.context_menu.new_identity "New Identity">
-<!ENTITY torbutton.context_menu.new_identity_sentence_case "New identity">
-<!ENTITY torbutton.context_menu.new_identity_key "I">
+<!-- Copyright (c) 2022, The Tor Project, Inc.
+   - This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
 <!ENTITY torbutton.context_menu.new_circuit "New Tor Circuit for this Site">
 <!ENTITY torbutton.context_menu.new_circuit_sentence_case "New Tor circuit for this site">
 <!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.networksettings "Tor Network Settings…">
-<!ENTITY torbutton.context_menu.networksettings.key "N">
-<!ENTITY torbutton.context_menu.downloadUpdate "Check for Tor Browser Update…">
-<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Cookie Protections…">
-<!ENTITY torbutton.context_menu.cookieProtections.key "C">
-<!ENTITY torbutton.button.tooltip "Click to initialize Torbutton">
+
+<!ENTITY torbutton.circuit_display.title "Tor Circuit">
+<!ENTITY torbutton.circuit_display.new_circuit "New Circuit for this Site">
+
+<!-- Onion services strings. Strings are kept here for ease of translation. -->
+<!ENTITY torbutton.onionServices.authPrompt.tooltip "Open onion service client authentication prompt">
+<!ENTITY torbutton.onionServices.authPrompt.persistCheckboxLabel "Remember this key">
+
 <!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
-<!ENTITY torbutton.cookiedialog.title "Manage Cookie Protections">
-<!ENTITY torbutton.cookiedialog.lockCol "Protected">
-<!ENTITY torbutton.cookiedialog.domainCol "Host">
-<!ENTITY torbutton.cookiedialog.nameCol "Name">
-<!ENTITY torbutton.cookiedialog.pathCol "Path">
-<!ENTITY torbutton.cookiedialog.protectCookie "Protect Cookie">
-<!ENTITY torbutton.cookiedialog.removeCookie "Remove Cookie">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Unprotect Cookie">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Remove All But Protected">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Protect New Cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Do Not Protect New Cookies">
 <!ENTITY torbutton.prefs.sec_caption "Security Level">
 <!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
 <!ENTITY torbutton.prefs.sec_standard_label "Standard">
@@ -48,9 +40,3 @@
 <!ENTITY torbutton.prefs.sec_restore_defaults "Restore Defaults">
 <!ENTITY torbutton.prefs.sec_advanced_security_settings "Advanced Security Settings…">
 <!ENTITY torbutton.prefs.sec_change "Change…">
-<!ENTITY torbutton.circuit_display.title "Tor Circuit">
-<!ENTITY torbutton.circuit_display.new_circuit "New Circuit for this Site">
-
-<!-- Onion services strings.  Strings are kept here for ease of translation. -->
-<!ENTITY torbutton.onionServices.authPrompt.tooltip "Open onion service client authentication prompt">
-<!ENTITY torbutton.onionServices.authPrompt.persistCheckboxLabel "Remember this key">


=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.properties
=====================================
@@ -1,6 +1,9 @@
-torbutton.circuit_display.internet = Internet
-torbutton.circuit_display.ip_unknown = IP unknown
-torbutton.circuit_display.onion_site = Onion site
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Circuit display
 torbutton.circuit_display.this_browser = This browser
 torbutton.circuit_display.relay = Relay
 torbutton.circuit_display.tor_bridge = Bridge
@@ -10,8 +13,8 @@ torbutton.circuit_display.guard_note = Your [Guard] node may not change.
 torbutton.circuit_display.learn_more = Learn more
 torbutton.circuit_display.click_to_copy = Click to Copy
 torbutton.circuit_display.copied = Copied!
-torbutton.content_sizer.margin_tooltip = Tor Browser adds this margin to make the width and height of your window less distinctive, and thus reduces the ability of people to track you online.
-extensions.torbutton at torproject.org.description = Torbutton provides a button to configure Tor settings and quickly and easily clear private browsing data.
+
+# External app blocker
 torbutton.popup.external.title = Download an external file type?
 torbutton.popup.external.app = Tor Browser cannot display this file. You will need to open it with another application.\n\n
 torbutton.popup.external.note = Some types of files can cause applications to connect to the Internet without using Tor.\n\n
@@ -19,47 +22,37 @@ torbutton.popup.external.suggest = To be safe, you should only open downloaded f
 torbutton.popup.launch = Download file
 torbutton.popup.cancel = Cancel
 torbutton.popup.dontask = Automatically download files from now on
-torbutton.popup.no_newnym = Torbutton cannot safely give you a new identity. It does not have access to the Tor Control Port.\n\nAre you running Tor Browser Bundle?
-torbutton.security_settings.menu.title = Security Settings
-torbutton.title.prompt_torbrowser = Important Torbutton Information
-torbutton.popup.prompt_torbrowser = Torbutton works differently now: you can't turn it off any more.\n\nWe made this change because it isn't safe to use Torbutton in a browser that's also used for non-Tor browsing. There were too many bugs there that we couldn't fix any other way.\n\nIf you want to keep using Firefox normally, you should uninstall Torbutton and download Tor Browser Bundle. The privacy properties of Tor Browser are also superior to those of normal Firefox, even when Firefox is used with Torbutton.\n\nTo remove Torbutton, go to Tools->Addons->Extensions and then click the Remove button next to Torbutton.
-torbutton.popup.short_torbrowser = Important Torbutton Information!\n\nTorbutton is now always enabled.\n\nClick on the Torbutton for more information.
-
-torbutton.popup.confirm_plugins = Plugins such as Flash can harm your privacy and anonymity.\n\nThey can also bypass Tor to reveal your current location and IP address.\n\nAre you sure you want to enable plugins?\n\n
-torbutton.popup.never_ask_again = Never ask me again
-torbutton.popup.confirm_newnym = Tor Browser will close all windows and tabs. All website sessions will be lost.\n\nRestart Tor Browser now to reset your identity?\n\n
 
-torbutton.maximize_warning = Maximizing Tor Browser can allow websites to determine your monitor size, which can be used to track you. We recommend that you leave Tor Browser windows in their original default size.
-
-# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=This website (%S) attempted to extract HTML5 canvas image data, which may be used to uniquely identify your computer.\n\nShould Tor Browser allow this website to extract HTML5 canvas image data?
-canvas.notNow=Not Now
-canvas.notNowAccessKey=N
-canvas.allow=Allow in the future
-canvas.allowAccessKey=A
-canvas.never=Never for this site (recommended)
-canvas.neverAccessKey=e
-
-# Profile/startup error messages. Strings are kept here for ease of translation.
-# LOCALIZATION NOTE: %S is the application name.
-profileProblemTitle=%S Profile Problem
-profileReadOnly=You cannot run %S from a read-only file system.  Please copy %S to another location before trying to use it.
-profileReadOnlyMac=You cannot run %S from a read-only file system.  Please copy %S to your Desktop or Applications folder before trying to use it.
-profileAccessDenied=%S does not have permission to access the profile. Please adjust your file system permissions and try again.
-profileMigrationFailed=Migration of your existing %S profile failed.\nNew settings will be used.
-
-# "Downloading update" string for the hamburger menu (see #28885).
-# This string is kept here for ease of translation.
-# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
-
-# .Onion Page Info prompt.  Strings are kept here for ease of translation.
+# .Onion Page Info prompt.
 pageInfo_OnionEncryptionWithBitsAndProtocol=Connection Encrypted (Onion Service, %1$S, %2$S bit keys, %3$S)
 pageInfo_OnionEncryption=Connection Encrypted (Onion Service)
-pageInfo_OnionName=Onion Name:
 
-# Onion services strings.  Strings are kept here for ease of translation..
+# Shared between Onion Auth prompt and preferences
 onionServices.learnMore=Learn more
+
+# Onion Services Authentication prompt
+# LOCALIZATION NOTE: %S will be replaced with the .onion address.
+onionServices.authPrompt.description2=%S is requesting that you authenticate.
+onionServices.authPrompt.keyPlaceholder=Enter your private key for this onion service
+onionServices.authPrompt.done=Done
+onionServices.authPrompt.doneAccessKey=d
+onionServices.authPrompt.invalidKey=Please enter a valid key (52 base32 characters or 44 base64 characters)
+onionServices.authPrompt.failedToSetKey=Unable to configure Tor with your key
+
+# Onion Services Authentication preferences
+onionServices.authPreferences.header=Onion Services Authentication
+onionServices.authPreferences.overview=Some onion services require that you identify yourself with a key (a kind of password) before you can access them.
+onionServices.authPreferences.savedKeys=Saved Keys…
+onionServices.authPreferences.dialogTitle=Onion Service Keys
+onionServices.authPreferences.dialogIntro=Keys for the following onionsites are stored on your computer
+onionServices.authPreferences.onionSite=Onionsite
+onionServices.authPreferences.onionKey=Key
+onionServices.authPreferences.remove=Remove
+onionServices.authPreferences.removeAll=Remove All
+onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
+onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+
+# Onion services error strings.
 onionServices.errorPage.browser=Browser
 onionServices.errorPage.network=Network
 onionServices.errorPage.onionSite=Onionsite
@@ -105,83 +98,23 @@ onionServices.introTimedOut.pageTitle=Problem Loading Onionsite
 onionServices.introTimedOut.header=Onionsite Circuit Creation Timed Out
 onionServices.introTimedOut=Failed to connect to the onionsite, possibly due to a poor network connection.
 onionServices.introTimedOut.longDescription=Details: %S — The connection to the requested onion service timed out while trying to build the rendezvous circuit.
-#
-# LOCALIZATION NOTE: %S will be replaced with the .onion address.
-onionServices.authPrompt.description2=%S is requesting that you authenticate.
-onionServices.authPrompt.keyPlaceholder=Enter your private key for this onion service
-onionServices.authPrompt.done=Done
-onionServices.authPrompt.doneAccessKey=d
-onionServices.authPrompt.invalidKey=Please enter a valid key (52 base32 characters or 44 base64 characters)
-onionServices.authPrompt.failedToSetKey=Unable to configure Tor with your key
-onionServices.authPreferences.header=Onion Services Authentication
-onionServices.authPreferences.overview=Some onion services require that you identify yourself with a key (a kind of password) before you can access them.
-onionServices.authPreferences.savedKeys=Saved Keys…
-onionServices.authPreferences.dialogTitle=Onion Service Keys
-onionServices.authPreferences.dialogIntro=Keys for the following onionsites are stored on your computer
-onionServices.authPreferences.onionSite=Onionsite
-onionServices.authPreferences.onionKey=Key
-onionServices.authPreferences.remove=Remove
-onionServices.authPreferences.removeAll=Remove All
-onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
-onionServices.authPreferences.failedToRemoveKey=Unable to remove key
-onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
-onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
-onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
-onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
-onionServices.v2Deprecated.tryAgain=Got it
-onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
 
-# Onion-Location strings.
-onionLocation.alwaysPrioritize=Always Prioritize Onions
-onionLocation.alwaysPrioritizeAccessKey=a
-onionLocation.notNow=Not Now
-onionLocation.notNowAccessKey=n
-onionLocation.description=There's a more private and secure version of this site available over the Tor network via onion services. Onion services help website publishers and their visitors defeat surveillance and censorship.
-onionLocation.tryThis=Try Onion Services
-onionLocation.onionAvailable=.onion available
-onionLocation.learnMore=Learn more…
-onionLocation.always=Always
-onionLocation.askEverytime=Ask every time
-onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
-onionLocation.onionServicesTitle=Onion Services
+# Profile/startup error messages.
+# LOCALIZATION NOTE: %S is the application name.
+profileProblemTitle=%S Profile Problem
+profileReadOnly=You cannot run %S from a read-only file system.  Please copy %S to another location before trying to use it.
+profileReadOnlyMac=You cannot run %S from a read-only file system.  Please copy %S to your Desktop or Applications folder before trying to use it.
+profileAccessDenied=%S does not have permission to access the profile. Please adjust your file system permissions and try again.
+
+# New identity warning
+torbutton.popup.no_newnym = Torbutton cannot safely give you a new identity. It does not have access to the Tor Control Port.\n\nAre you running Tor Browser Bundle?
+
+
+## Legacy
 
-# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address..
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
-cryptoSafetyPrompt.learnMore=Learn more
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
-cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
-cryptoSafetyPrompt.secondaryActionAccessKey=B
+# Preferences for mobile: these strings are still referenced, but we should
+# check whether this feature is still used
+torbutton.security_settings.menu.title = Security Settings
 
-# about:rulesets strings.
-rulesets.warningTitle=Proceed with Caution
-rulesets.warningDescription=Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing.
-rulesets.warningEnable=Warn me when I attempt to access these preferences
-rulesets.warningButton=Accept the Risk and Continue
-# Ruleset list
-rulesets.rulesets=Rulesets
-rulesets.noRulesets=No rulesets found
-rulesets.noRulesetsDescr=When you save a ruleset in Tor Browser, it will show up here.
-# LOCALIZATION NOTE: %S will be replaced by the update date (automatically formatted by Firefox's l10n component)
-rulesets.lastUpdated=Last updated %S
-rulesets.neverUpdated=Never updated, or last update failed
-rulesets.enabled=Enabled
-rulesets.disabled=Disabled
-# Ruleset details/edit ruleset
-rulesets.edit=Edit
-rulesets.name=Name
-rulesets.jwk=JWK
-rulesets.pathPrefix=Path Prefix
-rulesets.scope=Scope
-rulesets.enable=Enable this ruleset
-rulesets.checkUpdates=Check for Updates
-rulesets.jwkPlaceholder=The key used to sign this ruleset in the JWK (JSON Web Key) format
-rulesets.jwkInvalid=The JWK could not be parsed, or it is not a valid key
-rulesets.pathPrefixPlaceholder=URL prefix that contains the files needed by the ruleset
-rulesets.pathPrefixInvalid=The path prefix is not a valid HTTP(S) URL
-rulesets.scopePlaceholder=Regular expression for the scope of the rules
-rulesets.scopeInvalid=The scope could not be parsed as a regular expression
-rulesets.save=Save
-rulesets.cancel=Cancel
\ No newline at end of file
+# Other legacy stuff we might just remove since we are using letterbox
+torbutton.maximize_warning = Maximizing Tor Browser can allow websites to determine your monitor size, which can be used to track you. We recommend that you leave Tor Browser windows in their original default size.


=====================================
toolkit/torbutton/chrome/locale/en-US/torlauncher.properties
=====================================
@@ -1,14 +1,15 @@
-### Copyright (c) 2020, The Tor Project, Inc.
-### See LICENSE for licensing information.
+# Copyright (c) 2022, The Tor Project, Inc.
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 torlauncher.error_title=Tor Launcher
 
 torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start.
 torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, Tor Browser will not be able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team.
 torlauncher.tor_exited2=Restarting Tor will not close your browser tabs.
+torlauncher.restart_tor=Restart Tor
 torlauncher.tor_controlconn_failed=Could not connect to Tor control port.
-torlauncher.tor_failed_to_start=Tor failed to start.
-torlauncher.tor_control_failed=Failed to take control of Tor.
 torlauncher.tor_bootstrap_failed=Tor failed to establish a Tor network connection.
 torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S).
 
@@ -19,40 +20,6 @@ torlauncher.datadir_missing=The Tor data directory does not exist and could not
 torlauncher.onionauthdir_missing=The Tor onion authentication directory does not exist and could not be created.
 torlauncher.password_hash_missing=Failed to get hashed password.
 
-torlauncher.failed_to_get_settings=Unable to retrieve Tor settings.\n\n%S
-torlauncher.failed_to_save_settings=Unable to save Tor settings.\n\n%S
-torlauncher.ensure_tor_is_running=Please ensure that Tor is running.
-
-torlauncher.error_proxy_addr_missing=You must specify both an IP address or hostname and a port number to configure Tor to use a proxy to access the Internet.
-torlauncher.error_proxy_type_missing=You must select the proxy type.
-torlauncher.error_bridges_missing=You must specify one or more bridges..
-torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
-torlauncher.error_bridgedb_bridges_missing=Please request a bridge.
-torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
-
-torlauncher.bridge_suffix.meek-amazon=(works in China)
-torlauncher.bridge_suffix.meek-azure=(works in China)
-
-torlauncher.request_a_bridge=Request a Bridge…
-torlauncher.request_a_new_bridge=Request a New Bridge…
-torlauncher.contacting_bridgedb=Contacting BridgeDB. Please wait.
-torlauncher.captcha_prompt=Solve the CAPTCHA to request a bridge.
-torlauncher.bad_captcha_solution=The solution is not correct. Please try again.
-torlauncher.unable_to_get_bridge=Unable to obtain a bridge from BridgeDB.\n\n%S
-torlauncher.no_meek=This browser is not configured for meek, which is needed to obtain bridges.
-torlauncher.no_bridges_available=No bridges are available at this time. Sorry.
-
-torlauncher.connect=Connect
-torlauncher.restart_tor=Restart Tor
-torlauncher.quit=Quit
-torlauncher.quit_win=Exit
-torlauncher.done=Done
-
-torlauncher.forAssistance=For assistance, contact %S
-torlauncher.forAssistance2=For assistance, visit %S
-
-torlauncher.copiedNLogMessages=Copy complete. %S Tor log messages are ready to be pasted into a text editor or an email message.
-
 torlauncher.bootstrapStatus.starting=Starting
 torlauncher.bootstrapStatus.conn_pt=Connecting to bridge
 torlauncher.bootstrapStatus.conn_done_pt=Connected to bridge
@@ -93,5 +60,3 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
 torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
 torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
 torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
-
-torlauncher.copiedNLogMessagesShort=Copied %S Logs



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3844f07cf60696940f73e60b768c9e5419a64803...96d9ec7118cf7d23a1f923ec2a9444b4780d2ac3

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3844f07cf60696940f73e60b768c9e5419a64803...96d9ec7118cf7d23a1f923ec2a9444b4780d2ac3
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20221212/0911dc3b/attachment-0001.htm>


More information about the tbb-commits mailing list