[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-115.9.0esr-13.5-1] 4 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...

richard (@richard) git at gitlab.torproject.org
Tue Apr 9 20:49:46 UTC 2024



richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser


Commits:
d4a4b72b by Henry Wilkes at 2024-04-09T19:54:28+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection

Bug 42207: Migrate preferences strings to Fluent.

- - - - -
6b080bf1 by Henry Wilkes at 2024-04-09T19:54:28+00:00
fixup! Tor Browser strings

Bug 42207: Migrate preferences strings to Fluent.

- - - - -
7ff82efa by Henry Wilkes at 2024-04-09T19:54:28+00:00
fixup! Add TorStrings module for localization

Bug 42207: Migrate preferences strings to Fluent.

- - - - -
446e78a5 by Henry Wilkes at 2024-04-09T19:54:28+00:00
fixup! Tor Browser localization migration scripts.

Bug 42207: Migrate preferences to Fluent.

- - - - -


19 changed files:

- browser/components/torpreferences/content/bridgeQrDialog.js
- browser/components/torpreferences/content/bridgeQrDialog.xhtml
- browser/components/torpreferences/content/builtinBridgeDialog.js
- browser/components/torpreferences/content/builtinBridgeDialog.xhtml
- browser/components/torpreferences/content/connectionCategory.inc.xhtml
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/connectionPane.xhtml
- browser/components/torpreferences/content/connectionSettingsDialog.js
- browser/components/torpreferences/content/connectionSettingsDialog.xhtml
- browser/components/torpreferences/content/provideBridgeDialog.js
- browser/components/torpreferences/content/requestBridgeDialog.js
- browser/components/torpreferences/content/requestBridgeDialog.xhtml
- browser/components/torpreferences/content/torLogDialog.js
- browser/components/torpreferences/content/torLogDialog.xhtml
- browser/components/torpreferences/content/torPreferences.css
- browser/locales/en-US/browser/tor-browser.ftl
- toolkit/modules/TorStrings.sys.mjs
- toolkit/torbutton/chrome/locale/en-US/settings.properties
- + tools/torbrowser/l10n/migrations/bug-42207-settings.py


Changes:

