[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

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



Title: GitLab

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

Commits:

  • d4a4b72b
    by Henry Wilkes at 2024-04-09T19:54:28+00:00
    fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
    
    Bug 42207: Migrate preferences strings to Fluent.
    
  • 6b080bf1
    by Henry Wilkes at 2024-04-09T19:54:28+00:00
    fixup! Tor Browser strings
    
    Bug 42207: Migrate preferences strings to Fluent.
    
  • 7ff82efa
    by Henry Wilkes at 2024-04-09T19:54:28+00:00
    fixup! Add TorStrings module for localization
    
    Bug 42207: Migrate preferences strings to Fluent.
    
  • 446e78a5
    by Henry Wilkes at 2024-04-09T19:54:28+00:00
    fixup! Tor Browser localization migration scripts.
    
    Bug 42207: Migrate preferences to Fluent.
    

19 changed files:

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">&#8203;</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="&#8203;" />
    
    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="&#8203;" />
    
    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 &#8203; 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">&#8203;</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
    +    )

  • _______________________________________________
    tor-commits mailing list
    tor-commits@xxxxxxxxxxxxxxxxxxxx
    https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits