| 
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:
Changes:
browser/components/torpreferences/content/bridgeQrDialog.js
 
| ... | ... | @@ -4,19 +4,11 @@ const { QRCode } = ChromeUtils.importESModule( |  
| 4 | 4 |    "resource://gre/modules/QRCode.sys.mjs"
 |  
| 5 | 5 |  );
 |  
| 6 | 6 |  
 |  
| 7 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 8 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 9 |  | -);
 |  
| 10 |  | -
 |  
| 11 | 7 |  window.addEventListener(
 |  
| 12 | 8 |    "DOMContentLoaded",
 |  
| 13 | 9 |    () => {
 |  
| 14 | 10 |      const bridgeString = window.arguments[0];
 |  
| 15 | 11 |  
 |  
| 16 |  | -    document.documentElement.setAttribute(
 |  
| 17 |  | -      "title",
 |  
| 18 |  | -      TorStrings.settings.scanQrTitle
 |  
| 19 |  | -    );
 |  
| 20 | 12 |      const target = document.getElementById("bridgeQr-target");
 |  
| 21 | 13 |      const style = window.getComputedStyle(target);
 |  
| 22 | 14 |      // We are assuming that the style width and height have "px" units.
 |  browser/components/torpreferences/content/bridgeQrDialog.xhtml
 
 
| ... | ... | @@ -7,8 +7,13 @@ |  
| 7 | 7 |    type="child"
 |  
| 8 | 8 |    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 |  
| 9 | 9 |    xmlns:html="http://www.w3.org/1999/xhtml"
 |  
|  | 10 | +  data-l10n-id="bridge-qr-dialog-title"
 |  
| 10 | 11 |  >
 |  
| 11 | 12 |    <dialog id="bridgeQr-dialog" buttons="accept">
 |  
|  | 13 | +    <linkset>
 |  
|  | 14 | +      <html:link rel="localization" href="">"browser/tor-browser.ftl" />
 |  
|  | 15 | +    </linkset>
 |  
|  | 16 | +
 |  
| 12 | 17 |      <script src="">"chrome://browser/content/torpreferences/bridgeQrDialog.js" />
 |  
| 13 | 18 |  
 |  
| 14 | 19 |      <html:div id="bridgeQr">
 |  browser/components/torpreferences/content/builtinBridgeDialog.js
 
 
| 1 | 1 |  "use strict";
 |  
| 2 | 2 |  
 |  
| 3 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 4 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 5 |  | -);
 |  
| 6 |  | -
 |  
| 7 | 3 |  const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule(
 |  
| 8 | 4 |    "resource://gre/modules/TorSettings.sys.mjs"
 |  
| 9 | 5 |  );
 |  
| ... | ... | @@ -16,34 +12,10 @@ const gBuiltinBridgeDialog = { |  
| 16 | 12 |    init() {
 |  
| 17 | 13 |      this._result = window.arguments[0];
 |  
| 18 | 14 |  
 |  
| 19 |  | -    document.documentElement.setAttribute(
 |  
| 20 |  | -      "title",
 |  
| 21 |  | -      TorStrings.settings.builtinBridgeHeader
 |  
| 22 |  | -    );
 |  
| 23 |  | -
 |  
| 24 |  | -    document.getElementById(
 |  
| 25 |  | -      "torPreferences-builtinBridge-description"
 |  
| 26 |  | -    ).textContent = TorStrings.settings.builtinBridgeDescription2;
 |  
| 27 |  | -
 |  
| 28 | 15 |      this._radioGroup = document.getElementById(
 |  
| 29 | 16 |        "torPreferences-builtinBridge-typeSelection"
 |  
| 30 | 17 |      );
 |  
| 31 | 18 |  
 |  
| 32 |  | -    const typeStrings = {
 |  
| 33 |  | -      obfs4: {
 |  
| 34 |  | -        label: TorStrings.settings.builtinBridgeObfs4Title,
 |  
| 35 |  | -        descr: TorStrings.settings.builtinBridgeObfs4Description2,
 |  
| 36 |  | -      },
 |  
| 37 |  | -      snowflake: {
 |  
| 38 |  | -        label: TorStrings.settings.builtinBridgeSnowflake,
 |  
| 39 |  | -        descr: TorStrings.settings.builtinBridgeSnowflakeDescription2,
 |  
| 40 |  | -      },
 |  
| 41 |  | -      "meek-azure": {
 |  
| 42 |  | -        label: TorStrings.settings.builtinBridgeMeekAzure,
 |  
| 43 |  | -        descr: TorStrings.settings.builtinBridgeMeekAzureDescription2,
 |  
| 44 |  | -      },
 |  
| 45 |  | -    };
 |  
| 46 |  | -
 |  
| 47 | 19 |      const currentBuiltinType =
 |  
| 48 | 20 |        TorSettings.bridges.enabled &&
 |  
| 49 | 21 |        TorSettings.bridges.source == TorBridgeSource.BuiltIn
 |  
| ... | ... | @@ -56,16 +28,18 @@ const gBuiltinBridgeDialog = { |  
| 56 | 28 |        const radio = optionEl.querySelector("radio");
 |  
| 57 | 29 |        const type = radio.value;
 |  
| 58 | 30 |        optionEl.hidden = !TorSettings.builtinBridgeTypes.includes(type);
 |  
| 59 |  | -      radio.label = typeStrings[type].label;
 |  
|  | 31 | +
 |  
| 60 | 32 |        const descriptionEl = optionEl.querySelector(
 |  
| 61 | 33 |          ".builtin-bridges-option-description"
 |  
| 62 | 34 |        );
 |  
| 63 |  | -      descriptionEl.textContent = typeStrings[type].descr;
 |  
|  | 35 | +      // Set an id to be used for the aria-describedby.
 |  
|  | 36 | +      descriptionEl.id = `builtin-bridges-description-${type}`;
 |  
| 64 | 37 |        const currentBadge = optionEl.querySelector(".bridge-status-badge");
 |  
| 65 | 38 |        if (type === currentBuiltinType) {
 |  
| 66 | 39 |          const currentLabelEl = optionEl.querySelector(
 |  
| 67 | 40 |            ".torPreferences-current-bridge-label"
 |  
| 68 | 41 |          );
 |  
|  | 42 | +        currentLabelEl.id = `builtin-bridges-current-${type}`;
 |  
| 69 | 43 |          // Described by both the current badge and the full description.
 |  
| 70 | 44 |          // These will be concatenated together in the screen reader output.
 |  
| 71 | 45 |          radio.setAttribute(
 |  
| ... | ... | @@ -77,6 +51,7 @@ const gBuiltinBridgeDialog = { |  
| 77 | 51 |        } else {
 |  
| 78 | 52 |          // No visible badge.
 |  
| 79 | 53 |          radio.setAttribute("aria-describedby", descriptionEl.id);
 |  
|  | 54 | +        currentBadge.classList.remove("bridge-status-current-built-in");
 |  
| 80 | 55 |        }
 |  
| 81 | 56 |      }
 |  
| 82 | 57 |  
 |  
| ... | ... | @@ -117,10 +92,8 @@ const gBuiltinBridgeDialog = { |  
| 117 | 92 |      const connect = TorConnect.canBeginBootstrap;
 |  
| 118 | 93 |      this._result.connect = connect;
 |  
| 119 | 94 |      this._acceptButton.setAttribute(
 |  
| 120 |  | -      "label",
 |  
| 121 |  | -      connect
 |  
| 122 |  | -        ? TorStrings.settings.bridgeButtonConnect
 |  
| 123 |  | -        : TorStrings.settings.bridgeButtonAccept
 |  
|  | 95 | +      "data-l10n-id",
 |  
|  | 96 | +      connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-accept"
 |  
| 124 | 97 |      );
 |  
| 125 | 98 |    },
 |  
| 126 | 99 |  
 |  browser/components/torpreferences/content/builtinBridgeDialog.xhtml
 
 
| ... | ... | @@ -7,26 +7,30 @@ |  
| 7 | 7 |    type="child"
 |  
| 8 | 8 |    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 |  
| 9 | 9 |    xmlns:html="http://www.w3.org/1999/xhtml"
 |  
|  | 10 | +  data-l10n-id="built-in-dialog-title"
 |  
| 10 | 11 |  >
 |  
| 11 | 12 |    <dialog id="torPreferences-builtinBridge-dialog" buttons="accept,cancel">
 |  
| 12 | 13 |      <linkset>
 |  
|  | 14 | +      <html:link rel="localization" href="">"branding/brand.ftl" />
 |  
| 13 | 15 |        <html:link rel="localization" href="">"browser/tor-browser.ftl" />
 |  
| 14 | 16 |      </linkset>
 |  
| 15 | 17 |  
 |  
| 16 | 18 |      <script src="">"chrome://browser/content/torpreferences/builtinBridgeDialog.js" />
 |  
| 17 | 19 |  
 |  
| 18 |  | -    <description id="torPreferences-builtinBridge-description"> </description>
 |  
|  | 20 | +    <description data-l10n-id="built-in-dialog-introduction"></description>
 |  
| 19 | 21 |      <radiogroup id="torPreferences-builtinBridge-typeSelection">
 |  
| 20 | 22 |        <vbox class="builtin-bridges-option">
 |  
| 21 | 23 |          <hbox>
 |  
| 22 | 24 |            <!-- The radio option is described by both the "Current bridge" label
 |  
| 23 | 25 |            - and the full description. If the "Connected" label is hidden, then
 |  
| 24 | 26 |             - only the latter description should contribute. -->
 |  
| 25 |  | -          <radio value="obfs4" />
 |  
|  | 27 | +          <radio
 |  
|  | 28 | +            value="obfs4"
 |  
|  | 29 | +            data-l10n-id="built-in-dialog-obfs4-radio-option"
 |  
|  | 30 | +          />
 |  
| 26 | 31 |            <html:span class="bridge-status-badge">
 |  
| 27 | 32 |              <html:div class="bridge-status-icon"></html:div>
 |  
| 28 | 33 |              <html:span
 |  
| 29 |  | -              id="obfs-bridges-current"
 |  
| 30 | 34 |                class="torPreferences-current-bridge-label"
 |  
| 31 | 35 |                data-l10n-id="built-in-dialog-current-bridge-label"
 |  
| 32 | 36 |              >
 |  
| ... | ... | @@ -34,18 +38,20 @@ |  
| 34 | 38 |            </html:span>
 |  
| 35 | 39 |          </hbox>
 |  
| 36 | 40 |          <html:div
 |  
| 37 |  | -          id="obfs-bridges-description"
 |  
| 38 | 41 |            class="indent builtin-bridges-option-description"
 |  
|  | 42 | +          data-l10n-id="tor-bridges-built-in-obfs4-description"
 |  
| 39 | 43 |          >
 |  
| 40 | 44 |          </html:div>
 |  
| 41 | 45 |        </vbox>
 |  
| 42 | 46 |        <vbox class="builtin-bridges-option">
 |  
| 43 | 47 |          <hbox>
 |  
| 44 |  | -          <radio value="snowflake" />
 |  
|  | 48 | +          <radio
 |  
|  | 49 | +            value="snowflake"
 |  
|  | 50 | +            data-l10n-id="built-in-dialog-snowflake-radio-option"
 |  
|  | 51 | +          />
 |  
| 45 | 52 |            <html:span class="bridge-status-badge">
 |  
| 46 | 53 |              <html:div class="bridge-status-icon"></html:div>
 |  
| 47 | 54 |              <html:span
 |  
| 48 |  | -              id="snowflake-bridges-current"
 |  
| 49 | 55 |                class="torPreferences-current-bridge-label"
 |  
| 50 | 56 |                data-l10n-id="built-in-dialog-current-bridge-label"
 |  
| 51 | 57 |              >
 |  
| ... | ... | @@ -53,18 +59,20 @@ |  
| 53 | 59 |            </html:span>
 |  
| 54 | 60 |          </hbox>
 |  
| 55 | 61 |          <html:div
 |  
| 56 |  | -          id="snowflake-bridges-description"
 |  
| 57 | 62 |            class="indent builtin-bridges-option-description"
 |  
|  | 63 | +          data-l10n-id="tor-bridges-built-in-snowflake-description"
 |  
| 58 | 64 |          >
 |  
| 59 | 65 |          </html:div>
 |  
| 60 | 66 |        </vbox>
 |  
| 61 | 67 |        <vbox class="builtin-bridges-option">
 |  
| 62 | 68 |          <hbox>
 |  
| 63 |  | -          <radio value="meek-azure" />
 |  
|  | 69 | +          <radio
 |  
|  | 70 | +            value="meek-azure"
 |  
|  | 71 | +            data-l10n-id="built-in-dialog-meek-azure-radio-option"
 |  
|  | 72 | +          />
 |  
| 64 | 73 |            <html:span class="bridge-status-badge">
 |  
| 65 | 74 |              <html:div class="bridge-status-icon"></html:div>
 |  
| 66 | 75 |              <html:span
 |  
| 67 |  | -              id="meek-bridges-current"
 |  
| 68 | 76 |                class="torPreferences-current-bridge-label"
 |  
| 69 | 77 |                data-l10n-id="built-in-dialog-current-bridge-label"
 |  
| 70 | 78 |              >
 |  
| ... | ... | @@ -72,8 +80,8 @@ |  
| 72 | 80 |            </html:span>
 |  
| 73 | 81 |          </hbox>
 |  
| 74 | 82 |          <html:div
 |  
| 75 |  | -          id="meek-bridges-description"
 |  
| 76 | 83 |            class="indent builtin-bridges-option-description"
 |  
|  | 84 | +          data-l10n-id="tor-bridges-built-in-meek-azure-description"
 |  
| 77 | 85 |          >
 |  
| 78 | 86 |          </html:div>
 |  
| 79 | 87 |        </vbox>
 |  browser/components/torpreferences/content/connectionCategory.inc.xhtml
 
 
| ... | ... | @@ -5,5 +5,5 @@ |  
| 5 | 5 |                align="center"
 |  
| 6 | 6 |                hidden="true">
 |  
| 7 | 7 |    <image class="category-icon"/>
 |  
| 8 |  | -  <label id="torPreferences-labelCategory" class="category-name" flex="1" value="Connection"/>
 |  
|  | 8 | +  <label class="category-name" flex="1" data-l10n-id="tor-connection-settings-heading"></label>
 |  
| 9 | 9 |  </richlistitem> |  browser/components/torpreferences/content/connectionPane.js
 
 
| ... | ... | @@ -1088,18 +1088,17 @@ const gBuiltinBridgesArea = { |  
| 1088 | 1088 |     * @type {Object<string,object>}
 |  
| 1089 | 1089 |     */
 |  
| 1090 | 1090 |    _bridgeTypeStrings: {
 |  
| 1091 |  | -    // TODO: Change to Fluent ids.
 |  
| 1092 | 1091 |      obfs4: {
 |  
| 1093 |  | -      name: TorStrings.settings.builtinBridgeObfs4Title,
 |  
| 1094 |  | -      description: TorStrings.settings.builtinBridgeObfs4Description2,
 |  
|  | 1092 | +      name: "tor-bridges-built-in-obfs4-name",
 |  
|  | 1093 | +      description: "tor-bridges-built-in-obfs4-description",
 |  
| 1095 | 1094 |      },
 |  
| 1096 | 1095 |      snowflake: {
 |  
| 1097 |  | -      name: TorStrings.settings.builtinBridgeSnowflake,
 |  
| 1098 |  | -      description: TorStrings.settings.builtinBridgeSnowflakeDescription2,
 |  
|  | 1096 | +      name: "tor-bridges-built-in-snowflake-name",
 |  
|  | 1097 | +      description: "tor-bridges-built-in-snowflake-description",
 |  
| 1099 | 1098 |      },
 |  
| 1100 | 1099 |      "meek-azure": {
 |  
| 1101 |  | -      name: TorStrings.settings.builtinBridgeMeekAzure,
 |  
| 1102 |  | -      description: TorStrings.settings.builtinBridgeMeekAzureDescription2,
 |  
|  | 1100 | +      name: "tor-bridges-built-in-meek-azure-name",
 |  
|  | 1101 | +      description: "tor-bridges-built-in-meek-azure-description",
 |  
| 1103 | 1102 |      },
 |  
| 1104 | 1103 |    },
 |  
| 1105 | 1104 |  
 |  
| ... | ... | @@ -1151,15 +1150,11 @@ const gBuiltinBridgesArea = { |  
| 1151 | 1150 |  
 |  
| 1152 | 1151 |        const bridgeStrings = this._bridgeTypeStrings[bridgeType];
 |  
| 1153 | 1152 |        if (bridgeStrings) {
 |  
| 1154 |  | -        /*
 |  
| 1155 | 1153 |          document.l10n.setAttributes(this._nameEl, bridgeStrings.name);
 |  
| 1156 | 1154 |          document.l10n.setAttributes(
 |  
| 1157 | 1155 |            this._descriptionEl,
 |  
| 1158 | 1156 |            bridgeStrings.description
 |  
| 1159 | 1157 |          );
 |  
| 1160 |  | -        */
 |  
| 1161 |  | -        this._nameEl.textContent = bridgeStrings.name;
 |  
| 1162 |  | -        this._descriptionEl.textContent = bridgeStrings.description;
 |  
| 1163 | 1158 |        } else {
 |  
| 1164 | 1159 |          // Unknown type, or no type.
 |  
| 1165 | 1160 |          this._nameEl.removeAttribute("data-l10n-id");
 |  
| ... | ... | @@ -2075,7 +2070,7 @@ const gBridgeSettings = { |  
| 2075 | 2070 |      // "Remove all bridges"?
 |  
| 2076 | 2071 |      document
 |  
| 2077 | 2072 |        .getElementById("tor-bridges-options-remove-all-menu-item")
 |  
| 2078 |  | -      .addEventListener("click", () => {
 |  
|  | 2073 | +      .addEventListener("click", async () => {
 |  
| 2079 | 2074 |          // TODO: Should we only have a warning when not built-in?
 |  
| 2080 | 2075 |          const parentWindow =
 |  
| 2081 | 2076 |            Services.wm.getMostRecentWindow("navigator:browser");
 |  
| ... | ... | @@ -2085,13 +2080,20 @@ const gBridgeSettings = { |  
| 2085 | 2080 |            Services.prompt.BUTTON_POS_0_DEFAULT +
 |  
| 2086 | 2081 |            Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL;
 |  
| 2087 | 2082 |  
 |  
|  | 2083 | +        const [titleString, bodyString, removeString] =
 |  
|  | 2084 | +          await document.l10n.formatValues([
 |  
|  | 2085 | +            { id: "remove-all-bridges-warning-title" },
 |  
|  | 2086 | +            { id: "remove-all-bridges-warning-description" },
 |  
|  | 2087 | +            { id: "remove-all-bridges-warning-remove-button" },
 |  
|  | 2088 | +          ]);
 |  
|  | 2089 | +
 |  
| 2088 | 2090 |          // TODO: Update the text, and remove old strings.
 |  
| 2089 | 2091 |          const buttonIndex = Services.prompt.confirmEx(
 |  
| 2090 | 2092 |            parentWindow,
 |  
| 2091 |  | -          TorStrings.settings.bridgeRemoveAllDialogTitle,
 |  
| 2092 |  | -          TorStrings.settings.bridgeRemoveAllDialogDescription,
 |  
|  | 2093 | +          titleString,
 |  
|  | 2094 | +          bodyString,
 |  
| 2093 | 2095 |            flags,
 |  
| 2094 |  | -          TorStrings.settings.remove,
 |  
|  | 2096 | +          removeString,
 |  
| 2095 | 2097 |            null,
 |  
| 2096 | 2098 |            null,
 |  
| 2097 | 2099 |            null,
 |  
| ... | ... | @@ -2289,36 +2291,13 @@ const gBridgeSettings = { |  
| 2289 | 2291 |  const gConnectionPane = (function () {
 |  
| 2290 | 2292 |    /* CSS selectors for all of the Tor Network DOM elements we need to access */
 |  
| 2291 | 2293 |    const selectors = {
 |  
| 2292 |  | -    category: {
 |  
| 2293 |  | -      title: "label#torPreferences-labelCategory",
 |  
| 2294 |  | -    },
 |  
| 2295 |  | -    torPreferences: {
 |  
| 2296 |  | -      header: "h1#torPreferences-header",
 |  
| 2297 |  | -      description: "span#torPreferences-description",
 |  
| 2298 |  | -      learnMore: "label#torPreferences-learnMore",
 |  
| 2299 |  | -    },
 |  
| 2300 |  | -    quickstart: {
 |  
| 2301 |  | -      header: "h2#torPreferences-quickstart-header",
 |  
| 2302 |  | -      description: "span#torPreferences-quickstart-description",
 |  
| 2303 |  | -      enableQuickstartCheckbox: "checkbox#torPreferences-quickstart-toggle",
 |  
| 2304 |  | -    },
 |  
| 2305 | 2294 |      bridges: {
 |  
| 2306 |  | -      header: "h1#torPreferences-bridges-header",
 |  
| 2307 |  | -      description: "span#torPreferences-bridges-description",
 |  
| 2308 |  | -      learnMore: "label#torPreferences-bridges-learnMore",
 |  
| 2309 | 2295 |        locationGroup: "#torPreferences-bridges-locationGroup",
 |  
| 2310 | 2296 |        locationLabel: "#torPreferences-bridges-locationLabel",
 |  
| 2311 | 2297 |        location: "#torPreferences-bridges-location",
 |  
| 2312 | 2298 |        locationEntries: "#torPreferences-bridges-locationEntries",
 |  
| 2313 | 2299 |        chooseForMe: "#torPreferences-bridges-buttonChooseBridgeForMe",
 |  
| 2314 | 2300 |      },
 |  
| 2315 |  | -    advanced: {
 |  
| 2316 |  | -      header: "h1#torPreferences-advanced-header",
 |  
| 2317 |  | -      label: "#torPreferences-advanced-label",
 |  
| 2318 |  | -      button: "#torPreferences-advanced-button",
 |  
| 2319 |  | -      torLogsLabel: "label#torPreferences-torLogs",
 |  
| 2320 |  | -      torLogsButton: "button#torPreferences-buttonTorLogs",
 |  
| 2321 |  | -    },
 |  
| 2322 | 2301 |    }; /* selectors */
 |  
| 2323 | 2302 |  
 |  
| 2324 | 2303 |    const retval = {
 |  
| ... | ... | @@ -2342,96 +2321,62 @@ const gConnectionPane = (function () { |  
| 2342 | 2321 |          }
 |  
| 2343 | 2322 |        });
 |  
| 2344 | 2323 |  
 |  
| 2345 |  | -      document
 |  
| 2346 |  | -        .querySelector(selectors.category.title)
 |  
| 2347 |  | -        .setAttribute("value", TorStrings.settings.categoryTitle);
 |  
| 2348 |  | -
 |  
| 2349 |  | -      const prefpane = document.getElementById("mainPrefPane");
 |  
| 2350 |  | -
 |  
| 2351 |  | -      // Heading
 |  
| 2352 |  | -      prefpane.querySelector(selectors.torPreferences.header).innerText =
 |  
| 2353 |  | -        TorStrings.settings.categoryTitle;
 |  
| 2354 |  | -      prefpane.querySelector(selectors.torPreferences.description).textContent =
 |  
| 2355 |  | -        TorStrings.settings.torPreferencesDescription;
 |  
| 2356 |  | -      {
 |  
| 2357 |  | -        const learnMore = prefpane.querySelector(
 |  
| 2358 |  | -          selectors.torPreferences.learnMore
 |  
| 2359 |  | -        );
 |  
| 2360 |  | -        learnMore.setAttribute("value", TorStrings.settings.learnMore);
 |  
| 2361 |  | -        learnMore.setAttribute(
 |  
| 2362 |  | -          "href",
 |  
| 2363 |  | -          TorStrings.settings.learnMoreTorBrowserURL
 |  
| 2364 |  | -        );
 |  
| 2365 |  | -        if (TorStrings.settings.learnMoreTorBrowserURL.startsWith("about:")) {
 |  
| 2366 |  | -          learnMore.setAttribute("useoriginprincipal", "true");
 |  
| 2367 |  | -        }
 |  
| 2368 |  | -      }
 |  
| 2369 |  | -
 |  
| 2370 | 2324 |        // Internet and Tor status
 |  
| 2371 | 2325 |        const internetStatus = document.getElementById(
 |  
| 2372 | 2326 |          "torPreferences-status-internet"
 |  
| 2373 | 2327 |        );
 |  
| 2374 |  | -      internetStatus.querySelector(".torPreferences-status-name").textContent =
 |  
| 2375 |  | -        TorStrings.settings.statusInternetLabel;
 |  
| 2376 | 2328 |        const internetResult = internetStatus.querySelector(
 |  
| 2377 | 2329 |          ".torPreferences-status-result"
 |  
| 2378 | 2330 |        );
 |  
| 2379 | 2331 |        const internetTest = document.getElementById(
 |  
| 2380 | 2332 |          "torPreferences-status-internet-test"
 |  
| 2381 | 2333 |        );
 |  
| 2382 |  | -      internetTest.setAttribute(
 |  
| 2383 |  | -        "label",
 |  
| 2384 |  | -        TorStrings.settings.statusInternetTest
 |  
| 2385 |  | -      );
 |  
| 2386 |  | -      internetTest.addEventListener("command", () => {
 |  
|  | 2334 | +      internetTest.addEventListener("click", () => {
 |  
| 2387 | 2335 |          this.onInternetTest();
 |  
| 2388 | 2336 |        });
 |  
| 2389 | 2337 |  
 |  
| 2390 | 2338 |        const torConnectStatus = document.getElementById(
 |  
| 2391 | 2339 |          "torPreferences-status-tor-connect"
 |  
| 2392 | 2340 |        );
 |  
| 2393 |  | -      torConnectStatus.querySelector(
 |  
| 2394 |  | -        ".torPreferences-status-name"
 |  
| 2395 |  | -      ).textContent = TorStrings.settings.statusTorLabel;
 |  
| 2396 | 2341 |        const torConnectResult = torConnectStatus.querySelector(
 |  
| 2397 | 2342 |          ".torPreferences-status-result"
 |  
| 2398 | 2343 |        );
 |  
| 2399 | 2344 |        const torConnectButton = document.getElementById(
 |  
| 2400 | 2345 |          "torPreferences-status-tor-connect-button"
 |  
| 2401 | 2346 |        );
 |  
| 2402 |  | -      torConnectButton.setAttribute(
 |  
| 2403 |  | -        "label",
 |  
| 2404 |  | -        TorStrings.torConnect.torConnectButton
 |  
| 2405 |  | -      );
 |  
| 2406 |  | -      torConnectButton.addEventListener("command", () => {
 |  
|  | 2347 | +      torConnectButton.addEventListener("click", () => {
 |  
| 2407 | 2348 |          TorConnect.openTorConnect({ beginBootstrap: true });
 |  
| 2408 | 2349 |        });
 |  
| 2409 | 2350 |  
 |  
| 2410 | 2351 |        this._populateStatus = () => {
 |  
|  | 2352 | +        let internetId;
 |  
| 2411 | 2353 |          switch (this._internetStatus) {
 |  
| 2412 | 2354 |            case InternetStatus.Online:
 |  
| 2413 | 2355 |              internetStatus.classList.remove("offline");
 |  
| 2414 |  | -            internetResult.textContent =
 |  
| 2415 |  | -              TorStrings.settings.statusInternetOnline;
 |  
| 2416 |  | -            internetResult.hidden = false;
 |  
|  | 2356 | +            internetId = "tor-connection-internet-status-online";
 |  
| 2417 | 2357 |              break;
 |  
| 2418 | 2358 |            case InternetStatus.Offline:
 |  
| 2419 | 2359 |              internetStatus.classList.add("offline");
 |  
| 2420 |  | -            internetResult.textContent =
 |  
| 2421 |  | -              TorStrings.settings.statusInternetOffline;
 |  
| 2422 |  | -            internetResult.hidden = false;
 |  
|  | 2360 | +            internetId = "tor-connection-internet-status-offline";
 |  
| 2423 | 2361 |              break;
 |  
| 2424 | 2362 |            case InternetStatus.Unknown:
 |  
| 2425 | 2363 |            default:
 |  
| 2426 | 2364 |              internetStatus.classList.remove("offline");
 |  
| 2427 |  | -            internetResult.hidden = true;
 |  
| 2428 | 2365 |              break;
 |  
| 2429 | 2366 |          }
 |  
|  | 2367 | +        if (internetId) {
 |  
|  | 2368 | +          document.l10n.setAttributes(internetResult, internetId);
 |  
|  | 2369 | +          internetResult.hidden = false;
 |  
|  | 2370 | +        } else {
 |  
|  | 2371 | +          internetResult.hidden = true;
 |  
|  | 2372 | +        }
 |  
|  | 2373 | +
 |  
|  | 2374 | +        let connectId;
 |  
| 2430 | 2375 |          // FIXME: What about the TorConnectState.Disabled state?
 |  
| 2431 | 2376 |          if (TorConnect.state === TorConnectState.Bootstrapped) {
 |  
| 2432 | 2377 |            torConnectStatus.classList.add("connected");
 |  
| 2433 | 2378 |            torConnectStatus.classList.remove("blocked");
 |  
| 2434 |  | -          torConnectResult.textContent = TorStrings.settings.statusTorConnected;
 |  
|  | 2379 | +          connectId = "tor-connection-network-status-connected";
 |  
| 2435 | 2380 |            // NOTE: If the button is focused when we hide it, the focus may be
 |  
| 2436 | 2381 |            // lost. But we don't have an obvious place to put the focus instead.
 |  
| 2437 | 2382 |            torConnectButton.hidden = true;
 |  
| ... | ... | @@ -2441,26 +2386,18 @@ const gConnectionPane = (function () { |  
| 2441 | 2386 |              "blocked",
 |  
| 2442 | 2387 |              TorConnect.potentiallyBlocked
 |  
| 2443 | 2388 |            );
 |  
| 2444 |  | -          torConnectResult.textContent = TorConnect.potentiallyBlocked
 |  
| 2445 |  | -            ? TorStrings.settings.statusTorBlocked
 |  
| 2446 |  | -            : TorStrings.settings.statusTorNotConnected;
 |  
|  | 2389 | +          connectId = TorConnect.potentiallyBlocked
 |  
|  | 2390 | +            ? "tor-connection-network-status-blocked"
 |  
|  | 2391 | +            : "tor-connection-network-status-not-connected";
 |  
| 2447 | 2392 |            torConnectButton.hidden = false;
 |  
| 2448 | 2393 |          }
 |  
|  | 2394 | +        document.l10n.setAttributes(torConnectResult, connectId);
 |  
| 2449 | 2395 |        };
 |  
| 2450 | 2396 |        this._populateStatus();
 |  
| 2451 | 2397 |  
 |  
| 2452 | 2398 |        // Quickstart
 |  
| 2453 |  | -      prefpane.querySelector(selectors.quickstart.header).innerText =
 |  
| 2454 |  | -        TorStrings.settings.quickstartHeading;
 |  
| 2455 |  | -      prefpane.querySelector(selectors.quickstart.description).textContent =
 |  
| 2456 |  | -        TorStrings.settings.quickstartDescription;
 |  
| 2457 |  | -
 |  
| 2458 |  | -      this._enableQuickstartCheckbox = prefpane.querySelector(
 |  
| 2459 |  | -        selectors.quickstart.enableQuickstartCheckbox
 |  
| 2460 |  | -      );
 |  
| 2461 |  | -      this._enableQuickstartCheckbox.setAttribute(
 |  
| 2462 |  | -        "label",
 |  
| 2463 |  | -        TorStrings.settings.quickstartCheckbox
 |  
|  | 2399 | +      this._enableQuickstartCheckbox = document.getElementById(
 |  
|  | 2400 | +        "torPreferences-quickstart-toggle"
 |  
| 2464 | 2401 |        );
 |  
| 2465 | 2402 |        this._enableQuickstartCheckbox.addEventListener("command", e => {
 |  
| 2466 | 2403 |          const checked = this._enableQuickstartCheckbox.checked;
 |  
| ... | ... | @@ -2470,22 +2407,10 @@ const gConnectionPane = (function () { |  
| 2470 | 2407 |        this._enableQuickstartCheckbox.checked = TorSettings.quickstart.enabled;
 |  
| 2471 | 2408 |        Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
 |  
| 2472 | 2409 |  
 |  
| 2473 |  | -      // Bridge setup
 |  
| 2474 |  | -      prefpane.querySelector(selectors.bridges.header).innerText =
 |  
| 2475 |  | -        TorStrings.settings.bridgesHeading;
 |  
| 2476 |  | -      prefpane.querySelector(selectors.bridges.description).textContent =
 |  
| 2477 |  | -        TorStrings.settings.bridgesDescription2;
 |  
| 2478 |  | -      {
 |  
| 2479 |  | -        const learnMore = prefpane.querySelector(selectors.bridges.learnMore);
 |  
| 2480 |  | -        learnMore.setAttribute("value", TorStrings.settings.learnMore);
 |  
| 2481 |  | -        learnMore.setAttribute("href", TorStrings.settings.learnMoreBridgesURL);
 |  
| 2482 |  | -        if (TorStrings.settings.learnMoreBridgesURL.startsWith("about:")) {
 |  
| 2483 |  | -          learnMore.setAttribute("useoriginprincipal", "true");
 |  
| 2484 |  | -        }
 |  
| 2485 |  | -      }
 |  
| 2486 |  | -
 |  
| 2487 | 2410 |        // Location
 |  
| 2488 | 2411 |        {
 |  
|  | 2412 | +        const prefpane = document.getElementById("mainPrefPane");
 |  
|  | 2413 | +
 |  
| 2489 | 2414 |          const locationGroup = prefpane.querySelector(
 |  
| 2490 | 2415 |            selectors.bridges.locationGroup
 |  
| 2491 | 2416 |          );
 |  
| ... | ... | @@ -2571,33 +2496,18 @@ const gConnectionPane = (function () { |  
| 2571 | 2496 |        }
 |  
| 2572 | 2497 |  
 |  
| 2573 | 2498 |        // Advanced setup
 |  
| 2574 |  | -      prefpane.querySelector(selectors.advanced.header).innerText =
 |  
| 2575 |  | -        TorStrings.settings.advancedHeading;
 |  
| 2576 |  | -      prefpane.querySelector(selectors.advanced.label).textContent =
 |  
| 2577 |  | -        TorStrings.settings.advancedLabel;
 |  
| 2578 |  | -      {
 |  
| 2579 |  | -        const settingsButton = prefpane.querySelector(
 |  
| 2580 |  | -          selectors.advanced.button
 |  
| 2581 |  | -        );
 |  
| 2582 |  | -        settingsButton.setAttribute(
 |  
| 2583 |  | -          "label",
 |  
| 2584 |  | -          TorStrings.settings.advancedButton
 |  
| 2585 |  | -        );
 |  
| 2586 |  | -        settingsButton.addEventListener("command", () => {
 |  
|  | 2499 | +      document
 |  
|  | 2500 | +        .getElementById("torPreferences-advanced-button")
 |  
|  | 2501 | +        .addEventListener("click", () => {
 |  
| 2587 | 2502 |            this.onAdvancedSettings();
 |  
| 2588 | 2503 |          });
 |  
| 2589 |  | -      }
 |  
| 2590 | 2504 |  
 |  
| 2591 | 2505 |        // Tor logs
 |  
| 2592 |  | -      prefpane.querySelector(selectors.advanced.torLogsLabel).textContent =
 |  
| 2593 |  | -        TorStrings.settings.showTorDaemonLogs;
 |  
| 2594 |  | -      const torLogsButton = prefpane.querySelector(
 |  
| 2595 |  | -        selectors.advanced.torLogsButton
 |  
| 2596 |  | -      );
 |  
| 2597 |  | -      torLogsButton.setAttribute("label", TorStrings.settings.showLogs);
 |  
| 2598 |  | -      torLogsButton.addEventListener("command", () => {
 |  
| 2599 |  | -        this.onViewTorLogs();
 |  
| 2600 |  | -      });
 |  
|  | 2506 | +      document
 |  
|  | 2507 | +        .getElementById("torPreferences-buttonTorLogs")
 |  
|  | 2508 | +        .addEventListener("click", () => {
 |  
|  | 2509 | +          this.onViewTorLogs();
 |  
|  | 2510 | +        });
 |  
| 2601 | 2511 |  
 |  
| 2602 | 2512 |        Services.obs.addObserver(this, TorConnectTopics.StateChange);
 |  
| 2603 | 2513 |      },
 |  browser/components/torpreferences/content/connectionPane.xhtml
 
 
| ... | ... | @@ -11,16 +11,21 @@ |  
| 11 | 11 |      data-category="paneConnection"
 |  
| 12 | 12 |      hidden="true"
 |  
| 13 | 13 |    >
 |  
| 14 |  | -    <html:h1 id="torPreferences-header" />
 |  
|  | 14 | +    <html:h1 data-l10n-id="tor-connection-settings-heading"></html:h1>
 |  
| 15 | 15 |    </hbox>
 |  
| 16 | 16 |  
 |  
| 17 | 17 |    <groupbox data-category="paneConnection" hidden="true">
 |  
| 18 | 18 |      <description flex="1">
 |  
| 19 |  | -      <html:span id="torPreferences-description" class="tail-with-learn-more" />
 |  
|  | 19 | +      <html:span
 |  
|  | 20 | +        data-l10n-id="tor-connection-overview"
 |  
|  | 21 | +        class="tail-with-learn-more"
 |  
|  | 22 | +      ></html:span>
 |  
| 20 | 23 |        <label
 |  
| 21 |  | -        id="torPreferences-learnMore"
 |  
| 22 | 24 |          class="learnMore text-link"
 |  
| 23 | 25 |          is="text-link"
 |  
|  | 26 | +        href="about:manual#about"
 |  
|  | 27 | +        useoriginprincipal="true"
 |  
|  | 28 | +        data-l10n-id="tor-connection-browser-learn-more-link"
 |  
| 24 | 29 |        />
 |  
| 25 | 30 |      </description>
 |  
| 26 | 31 |    </groupbox>
 |  
| ... | ... | @@ -36,33 +41,45 @@ |  
| 36 | 41 |          class="torPreferences-status-grouping"
 |  
| 37 | 42 |        >
 |  
| 38 | 43 |          <image class="torPreferences-status-icon" />
 |  
| 39 |  | -        <html:span class="torPreferences-status-name"></html:span>
 |  
|  | 44 | +        <html:span
 |  
|  | 45 | +          class="torPreferences-status-name"
 |  
|  | 46 | +          data-l10n-id="tor-connection-internet-status-label"
 |  
|  | 47 | +        ></html:span>
 |  
| 40 | 48 |          <html:span class="torPreferences-status-result"></html:span>
 |  
| 41 |  | -        <button id="torPreferences-status-internet-test" />
 |  
|  | 49 | +        <html:button
 |  
|  | 50 | +          id="torPreferences-status-internet-test"
 |  
|  | 51 | +          data-l10n-id="tor-connection-internet-status-test-button"
 |  
|  | 52 | +        ></html:button>
 |  
| 42 | 53 |        </hbox>
 |  
| 43 | 54 |        <hbox
 |  
| 44 | 55 |          id="torPreferences-status-tor-connect"
 |  
| 45 | 56 |          class="torPreferences-status-grouping"
 |  
| 46 | 57 |        >
 |  
| 47 | 58 |          <image class="torPreferences-status-icon" />
 |  
| 48 |  | -        <html:span class="torPreferences-status-name"></html:span>
 |  
|  | 59 | +        <html:span
 |  
|  | 60 | +          class="torPreferences-status-name"
 |  
|  | 61 | +          data-l10n-id="tor-connection-network-status-label"
 |  
|  | 62 | +        ></html:span>
 |  
| 49 | 63 |          <html:span class="torPreferences-status-result"></html:span>
 |  
| 50 |  | -        <button id="torPreferences-status-tor-connect-button" />
 |  
|  | 64 | +        <html:button
 |  
|  | 65 | +          id="torPreferences-status-tor-connect-button"
 |  
|  | 66 | +          data-l10n-id="tor-connection-network-status-connect-button"
 |  
|  | 67 | +        ></html:button>
 |  
| 51 | 68 |        </hbox>
 |  
| 52 | 69 |      </hbox>
 |  
| 53 | 70 |    </groupbox>
 |  
| 54 | 71 |  
 |  
| 55 | 72 |    <!-- Quickstart -->
 |  
| 56 |  | -  <groupbox
 |  
| 57 |  | -    id="torPreferences-quickstart-group"
 |  
| 58 |  | -    data-category="paneConnection"
 |  
| 59 |  | -    hidden="true"
 |  
| 60 |  | -  >
 |  
| 61 |  | -    <html:h2 id="torPreferences-quickstart-header" />
 |  
| 62 |  | -    <description flex="1">
 |  
| 63 |  | -      <html:span id="torPreferences-quickstart-description" />
 |  
|  | 73 | +  <groupbox data-category="paneConnection" hidden="true">
 |  
|  | 74 | +    <label>
 |  
|  | 75 | +      <html:h2 data-l10n-id="tor-connection-quickstart-heading"></html:h2>
 |  
|  | 76 | +    </label>
 |  
|  | 77 | +    <description flex="1" data-l10n-id="tor-connection-quickstart-description">
 |  
| 64 | 78 |      </description>
 |  
| 65 |  | -    <checkbox id="torPreferences-quickstart-toggle" />
 |  
|  | 79 | +    <checkbox
 |  
|  | 80 | +      id="torPreferences-quickstart-toggle"
 |  
|  | 81 | +      data-l10n-id="tor-connection-quickstart-checkbox"
 |  
|  | 82 | +    />
 |  
| 66 | 83 |    </groupbox>
 |  
| 67 | 84 |  
 |  
| 68 | 85 |    <!-- Bridges -->
 |  
| ... | ... | @@ -71,6 +88,7 @@ |  
| 71 | 88 |        id="torPreferences-bridges-header"
 |  
| 72 | 89 |        class="tor-focusable-heading"
 |  
| 73 | 90 |        tabindex="-1"
 |  
|  | 91 | +      data-l10n-id="tor-bridges-heading"
 |  
| 74 | 92 |      ></html:h1>
 |  
| 75 | 93 |    </hbox>
 |  
| 76 | 94 |    <groupbox
 |  
| ... | ... | @@ -80,13 +98,15 @@ |  
| 80 | 98 |    >
 |  
| 81 | 99 |      <description flex="1">
 |  
| 82 | 100 |        <html:span
 |  
| 83 |  | -        id="torPreferences-bridges-description"
 |  
| 84 | 101 |          class="tail-with-learn-more"
 |  
|  | 102 | +        data-l10n-id="tor-bridges-overview"
 |  
| 85 | 103 |        />
 |  
| 86 | 104 |        <label
 |  
| 87 |  | -        id="torPreferences-bridges-learnMore"
 |  
| 88 | 105 |          class="learnMore text-link"
 |  
| 89 | 106 |          is="text-link"
 |  
|  | 107 | +        href="about:manual#bridges"
 |  
|  | 108 | +        useoriginprincipal="true"
 |  
|  | 109 | +        data-l10n-id="tor-bridges-learn-more-link"
 |  
| 90 | 110 |        />
 |  
| 91 | 111 |      </description>
 |  
| 92 | 112 |      <hbox
 |  
| ... | ... | @@ -479,7 +499,7 @@ |  
| 479 | 499 |  
 |  
| 480 | 500 |    <!-- Advanced -->
 |  
| 481 | 501 |    <hbox class="subcategory" data-category="paneConnection" hidden="true">
 |  
| 482 |  | -    <html:h1 id="torPreferences-advanced-header" />
 |  
|  | 502 | +    <html:h1 data-l10n-id="tor-advanced-settings-heading"></html:h1>
 |  
| 483 | 503 |    </hbox>
 |  
| 484 | 504 |    <groupbox
 |  
| 485 | 505 |      id="torPreferences-advanced-group"
 |  
| ... | ... | @@ -487,14 +507,20 @@ |  
| 487 | 507 |      hidden="true"
 |  
| 488 | 508 |    >
 |  
| 489 | 509 |      <hbox align="center">
 |  
| 490 |  | -      <label id="torPreferences-advanced-label" flex="1" />
 |  
| 491 |  | -      <button id="torPreferences-advanced-button" class="accessory-button" />
 |  
|  | 510 | +      <label data-l10n-id="tor-advanced-settings-description" flex="1" />
 |  
|  | 511 | +      <html:button
 |  
|  | 512 | +        id="torPreferences-advanced-button"
 |  
|  | 513 | +        class="accessory-button"
 |  
|  | 514 | +        data-l10n-id="tor-advanced-settings-button"
 |  
|  | 515 | +      ></html:button>
 |  
| 492 | 516 |      </hbox>
 |  
| 493 | 517 |      <hbox align="center" data-subcategory="viewlogs">
 |  
| 494 |  | -      <label id="torPreferences-torLogs" flex="1" />
 |  
| 495 |  | -      <vbox>
 |  
| 496 |  | -        <button id="torPreferences-buttonTorLogs" class="accessory-button" />
 |  
| 497 |  | -      </vbox>
 |  
|  | 518 | +      <label data-l10n-id="tor-view-log-description" flex="1" />
 |  
|  | 519 | +      <html:button
 |  
|  | 520 | +        id="torPreferences-buttonTorLogs"
 |  
|  | 521 | +        class="accessory-button"
 |  
|  | 522 | +        data-l10n-id="tor-view-log-button"
 |  
|  | 523 | +      ></html:button>
 |  
| 498 | 524 |      </hbox>
 |  
| 499 | 525 |    </groupbox>
 |  
| 500 | 526 |  </html:template> |  browser/components/torpreferences/content/connectionSettingsDialog.js
 
 
| ... | ... | @@ -4,10 +4,6 @@ const { TorSettings, TorProxyType } = ChromeUtils.importESModule( |  
| 4 | 4 |    "resource://gre/modules/TorSettings.sys.mjs"
 |  
| 5 | 5 |  );
 |  
| 6 | 6 |  
 |  
| 7 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 8 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 9 |  | -);
 |  
| 10 |  | -
 |  
| 11 | 7 |  const gConnectionSettingsDialog = {
 |  
| 12 | 8 |    _useProxyCheckbox: null,
 |  
| 13 | 9 |    _proxyTypeLabel: null,
 |  
| ... | ... | @@ -25,7 +21,6 @@ const gConnectionSettingsDialog = { |  
| 25 | 21 |    _allowedPortsTextbox: null,
 |  
| 26 | 22 |  
 |  
| 27 | 23 |    selectors: {
 |  
| 28 |  | -    header: "#torPreferences-connection-header",
 |  
| 29 | 24 |      useProxyCheckbox: "checkbox#torPreferences-connection-toggleProxy",
 |  
| 30 | 25 |      proxyTypeLabel: "label#torPreferences-localProxy-type",
 |  
| 31 | 26 |      proxyTypeList: "menulist#torPreferences-localProxy-builtinList",
 |  
| ... | ... | @@ -53,36 +48,27 @@ const gConnectionSettingsDialog = { |  
| 53 | 48 |    init() {
 |  
| 54 | 49 |      const selectors = this.selectors;
 |  
| 55 | 50 |  
 |  
| 56 |  | -    document.documentElement.setAttribute(
 |  
| 57 |  | -      "title",
 |  
| 58 |  | -      TorStrings.settings.connectionSettingsDialogTitle
 |  
| 59 |  | -    );
 |  
| 60 |  | -    document.querySelector(selectors.header).textContent =
 |  
| 61 |  | -      TorStrings.settings.connectionSettingsDialogHeader;
 |  
| 62 |  | -
 |  
| 63 | 51 |      // Local Proxy
 |  
| 64 | 52 |      this._useProxyCheckbox = document.querySelector(selectors.useProxyCheckbox);
 |  
| 65 |  | -    this._useProxyCheckbox.setAttribute(
 |  
| 66 |  | -      "label",
 |  
| 67 |  | -      TorStrings.settings.useLocalProxy
 |  
| 68 |  | -    );
 |  
| 69 | 53 |      this._useProxyCheckbox.addEventListener("command", e => {
 |  
| 70 | 54 |        const checked = this._useProxyCheckbox.checked;
 |  
| 71 | 55 |        this.onToggleProxy(checked);
 |  
| 72 | 56 |      });
 |  
| 73 | 57 |      this._proxyTypeLabel = document.querySelector(selectors.proxyTypeLabel);
 |  
| 74 |  | -    this._proxyTypeLabel.setAttribute("value", TorStrings.settings.proxyType);
 |  
| 75 | 58 |  
 |  
| 76 | 59 |      let mockProxies = [
 |  
| 77 | 60 |        {
 |  
| 78 | 61 |          value: TorProxyType.Socks4,
 |  
| 79 |  | -        label: TorStrings.settings.proxyTypeSOCKS4,
 |  
|  | 62 | +        l10nId: "tor-advanced-dialog-proxy-socks4-menuitem",
 |  
| 80 | 63 |        },
 |  
| 81 | 64 |        {
 |  
| 82 | 65 |          value: TorProxyType.Socks5,
 |  
| 83 |  | -        label: TorStrings.settings.proxyTypeSOCKS5,
 |  
|  | 66 | +        l10nId: "tor-advanced-dialog-proxy-socks5-menuitem",
 |  
|  | 67 | +      },
 |  
|  | 68 | +      {
 |  
|  | 69 | +        value: TorProxyType.HTTPS,
 |  
|  | 70 | +        l10nId: "tor-advanced-dialog-proxy-http-menuitem",
 |  
| 84 | 71 |        },
 |  
| 85 |  | -      { value: TorProxyType.HTTPS, label: TorStrings.settings.proxyTypeHTTP },
 |  
| 86 | 72 |      ];
 |  
| 87 | 73 |      this._proxyTypeMenulist = document.querySelector(selectors.proxyTypeList);
 |  
| 88 | 74 |      this._proxyTypeMenulist.addEventListener("command", e => {
 |  
| ... | ... | @@ -92,24 +78,16 @@ const gConnectionSettingsDialog = { |  
| 92 | 78 |      for (let currentProxy of mockProxies) {
 |  
| 93 | 79 |        let menuEntry = window.document.createXULElement("menuitem");
 |  
| 94 | 80 |        menuEntry.setAttribute("value", currentProxy.value);
 |  
| 95 |  | -      menuEntry.setAttribute("label", currentProxy.label);
 |  
|  | 81 | +      menuEntry.setAttribute("data-l10n-id", currentProxy.l10nId);
 |  
| 96 | 82 |        this._proxyTypeMenulist.querySelector("menupopup").appendChild(menuEntry);
 |  
| 97 | 83 |      }
 |  
| 98 | 84 |  
 |  
| 99 | 85 |      this._proxyAddressLabel = document.querySelector(
 |  
| 100 | 86 |        selectors.proxyAddressLabel
 |  
| 101 | 87 |      );
 |  
| 102 |  | -    this._proxyAddressLabel.setAttribute(
 |  
| 103 |  | -      "value",
 |  
| 104 |  | -      TorStrings.settings.proxyAddress
 |  
| 105 |  | -    );
 |  
| 106 | 88 |      this._proxyAddressTextbox = document.querySelector(
 |  
| 107 | 89 |        selectors.proxyAddressTextbox
 |  
| 108 | 90 |      );
 |  
| 109 |  | -    this._proxyAddressTextbox.setAttribute(
 |  
| 110 |  | -      "placeholder",
 |  
| 111 |  | -      TorStrings.settings.proxyAddressPlaceholder
 |  
| 112 |  | -    );
 |  
| 113 | 91 |      this._proxyAddressTextbox.addEventListener("blur", e => {
 |  
| 114 | 92 |        let value = this._proxyAddressTextbox.value.trim();
 |  
| 115 | 93 |        let colon = value.lastIndexOf(":");
 |  
| ... | ... | @@ -122,36 +100,19 @@ const gConnectionSettingsDialog = { |  
| 122 | 100 |        }
 |  
| 123 | 101 |      });
 |  
| 124 | 102 |      this._proxyPortLabel = document.querySelector(selectors.proxyPortLabel);
 |  
| 125 |  | -    this._proxyPortLabel.setAttribute("value", TorStrings.settings.proxyPort);
 |  
| 126 | 103 |      this._proxyPortTextbox = document.querySelector(selectors.proxyPortTextbox);
 |  
| 127 | 104 |      this._proxyUsernameLabel = document.querySelector(
 |  
| 128 | 105 |        selectors.proxyUsernameLabel
 |  
| 129 | 106 |      );
 |  
| 130 |  | -    this._proxyUsernameLabel.setAttribute(
 |  
| 131 |  | -      "value",
 |  
| 132 |  | -      TorStrings.settings.proxyUsername
 |  
| 133 |  | -    );
 |  
| 134 | 107 |      this._proxyUsernameTextbox = document.querySelector(
 |  
| 135 | 108 |        selectors.proxyUsernameTextbox
 |  
| 136 | 109 |      );
 |  
| 137 |  | -    this._proxyUsernameTextbox.setAttribute(
 |  
| 138 |  | -      "placeholder",
 |  
| 139 |  | -      TorStrings.settings.proxyUsernamePasswordPlaceholder
 |  
| 140 |  | -    );
 |  
| 141 | 110 |      this._proxyPasswordLabel = document.querySelector(
 |  
| 142 | 111 |        selectors.proxyPasswordLabel
 |  
| 143 | 112 |      );
 |  
| 144 |  | -    this._proxyPasswordLabel.setAttribute(
 |  
| 145 |  | -      "value",
 |  
| 146 |  | -      TorStrings.settings.proxyPassword
 |  
| 147 |  | -    );
 |  
| 148 | 113 |      this._proxyPasswordTextbox = document.querySelector(
 |  
| 149 | 114 |        selectors.proxyPasswordTextbox
 |  
| 150 | 115 |      );
 |  
| 151 |  | -    this._proxyPasswordTextbox.setAttribute(
 |  
| 152 |  | -      "placeholder",
 |  
| 153 |  | -      TorStrings.settings.proxyUsernamePasswordPlaceholder
 |  
| 154 |  | -    );
 |  
| 155 | 116 |  
 |  
| 156 | 117 |      this.onToggleProxy(false);
 |  
| 157 | 118 |      if (TorSettings.proxy.enabled) {
 |  
| ... | ... | @@ -167,10 +128,6 @@ const gConnectionSettingsDialog = { |  
| 167 | 128 |      this._useFirewallCheckbox = document.querySelector(
 |  
| 168 | 129 |        selectors.useFirewallCheckbox
 |  
| 169 | 130 |      );
 |  
| 170 |  | -    this._useFirewallCheckbox.setAttribute(
 |  
| 171 |  | -      "label",
 |  
| 172 |  | -      TorStrings.settings.useFirewall
 |  
| 173 |  | -    );
 |  
| 174 | 131 |      this._useFirewallCheckbox.addEventListener("command", e => {
 |  
| 175 | 132 |        const checked = this._useFirewallCheckbox.checked;
 |  
| 176 | 133 |        this.onToggleFirewall(checked);
 |  
| ... | ... | @@ -178,17 +135,9 @@ const gConnectionSettingsDialog = { |  
| 178 | 135 |      this._allowedPortsLabel = document.querySelector(
 |  
| 179 | 136 |        selectors.firewallAllowedPortsLabel
 |  
| 180 | 137 |      );
 |  
| 181 |  | -    this._allowedPortsLabel.setAttribute(
 |  
| 182 |  | -      "value",
 |  
| 183 |  | -      TorStrings.settings.allowedPorts
 |  
| 184 |  | -    );
 |  
| 185 | 138 |      this._allowedPortsTextbox = document.querySelector(
 |  
| 186 | 139 |        selectors.firewallAllowedPortsTextbox
 |  
| 187 | 140 |      );
 |  
| 188 |  | -    this._allowedPortsTextbox.setAttribute(
 |  
| 189 |  | -      "placeholder",
 |  
| 190 |  | -      TorStrings.settings.allowedPortsPlaceholder
 |  
| 191 |  | -    );
 |  
| 192 | 141 |  
 |  
| 193 | 142 |      this.onToggleFirewall(false);
 |  
| 194 | 143 |      if (TorSettings.firewall.enabled) {
 |  browser/components/torpreferences/content/connectionSettingsDialog.xhtml
 
 
| ... | ... | @@ -7,16 +7,31 @@ |  
| 7 | 7 |    type="child"
 |  
| 8 | 8 |    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 |  
| 9 | 9 |    xmlns:html="http://www.w3.org/1999/xhtml"
 |  
|  | 10 | +  data-l10n-id="tor-advanced-dialog-title"
 |  
| 10 | 11 |  >
 |  
| 11 | 12 |    <dialog id="torPreferences-connection-dialog" buttons="accept,cancel">
 |  
|  | 13 | +    <linkset>
 |  
|  | 14 | +      <html:link rel="localization" href="">"branding/brand.ftl" />
 |  
|  | 15 | +      <html:link rel="localization" href="">"browser/tor-browser.ftl" />
 |  
|  | 16 | +    </linkset>
 |  
|  | 17 | +
 |  
| 12 | 18 |      <script src="">"chrome://browser/content/torpreferences/connectionSettingsDialog.js" />
 |  
| 13 | 19 |  
 |  
| 14 |  | -    <html:h3 id="torPreferences-connection-header">​</html:h3>
 |  
|  | 20 | +    <html:h3
 |  
|  | 21 | +      id="torPreferences-connection-header"
 |  
|  | 22 | +      data-l10n-id="tor-advanced-dialog-introduction"
 |  
|  | 23 | +    ></html:h3>
 |  
| 15 | 24 |      <!-- Local Proxy -->
 |  
| 16 |  | -    <checkbox id="torPreferences-connection-toggleProxy" label="​" />
 |  
|  | 25 | +    <checkbox
 |  
|  | 26 | +      id="torPreferences-connection-toggleProxy"
 |  
|  | 27 | +      data-l10n-id="tor-advanced-dialog-proxy-checkbox"
 |  
|  | 28 | +    />
 |  
| 17 | 29 |      <box id="torPreferences-connection-grid">
 |  
| 18 | 30 |        <hbox class="indent" align="center">
 |  
| 19 |  | -        <label id="torPreferences-localProxy-type" />
 |  
|  | 31 | +        <label
 |  
|  | 32 | +          id="torPreferences-localProxy-type"
 |  
|  | 33 | +          data-l10n-id="tor-advanced-dialog-proxy-type-selector-label"
 |  
|  | 34 | +        />
 |  
| 20 | 35 |        </hbox>
 |  
| 21 | 36 |        <hbox align="center">
 |  
| 22 | 37 |          <spacer flex="1" />
 |  
| ... | ... | @@ -28,15 +43,22 @@ |  
| 28 | 43 |          </menulist>
 |  
| 29 | 44 |        </hbox>
 |  
| 30 | 45 |        <hbox class="indent" align="center">
 |  
| 31 |  | -        <label id="torPreferences-localProxy-address" />
 |  
|  | 46 | +        <label
 |  
|  | 47 | +          id="torPreferences-localProxy-address"
 |  
|  | 48 | +          data-l10n-id="tor-advanced-dialog-proxy-address-input-label"
 |  
|  | 49 | +        />
 |  
| 32 | 50 |        </hbox>
 |  
| 33 | 51 |        <hbox align="center">
 |  
| 34 | 52 |          <html:input
 |  
| 35 | 53 |            id="torPreferences-localProxy-textboxAddress"
 |  
| 36 | 54 |            type="text"
 |  
| 37 | 55 |            class="torMarginFix"
 |  
|  | 56 | +          data-l10n-id="tor-advanced-dialog-proxy-address-input"
 |  
|  | 57 | +        />
 |  
|  | 58 | +        <label
 |  
|  | 59 | +          id="torPreferences-localProxy-port"
 |  
|  | 60 | +          data-l10n-id="tor-advanced-dialog-proxy-port-input-label"
 |  
| 38 | 61 |          />
 |  
| 39 |  | -        <label id="torPreferences-localProxy-port" />
 |  
| 40 | 62 |          <!-- proxy-port-input class style pulled from preferences.css and used in the vanilla proxy setup menu -->
 |  
| 41 | 63 |          <html:input
 |  
| 42 | 64 |            id="torPreferences-localProxy-textboxPort"
 |  
| ... | ... | @@ -49,27 +71,41 @@ |  
| 49 | 71 |          />
 |  
| 50 | 72 |        </hbox>
 |  
| 51 | 73 |        <hbox class="indent" align="center">
 |  
| 52 |  | -        <label id="torPreferences-localProxy-username" />
 |  
|  | 74 | +        <label
 |  
|  | 75 | +          id="torPreferences-localProxy-username"
 |  
|  | 76 | +          data-l10n-id="tor-advanced-dialog-proxy-username-input-label"
 |  
|  | 77 | +        />
 |  
| 53 | 78 |        </hbox>
 |  
| 54 | 79 |        <hbox align="center">
 |  
| 55 | 80 |          <html:input
 |  
| 56 | 81 |            id="torPreferences-localProxy-textboxUsername"
 |  
| 57 | 82 |            type="text"
 |  
| 58 | 83 |            class="torMarginFix"
 |  
|  | 84 | +          data-l10n-id="tor-advanced-dialog-proxy-username-input"
 |  
|  | 85 | +        />
 |  
|  | 86 | +        <label
 |  
|  | 87 | +          id="torPreferences-localProxy-password"
 |  
|  | 88 | +          data-l10n-id="tor-advanced-dialog-proxy-password-input-label"
 |  
| 59 | 89 |          />
 |  
| 60 |  | -        <label id="torPreferences-localProxy-password" />
 |  
| 61 | 90 |          <html:input
 |  
| 62 | 91 |            id="torPreferences-localProxy-textboxPassword"
 |  
| 63 | 92 |            class="torMarginFix"
 |  
| 64 | 93 |            type="password"
 |  
|  | 94 | +          data-l10n-id="tor-advanced-dialog-proxy-password-input"
 |  
| 65 | 95 |          />
 |  
| 66 | 96 |        </hbox>
 |  
| 67 | 97 |      </box>
 |  
| 68 | 98 |      <!-- Firewall -->
 |  
| 69 |  | -    <checkbox id="torPreferences-connection-toggleFirewall" label="​" />
 |  
|  | 99 | +    <checkbox
 |  
|  | 100 | +      id="torPreferences-connection-toggleFirewall"
 |  
|  | 101 | +      data-l10n-id="tor-advanced-dialog-firewall-checkbox"
 |  
|  | 102 | +    />
 |  
| 70 | 103 |      <box id="torPreferences-connection-firewall">
 |  
| 71 | 104 |        <hbox class="indent" align="center">
 |  
| 72 |  | -        <label id="torPreferences-connection-allowedPorts" />
 |  
|  | 105 | +        <label
 |  
|  | 106 | +          id="torPreferences-connection-allowedPorts"
 |  
|  | 107 | +          data-l10n-id="tor-advanced-dialog-firewall-ports-input-label"
 |  
|  | 108 | +        />
 |  
| 73 | 109 |        </hbox>
 |  
| 74 | 110 |        <hbox id="torPreferences-connection-hboxAllowedPorts" align="center">
 |  
| 75 | 111 |          <html:input
 |  
| ... | ... | @@ -77,6 +113,7 @@ |  
| 77 | 113 |            type="text"
 |  
| 78 | 114 |            class="torMarginFix"
 |  
| 79 | 115 |            value="80,443"
 |  
|  | 116 | +          data-l10n-id="tor-advanced-dialog-firewall-ports-input"
 |  
| 80 | 117 |          />
 |  
| 81 | 118 |        </hbox>
 |  
| 82 | 119 |      </box>
 |  browser/components/torpreferences/content/provideBridgeDialog.js
 
 
| 1 | 1 |  "use strict";
 |  
| 2 | 2 |  
 |  
| 3 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 4 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 5 |  | -);
 |  
| 6 |  | -
 |  
| 7 | 3 |  const { TorSettings, TorBridgeSource, validateBridgeLines } =
 |  
| 8 | 4 |    ChromeUtils.importESModule("resource://gre/modules/TorSettings.sys.mjs");
 |  
| 9 | 5 |  
 |  
| ... | ... | @@ -191,10 +187,8 @@ const gProvideBridgeDialog = { |  
| 191 | 187 |        this._result.connect = connect;
 |  
| 192 | 188 |  
 |  
| 193 | 189 |        this._acceptButton.setAttribute(
 |  
| 194 |  | -        "label",
 |  
| 195 |  | -        connect
 |  
| 196 |  | -          ? TorStrings.settings.bridgeButtonConnect
 |  
| 197 |  | -          : TorStrings.settings.bridgeButtonAccept
 |  
|  | 190 | +        "data-l10n-id",
 |  
|  | 191 | +        connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-accept"
 |  
| 198 | 192 |        );
 |  
| 199 | 193 |      }
 |  
| 200 | 194 |    },
 |  browser/components/torpreferences/content/requestBridgeDialog.js
 
 
| ... | ... | @@ -3,9 +3,6 @@ |  
| 3 | 3 |  const { BridgeDB } = ChromeUtils.importESModule(
 |  
| 4 | 4 |    "resource://gre/modules/BridgeDB.sys.mjs"
 |  
| 5 | 5 |  );
 |  
| 6 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 7 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 8 |  | -);
 |  
| 9 | 6 |  
 |  
| 10 | 7 |  const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
 |  
| 11 | 8 |    "resource://gre/modules/TorConnect.sys.mjs"
 |  
| ... | ... | @@ -20,8 +17,6 @@ const gRequestBridgeDialog = { |  
| 20 | 17 |        "button#torPreferences-requestBridge-refreshCaptchaButton",
 |  
| 21 | 18 |      incorrectCaptchaHbox:
 |  
| 22 | 19 |        "hbox#torPreferences-requestBridge-incorrectCaptchaHbox",
 |  
| 23 |  | -    incorrectCaptchaLabel:
 |  
| 24 |  | -      "label#torPreferences-requestBridge-incorrectCaptchaError",
 |  
| 25 | 20 |    },
 |  
| 26 | 21 |  
 |  
| 27 | 22 |    init() {
 |  
| ... | ... | @@ -33,10 +28,6 @@ const gRequestBridgeDialog = { |  
| 33 | 28 |        "torPreferences-requestBridge-dialog"
 |  
| 34 | 29 |      );
 |  
| 35 | 30 |  
 |  
| 36 |  | -    document.documentElement.setAttribute(
 |  
| 37 |  | -      "title",
 |  
| 38 |  | -      TorStrings.settings.requestBridgeDialogTitle
 |  
| 39 |  | -    );
 |  
| 40 | 31 |      // user may have opened a Request Bridge dialog in another tab, so update the
 |  
| 41 | 32 |      // CAPTCHA image or close out the dialog if we have a bridge list
 |  
| 42 | 33 |      this._dialog.addEventListener("focusin", () => {
 |  
| ... | ... | @@ -59,7 +50,6 @@ const gRequestBridgeDialog = { |  
| 59 | 50 |      });
 |  
| 60 | 51 |  
 |  
| 61 | 52 |      this._dialogHeader = this._dialog.querySelector(selectors.dialogHeader);
 |  
| 62 |  | -    this._dialogHeader.textContent = TorStrings.settings.contactingBridgeDB;
 |  
| 63 | 53 |  
 |  
| 64 | 54 |      this._captchaImage = this._dialog.querySelector(selectors.captchaImage);
 |  
| 65 | 55 |  
 |  
| ... | ... | @@ -71,10 +61,6 @@ const gRequestBridgeDialog = { |  
| 71 | 61 |      this._captchaEntryTextbox = this._dialog.querySelector(
 |  
| 72 | 62 |        selectors.captchaEntryTextbox
 |  
| 73 | 63 |      );
 |  
| 74 |  | -    this._captchaEntryTextbox.setAttribute(
 |  
| 75 |  | -      "placeholder",
 |  
| 76 |  | -      TorStrings.settings.captchaTextboxPlaceholder
 |  
| 77 |  | -    );
 |  
| 78 | 64 |      this._captchaEntryTextbox.disabled = true;
 |  
| 79 | 65 |      // disable submit if entry textbox is empty
 |  
| 80 | 66 |      this._captchaEntryTextbox.oninput = () => {
 |  
| ... | ... | @@ -89,13 +75,6 @@ const gRequestBridgeDialog = { |  
| 89 | 75 |      this._incorrectCaptchaHbox = this._dialog.querySelector(
 |  
| 90 | 76 |        selectors.incorrectCaptchaHbox
 |  
| 91 | 77 |      );
 |  
| 92 |  | -    this._incorrectCaptchaLabel = this._dialog.querySelector(
 |  
| 93 |  | -      selectors.incorrectCaptchaLabel
 |  
| 94 |  | -    );
 |  
| 95 |  | -    this._incorrectCaptchaLabel.setAttribute(
 |  
| 96 |  | -      "value",
 |  
| 97 |  | -      TorStrings.settings.incorrectCaptcha
 |  
| 98 |  | -    );
 |  
| 99 | 78 |  
 |  
| 100 | 79 |      Services.obs.addObserver(this, TorConnectTopics.StateChange);
 |  
| 101 | 80 |      this.onAcceptStateChange();
 |  
| ... | ... | @@ -111,10 +90,8 @@ const gRequestBridgeDialog = { |  
| 111 | 90 |      const connect = TorConnect.canBeginBootstrap;
 |  
| 112 | 91 |      this._result.connect = connect;
 |  
| 113 | 92 |      this._submitButton.setAttribute(
 |  
| 114 |  | -      "label",
 |  
| 115 |  | -      connect
 |  
| 116 |  | -        ? TorStrings.settings.bridgeButtonConnect
 |  
| 117 |  | -        : TorStrings.settings.submitCaptcha
 |  
|  | 93 | +      "data-l10n-id",
 |  
|  | 94 | +      connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-submit"
 |  
| 118 | 95 |      );
 |  
| 119 | 96 |    },
 |  
| 120 | 97 |  
 |  
| ... | ... | @@ -129,7 +106,10 @@ const gRequestBridgeDialog = { |  
| 129 | 106 |    _setcaptchaImage(uri) {
 |  
| 130 | 107 |      if (uri != this._captchaImage.src) {
 |  
| 131 | 108 |        this._captchaImage.src = uri;
 |  
| 132 |  | -      this._dialogHeader.textContent = TorStrings.settings.solveTheCaptcha;
 |  
|  | 109 | +      this._dialogHeader.setAttribute(
 |  
|  | 110 | +        "data-l10n-id",
 |  
|  | 111 | +        "request-bridge-dialog-top-solve"
 |  
|  | 112 | +      );
 |  
| 133 | 113 |        this._setUIDisabled(false);
 |  
| 134 | 114 |        this._captchaEntryTextbox.focus();
 |  
| 135 | 115 |        this._captchaEntryTextbox.select();
 |  
| ... | ... | @@ -185,7 +165,10 @@ const gRequestBridgeDialog = { |  
| 185 | 165 |    onRefreshCaptcha() {
 |  
| 186 | 166 |      this._setUIDisabled(true);
 |  
| 187 | 167 |      this._captchaImage.src = "";
 |  
| 188 |  | -    this._dialogHeader.textContent = TorStrings.settings.contactingBridgeDB;
 |  
|  | 168 | +    this._dialogHeader.setAttribute(
 |  
|  | 169 | +      "data-l10n-id",
 |  
|  | 170 | +      "request-bridge-dialog-top-wait"
 |  
|  | 171 | +    );
 |  
| 189 | 172 |      this._captchaEntryTextbox.value = "";
 |  
| 190 | 173 |      this._incorrectCaptchaHbox.style.visibility = "hidden";
 |  
| 191 | 174 |  
 |  browser/components/torpreferences/content/requestBridgeDialog.xhtml
 
 
| ... | ... | @@ -7,20 +7,26 @@ |  
| 7 | 7 |    type="child"
 |  
| 8 | 8 |    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 |  
| 9 | 9 |    xmlns:html="http://www.w3.org/1999/xhtml"
 |  
|  | 10 | +  data-l10n-id="request-bridge-dialog-title"
 |  
| 10 | 11 |  >
 |  
| 11 | 12 |    <dialog id="torPreferences-requestBridge-dialog" buttons="accept,cancel">
 |  
|  | 13 | +    <linkset>
 |  
|  | 14 | +      <html:link rel="localization" href="">"browser/tor-browser.ftl" />
 |  
|  | 15 | +    </linkset>
 |  
|  | 16 | +
 |  
| 12 | 17 |      <script src="">"chrome://browser/content/torpreferences/requestBridgeDialog.js" />
 |  
| 13 | 18 |  
 |  
| 14 |  | -    <!-- ok, so ​ is a zero-width space. We need to have *something* in the innerText so that XUL knows how tall the
 |  
| 15 |  | -       title node is so that it can determine how large to make the dialog element's inner draw area. If we have nothing
 |  
| 16 |  | -       in the innerText, then it collapse to 0 height, and the contents of the dialog ends up partially hidden >:( -->
 |  
| 17 |  | -    <html:h3 id="torPreferences-requestBridge-header">​</html:h3>
 |  
|  | 19 | +    <html:h3
 |  
|  | 20 | +      id="torPreferences-requestBridge-header"
 |  
|  | 21 | +      data-l10n-id="request-bridge-dialog-top-solve"
 |  
|  | 22 | +    ></html:h3>
 |  
| 18 | 23 |      <!-- init to transparent 400x125 png -->
 |  
| 19 | 24 |      <image id="torPreferences-requestBridge-captchaImage" flex="1" />
 |  
| 20 | 25 |      <hbox id="torPreferences-requestBridge-inputHbox">
 |  
| 21 | 26 |        <html:input
 |  
| 22 | 27 |          id="torPreferences-requestBridge-captchaTextbox"
 |  
| 23 | 28 |          type="text"
 |  
|  | 29 | +        data-l10n-id="request-bridge-dialog-captcha-input"
 |  
| 24 | 30 |        />
 |  
| 25 | 31 |        <button
 |  
| 26 | 32 |          id="torPreferences-requestBridge-refreshCaptchaButton"
 |  
| ... | ... | @@ -30,7 +36,7 @@ |  
| 30 | 36 |      </hbox>
 |  
| 31 | 37 |      <hbox id="torPreferences-requestBridge-incorrectCaptchaHbox" align="center">
 |  
| 32 | 38 |        <image id="torPreferences-requestBridge-errorIcon" />
 |  
| 33 |  | -      <label id="torPreferences-requestBridge-incorrectCaptchaError" flex="1" />
 |  
|  | 39 | +      <label data-l10n-id="request-bridge-dialog-captcha-failed" flex="1" />
 |  
| 34 | 40 |      </hbox>
 |  
| 35 | 41 |    </dialog>
 |  
| 36 | 42 |  </window> |  browser/components/torpreferences/content/torLogDialog.js
 
 
| ... | ... | @@ -7,21 +7,13 @@ const { setTimeout, clearTimeout } = ChromeUtils.importESModule( |  
| 7 | 7 |  const { TorProviderBuilder } = ChromeUtils.importESModule(
 |  
| 8 | 8 |    "resource://gre/modules/TorProviderBuilder.sys.mjs"
 |  
| 9 | 9 |  );
 |  
| 10 |  | -const { TorStrings } = ChromeUtils.importESModule(
 |  
| 11 |  | -  "resource://gre/modules/TorStrings.sys.mjs"
 |  
| 12 |  | -);
 |  
| 13 | 10 |  
 |  
| 14 | 11 |  window.addEventListener(
 |  
| 15 | 12 |    "DOMContentLoaded",
 |  
| 16 | 13 |    () => {
 |  
| 17 |  | -    document.documentElement.setAttribute(
 |  
| 18 |  | -      "title",
 |  
| 19 |  | -      TorStrings.settings.torLogDialogTitle
 |  
| 20 |  | -    );
 |  
| 21 |  | -
 |  
| 22 | 14 |      const dialog = document.getElementById("torPreferences-torLog-dialog");
 |  
| 23 | 15 |      const copyLogButton = dialog.getButton("extra1");
 |  
| 24 |  | -    copyLogButton.setAttribute("label", TorStrings.settings.copyLog);
 |  
|  | 16 | +    copyLogButton.setAttribute("data-l10n-id", "tor-log-dialog-copy-button");
 |  
| 25 | 17 |  
 |  
| 26 | 18 |      const logText = document.getElementById(
 |  
| 27 | 19 |        "torPreferences-torDialog-textarea"
 |  
| ... | ... | @@ -35,8 +27,10 @@ window.addEventListener( |  
| 35 | 27 |        );
 |  
| 36 | 28 |        clipboard.copyString(logText.value);
 |  
| 37 | 29 |  
 |  
| 38 |  | -      const label = copyLogButton.querySelector("label");
 |  
| 39 |  | -      label.setAttribute("value", TorStrings.settings.copied);
 |  
|  | 30 | +      copyLogButton.setAttribute(
 |  
|  | 31 | +        "data-l10n-id",
 |  
|  | 32 | +        "tor-log-dialog-copy-button-copied"
 |  
|  | 33 | +      );
 |  
| 40 | 34 |        copyLogButton.classList.add("primary");
 |  
| 41 | 35 |  
 |  
| 42 | 36 |        const RESTORE_TIME = 1200;
 |  
| ... | ... | @@ -44,7 +38,10 @@ window.addEventListener( |  
| 44 | 38 |          clearTimeout(restoreButtonTimeout);
 |  
| 45 | 39 |        }
 |  
| 46 | 40 |        restoreButtonTimeout = setTimeout(() => {
 |  
| 47 |  | -        label.setAttribute("value", TorStrings.settings.copyLog);
 |  
|  | 41 | +        copyLogButton.setAttribute(
 |  
|  | 42 | +          "data-l10n-id",
 |  
|  | 43 | +          "tor-log-dialog-copy-button"
 |  
|  | 44 | +        );
 |  
| 48 | 45 |          copyLogButton.classList.remove("primary");
 |  
| 49 | 46 |          restoreButtonTimeout = null;
 |  
| 50 | 47 |        }, RESTORE_TIME);
 |  browser/components/torpreferences/content/torLogDialog.xhtml
 
 
| ... | ... | @@ -7,8 +7,13 @@ |  
| 7 | 7 |    type="child"
 |  
| 8 | 8 |    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 |  
| 9 | 9 |    xmlns:html="http://www.w3.org/1999/xhtml"
 |  
|  | 10 | +  data-l10n-id="tor-log-dialog-title"
 |  
| 10 | 11 |  >
 |  
| 11 | 12 |    <dialog id="torPreferences-torLog-dialog" buttons="accept,extra1">
 |  
|  | 13 | +    <linkset>
 |  
|  | 14 | +      <html:link rel="localization" href="">"browser/tor-browser.ftl" />
 |  
|  | 15 | +    </linkset>
 |  
|  | 16 | +
 |  
| 12 | 17 |      <script src="">"chrome://browser/content/torpreferences/torLogDialog.js" />
 |  
| 13 | 18 |  
 |  
| 14 | 19 |      <html:textarea
 |  browser/components/torpreferences/content/torPreferences.css
 
 
| ... | ... | @@ -1023,6 +1023,11 @@ groupbox#torPreferences-bridges-group textarea { |  
| 1023 | 1023 |  }
 |  
| 1024 | 1024 |  
 |  
| 1025 | 1025 |  /* Connection settings dialog */
 |  
|  | 1026 | +#torPreferences-connection-dialog label {
 |  
|  | 1027 | +  /* Do not wrap the labels. */
 |  
|  | 1028 | +  white-space: nowrap;
 |  
|  | 1029 | +}
 |  
|  | 1030 | +
 |  
| 1026 | 1031 |  #torPreferences-connection-header {
 |  
| 1027 | 1032 |    margin: 4px 0 14px 0;
 |  
| 1028 | 1033 |  }
 |  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 |  
| 45 | 45 |  home-mode-choice-tor =
 |  
| 46 | 46 |      .label = Tor Browser Home
 |  
| 47 | 47 |  
 |  
| 48 |  | -## Tor Bridges Settings
 |  
|  | 48 | +## Tor connection settings.
 |  
|  | 49 | +
 |  
|  | 50 | +# "Connection" refers to the Tor Browser's connection to the Tor network.
 |  
|  | 51 | +tor-connection-settings-heading = Connection
 |  
|  | 52 | +# -brand-short-name refers to 'Tor Browser', localized.
 |  
|  | 53 | +tor-connection-overview = { -brand-short-name } routes your traffic over the Tor Network, run by thousands of volunteers around the world.
 |  
|  | 54 | +tor-connection-browser-learn-more-link = Learn more
 |  
|  | 55 | +tor-connection-quickstart-heading = Quickstart
 |  
|  | 56 | +# -brand-short-name refers to 'Tor Browser', localized.
 |  
|  | 57 | +tor-connection-quickstart-description = Quickstart connects { -brand-short-name } to the Tor Network automatically when launched, based on your last used connection settings.
 |  
|  | 58 | +tor-connection-quickstart-checkbox =
 |  
|  | 59 | +    .label = Always connect automatically
 |  
|  | 60 | +
 |  
|  | 61 | +# Prefix before the internet connection status.
 |  
|  | 62 | +# "Internet" is not a proper noun, but is capitalized because it is the start of a sentence.
 |  
|  | 63 | +tor-connection-internet-status-label = Internet:
 |  
|  | 64 | +# Button to test the internet connection.
 |  
|  | 65 | +# Here "Test" is a verb, as in "test the internet connection".
 |  
|  | 66 | +# Uses sentence case in English (US).
 |  
|  | 67 | +tor-connection-internet-status-test-button = Test
 |  
|  | 68 | +# Shown when the user is connected to the internet.
 |  
|  | 69 | +# Uses sentence case in English (US).
 |  
|  | 70 | +tor-connection-internet-status-online = Online
 |  
|  | 71 | +# Shown when the user is not connected to the internet.
 |  
|  | 72 | +# Uses sentence case in English (US).
 |  
|  | 73 | +tor-connection-internet-status-offline = Offline
 |  
|  | 74 | +
 |  
|  | 75 | +# Prefix before the Tor network connection status.
 |  
|  | 76 | +# Uses sentence case in English (US).
 |  
|  | 77 | +tor-connection-network-status-label = Tor network:
 |  
|  | 78 | +# Shown when the user is connected to the Tor network.
 |  
|  | 79 | +# Uses sentence case in English (US).
 |  
|  | 80 | +tor-connection-network-status-connected = Connected
 |  
|  | 81 | +# Shown when the user is not connected to the Tor network.
 |  
|  | 82 | +# Uses sentence case in English (US).
 |  
|  | 83 | +tor-connection-network-status-not-connected = Not connected
 |  
|  | 84 | +# Shown when the user's Tor connection may be blocked.
 |  
|  | 85 | +# Uses sentence case in English (US).
 |  
|  | 86 | +tor-connection-network-status-blocked = Potentially blocked
 |  
|  | 87 | +# Button shown when we are not yet connected to the Tor network.
 |  
|  | 88 | +# It will open a page to start connecting to the Tor network.
 |  
|  | 89 | +# Uses sentence case in English (US).
 |  
|  | 90 | +tor-connection-network-status-connect-button = Connect
 |  
|  | 91 | +
 |  
|  | 92 | +## Tor Bridges Settings.
 |  
|  | 93 | +
 |  
|  | 94 | +tor-bridges-heading = Bridges
 |  
|  | 95 | +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.
 |  
|  | 96 | +tor-bridges-learn-more-link = Learn more
 |  
| 49 | 97 |  
 |  
| 50 | 98 |  # Toggle button for enabling and disabling the use of bridges.
 |  
| 51 | 99 |  tor-bridges-use-bridges =
 |  
| ... | ... | @@ -78,6 +126,16 @@ tor-bridges-menu-item-remove-all-bridges = Remove all bridges |  
| 78 | 126 |  
 |  
| 79 | 127 |  # Shown when one of the built-in bridges is in use.
 |  
| 80 | 128 |  tor-bridges-built-in-status-connected = Connected
 |  
|  | 129 | +# "obfs4" is a technical name, and likely should not be translated.
 |  
|  | 130 | +tor-bridges-built-in-obfs4-name = obfs4
 |  
|  | 131 | +tor-bridges-built-in-obfs4-description = Makes your Tor traffic look like random data. May not work in heavily censored regions.
 |  
|  | 132 | +# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
 |  
|  | 133 | +tor-bridges-built-in-snowflake-name = Snowflake
 |  
|  | 134 | +# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
 |  
|  | 135 | +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.
 |  
|  | 136 | +# "meek-azure" is a technical name, and likely should not be translated.
 |  
|  | 137 | +tor-bridges-built-in-meek-azure-name = meek-azure
 |  
|  | 138 | +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.
 |  
| 81 | 139 |  
 |  
| 82 | 140 |  # Shown at the start of a Tor bridge line.
 |  
| 83 | 141 |  # $type (String) - The Tor bridge type ("snowflake", "obfs4", "meek-azure").
 |  
| ... | ... | @@ -195,6 +253,7 @@ tor-bridges-add-bridges-heading = Add bridges |  
| 195 | 253 |  # Shown as a heading when the user has existing bridges that can be replaced.
 |  
| 196 | 254 |  tor-bridges-replace-bridges-heading = Replace your bridges
 |  
| 197 | 255 |  
 |  
|  | 256 | +# -brand-short-name refers to 'Tor Browser', localized.
 |  
| 198 | 257 |  tor-bridges-select-built-in-description = Choose from one of { -brand-short-name }’s built-in bridges
 |  
| 199 | 258 |  tor-bridges-select-built-in-button = Select a built-in bridge…
 |  
| 200 | 259 |  
 |  
| ... | ... | @@ -233,6 +292,23 @@ tor-bridges-provider-email-instruction = Email { $address } |  
| 233 | 292 |  tor-bridges-request-from-browser = You can also get bridges from the bridge bot without leaving { -brand-short-name }.
 |  
| 234 | 293 |  tor-bridges-request-button = Request bridges…
 |  
| 235 | 294 |  
 |  
|  | 295 | +## Warning dialog when removing all bridges.
 |  
|  | 296 | +
 |  
|  | 297 | +remove-all-bridges-warning-title = Remove all bridges?
 |  
|  | 298 | +remove-all-bridges-warning-description = If these bridges were received from torproject.org or added manually, this action cannot be undone
 |  
|  | 299 | +remove-all-bridges-warning-remove-button = Remove
 |  
|  | 300 | +
 |  
|  | 301 | +## Bridge QR code dialog.
 |  
|  | 302 | +
 |  
|  | 303 | +bridge-qr-dialog-title =
 |  
|  | 304 | +    .title = Scan the QR code
 |  
|  | 305 | +
 |  
|  | 306 | +## Common button used in bridge dialogs.
 |  
|  | 307 | +
 |  
|  | 308 | +bridge-dialog-button-connect = Connect
 |  
|  | 309 | +bridge-dialog-button-accept = OK
 |  
|  | 310 | +bridge-dialog-button-submit = Submit
 |  
|  | 311 | +
 |  
| 236 | 312 |  ## User provided bridge dialog.
 |  
| 237 | 313 |  
 |  
| 238 | 314 |  # Used when the user is editing their existing bridge addresses.
 |  
| ... | ... | @@ -300,11 +376,92 @@ user-provide-bridge-dialog-next-button = |  
| 300 | 376 |  
 |  
| 301 | 377 |  ## Built-in bridges dialog.
 |  
| 302 | 378 |  
 |  
|  | 379 | +built-in-dialog-title =
 |  
|  | 380 | +    .title = Select a Built-In Bridge
 |  
|  | 381 | +# -brand-short-name refers to 'Tor Browser', localized.
 |  
|  | 382 | +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.
 |  
|  | 383 | +# "obfs4" is a technical name, and likely should not be translated.
 |  
|  | 384 | +built-in-dialog-obfs4-radio-option =
 |  
|  | 385 | +    .label = obfs4
 |  
|  | 386 | +# "Snowflake" is a proper noun for a type of Tor bridge, and likely should not be translated.
 |  
|  | 387 | +built-in-dialog-snowflake-radio-option =
 |  
|  | 388 | +    .label = Snowflake
 |  
|  | 389 | +# "meek-azure" is a technical name, and likely should not be translated.
 |  
|  | 390 | +built-in-dialog-meek-azure-radio-option =
 |  
|  | 391 | +    .label = meek-azure
 |  
| 303 | 392 |  # Label attached to the built-in bridge option that is already in use.
 |  
| 304 | 393 |  # 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.
 |  
| 305 | 394 |  built-in-dialog-current-bridge-label = Current bridge
 |  
| 306 | 395 |      .aria-label = Current bridge.
 |  
| 307 | 396 |  
 |  
|  | 397 | +request-bridge-dialog-title =
 |  
|  | 398 | +    .title = Request Bridge
 |  
|  | 399 | +request-bridge-dialog-top-wait = Contacting BridgeDB. Please Wait.
 |  
|  | 400 | +request-bridge-dialog-top-solve = Solve the CAPTCHA to request a bridge.
 |  
|  | 401 | +request-bridge-dialog-captcha-input =
 |  
|  | 402 | +    .placeholder = Enter the characters from the image
 |  
|  | 403 | +request-bridge-dialog-captcha-failed = The solution is not correct. Please try again.
 |  
|  | 404 | +
 |  
|  | 405 | +## Tor advanced settings.
 |  
|  | 406 | +
 |  
|  | 407 | +tor-advanced-settings-heading = Advanced
 |  
|  | 408 | +tor-advanced-settings-description = Configure how { -brand-short-name } connects to the internet.
 |  
|  | 409 | +# Button that opens the advanced connection settings dialog.
 |  
|  | 410 | +# Uses sentence case in English (US).
 |  
|  | 411 | +tor-advanced-settings-button = Settings…
 |  
|  | 412 | +# "log" is a noun, referring to the recorded text output of the Tor process.
 |  
|  | 413 | +tor-view-log-description = View the Tor log.
 |  
|  | 414 | +# "log" is a noun, referring to the recorded text output of the Tor process.
 |  
|  | 415 | +# Uses sentence case in English (US).
 |  
|  | 416 | +tor-view-log-button = View log…
 |  
|  | 417 | +
 |  
|  | 418 | +## Tor log dialog.
 |  
|  | 419 | +
 |  
|  | 420 | +# "log" is a noun, referring to the recorded text output of the Tor process.
 |  
|  | 421 | +tor-log-dialog-title =
 |  
|  | 422 | +    .title = Tor log
 |  
|  | 423 | +# "log" is a noun, referring to the recorded text output of the Tor process.
 |  
|  | 424 | +tor-log-dialog-copy-button =
 |  
|  | 425 | +    .label = Copy Tor log to clipboard
 |  
|  | 426 | +# Button text changes for a short time after activating the button.
 |  
|  | 427 | +tor-log-dialog-copy-button-copied =
 |  
|  | 428 | +    .label = Copied!
 |  
|  | 429 | +
 |  
|  | 430 | +## Tor advanced connection settings dialog.
 |  
|  | 431 | +
 |  
|  | 432 | +tor-advanced-dialog-title =
 |  
|  | 433 | +    .title = Connection settings
 |  
|  | 434 | +tor-advanced-dialog-introduction = Configure how { -brand-short-name } connects to the internet.
 |  
|  | 435 | +tor-advanced-dialog-proxy-checkbox =
 |  
|  | 436 | +    .label = I use a proxy to connect to the internet
 |  
|  | 437 | +tor-advanced-dialog-proxy-type-selector-label = Proxy type
 |  
|  | 438 | +# SOCKS4 is a technical name, and should likely not be translated.
 |  
|  | 439 | +tor-advanced-dialog-proxy-socks4-menuitem =
 |  
|  | 440 | +    .label = SOCKS4
 |  
|  | 441 | +# SOCKS5 is a technical name, and should likely not be translated.
 |  
|  | 442 | +tor-advanced-dialog-proxy-socks5-menuitem =
 |  
|  | 443 | +    .label = SOCKS5
 |  
|  | 444 | +# HTTP and HTTPS are technical names, and should likely not be translated.
 |  
|  | 445 | +# The "/" refers to "HTTP or HTTPS" and can be translated.
 |  
|  | 446 | +tor-advanced-dialog-proxy-http-menuitem =
 |  
|  | 447 | +    .label = HTTP/HTTPS
 |  
|  | 448 | +# "address" is a noun, referring to an network IP address.
 |  
|  | 449 | +tor-advanced-dialog-proxy-address-input-label = Address
 |  
|  | 450 | +tor-advanced-dialog-proxy-address-input =
 |  
|  | 451 | +    .placeholder = IP address or hostname
 |  
|  | 452 | +tor-advanced-dialog-proxy-port-input-label = Port
 |  
|  | 453 | +tor-advanced-dialog-proxy-username-input-label = Username
 |  
|  | 454 | +tor-advanced-dialog-proxy-username-input =
 |  
|  | 455 | +    .placeholder = Optional
 |  
|  | 456 | +tor-advanced-dialog-proxy-password-input-label = Password
 |  
|  | 457 | +tor-advanced-dialog-proxy-password-input =
 |  
|  | 458 | +    .placeholder = Optional
 |  
|  | 459 | +tor-advanced-dialog-firewall-checkbox =
 |  
|  | 460 | +    .label = This computer goes through a firewall that only allows connections to certain ports
 |  
|  | 461 | +tor-advanced-dialog-firewall-ports-input-label = Allowed ports
 |  
|  | 462 | +tor-advanced-dialog-firewall-ports-input =
 |  
|  | 463 | +    .placeholder = Comma-separated values
 |  
|  | 464 | +
 |  
| 308 | 465 |  ## About Tor Browser dialog.
 |  
| 309 | 466 |  
 |  
| 310 | 467 |  # '<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 = { |  
| 67 | 67 |    */
 |  
| 68 | 68 |    settings() {
 |  
| 69 | 69 |      const strings = {
 |  
| 70 |  | -      categoryTitle: "Connection",
 |  
| 71 | 70 |        // Message box
 |  
| 72 | 71 |        torPreferencesDescription:
 |  
| 73 | 72 |          "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.",
 |  
| 74 |  | -      // Status
 |  
| 75 |  | -      statusInternetLabel: "Internet:",
 |  
| 76 |  | -      statusInternetTest: "Test",
 |  
| 77 |  | -      statusInternetOnline: "Online",
 |  
| 78 |  | -      statusInternetOffline: "Offline",
 |  
| 79 |  | -      statusTorLabel: "Tor Network:",
 |  
| 80 |  | -      statusTorConnected: "Connected",
 |  
| 81 |  | -      statusTorNotConnected: "Not Connected",
 |  
| 82 |  | -      statusTorBlocked: "Potentially Blocked",
 |  
| 83 |  | -      learnMore: "Learn more",
 |  
| 84 | 73 |        // Quickstart
 |  
| 85 |  | -      quickstartHeading: "Quickstart",
 |  
| 86 |  | -      quickstartDescription:
 |  
| 87 |  | -        "Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings.",
 |  
| 88 | 74 |        quickstartCheckbox: "Always connect automatically",
 |  
| 89 |  | -      // Bridge settings
 |  
| 90 |  | -      bridgesHeading: "Bridges",
 |  
| 91 |  | -      bridgesDescription2:
 |  
| 92 |  | -        "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.",
 |  
| 93 | 75 |        bridgeLocation: "Your location",
 |  
| 94 | 76 |        bridgeLocationAutomatic: "Automatic",
 |  
| 95 | 77 |        bridgeLocationFrequent: "Frequently selected locations",
 |  
| 96 | 78 |        bridgeLocationOther: "Other locations",
 |  
| 97 | 79 |        bridgeChooseForMe: "Choose a Bridge For Me…",
 |  
| 98 |  | -      remove: "Remove",
 |  
| 99 |  | -      bridgeDisableBuiltIn: "Disable built-in bridges",
 |  
| 100 |  | -      copied: "Copied!",
 |  
| 101 |  | -      bridgeRemoveAllDialogTitle: "Remove all bridges?",
 |  
| 102 |  | -      bridgeRemoveAllDialogDescription:
 |  
| 103 |  | -        "If these bridges were received from torproject.org or added manually, this action cannot be undone",
 |  
| 104 |  | -      // Advanced settings
 |  
| 105 |  | -      advancedHeading: "Advanced",
 |  
| 106 |  | -      advancedLabel: "Configure how Tor Browser connects to the internet",
 |  
| 107 |  | -      advancedButton: "Settings…",
 |  
| 108 |  | -      showTorDaemonLogs: "View the Tor logs",
 |  
| 109 |  | -      showLogs: "View Logs…",
 |  
| 110 |  | -      // Remove all bridges dialog
 |  
| 111 |  | -      removeBridgesQuestion: "Remove all the bridges?",
 |  
| 112 |  | -      removeBridgesWarning: "This action cannot be undone.",
 |  
| 113 |  | -      cancel: "Cancel",
 |  
| 114 |  | -      // Scan bridge QR dialog
 |  
| 115 |  | -      scanQrTitle: "Scan the QR code",
 |  
| 116 |  | -      // Builtin bridges dialog
 |  
| 117 |  | -      builtinBridgeHeader: "Select a Built-In Bridge",
 |  
| 118 |  | -      builtinBridgeDescription2:
 |  
| 119 |  | -        "Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.",
 |  
| 120 |  | -      builtinBridgeObfs4Title: "obfs4 (Built-in)",
 |  
| 121 |  | -      builtinBridgeObfs4Description2:
 |  
| 122 |  | -        "Makes your Tor traffic look like random data. May not work in heavily censored regions.",
 |  
| 123 |  | -      builtinBridgeSnowflake: "Snowflake",
 |  
| 124 |  | -      builtinBridgeSnowflakeDescription2:
 |  
| 125 |  | -        "Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.",
 |  
| 126 |  | -      builtinBridgeMeekAzure: "meek-azure",
 |  
| 127 |  | -      builtinBridgeMeekAzureDescription2:
 |  
| 128 |  | -        "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.",
 |  
| 129 |  | -      bridgeButtonConnect: "Connect",
 |  
| 130 |  | -      bridgeButtonAccept: "OK",
 |  
| 131 |  | -      // Request bridges dialog
 |  
| 132 |  | -      requestBridgeDialogTitle: "Request Bridge",
 |  
| 133 |  | -      submitCaptcha: "Submit",
 |  
| 134 |  | -      contactingBridgeDB: "Contacting BridgeDB. Please Wait.",
 |  
| 135 |  | -      solveTheCaptcha: "Solve the CAPTCHA to request a bridge.",
 |  
| 136 |  | -      captchaTextboxPlaceholder: "Enter the characters from the image",
 |  
| 137 |  | -      incorrectCaptcha: "The solution is not correct. Please try again.",
 |  
| 138 |  | -      // Connection settings dialog
 |  
| 139 |  | -      connectionSettingsDialogTitle: "Connection Settings",
 |  
| 140 |  | -      connectionSettingsDialogHeader:
 |  
| 141 |  | -        "Configure how Tor Browser connects to the Internet",
 |  
| 142 |  | -      useLocalProxy: "I use a proxy to connect to the Internet",
 |  
| 143 |  | -      proxyType: "Proxy Type",
 |  
| 144 |  | -      proxyTypeSOCKS4: "SOCKS4",
 |  
| 145 |  | -      proxyTypeSOCKS5: "SOCKS5",
 |  
| 146 |  | -      proxyTypeHTTP: "HTTP/HTTPS",
 |  
| 147 |  | -      proxyAddress: "Address",
 |  
| 148 |  | -      proxyAddressPlaceholder: "IP address or hostname",
 |  
| 149 |  | -      proxyPort: "Port",
 |  
| 150 |  | -      proxyUsername: "Username",
 |  
| 151 |  | -      proxyPassword: "Password",
 |  
| 152 |  | -      proxyUsernamePasswordPlaceholder: "Optional",
 |  
| 153 |  | -      useFirewall:
 |  
| 154 |  | -        "This computer goes through a firewall that only allows connections to certain ports",
 |  
| 155 |  | -      allowedPorts: "Allowed Ports",
 |  
| 156 |  | -      allowedPortsPlaceholder: "Comma-seperated values",
 |  
| 157 |  | -      // Log dialog
 |  
| 158 |  | -      torLogDialogTitle: "Tor Logs",
 |  
| 159 |  | -      copyLog: "Copy Tor Log to Clipboard",
 |  
| 160 | 80 |      };
 |  
| 161 | 81 |  
 |  
| 162 | 82 |      const tsb = new TorPropertyStringBundle(
 |  
| 163 | 83 |        "chrome://torbutton/locale/settings.properties",
 |  
| 164 | 84 |        "settings."
 |  
| 165 | 85 |      );
 |  
| 166 |  | -    return {
 |  
| 167 |  | -      ...tsb.getStrings(strings),
 |  
| 168 |  | -      learnMoreTorBrowserURL: "about:manual#about",
 |  
| 169 |  | -      learnMoreBridgesURL: "about:manual#bridges",
 |  
| 170 |  | -    };
 |  
|  | 86 | +    return tsb.getStrings(strings);
 |  
| 171 | 87 |    } /* Tor Network Settings Strings */,
 |  
| 172 | 88 |  
 |  
| 173 | 89 |    torConnect() {
 |  toolkit/torbutton/chrome/locale/en-US/settings.properties
 
 
| ... | ... | @@ -3,95 +3,17 @@ |  
| 3 | 3 |  # License, v. 2.0. If a copy of the MPL was not distributed with this
 |  
| 4 | 4 |  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 |  
| 5 | 5 |  
 |  
| 6 |  | -settings.categoryTitle=Connection
 |  
|  | 6 | +# Still used in TorConnect.
 |  
| 7 | 7 |  
 |  
| 8 | 8 |  # Message box
 |  
| 9 | 9 |  settings.torPreferencesDescription=Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.
 |  
| 10 | 10 |  
 |  
| 11 |  | -# Status
 |  
| 12 |  | -settings.statusInternetLabel=Internet:
 |  
| 13 |  | -settings.statusInternetTest=Test
 |  
| 14 |  | -settings.statusInternetOnline=Online
 |  
| 15 |  | -settings.statusInternetOffline=Offline
 |  
| 16 |  | -settings.statusTorLabel=Tor Network:
 |  
| 17 |  | -settings.statusTorConnected=Connected
 |  
| 18 |  | -settings.statusTorNotConnected=Not Connected
 |  
| 19 |  | -settings.statusTorBlocked=Potentially Blocked
 |  
| 20 |  | -settings.learnMore=Learn more
 |  
| 21 |  | -
 |  
| 22 |  | -# Quickstart
 |  
| 23 |  | -settings.quickstartHeading=Quickstart
 |  
| 24 |  | -settings.quickstartDescription=Quickstart connects Tor Browser to the Tor Network automatically when launched, based on your last used connection settings.
 |  
| 25 | 11 |  settings.quickstartCheckbox=Always connect automatically
 |  
| 26 | 12 |  
 |  
| 27 |  | -# Bridge settings
 |  
| 28 |  | -settings.bridgesHeading=Bridges
 |  
| 29 |  | -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.
 |  
|  | 13 | +# Might be removed in tor-browser#42477
 |  
|  | 14 | +
 |  
| 30 | 15 |  settings.bridgeLocation=Your location
 |  
| 31 | 16 |  settings.bridgeLocationAutomatic=Automatic
 |  
| 32 | 17 |  settings.bridgeLocationFrequent=Frequently selected locations
 |  
| 33 | 18 |  settings.bridgeLocationOther=Other locations
 |  
| 34 | 19 |  settings.bridgeChooseForMe=Choose a Bridge For Me… |  
| 35 |  | -
 |  
| 36 |  | -settings.remove=Remove
 |  
| 37 |  | -settings.bridgeDisableBuiltIn=Disable built-in bridges
 |  
| 38 |  | -settings.copied=Copied!
 |  
| 39 |  | -settings.bridgeRemoveAllDialogTitle=Remove all bridges?
 |  
| 40 |  | -settings.bridgeRemoveAllDialogDescription=If these bridges were received from torproject.org or added manually, this action cannot be undone
 |  
| 41 |  | -
 |  
| 42 |  | -# Advanced settings
 |  
| 43 |  | -settings.advancedHeading=Advanced
 |  
| 44 |  | -settings.advancedLabel=Configure how Tor Browser connects to the internet
 |  
| 45 |  | -settings.advancedButton=Settings…
 |  
| 46 |  | -settings.showTorDaemonLogs=View the Tor logs
 |  
| 47 |  | -settings.showLogs=View Logs…
 |  
| 48 |  | -
 |  
| 49 |  | -# Remove all bridges dialog
 |  
| 50 |  | -settings.removeBridgesQuestion=Remove all the bridges?
 |  
| 51 |  | -settings.removeBridgesWarning=This action cannot be undone.
 |  
| 52 |  | -settings.cancel=Cancel
 |  
| 53 |  | -
 |  
| 54 |  | -# Scan bridge QR dialog
 |  
| 55 |  | -settings.scanQrTitle=Scan the QR code
 |  
| 56 |  | -
 |  
| 57 |  | -# Builtin bridges dialog
 |  
| 58 |  | -settings.builtinBridgeHeader=Select a Built-In Bridge
 |  
| 59 |  | -settings.builtinBridgeDescription2=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.
 |  
| 60 |  | -settings.builtinBridgeObfs4Title=obfs4 (Built-in)
 |  
| 61 |  | -settings.builtinBridgeObfs4Description2=Makes your Tor traffic look like random data. May not work in heavily censored regions.
 |  
| 62 |  | -settings.builtinBridgeSnowflake=Snowflake
 |  
| 63 |  | -settings.builtinBridgeSnowflakeDescription2=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.
 |  
| 64 |  | -settings.builtinBridgeMeekAzure=meek-azure
 |  
| 65 |  | -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.
 |  
| 66 |  | -settings.bridgeButtonConnect=Connect
 |  
| 67 |  | -settings.bridgeButtonAccept=OK
 |  
| 68 |  | -
 |  
| 69 |  | -# Request bridges dialog
 |  
| 70 |  | -settings.requestBridgeDialogTitle=Request Bridge
 |  
| 71 |  | -settings.submitCaptcha=Submit
 |  
| 72 |  | -settings.contactingBridgeDB=Contacting BridgeDB. Please Wait.
 |  
| 73 |  | -settings.solveTheCaptcha=Solve the CAPTCHA to request a bridge.
 |  
| 74 |  | -settings.captchaTextboxPlaceholder=Enter the characters from the image
 |  
| 75 |  | -settings.incorrectCaptcha=The solution is not correct. Please try again.
 |  
| 76 |  | -
 |  
| 77 |  | -# Connection settings dialog
 |  
| 78 |  | -settings.connectionSettingsDialogTitle=Connection Settings
 |  
| 79 |  | -settings.connectionSettingsDialogHeader=Configure how Tor Browser connects to the Internet
 |  
| 80 |  | -settings.useLocalProxy=I use a proxy to connect to the Internet
 |  
| 81 |  | -settings.proxyType=Proxy Type
 |  
| 82 |  | -settings.proxyTypeSOCKS4=SOCKS4
 |  
| 83 |  | -settings.proxyTypeSOCKS5=SOCKS5
 |  
| 84 |  | -settings.proxyTypeHTTP=HTTP/HTTPS
 |  
| 85 |  | -settings.proxyAddress=Address
 |  
| 86 |  | -settings.proxyAddressPlaceholder=IP address or hostname
 |  
| 87 |  | -settings.proxyPort=Port
 |  
| 88 |  | -settings.proxyUsername=Username
 |  
| 89 |  | -settings.proxyPassword=Password
 |  
| 90 |  | -settings.proxyUsernamePasswordPlaceholder=Optional
 |  
| 91 |  | -settings.useFirewall=This computer goes through a firewall that only allows connections to certain ports
 |  
| 92 |  | -settings.allowedPorts=Allowed Ports
 |  
| 93 |  | -settings.allowedPortsPlaceholder=Comma-separated values
 |  
| 94 |  | -
 |  
| 95 |  | -# Log dialog
 |  
| 96 |  | -settings.torLogDialogTitle=Tor Logs
 |  
| 97 |  | -settings.copyLog=Copy Tor Log to Clipboard |  tools/torbrowser/l10n/migrations/bug-42207-settings.py
 
 
|  | 1 | +from fluent.migrate.helpers import transforms_from
 |  
|  | 2 | +
 |  
|  | 3 | +
 |  
|  | 4 | +def migrate(ctx):
 |  
|  | 5 | +    legacy_path = "settings.properties"
 |  
|  | 6 | +    ctx.add_transforms(
 |  
|  | 7 | +        "tor-browser.ftl",
 |  
|  | 8 | +        "tor-browser.ftl",
 |  
|  | 9 | +        transforms_from(
 |  
|  | 10 | +            """
 |  
|  | 11 | +tor-connection-settings-heading = { COPY(path, "settings.categoryTitle") }
 |  
|  | 12 | +tor-connection-browser-learn-more-link = { COPY(path, "settings.learnMore") }
 |  
|  | 13 | +
 |  
|  | 14 | +tor-connection-quickstart-heading = { COPY(path, "settings.quickstartHeading") }
 |  
|  | 15 | +tor-connection-quickstart-checkbox =
 |  
|  | 16 | +    .label = { COPY(path, "settings.quickstartCheckbox") }
 |  
|  | 17 | +
 |  
|  | 18 | +tor-connection-internet-status-label = { COPY(path, "settings.statusInternetLabel") }
 |  
|  | 19 | +tor-connection-internet-status-test-button = { COPY(path, "settings.statusInternetTest") }
 |  
|  | 20 | +tor-connection-internet-status-_online_ = { COPY(path, "settings.statusInternetOnline") }
 |  
|  | 21 | +tor-connection-internet-status-offline = { COPY(path, "settings.statusInternetOffline") }
 |  
|  | 22 | +
 |  
|  | 23 | +tor-bridges-heading = { COPY(path, "settings.bridgesHeading") }
 |  
|  | 24 | +tor-bridges-overview = { COPY(path, "settings.bridgesDescription2") }
 |  
|  | 25 | +tor-bridges-learn-more-link = { COPY(path, "settings.learnMore") }
 |  
|  | 26 | +
 |  
|  | 27 | +tor-bridges-built-in-obfs4-description = { COPY(path, "settings.builtinBridgeObfs4Description2") }
 |  
|  | 28 | +tor-bridges-built-in-snowflake-name = { COPY(path, "settings.builtinBridgeSnowflake") }
 |  
|  | 29 | +tor-bridges-built-in-snowflake-description = { COPY(path, "settings.builtinBridgeSnowflakeDescription2") }
 |  
|  | 30 | +tor-bridges-built-in-meek-azure-name = { COPY(path, "settings.builtinBridgeMeekAzure") }
 |  
|  | 31 | +tor-bridges-built-in-meek-azure-description = { COPY(path, "settings.builtinBridgeMeekAzureDescription2") }
 |  
|  | 32 | +
 |  
|  | 33 | +remove-all-bridges-warning-title = { COPY(path, "settings.bridgeRemoveAllDialogTitle") }
 |  
|  | 34 | +remove-all-bridges-warning-description = { COPY(path, "settings.bridgeRemoveAllDialogDescription") }
 |  
|  | 35 | +remove-all-bridges-warning-remove-button = { COPY(path, "settings.remove") }
 |  
|  | 36 | +
 |  
|  | 37 | +bridge-qr-dialog-title =
 |  
|  | 38 | +    .title = { COPY(path, "settings.scanQrTitle") }
 |  
|  | 39 | +
 |  
|  | 40 | +bridge-dialog-button-connect = { COPY(path, "settings.bridgeButtonConnect") }
 |  
|  | 41 | +bridge-dialog-button-accept = { COPY(path, "settings.bridgeButtonAccept") }
 |  
|  | 42 | +bridge-dialog-button-submit = { COPY(path, "settings.submitCaptcha") }
 |  
|  | 43 | +
 |  
|  | 44 | +built-in-dialog-title =
 |  
|  | 45 | +    .title = { COPY(path, "settings.builtinBridgeHeader") }
 |  
|  | 46 | +built-in-dialog-snowflake-radio-option =
 |  
|  | 47 | +    .label = { COPY(path, "settings.builtinBridgeSnowflake") }
 |  
|  | 48 | +built-in-dialog-meek-azure-radio-option =
 |  
|  | 49 | +    .label = { COPY(path, "settings.builtinBridgeMeekAzure") }
 |  
|  | 50 | +
 |  
|  | 51 | +request-bridge-dialog-title =
 |  
|  | 52 | +    .title = { COPY(path, "settings.requestBridgeDialogTitle") }
 |  
|  | 53 | +request-bridge-dialog-top-wait = { COPY(path, "settings.contactingBridgeDB") }
 |  
|  | 54 | +request-bridge-dialog-top-solve = { COPY(path, "settings.solveTheCaptcha") }
 |  
|  | 55 | +request-bridge-dialog-captcha-input =
 |  
|  | 56 | +    .placeholder = { COPY(path, "settings.captchaTextboxPlaceholder") }
 |  
|  | 57 | +request-bridge-dialog-captcha-failed = { COPY(path, "settings.incorrectCaptcha") }
 |  
|  | 58 | +
 |  
|  | 59 | +tor-advanced-settings-heading = { COPY(path, "settings.advancedHeading") }
 |  
|  | 60 | +tor-advanced-settings-button = { COPY(path, "settings.advancedButton") }
 |  
|  | 61 | +
 |  
|  | 62 | +tor-log-dialog-copy-button-copied =
 |  
|  | 63 | +    .label = { COPY(path, "settings.copied") }
 |  
|  | 64 | +
 |  
|  | 65 | +tor-advanced-dialog-proxy-socks4-menuitem =
 |  
|  | 66 | +    .label = { COPY(path, "settings.proxyTypeSOCKS4") }
 |  
|  | 67 | +tor-advanced-dialog-proxy-socks5-menuitem =
 |  
|  | 68 | +    .label = { COPY(path, "settings.proxyTypeSOCKS5") }
 |  
|  | 69 | +tor-advanced-dialog-proxy-http-menuitem =
 |  
|  | 70 | +    .label = { COPY(path, "settings.proxyTypeHTTP") }
 |  
|  | 71 | +tor-advanced-dialog-proxy-address-input-label = { COPY(path, "settings.proxyAddress") }
 |  
|  | 72 | +tor-advanced-dialog-proxy-address-input =
 |  
|  | 73 | +    .placeholder = { COPY(path, "settings.proxyAddressPlaceholder") }
 |  
|  | 74 | +tor-advanced-dialog-proxy-port-input-label = { COPY(path, "settings.proxyPort") }
 |  
|  | 75 | +tor-advanced-dialog-proxy-username-input-label = { COPY(path, "settings.proxyUsername") }
 |  
|  | 76 | +tor-advanced-dialog-proxy-username-input =
 |  
|  | 77 | +    .placeholder = { COPY(path, "settings.proxyUsernamePasswordPlaceholder") }
 |  
|  | 78 | +tor-advanced-dialog-proxy-password-input-label = { COPY(path, "settings.proxyPassword") }
 |  
|  | 79 | +tor-advanced-dialog-proxy-password-input =
 |  
|  | 80 | +    .placeholder = { COPY(path, "settings.proxyUsernamePasswordPlaceholder") }
 |  
|  | 81 | +tor-advanced-dialog-firewall-checkbox =
 |  
|  | 82 | +    .label = { COPY(path, "settings.useFirewall") }
 |  
|  | 83 | +tor-advanced-dialog-firewall-ports-input =
 |  
|  | 84 | +    .placeholder = { COPY(path, "settings.allowedPortsPlaceholder") }
 |  
|  | 85 | +""",
 |  
|  | 86 | +            path=legacy_path,
 |  
|  | 87 | +        ),
 |  
|  | 88 | +    ) |  
 |