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