=====================================
browser/components/torpreferences/content/bridgeQrDialog.js
=====================================
@@ -4,19 +4,11 @@ const { QRCode } = ChromeUtils.importESModule(
   "resource://gre/modules/QRCode.sys.mjs"
 );
 
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
-
 window.addEventListener(
   "DOMContentLoaded",
   () => {
     const bridgeString = window.arguments[0];
 
-    document.documentElement.setAttribute(
-      "title",
-      TorStrings.settings.scanQrTitle
-    );
     const target = document.getElementById("bridgeQr-target");
     const style = window.getComputedStyle(target);
     // We are assuming that the style width and height have "px" units.


=====================================
browser/components/torpreferences/content/bridgeQrDialog.xhtml
=====================================
@@ -7,8 +7,13 @@
   type="child"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="bridge-qr-dialog-title"
 >
   <dialog id="bridgeQr-dialog" buttons="accept">
+    <linkset>
+      <html:link rel="localization" href="browser/tor-browser.ftl" />
+    </linkset>
+
     <script src="chrome://browser/content/torpreferences/bridgeQrDialog.js" />
 
     <html:div id="bridgeQr">


=====================================
browser/components/torpreferences/content/builtinBridgeDialog.js
=====================================
@@ -1,9 +1,5 @@
 "use strict";
 
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
-
 const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule(
   "resource://gre/modules/TorSettings.sys.mjs"
 );
@@ -16,34 +12,10 @@ const gBuiltinBridgeDialog = {
   init() {
     this._result = window.arguments[0];
 
-    document.documentElement.setAttribute(
-      "title",
-      TorStrings.settings.builtinBridgeHeader
-    );
-
-    document.getElementById(
-      "torPreferences-builtinBridge-description"
-    ).textContent = TorStrings.settings.builtinBridgeDescription2;
-
     this._radioGroup = document.getElementById(
       "torPreferences-builtinBridge-typeSelection"
     );
 
-    const typeStrings = {
-      obfs4: {
-        label: TorStrings.settings.builtinBridgeObfs4Title,
-        descr: TorStrings.settings.builtinBridgeObfs4Description2,
-      },
-      snowflake: {
-        label: TorStrings.settings.builtinBridgeSnowflake,
-        descr: TorStrings.settings.builtinBridgeSnowflakeDescription2,
-      },
-      "meek-azure": {
-        label: TorStrings.settings.builtinBridgeMeekAzure,
-        descr: TorStrings.settings.builtinBridgeMeekAzureDescription2,
-      },
-    };
-
     const currentBuiltinType =
       TorSettings.bridges.enabled &&
       TorSettings.bridges.source == TorBridgeSource.BuiltIn
@@ -56,16 +28,18 @@ const gBuiltinBridgeDialog = {
       const radio = optionEl.querySelector("radio");
       const type = radio.value;
       optionEl.hidden = !TorSettings.builtinBridgeTypes.includes(type);
-      radio.label = typeStrings[type].label;
+
       const descriptionEl = optionEl.querySelector(
         ".builtin-bridges-option-description"
       );
-      descriptionEl.textContent = typeStrings[type].descr;
+      // Set an id to be used for the aria-describedby.
+      descriptionEl.id = `builtin-bridges-description-${type}`;
       const currentBadge = optionEl.querySelector(".bridge-status-badge");
       if (type === currentBuiltinType) {
         const currentLabelEl = optionEl.querySelector(
           ".torPreferences-current-bridge-label"
         );
+        currentLabelEl.id = `builtin-bridges-current-${type}`;
         // Described by both the current badge and the full description.
         // These will be concatenated together in the screen reader output.
         radio.setAttribute(
@@ -77,6 +51,7 @@ const gBuiltinBridgeDialog = {
       } else {
         // No visible badge.
         radio.setAttribute("aria-describedby", descriptionEl.id);
+        currentBadge.classList.remove("bridge-status-current-built-in");
       }
     }
 
@@ -117,10 +92,8 @@ const gBuiltinBridgeDialog = {
     const connect = TorConnect.canBeginBootstrap;
     this._result.connect = connect;
     this._acceptButton.setAttribute(
-      "label",
-      connect
-        ? TorStrings.settings.bridgeButtonConnect
-        : TorStrings.settings.bridgeButtonAccept
+      "data-l10n-id",
+      connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-accept"
     );
   },
 


=====================================
browser/components/torpreferences/content/builtinBridgeDialog.xhtml
=====================================
@@ -7,26 +7,30 @@
   type="child"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="built-in-dialog-title"
 >
   <dialog id="torPreferences-builtinBridge-dialog" buttons="accept,cancel">
     <linkset>
+      <html:link rel="localization" href="branding/brand.ftl" />
       <html:link rel="localization" href="browser/tor-browser.ftl" />
     </linkset>
 
     <script src="chrome://browser/content/torpreferences/builtinBridgeDialog.js" />
 
-    <description id="torPreferences-builtinBridge-description"> </description>
+    <description data-l10n-id="built-in-dialog-introduction"></description>
     <radiogroup id="torPreferences-builtinBridge-typeSelection">
       <vbox class="builtin-bridges-option">
         <hbox>
           <!-- The radio option is described by both the "Current bridge" label
           - and the full description. If the "Connected" label is hidden, then
            - only the latter description should contribute. -->
-          <radio value="obfs4" />
+          <radio
+            value="obfs4"
+            data-l10n-id="built-in-dialog-obfs4-radio-option"
+          />
           <html:span class="bridge-status-badge">
             <html:div class="bridge-status-icon"></html:div>
             <html:span
-              id="obfs-bridges-current"
               class="torPreferences-current-bridge-label"
               data-l10n-id="built-in-dialog-current-bridge-label"
             >
@@ -34,18 +38,20 @@
           </html:span>
         </hbox>
         <html:div
-          id="obfs-bridges-description"
           class="indent builtin-bridges-option-description"
+          data-l10n-id="tor-bridges-built-in-obfs4-description"
         >
         </html:div>
       </vbox>
       <vbox class="builtin-bridges-option">
         <hbox>
-          <radio value="snowflake" />
+          <radio
+            value="snowflake"
+            data-l10n-id="built-in-dialog-snowflake-radio-option"
+          />
           <html:span class="bridge-status-badge">
             <html:div class="bridge-status-icon"></html:div>
             <html:span
-              id="snowflake-bridges-current"
               class="torPreferences-current-bridge-label"
               data-l10n-id="built-in-dialog-current-bridge-label"
             >
@@ -53,18 +59,20 @@
           </html:span>
         </hbox>
         <html:div
-          id="snowflake-bridges-description"
           class="indent builtin-bridges-option-description"
+          data-l10n-id="tor-bridges-built-in-snowflake-description"
         >
         </html:div>
       </vbox>
       <vbox class="builtin-bridges-option">
         <hbox>
-          <radio value="meek-azure" />
+          <radio
+            value="meek-azure"
+            data-l10n-id="built-in-dialog-meek-azure-radio-option"
+          />
           <html:span class="bridge-status-badge">
             <html:div class="bridge-status-icon"></html:div>
             <html:span
-              id="meek-bridges-current"
               class="torPreferences-current-bridge-label"
               data-l10n-id="built-in-dialog-current-bridge-label"
             >
@@ -72,8 +80,8 @@
           </html:span>
         </hbox>
         <html:div
-          id="meek-bridges-description"
           class="indent builtin-bridges-option-description"
+          data-l10n-id="tor-bridges-built-in-meek-azure-description"
         >
         </html:div>
       </vbox>


=====================================
browser/components/torpreferences/content/connectionCategory.inc.xhtml
=====================================
@@ -5,5 +5,5 @@
               align="center"
               hidden="true">
   <image class="category-icon"/>
-  <label id="torPreferences-labelCategory" class="category-name" flex="1" value="Connection"/>
+  <label class="category-name" flex="1" data-l10n-id="tor-connection-settings-heading"></label>
 </richlistitem>


=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -1088,18 +1088,17 @@ const gBuiltinBridgesArea = {
    * @type {Object<string,object>}
    */
   _bridgeTypeStrings: {
-    // TODO: Change to Fluent ids.
     obfs4: {
-      name: TorStrings.settings.builtinBridgeObfs4Title,
-      description: TorStrings.settings.builtinBridgeObfs4Description2,
+      name: "tor-bridges-built-in-obfs4-name",
+      description: "tor-bridges-built-in-obfs4-description",
     },
     snowflake: {
-      name: TorStrings.settings.builtinBridgeSnowflake,
-      description: TorStrings.settings.builtinBridgeSnowflakeDescription2,
+      name: "tor-bridges-built-in-snowflake-name",
+      description: "tor-bridges-built-in-snowflake-description",
     },
     "meek-azure": {
-      name: TorStrings.settings.builtinBridgeMeekAzure,
-      description: TorStrings.settings.builtinBridgeMeekAzureDescription2,
+      name: "tor-bridges-built-in-meek-azure-name",
+      description: "tor-bridges-built-in-meek-azure-description",
     },
   },
 
@@ -1151,15 +1150,11 @@ const gBuiltinBridgesArea = {
 
       const bridgeStrings = this._bridgeTypeStrings[bridgeType];
       if (bridgeStrings) {
-        /*
         document.l10n.setAttributes(this._nameEl, bridgeStrings.name);
         document.l10n.setAttributes(
           this._descriptionEl,
           bridgeStrings.description
         );
-        */
-        this._nameEl.textContent = bridgeStrings.name;
-        this._descriptionEl.textContent = bridgeStrings.description;
       } else {
         // Unknown type, or no type.
         this._nameEl.removeAttribute("data-l10n-id");
@@ -2075,7 +2070,7 @@ const gBridgeSettings = {
     // "Remove all bridges"?
     document
       .getElementById("tor-bridges-options-remove-all-menu-item")
-      .addEventListener("click", () => {
+      .addEventListener("click", async () => {
         // TODO: Should we only have a warning when not built-in?
         const parentWindow =
           Services.wm.getMostRecentWindow("navigator:browser");
@@ -2085,13 +2080,20 @@ const gBridgeSettings = {
           Services.prompt.BUTTON_POS_0_DEFAULT +
           Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL;
 
+        const [titleString, bodyString, removeString] =
+          await document.l10n.formatValues([
+            { id: "remove-all-bridges-warning-title" },
+            { id: "remove-all-bridges-warning-description" },
+            { id: "remove-all-bridges-warning-remove-button" },
+          ]);
+
         // TODO: Update the text, and remove old strings.
         const buttonIndex = Services.prompt.confirmEx(
           parentWindow,
-          TorStrings.settings.bridgeRemoveAllDialogTitle,
-          TorStrings.settings.bridgeRemoveAllDialogDescription,
+          titleString,
+          bodyString,
           flags,
-          TorStrings.settings.remove,
+          removeString,
           null,
           null,
           null,
@@ -2289,36 +2291,13 @@ const gBridgeSettings = {
 const gConnectionPane = (function () {
   /* CSS selectors for all of the Tor Network DOM elements we need to access */
   const selectors = {
-    category: {
-      title: "label#torPreferences-labelCategory",
-    },
-    torPreferences: {
-      header: "h1#torPreferences-header",
-      description: "span#torPreferences-description",
-      learnMore: "label#torPreferences-learnMore",
-    },
-    quickstart: {
-      header: "h2#torPreferences-quickstart-header",
-      description: "span#torPreferences-quickstart-description",
-      enableQuickstartCheckbox: "checkbox#torPreferences-quickstart-toggle",
-    },
     bridges: {
-      header: "h1#torPreferences-bridges-header",
-      description: "span#torPreferences-bridges-description",
-      learnMore: "label#torPreferences-bridges-learnMore",
       locationGroup: "#torPreferences-bridges-locationGroup",
       locationLabel: "#torPreferences-bridges-locationLabel",
       location: "#torPreferences-bridges-location",
       locationEntries: "#torPreferences-bridges-locationEntries",
       chooseForMe: "#torPreferences-bridges-buttonChooseBridgeForMe",
     },
-    advanced: {
-      header: "h1#torPreferences-advanced-header",
-      label: "#torPreferences-advanced-label",
-      button: "#torPreferences-advanced-button",
-      torLogsLabel: "label#torPreferences-torLogs",
-      torLogsButton: "button#torPreferences-buttonTorLogs",
-    },
   }; /* selectors */
 
   const retval = {
@@ -2342,96 +2321,62 @@ const gConnectionPane = (function () {
         }
       });
 
-      document
-        .querySelector(selectors.category.title)
-        .setAttribute("value", TorStrings.settings.categoryTitle);
-
-      const prefpane = document.getElementById("mainPrefPane");
-
-      // Heading
-      prefpane.querySelector(selectors.torPreferences.header).innerText =
-        TorStrings.settings.categoryTitle;
-      prefpane.querySelector(selectors.torPreferences.description).textContent =
-        TorStrings.settings.torPreferencesDescription;
-      {
-        const learnMore = prefpane.querySelector(
-          selectors.torPreferences.learnMore
-        );
-        learnMore.setAttribute("value", TorStrings.settings.learnMore);
-        learnMore.setAttribute(
-          "href",
-          TorStrings.settings.learnMoreTorBrowserURL
-        );
-        if (TorStrings.settings.learnMoreTorBrowserURL.startsWith("about:")) {
-          learnMore.setAttribute("useoriginprincipal", "true");
-        }
-      }
-
       // Internet and Tor status
       const internetStatus = document.getElementById(
         "torPreferences-status-internet"
       );
-      internetStatus.querySelector(".torPreferences-status-name").textContent =
-        TorStrings.settings.statusInternetLabel;
       const internetResult = internetStatus.querySelector(
         ".torPreferences-status-result"
       );
       const internetTest = document.getElementById(
         "torPreferences-status-internet-test"
       );
-      internetTest.setAttribute(
-        "label",
-        TorStrings.settings.statusInternetTest
-      );
-      internetTest.addEventListener("command", () => {
+      internetTest.addEventListener("click", () => {
         this.onInternetTest();
       });
 
       const torConnectStatus = document.getElementById(
         "torPreferences-status-tor-connect"
       );
-      torConnectStatus.querySelector(
-        ".torPreferences-status-name"
-      ).textContent = TorStrings.settings.statusTorLabel;
       const torConnectResult = torConnectStatus.querySelector(
         ".torPreferences-status-result"
       );
       const torConnectButton = document.getElementById(
         "torPreferences-status-tor-connect-button"
       );
-      torConnectButton.setAttribute(
-        "label",
-        TorStrings.torConnect.torConnectButton
-      );
-      torConnectButton.addEventListener("command", () => {
+      torConnectButton.addEventListener("click", () => {
         TorConnect.openTorConnect({ beginBootstrap: true });
       });
 
       this._populateStatus = () => {
+        let internetId;
         switch (this._internetStatus) {
           case InternetStatus.Online:
             internetStatus.classList.remove("offline");
-            internetResult.textContent =
-              TorStrings.settings.statusInternetOnline;
-            internetResult.hidden = false;
+            internetId = "tor-connection-internet-status-online";
             break;
           case InternetStatus.Offline:
             internetStatus.classList.add("offline");
-            internetResult.textContent =
-              TorStrings.settings.statusInternetOffline;
-            internetResult.hidden = false;
+            internetId = "tor-connection-internet-status-offline";
             break;
           case InternetStatus.Unknown:
           default:
             internetStatus.classList.remove("offline");
-            internetResult.hidden = true;
             break;
         }
+        if (internetId) {
+          document.l10n.setAttributes(internetResult, internetId);
+          internetResult.hidden = false;
+        } else {
+          internetResult.hidden = true;
+        }
+
+        let connectId;
         // FIXME: What about the TorConnectState.Disabled state?
         if (TorConnect.state === TorConnectState.Bootstrapped) {
           torConnectStatus.classList.add("connected");
           torConnectStatus.classList.remove("blocked");
-          torConnectResult.textContent = TorStrings.settings.statusTorConnected;
+          connectId = "tor-connection-network-status-connected";
           // NOTE: If the button is focused when we hide it, the focus may be
           // lost. But we don't have an obvious place to put the focus instead.
           torConnectButton.hidden = true;
@@ -2441,26 +2386,18 @@ const gConnectionPane = (function () {
             "blocked",
             TorConnect.potentiallyBlocked
           );
-          torConnectResult.textContent = TorConnect.potentiallyBlocked
-            ? TorStrings.settings.statusTorBlocked
-            : TorStrings.settings.statusTorNotConnected;
+          connectId = TorConnect.potentiallyBlocked
+            ? "tor-connection-network-status-blocked"
+            : "tor-connection-network-status-not-connected";
           torConnectButton.hidden = false;
         }
+        document.l10n.setAttributes(torConnectResult, connectId);
       };
       this._populateStatus();
 
       // Quickstart
-      prefpane.querySelector(selectors.quickstart.header).innerText =
-        TorStrings.settings.quickstartHeading;
-      prefpane.querySelector(selectors.quickstart.description).textContent =
-        TorStrings.settings.quickstartDescription;
-
-      this._enableQuickstartCheckbox = prefpane.querySelector(
-        selectors.quickstart.enableQuickstartCheckbox
-      );
-      this._enableQuickstartCheckbox.setAttribute(
-        "label",
-        TorStrings.settings.quickstartCheckbox
+      this._enableQuickstartCheckbox = document.getElementById(
+        "torPreferences-quickstart-toggle"
       );
       this._enableQuickstartCheckbox.addEventListener("command", e => {
         const checked = this._enableQuickstartCheckbox.checked;
@@ -2470,22 +2407,10 @@ const gConnectionPane = (function () {
       this._enableQuickstartCheckbox.checked = TorSettings.quickstart.enabled;
       Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
 
-      // Bridge setup
-      prefpane.querySelector(selectors.bridges.header).innerText =
-        TorStrings.settings.bridgesHeading;
-      prefpane.querySelector(selectors.bridges.description).textContent =
-        TorStrings.settings.bridgesDescription2;
-      {
-        const learnMore = prefpane.querySelector(selectors.bridges.learnMore);
-        learnMore.setAttribute("value", TorStrings.settings.learnMore);
-        learnMore.setAttribute("href", TorStrings.settings.learnMoreBridgesURL);
-        if (TorStrings.settings.learnMoreBridgesURL.startsWith("about:")) {
-          learnMore.setAttribute("useoriginprincipal", "true");
-        }
-      }
-
       // Location
       {
+        const prefpane = document.getElementById("mainPrefPane");
+
         const locationGroup = prefpane.querySelector(
           selectors.bridges.locationGroup
         );
@@ -2571,33 +2496,18 @@ const gConnectionPane = (function () {
       }
 
       // Advanced setup
-      prefpane.querySelector(selectors.advanced.header).innerText =
-        TorStrings.settings.advancedHeading;
-      prefpane.querySelector(selectors.advanced.label).textContent =
-        TorStrings.settings.advancedLabel;
-      {
-        const settingsButton = prefpane.querySelector(
-          selectors.advanced.button
-        );
-        settingsButton.setAttribute(
-          "label",
-          TorStrings.settings.advancedButton
-        );
-        settingsButton.addEventListener("command", () => {
+      document
+        .getElementById("torPreferences-advanced-button")
+        .addEventListener("click", () => {
           this.onAdvancedSettings();
         });
-      }
 
       // Tor logs
-      prefpane.querySelector(selectors.advanced.torLogsLabel).textContent =
-        TorStrings.settings.showTorDaemonLogs;
-      const torLogsButton = prefpane.querySelector(
-        selectors.advanced.torLogsButton
-      );
-      torLogsButton.setAttribute("label", TorStrings.settings.showLogs);
-      torLogsButton.addEventListener("command", () => {
-        this.onViewTorLogs();
-      });
+      document
+        .getElementById("torPreferences-buttonTorLogs")
+        .addEventListener("click", () => {
+          this.onViewTorLogs();
+        });
 
       Services.obs.addObserver(this, TorConnectTopics.StateChange);
     },


=====================================
browser/components/torpreferences/content/connectionPane.xhtml
=====================================
@@ -11,16 +11,21 @@
     data-category="paneConnection"
     hidden="true"
   >
-    <html:h1 id="torPreferences-header" />
+    <html:h1 data-l10n-id="tor-connection-settings-heading"></html:h1>
   </hbox>
 
   <groupbox data-category="paneConnection" hidden="true">
     <description flex="1">
-      <html:span id="torPreferences-description" class="tail-with-learn-more" />
+      <html:span
+        data-l10n-id="tor-connection-overview"
+        class="tail-with-learn-more"
+      ></html:span>
       <label
-        id="torPreferences-learnMore"
         class="learnMore text-link"
         is="text-link"
+        href="about:manual#about"
+        useoriginprincipal="true"
+        data-l10n-id="tor-connection-browser-learn-more-link"
       />
     </description>
   </groupbox>
@@ -36,33 +41,45 @@
         class="torPreferences-status-grouping"
       >
         <image class="torPreferences-status-icon" />
-        <html:span class="torPreferences-status-name"></html:span>
+        <html:span
+          class="torPreferences-status-name"
+          data-l10n-id="tor-connection-internet-status-label"
+        ></html:span>
         <html:span class="torPreferences-status-result"></html:span>
-        <button id="torPreferences-status-internet-test" />
+        <html:button
+          id="torPreferences-status-internet-test"
+          data-l10n-id="tor-connection-internet-status-test-button"
+        ></html:button>
       </hbox>
       <hbox
         id="torPreferences-status-tor-connect"
         class="torPreferences-status-grouping"
       >
         <image class="torPreferences-status-icon" />
-        <html:span class="torPreferences-status-name"></html:span>
+        <html:span
+          class="torPreferences-status-name"
+          data-l10n-id="tor-connection-network-status-label"
+        ></html:span>
         <html:span class="torPreferences-status-result"></html:span>
-        <button id="torPreferences-status-tor-connect-button" />
+        <html:button
+          id="torPreferences-status-tor-connect-button"
+          data-l10n-id="tor-connection-network-status-connect-button"
+        ></html:button>
       </hbox>
     </hbox>
   </groupbox>
 
   <!-- Quickstart -->
-  <groupbox
-    id="torPreferences-quickstart-group"
-    data-category="paneConnection"
-    hidden="true"
-  >
-    <html:h2 id="torPreferences-quickstart-header" />
-    <description flex="1">
-      <html:span id="torPreferences-quickstart-description" />
+  <groupbox data-category="paneConnection" hidden="true">
+    <label>
+      <html:h2 data-l10n-id="tor-connection-quickstart-heading"></html:h2>
+    </label>
+    <description flex="1" data-l10n-id="tor-connection-quickstart-description">
     </description>
-    <checkbox id="torPreferences-quickstart-toggle" />
+    <checkbox
+      id="torPreferences-quickstart-toggle"
+      data-l10n-id="tor-connection-quickstart-checkbox"
+    />
   </groupbox>
 
   <!-- Bridges -->
@@ -71,6 +88,7 @@
       id="torPreferences-bridges-header"
       class="tor-focusable-heading"
       tabindex="-1"
+      data-l10n-id="tor-bridges-heading"
     ></html:h1>
   </hbox>
   <groupbox
@@ -80,13 +98,15 @@
   >
     <description flex="1">
       <html:span
-        id="torPreferences-bridges-description"
         class="tail-with-learn-more"
+        data-l10n-id="tor-bridges-overview"
       />
       <label
-        id="torPreferences-bridges-learnMore"
         class="learnMore text-link"
         is="text-link"
+        href="about:manual#bridges"
+        useoriginprincipal="true"
+        data-l10n-id="tor-bridges-learn-more-link"
       />
     </description>
     <hbox
@@ -479,7 +499,7 @@
 
   <!-- Advanced -->
   <hbox class="subcategory" data-category="paneConnection" hidden="true">
-    <html:h1 id="torPreferences-advanced-header" />
+    <html:h1 data-l10n-id="tor-advanced-settings-heading"></html:h1>
   </hbox>
   <groupbox
     id="torPreferences-advanced-group"
@@ -487,14 +507,20 @@
     hidden="true"
   >
     <hbox align="center">
-      <label id="torPreferences-advanced-label" flex="1" />
-      <button id="torPreferences-advanced-button" class="accessory-button" />
+      <label data-l10n-id="tor-advanced-settings-description" flex="1" />
+      <html:button
+        id="torPreferences-advanced-button"
+        class="accessory-button"
+        data-l10n-id="tor-advanced-settings-button"
+      ></html:button>
     </hbox>
     <hbox align="center" data-subcategory="viewlogs">
-      <label id="torPreferences-torLogs" flex="1" />
-      <vbox>
-        <button id="torPreferences-buttonTorLogs" class="accessory-button" />
-      </vbox>
+      <label data-l10n-id="tor-view-log-description" flex="1" />
+      <html:button
+        id="torPreferences-buttonTorLogs"
+        class="accessory-button"
+        data-l10n-id="tor-view-log-button"
+      ></html:button>
     </hbox>
   </groupbox>
 </html:template>


=====================================
browser/components/torpreferences/content/connectionSettingsDialog.js
=====================================
@@ -4,10 +4,6 @@ const { TorSettings, TorProxyType } = ChromeUtils.importESModule(
   "resource://gre/modules/TorSettings.sys.mjs"
 );
 
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
-
 const gConnectionSettingsDialog = {
   _useProxyCheckbox: null,
   _proxyTypeLabel: null,
@@ -25,7 +21,6 @@ const gConnectionSettingsDialog = {
   _allowedPortsTextbox: null,
 
   selectors: {
-    header: "#torPreferences-connection-header",
     useProxyCheckbox: "checkbox#torPreferences-connection-toggleProxy",
     proxyTypeLabel: "label#torPreferences-localProxy-type",
     proxyTypeList: "menulist#torPreferences-localProxy-builtinList",
@@ -53,36 +48,27 @@ const gConnectionSettingsDialog = {
   init() {
     const selectors = this.selectors;
 
-    document.documentElement.setAttribute(
-      "title",
-      TorStrings.settings.connectionSettingsDialogTitle
-    );
-    document.querySelector(selectors.header).textContent =
-      TorStrings.settings.connectionSettingsDialogHeader;
-
     // Local Proxy
     this._useProxyCheckbox = document.querySelector(selectors.useProxyCheckbox);
-    this._useProxyCheckbox.setAttribute(
-      "label",
-      TorStrings.settings.useLocalProxy
-    );
     this._useProxyCheckbox.addEventListener("command", e => {
       const checked = this._useProxyCheckbox.checked;
       this.onToggleProxy(checked);
     });
     this._proxyTypeLabel = document.querySelector(selectors.proxyTypeLabel);
-    this._proxyTypeLabel.setAttribute("value", TorStrings.settings.proxyType);
 
     let mockProxies = [
       {
         value: TorProxyType.Socks4,
-        label: TorStrings.settings.proxyTypeSOCKS4,
+        l10nId: "tor-advanced-dialog-proxy-socks4-menuitem",
       },
       {
         value: TorProxyType.Socks5,
-        label: TorStrings.settings.proxyTypeSOCKS5,
+        l10nId: "tor-advanced-dialog-proxy-socks5-menuitem",
+      },
+      {
+        value: TorProxyType.HTTPS,
+        l10nId: "tor-advanced-dialog-proxy-http-menuitem",
       },
-      { value: TorProxyType.HTTPS, label: TorStrings.settings.proxyTypeHTTP },
     ];
     this._proxyTypeMenulist = document.querySelector(selectors.proxyTypeList);
     this._proxyTypeMenulist.addEventListener("command", e => {
@@ -92,24 +78,16 @@ const gConnectionSettingsDialog = {
     for (let currentProxy of mockProxies) {
       let menuEntry = window.document.createXULElement("menuitem");
       menuEntry.setAttribute("value", currentProxy.value);
-      menuEntry.setAttribute("label", currentProxy.label);
+      menuEntry.setAttribute("data-l10n-id", currentProxy.l10nId);
       this._proxyTypeMenulist.querySelector("menupopup").appendChild(menuEntry);
     }
 
     this._proxyAddressLabel = document.querySelector(
       selectors.proxyAddressLabel
     );
-    this._proxyAddressLabel.setAttribute(
-      "value",
-      TorStrings.settings.proxyAddress
-    );
     this._proxyAddressTextbox = document.querySelector(
       selectors.proxyAddressTextbox
     );
-    this._proxyAddressTextbox.setAttribute(
-      "placeholder",
-      TorStrings.settings.proxyAddressPlaceholder
-    );
     this._proxyAddressTextbox.addEventListener("blur", e => {
       let value = this._proxyAddressTextbox.value.trim();
       let colon = value.lastIndexOf(":");
@@ -122,36 +100,19 @@ const gConnectionSettingsDialog = {
       }
     });
     this._proxyPortLabel = document.querySelector(selectors.proxyPortLabel);
-    this._proxyPortLabel.setAttribute("value", TorStrings.settings.proxyPort);
     this._proxyPortTextbox = document.querySelector(selectors.proxyPortTextbox);
     this._proxyUsernameLabel = document.querySelector(
       selectors.proxyUsernameLabel
     );
-    this._proxyUsernameLabel.setAttribute(
-      "value",
-      TorStrings.settings.proxyUsername
-    );
     this._proxyUsernameTextbox = document.querySelector(
       selectors.proxyUsernameTextbox
     );
-    this._proxyUsernameTextbox.setAttribute(
-      "placeholder",
-      TorStrings.settings.proxyUsernamePasswordPlaceholder
-    );
     this._proxyPasswordLabel = document.querySelector(
       selectors.proxyPasswordLabel
     );
-    this._proxyPasswordLabel.setAttribute(
-      "value",
-      TorStrings.settings.proxyPassword
-    );
     this._proxyPasswordTextbox = document.querySelector(
       selectors.proxyPasswordTextbox
     );
-    this._proxyPasswordTextbox.setAttribute(
-      "placeholder",
-      TorStrings.settings.proxyUsernamePasswordPlaceholder
-    );
 
     this.onToggleProxy(false);
     if (TorSettings.proxy.enabled) {
@@ -167,10 +128,6 @@ const gConnectionSettingsDialog = {
     this._useFirewallCheckbox = document.querySelector(
       selectors.useFirewallCheckbox
     );
-    this._useFirewallCheckbox.setAttribute(
-      "label",
-      TorStrings.settings.useFirewall
-    );
     this._useFirewallCheckbox.addEventListener("command", e => {
       const checked = this._useFirewallCheckbox.checked;
       this.onToggleFirewall(checked);
@@ -178,17 +135,9 @@ const gConnectionSettingsDialog = {
     this._allowedPortsLabel = document.querySelector(
       selectors.firewallAllowedPortsLabel
     );
-    this._allowedPortsLabel.setAttribute(
-      "value",
-      TorStrings.settings.allowedPorts
-    );
     this._allowedPortsTextbox = document.querySelector(
       selectors.firewallAllowedPortsTextbox
     );
-    this._allowedPortsTextbox.setAttribute(
-      "placeholder",
-      TorStrings.settings.allowedPortsPlaceholder
-    );
 
     this.onToggleFirewall(false);
     if (TorSettings.firewall.enabled) {


=====================================
browser/components/torpreferences/content/connectionSettingsDialog.xhtml
=====================================
@@ -7,16 +7,31 @@
   type="child"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="tor-advanced-dialog-title"
 >
   <dialog id="torPreferences-connection-dialog" buttons="accept,cancel">
+    <linkset>
+      <html:link rel="localization" href="branding/brand.ftl" />
+      <html:link rel="localization" href="browser/tor-browser.ftl" />
+    </linkset>
+
     <script src="chrome://browser/content/torpreferences/connectionSettingsDialog.js" />
 
-    <html:h3 id="torPreferences-connection-header">​</html:h3>
+    <html:h3
+      id="torPreferences-connection-header"
+      data-l10n-id="tor-advanced-dialog-introduction"
+    ></html:h3>
     <!-- Local Proxy -->
-    <checkbox id="torPreferences-connection-toggleProxy" label="​" />
+    <checkbox
+      id="torPreferences-connection-toggleProxy"
+      data-l10n-id="tor-advanced-dialog-proxy-checkbox"
+    />
     <box id="torPreferences-connection-grid">
       <hbox class="indent" align="center">
-        <label id="torPreferences-localProxy-type" />
+        <label
+          id="torPreferences-localProxy-type"
+          data-l10n-id="tor-advanced-dialog-proxy-type-selector-label"
+        />
       </hbox>
       <hbox align="center">
         <spacer flex="1" />
@@ -28,15 +43,22 @@
         </menulist>
       </hbox>
       <hbox class="indent" align="center">
-        <label id="torPreferences-localProxy-address" />
+        <label
+          id="torPreferences-localProxy-address"
+          data-l10n-id="tor-advanced-dialog-proxy-address-input-label"
+        />
       </hbox>
       <hbox align="center">
         <html:input
           id="torPreferences-localProxy-textboxAddress"
           type="text"
           class="torMarginFix"
+          data-l10n-id="tor-advanced-dialog-proxy-address-input"
+        />
+        <label
+          id="torPreferences-localProxy-port"
+          data-l10n-id="tor-advanced-dialog-proxy-port-input-label"
         />
-        <label id="torPreferences-localProxy-port" />
         <!-- proxy-port-input class style pulled from preferences.css and used in the vanilla proxy setup menu -->
         <html:input
           id="torPreferences-localProxy-textboxPort"
@@ -49,27 +71,41 @@
         />
       </hbox>
       <hbox class="indent" align="center">
-        <label id="torPreferences-localProxy-username" />
+        <label
+          id="torPreferences-localProxy-username"
+          data-l10n-id="tor-advanced-dialog-proxy-username-input-label"
+        />
       </hbox>
       <hbox align="center">
         <html:input
           id="torPreferences-localProxy-textboxUsername"
           type="text"
           class="torMarginFix"
+          data-l10n-id="tor-advanced-dialog-proxy-username-input"
+        />
+        <label
+          id="torPreferences-localProxy-password"
+          data-l10n-id="tor-advanced-dialog-proxy-password-input-label"
         />
-        <label id="torPreferences-localProxy-password" />
         <html:input
           id="torPreferences-localProxy-textboxPassword"
           class="torMarginFix"
           type="password"
+          data-l10n-id="tor-advanced-dialog-proxy-password-input"
         />
       </hbox>
     </box>
     <!-- Firewall -->
-    <checkbox id="torPreferences-connection-toggleFirewall" label="​" />
+    <checkbox
+      id="torPreferences-connection-toggleFirewall"
+      data-l10n-id="tor-advanced-dialog-firewall-checkbox"
+    />
     <box id="torPreferences-connection-firewall">
       <hbox class="indent" align="center">
-        <label id="torPreferences-connection-allowedPorts" />
+        <label
+          id="torPreferences-connection-allowedPorts"
+          data-l10n-id="tor-advanced-dialog-firewall-ports-input-label"
+        />
       </hbox>
       <hbox id="torPreferences-connection-hboxAllowedPorts" align="center">
         <html:input
@@ -77,6 +113,7 @@
           type="text"
           class="torMarginFix"
           value="80,443"
+          data-l10n-id="tor-advanced-dialog-firewall-ports-input"
         />
       </hbox>
     </box>


=====================================
browser/components/torpreferences/content/provideBridgeDialog.js
=====================================
@@ -1,9 +1,5 @@
 "use strict";
 
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
-
 const { TorSettings, TorBridgeSource, validateBridgeLines } =
   ChromeUtils.importESModule("resource://gre/modules/TorSettings.sys.mjs");
 
@@ -191,10 +187,8 @@ const gProvideBridgeDialog = {
       this._result.connect = connect;
 
       this._acceptButton.setAttribute(
-        "label",
-        connect
-          ? TorStrings.settings.bridgeButtonConnect
-          : TorStrings.settings.bridgeButtonAccept
+        "data-l10n-id",
+        connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-accept"
       );
     }
   },


=====================================
browser/components/torpreferences/content/requestBridgeDialog.js
=====================================
@@ -3,9 +3,6 @@
 const { BridgeDB } = ChromeUtils.importESModule(
   "resource://gre/modules/BridgeDB.sys.mjs"
 );
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
 
 const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
   "resource://gre/modules/TorConnect.sys.mjs"
@@ -20,8 +17,6 @@ const gRequestBridgeDialog = {
       "button#torPreferences-requestBridge-refreshCaptchaButton",
     incorrectCaptchaHbox:
       "hbox#torPreferences-requestBridge-incorrectCaptchaHbox",
-    incorrectCaptchaLabel:
-      "label#torPreferences-requestBridge-incorrectCaptchaError",
   },
 
   init() {
@@ -33,10 +28,6 @@ const gRequestBridgeDialog = {
       "torPreferences-requestBridge-dialog"
     );
 
-    document.documentElement.setAttribute(
-      "title",
-      TorStrings.settings.requestBridgeDialogTitle
-    );
     // user may have opened a Request Bridge dialog in another tab, so update the
     // CAPTCHA image or close out the dialog if we have a bridge list
     this._dialog.addEventListener("focusin", () => {
@@ -59,7 +50,6 @@ const gRequestBridgeDialog = {
     });
 
     this._dialogHeader = this._dialog.querySelector(selectors.dialogHeader);
-    this._dialogHeader.textContent = TorStrings.settings.contactingBridgeDB;
 
     this._captchaImage = this._dialog.querySelector(selectors.captchaImage);
 
@@ -71,10 +61,6 @@ const gRequestBridgeDialog = {
     this._captchaEntryTextbox = this._dialog.querySelector(
       selectors.captchaEntryTextbox
     );
-    this._captchaEntryTextbox.setAttribute(
-      "placeholder",
-      TorStrings.settings.captchaTextboxPlaceholder
-    );
     this._captchaEntryTextbox.disabled = true;
     // disable submit if entry textbox is empty
     this._captchaEntryTextbox.oninput = () => {
@@ -89,13 +75,6 @@ const gRequestBridgeDialog = {
     this._incorrectCaptchaHbox = this._dialog.querySelector(
       selectors.incorrectCaptchaHbox
     );
-    this._incorrectCaptchaLabel = this._dialog.querySelector(
-      selectors.incorrectCaptchaLabel
-    );
-    this._incorrectCaptchaLabel.setAttribute(
-      "value",
-      TorStrings.settings.incorrectCaptcha
-    );
 
     Services.obs.addObserver(this, TorConnectTopics.StateChange);
     this.onAcceptStateChange();
@@ -111,10 +90,8 @@ const gRequestBridgeDialog = {
     const connect = TorConnect.canBeginBootstrap;
     this._result.connect = connect;
     this._submitButton.setAttribute(
-      "label",
-      connect
-        ? TorStrings.settings.bridgeButtonConnect
-        : TorStrings.settings.submitCaptcha
+      "data-l10n-id",
+      connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-submit"
     );
   },
 
@@ -129,7 +106,10 @@ const gRequestBridgeDialog = {
   _setcaptchaImage(uri) {
     if (uri != this._captchaImage.src) {
       this._captchaImage.src = uri;
-      this._dialogHeader.textContent = TorStrings.settings.solveTheCaptcha;
+      this._dialogHeader.setAttribute(
+        "data-l10n-id",
+        "request-bridge-dialog-top-solve"
+      );
       this._setUIDisabled(false);
       this._captchaEntryTextbox.focus();
       this._captchaEntryTextbox.select();
@@ -185,7 +165,10 @@ const gRequestBridgeDialog = {
   onRefreshCaptcha() {
     this._setUIDisabled(true);
     this._captchaImage.src = "";
-    this._dialogHeader.textContent = TorStrings.settings.contactingBridgeDB;
+    this._dialogHeader.setAttribute(
+      "data-l10n-id",
+      "request-bridge-dialog-top-wait"
+    );
     this._captchaEntryTextbox.value = "";
     this._incorrectCaptchaHbox.style.visibility = "hidden";
 


=====================================
browser/components/torpreferences/content/requestBridgeDialog.xhtml
=====================================
@@ -7,20 +7,26 @@
   type="child"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="request-bridge-dialog-title"
 >
   <dialog id="torPreferences-requestBridge-dialog" buttons="accept,cancel">
+    <linkset>
+      <html:link rel="localization" href="browser/tor-browser.ftl" />
+    </linkset>
+
     <script src="chrome://browser/content/torpreferences/requestBridgeDialog.js" />
 
-    <!-- ok, so ​ is a zero-width space. We need to have *something* in the innerText so that XUL knows how tall the
-       title node is so that it can determine how large to make the dialog element's inner draw area. If we have nothing
-       in the innerText, then it collapse to 0 height, and the contents of the dialog ends up partially hidden >:( -->
-    <html:h3 id="torPreferences-requestBridge-header">​</html:h3>
+    <html:h3
+      id="torPreferences-requestBridge-header"
+      data-l10n-id="request-bridge-dialog-top-solve"
+    ></html:h3>
     <!-- init to transparent 400x125 png -->
     <image id="torPreferences-requestBridge-captchaImage" flex="1" />
     <hbox id="torPreferences-requestBridge-inputHbox">
       <html:input
         id="torPreferences-requestBridge-captchaTextbox"
         type="text"
+        data-l10n-id="request-bridge-dialog-captcha-input"
       />
       <button
         id="torPreferences-requestBridge-refreshCaptchaButton"
@@ -30,7 +36,7 @@
     </hbox>
     <hbox id="torPreferences-requestBridge-incorrectCaptchaHbox" align="center">
       <image id="torPreferences-requestBridge-errorIcon" />
-      <label id="torPreferences-requestBridge-incorrectCaptchaError" flex="1" />
+      <label data-l10n-id="request-bridge-dialog-captcha-failed" flex="1" />
     </hbox>
   </dialog>
 </window>


=====================================
browser/components/torpreferences/content/torLogDialog.js
=====================================
@@ -7,21 +7,13 @@ const { setTimeout, clearTimeout } = ChromeUtils.importESModule(
 const { TorProviderBuilder } = ChromeUtils.importESModule(
   "resource://gre/modules/TorProviderBuilder.sys.mjs"
 );
-const { TorStrings } = ChromeUtils.importESModule(
-  "resource://gre/modules/TorStrings.sys.mjs"
-);
 
 window.addEventListener(
   "DOMContentLoaded",
   () => {
-    document.documentElement.setAttribute(
-      "title",
-      TorStrings.settings.torLogDialogTitle
-    );
-
     const dialog = document.getElementById("torPreferences-torLog-dialog");
     const copyLogButton = dialog.getButton("extra1");
-    copyLogButton.setAttribute("label", TorStrings.settings.copyLog);
+    copyLogButton.setAttribute("data-l10n-id", "tor-log-dialog-copy-button");
 
     const logText = document.getElementById(
       "torPreferences-torDialog-textarea"
@@ -35,8 +27,10 @@ window.addEventListener(
       );
       clipboard.copyString(logText.value);
 
-      const label = copyLogButton.querySelector("label");
-      label.setAttribute("value", TorStrings.settings.copied);
+      copyLogButton.setAttribute(
+        "data-l10n-id",
+        "tor-log-dialog-copy-button-copied"
+      );
       copyLogButton.classList.add("primary");
 
       const RESTORE_TIME = 1200;
@@ -44,7 +38,10 @@ window.addEventListener(
         clearTimeout(restoreButtonTimeout);
       }
       restoreButtonTimeout = setTimeout(() => {
-        label.setAttribute("value", TorStrings.settings.copyLog);
+        copyLogButton.setAttribute(
+          "data-l10n-id",
+          "tor-log-dialog-copy-button"
+        );
         copyLogButton.classList.remove("primary");
         restoreButtonTimeout = null;
       }, RESTORE_TIME);


=====================================
browser/components/torpreferences/content/torLogDialog.xhtml
=====================================
@@ -7,8 +7,13 @@
   type="child"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="tor-log-dialog-title"
 >
   <dialog id="torPreferences-torLog-dialog" buttons="accept,extra1">
+    <linkset>
+      <html:link rel="localization" href="browser/tor-browser.ftl" />
+    </linkset>
+
     <script src="chrome://browser/content/torpreferences/torLogDialog.js" />
 
     <html:textarea


=====================================
browser/components/torpreferences/content/torPreferences.css
=====================================
@@ -1023,6 +1023,11 @@ groupbox#torPreferences-bridges-group textarea {
 }
 
 /* Connection settings dialog */
+#torPreferences-connection-dialog label {
+  /* Do not wrap the labels. */
+  white-space: nowrap;
+}
+
 #torPreferences-connection-header {
   margin: 4px 0 14px 0;
 }


=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -45,7 +45,55 @@ tor-browser-home-message-testing = This is an unstable version of Tor Browser fo
 home-mode-choice-tor =
     .label = Tor Browser Home
 
-## Tor Bridges Settings
+## Tor connection settings.
+
+# "Connection" refers to the Tor Browser's connection to the Tor network.
+tor-connection-settings-heading = Connection
+# -brand-short-name refers to 'Tor Browser', localized.
+tor-connection-overview = { -brand-short-name } routes your traffic over the Tor Network, run by thousands of volunteers around the world.
+tor-connection-browser-learn-more-link = Learn more
+tor-connection-quickstart-heading = Quickstart
+# -brand-short-name refers to 'Tor Browser', localized.
+tor-connection-quickstart-description = Quickstart connects { -brand-short-name } to the Tor Network automatically when launched, based on your last used connection settings.
+tor-connection-quickstart-checkbox =
+    .label = Always connect automatically
+
+# Prefix before the internet connection status.
+# "Internet" is not a proper noun, but is capitalized because it is the start of a sentence.
+tor-connection-internet-status-label = Internet:
+# Button to test the internet connection.
+# Here "Test" is a verb, as in "test the internet connection".
+# Uses sentence case in English (US).
+tor-connection-internet-status-test-button = Test
+# Shown when the user is connected to the internet.
+# Uses sentence case in English (US).
+tor-connection-internet-status-online = Online
+# Shown when the user is not connected to the internet.
+# Uses sentence case in English (US).
+tor-connection-internet-status-offline = Offline
+
+# Prefix before the Tor network connection status.
+# Uses sentence case in English (US).
+tor-connection-network-status-label = Tor network:
+# Shown when the user is connected to the Tor network.
+# Uses sentence case in English (US).
+tor-connection-network-status-connected = Connected
+# Shown when the user is not connected to the Tor network.
+# Uses sentence case in English (US).
+tor-connection-network-status-not-connected = Not connected
+# Shown when the user's Tor connection may be blocked.
+# Uses sentence case in English (US).
+tor-connection-network-status-blocked = Potentially blocked
+# Button shown when we are not yet connected to the Tor network.
+# It will open a page to start connecting to the Tor network.
+# Uses sentence case in English (US).
+tor-connection-network-status-connect-button = Connect
+
+## Tor Bridges Settings.
+
+tor-bridges-heading = Bridges
+tor-bridges-overview = Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
+tor-bridges-learn-more-link = Learn more
 
 # Toggle button for enabling and disabling the use of bridges.
 tor-bridges-use-bridges =
@@ -78,6 +126,16 @@ tor-bridges-menu-item-remove-all-bridges = Remove all bridges
 
 # Shown when one of the built-in bridges is in use.
 tor-bridges-built-in-status-connected = Connected
+# "obfs4" is a technical name, and likely should not be translated.
+tor-bridges-built-in-obfs4-name = obfs4
+tor-bridges-built-in-obfs4-description = Makes your Tor traffic look like random data. May not work in heavily censored regions.
+# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
+tor-bridges-built-in-snowflake-name = Snowflake
+# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
+tor-bridges-built-in-snowflake-description = Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.
+# "meek-azure" is a technical name, and likely should not be translated.
+tor-bridges-built-in-meek-azure-name = meek-azure
+tor-bridges-built-in-meek-azure-description = Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.
 
 # Shown at the start of a Tor bridge line.
 # $type (String) - The Tor bridge type ("snowflake", "obfs4", "meek-azure").
@@ -195,6 +253,7 @@ tor-bridges-add-bridges-heading = Add bridges
 # Shown as a heading when the user has existing bridges that can be replaced.
 tor-bridges-replace-bridges-heading = Replace your bridges
 
+# -brand-short-name refers to 'Tor Browser', localized.
 tor-bridges-select-built-in-description = Choose from one of { -brand-short-name }’s built-in bridges
 tor-bridges-select-built-in-button = Select a built-in bridge…
 
@@ -233,6 +292,23 @@ tor-bridges-provider-email-instruction = Email { $address }
 tor-bridges-request-from-browser = You can also get bridges from the bridge bot without leaving { -brand-short-name }.
 tor-bridges-request-button = Request bridges…
 
+## Warning dialog when removing all bridges.
+
+remove-all-bridges-warning-title = Remove all bridges?
+remove-all-bridges-warning-description = If these bridges were received from torproject.org or added manually, this action cannot be undone
+remove-all-bridges-warning-remove-button = Remove
+
+## Bridge QR code dialog.
+
+bridge-qr-dialog-title =
+    .title = Scan the QR code
+
+## Common button used in bridge dialogs.
+
+bridge-dialog-button-connect = Connect
+bridge-dialog-button-accept = OK
+bridge-dialog-button-submit = Submit
+
 ## User provided bridge dialog.
 
 # Used when the user is editing their existing bridge addresses.
@@ -300,11 +376,92 @@ user-provide-bridge-dialog-next-button =
 
 ## Built-in bridges dialog.
 
+built-in-dialog-title =
+    .title = Select a Built-In Bridge
+# -brand-short-name refers to 'Tor Browser', localized.
+built-in-dialog-introduction = { -brand-short-name } includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.
+# "obfs4" is a technical name, and likely should not be translated.
+built-in-dialog-obfs4-radio-option =
+    .label = obfs4
+# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
+built-in-dialog-snowflake-radio-option =
+    .label = Snowflake
+# "meek-azure" is a technical name, and likely should not be translated.
+built-in-dialog-meek-azure-radio-option =
+    .label = meek-azure
 # Label attached to the built-in bridge option that is already in use.
 # The "aria-label" should use the same text, but include some ending punctuation to separate it from the sentence that follows. This is used for screen reader users.
 built-in-dialog-current-bridge-label = Current bridge
     .aria-label = Current bridge.
 
+request-bridge-dialog-title =
+    .title = Request Bridge
+request-bridge-dialog-top-wait = Contacting BridgeDB. Please Wait.
+request-bridge-dialog-top-solve = Solve the CAPTCHA to request a bridge.
+request-bridge-dialog-captcha-input =
+    .placeholder = Enter the characters from the image
+request-bridge-dialog-captcha-failed = The solution is not correct. Please try again.
+
+## Tor advanced settings.
+
+tor-advanced-settings-heading = Advanced
+tor-advanced-settings-description = Configure how { -brand-short-name } connects to the internet.
+# Button that opens the advanced connection settings dialog.
+# Uses sentence case in English (US).
+tor-advanced-settings-button = Settings…
+# "log" is a noun, referring to the recorded text output of the Tor process.
+tor-view-log-description = View the Tor log.
+# "log" is a noun, referring to the recorded text output of the Tor process.
+# Uses sentence case in English (US).
+tor-view-log-button = View log…
+
+## Tor log dialog.
+
+# "log" is a noun, referring to the recorded text output of the Tor process.
+tor-log-dialog-title =
+    .title = Tor log
+# "log" is a noun, referring to the recorded text output of the Tor process.
+tor-log-dialog-copy-button =
+    .label = Copy Tor log to clipboard
+# Button text changes for a short time after activating the button.
+tor-log-dialog-copy-button-copied =
+    .label = Copied!
+
+## Tor advanced connection settings dialog.
+
+tor-advanced-dialog-title =
+    .title = Connection settings
+tor-advanced-dialog-introduction = Configure how { -brand-short-name } connects to the internet.
+tor-advanced-dialog-proxy-checkbox =
+    .label = I use a proxy to connect to the internet
+tor-advanced-dialog-proxy-type-selector-label = Proxy type
+# SOCKS4 is a technical name, and should likely not be translated.
+tor-advanced-dialog-proxy-socks4-menuitem =
+    .label = SOCKS4
+# SOCKS5 is a technical name, and should likely not be translated.
+tor-advanced-dialog-proxy-socks5-menuitem =
+    .label = SOCKS5
+# HTTP and HTTPS are technical names, and should likely not be translated.
+# The "/" refers to "HTTP or HTTPS" and can be translated.
+tor-advanced-dialog-proxy-http-menuitem =
+    .label = HTTP/HTTPS
+# "address" is a noun, referring to an network IP address.
+tor-advanced-dialog-proxy-address-input-label = Address
+tor-advanced-dialog-proxy-address-input =
+    .placeholder = IP address or hostname
+tor-advanced-dialog-proxy-port-input-label = Port
+tor-advanced-dialog-proxy-username-input-label = Username
+tor-advanced-dialog-proxy-username-input =
+    .placeholder = Optional
+tor-advanced-dialog-proxy-password-input-label = Password
+tor-advanced-dialog-proxy-password-input =
+    .placeholder = Optional
+tor-advanced-dialog-firewall-checkbox =
+    .label = This computer goes through a firewall that only allows connections to certain ports
+tor-advanced-dialog-firewall-ports-input-label = Allowed ports
+tor-advanced-dialog-firewall-ports-input =
+    .placeholder = Comma-separated values
+
 ## About Tor Browser dialog.
 
 # '<label data-l10n-name="project-link">' and '</label>' should wrap the link text for the Tor Project, and will link to the Tor Project web page.


=====================================
toolkit/modules/TorStrings.sys.mjs
=====================================
@@ -67,107 +67,23 @@ const Loader = {
   */
   settings() {
     const strings = {
-      categoryTitle: "Connection",
       // Message box
       torPreferencesDescription:
         "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.",
-      // Status
-      statusInternetLabel: "Internet:",
-      statusInternetTest: "Test",
-      statusInternetOnline: "Online",
-      statusInternetOffline: "Offline",
-      statusTorLabel: "Tor Network:",
-      statusTorConnected: "Connected",
-      statusTorNotConnected: "Not Connected",
-      statusTorBlocked: "Potentially Blocked",
-      learnMore: "Learn more",
       // Quickstart
-      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: "Bridges",
-      bridgesDescription2:
-        "Bridges help you securely 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…",
-      remove: "Remove",
-      bridgeDisableBuiltIn: "Disable built-in bridges",
-      copied: "Copied!",
-      bridgeRemoveAllDialogTitle: "Remove all bridges?",
-      bridgeRemoveAllDialogDescription:
-        "If these bridges were received from torproject.org or added manually, this action cannot be undone",
-      // Advanced settings
-      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: "Remove all the bridges?",
-      removeBridgesWarning: "This action cannot be undone.",
-      cancel: "Cancel",
-      // Scan bridge QR dialog
-      scanQrTitle: "Scan the QR code",
-      // Builtin bridges dialog
-      builtinBridgeHeader: "Select a Built-In Bridge",
-      builtinBridgeDescription2:
-        "Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.",
-      builtinBridgeObfs4Title: "obfs4 (Built-in)",
-      builtinBridgeObfs4Description2:
-        "Makes your Tor traffic look like random data. May not work in heavily censored regions.",
-      builtinBridgeSnowflake: "Snowflake",
-      builtinBridgeSnowflakeDescription2:
-        "Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.",
-      builtinBridgeMeekAzure: "meek-azure",
-      builtinBridgeMeekAzureDescription2:
-        "Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.",
-      bridgeButtonConnect: "Connect",
-      bridgeButtonAccept: "OK",
-      // Request bridges dialog
-      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.",
-      // Connection settings dialog
-      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: "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",
-    };
+    return tsb.getStrings(strings);
   } /* Tor Network Settings Strings */,
 
   torConnect() {


=====================================
toolkit/torbutton/chrome/locale/en-US/settings.properties
=====================================
@@ -3,95 +3,17 @@
 # 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
+# Still used in TorConnect.
 
 # 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.bridgesDescription2=Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
+# Might be removed in tor-browser#42477
+
 settings.bridgeLocation=Your location
 settings.bridgeLocationAutomatic=Automatic
 settings.bridgeLocationFrequent=Frequently selected locations
 settings.bridgeLocationOther=Other locations
 settings.bridgeChooseForMe=Choose a Bridge For Me…
-
-settings.remove=Remove
-settings.bridgeDisableBuiltIn=Disable built-in bridges
-settings.copied=Copied!
-settings.bridgeRemoveAllDialogTitle=Remove all bridges?
-settings.bridgeRemoveAllDialogDescription=If these bridges were received from torproject.org or added manually, this action cannot be undone
-
-# 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.builtinBridgeHeader=Select a Built-In Bridge
-settings.builtinBridgeDescription2=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.
-settings.builtinBridgeObfs4Title=obfs4 (Built-in)
-settings.builtinBridgeObfs4Description2=Makes your Tor traffic look like random data. May not work in heavily censored regions.
-settings.builtinBridgeSnowflake=Snowflake
-settings.builtinBridgeSnowflakeDescription2=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.
-settings.builtinBridgeMeekAzure=meek-azure
-settings.builtinBridgeMeekAzureDescription2=Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.
-settings.bridgeButtonConnect=Connect
-settings.bridgeButtonAccept=OK
-
-# 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.
-
-# 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-separated values
-
-# Log dialog
-settings.torLogDialogTitle=Tor Logs
-settings.copyLog=Copy Tor Log to Clipboard


=====================================
tools/torbrowser/l10n/migrations/bug-42207-settings.py
=====================================
@@ -0,0 +1,88 @@
+from fluent.migrate.helpers import transforms_from
+
+
+def migrate(ctx):
+    legacy_path = "settings.properties"
+    ctx.add_transforms(
+        "tor-browser.ftl",
+        "tor-browser.ftl",
+        transforms_from(
+            """
+tor-connection-settings-heading = { COPY(path, "settings.categoryTitle") }
+tor-connection-browser-learn-more-link = { COPY(path, "settings.learnMore") }
+
+tor-connection-quickstart-heading = { COPY(path, "settings.quickstartHeading") }
+tor-connection-quickstart-checkbox =
+    .label = { COPY(path, "settings.quickstartCheckbox") }
+
+tor-connection-internet-status-label = { COPY(path, "settings.statusInternetLabel") }
+tor-connection-internet-status-test-button = { COPY(path, "settings.statusInternetTest") }
+tor-connection-internet-status-online = { COPY(path, "settings.statusInternetOnline") }
+tor-connection-internet-status-offline = { COPY(path, "settings.statusInternetOffline") }
+
+tor-bridges-heading = { COPY(path, "settings.bridgesHeading") }
+tor-bridges-overview = { COPY(path, "settings.bridgesDescription2") }
+tor-bridges-learn-more-link = { COPY(path, "settings.learnMore") }
+
+tor-bridges-built-in-obfs4-description = { COPY(path, "settings.builtinBridgeObfs4Description2") }
+tor-bridges-built-in-snowflake-name = { COPY(path, "settings.builtinBridgeSnowflake") }
+tor-bridges-built-in-snowflake-description = { COPY(path, "settings.builtinBridgeSnowflakeDescription2") }
+tor-bridges-built-in-meek-azure-name = { COPY(path, "settings.builtinBridgeMeekAzure") }
+tor-bridges-built-in-meek-azure-description = { COPY(path, "settings.builtinBridgeMeekAzureDescription2") }
+
+remove-all-bridges-warning-title = { COPY(path, "settings.bridgeRemoveAllDialogTitle") }
+remove-all-bridges-warning-description = { COPY(path, "settings.bridgeRemoveAllDialogDescription") }
+remove-all-bridges-warning-remove-button = { COPY(path, "settings.remove") }
+
+bridge-qr-dialog-title =
+    .title = { COPY(path, "settings.scanQrTitle") }
+
+bridge-dialog-button-connect = { COPY(path, "settings.bridgeButtonConnect") }
+bridge-dialog-button-accept = { COPY(path, "settings.bridgeButtonAccept") }
+bridge-dialog-button-submit = { COPY(path, "settings.submitCaptcha") }
+
+built-in-dialog-title =
+    .title = { COPY(path, "settings.builtinBridgeHeader") }
+built-in-dialog-snowflake-radio-option =
+    .label = { COPY(path, "settings.builtinBridgeSnowflake") }
+built-in-dialog-meek-azure-radio-option =
+    .label = { COPY(path, "settings.builtinBridgeMeekAzure") }
+
+request-bridge-dialog-title =
+    .title = { COPY(path, "settings.requestBridgeDialogTitle") }
+request-bridge-dialog-top-wait = { COPY(path, "settings.contactingBridgeDB") }
+request-bridge-dialog-top-solve = { COPY(path, "settings.solveTheCaptcha") }
+request-bridge-dialog-captcha-input =
+    .placeholder = { COPY(path, "settings.captchaTextboxPlaceholder") }
+request-bridge-dialog-captcha-failed = { COPY(path, "settings.incorrectCaptcha") }
+
+tor-advanced-settings-heading = { COPY(path, "settings.advancedHeading") }
+tor-advanced-settings-button = { COPY(path, "settings.advancedButton") }
+
+tor-log-dialog-copy-button-copied =
+    .label = { COPY(path, "settings.copied") }
+
+tor-advanced-dialog-proxy-socks4-menuitem =
+    .label = { COPY(path, "settings.proxyTypeSOCKS4") }
+tor-advanced-dialog-proxy-socks5-menuitem =
+    .label = { COPY(path, "settings.proxyTypeSOCKS5") }
+tor-advanced-dialog-proxy-http-menuitem =
+    .label = { COPY(path, "settings.proxyTypeHTTP") }
+tor-advanced-dialog-proxy-address-input-label = { COPY(path, "settings.proxyAddress") }
+tor-advanced-dialog-proxy-address-input =
+    .placeholder = { COPY(path, "settings.proxyAddressPlaceholder") }
+tor-advanced-dialog-proxy-port-input-label = { COPY(path, "settings.proxyPort") }
+tor-advanced-dialog-proxy-username-input-label = { COPY(path, "settings.proxyUsername") }
+tor-advanced-dialog-proxy-username-input =
+    .placeholder = { COPY(path, "settings.proxyUsernamePasswordPlaceholder") }
+tor-advanced-dialog-proxy-password-input-label = { COPY(path, "settings.proxyPassword") }
+tor-advanced-dialog-proxy-password-input =
+    .placeholder = { COPY(path, "settings.proxyUsernamePasswordPlaceholder") }
+tor-advanced-dialog-firewall-checkbox =
+    .label = { COPY(path, "settings.useFirewall") }
+tor-advanced-dialog-firewall-ports-input =
+    .placeholder = { COPY(path, "settings.allowedPortsPlaceholder") }
+""",
+            path=legacy_path,
+        ),
+    )



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3f77b1fff522305154682aa72c49184036c50767...446e78a535928f5b25545059f7f0ec6712c8c5a2

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3f77b1fff522305154682aa72c49184036c50767...446e78a535928f5b25545059f7f0ec6712c8c5a2
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/20240409/b7c43ffc/attachment-0001.htm>


More information about the tbb-commits mailing list