tbb-commits
Threads by month
- ----- 2026 -----
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 19863 discussions
[tor-browser/tor-browser-60.5.1esr-8.5-1] Bug 28329 - Part 1. Add new Tor resources
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit 0db4c9243320d2c516329949ee17e8b0a5b13624
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Tue Feb 19 22:45:46 2019 +0000
Bug 28329 - Part 1. Add new Tor resources
---
.../main/res/color/tor_bridges_enabled_colors.xml | 10 ++++++
.../main/res/color/tor_bridges_select_builtin.xml | 8 +++++
.../res/drawable-nodpi/tor_bootstrap_onion.gif | Bin 0 -> 137518 bytes
.../app/src/main/res/drawable/ic_settings_24px.xml | 36 +++++++++++++++++++++
.../res/drawable/list_section_divider_material.xml | 19 +++++++++++
.../drawable/list_section_divider_mtrl_alpha.9.png | Bin 0 -> 164 bytes
.../app/src/main/res/drawable/rounded_corners.xml | 11 +++++++
.../src/main/res/drawable/tor_spinning_onion.xml | 12 +++++++
mobile/android/app/src/main/res/xml/separator.xml | 13 ++++++++
.../android/app/src/photon/res/values/colors.xml | 2 ++
.../base/locales/en-US/torbrowser_strings.dtd | 32 ++++++++++++++++++
mobile/android/base/strings.xml.in | 29 +++++++++++++++++
12 files changed, 172 insertions(+)
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
new file mode 100644
index 000000000000..a51ffd547c04
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used by the Bridges Enabled switch for correct coloring -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true"
+ android:color="@color/tor_bootstrap_background" />
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
new file mode 100644
index 000000000000..948ed552d539
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used for changing the color of the radio button -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif
new file mode 100755
index 000000000000..b9478997b5d6
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif differ
diff --git a/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
new file mode 100644
index 000000000000..c582193aa12d
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!--
+ Downloaded from:
+ https://raw.githubusercontent.com/material-components/material-components-a…
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="20"
+ android:viewportHeight="20"
+ tools:ignore="NewApi">
+
+ <path
+ android:pathData="M0,0 L20,0 L20,20 L0,20 L0,0 Z" />
+ <path
+ android:fillColor="?attr/colorControlNormal"
+ android:pathData="M15.95,10.78 C15.98,10.53,16,10.27,16,10 S15.98,9.47,15.94,9.22 L17.63,7.9 C17.78,7.78,17.82,7.56,17.73,7.39 L16.13,4.62 C16.03,4.44,15.82,4.38,15.64,4.44 L13.65,5.24 C13.23,4.92,12.79,4.66,12.3,4.46 L12,2.34 C11.97,2.14,11.8,2,11.6,2 L8.4,2 C8.2,2,8.04,2.14,8.01,2.34 L7.71,4.46 C7.22,4.66,6.77,4.93,6.36,5.24 L4.37,4.44 C4.19,4.37,3.98,4.44,3.88,4.62 L2.28,7.39 C2.18,7.57,2.22,7.78,2.38,7.9 L4.07,9.22 C4.03,9.47,4,9.74,4,10 S4.02,10.53,4.06,10.78 L2.37,12.1 C2.22,12.22,2.18,12.44,2.27,12.61 L3.87,15.38 C3.97,15.56,4.18,15.62,4.36,15.56 L6.35,14.76 C6.77,15.08,7.21,15.34,7.7,15.54 L8,17.66 C8.04,17.86,8.2,18,8.4,18 L11.6,18 C11.8,18,11.97,17.86,11.99,17.66 L12.29,15.54 C12.78,15.34,13.23,15.07,13.64,14.76 L15.63,15.56 C15.81,15.63,16.02,15.56,16.12,15.38 L17.72,12.61 C17.82,12.43,17.78,12.22,17.62,12.1 L15.95,10.78 Z M10,13 C8.35,13,7,11.65,7,10 S8.35,7,10,7 S13,8.35,13,10 S11.65,13,10,13 Z" />
+</vector>
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
new file mode 100644
index 000000000000..dd66b88381fa
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Based on:
+ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-…
+-->
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/list_section_divider_mtrl_alpha"
+ android:tint="#ff000000"
+ android:alpha="0.12" />
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png
new file mode 100644
index 000000000000..12d8b2f4aa00
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png differ
diff --git a/mobile/android/app/src/main/res/drawable/rounded_corners.xml b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
new file mode 100644
index 000000000000..670da2fed66e
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- Used for rounding the corners of a button -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#FFFFFF" />
+ <corners android:radius="5dp" />
+</shape>
diff --git a/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
new file mode 100644
index 000000000000..6bcc52f87f93
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector android:height="24dp" android:viewportHeight="289"
+ android:viewportWidth="247" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF000000" android:pathData="M100.02,44.97C96.2,31.15 83.92,21.59 69.91,21.51V0c16.52,0 32.07,7.97 41.98,21.51V0h20.99v21.51C142.78,7.97 158.33,0 174.85,0v21.51c-14.01,0.08 -26.29,9.63 -30.12,23.45C203.49,54.97 41.26,54.97 100.02,44.97z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,52.47c-62.22,0 -112.65,50.44 -112.65,112.65c0,62.22 50.44,112.65 112.65,112.65V52.47z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,266.51c56,0 101.39,-45.39 101.39,-101.39c0,-56 -45.39,-101.39 -101.39,-101.39S22.53,109.13 22.53,165.12C22.53,221.12 67.92,266.51 123.92,266.51zM123.92,289.04C55.48,289.04 0,233.56 0,165.12S55.48,41.2 123.92,41.2s123.92,55.48 123.92,123.92S192.36,289.04 123.92,289.04z"/>
+ <path android:fillColor="#FF000000" android:pathData="M124.92,78.78v22.53c34.79,0.54 62.84,28.89 62.84,63.81c0,34.92 -28.04,63.28 -62.84,63.81v22.53c47.24,-0.54 85.37,-38.98 85.37,-86.34C210.29,117.76 172.16,79.32 124.92,78.78z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,116.31v22.53c14.52,0 26.29,11.77 26.29,26.29s-11.77,26.29 -26.29,26.29v22.53c26.96,0 48.82,-21.86 48.82,-48.82C172.74,138.16 150.88,116.31 123.92,116.31z"/>
+</vector>
diff --git a/mobile/android/app/src/main/res/xml/separator.xml b/mobile/android/app/src/main/res/xml/separator.xml
new file mode 100644
index 000000000000..edd95cd90a3a
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/separator.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- List item separator -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textSize="8sp"
+ android:textStyle="bold"
+ android:background="@drawable/list_section_divider_material"/>
diff --git a/mobile/android/app/src/photon/res/values/colors.xml b/mobile/android/app/src/photon/res/values/colors.xml
index b322a46fe008..2762e364dd79 100644
--- a/mobile/android/app/src/photon/res/values/colors.xml
+++ b/mobile/android/app/src/photon/res/values/colors.xml
@@ -154,6 +154,8 @@
<color name="tor_tab_inactive_text">#484848</color>
<color name="tor_tab_active_text">#7D4698</color>
<color name="tor_description_background_text">#FAFAFA</color>
+
+ <color name="tor_bootstrap_background">#420C5D</color>
<!-- Restricted profiles palette -->
<color name="restricted_profile_background_gold">#ffffcb51</color>
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index 5419f4942b3e..44b4a44ff93c 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -23,3 +23,35 @@
<!ENTITY firstrun_onionservices_title "Onion Services.">
<!ENTITY firstrun_onionservices_message "Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously.">
<!ENTITY firstrun_onionservices_next "Go to explore">
+
+<!ENTITY tor_bootstrap_swipe_for_logs "Swipe to the left to see Tor logs">
+<!ENTITY tor_bootstrap_connect "Connect">
+<!ENTITY tor_bootstrap_starting_status "We are connecting to the Tor network...">
+
+<!ENTITY pref_tor_network_title "Network">
+<!ENTITY pref_tor_select_a_bridge_title "Select a Bridge">
+<!ENTITY pref_tor_provide_a_bridge_title "Provide a Bridge">
+
+<!ENTITY pref_category_tor_network_summary "Tor Browser connects you to the Tor Network run by thousands of volunteers around the world! Can these options help you?">
+<!ENTITY pref_category_tor_bridge_summary "Bridges are unlisted Tor relays that make it more difficult to block connections into the Tor network. Because of how some countries try to block Tor, certain bridges work in some countries but not others.">
+
+<!ENTITY pref_choice_tor_bridges_enabled_title "Internet is censored here">
+<!ENTITY pref_choice_tor_bridges_enabled_summary "Tap to configure a bridge to connect to Tor">
+
+<!ENTITY pref_tor_bridges_provide_manual_button_title "Provide a Bridge I know">
+<!ENTITY pref_tor_bridges_provide_select_text_title "Select a Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_text_title "Enter Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_summary "Enter the bridge information you received from a trusted source">
+<!ENTITY pref_tor_bridges_provide_manual_address_port_placeholder "address:port">
+<!ENTITY pref_tor_hint_type_one_per_line "Type one per line">
+
+<!-- When another PT is recommended, change TorNetworkBridgeSelectPreference::saveCurrentCheckedRadioButton(), too -->
+<!ENTITY pref_bridges_type_obfs4 "obfs4 (recommended)">
+<!ENTITY pref_bridges_type_meek_azure "meek-azure">
+<!ENTITY pref_bridges_type_obfs3 "obfs3">
+<!ENTITY pref_tor_network_bridges_enabled_change_builtin "You\'re using a built-in bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_bridges_enabled_change_custom "You\'re using a custom bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_using_multiple_provided_bridges "You\'re using multiple custom bridges.">
+<!ENTITY pref_tor_network_using_a_provided_bridge "You\'re using &formatS; bridge.">
+
+<!ENTITY tor_notify_user_about_error "An error occurred, please swipe for more information.">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 2beb152ad5bb..eaa902b95060 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -82,6 +82,35 @@
<string name="firstrun_onionservices_message">&firstrun_onionservices_message;</string>
<string name="firstrun_onionservices_next">&firstrun_onionservices_next;</string>
+ <string name="pref_tor_network_title">&pref_tor_network_title;</string>
+ <string name="pref_tor_select_a_bridge_title">&pref_tor_select_a_bridge_title;</string>
+ <string name="pref_tor_provide_a_bridge_title">&pref_tor_provide_a_bridge_title;</string>
+ <string name="pref_category_tor_network_summary">&pref_category_tor_network_summary;</string>
+ <string name="pref_category_tor_bridge_summary">&pref_category_tor_bridge_summary;</string>
+ <string name="tor_notify_user_about_error">&tor_notify_user_about_error;</string>
+
+ <string name="tor_bootstrap_swipe_for_logs">&tor_bootstrap_swipe_for_logs;</string>
+ <string name="tor_bootstrap_connect">&tor_bootstrap_connect;</string>
+ <string name="tor_bootstrap_starting_status">&tor_bootstrap_starting_status;</string>
+
+ <string name="pref_choice_tor_bridges_enabled_title">&pref_choice_tor_bridges_enabled_title;</string>
+ <string name="pref_choice_tor_bridges_enabled_summary">&pref_choice_tor_bridges_enabled_summary;</string>
+ <string name="pref_bridges_type_obfs4">&pref_bridges_type_obfs4;</string>
+ <string name="pref_bridges_type_meek_azure">&pref_bridges_type_meek_azure;</string>
+ <string name="pref_bridges_type_obfs3">&pref_bridges_type_obfs3;</string>
+
+ <string name="pref_tor_bridges_provide_manual_button_title">&pref_tor_bridges_provide_manual_button_title;</string>
+ <string name="pref_tor_bridges_provide_select_text_title">&pref_tor_bridges_provide_select_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_text_title">&pref_tor_bridges_provide_manual_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_summary">&pref_tor_bridges_provide_manual_summary;</string>
+
+ <string name="pref_tor_bridges_provide_manual_address_port_placeholder">&pref_tor_bridges_provide_manual_address_port_placeholder;</string>
+ <string name="pref_tor_hint_type_one_per_line">&pref_tor_hint_type_one_per_line;</string>
+ <string name="pref_tor_network_bridges_enabled_change_custom">&pref_tor_network_bridges_enabled_change_custom;</string>
+ <string name="pref_tor_network_bridges_enabled_change_builtin">&pref_tor_network_bridges_enabled_change_builtin;</string>
+ <string name="pref_tor_network_using_multiple_provided_bridges">&pref_tor_network_using_multiple_provided_bridges;</string>
+ <string name="pref_tor_network_using_a_provided_bridge">&pref_tor_network_using_a_provided_bridge;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
1
0
[tor-browser/tor-browser-60.5.1esr-8.5-1] Bug 28329 - Part 4. Add new Tor Bootstrapping and configuration screens
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit 87d6c829225d271ba94fa21672b157085dbf1ad9
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Mar 14 02:03:26 2019 +0000
Bug 28329 - Part 4. Add new Tor Bootstrapping and configuration screens
---
.../android/app/src/main/res/layout/gecko_app.xml | 5 +
.../preference_tor_network_bridge_summary.xml | 25 +
.../preference_tor_network_bridges_enabled.xml | 85 ++
...eference_tor_network_bridges_enabled_switch.xml | 15 +
.../preference_tor_network_provide_bridge.xml | 89 ++
.../preference_tor_network_select_bridge_type.xml | 128 +++
.../app/src/main/res/layout/tor_bootstrap.xml | 86 ++
.../layout/tor_bootstrap_animation_container.xml | 20 +
.../app/src/main/res/layout/tor_bootstrap_log.xml | 37 +
.../main/res/xml/preferences_tor_network_main.xml | 15 +
.../xml/preferences_tor_network_provide_bridge.xml | 27 +
.../preferences_tor_network_select_bridge_type.xml | 17 +
mobile/android/base/AndroidManifest.xml.in | 5 +
.../base/java/org/mozilla/gecko/BrowserApp.java | 44 +-
.../TorBootstrapAnimationContainer.java | 82 ++
.../gecko/torbootstrap/TorBootstrapLogPanel.java | 54 ++
.../gecko/torbootstrap/TorBootstrapLogger.java | 17 +
.../gecko/torbootstrap/TorBootstrapPager.java | 160 ++++
.../torbootstrap/TorBootstrapPagerConfig.java | 87 ++
.../gecko/torbootstrap/TorBootstrapPanel.java | 428 ++++++++++
.../gecko/torbootstrap/TorLogEventListener.java | 128 +++
.../mozilla/gecko/torbootstrap/TorPreferences.java | 950 +++++++++++++++++++++
22 files changed, 2501 insertions(+), 3 deletions(-)
diff --git a/mobile/android/app/src/main/res/layout/gecko_app.xml b/mobile/android/app/src/main/res/layout/gecko_app.xml
index ca25841695a7..9a5d03f79409 100644
--- a/mobile/android/app/src/main/res/layout/gecko_app.xml
+++ b/mobile/android/app/src/main/res/layout/gecko_app.xml
@@ -68,6 +68,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
+ <ViewStub android:id="@+id/tor_bootstrap_pager_stub"
+ android:layout="@layout/tor_bootstrap_animation_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
</FrameLayout>
<View android:id="@+id/doorhanger_overlay"
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml
new file mode 100644
index 000000000000..d99b3c9543b0
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical" >
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tor_network_bridge_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="30sp"
+ android:paddingBottom="30sp"
+ android:paddingLeft="20sp"
+ android:paddingRight="20sp"
+ android:textSize="16sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:lineSpacingMultiplier="1.43"
+ android:text="@string/pref_category_tor_bridge_summary" />
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml
new file mode 100644
index 000000000000..8d8e4f320ba7
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Layout for a Preference in a PreferenceActivity. The
+ Preference is able to place a specific widget for its particular
+ type in the "widget_frame" layout.
+ This is a modified version of the default Android Preference layout,
+ See: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-…
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:orientation="vertical"
+ android:background="?android:attr/selectableItemBackground" >
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tor_network_configuration_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="30sp"
+ android:paddingBottom="30sp"
+ android:paddingLeft="20sp"
+ android:paddingRight="20sp"
+ android:textSize="16sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:lineSpacingMultiplier="1.43"
+ android:text="@string/pref_category_tor_network_summary" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical" >
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ />
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="15dp"
+ android:layout_marginEnd="6dp"
+ android:layout_marginTop="6dp"
+ android:layout_marginBottom="12dp"
+ android:layout_weight="1">
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:textColorLink="#8000FF"
+ android:clickable="true"
+ android:focusable="false"
+ android:maxLines="2" />
+ </RelativeLayout>
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml
new file mode 100644
index 000000000000..3ab276f0916c
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<Switch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+android:id/switch_widget"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="false"
+ android:clickable="true"
+ android:thumbTint="@color/tor_bridges_enabled_colors"
+ android:trackTint="@color/tor_bridges_enabled_colors"
+ android:background="@null" />
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml
new file mode 100644
index 000000000000..9e72b44ae734
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:orientation="vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:gravity="center_vertical"
+ android:background="?android:attr/selectableItemBackground" >
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16sp"
+ android:paddingRight="16sp"
+ android:orientation="vertical" >
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="30sp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:maxLines="4" />
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+ <EditText
+ android:id="@+id/tor_network_provide_bridge1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="10dp"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ <EditText
+ android:id="@+id/tor_network_provide_bridge2"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="10dp"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ <EditText
+ android:id="@+id/tor_network_provide_bridge3"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ </LinearLayout>
+ </LinearLayout>
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
new file mode 100644
index 000000000000..2c1632bb8268
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:orientation="vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:gravity="center_vertical"
+ android:background="?android:attr/selectableItemBackground" >
+
+ <!-- Include the Bridge description -->
+ <include layout="@layout/preference_tor_network_bridge_summary" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="20sp"
+ android:orientation="vertical" >
+ <LinearLayout
+ android:id="@+id/title_and_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="40dp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:maxLines="4" />
+ </LinearLayout>
+ <include layout="@xml/separator" />
+ <RadioGroup
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="20sp"
+ android:visibility="gone"
+ android:layoutDirection="rtl"
+ android:id="@+id/pref_radio_group_builtin_bridges_type">
+ <RadioButton android:id="@+id/radio_pref_bridges_obfs4"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_obfs4"/>
+ <include layout="@xml/separator" />
+ <RadioButton android:id="@+id/radio_pref_bridges_meek_azure"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_meek_azure"/>
+ <include layout="@xml/separator" />
+ <RadioButton android:id="@+id/radio_pref_bridges_obfs3"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_obfs3"/>
+ <include layout="@xml/separator" />
+ </RadioGroup>
+ </LinearLayout>
+
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:paddingTop="20sp"
+ android:paddingLeft="20sp"
+ android:id="@+id/tor_network_provide_a_bridge"
+ android:orientation="vertical">
+ <TextView
+ android:id="@+id/tor_network_provide_a_bridge_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:text="@string/pref_tor_bridges_provide_manual_button_title"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView
+ android:id="@+id/tor_network_provide_a_bridge_summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="30dp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:text="@string/pref_tor_bridges_provide_manual_summary"
+ android:maxLines="4" />
+ <include layout="@xml/separator" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap.xml
new file mode 100644
index 000000000000..ce2b1c910a44
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ <ImageView android:id="@+id/tor_bootstrap_settings_gear"
+ app:srcCompat="@drawable/ic_settings_24px"
+ android:tint="#ffffffff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="25dp"
+ android:layout_marginRight="20dp"
+ android:layout_alignParentRight="true" />
+
+ <!-- These three elements are rendered in reverse order -->
+ <TextView android:id="@+id/tor_bootstrap_swipe_log"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:width="301dp"
+ android:height="24dp"
+ android:layout_marginBottom="20dp"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentBottom="true"
+ android:gravity="center"
+ android:visibility="invisible"
+ android:textSize="14sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#FFFFFFFF"
+ android:lineSpacingMultiplier="1.71"
+ android:text="@string/tor_bootstrap_swipe_for_logs"/>
+
+ <Button android:id="@+id/tor_bootstrap_connect"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="7dp"
+ android:width="144dp"
+ android:height="48dp"
+ android:textSize="14sp"
+ android:layout_above="@id/tor_bootstrap_swipe_log"
+ android:layout_centerHorizontal="true"
+ android:background="@drawable/rounded_corners"
+ android:fontFamily="Roboto-Medium"
+ android:textColor="@color/tor_bootstrap_background"
+ android:lineSpacingMultiplier="1.14"
+ android:text="@string/tor_bootstrap_connect" />
+
+ <TextView android:id="@+id/tor_bootstrap_last_status_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:width="301dp"
+ android:height="24dp"
+ android:layout_marginBottom="40dp"
+ android:layout_above="@id/tor_bootstrap_connect"
+ android:layout_centerHorizontal="true"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="14sp"
+ android:fontFamily="RobotoMono-Regular"
+ android:textColor="@android:color/white"
+ android:lineSpacingMultiplier="2"
+ android:visibility="invisible" />
+
+ <!-- Keep the src synchronized with TorBootstrapPanel::stopBootstrapping() -->
+ <ImageView android:id="@+id/tor_bootstrap_onion"
+ app:srcCompat="@drawable/tor_spinning_onion"
+ android:scaleType="fitCenter"
+ android:tint="#ffffffff"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginTop="130dp"
+ android:layout_marginBottom="37dp"
+ android:layout_marginRight="95dp"
+ android:layout_marginLeft="95dp"
+ android:layout_centerHorizontal="true"
+ android:layout_below="@id/tor_bootstrap_settings_gear"
+ android:layout_above="@id/tor_bootstrap_last_status_message"
+ android:paddingLeft="20dp"
+ android:paddingRight="20dp"/>
+</RelativeLayout>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml
new file mode 100644
index 000000000000..04dfeb0f3509
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ <org.mozilla.gecko.torbootstrap.TorBootstrapPager
+ android:id="@+id/tor_bootstrap_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ </org.mozilla.gecko.torbootstrap.TorBootstrapPager>
+</org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml
new file mode 100644
index 000000000000..c2f02d658d50
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+
+ <ImageView android:id="@+id/tor_bootstrap_settings_gear"
+ app:srcCompat="@drawable/ic_settings_24px"
+ android:tint="#ffffffff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="25dp"
+ android:layout_marginRight="20dp"
+ android:layout_alignParentRight="true" />
+
+ <!-- Encapsulate the TextView within the ScrollView so the view is scrollable -->
+ <ScrollView android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_below="@id/tor_bootstrap_settings_gear" >
+ <TextView android:id="@+id/tor_bootstrap_last_status_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@android:color/white"
+ android:fontFamily="RobotoMono-Regular"
+ android:textSize="14sp"
+ android:textIsSelectable="true"
+ android:layout_marginLeft="20dp"
+ android:layout_marginRight="20dp" />
+ </ScrollView>
+</RelativeLayout>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml
new file mode 100644
index 000000000000..c397bd7c1fc9
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+ <SwitchPreference android:key="android.not_a_preference.tor.bridges.enabled"
+ android:title="@string/pref_choice_tor_bridges_enabled_title"
+ android:summaryOff="@string/pref_choice_tor_bridges_enabled_summary"
+ android:selectable="false"
+ android:layout="@layout/preference_tor_network_bridges_enabled"
+ android:widgetLayout="@layout/preference_tor_network_bridges_enabled_switch" />
+</PreferenceScreen>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml
new file mode 100644
index 000000000000..e8346f4fec63
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+
+
+ <!-- Ideally, this preference would not be needed. We would move the
+ summary into the tor.bridges.provide preference. However, there is
+ a bug in the layout where typing in the text field isn't shown until
+ the user presses the back button. This only occurs when the EditText
+ View is under the first ViewGroup under the ListView. -->
+ <Preference
+ android:layout="@layout/preference_tor_network_bridge_summary"
+ android:selectable="false"
+ android:shouldDisableView="false"
+ android:enabled="false"/>
+
+ <Preference
+ android:key="android.not_a_preference.tor.bridges.provide"
+ android:layout="@layout/preference_tor_network_provide_bridge"
+ android:title="@string/pref_tor_bridges_provide_manual_text_title"
+ android:summary="@string/pref_tor_bridges_provide_manual_summary" />
+</PreferenceScreen>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml
new file mode 100644
index 000000000000..0bcc18c38997
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+
+ <Preference
+ android:key="android.not_a_preference.tor.bridges.type"
+ android:layout="@layout/preference_tor_network_select_bridge_type"
+ android:title="@string/pref_tor_bridges_provide_select_text_title"
+ android:summary="@string/pref_choice_tor_bridges_enabled_summary"
+ android:selectable="false"/>
+
+</PreferenceScreen>
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 72b1e16925b7..01b23d22a19b 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -501,5 +501,10 @@
android:stopWithTask="true">
</service>
+ <activity android:name="org.mozilla.gecko.torbootstrap.TorPreferences"
+ android:theme="@style/Gecko.Preferences"
+ android:configChanges="orientation|screenSize|locale|layoutDirection"
+ android:excludeFromRecents="true"/>
+
</application>
</manifest>
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 464b4054c9ff..f8af42f09b5f 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -158,6 +158,7 @@ import org.mozilla.gecko.toolbar.AutocompleteHandler;
import org.mozilla.gecko.toolbar.BrowserToolbar;
import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState;
import org.mozilla.gecko.toolbar.PwaConfirm;
+import org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer;
import org.mozilla.gecko.trackingprotection.TrackingProtectionPrompt;
import org.mozilla.gecko.updater.PostUpdateHandler;
import org.mozilla.gecko.updater.UpdateServiceHelper;
@@ -266,6 +267,7 @@ public class BrowserApp extends GeckoApp
private TabStripInterface mTabStrip;
private AnimatedProgressBar mProgressView;
private FirstrunAnimationContainer mFirstrunAnimationContainer;
+ private TorBootstrapAnimationContainer mTorBootstrapAnimationContainer;
private HomeScreen mHomeScreen;
private TabsPanel mTabsPanel;
@@ -486,7 +488,7 @@ public class BrowserApp extends GeckoApp
mVideoPlayer.stop();
}
- if (Tabs.getInstance().isSelectedTab(tab) && mDynamicToolbar.isEnabled()) {
+ if (Tabs.getInstance().isSelectedTab(tab) && mDynamicToolbar.isEnabled() && !isTorBootstrapVisible()) {
final VisibilityTransition transition = (tab.getShouldShowToolbarWithoutAnimationOnFirstSelection()) ?
VisibilityTransition.IMMEDIATE : VisibilityTransition.ANIMATE;
mDynamicToolbar.setVisible(true, transition);
@@ -496,7 +498,7 @@ public class BrowserApp extends GeckoApp
}
// fall through
case LOCATION_CHANGE:
- if (Tabs.getInstance().isSelectedTab(tab)) {
+ if (Tabs.getInstance().isSelectedTab(tab) && !isTorBootstrapVisible()) {
updateHomePagerForTab(tab);
}
@@ -509,7 +511,7 @@ public class BrowserApp extends GeckoApp
if (Tabs.getInstance().isSelectedTab(tab)) {
invalidateOptionsMenu();
- if (mDynamicToolbar.isEnabled()) {
+ if (mDynamicToolbar.isEnabled() && !isTorBootstrapVisible()) {
mDynamicToolbar.setVisible(true, VisibilityTransition.ANIMATE);
}
}
@@ -1359,6 +1361,10 @@ public class BrowserApp extends GeckoApp
final SafeIntent intent = new SafeIntent(getIntent());
if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
+ if (mTorNeedsStart) {
+ showTorBootstrapPager();
+ }
+
// We can't show the first run experience until Gecko has finished initialization (bug 1077583).
checkFirstrun(this, intent);
}
@@ -2756,6 +2762,11 @@ public class BrowserApp extends GeckoApp
&& mHomeScreenContainer != null && mHomeScreenContainer.getVisibility() == View.VISIBLE);
}
+ private boolean isTorBootstrapVisible() {
+ return (mTorBootstrapAnimationContainer != null && mTorBootstrapAnimationContainer.isVisible()
+ && mHomeScreenContainer != null && mHomeScreenContainer.getVisibility() == View.VISIBLE);
+ }
+
/**
* Enters editing mode with the current tab's URL. There might be no
* tabs loaded by the time the user enters editing mode e.g. just after
@@ -3107,6 +3118,33 @@ public class BrowserApp extends GeckoApp
}
}
+ private void showTorBootstrapPager() {
+
+ if (mTorBootstrapAnimationContainer == null) {
+ // We can't use toggleToolbarChrome() because that uses INVISIBLE, but we need GONE
+ mBrowserChrome.setVisibility(View.GONE);
+ final ViewStub torBootstrapPagerStub = (ViewStub) findViewById(R.id.tor_bootstrap_pager_stub);
+ mTorBootstrapAnimationContainer = (TorBootstrapAnimationContainer) torBootstrapPagerStub.inflate();
+ mTorBootstrapAnimationContainer.load(this, getSupportFragmentManager());
+ mTorBootstrapAnimationContainer.registerOnFinishListener(new TorBootstrapAnimationContainer.OnFinishListener() {
+ @Override
+ public void onFinish() {
+ // Show the chrome again
+ toggleToolbarChrome(true);
+ // When the content loaded in the background (such as about:tor),
+ // it was loaded while mBrowserChrome was GONE. We should refresh the
+ // height now so the page is rendered correctly.
+ Tabs.getInstance().getSelectedTab().doReload(false);
+
+ // If we finished, then Tor bootstrapped 100%
+ mTorNeedsStart = false;
+ }
+ });
+ }
+
+ mHomeScreenContainer.setVisibility(View.VISIBLE);
+ }
+
private void showFirstrunPager() {
if (mFirstrunAnimationContainer == null) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java
new file mode 100644
index 000000000000..188e03df0092
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java
@@ -0,0 +1,82 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.v4.app.FragmentManager;
+import android.util.AttributeSet;
+
+import android.view.View;
+import android.widget.LinearLayout;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.firstrun.FirstrunAnimationContainer;
+
+/**
+ * A container for the bootstrapping flow.
+ *
+ * Mostly a modified version of FirstrunAnimationContainer
+ */
+public class TorBootstrapAnimationContainer extends FirstrunAnimationContainer {
+
+ public static interface OnFinishListener {
+ public void onFinish();
+ }
+
+ private TorBootstrapPager pager;
+ private boolean visible;
+
+ // Provides a callback so BrowserApp can execute an action
+ // when the bootstrapping is complete and the bootstrapping
+ // screen closes.
+ private OnFinishListener onFinishListener;
+
+ public TorBootstrapAnimationContainer(Context context) {
+ this(context, null);
+ }
+ public TorBootstrapAnimationContainer(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void load(Activity activity, FragmentManager fm) {
+ visible = true;
+ pager = findViewById(R.id.tor_bootstrap_pager);
+ pager.load(activity, fm, new OnFinishListener() {
+ @Override
+ public void onFinish() {
+ hide();
+ }
+ });
+ }
+
+ public void hide() {
+ visible = false;
+ if (onFinishListener != null) {
+ onFinishListener.onFinish();
+ }
+ animateHide();
+ }
+
+ private void animateHide() {
+ final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0);
+ alphaAnimator.setDuration(150);
+ alphaAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ TorBootstrapAnimationContainer.this.setVisibility(View.GONE);
+ }
+ });
+
+ alphaAnimator.start();
+ }
+
+ public void registerOnFinishListener(OnFinishListener listener) {
+ onFinishListener = listener;
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java
new file mode 100644
index 000000000000..18d827cec216
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java
@@ -0,0 +1,54 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import org.mozilla.gecko.R;
+
+/**
+ * Simple subclass of TorBootstrapPanel specifically for showing
+ * Tor and Orbot log entries.
+ */
+public class TorBootstrapLogPanel extends TorBootstrapPanel {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ mRoot = (ViewGroup) inflater.inflate(R.layout.tor_bootstrap_log, container, false);
+
+ if (mRoot == null) {
+ Log.w(LOGTAG, "Inflating R.layout.tor_bootstrap returned null");
+ return null;
+ }
+
+ TorLogEventListener.addLogger(this);
+
+ return mRoot;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstance) {
+ super.onViewCreated(view, savedInstance);
+ // Inherited from the super class
+ configureGearCogClickHandler();
+ }
+
+ // TODO Add a button for Go-to-bottom
+ @Override
+ public void updateStatus(String torServiceMsg, String newTorStatus) {
+ if (torServiceMsg == null) {
+ return;
+ }
+ TextView torLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ torLog.append("- " + torServiceMsg + "\n");
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java
new file mode 100644
index 000000000000..24c9321beb63
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java
@@ -0,0 +1,17 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+
+// Simple interface for a logger.
+//
+// The current implementers are TorBootstrapPanel and
+// TorBootstrapLogPanel.
+public interface TorBootstrapLogger {
+ public void updateStatus(String torServiceMsg, String newTorStatus);
+ public Activity getActivity();
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java
new file mode 100644
index 000000000000..b780810f14ab
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java
@@ -0,0 +1,160 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+
+import org.mozilla.gecko.firstrun.FirstrunPager;
+
+import java.util.List;
+
+/**
+ * ViewPager containing our bootstrapping pages.
+ *
+ * Based on FirstrunPager for simplicity
+ */
+public class TorBootstrapPager extends FirstrunPager {
+
+ private Context context;
+ private Activity mActivity;
+ protected TorBootstrapPanel.PagerNavigation pagerNavigation;
+
+ public TorBootstrapPager(Context context) {
+ this(context, null);
+ }
+
+ public TorBootstrapPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ this.context = context;
+ }
+
+ @Override
+ public void addView(View child, int index, ViewGroup.LayoutParams params) {
+ super.addView(child, index, params);
+ }
+
+ // Load the default (hard-coded) panels from TorBootstrapPagerConfig
+ // Mostly copied from super
+ public void load(Activity activity, FragmentManager fm, final TorBootstrapAnimationContainer.OnFinishListener onFinishListener) {
+ mActivity = activity;
+ final List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels = TorBootstrapPagerConfig.getDefaultBootstrapPanel();
+
+ setAdapter(new ViewPagerAdapter(fm, panels));
+ this.pagerNavigation = new TorBootstrapPanel.PagerNavigation() {
+ @Override
+ public void next() {
+ // No-op implementation.
+ }
+
+ @Override
+ public void finish() {
+ if (onFinishListener != null) {
+ onFinishListener.onFinish();
+ }
+ }
+ };
+
+ animateLoad();
+ }
+
+ // Copied from super
+ private void animateLoad() {
+ setTranslationY(500);
+ setAlpha(0);
+
+ final Animator translateAnimator = ObjectAnimator.ofFloat(this, "translationY", 0);
+ translateAnimator.setDuration(400);
+
+ final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 1);
+ alphaAnimator.setStartDelay(200);
+ alphaAnimator.setDuration(600);
+
+ final AnimatorSet set = new AnimatorSet();
+ set.playTogether(alphaAnimator, translateAnimator);
+ set.setStartDelay(400);
+
+ set.start();
+ }
+
+ // Provide an interface for inter-panel communication allowing
+ // the logging panel to stop the bootstrapping animation on the
+ // main panel.
+ public interface TorBootstrapController {
+ void startBootstrapping();
+ void stopBootstrapping();
+ }
+
+ // Mostly copied from FirstrunPager
+ protected class ViewPagerAdapter extends FragmentPagerAdapter implements TorBootstrapController {
+ private final List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels;
+ private final Fragment[] fragments;
+
+ public ViewPagerAdapter(FragmentManager fm, List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels) {
+ super(fm);
+ this.panels = panels;
+ this.fragments = new Fragment[panels.size()];
+ }
+
+ @Override
+ public Fragment getItem(int i) {
+ Fragment fragment = fragments[i];
+ if (fragment == null) {
+ TorBootstrapPagerConfig.TorBootstrapPanelConfig panelConfig = panels.get(i);
+ // We know the class is within the "org.mozilla.gecko.torbootstrap" package namespace
+ fragment = Fragment.instantiate(mActivity.getApplicationContext(), panelConfig.getClassname(), panelConfig.getArgs());
+ ((TorBootstrapPanel) fragment).setPagerNavigation(pagerNavigation);
+ ((TorBootstrapPanel) fragment).setContext(mActivity);
+ ((TorBootstrapPanel) fragment).setBootstrapController(this);
+ fragments[i] = fragment;
+ }
+ return fragment;
+ }
+
+ @Override
+ public int getCount() {
+ return panels.size();
+ }
+
+ @Override
+ public CharSequence getPageTitle(int i) {
+ return context.getString(panels.get(i).getTitleRes()).toUpperCase();
+ }
+
+ public void startBootstrapping() {
+ if (fragments.length == 0) {
+ return;
+ }
+
+ TorBootstrapPanel mainPanel = (TorBootstrapPanel) getItem(0);
+ if (mainPanel == null) {
+ return;
+ }
+ mainPanel.startBootstrapping();
+ }
+
+ public void stopBootstrapping() {
+ if (fragments.length == 0) {
+ return;
+ }
+
+ TorBootstrapPanel mainPanel = (TorBootstrapPanel) getItem(0);
+ if (mainPanel == null) {
+ return;
+ }
+ mainPanel.stopBootstrapping();
+ }
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java
new file mode 100644
index 000000000000..7eb5f77fe8ca
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java
@@ -0,0 +1,87 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.os.Bundle;
+import android.util.Log;
+import org.mozilla.gecko.GeckoSharedPrefs;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.Experiments;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class TorBootstrapPagerConfig {
+ public static final String LOGTAG = "TorBootstrapPagerConfig";
+
+ public static final String KEY_IMAGE = "imageRes";
+ public static final String KEY_TEXT = "textRes";
+ public static final String KEY_SUBTEXT = "subtextRes";
+ public static final String KEY_CTATEXT = "ctatextRes";
+
+ public static List<TorBootstrapPanelConfig> getDefaultConnectPanel() {
+ final List<TorBootstrapPanelConfig> panels = new LinkedList<>();
+ panels.add(SimplePanelConfigs.connectPanelConfig);
+
+ return panels;
+ }
+
+ public static List<TorBootstrapPanelConfig> getDefaultBootstrapPanel() {
+ final List<TorBootstrapPanelConfig> panels = new LinkedList<>();
+ panels.add(SimplePanelConfigs.bootstrapPanelConfig);
+ panels.add(SimplePanelConfigs.torLogPanelConfig);
+
+ return panels;
+ }
+
+ public static class TorBootstrapPanelConfig {
+
+ private String classname;
+ private int titleRes;
+ private Bundle args;
+
+ public TorBootstrapPanelConfig(String resource, int titleRes) {
+ this(resource, titleRes, -1, -1, -1, true);
+ }
+
+ public TorBootstrapPanelConfig(String classname, int titleRes, int imageRes, int textRes, int subtextRes) {
+ this(classname, titleRes, imageRes, textRes, subtextRes, false);
+ }
+
+ private TorBootstrapPanelConfig(String classname, int titleRes, int imageRes, int textRes, int subtextRes, boolean isCustom) {
+ this.classname = classname;
+ this.titleRes = titleRes;
+
+ if (!isCustom) {
+ this.args = new Bundle();
+ this.args.putInt(KEY_IMAGE, imageRes);
+ this.args.putInt(KEY_TEXT, textRes);
+ this.args.putInt(KEY_SUBTEXT, subtextRes);
+ }
+ }
+
+ public String getClassname() {
+ return this.classname;
+ }
+
+ public int getTitleRes() {
+ return this.titleRes;
+ }
+
+ public Bundle getArgs() {
+ return args;
+ }
+ }
+
+ private static class SimplePanelConfigs {
+ public static final TorBootstrapPanelConfig connectPanelConfig = new TorBootstrapPanelConfig(TorBootstrapPanel.class.getName(), R.string.firstrun_panel_title_welcome);
+ public static final TorBootstrapPanelConfig bootstrapPanelConfig = new TorBootstrapPanelConfig(TorBootstrapPanel.class.getName(), R.string.firstrun_panel_title_welcome);
+ public static final TorBootstrapPanelConfig torLogPanelConfig = new TorBootstrapPanelConfig(TorBootstrapLogPanel.class.getName(), R.string.firstrun_panel_title_privacy);
+
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java
new file mode 100644
index 000000000000..584c0fc3cdde
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java
@@ -0,0 +1,428 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.Animatable2;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.util.Log;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.firstrun.FirstrunPanel;
+
+import org.torproject.android.service.OrbotConstants;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.util.TorServiceUtils;
+
+
+/**
+ * Tor Bootstrap panel (fragment/screen)
+ *
+ * This is based on the Firstrun Panel for simplicity.
+ */
+public class TorBootstrapPanel extends FirstrunPanel implements TorBootstrapLogger {
+
+ protected static final String LOGTAG = "TorBootstrap";
+
+ protected ViewGroup mRoot;
+ protected Activity mActContext;
+ protected TorBootstrapPager.TorBootstrapController mBootstrapController;
+
+ // These are used by the background AlphaChanging thread for dynamically changing
+ // the alpha value of the Onion during bootstrap.
+ private int mOnionCurrentAlpha = 255;
+ // This is either +1 or -1, depending on the direction of the change.
+ private int mOnionCurrentAlphaDirection = -1;
+ private Object mOnionAlphaChangerLock = new Object();
+ private boolean mOnionAlphaChangerRunning = false;
+
+ // Runnable for changing the alpha of the Onion image every 100 milliseconds.
+ // It gradually increases and then decreases the alpha in the background and
+ // then applies the new alpha on the UI thread.
+ private Thread mChangeOnionAlphaThread = null;
+ final private class ChangeOnionAlphaRunnable implements Runnable {
+ @Override
+ public void run() {
+ while (true) {
+ synchronized(mOnionAlphaChangerLock) {
+ if (!mOnionAlphaChangerRunning) {
+ // Null the reference for this thread when we exit
+ mChangeOnionAlphaThread = null;
+ return;
+ }
+ }
+
+ // Choose the new value here, mOnionCurrentAlpha is set in setOnionAlphaValue()
+ // Increase by 5 if mOnionCurrentAlphaDirection is positive, and decrease by
+ // 5 if mOnionCurrentAlphaDirection is negative.
+ final int newAlpha = mOnionCurrentAlpha + mOnionCurrentAlphaDirection*5;
+ getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ setOnionAlphaValue(newAlpha);
+ }
+ });
+
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ mRoot = (ViewGroup) inflater.inflate(R.layout.tor_bootstrap, container, false);
+ if (mRoot == null) {
+ Log.w(LOGTAG, "Inflating R.layout.tor_bootstrap returned null");
+ return null;
+ }
+
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "Finding the Connect button failed. Did the ID change?");
+ return null;
+ }
+
+ connectButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startBootstrapping();
+ }
+ });
+
+ // This should be declared in the xml layout, however there is a bug
+ // preventing this (the XML attribute isn't actually defined in the
+ // SDK).
+ // https://issuetracker.google.com/issues/37036728
+ connectButton.setClipToOutline(true);
+
+ configureGearCogClickHandler();
+
+ TorLogEventListener.addLogger(this);
+
+ return mRoot;
+ }
+
+ private void setOnionAlphaValue(int newAlpha) {
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+ if (onionImg == null) {
+ return;
+ }
+
+ if (newAlpha > 255) {
+ // Cap this at 255 and change direction of animation
+ newAlpha = 255;
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionCurrentAlphaDirection = -1;
+ }
+ } else if (newAlpha < 0) {
+ // Lower-bound this at 0 and change direction of animation
+ newAlpha = 0;
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionCurrentAlphaDirection = 1;
+ }
+ }
+ onionImg.setImageAlpha(newAlpha);
+ mOnionCurrentAlpha = newAlpha;
+ }
+
+ public void updateStatus(String torServiceMsg, String newTorStatus) {
+ final String noticePrefix = "NOTICE: ";
+
+ if (torServiceMsg == null) {
+ return;
+ }
+
+ TextView torLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torLog == null) {
+ Log.w(LOGTAG, "updateStatus: torLog is null?");
+ }
+ // Only show Notice-level log messages on this panel
+ if (torServiceMsg.startsWith(noticePrefix)) {
+ // Drop the prefix
+ String msg = torServiceMsg.substring(noticePrefix.length());
+ torLog.setText(msg);
+ } else if (torServiceMsg.toLowerCase().contains("error")) {
+ torLog.setText(R.string.tor_notify_user_about_error);
+
+ // This may be a false-positive, but if we encountered an error within
+ // the OrbotService then there's likely nothing the user can do. This
+ // isn't persistent, so if they restart the app the button will be
+ // visible again.
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "updateStatus: Finding the Connect button failed. Did the ID change?");
+ } else {
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "updateStatus: swipeLeftLog is null?");
+ }
+
+ // Abuse this by showing the log message despite not bootstrapping
+ toggleVisibleElements(true, torLog, connectButton, swipeLeftLog);
+ }
+ }
+
+ // Return to the browser when we reach 100% bootstrapped
+ if (torServiceMsg.contains(TorServiceConstants.TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)) {
+ // Inform the background AlphaChanging thread it should terminate
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+ close();
+ }
+ }
+
+ public void setContext(Activity ctx) {
+ mActContext = ctx;
+ }
+
+ // Save the TorBootstrapController.
+ // This method won't be used by the main TorBootstrapPanel (|this|), but
+ // it will be used by its childen.
+ public void setBootstrapController(TorBootstrapPager.TorBootstrapController bootstrapController) {
+ mBootstrapController = bootstrapController;
+ }
+
+ private void startTorService() {
+ Intent torService = new Intent(getActivity(), TorService.class);
+ torService.setAction(TorServiceConstants.ACTION_START);
+ getActivity().startService(torService);
+ }
+
+ private void stopTorService() {
+ // First, stop the current bootstrapping process (if it's in progress)
+ // TODO Ideally, we'd DisableNetwork here, but that's not available.
+ Intent torService = new Intent(getActivity(), TorService.class);
+ getActivity().stopService(torService);
+ }
+
+ // Setup OnClick handler for the settings gear/cog
+ protected void configureGearCogClickHandler() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "configureGearCogClickHandler: mRoot is null?");
+ return;
+ }
+
+ final ImageView gearSettingsImage = mRoot.findViewById(R.id.tor_bootstrap_settings_gear);
+ if (gearSettingsImage == null) {
+ Log.w(LOGTAG, "configureGearCogClickHandler: gearSettingsImage is null?");
+ return;
+ }
+
+ gearSettingsImage.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // The existance of the connect button is an indicator of the user
+ // interacting with the main bootstrapping screen or the loggin screen.
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "gearSettingsImage onClick: Finding the Connect button failed, proxying request.");
+
+ // If there isn't a connect button on this screen, then proxy the
+ // stopBootstrapping() request via the TorBootstrapController (which
+ // is the underlying PagerAdapter).
+ mBootstrapController.stopBootstrapping();
+ } else {
+ stopBootstrapping();
+ }
+ // Open Tor Network Settings preferences screen
+ Intent intent = new Intent(mActContext, TorPreferences.class);
+ mActContext.startActivity(intent);
+ }
+ });
+ }
+
+ private void toggleVisibleElements(boolean bootstrapping, TextView lastStatus, Button connect, TextView swipeLeft) {
+ final int connectVisible = bootstrapping ? View.INVISIBLE : View.VISIBLE;
+ final int infoTextVisible = bootstrapping ? View.VISIBLE : View.INVISIBLE;
+
+ if (connect != null) {
+ connect.setVisibility(connectVisible);
+ }
+ if (lastStatus != null) {
+ lastStatus.setVisibility(infoTextVisible);
+ }
+ if (swipeLeft != null) {
+ swipeLeft.setVisibility(infoTextVisible);
+ }
+ }
+
+ private void startBackgroundAlphaChangingThread() {
+ // If it is non-null, then this is a bug because the thread should null this reference when
+ // it terminates.
+ if (mChangeOnionAlphaThread != null) {
+ if (mChangeOnionAlphaThread.getState() == Thread.State.TERMINATED) {
+ // The thread likely terminated unexpectedly, null the reference.
+ // The thread should set this itself.
+ Log.i(LOGTAG, "mChangeOnionAlphaThread.getState(): is terminated");
+ mChangeOnionAlphaThread = null;
+ } else {
+ // Don't null the reference in this case because then we'll start another
+ // background thread. We are currently in an unknown state, simply set
+ // the Running flag as false.
+ Log.w(LOGTAG, "We're in an unexpected state. mChangeOnionAlphaThread.getState(): " + mChangeOnionAlphaThread.getState());
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+ }
+ }
+
+ // If the background thread is not currently running, then start it.
+ if (mChangeOnionAlphaThread == null) {
+ mChangeOnionAlphaThread = new Thread(new ChangeOnionAlphaRunnable());
+ if (mChangeOnionAlphaThread == null) {
+ Log.w(LOGTAG, "Instantiating a new ChangeOnionAlphaRunnable Thread failed.");
+ } else if (mChangeOnionAlphaThread.getState() == Thread.State.NEW) {
+ Log.i(LOGTAG, "Starting mChangeOnionAlphaThread");
+
+ // Synchronization across threads should not be necessary because there
+ // shouldn't be any other threads relying on mOnionAlphaChangerRunning.
+ // We do this purely for safety.
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = true;
+ }
+
+ mChangeOnionAlphaThread.start();
+ }
+ }
+ }
+
+ public void startBootstrapping() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "startBootstrapping: mRoot is null?");
+ return;
+ }
+ // We're starting bootstrap, transition into the bootstrapping-tor-panel
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "startBootstrapping: connectButton is null?");
+ return;
+ }
+
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+
+ // Replace the current non-animated image with the animation
+ onionImg.setImageResource(R.drawable.tor_spinning_onion);
+
+ Drawable drawableOnion = onionImg.getDrawable();
+ if (Build.VERSION.SDK_INT >= 23 && drawableOnion instanceof Animatable2) {
+ Animatable2 spinningOnion = (Animatable2) drawableOnion;
+ // Begin spinning
+ spinningOnion.start();
+ } else {
+ Log.i(LOGTAG, "Animatable2 is not supported (or bad inheritance), version: " + Build.VERSION.SDK_INT);
+ }
+
+ mOnionCurrentAlpha = 255;
+ // The onion should have 100% alpha, begin decreasing it.
+ mOnionCurrentAlphaDirection = -1;
+ startBackgroundAlphaChangingThread();
+
+ TextView torStatus = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torStatus == null) {
+ Log.w(LOGTAG, "startBootstrapping: torStatus is null?");
+ return;
+ }
+
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "startBootstrapping: swipeLeftLog is null?");
+ return;
+ }
+
+ torStatus.setText(getString(R.string.tor_bootstrap_starting_status));
+
+ toggleVisibleElements(true, torStatus, connectButton, swipeLeftLog);
+ startTorService();
+ }
+
+ // This is public because this Pager may call this method if another Panel requests it.
+ public void stopBootstrapping() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "stopBootstrapping: mRoot is null?");
+ return;
+ }
+ // Transition from the animated bootstrapping panel to
+ // the static "Connect" panel
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "stopBootstrapping: connectButton is null?");
+ return;
+ }
+
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+ if (onionImg == null) {
+ Log.w(LOGTAG, "stopBootstrapping: onionImg is null?");
+ return;
+ }
+
+ // Inform the background AlphaChanging thread it should terminate.
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+
+ Drawable drawableOnion = onionImg.getDrawable();
+
+ // If the connect button wasn't pressed previously, then this object is
+ // not an animation (it is most likely a BitmapDrawable). Only manipulate
+ // it when it is an Animatable2.
+ if (Build.VERSION.SDK_INT >= 23 && drawableOnion instanceof Animatable2) {
+ Animatable2 spinningOnion = (Animatable2) drawableOnion;
+ // spinningOnion is null if we didn't previously call startBootstrapping.
+ // If we reach here and spinningOnion is null, then there is likely a bug
+ // because stopBootstrapping() is called only when the user selects the
+ // gear button and we should only reach this block if the user pressed the
+ // connect button (thus creating and enabling the animation) and then
+ // pressing the gear button. Therefore, if the drawableOnion is an
+ // Animatable2, then spinningOnion should be non-null.
+ if (spinningOnion != null) {
+ spinningOnion.stop();
+
+ onionImg.setImageResource(R.drawable.tor_spinning_onion);
+ }
+ } else {
+ Log.i(LOGTAG, "Animatable2 is not supported (or bad inheritance), version: " + Build.VERSION.SDK_INT);
+ }
+
+ // Reset the onion's alpha value.
+ onionImg.setImageAlpha(255);
+
+ TextView torStatus = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torStatus == null) {
+ Log.w(LOGTAG, "stopBootstrapping: torStatus is null?");
+ return;
+ }
+
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "stopBootstrapping: swipeLeftLog is null?");
+ return;
+ }
+
+ // Reset the displayed message
+ torStatus.setText("");
+
+ toggleVisibleElements(false, torStatus, connectButton, swipeLeftLog);
+ stopTorService();
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java
new file mode 100644
index 000000000000..6218763475e5
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java
@@ -0,0 +1,128 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.content.LocalBroadcastManager;
+
+import org.torproject.android.service.OrbotConstants;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.util.TorServiceUtils;
+
+import java.util.Vector;
+
+
+/**
+ * This is simply a container for capturing the log events and proxying them
+ * to the TorBootstrapLogger implementers (TorBootstrapPanel and TorBootstrapLogPanel now).
+ *
+ * This should be in BrowserApp, but that class/Activity is already too large,
+ * so this should be easier to reason about.
+ */
+public class TorLogEventListener {
+
+ private static Vector<TorBootstrapLogger> mLoggers;
+
+ private TorLogEventListener instance;
+ private static boolean isInitialized = false;
+
+ public TorLogEventListener getInstance(Context context) {
+ if (instance == null) {
+ instance = new TorLogEventListener();
+ }
+ return instance;
+ }
+
+ private synchronized static void initialize(Context context) {
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.ACTION_STATUS));
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG));
+
+ isInitialized = true;
+ // There should be at least two Loggers: TorBootstrapPanel
+ // and TorBootstrapLogPanel
+ mLoggers = new Vector<TorBootstrapLogger>(2);
+ }
+
+ public synchronized static void addLogger(TorBootstrapLogger logger) {
+ if (!isInitialized) {
+ // This is an assumption we're making. All Loggers are a subclass
+ // of an Activity.
+ Activity activity = logger.getActivity();
+ initialize(activity);
+ }
+
+ if (mLoggers.contains(logger)) {
+ return;
+ }
+ mLoggers.add(logger);
+ }
+
+ public synchronized static void deleteLogger(TorBootstrapLogger logger) {
+ mLoggers.remove(logger);
+ }
+
+ /**
+ * The state and log info from {@link TorService} are sent to the UI here in
+ * the form of a local broadcast. Regular broadcasts can be sent by any app,
+ * so local ones are used here so other apps cannot interfere with Orbot's
+ * operation.
+ *
+ * Copied from Orbot - OrbotMainActivity.java
+ */
+ private static BroadcastReceiver mLocalBroadcastReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+
+ // This is only defined for log updates
+ if (!action.equals(TorServiceConstants.LOCAL_ACTION_LOG) &&
+ !action.equals(TorServiceConstants.ACTION_STATUS)) {
+ return;
+ }
+
+ Message msg = mStatusUpdateHandler.obtainMessage();
+
+ if (action.equals(TorServiceConstants.LOCAL_ACTION_LOG)) {
+ msg.obj = intent.getStringExtra(TorServiceConstants.LOCAL_EXTRA_LOG);
+ }
+
+ msg.getData().putString("status",
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS));
+ mStatusUpdateHandler.sendMessage(msg);
+ }
+ };
+
+
+ // this is what takes messages or values from the callback threads or other non-mainUI threads
+ // and passes them back into the main UI thread for display to the user
+ private static Handler mStatusUpdateHandler = new Handler() {
+
+ @Override
+ public void handleMessage(final Message msg) {
+ String newTorStatus = msg.getData().getString("status");
+ String log = (String)msg.obj;
+
+ for (TorBootstrapLogger l : mLoggers) {
+ l.updateStatus(log, newTorStatus);
+ }
+ super.handleMessage(msg);
+ }
+ };
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
new file mode 100644
index 000000000000..32a3bed3e685
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
@@ -0,0 +1,950 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
+import android.text.style.ClickableSpan;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewParent;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.AdapterView;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Vector;
+
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.preferences.AppCompatPreferenceActivity;
+
+import org.torproject.android.service.util.Prefs;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import static org.mozilla.gecko.preferences.GeckoPreferences.NON_PREF_PREFIX;
+
+
+/** TorPreferences provides the Tor-related preferences
+ *
+ * We configure bridges using either a set of built-in bridges where the user enables
+ * them based on bridge type (the name of the pluggable transport) or the user provides
+ * their own bridge (obtained from another person or BridgeDB, etc).
+ *
+ * This class (TorPreferences) is divided into multiple Fragments (screens). The first
+ * screen is where the user enables or disables Bridges. The second screen shows the
+ * user a list of built-in bridge types (obfs4, meek, etc) where they may select one of
+ * them. It shows a button they may press for providing their own bridge, as well. The
+ * third screen is where the user may provide (copy/paste) their own bridge.
+ *
+ * On the first screen, if bridges are currently enabled, then the switch/toggle is
+ * shown as enabled. In addition, the user is shown a message saying whether built-in or
+ * provided bridges are being used. There is a link, labeled "Change", where they
+ * transitioned to the appropriate screen for modifying the configuration if it is pressed.
+ *
+ * The second screen shows radio buttons for the built-in bridge types.
+ *
+ * The State of Bridges-Enabled:
+ * There are a few moving parts here, a higher-level description of how we expect this
+ * works, where "Enabled" is "Bridges Enabled", "Type" is "Bridge Type", and "Provided"
+ * is "Bridge Provided":
+ *
+ * We have five preferences:
+ * PREFS_BRIDGES_ENABLED
+ * PREFS_BRIDGES_TYPE
+ * PREFS_BRIDGES_PROVIDE
+ * pref_bridges_enabled (Orbot)
+ * pref_bridges_list (Orbot)
+ *
+ * These may be in following three end states where PREFS_BRIDGES_ENABLED and
+ * pref_bridges_enabled must always match, and pref_bridges_list must either match
+ * PREFS_BRIDGES_PROVIDE or contain a list of bridges of type PREFS_BRIDGES_TYPE.
+ *
+ * PREFS_BRIDGES_ENABLED=false
+ * PREFS_BRIDGES_TYPE=null
+ * PREFS_BRIDGES_PROVIDE=null
+ * pref_bridges_enabled=false
+ * pref_bridges_list=null
+ *
+ * PREFS_BRIDGES_ENABLED=true
+ * PREFS_BRIDGES_TYPE=T1
+ * PREFS_BRIDGES_PROVIDE=null
+ * pref_bridges_enabled=true
+ * pref_bridges_list=X1
+ *
+ * PREFS_BRIDGES_ENABLED=true
+ * PREFS_BRIDGES_TYPE=null
+ * PREFS_BRIDGES_PROVIDE=X2
+ * pref_bridges_enabled=true
+ * pref_bridges_list=X2
+ *
+ * There are transition states where this is not consistent, for example when the
+ * "Bridges Enabled" switch is toggled but "Bridge Type" and "Bridge Provided" are null.
+ */
+
+public class TorPreferences extends AppCompatPreferenceActivity {
+ private static final String LOGTAG = "TorPreferences";
+
+ private static final String PREFS_BRIDGES_ENABLED = NON_PREF_PREFIX + "tor.bridges.enabled";
+ private static final String PREFS_BRIDGES_TYPE = NON_PREF_PREFIX + "tor.bridges.type";
+ private static final String PREFS_BRIDGES_PROVIDE = NON_PREF_PREFIX + "tor.bridges.provide";
+
+ private static final String sClassName = TorPreferences.class.getName();
+ private static final String sTorNetworkBridgesEnabledPreferenceName = sClassName + "$TorNetworkBridgesEnabledPreference";
+ private static final String sTorNetworkBridgeSelectPreferenceName = sClassName + "$TorNetworkBridgeSelectPreference";
+ private static final String sTorNetworkBridgeProvidePreferenceName = sClassName + "$TorNetworkBridgeProvidePreference";
+ private static final String[] sTorPreferenceFragments = {sTorNetworkBridgesEnabledPreferenceName,
+ sTorNetworkBridgeSelectPreferenceName,
+ sTorNetworkBridgeProvidePreferenceName};
+ // Current displayed PreferenceFragment
+ private TorNetworkPreferenceFragment mFrag;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // Begin with the first (Enable Bridges) fragment
+ getIntent().putExtra(EXTRA_SHOW_FRAGMENT, sTorNetworkBridgesEnabledPreferenceName);
+ super.onCreate(savedInstanceState);
+
+ mFrag = null;
+ }
+
+ // Save the current preference when the app is minimized or swiped away.
+ @Override
+ public void onStop() {
+ mFrag.onSaveState();
+ super.onStop();
+ }
+
+ // This is needed because launching a fragment fails if this
+ // method doesn't return true.
+ @Override
+ protected boolean isValidFragment(String fragmentName) {
+ for (String frag : sTorPreferenceFragments) {
+ if (fragmentName.equals(frag)) {
+ return true;
+ }
+ }
+ Log.i(LOGTAG, "isValidFragment(): Returning false (" + fragmentName + ")");
+ return false;
+ }
+
+ public void setFragment(TorNetworkPreferenceFragment frag) {
+ mFrag = frag;
+ }
+
+ // Save the preference when the user returns to the previous screen using
+ // the back button
+ @Override
+ public void onBackPressed() {
+ mFrag.onSaveState();
+ super.onBackPressed();
+ }
+
+ // Control the behavior when the Up button (back button in top-left
+ // corner) is pressed. Save the current preference and return to the
+ // previous screen.
+ @Override
+ public boolean onNavigateUp() {
+ super.onNavigateUp();
+
+ if (mFrag == null) {
+ Log.w(LOGTAG, "onNavigateUp(): mFrag is null");
+ return false;
+ }
+
+ // Handle the user pressing the Up button in the same way as
+ // we handle them pressing the Back button. Strictly, this
+ // isn't correct, but it will prevent confusion.
+ mFrag.onSaveState();
+
+ if (mFrag.getFragmentManager().getBackStackEntryCount() > 0) {
+ Log.i(LOGTAG, "onNavigateUp(): popping from backstatck");
+ mFrag.getFragmentManager().popBackStack();
+ } else {
+ Log.i(LOGTAG, "onNavigateUp(): finishing activity");
+ finish();
+ }
+ return true;
+ }
+
+ // Overriding this method is necessary because before Oreo the PreferenceActivity didn't
+ // correctly handle the Home button (Up button). This was implemented in Oreo (Android 8+,
+ // API 26+).
+ // https://android.googlesource.com/platform/frameworks/base/+/6af15ebcfec64d0…
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ Log.i(LOGTAG, "onOptionsItemSelected(): Home");
+ onNavigateUp();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ // Helper abstract Fragment with common methods
+ public static abstract class TorNetworkPreferenceFragment extends PreferenceFragment {
+ protected TorPreferences mTorPrefAct;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // This is only ever a TorPreferences
+ mTorPrefAct = (TorPreferences) getActivity();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mTorPrefAct.setFragment(this);
+ }
+
+ // Implement this callback in child Fragments
+ public void onSaveState() {
+ }
+
+ // Helper method for walking a View hierarchy and printing the children
+ protected void walkViewTree(View view, int depth) {
+ if (view instanceof ViewGroup) {
+ ViewGroup vg = (ViewGroup) view;
+ int childIdx = 0;
+ for (; childIdx < vg.getChildCount(); childIdx++) {
+ walkViewTree(vg.getChildAt(childIdx), depth + 1);
+ }
+ }
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view: " + view);
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view id: " + view.getId());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is focused: " + view.isFocused());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is enabled: " + view.isEnabled());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is selected: " + view.isSelected());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is in touch mode: " + view.isInTouchMode());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is activated: " + view.isActivated());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is clickable: " + view.isClickable());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is focusable: " + view.isFocusable());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is FocusableInTouchMode: " + view.isFocusableInTouchMode());
+ }
+
+ // Helper returning the ListView
+ protected ListView getListView(View view) {
+ if (!(view instanceof ViewGroup) || view == null) {
+ return null;
+ }
+
+ View rawListView = view.findViewById(android.R.id.list);
+ if (!(rawListView instanceof ListView) || rawListView == null) {
+ return null;
+ }
+
+ return (ListView) rawListView;
+ }
+
+ // Get Bridges associated with the provided pref key saved in the
+ // provided SharedPreferences. Return null if the SharedPreferences
+ // is null or if there isn't any value associated with the pref.
+ protected String getBridges(SharedPreferences sharedPrefs, String pref) {
+ if (sharedPrefs == null) {
+ Log.w(LOGTAG, "getBridges: sharedPrefs is null");
+ return null;
+ }
+ return sharedPrefs.getString(pref, null);
+ }
+
+ // Save the bridge type and bridge line preferences.
+ //
+ // Save the bridgesType with the PREFS_BRIDGES_TYPE pref as the key
+ // (for future lookup). If bridgesType is null, then save the
+ // bridgesLines with the PREFS_BRIDGES_PROVIDE pref as the key, and
+ // use Orbot's helper method and enable Orbot's bridge pref.
+ protected boolean setBridges(SharedPreferences.Editor editor, String bridgesType, String bridgesLines) {
+ if (editor == null) {
+ Log.w(LOGTAG, "setBridges: editor is null");
+ return false;
+ }
+ Log.i(LOGTAG, "Saving bridge type preference: " + bridgesType);
+ Log.i(LOGTAG, "Saving bridge line preference: " + bridgesLines);
+
+ // If bridgesType is null, then clear the pref and save the bridgesLines
+ // as a provided bridge. If bridgesType is not null, then save the type
+ // but don't save it as a provided bridge.
+ editor.putString(PREFS_BRIDGES_TYPE, bridgesType);
+ if (bridgesType == null) {
+ editor.putString(PREFS_BRIDGES_PROVIDE, bridgesLines);
+ } else {
+ editor.putString(PREFS_BRIDGES_PROVIDE, null);
+ }
+
+ if (!editor.commit()) {
+ return false;
+ }
+
+ // Set Orbot's preference
+ Prefs.setBridgesList(bridgesLines);
+
+ // If either of these are not null, then we're enabling bridges
+ boolean bridgesAreEnabled = (bridgesType != null) || (bridgesLines != null);
+ // Inform Orbot bridges are enabled
+ Prefs.putBridgesEnabled(bridgesAreEnabled);
+ return true;
+ }
+
+ // Disable the bridges.enabled Preference
+ protected void disableBridges(PreferenceFragment frag) {
+ SwitchPreference bridgesEnabled = (SwitchPreference) frag.findPreference(PREFS_BRIDGES_ENABLED);
+ Preference bridgesType = frag.findPreference(PREFS_BRIDGES_TYPE);
+ Preference bridgesProvide = frag.findPreference(PREFS_BRIDGES_PROVIDE);
+ Preference pref = null;
+
+ if (bridgesEnabled != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesEnabled is not null");
+ pref = bridgesEnabled;
+ } else if (bridgesType != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesType is not null");
+ pref = bridgesType;
+ } else if (bridgesProvide != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesProvide is not null");
+ pref = bridgesProvide;
+ } else {
+ Log.w(LOGTAG, "disableBridges: all the expected preferences are is null?");
+ return;
+ }
+
+ // Clear the saved prefs (it's okay we're using a different
+ // SharedPreference.Editor here, they modify the same backend).
+ // In addition, passing null is equivalent to clearing the
+ // preference.
+ setBridges(pref.getEditor(), null, null);
+
+ if (bridgesEnabled != null) {
+ bridgesEnabled.setChecked(false);
+ }
+ }
+
+ // Set the current title
+ protected void setTitle(int resId) {
+ mTorPrefAct.getSupportActionBar().setTitle(resId);
+ }
+ }
+
+ // Fragment implementing the screen for enabling Bridges
+ public static class TorNetworkBridgesEnabledPreference extends TorNetworkPreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_main);
+ }
+
+ // This class is instantiated within the OnClickListener of the
+ // PreferenceSwitch's Switch widget
+ public class BridgesEnabledSwitchOnClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ Log.i(LOGTAG, "bridgesEnabledSwitch clicked");
+ if (!(v instanceof Switch)) {
+ Log.w(LOGTAG, "View isn't an instance of Switch?");
+ return;
+ }
+
+ Switch bridgesEnabledSwitch = (Switch) v;
+
+ // The widget was pressed, now find the preference and set it
+ // such that it is synchronized with the widget.
+ final SwitchPreference bridgesEnabled = (SwitchPreference) TorNetworkBridgesEnabledPreference.this.findPreference(PREFS_BRIDGES_ENABLED);
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "onCreate: bridgesEnabled is null?");
+ return;
+ }
+
+ bridgesEnabled.setChecked(bridgesEnabledSwitch.isChecked());
+
+ // Only launch the Fragment if we're enabling bridges.
+ if (bridgesEnabledSwitch.isChecked()) {
+ TorNetworkBridgesEnabledPreference.this.mTorPrefAct.startPreferenceFragment(new TorNetworkBridgeSelectPreference(), true);
+ } else {
+ disableBridges(TorNetworkBridgesEnabledPreference.this);
+ }
+ }
+ }
+
+ // This method must be overridden because, when creating Preferences, the
+ // creation of the View hierarchy occurs asynchronously. Usually
+ // onCreateView() gives us the View hierarchy as it is defined in the XML layout.
+ // However, with Preferences the layout is created across multiple threads and it
+ // usually isn't available at the time onCreateView() or onViewCreated() are
+ // called. As a result, we find the ListView (which is almost guaranteed to exist
+ // at this time) and we add an OnHierarchyChangeListener where we wait until the
+ // children are added into the tree.
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ setTitle(R.string.pref_tor_network_title);
+
+ final SwitchPreference bridgesEnabled = (SwitchPreference) findPreference(PREFS_BRIDGES_ENABLED);
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "onCreate: bridgesEnabled is null?");
+ return;
+ }
+
+ // If we return from either of the "Select Bridge Type" screen
+ // or "Provide Bridge" screen without selecting or inputing
+ // any value, then we could arrive here without any bridge
+ // saved/enabled but this switch is enabled. Disable it.
+ if (!Prefs.bridgesEnabled()) {
+ bridgesEnabled.setChecked(false);
+ }
+
+ // Decide if the configured bridges were provided by the user or
+ // selected from the list of bridge types
+ if (isBridgeProvided(bridgesEnabled)) {
+ String newSummary = getString(R.string.pref_tor_network_bridges_enabled_change_custom);
+ setBridgesEnabledSummaryAndOnClickListener(bridgesEnabled, newSummary, true);
+ } else if (Prefs.bridgesEnabled()) {
+ // If isBridgeProvided() returned false, but Prefs.bridgesEnabled() returns true.
+ // This means we have bridges, but they weren't provided by the user - therefore
+ // they must be built-in bridges.
+ String newSummary = getString(R.string.pref_tor_network_bridges_enabled_change_builtin);
+ setBridgesEnabledSummaryAndOnClickListener(bridgesEnabled, newSummary, false);
+ }
+
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ Log.i(LOGTAG, "onChildViewAdded: Adding ListView child view");
+
+ // Make sure the Switch widget is synchronized with the preference
+ final Switch bridgesEnabledSwitch =
+ (Switch) parent.findViewById(android.R.id.switch_widget);
+
+ if (bridgesEnabledSwitch != null) {
+ bridgesEnabledSwitch.setChecked(bridgesEnabled.isChecked());
+
+ // When the Switch is pressed by the user, either load the next
+ // fragment (where the user chooses a bridge type), or return to
+ // the main bootstrapping screen.
+ bridgesEnabledSwitch.setOnClickListener(new BridgesEnabledSwitchOnClickListener());
+ }
+
+ final TextView bridgesEnabledSummary =
+ (TextView) parent.findViewById(android.R.id.summary);
+ if (bridgesEnabledSummary == null) {
+ Log.w(LOGTAG, "Bridge Enabled Summary is null, we can't enable the span");
+ return;
+ }
+
+ // Make the ClickableSpan clickable within the TextView.
+ // This is a requirement for using a ClickableSpan in
+ // setBridgesEnabledSummaryAndOnClickListener().
+ bridgesEnabledSummary.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+ }
+
+ // This is a common OnClickListener for when the user clicks on the Change link.
+ // The span won't be clickable until the MovementMethod is set. This happens in
+ // onViewCreated within the OnHierarchyChangeListener we set on the ListView.
+ private void setBridgesEnabledSummaryAndOnClickListener(SwitchPreference bridgesEnabled, final String newSummary, final boolean custom) {
+ Log.i(LOGTAG, "Bridge Summary clicked");
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "Bridge Enabled switch is null");
+ return;
+ }
+
+ // Here we obtain the correct text, based on whether the bridges
+ // were provided (custom) or built-in. Using that text, we create
+ // a spannable string and find the substring "Change" within it.
+ // If it exists, we make that substring clickable.
+ // Note: TODO This breaks with localization.
+ if (newSummary == null) {
+ Log.w(LOGTAG, "R.string.pref_tor_network_bridges_enabled_change_builtin is null");
+ return;
+ }
+ int changeStart = newSummary.indexOf("Change");
+ if (changeStart == -1) {
+ Log.w(LOGTAG, "R.string.pref_tor_network_bridges_enabled_change_builtin doesn't contain 'Change'");
+ return;
+ }
+ SpannableString newSpannableSummary = new SpannableString(newSummary);
+ newSpannableSummary.setSpan(new ClickableSpan() {
+ @Override
+ public void onClick(View v) {
+ // If a custom (provided) bridge is configured, then
+ // open the BridgesProvide preference fragment. Else,
+ // open the built-in/bridge-type fragment.
+ Log.i(LOGTAG, "Span onClick!");
+
+ // Add this Fragment regardless of which Fragment we're showing next. If the Change
+ // link goes to the built-in bridges, then this is what we show the user. If the Change
+ // link goes to the provided bridges, then we consider this a deep-link and we inject the
+ // built-in bridges screen into the backstack so they are shown it when they press Back
+ // from the provided-bridges screen.
+ mTorPrefAct.startPreferenceFragment(new
+ TorNetworkBridgeSelectPreference(), true);
+
+ if (custom) {
+ mTorPrefAct.startPreferenceFragment(new
+ TorNetworkBridgeProvidePreference(), true);
+ }
+ }
+ },
+ // Begin the span
+ changeStart,
+ // End the span
+ newSummary.length(),
+ // Don't include new characters added into the spanned substring
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ bridgesEnabled.setSummaryOn(newSpannableSummary);
+ }
+
+ // We follow this logic:
+ // If the bridgesEnabled switch is off, then false
+ // If Orbot doesn't have bridges enabled, then false
+ // If PREFS_BRIDGES_PROVIDE is not null, then true
+ // Else false
+ private boolean isBridgeProvided(SwitchPreference bridgesEnabled) {
+ if (!bridgesEnabled.isChecked()) {
+ Log.i(LOGTAG, "isBridgeProvided: bridgesEnabled is not checked");
+ return false;
+ }
+
+ if (!Prefs.bridgesEnabled()) {
+ Log.i(LOGTAG, "isBridgeProvided: bridges are not enabled");
+ return false;
+ }
+ SharedPreferences sharedPrefs = bridgesEnabled.getSharedPreferences();
+ boolean hasBridgeProvide =
+ sharedPrefs.getString(PREFS_BRIDGES_PROVIDE, null) != null;
+
+ Log.i(LOGTAG, "isBridgeProvided: We have provided bridges: " + hasBridgeProvide);
+ return hasBridgeProvide;
+ }
+ }
+
+ // Fragment implementing the screen for selecting a built-in Bridge type
+ public static class TorNetworkBridgeSelectPreference extends TorNetworkPreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_select_bridge_type);
+ }
+
+ // Add OnClickListeners after the View is created
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ setTitle(R.string.pref_tor_select_a_bridge_title);
+
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+
+ // Configure onClick handler for "Provide a Bridge" button
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ // Set the previously chosen RadioButton as checked
+ final RadioGroup group = getBridgeTypeRadioGroup();
+ if (group == null) {
+ Log.w(LOGTAG, "Radio Group is null");
+ return;
+ }
+
+ final View titleAndSummaryView = parent.findViewById(R.id.title_and_summary);
+ if (titleAndSummaryView == null) {
+ Log.w(LOGTAG, "title and summary view is null");
+ group.setVisibility(View.VISIBLE);
+ return;
+ }
+
+ titleAndSummaryView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ group.setVisibility(View.VISIBLE);
+ }
+ });
+
+ final View provideABridge = parent.findViewById(R.id.tor_network_provide_a_bridge);
+ if (provideABridge == null) {
+ return;
+ }
+
+ provideABridge.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.i(LOGTAG, "bridgesProvide clicked");
+ saveCurrentCheckedRadioButton();
+
+ mTorPrefAct.startPreferenceFragment(new TorNetworkBridgeProvidePreference(), true);
+ }
+ });
+
+ final TextView provideABridgeSummary = (TextView) parent.findViewById(R.id.tor_network_provide_a_bridge_summary);
+ if (provideABridgeSummary == null) {
+ Log.i(LOGTAG, "provideABridgeSummary is null");
+ return;
+ }
+
+ Preference bridgesTypePref = findPreference(PREFS_BRIDGES_TYPE);
+ if (bridgesTypePref == null) {
+ return;
+ }
+
+ SharedPreferences sharedPrefs = bridgesTypePref.getSharedPreferences();
+ String provideBridges = sharedPrefs.getString(PREFS_BRIDGES_PROVIDE, null);
+ if (provideBridges != null) {
+ if (provideBridges.indexOf("\n") != -1) {
+ provideABridgeSummary.setText(R.string.pref_tor_network_using_multiple_provided_bridges);
+ } else {
+ String summary = getString(R.string.pref_tor_network_using_a_provided_bridge, provideBridges);
+ provideABridgeSummary.setText(summary);
+ }
+ }
+
+ final String configuredBridgeType = getBridges(bridgesTypePref.getSharedPreferences(), PREFS_BRIDGES_TYPE);
+ if (configuredBridgeType == null) {
+ return;
+ }
+
+ int buttonId = -1;
+ // Note: Keep these synchronized with the layout xml file.
+ switch (configuredBridgeType) {
+ case "obfs4":
+ buttonId = R.id.radio_pref_bridges_obfs4;
+ break;
+ case "meek":
+ buttonId = R.id.radio_pref_bridges_meek_azure;
+ break;
+ case "obfs3":
+ buttonId = R.id.radio_pref_bridges_obfs3;
+ break;
+ }
+
+ if (buttonId != -1) {
+ group.check(buttonId);
+ // If a bridge is selected, then make the list visible
+ group.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+
+ }
+
+ // Save the checked RadioButton in the SharedPreferences
+ private boolean saveCurrentCheckedRadioButton() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.w(LOGTAG, "ListView is null");
+ return false;
+ }
+
+ RadioGroup group = getBridgeTypeRadioGroup();
+ if (group == null) {
+ Log.w(LOGTAG, "RadioGroup is null");
+ return false;
+ }
+
+ int checkedId = group.getCheckedRadioButtonId();
+ RadioButton selectedBridgeType = lv.findViewById(checkedId);
+ if (selectedBridgeType == null) {
+ Log.w(LOGTAG, "RadioButton is null");
+ return false;
+ }
+
+ String bridgesType = selectedBridgeType.getText().toString();
+ if (bridgesType == null) {
+ // We don't know with which bridgesType this Id is associated
+ Log.w(LOGTAG, "RadioButton has null text");
+ return false;
+ }
+
+ // Currently obfs4 is the recommended pluggable transport. As a result,
+ // the text contains " (recommended)". This won't be expected elsewhere,
+ // so replace the string with only the pluggable transport name.
+ // This will need updating when another transport is "recommended".
+ //
+ // Similarly, if meek-azure is chosen, substitute it with "meek" (Orbot
+ // only handles these keywords specially if they are less than 5 characters).
+ if (bridgesType.contains("obfs4")) {
+ bridgesType = "obfs4";
+ } else if (bridgesType.contains("meek-azure")) {
+ bridgesType = "meek";
+ }
+
+ Preference bridgesTypePref = findPreference(PREFS_BRIDGES_TYPE);
+ if (bridgesTypePref == null) {
+ Log.w(LOGTAG, PREFS_BRIDGES_TYPE + " preference not found");
+ disableBridges(this);
+ return false;
+ }
+
+ if (!setBridges(bridgesTypePref.getEditor(), bridgesType, bridgesType)) {
+ Log.w(LOGTAG, "Saving Bridge preference failed.");
+ disableBridges(this);
+ return false;
+ }
+
+ return true;
+ }
+
+ // Handle onSaveState when the user presses Back. Save the selected
+ // built-in bridge type.
+ @Override
+ public void onSaveState() {
+ saveCurrentCheckedRadioButton();
+ }
+
+ // Find the RadioGroup within the View hierarchy now.
+ private RadioGroup getBridgeTypeRadioGroup() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.w(LOGTAG, "ListView is null");
+ return null;
+ }
+ ViewParent listViewParent = lv.getParent();
+ // If the parent of this ListView isn't a View, then
+ // the RadioGroup doesn't exist
+ if (!(listViewParent instanceof View)) {
+ Log.w(LOGTAG, "ListView's parent isn't a View. Failing");
+ return null;
+ }
+ View lvParent = (View) listViewParent;
+ // Find the RadioGroup with this View hierarchy.
+ return (RadioGroup) lvParent.findViewById(R.id.pref_radio_group_builtin_bridges_type);
+ }
+ }
+
+ // Fragment implementing the screen for providing a Bridge
+ public static class TorNetworkBridgeProvidePreference extends TorNetworkPreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_provide_bridge);
+ }
+
+ // If there is a provided bridge saved in the preference,
+ // then fill-in the text field with that value.
+ private void setBridgeProvideText(View parent) {
+ final View provideBridge1 = parent.findViewById(R.id.tor_network_provide_bridge1);
+ final View provideBridge2 = parent.findViewById(R.id.tor_network_provide_bridge2);
+ final View provideBridge3 = parent.findViewById(R.id.tor_network_provide_bridge3);
+
+ EditText provideBridge1ET = null;
+ EditText provideBridge2ET = null;
+ EditText provideBridge3ET = null;
+
+ if (provideBridge1 != null) {
+ if (provideBridge1 instanceof EditText) {
+ provideBridge1ET = (EditText) provideBridge1;
+ }
+ }
+
+ if (provideBridge2 != null) {
+ if (provideBridge2 instanceof EditText) {
+ provideBridge2ET = (EditText) provideBridge2;
+ }
+ }
+
+ if (provideBridge3 != null) {
+ if (provideBridge3 instanceof EditText) {
+ provideBridge3ET = (EditText) provideBridge3;
+ }
+ }
+
+ Preference bridgesProvide = findPreference(PREFS_BRIDGES_PROVIDE);
+ if (bridgesProvide != null) {
+ Log.i(LOGTAG, "setBridgeProvideText: bridgesProvide isn't null");
+ String bridgesLines = getBridges(bridgesProvide.getSharedPreferences(), PREFS_BRIDGES_PROVIDE);
+ if (bridgesLines != null) {
+ Log.i(LOGTAG, "setBridgeProvideText: bridgesLines isn't null");
+ if (bridgesLines.contains("\n")) {
+ String[] lines = bridgesLines.split("\n");
+ if (provideBridge1ET != null && lines.length >= 1) {
+ provideBridge1ET.setText(lines[0]);
+ }
+ if (provideBridge2ET != null && lines.length >= 2) {
+ provideBridge2ET.setText(lines[1]);
+ }
+ if (provideBridge3ET != null && lines.length >= 3) {
+ provideBridge3ET.setText(lines[2]);
+ }
+ } else {
+ // Simply set the single line as the text field input if the text field exists.
+ if (provideBridge1ET != null) {
+ provideBridge1ET.setText(bridgesLines);
+ }
+ }
+ }
+ }
+ }
+
+ // See explanation of TorNetworkBridgesEnabledPreference.onViewCreated()
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ setTitle(R.string.pref_tor_provide_a_bridge_title);
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+ // The ListView is given "focus" by default when the EditText
+ // field is selected, this prevents typing anything into the field.
+ // We set FOCUS_AFTER_DESCENDANTS so the ListView's children are
+ // given focus (and, therefore, the EditText) before it is
+ // given focus.
+ lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
+
+ // The preferences are adding into the ListView hierarchy asynchronously.
+ // We need the onChildViewAdded callback so we can modify the layout after
+ // the child is added.
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ // If we have a bridge line saved for this pref,
+ // then show the user
+ setBridgeProvideText(parent);
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+ }
+
+ private String getBridgeLineFromView(View provideBridge) {
+ if (provideBridge != null) {
+ if (provideBridge instanceof EditText) {
+ Log.i(LOGTAG, "onSaveState: Saving bridge");
+ EditText provideBridgeET = (EditText) provideBridge;
+
+ // Get the bridge line (provided text) from the text
+ // field.
+ String bridgesLine = provideBridgeET.getText().toString();
+ if (bridgesLine != null && !bridgesLine.equals("")) {
+ return bridgesLine;
+ }
+ } else {
+ Log.w(LOGTAG, "onSaveState: provideBridge isn't an EditText");
+ }
+ }
+ return null;
+ }
+
+ // Save EditText field value when the Back button or Up button are pressed.
+ @Override
+ public void onSaveState() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.i(LOGTAG, "onSaveState: ListView not found");
+ return;
+ }
+
+ final View provideBridge1 = lv.findViewById(R.id.tor_network_provide_bridge1);
+ final View provideBridge2 = lv.findViewById(R.id.tor_network_provide_bridge2);
+ final View provideBridge3 = lv.findViewById(R.id.tor_network_provide_bridge3);
+
+ String bridgesLines = null;
+ String bridgesLine1 = getBridgeLineFromView(provideBridge1);
+ String bridgesLine2 = getBridgeLineFromView(provideBridge2);
+ String bridgesLine3 = getBridgeLineFromView(provideBridge3);
+
+ if (bridgesLine1 != null) {
+ Log.i(LOGTAG, "bridgesLine1 is not null.");
+ bridgesLines = bridgesLine1;
+ }
+
+ if (bridgesLine2 != null) {
+ // If bridgesLine1 was not null, then append a newline.
+ Log.i(LOGTAG, "bridgesLine2 is not null.");
+ if (bridgesLines != null) {
+ bridgesLines += "\n" + bridgesLine2;
+ } else {
+ bridgesLines = bridgesLine2;
+ }
+ }
+
+ if (bridgesLine3 != null) {
+ // If bridgesLine1 was not null, then append a newline.
+ Log.i(LOGTAG, "bridgesLine3 is not null.");
+ if (bridgesLines != null) {
+ bridgesLines += "\n" + bridgesLine3;
+ } else {
+ bridgesLines = bridgesLine3;
+ }
+ }
+
+ Preference bridgesProvide = findPreference(PREFS_BRIDGES_PROVIDE);
+ if (bridgesProvide == null) {
+ Log.w(LOGTAG, PREFS_BRIDGES_PROVIDE + " preference not found");
+ disableBridges(this);
+ return;
+ }
+
+ if (bridgesLines == null) {
+ Log.i(LOGTAG, "provideBridge is empty. Disabling.");
+ // If provided bridges are null/empty, then only disable all bridges if
+ // the user did not select a built-in bridge
+ String configuredBuiltinBridges = getBridges(bridgesProvide.getSharedPreferences(), PREFS_BRIDGES_TYPE);
+ if (configuredBuiltinBridges == null) {
+ disableBridges(this);
+ }
+ return;
+ }
+
+ // Set the preferences (both our preference and Orbot's preference)
+ Log.w(LOGTAG, "Saving Bridge preference: " + bridgesLines);
+ if (!setBridges(bridgesProvide.getEditor(), null, bridgesLines)) {
+ // TODO inform the user
+ Log.w(LOGTAG, "Saving Bridge preference failed.");
+ disableBridges(this);
+ }
+ }
+ }
+}
1
0
[tor-browser/tor-browser-60.5.1esr-8.5-1] Bug 28329 - Part 3. Remove OrbotActivity dependency
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit e4d2df5e776b6270b5eb98f4b718ea6eb5ea5094
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Feb 20 01:08:36 2019 +0000
Bug 28329 - Part 3. Remove OrbotActivity dependency
---
mobile/android/app/build.gradle | 5 -----
mobile/android/base/AndroidManifest.xml.in | 8 ++++++++
.../base/java/org/mozilla/gecko/BrowserApp.java | 18 ------------------
.../base/java/org/mozilla/gecko/GeckoApplication.java | 5 -----
4 files changed, 8 insertions(+), 28 deletions(-)
diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
index d0060901b6b3..c8380042d8a9 100644
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -225,7 +225,6 @@ dependencies {
implementation "com.android.support:design:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
implementation "com.android.support:customtabs:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
implementation "com.android.support:palette-v7:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
- implementation files('Orbot-16.0.5-RC-1-tor-0.3.4.9-fullperm-release.aar')
implementation files('orbotservice-release.aar')
implementation files('jsocksAndroid-release.aar')
@@ -266,10 +265,6 @@ dependencies {
// Including the Robotium JAR directly can cause issues with dexing.
androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
- // Orbot
- implementation 'com.github.delight-im:Android-Languages:v1.0.1'
- implementation 'pl.bclogic:pulsator4droid:1.0.3'
-
// Orbotservice
implementation 'org.torproject:tor-android-binary:0.3.4.9'
implementation 'com.jrummyapps:android-shell:1.0.1'
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index c7c5ead7f82f..72b1e16925b7 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -493,5 +493,13 @@
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
#endif
+ <!-- Define Orbotservice's TorService -->
+ <service
+ android:name="org.torproject.android.service.TorService"
+ android:enabled="true"
+ android:exported="false"
+ android:stopWithTask="true">
+ </service>
+
</application>
</manifest>
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 5aa0a6a7f3ac..464b4054c9ff 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -182,7 +182,6 @@ import org.mozilla.gecko.widget.GeckoActionProvider;
import org.mozilla.gecko.widget.SplashScreen;
import org.mozilla.geckoview.GeckoSession;
-import org.torproject.android.OrbotMainActivity;
import org.torproject.android.service.TorService;
import org.torproject.android.service.TorServiceConstants;
@@ -242,7 +241,6 @@ public class BrowserApp extends GeckoApp
public static final int ACTIVITY_REQUEST_TRIPLE_READERVIEW = 4001;
public static final int ACTIVITY_RESULT_TRIPLE_READERVIEW_ADD_BOOKMARK = 4002;
public static final int ACTIVITY_RESULT_TRIPLE_READERVIEW_IGNORE = 4003;
- public static final int ACTIVITY_RESULT_ORBOT_LAUNCH = 5001;
public static final String ACTION_VIEW_MULTIPLE = AppConstants.ANDROID_PACKAGE_NAME + ".action.VIEW_MULTIPLE";
@@ -271,7 +269,6 @@ public class BrowserApp extends GeckoApp
private HomeScreen mHomeScreen;
private TabsPanel mTabsPanel;
- private boolean mOrbotNeedsStart = true;
private boolean mTorNeedsStart = true;
private boolean showSplashScreen = false;
@@ -1410,14 +1407,6 @@ public class BrowserApp extends GeckoApp
}
}
- public void checkStartOrbot() {
- if (mOrbotNeedsStart) {
- final String orbotStartAction = "android.intent.action.MAIN";
- final Intent launchOrbot = new Intent(orbotStartAction, null, this, OrbotMainActivity.class);
- startActivityForResult(launchOrbot, ACTIVITY_RESULT_ORBOT_LAUNCH, null);
- }
- }
-
@Override
public void onResume() {
super.onResume();
@@ -1436,7 +1425,6 @@ public class BrowserApp extends GeckoApp
// need to know if we are in automation.
final SafeIntent intent = new SafeIntent(getIntent());
if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
- checkStartOrbot();
mTorNeedsStart = !checkTorIsStarted();
}
}
@@ -1891,7 +1879,6 @@ public class BrowserApp extends GeckoApp
NotificationHelper.destroy();
GeckoNetworkManager.destroy();
- mOrbotNeedsStart = true;
mTorNeedsStart = true;
super.onDestroy();
@@ -3111,11 +3098,6 @@ public class BrowserApp extends GeckoApp
TabQueueHelper.processTabQueuePromptResponse(resultCode, this);
break;
- case ACTIVITY_RESULT_ORBOT_LAUNCH:
- Log.d(LOGTAG, "onActivityResult: ACTIVITY_RESULT_ORBOT_LAUNCH");
- mOrbotNeedsStart = false;
- break;
-
default:
for (final BrowserAppDelegate delegate : delegates) {
delegate.onActivityResult(this, requestCode, resultCode, data);
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
index b8e4985332a9..b38e7184c798 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
@@ -63,7 +63,6 @@ import java.net.URL;
import java.util.UUID;
import org.torproject.android.service.util.Prefs;
-import org.torproject.android.settings.Languages;
public class GeckoApplication extends Application
implements HapticFeedbackDelegate {
@@ -325,10 +324,6 @@ public class GeckoApplication extends Application
// Give Orbot the base Context
Prefs.setContext(context);
- // Initialize Orbot's Language settings
- Languages.setup(BrowserApp.class, R.string.menu_settings);
- Languages.setLanguage(this, Prefs.getDefaultLocale(), true);
-
super.onCreate();
}
1
0
[tor-browser/tor-browser-60.5.1esr-8.5-1] Revert "Bug 28051 - Open Orbot when the notification is tapped"
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit fbf54c71e26a64859f953e18a34e5c9e8831f071
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Jan 18 13:07:10 2019 +0000
Revert "Bug 28051 - Open Orbot when the notification is tapped"
This reverts commit b5be1210aab76340526aa7828d5d9050b8183e62.
Orbot isn't our bootstrapper anymore
---
.../base/java/org/mozilla/gecko/LauncherActivity.java | 18 ------------------
1 file changed, 18 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
index 4cd94ed538c7..e8f8facc24c6 100644
--- a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
@@ -45,9 +45,6 @@ import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_FXA_SIGNIN;
import org.mozilla.gecko.deeplink.DeepLinkContract;
-import org.torproject.android.OrbotMainActivity;
-import org.torproject.android.service.TorServiceConstants;
-
/**
* Activity that receives incoming Intents and dispatches them to the appropriate activities (e.g. browser, custom tabs, web app).
*/
@@ -70,9 +67,6 @@ public class LauncherActivity extends Activity {
} else if (isWebAppIntent(safeIntent)) {
dispatchWebAppIntent();
- } else if (TorServiceConstants.TOR_APP_USERNAME.equals(getIntent().getAction())) {
- dispatchOrbotIntent();
-
// If it's not a view intent, it won't be a custom tabs intent either. Just launch!
} else if (!isViewIntentWithURL(safeIntent)) {
dispatchNormalIntent();
@@ -122,18 +116,6 @@ public class LauncherActivity extends Activity {
startActivity(intent);
}
- private void dispatchOrbotIntent() {
- final String orbotStartAction = "android.intent.action.MAIN";
- final Intent intent = new Intent(orbotStartAction, null, this, OrbotMainActivity.class);
-
- //When we launch Orbot, we want a new task.
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
- startActivity(intent);
- }
-
private void dispatchUrlIntent(@NonNull String url) {
Intent intent = new Intent(getIntent());
intent.setData(Uri.parse(url));
1
0
[tor-browser/tor-browser-60.5.1esr-8.5-1] Bug 28329 - Part 2. Implement checking if the Tor service is running
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit a6e87093856101ec93bbeaf93eed22ac77031f73
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Feb 20 01:04:56 2019 +0000
Bug 28329 - Part 2. Implement checking if the Tor service is running
---
.../base/java/org/mozilla/gecko/BrowserApp.java | 130 +++++++++++++++++++++
1 file changed, 130 insertions(+)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 9330a6ba9838..5aa0a6a7f3ac 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -51,6 +51,7 @@ import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
@@ -182,6 +183,7 @@ import org.mozilla.gecko.widget.SplashScreen;
import org.mozilla.geckoview.GeckoSession;
import org.torproject.android.OrbotMainActivity;
+import org.torproject.android.service.TorService;
import org.torproject.android.service.TorServiceConstants;
import java.io.File;
@@ -270,6 +272,7 @@ public class BrowserApp extends GeckoApp
private TabsPanel mTabsPanel;
private boolean mOrbotNeedsStart = true;
+ private boolean mTorNeedsStart = true;
private boolean showSplashScreen = false;
private SplashScreen splashScreen;
@@ -1079,6 +1082,131 @@ public class BrowserApp extends GeckoApp
}
/**
+ * Send the service a request for the current status.
+ * The response is sent as a broadcast. Capture that in
+ * receiveTorIsStartedAsync().
+ */
+ private void requestTorIsStartedAsync() {
+ Intent torServiceStatus = new Intent(this, TorService.class);
+ torServiceStatus.setAction(TorServiceConstants.ACTION_STATUS);
+ startService(torServiceStatus);
+ }
+
+ private BroadcastReceiver mLocalBroadcastReceiver;
+ private Boolean mTorStatus;
+
+ /**
+ * Setup the status receiver for broadcasts from the service.
+ * The response is sent as a broadcast. Create a background thread
+ * for receiving/handling the broadcast.
+ *
+ * This method is coupled with receiveTorIsStartedAsync(). They should
+ * be used together.
+ */
+ private BroadcastReceiver setupReceiveTorIsStartedAsync() {
+
+ // Create a thread specifically for defining the BroadcastReceiver
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ mLocalBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+
+ // We only want ACTION_STATUS messages
+ if (!action.equals(TorServiceConstants.ACTION_STATUS)) {
+ return;
+ }
+
+ // The current status has the EXTRA_STATUS key
+ String currentStatus =
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS);
+
+ try {
+ synchronized (mTorStatus) {
+ mTorStatus = (currentStatus == TorServiceConstants.STATUS_ON);
+ mTorStatus.notify();
+ }
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should prevent this
+ }
+ }
+ };
+
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(BrowserApp.this);
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.ACTION_STATUS));
+
+ }
+ }).start();
+
+ return mLocalBroadcastReceiver;
+ }
+
+ /**
+ * Receive the current status from the service.
+ * The response is sent as a broadcast. If it is not received within
+ * 1 second, then return false.
+ *
+ * This method is coupled with setupReceiveTorIsStartedAsync(). They
+ * should be used together.
+ */
+ private boolean receiveTorIsStartedAsync(BroadcastReceiver mLocalBroadcastReceiver, Boolean torStatus) {
+ // Wait until we're notified from the above thread, or we're
+ // interrupted by the timeout.
+ try {
+ // One thousand milliseconds = one second
+ final long oneSecTimeout = Math.round(Math.pow(10, 3));
+ synchronized (torStatus) {
+ // We wake from wait() because we reached the one second
+ // timeout, the BroadcastReceiver notified us, or we received
+ // a spurious wakeup. For all three cases, we can accept the
+ // current value of torStatus.
+ torStatus.wait(oneSecTimeout);
+ }
+ } catch (InterruptedException e) {
+ // ignore.
+ } catch (IllegalArgumentException e) {
+ // oneSecTimeout should never be negative
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should take care of this
+ }
+
+ // Unregister the receiver
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver);
+
+ return torStatus;
+ }
+
+ /**
+ * Receive the current Tor status.
+ *
+ * Send a request for the current status and receive the response.
+ * Returns true if Tor is running, false otherwise.
+ *
+ * mTorStatus provides synchronization across threads.
+ */
+ private boolean checkTorIsStarted() {
+ // When tor is started, true. Otherwise, false
+ mTorStatus = false;
+ BroadcastReceiver br = setupReceiveTorIsStartedAsync();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ requestTorIsStartedAsync();
+ }
+ }).start();
+
+ return receiveTorIsStartedAsync(br, mTorStatus);
+ }
+
+
+ /**
* Code to actually show the first run pager, separated
* for distribution purposes.
*/
@@ -1309,6 +1437,7 @@ public class BrowserApp extends GeckoApp
final SafeIntent intent = new SafeIntent(getIntent());
if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
checkStartOrbot();
+ mTorNeedsStart = !checkTorIsStarted();
}
}
@@ -1763,6 +1892,7 @@ public class BrowserApp extends GeckoApp
GeckoNetworkManager.destroy();
mOrbotNeedsStart = true;
+ mTorNeedsStart = true;
super.onDestroy();
}
1
0
commit 4ce00d04478dc617a994137d6d008eac95a7653b
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Mar 15 21:26:54 2019 +0000
Bump OpenSSL to 1.0.2r
---
projects/openssl/config | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/projects/openssl/config b/projects/openssl/config
index e91e820..ecb6966 100644
--- a/projects/openssl/config
+++ b/projects/openssl/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 1.0.2q
+version: 1.0.2r
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
var:
@@ -26,4 +26,4 @@ input_files:
- name: '[% c("var/compiler") %]'
project: '[% c("var/compiler") %]'
- URL: 'https://www.openssl.org/source/openssl-[% c("version") %].tar.gz'
- sha256sum: 5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684
+ sha256sum: ae51d08bba8a83958e894946f15303ff894d75c2b8bbd44a852b64e3fe11d0d6
1
0
[tor-browser-build/master] Bug 29794 - Update builtin bridges on Android
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit a6fedc0228d1c66f067f5dc8454cdc110ed2777d
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Mar 15 16:48:56 2019 +0000
Bug 29794 - Update builtin bridges on Android
---
.../0014-Bug-29794-Update-built-in-bridges.patch | 34 ++++++++++++++++++++++
projects/orbot/config | 1 +
2 files changed, 35 insertions(+)
diff --git a/projects/orbot/0014-Bug-29794-Update-built-in-bridges.patch b/projects/orbot/0014-Bug-29794-Update-built-in-bridges.patch
new file mode 100644
index 0000000..b841723
--- /dev/null
+++ b/projects/orbot/0014-Bug-29794-Update-built-in-bridges.patch
@@ -0,0 +1,34 @@
+From 53a2ebc7fa4ce959203c94c874efc5ee6d070020 Mon Sep 17 00:00:00 2001
+From: Matthew Finkel <Matthew.Finkel(a)gmail.com>
+Date: Fri, 15 Mar 2019 16:47:06 +0000
+Subject: [PATCH] Bug 29794 - Update built-in bridges
+
+---
+ orbotservice/src/main/res/raw/bridges.txt | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/orbotservice/src/main/res/raw/bridges.txt b/orbotservice/src/main/res/raw/bridges.txt
+index 1e448ea1..61019737 100644
+--- a/orbotservice/src/main/res/raw/bridges.txt
++++ b/orbotservice/src/main/res/raw/bridges.txt
+@@ -1,7 +1,11 @@
+-obfs4 78.215.187.186:45675 AE907EE5FAA5D0D27E0C83EFA6ADF8E79FCC0FF1 cert=/TRjMo+RinKaixARMjMtZZBhystaBe+aDaapPrbiITFtWx3M/AJcvpjHjO54tJqLd1+IWQ iat-mode=0
+-obfs4 107.160.7.24:443 7A0904F6D182B81BEFE0DEDAFEC974494672627B cert=a5/IlZMnDvb8d92LTHMfsBIgL7QlDLPiXiLwe85uedC80mGD0QerygzmsWnMEdwG9ER9Eg iat-mode=0
+-obfs4 79.136.160.201:46501 66AC975BF7CB429D057AE07FC0312C57D61BAEC1 cert=dCtn9Ya8z+R8YQikdWgC3XTAt58z5Apnm95QHrJwnhFSdnphPPEz+NMm6OawWc2srKLjJg iat-mode=0
+-obfs4 94.242.249.2:58809 6AF3024788A7EA8F84E3FA3F60018B62291803E4 cert=X0sDCJLKMM/EISdGDEfGrsks41UYmScjIIXQ9AZgWFVKNKS6klcNEpdF4tNXFz6kIyk4Ug iat-mode=0
+-obfs4 35.203.134.33:2224 15524C683CC872C8C8FB5B779A8D53F54F7ADCD4 cert=bXLTv0Kwt1zgPBoeVF86vC+0tYAHepR7+QMczhhTQw9hpAIhatt/Bpe6rSGY63Zh8aZ+dQ iat-mode=0
+-obfs4 188.166.252.228:9443 595770328CA95E39FF5B81013880B46CA1B29546 cert=3PjhGUq3xWDMrBAzbV1eU4zPSB3GRGBpYdXQEs9hkrwC9RSZdnEe1P+cg7VgLgYTj/2MMg iat-mode=0
++obfs3 169.229.59.74:31493 AF9F66B7B04F8FF6F32D455F05135250A16543C9
++obfs3 169.229.59.75:46328 AF9F66B7B04F8FF6F32D455F05135250A16543C9
++obfs3 109.105.109.163:38980 1E05F577A0EC0213F971D81BF4D86A9E4E8229ED
++obfs3 109.105.109.163:47779 4C331FA9B3D1D6D8FB0D8FBBF0C259C360D97E6A
++obfs4 37.218.240.34:40035 88CD36D45A35271963EF82E511C8827A24730913 cert=eGXYfWODcgqIdPJ+rRupg4GGvVGfh25FWaIXZkit206OSngsp7GAIiGIXOJJROMxEqFKJg iat-mode=1
++obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
++obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0
++obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
++obfs4 216.252.162.21:46089 0DB8799466902192B6C7576D58D4F7F714EC87C1 cert=XPUwcQPxEXExHfJYX58gZXN7mYpos7VNAHbkgERNFg+FCVNzuYo1Wp+uMscl3aR9hO2DRQ iat-mode=0
++obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0
+ meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
+--
+2.11.0
+
diff --git a/projects/orbot/config b/projects/orbot/config
index 5ad5bfc..7095537 100644
--- a/projects/orbot/config
+++ b/projects/orbot/config
@@ -46,6 +46,7 @@ input_files:
- filename: 0011-Bug-28051-Tell-Proguard-it-should-keep-an-unused-met.patch
- filename: 0012-Bug-28051-Escape-the-apostrophe-correctly.patch
- filename: 0013-Bug-28051-Add-a-notification-compatibility-class.patch
+ - filename: 0014-Bug-29794-Update-built-in-bridges.patch
- filename: set_gradle_repo_to_local.patch
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
1
0
commit 498d64784659082877bc83ecca24fbf8d137125f
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Mar 15 16:18:40 2019 +0000
Release preparations for 2.1.5
---
src/CHANGELOG | 9 +++++++++
src/install.rdf | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 74ac0cd0..a138a9aa 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,3 +1,12 @@
+2.1.5
+ * Bug 25658: Replace security slider with security level UI
+ * Bug 28628: Change onboarding Security panel to open new Security Level panel
+ * Bug 29440: Update about:tor when Tor Browser is updated
+ * Bug 27478: Improved Torbutton icons for dark theme
+ * Bug 29021: Tell NoScript it is running within Tor Browser
+ * Bug 29239: Don't ship the Torbutton .xpi on mobile
+ * Translations update
+
2.1.4
* Bug 25702: Update Tor Browser icon to follow design guidelines
* Bug 21805: Add click-to-play button for WebGL
diff --git a/src/install.rdf b/src/install.rdf
index e140a9bb..738bbd81 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>2.1.4</em:version>
+ <em:version>2.1.5</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0
commit 465550f62331dea670debab50322521dac5fe460
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Mar 15 16:06:24 2019 +0000
Translations update
---
src/chrome/locale/ar/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ar/aboutTor.dtd | 2 ++
src/chrome/locale/ar/browserOnboarding.properties | 2 +-
src/chrome/locale/bn-BD/torbutton.dtd | 4 +++
src/chrome/locale/ca/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ca/aboutTor.dtd | 2 ++
src/chrome/locale/ca/browserOnboarding.properties | 2 +-
src/chrome/locale/ca/torbutton.properties | 2 +-
src/chrome/locale/cs/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/cs/aboutTor.dtd | 2 ++
src/chrome/locale/cs/browserOnboarding.properties | 2 +-
src/chrome/locale/da/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/da/aboutTor.dtd | 2 ++
src/chrome/locale/da/browserOnboarding.properties | 2 +-
src/chrome/locale/de/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/de/aboutTor.dtd | 2 ++
src/chrome/locale/de/browserOnboarding.properties | 2 +-
src/chrome/locale/de/torbutton.dtd | 3 ++-
src/chrome/locale/el/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/el/aboutTor.dtd | 2 ++
src/chrome/locale/el/browserOnboarding.properties | 2 +-
src/chrome/locale/el/torbutton.properties | 4 +--
src/chrome/locale/es/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/es/aboutTor.dtd | 2 ++
src/chrome/locale/es/browserOnboarding.properties | 2 +-
src/chrome/locale/eu/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/eu/aboutTor.dtd | 2 ++
src/chrome/locale/eu/browserOnboarding.properties | 2 +-
src/chrome/locale/fa/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/fa/aboutTor.dtd | 2 ++
src/chrome/locale/fa/browserOnboarding.properties | 2 +-
src/chrome/locale/fa/torbutton.properties | 2 +-
src/chrome/locale/fr/aboutDialog.dtd | 4 +--
src/chrome/locale/fr/aboutTBUpdate.dtd | 12 ++++-----
src/chrome/locale/fr/aboutTor.dtd | 8 +++---
src/chrome/locale/fr/brand.dtd | 8 +++---
src/chrome/locale/fr/brand.properties | 8 +++---
src/chrome/locale/fr/browserOnboarding.properties | 14 +++++-----
src/chrome/locale/fr/torbutton.dtd | 8 +++---
src/chrome/locale/fr/torbutton.properties | 18 ++++++-------
src/chrome/locale/ga/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ga/aboutTor.dtd | 2 ++
src/chrome/locale/ga/browserOnboarding.properties | 2 +-
src/chrome/locale/he/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/he/aboutTor.dtd | 2 ++
src/chrome/locale/he/browserOnboarding.properties | 2 +-
src/chrome/locale/hu/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/hu/aboutTor.dtd | 2 ++
src/chrome/locale/hu/browserOnboarding.properties | 2 +-
src/chrome/locale/id/aboutTBUpdate.dtd | 12 ++++-----
src/chrome/locale/id/aboutTor.dtd | 2 ++
src/chrome/locale/id/brand.dtd | 6 ++---
src/chrome/locale/id/brand.properties | 6 ++---
src/chrome/locale/id/browserOnboarding.properties | 12 ++++-----
src/chrome/locale/id/torbutton.dtd | 12 ++++-----
src/chrome/locale/id/torbutton.properties | 6 ++---
src/chrome/locale/is/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/is/aboutTor.dtd | 4 ++-
src/chrome/locale/is/browserOnboarding.properties | 12 ++++-----
src/chrome/locale/is/torbutton.dtd | 2 +-
src/chrome/locale/it/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/it/aboutTor.dtd | 2 ++
src/chrome/locale/it/browserOnboarding.properties | 2 +-
src/chrome/locale/ja/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ja/aboutTor.dtd | 2 ++
src/chrome/locale/ja/browserOnboarding.properties | 2 +-
src/chrome/locale/ka/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ka/aboutTor.dtd | 2 ++
src/chrome/locale/ka/browserOnboarding.properties | 2 +-
src/chrome/locale/ka/torbutton.properties | 2 +-
src/chrome/locale/ko/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ko/aboutTor.dtd | 2 ++
src/chrome/locale/ko/browserOnboarding.properties | 2 +-
src/chrome/locale/nb/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/nb/aboutTor.dtd | 2 ++
src/chrome/locale/nb/browserOnboarding.properties | 2 +-
src/chrome/locale/nl/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/nl/aboutTor.dtd | 8 +++---
src/chrome/locale/nl/browserOnboarding.properties | 30 +++++++++++-----------
src/chrome/locale/nl/torbutton.properties | 4 +--
src/chrome/locale/pl/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/pl/aboutTor.dtd | 2 ++
src/chrome/locale/pl/browserOnboarding.properties | 2 +-
src/chrome/locale/pl/torbutton.properties | 2 +-
src/chrome/locale/pt-BR/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/pt-BR/aboutTor.dtd | 2 ++
.../locale/pt-BR/browserOnboarding.properties | 2 +-
src/chrome/locale/ru/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/ru/aboutTor.dtd | 2 ++
src/chrome/locale/ru/browserOnboarding.properties | 2 +-
src/chrome/locale/sv/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/sv/aboutTor.dtd | 2 ++
src/chrome/locale/sv/browserOnboarding.properties | 2 +-
src/chrome/locale/sv/torbutton.properties | 2 +-
src/chrome/locale/tr/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/tr/aboutTor.dtd | 2 ++
src/chrome/locale/tr/browserOnboarding.properties | 4 +--
src/chrome/locale/tr/torbutton.properties | 2 +-
src/chrome/locale/vi/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/vi/aboutTor.dtd | 2 ++
src/chrome/locale/vi/browserOnboarding.properties | 2 +-
src/chrome/locale/zh-CN/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/zh-CN/aboutTor.dtd | 2 ++
.../locale/zh-CN/browserOnboarding.properties | 2 +-
src/chrome/locale/zh-TW/aboutTBUpdate.dtd | 10 +++-----
src/chrome/locale/zh-TW/aboutTor.dtd | 2 ++
.../locale/zh-TW/browserOnboarding.properties | 2 +-
107 files changed, 298 insertions(+), 293 deletions(-)
diff --git a/src/chrome/locale/ar/aboutTBUpdate.dtd b/src/chrome/locale/ar/aboutTBUpdate.dtd
index 0c25a117..873d24c7 100644
--- a/src/chrome/locale/ar/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ar/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "تحديث متصفح تور">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "تم تحديث متصفح تور.">
<!ENTITY aboutTBUpdate.linkPrefix "للحصول على أحدث المعلومات حول هذا الإصدار،">
<!ENTITY aboutTBUpdate.linkLabel "زُر موقعنا">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "سجل التغييرات:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "تصميم جديد لطريقة عرض الدوائر">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "عرض دوائر تور نقل إلى مكان آخر وخضع للتحسين. انقر على زر «هوية الموقع» (تجده يمين شريط العنوانين) لترى العرض الجديد.">
-<!ENTITY aboutTBUpdate.learnMore "إعرف/ي أكثر ">
+<!ENTITY aboutTBUpdate.version "النسخة">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "ملاحظات الإصدار">
diff --git a/src/chrome/locale/ar/aboutTor.dtd b/src/chrome/locale/ar/aboutTor.dtd
index 878d860e..2627c9b9 100644
--- a/src/chrome/locale/ar/aboutTor.dtd
+++ b/src/chrome/locale/ar/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "عن تور">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "تصفح بهوية خفية">
<!ENTITY aboutTor.ready2.label "أنت جاهز الآن لتجربة التصفح الأكثر خصوصية في العالم.">
<!ENTITY aboutTor.failure.label "حدث خطأ ما!">
diff --git a/src/chrome/locale/ar/browserOnboarding.properties b/src/chrome/locale/ar/browserOnboarding.properties
index 776b619e..b063dd3a 100644
--- a/src/chrome/locale/ar/browserOnboarding.properties
+++ b/src/chrome/locale/ar/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=رؤية المسار الخاص بي
onboarding.tour-tor-security=الأمان
onboarding.tour-tor-security.title=اختر مدى خبرتك
onboarding.tour-tor-security.description=نوفر لك أيضا إعدادات إضافية لرفع مستوى أمان المتصفح. تسمح لك إعدادات الأمان لدينا بحظر العناصر التي يمكن استخدامها لمهاجمة جهاز الكمبيوتر الخاص بك. انقر أدناه لمعرفة ما تفعله الخيارات المختلفة.
-onboarding.tour-tor-security.button=مراجعة الاعدادات
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=نصائح التجربة
onboarding.tour-tor-expect-differences.title=توقع بعض التغيرات
diff --git a/src/chrome/locale/bn-BD/torbutton.dtd b/src/chrome/locale/bn-BD/torbutton.dtd
index 449a49e3..201f3111 100644
--- a/src/chrome/locale/bn-BD/torbutton.dtd
+++ b/src/chrome/locale/bn-BD/torbutton.dtd
@@ -2,6 +2,8 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "এই সাইটের জন্য নতুন টর সার্কিট">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "নিরাপত্তা বিন্যাস…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "টর নেটওয়ার্ক সেটিংস ...">
<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "টর ব্রাউজার আপডেটের জন্য চেক করুন ...">
@@ -10,6 +12,8 @@
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Torbutton আরম্ভ করার জন্য ক্লিক করুন">
<!ENTITY torbutton.prefs.security_settings "টর ব্রাউজার নিরাপত্তা সেটিংস">
+<!ENTITY torbutton.prefs.restore_defaults "পূর্বনির্ধারন পুনরুধার">
+<!ENTITY torbutton.prefs.custom_warning "আপনার কাস্টম ব্রাউজারের পছন্দগুলির কারণে অস্বাভাবিক নিরাপত্তা সেটিংস দেখা দিয়েছে নিরাপত্তা এবং গোপনীয়তার কারণে, আমরা আপনাকে ডিফল্ট নিরাপত্তা স্তরগুলির একটি চয়ন করার সুপারিশ করি।">
<!ENTITY torbutton.cookiedialog.title "কুকি প্রোটেকশনগুলি পরিচালনা করুন">
<!ENTITY torbutton.cookiedialog.lockCol "রক্ষিত">
<!ENTITY torbutton.cookiedialog.domainCol "নিমন্ত্রণকর্তা">
diff --git a/src/chrome/locale/ca/aboutTBUpdate.dtd b/src/chrome/locale/ca/aboutTBUpdate.dtd
index 5daa4dc0..a4ed2fde 100644
--- a/src/chrome/locale/ca/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ca/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Actualització del navegador Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "El navegador Tor s'ha actualitzat. ">
<!ENTITY aboutTBUpdate.linkPrefix "Per la informació més actualitzada sobre aquesta versió,">
<!ENTITY aboutTBUpdate.linkLabel "visiteu el lloc web">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Registre de canvis:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nova pantalla de circuits redissenyats">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "La pantalla del circuit de Tor s'ha reubicat i millorat! Feu clic al botó de Site Identity (situat a la part esquerra de la barra d'URL) per veure la nova pantalla del circuit.">
-<!ENTITY aboutTBUpdate.learnMore "Aprèn més">
+<!ENTITY aboutTBUpdate.version "Versió">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Notes de la versió">
diff --git a/src/chrome/locale/ca/aboutTor.dtd b/src/chrome/locale/ca/aboutTor.dtd
index ca8aee1c..1772b0ba 100644
--- a/src/chrome/locale/ca/aboutTor.dtd
+++ b/src/chrome/locale/ca/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Quant a Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Exploreu. Privadament.">
<!ENTITY aboutTor.ready2.label "Estàs preparat per a l'experiència de navegació més privada del món.">
<!ENTITY aboutTor.failure.label "Hi ha algun error.">
diff --git a/src/chrome/locale/ca/browserOnboarding.properties b/src/chrome/locale/ca/browserOnboarding.properties
index f1cbea63..9374fc34 100644
--- a/src/chrome/locale/ca/browserOnboarding.properties
+++ b/src/chrome/locale/ca/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Veure el meu camí
onboarding.tour-tor-security=Seguretat
onboarding.tour-tor-security.title=Tria la teva experiència.
onboarding.tour-tor-security.description=També li oferim opcions de configuració addicionals per eliminar la seguretat del vostre navegador. La nostra configuració de seguretat us permet bloquejar els elements que es podrien utilitzar per atacar l'ordinador. Feu clic a sota per veure què fan les diferents opcions.
-onboarding.tour-tor-security.button=Opcions de revisió
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Consells sobre experiències
onboarding.tour-tor-expect-differences.title=Espereu algunes diferències.
diff --git a/src/chrome/locale/ca/torbutton.properties b/src/chrome/locale/ca/torbutton.properties
index e8151312..791c0bc9 100644
--- a/src/chrome/locale/ca/torbutton.properties
+++ b/src/chrome/locale/ca/torbutton.properties
@@ -53,7 +53,7 @@ profileMigrationFailed=La migració del vostre perfil %S ha fallat.\nEs fara ser
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=S'està baixant l'actualització %S
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Connexió xifrada (Onion Service, %1$S, claus de %2$S bits, %3$S)
diff --git a/src/chrome/locale/cs/aboutTBUpdate.dtd b/src/chrome/locale/cs/aboutTBUpdate.dtd
index 5c10f2cb..9e5ea44a 100644
--- a/src/chrome/locale/cs/aboutTBUpdate.dtd
+++ b/src/chrome/locale/cs/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Aktualizace prohlížeče Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Prohlížeč Tor byl aktualizován.">
<!ENTITY aboutTBUpdate.linkPrefix "Informace o tomto vydání najdete na ">
<!ENTITY aboutTBUpdate.linkLabel "naši webové stránce">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Přehled změn:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nové zobrazení okruhů">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Vylepšili jsme zobrazení okruhů Toru. Pro jeho otevření klepněte na tlačítko „Identita&160#stránky“ umístěné v levé části adresního řádku.">
-<!ENTITY aboutTBUpdate.learnMore "Zjistit více">
+<!ENTITY aboutTBUpdate.version "Verze">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Poznámky k verzi">
diff --git a/src/chrome/locale/cs/aboutTor.dtd b/src/chrome/locale/cs/aboutTor.dtd
index 2c29d50d..78dfd349 100644
--- a/src/chrome/locale/cs/aboutTor.dtd
+++ b/src/chrome/locale/cs/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "O Toru">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Prohlížejte v soukromí.">
<!ENTITY aboutTor.ready2.label "Vše je připraveno pro maximální soukromí Vašeho prohlížení.">
<!ENTITY aboutTor.failure.label "Něco se pokazilo!">
diff --git a/src/chrome/locale/cs/browserOnboarding.properties b/src/chrome/locale/cs/browserOnboarding.properties
index 24234cb2..c90feb07 100644
--- a/src/chrome/locale/cs/browserOnboarding.properties
+++ b/src/chrome/locale/cs/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Moje cesta
onboarding.tour-tor-security=Zabezpečení
onboarding.tour-tor-security.title=Určujte svůj prožitek.
onboarding.tour-tor-security.description=K dispozici máte rozšířená nastavení pro další zvýšení zabezpečení, např. blokování všech prvků, které mohou být potenciálně použity k útoku na váš počítač. Pro zobrazení různých možností a jejich fungování klepněte níže.
-onboarding.tour-tor-security.button=Zkontrolovat nastavení
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Tipy
onboarding.tour-tor-expect-differences.title=Očekávejte rozdíly.
diff --git a/src/chrome/locale/da/aboutTBUpdate.dtd b/src/chrome/locale/da/aboutTBUpdate.dtd
index 84c053af..c0d74bb2 100644
--- a/src/chrome/locale/da/aboutTBUpdate.dtd
+++ b/src/chrome/locale/da/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Opdateringer til Tor Browser">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser er blevet opdateret.">
<!ENTITY aboutTBUpdate.linkPrefix "For den mest aktuelle information om denne udgivelse,">
<!ENTITY aboutTBUpdate.linkLabel "Besøg vores webside">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Ændringslog:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nyt, redesignet kredsløb-display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tors kredsløb-display er blev flyttet og forbedret! Klik på stedets identitet-knap (findes på venstre side af URL-linjen) for at se det nye kredskøb-display.">
-<!ENTITY aboutTBUpdate.learnMore "Læs mere">
+<!ENTITY aboutTBUpdate.version "Version">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/da/aboutTor.dtd b/src/chrome/locale/da/aboutTor.dtd
index 902a84fa..18c0275c 100644
--- a/src/chrome/locale/da/aboutTor.dtd
+++ b/src/chrome/locale/da/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Om Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Udforsk. Privat.">
<!ENTITY aboutTor.ready2.label "Du er klar til verdenens mest private browseroplevelse.">
<!ENTITY aboutTor.failure.label "Noget gik galt!">
diff --git a/src/chrome/locale/da/browserOnboarding.properties b/src/chrome/locale/da/browserOnboarding.properties
index dd257df4..717dc4b2 100644
--- a/src/chrome/locale/da/browserOnboarding.properties
+++ b/src/chrome/locale/da/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Se min sti
onboarding.tour-tor-security=Sikkerhed
onboarding.tour-tor-security.title=Vælg din oplevelse.
onboarding.tour-tor-security.description=Vi giver dig også yderligere sikkerhedsindstillinger for at øge din browsersikkerhed. Vores sikkerhedsindstillinger giver dig mulighed for at blokere elementer der kan bruges til at angribe din computer. Klik nedenfor for at se hvad de forskellige valgmuligheder gør.
-onboarding.tour-tor-security.button=Gennemgå indstillinger
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Oplevelesestips
onboarding.tour-tor-expect-differences.title=Forvent nogen forskelle.
diff --git a/src/chrome/locale/de/aboutTBUpdate.dtd b/src/chrome/locale/de/aboutTBUpdate.dtd
index 9b0d0bfa..cc1ab47c 100644
--- a/src/chrome/locale/de/aboutTBUpdate.dtd
+++ b/src/chrome/locale/de/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser wurde aktualisiert.">
<!ENTITY aboutTBUpdate.linkPrefix "Für die aktuellsten Informationen zu diesem Release, ">
<!ENTITY aboutTBUpdate.linkLabel "besuche unsere Website">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Neu, Überarbeitete Circuit-Anzeige">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Die Tor-Circuit-Anzeige wurde verschoben und verbessert! Klicke auf den Knopf Site Identity (links in der URL-Leiste), um die neue Circuit-Anzeige zu sehen.">
-<!ENTITY aboutTBUpdate.learnMore "Mehr erfahren">
+<!ENTITY aboutTBUpdate.version "Version">
+<!ENTITY aboutTBUpdate.releaseDate "Erscheinungsdatum">
+<!ENTITY aboutTBUpdate.releaseNotes "Versionshinweise">
diff --git a/src/chrome/locale/de/aboutTor.dtd b/src/chrome/locale/de/aboutTor.dtd
index 6bd2e164..c4681b7b 100644
--- a/src/chrome/locale/de/aboutTor.dtd
+++ b/src/chrome/locale/de/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Über Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Entdecken. Privat.">
<!ENTITY aboutTor.ready2.label "Du bist bereit für das privateste Browsing-Erlebnis der Welt.">
<!ENTITY aboutTor.failure.label "Irgend etwas lief schief!">
diff --git a/src/chrome/locale/de/browserOnboarding.properties b/src/chrome/locale/de/browserOnboarding.properties
index d57b3f15..c3856b8d 100644
--- a/src/chrome/locale/de/browserOnboarding.properties
+++ b/src/chrome/locale/de/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Meinen Pfad sehen
onboarding.tour-tor-security=Sicherheit
onboarding.tour-tor-security.title=Wähle deine Erfahrung
onboarding.tour-tor-security.description=Wir bieten zusätzliche Einstellungen, um die Sicherheit zu erhöhen. In den Sicherheitseinstellungen können verschiedene Objekte und Funktionen deaktiviert werden, welche die Sicherheit des Computers gefährden können. Klicken Sie, um zu erfahren, was die verschiedenen Optionen bewirken.
-onboarding.tour-tor-security.button=Einstellungen überprüfen
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Erfahrungswerte
onboarding.tour-tor-expect-differences.title=Erwarten Sie einige Unterschiede.
diff --git a/src/chrome/locale/de/torbutton.dtd b/src/chrome/locale/de/torbutton.dtd
index 1846ff51..c3d815f0 100644
--- a/src/chrome/locale/de/torbutton.dtd
+++ b/src/chrome/locale/de/torbutton.dtd
@@ -23,7 +23,8 @@
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Neue Cookies nicht schützen">
<!ENTITY torbutton.prefs.sec_caption "Sicherheitsstufe">
<!ENTITY torbutton.prefs.sec_caption_tooltip "Mit dem Sicherheitsschieberegler kannst du bestimmte Browserfunktionen, die deinen Browser für mögliche Attacken anfälliger machen, deaktivieren.">
-<!ENTITY torbutton.prefs.sec_standard_label "Standard">
+<!ENTITY torbutton.prefs.sec_standard_label "Standard
+">
<!ENTITY torbutton.prefs.sec_standard_description "Alle Tor Browser und Webseiten Funktionen sind aktiviert.">
<!ENTITY torbutton.prefs.sec_safer_label "Sicherer">
<!ENTITY torbutton.prefs.sec_safer_description "Deaktiviert Webseiten-Funktionen, die oft gefährlich sind. Sorgt dafür, dass manche Seiten nicht mehr so gut funktionieren">
diff --git a/src/chrome/locale/el/aboutTBUpdate.dtd b/src/chrome/locale/el/aboutTBUpdate.dtd
index 085896d0..9a89e674 100644
--- a/src/chrome/locale/el/aboutTBUpdate.dtd
+++ b/src/chrome/locale/el/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Αναβάθμιση του Tor Browser">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Ο Tor Browser αναβαθμίστηκε.">
<!ENTITY aboutTBUpdate.linkPrefix "Για τις πιο πρόσφατες πληροφορίες για αυτή την έκδοση,">
<!ENTITY aboutTBUpdate.linkLabel "επισκεφθείτε την ιστοσελίδα μας">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Αλλαγές:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Νέα, επανασχεδιασμένη παρουσίαση κυκλώματος">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Το κύκλωμα του Tor έχει αλλάξει τοποθεσία και βελτιώθηκε! Κάντε κλικ στη σελίδα Κουμπί ταυτότητας (βρίσκεται στην αριστερή πλευρά της γραμμής διεύθυνσης) για να δείτε την καινούρια παρουσίαση κυκλώματος.">
-<!ENTITY aboutTBUpdate.learnMore "Μάθετε περισσότερα">
+<!ENTITY aboutTBUpdate.version "Έκδοση">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/el/aboutTor.dtd b/src/chrome/locale/el/aboutTor.dtd
index dbddba88..dc6c1ee0 100644
--- a/src/chrome/locale/el/aboutTor.dtd
+++ b/src/chrome/locale/el/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Σχετικά με το Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Εξερευνήστε. Με ιδιωτικότητα.">
<!ENTITY aboutTor.ready2.label "Είστε έτοιμος για την πιο ιδιωτική εμπειρία περιήγησης.">
<!ENTITY aboutTor.failure.label "Κάτι πήγε στραβά!">
diff --git a/src/chrome/locale/el/browserOnboarding.properties b/src/chrome/locale/el/browserOnboarding.properties
index 680a904d..eaf94aa5 100644
--- a/src/chrome/locale/el/browserOnboarding.properties
+++ b/src/chrome/locale/el/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Βλέπω το μονοπάτι μο
onboarding.tour-tor-security=Ασφάλεια
onboarding.tour-tor-security.title=Επιλέξτε την εμπειρία σας.
onboarding.tour-tor-security.description=Μπορούμε να προσφέρουμε επιπρόσθετες ρυθμίσεις για να ενισχύσουμε την ασφάλεια του περιηγητή σας. Οι Ρυθμίσεις Ασφαλείας σας επιτρέπουν να μπλοκάρεετε στοιχεία που θα μπορούσαν να χρησιμοποιηθούν για επιθέσεις στον υπολογιστή σας. Επίλεξτε παρακάτω για να δείτε τι κάνουν οι διαφορετικές ρυθμίσεις.
-onboarding.tour-tor-security.button=Έλεγχος Ρυθμίσεων
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Προτάσεις εμπειρίας
onboarding.tour-tor-expect-differences.title=Κάποιες διαφορές είναι αναμενόμενες.
diff --git a/src/chrome/locale/el/torbutton.properties b/src/chrome/locale/el/torbutton.properties
index 36a18f03..d6c493ed 100644
--- a/src/chrome/locale/el/torbutton.properties
+++ b/src/chrome/locale/el/torbutton.properties
@@ -1,4 +1,4 @@
-torbutton.circuit_display.internet = Ίντερνετ
+torbutton.circuit_display.internet = Διαδίκτυο
torbutton.circuit_display.ip_unknown = Άγνωστη διεύθυνση IP
torbutton.circuit_display.onion_site = Ιστότοπος Onion
torbutton.circuit_display.this_browser = Αυτός ο browser
@@ -53,7 +53,7 @@ profileMigrationFailed=Η μεταφορά του υπάρχοντος προφ
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=Λήψη %S ενημερώσεων
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Κρυπτογραφημένη σύνδεση (υπηρεσία Onion, %1$S, %2$S bit keys, %3$S)
diff --git a/src/chrome/locale/es/aboutTBUpdate.dtd b/src/chrome/locale/es/aboutTBUpdate.dtd
index c90e99df..49470e29 100644
--- a/src/chrome/locale/es/aboutTBUpdate.dtd
+++ b/src/chrome/locale/es/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Actualización del Tor Browser">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "El Tor Browser ha sido actualizado.">
<!ENTITY aboutTBUpdate.linkPrefix "Para ver la información más actualizada de esta versión, ">
<!ENTITY aboutTBUpdate.linkLabel "visite nuestro sitio web">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Registro de cambios:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nueva Pantalla de Circuito Rediseñada">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "¡Se ha trasladado y mejorado la visualización del enrutado de Tor! Clic en el botón Site Identity (situado en el lado izquierdo de la barra de direcciones URL) para ver la nueva visualización del circuito.">
-<!ENTITY aboutTBUpdate.learnMore "Aprende más">
+<!ENTITY aboutTBUpdate.version "Versión">
+<!ENTITY aboutTBUpdate.releaseDate "Fecha de lanzamiento">
+<!ENTITY aboutTBUpdate.releaseNotes "Notas de versiones">
diff --git a/src/chrome/locale/es/aboutTor.dtd b/src/chrome/locale/es/aboutTor.dtd
index f97f5e34..1b1fb3df 100644
--- a/src/chrome/locale/es/aboutTor.dtd
+++ b/src/chrome/locale/es/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Acerca de Tor">
+<!ENTITY aboutTor.viewChangelog.label "Ver registro de modificaciones.">
+
<!ENTITY aboutTor.ready.label "Explora. En privado.">
<!ENTITY aboutTor.ready2.label "Ahora estás listo/a para experimentar la navegación más privada del mundo.">
<!ENTITY aboutTor.failure.label "¡Algo fue mal!">
diff --git a/src/chrome/locale/es/browserOnboarding.properties b/src/chrome/locale/es/browserOnboarding.properties
index ded4d46c..ce7973aa 100644
--- a/src/chrome/locale/es/browserOnboarding.properties
+++ b/src/chrome/locale/es/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Ver mi recorrido
onboarding.tour-tor-security=Seguridad
onboarding.tour-tor-security.title=Elige tu experiencia.
onboarding.tour-tor-security.description=También te proporcionamos configuraciones adicionales para aumentar la seguridad de tu navegador. Nuestra Configuración de Seguridad te permite bloquear elementos que podrían usarse para atacar tu computadora. Haz clic a continuación para ver lo que hacen las diferentes opciones.
-onboarding.tour-tor-security.button=Revisar configuración
+onboarding.tour-tor-security-level.button=Mira tu nivel de seguridad
onboarding.tour-tor-expect-differences=Consejos de expertos
onboarding.tour-tor-expect-differences.title=Espera algunas diferencias.
diff --git a/src/chrome/locale/eu/aboutTBUpdate.dtd b/src/chrome/locale/eu/aboutTBUpdate.dtd
index acaa0da7..b69a4856 100644
--- a/src/chrome/locale/eu/aboutTBUpdate.dtd
+++ b/src/chrome/locale/eu/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor nabigatzailearen eguneraketa">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor nabigatzailea eguneratu egin da.">
<!ENTITY aboutTBUpdate.linkPrefix "Eguneraketa honen inguruko azken informazioa lortzeko,">
<!ENTITY aboutTBUpdate.linkLabel "ikusi ezazu gure webgunea">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Aldaketen zerrenda:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "New, Redesigned Circuit Display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "Ikasi gehiago">
+<!ENTITY aboutTBUpdate.version "Bertsioa">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/eu/aboutTor.dtd b/src/chrome/locale/eu/aboutTor.dtd
index 4b9d3ec1..4db4587d 100644
--- a/src/chrome/locale/eu/aboutTor.dtd
+++ b/src/chrome/locale/eu/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tori buruz">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Esploratu. Pribatuki.">
<!ENTITY aboutTor.ready2.label "You’re ready for the world’s most private browsing experience.">
<!ENTITY aboutTor.failure.label "Zerbait gaizki joan da!">
diff --git a/src/chrome/locale/eu/browserOnboarding.properties b/src/chrome/locale/eu/browserOnboarding.properties
index ae04ee31..6b6f9658 100644
--- a/src/chrome/locale/eu/browserOnboarding.properties
+++ b/src/chrome/locale/eu/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Ikusi nire bidea
onboarding.tour-tor-security=Segurtasuna
onboarding.tour-tor-security.title=Choose your experience.
onboarding.tour-tor-security.description=We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do.
-onboarding.tour-tor-security.button=Review Settings
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Experience Tips
onboarding.tour-tor-expect-differences.title=Expect some differences.
diff --git a/src/chrome/locale/fa/aboutTBUpdate.dtd b/src/chrome/locale/fa/aboutTBUpdate.dtd
index ab4edbc6..38707958 100644
--- a/src/chrome/locale/fa/aboutTBUpdate.dtd
+++ b/src/chrome/locale/fa/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "بروز رسانی مرورگر تور">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "مرورگر تور بهروز شده است.">
<!ENTITY aboutTBUpdate.linkPrefix "به منظور جدیدترین اطلاعات دربارهی این نسخه،">
<!ENTITY aboutTBUpdate.linkLabel "از وبسایت ما دیدن کنید">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "لیست تغییرات:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "نمایش جدید و دوباره طراحی شدهی جریان">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "نمایش جریان تور نقل مکان و بهبود یافت! بر روی دکمه ی هویت سایت کلیک کنید (که در سمت چپ نوار آدرس اینترنتی قرار دارد) تا نمایش جدید جریان را ببینید.">
-<!ENTITY aboutTBUpdate.learnMore "بیشتر بدانید">
+<!ENTITY aboutTBUpdate.version "نسخه">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "توضیحات انتشار">
diff --git a/src/chrome/locale/fa/aboutTor.dtd b/src/chrome/locale/fa/aboutTor.dtd
index 85d5ce96..ad6ce772 100644
--- a/src/chrome/locale/fa/aboutTor.dtd
+++ b/src/chrome/locale/fa/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "دربارهی تور">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "کاوش. خصوصی.">
<!ENTITY aboutTor.ready2.label "شما برای تجربه خصوصیترین مرور اینترنت در جهان آماده هستید.">
<!ENTITY aboutTor.failure.label "خطایی پیش آمده است!">
diff --git a/src/chrome/locale/fa/browserOnboarding.properties b/src/chrome/locale/fa/browserOnboarding.properties
index 79111576..bb92f969 100644
--- a/src/chrome/locale/fa/browserOnboarding.properties
+++ b/src/chrome/locale/fa/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=مشاهده مسیر من
onboarding.tour-tor-security=امنیت
onboarding.tour-tor-security.title=انتخاب تجربهی شما
onboarding.tour-tor-security.description=همچنین ما تنظیمات اضافی برای بالا بردن امنیت مرورگر شما فراهم کردهایم. تنظیمات امنیت ما به شما اجازه میدهد تا اجزایی که ممکن است برای حمله به رایانه شما استفاده شوند را مسدود کنید. برای مشاهدهی گزینههای مختلفی که وجود دارد، پایین را کلیک کنید.
-onboarding.tour-tor-security.button=مرور تنظیمات
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=نکات تجربه
onboarding.tour-tor-expect-differences.title=انتظار برخی تفاوتها را داشته باشید.
diff --git a/src/chrome/locale/fa/torbutton.properties b/src/chrome/locale/fa/torbutton.properties
index 3d49e5e4..23c6309d 100644
--- a/src/chrome/locale/fa/torbutton.properties
+++ b/src/chrome/locale/fa/torbutton.properties
@@ -53,7 +53,7 @@ profileMigrationFailed=مهاجرت ناموفق از پروفایل %S.\nتنظ
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=در حال دانلود %S بروز رسانی
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=ارتباط رمزگذاری شده (سرویس Onion, %1$S, %2$S bit keys, %3$S)
diff --git a/src/chrome/locale/fr/aboutDialog.dtd b/src/chrome/locale/fr/aboutDialog.dtd
index f67c4434..d3720fda 100644
--- a/src/chrome/locale/fr/aboutDialog.dtd
+++ b/src/chrome/locale/fr/aboutDialog.dtd
@@ -13,7 +13,7 @@
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "Des questions ?">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
-<!ENTITY bottomLinks.grow "Aidez à la croissance du réseau Tor !">
+<!ENTITY bottomLinks.grow "Aidez à la croissance du réseau Tor !">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
<!ENTITY bottomLinks.license "Informations de licence">
-<!ENTITY tor.TrademarkStatement "« Tor » et le « logo Oignon » sont des marques de commerce de « The Tor Project, Inc. »">
+<!ENTITY tor.TrademarkStatement "« Tor » et le « logo Oignon » sont des marques de commerce de « The Projet Tor, Inc. »">
diff --git a/src/chrome/locale/fr/aboutTBUpdate.dtd b/src/chrome/locale/fr/aboutTBUpdate.dtd
index cfed15d9..8186f71e 100644
--- a/src/chrome/locale/fr/aboutTBUpdate.dtd
+++ b/src/chrome/locale/fr/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Mise à jour du Navigateur Tor">
-<!ENTITY aboutTBUpdate.updated "Le Navigateur Tor a été mis à jour.">
+<!ENTITY aboutTBUpdate.changelogTitle "Journal des changements du navigateur Tor Browser">
+<!ENTITY aboutTBUpdate.updated "Le navigateur Tor Browser a été mis à jour.">
<!ENTITY aboutTBUpdate.linkPrefix "Pour les toutes dernières informations sur cette version,">
<!ENTITY aboutTBUpdate.linkLabel "visitez notre site Web">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Journal des changements :">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Affichage des circuits nouveau et repensé">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "L’affichage des circuits de Tor a été déplacé et amélioré ! Cliquez sur le bouton Identité du site (situé à gauche de la barre d’URL) pour voir le nouvel affichage des circuits.">
-<!ENTITY aboutTBUpdate.learnMore "En apprendre davantage">
+<!ENTITY aboutTBUpdate.version "Version">
+<!ENTITY aboutTBUpdate.releaseDate "Date de sortie">
+<!ENTITY aboutTBUpdate.releaseNotes "Notes de mise à jour ">
diff --git a/src/chrome/locale/fr/aboutTor.dtd b/src/chrome/locale/fr/aboutTor.dtd
index 6ae2392d..f5362525 100644
--- a/src/chrome/locale/fr/aboutTor.dtd
+++ b/src/chrome/locale/fr/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "À propos de Tor ">
+<!ENTITY aboutTor.viewChangelog.label "Visualiser le journal des changements">
+
<!ENTITY aboutTor.ready.label "Explorez, en toute confidentialité.">
<!ENTITY aboutTor.ready2.label "Vous êtes prêts pour l’expérience de navigation la plus confidentielle au monde.">
<!ENTITY aboutTor.failure.label "Un problème est survenu !">
@@ -15,12 +17,12 @@
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Des questions ?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Consultez notre guide d’utilisation du navigateur Tor »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Consultez notre guide d’utilisation du navigateur Tor Browser »">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "G">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Guide d’utilisation du Navigateur Tor">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Guide d’utilisation du navigateur Tor Browser">
-<!ENTITY aboutTor.tor_mission.label "Le Projet Tor est une organisation sans but lucratif US 501(c)(3) qui fait progresser les droits de la personne et les libertés en créant et en déployant des technologies d’anonymat et de confidentialité gratuites et à code source ouvert. Nous soutenons leur disponibilité et leur utilisation sans restriction, et promouvons une meilleure compréhension scientifique et populaire.">
+<!ENTITY aboutTor.tor_mission.label "Le Projet Tor est une organisation sans but lucratif US 501(c)(3) qui fait progresser les droits de la personne et les libertés en créant et en déployant des technologies d’anonymat et de confidentialité gratuites et à code source ouvert. Nous soutenons leur disponibilité et leur utilisation sans restriction, et promouvons une meilleure compréhension scientifique et populaire.">
<!ENTITY aboutTor.getInvolved.label "Impliquez-vous »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html">
diff --git a/src/chrome/locale/fr/brand.dtd b/src/chrome/locale/fr/brand.dtd
index a55f3014..63ce59ce 100644
--- a/src/chrome/locale/fr/brand.dtd
+++ b/src/chrome/locale/fr/brand.dtd
@@ -2,10 +2,10 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<!ENTITY brandShorterName "Navigateur Tor">
-<!ENTITY brandShortName "Navigateur Tor">
-<!ENTITY brandFullName "Navigateur Tor">
-<!ENTITY vendorShortName "Projet Tor">
+<!ENTITY brandShorterName "Tor Browser">
+<!ENTITY brandShortName "Tor Browser">
+<!ENTITY brandFullName "Tor Browser">
+<!ENTITY vendorShortName "Le Projet Tor">
<!ENTITY trademarkInfo.part1 "Firefox et les logos de Firefox sont des marques de commerce de la Fondation Mozilla.">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
diff --git a/src/chrome/locale/fr/brand.properties b/src/chrome/locale/fr/brand.properties
index 0c6249f6..ab9ea77f 100644
--- a/src/chrome/locale/fr/brand.properties
+++ b/src/chrome/locale/fr/brand.properties
@@ -2,10 +2,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-brandShorterName=Navigateur Tor
-brandShortName=Navigateur Tor
-brandFullName=Navigateur Tor
-vendorShortName=Projet Tor
+brandShorterName=Tor Browser
+brandShortName=Tor Browser
+brandFullName=Tor Browser
+vendorShortName=Le Projet Tor
homePageSingleStartMain=Firefox Start, une page d’accueil rapide avec recherche intégrée
homePageImport=Importez votre page d’accueil à partir de %S
diff --git a/src/chrome/locale/fr/browserOnboarding.properties b/src/chrome/locale/fr/browserOnboarding.properties
index 28065b44..b3f897a0 100644
--- a/src/chrome/locale/fr/browserOnboarding.properties
+++ b/src/chrome/locale/fr/browserOnboarding.properties
@@ -4,28 +4,28 @@
onboarding.tour-tor-welcome=Bienvenue
onboarding.tour-tor-welcome.title=Vous êtes prêts.
-onboarding.tour-tor-welcome.description=Le Navigateur Tor offre le plus haut niveau de confidentialité et de sécurité quand vous parcourez le Web. Vous êtes maintenant protégé contre le suivi à la trace, la surveillance et la censure. Cette introduction rapide vous montrera comment faire.
+onboarding.tour-tor-welcome.description=Le navigateur Tor Browser offre le plus haut niveau de confidentialité et de sécurité quand vous parcourez le Web. Vous êtes maintenant protégé contre le suivi à la trace, la surveillance et la censure. Cette introduction rapide vous montrera comment faire.
onboarding.tour-tor-welcome.button=Commencer maintenant
onboarding.tour-tor-privacy=Confidentialité
onboarding.tour-tor-privacy.title=Repoussez les traqueurs et les fouineurs.
-onboarding.tour-tor-privacy.description=Le Navigateur Tor isole les témoins et supprime l’historique de votre navigateur en fin de session. Ces modifications garantissent que confidentialité et sécurité sont protégées dans le navigateur. Cliquez sur « Réseau Tor » pour savoir comment nous vous protégeons au niveau du réseau.
-onboarding.tour-tor-privacy.button=Se rendre sur le Réseau Tor
+onboarding.tour-tor-privacy.description=Le navigateur Tor Browser isole les témoins et supprime l’historique de votre navigateur en fin de session. Ces modifications garantissent que confidentialité et sécurité sont protégées dans le navigateur. Cliquez sur « Réseau Tor » pour savoir comment nous vous protégeons au niveau du réseau.
+onboarding.tour-tor-privacy.button=Se rendre sur le Réseau Tor
-onboarding.tour-tor-network=Réseau Tor
+onboarding.tour-tor-network=Réseau Tor
onboarding.tour-tor-network.title=Naviguez sur un réseau décentralisé.
-onboarding.tour-tor-network.description=Le navigateur Tor vous connecte au réseau Tor exploité par des milliers de bénévoles dans le monde entier. Contrairement à un RPV, il n’y a pas de point de défaillance unique ou d’entité centralisée auxquels vous devez faire confiance pour profiter d’Internet en toute confidentialité.
+onboarding.tour-tor-network.description=Le navigateur Tor Browser vous connecte au réseau Tor exploité par des milliers de bénévoles dans le monde entier. Contrairement à un RPV, il n’y a pas de point de défaillance unique ou d’entité centralisée auxquels vous devez faire confiance pour profiter d’Internet en toute confidentialité.
onboarding.tour-tor-network.button=Se rendre sur l’Affichage des circuits
onboarding.tour-tor-circuit-display=Affichage des circuits
onboarding.tour-tor-circuit-display.title=Visualisez votre chemin.
-onboarding.tour-tor-circuit-display.description=Pour chaque domaine que vous visitez, votre trafic est relayé et chiffré dans un circuit passant par trois relais Tor disséminés de par le monde. Aucun site Web ne sait d’où vous vous connectez. Vous pouvez demander un nouveau circuit en cliquant sur « Nouveau circuit Tor pour ce site » dans votre Affichage des circuits.
+onboarding.tour-tor-circuit-display.description=Pour chaque domaine que vous visitez, votre trafic est relayé et chiffré dans un circuit passant par trois relais Tor disséminés de par le monde. Aucun site Web ne sait d’où vous vous connectez. Vous pouvez demander un nouveau circuit en cliquant sur « Nouveau circuit Tor pour ce site » dans votre Affichage des circuits.
onboarding.tour-tor-circuit-display.button=Visualiser mon chemin
onboarding.tour-tor-security=Sécurité
onboarding.tour-tor-security.title=Choisissez votre expérience.
onboarding.tour-tor-security.description=Nous vous offrons aussi des paramètres supplémentaires pour augmenter la sécurité de votre navigateur. Nos paramètres de sécurité vous permettent de bloquer des éléments qui pourraient être utilisés pour attaquer votre ordinateur. Cliquez ci-dessous pour voir ce que les différentes options vous proposent.
-onboarding.tour-tor-security.button=Passer les paramètres en revue
+onboarding.tour-tor-security-level.button=Voir votre niveau de sécurité
onboarding.tour-tor-expect-differences=Conseils sur l’expérience
onboarding.tour-tor-expect-differences.title=Attendez-vous à des différences.
diff --git a/src/chrome/locale/fr/torbutton.dtd b/src/chrome/locale/fr/torbutton.dtd
index be848ce6..4440705c 100644
--- a/src/chrome/locale/fr/torbutton.dtd
+++ b/src/chrome/locale/fr/torbutton.dtd
@@ -2,14 +2,14 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nouveau circuit Tor pour ce site">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.networksettings "Paramètres du réseau Tor">
+<!ENTITY torbutton.context_menu.networksettings "Paramètres du réseau Tor">
<!ENTITY torbutton.context_menu.networksettings.key "R">
-<!ENTITY torbutton.context_menu.downloadUpdate "Vérifier les mises à jour du Navigateur Tor">
+<!ENTITY torbutton.context_menu.downloadUpdate "Vérifier les mises à jour du navigateur Tor Browser">
<!ENTITY torbutton.context_menu.downloadUpdate.key "M">
<!ENTITY torbutton.context_menu.cookieProtections "Protections des fichiers témoins…">
<!ENTITY torbutton.context_menu.cookieProtections.key "T">
<!ENTITY torbutton.button.tooltip "Cliquer pour lancer BoutonTor">
-<!ENTITY torbutton.prefs.security_settings "Paramètres de sécurité du Navigateur Tor">
+<!ENTITY torbutton.prefs.security_settings "Paramètres de sécurité du navigateur Tor Browser">
<!ENTITY torbutton.cookiedialog.title "Gérer les protections des fichiers témoins">
<!ENTITY torbutton.cookiedialog.lockCol "Protégé">
<!ENTITY torbutton.cookiedialog.domainCol "Hôte">
@@ -24,7 +24,7 @@
<!ENTITY torbutton.prefs.sec_caption "Niveau de sécurité">
<!ENTITY torbutton.prefs.sec_caption_tooltip "Le curseur de sécurité vous permet de désactiver certaines fonctions du navigateur qui pourraient le rendre plus vulnérable aux tentatives de piratage.">
<!ENTITY torbutton.prefs.sec_standard_label "Normal">
-<!ENTITY torbutton.prefs.sec_standard_description "Toutes les fonctions du Navigateur Tor et des sites Web sont activées.">
+<!ENTITY torbutton.prefs.sec_standard_description "Toutes les fonctions du navigateur Tor Browser et des sites Web sont activées.">
<!ENTITY torbutton.prefs.sec_safer_label "Plus sûr">
<!ENTITY torbutton.prefs.sec_safer_description "Désactive les fonctions souvent dangereuses des sites Web, ce qui pourrait entraîner une perte de fonctionnalité de certains sites Web.">
<!ENTITY torbutton.prefs.sec_safer_list_label "Au réglage Plus sûr :">
diff --git a/src/chrome/locale/fr/torbutton.properties b/src/chrome/locale/fr/torbutton.properties
index 02a344d0..27d9b3ca 100644
--- a/src/chrome/locale/fr/torbutton.properties
+++ b/src/chrome/locale/fr/torbutton.properties
@@ -5,36 +5,36 @@ torbutton.circuit_display.this_browser = Ce navigateur
torbutton.circuit_display.relay = Relais
torbutton.circuit_display.tor_bridge = Pont
torbutton.circuit_display.unknown_country = Pays inconnu
-torbutton.circuit_display.guard = Garde
+torbutton.circuit_display.guard = garde
torbutton.circuit_display.guard_note = Votre nœud de [Guard] ne peut pas changer.
torbutton.circuit_display.learn_more = En apprendre davantage
-torbutton.content_sizer.margin_tooltip = Le Navigateur Tor ajoute cette marge pour rendre la largeur et la hauteur de votre fenêtre moins distinctives, et pour réduire par conséquent la possibilité que l’on vous suive à la trace en ligne.
+torbutton.content_sizer.margin_tooltip = Le navigateur Tor Browser ajoute cette marge pour rendre la largeur et la hauteur de votre fenêtre moins distinctives, et pour réduire par conséquent la possibilité que l’on vous suive à la trace en ligne.
torbutton.panel.tooltip.disabled = Cliquer pour activer Tor
torbutton.panel.tooltip.enabled = Cliquer pour désactiver Tor
torbutton.panel.label.disabled = Tor est désactivé
torbutton.panel.label.enabled = Tor est activé
-extensions.torbutton(a)torproject.org.description = BoutonTor fournit un bouton pour configurer les paramètres de Tor et vider facilement les données de navigation privée.
+extensions.torbutton(a)torproject.org.description = BoutonTor offre un bouton pour configurer les paramètres de Tor et effacer facilement les données de navigation privée.
torbutton.popup.external.title = Télécharger un type de fichier externe ?
-torbutton.popup.external.app = Le Navigateur Tor ne peut pas afficher ce fichier. Il est necessaire de l’ouvrir avec une autre application.
+torbutton.popup.external.app = Le navigateur Tor Browser ne peut pas afficher ce fichier. Vous devrez l’ouvrir avec une autre application.
torbutton.popup.external.note = Certains types de fichiers peuvent causer des connexions à l’Internet sans passer par Tor pour certaines applications
torbutton.popup.external.suggest = Par sécurité, vous ne devriez ouvrir les fichiers téléchargés qu’une fois hors ligne ou en utilisant un CD autonome Tor comme Tails.\n
torbutton.popup.launch = Télécharger le fichier
torbutton.popup.cancel = Annuler
torbutton.popup.dontask = Télécharger automatiquement à partir de maintenant
-torbutton.popup.no_newnym = BoutonTor ne peut pas vous attribuer une nouvelle identité de façon sûre. Il n’a pas accès au port de contrôle de Tor.\n\nUtilisez-vous l’offre groupée du Navigateur Tor ?
+torbutton.popup.no_newnym = BoutonTor ne peut pas vous attribuer une nouvelle identité de façon sûre. Il n’a pas accès au port de contrôle de Tor.\n\nUtilisez-vous l’offre groupée du navigateur Tor Browser ?
torbutton.security_settings.menu.title = Paramètres de sécurité
torbutton.title.prompt_torbrowser = Informations importantes concernant BoutonTor
-torbutton.popup.prompt_torbrowser = BoutonTor fonctionne différemment maintenant : vous ne pouvez plus le désactiver.\n\nNous avons effectué ce changement car il n’est pas sécuritaire d’utiliser BoutonTor dans un navigateur qui est également utiliser pour une navigation sans Tor. Trop de bogues ne pouvaient être réglés autrement.\n\nSi vous voulez continuer à utiliser Firefox normalement, vous devriez désinstaller BoutonTor et télécharger l’offre groupée du Navigateur Tor. Les propriétés de confidentialité du Navigateur Tor sont aussi supérieures à celles de Firefox, même s’il est utilisé avec BoutonTor.\n\nPour enlever BoutonTor, allez dans Outils->Modules complémentaires->Extensions et cliquer sur Supprimer à coté de BoutonTor.
+torbutton.popup.prompt_torbrowser = Dorénavant, BoutonTor fonctionne différemment : vous ne pouvez plus le désactiver.\n\nNous avons effectué ce changement, car il n’est pas sécuritaire d’utiliser BoutonTor dans un navigateur qui est également utilisé pour une navigation sans Tor. Trop de bogues ne pouvaient être réglés autrement.\n\nSi vous voulez continuer à utiliser Firefox normalement, vous devriez désinstaller BoutonTor et télécharger l’offre groupée du navigateur Tor Browser. Les propriétés de confidentialité du navigateur Tor Browser sont aussi supérieures à celles de Firefox, même s’il est utilisé avec BoutonTor.\n\nPour enlever BoutonTor, allez dans Outils->Modules complémentaires->Extensions et cliquer sur Supprimer à coté de BoutonTor.
torbutton.popup.short_torbrowser = Informations importantes concernant BoutonTor !\n\nBoutonTor est toujours activé dorénavant.\n\nCliquer sur BoutonTor pour plus d’informations.
torbutton.popup.confirm_plugins = Les greffons tels que Flash peuvent nuire à vos anonymat et vie privée.\n\nIls peuvent également contourner Tor afin de révéler votre position actuelle ainsi que votre adresse IP.\n\nÊtes-vous certain de vouloir activer les greffons ?\n\n
torbutton.popup.never_ask_again = Ne plus me poser la question.
-torbutton.popup.confirm_newnym = Le Navigateur Tor fermera tous les fenêtres et onglets. Les sessions des sites Web seront toutes perdues.\n\nRedémarrer le Navigateur Tor maintenant pour réinitialiser votre identité ?\n\n
+torbutton.popup.confirm_newnym = Le navigateur Tor Browser fermera tous les fenêtres et onglets. Les sessions des sites Web seront toutes perdues.\n\nRedémarrer le navigateur Tor Browser maintenant pour réinitialiser votre identité ?\n\n
-torbutton.maximize_warning = Maximiser le Navigateur Tor peut permettre aux sites Web de déterminer la taille de votre moniteur, ce qui peut être utilisé pour vous suivre à la trace. Nous vous recommandons de garder la taille d’origine des fenêtres du Navigateur Tor.
+torbutton.maximize_warning = Maximiser le navigateur Tor Browser peut permettre aux sites Web de déterminer la taille de votre moniteur, ce qui peut être utilisé pour vous suivre à la trace. Nous vous recommandons de garder la taille d’origine des fenêtres du navigateur Tor Browser.
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=Ce site Web (%S) a essayé d’extraire des données d’image de canevas HTML5, qui pourraient être utilisées pour identifier votre ordinateur de façon unique.\n\nLe Navigateur Tor devrait-il permettre à ce site Web d’extraire des données d’image de canevas HTML5 ?
+canvas.siteprompt=Ce site Web (%S) a essayé d’extraire des données d’image de canevas HTML5, qui pourraient être utilisées pour identifier votre ordinateur de façon unique.\n\nLe navigateur Tor Browser devrait-il permettre à ce site Web d’extraire des données d’image de canevas HTML5 ?
canvas.notNow=Pas maintenant
canvas.notNowAccessKey=P
canvas.allow=Autoriser à l’avenir
diff --git a/src/chrome/locale/ga/aboutTBUpdate.dtd b/src/chrome/locale/ga/aboutTBUpdate.dtd
index 72f53a93..04812b9d 100644
--- a/src/chrome/locale/ga/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ga/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Nuashonrú Brabhsálaí Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Nuashonraíodh Brabhsálaí Tor">
<!ENTITY aboutTBUpdate.linkPrefix "Chun teacht ar an eolas is déanaí maidir leis an leagan seo, ">
<!ENTITY aboutTBUpdate.linkLabel "tabhair cuairt ar ár suíomh Gréasáin">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Logchomhad athruithe:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Dearadh Nua ar Thaispeántas an Chiorcaid">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Chuireamar feabhas ar thaispeántas an chiorcaid, agus tá sé in áit nua freisin! Cliceáil an cnaipe Eolas faoin suíomh (ar an taobh clé den bharra URL) chun an taispeántas nua a fheiceáil.">
-<!ENTITY aboutTBUpdate.learnMore "Tuilleadh Eolais">
+<!ENTITY aboutTBUpdate.version "Leagan">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/ga/aboutTor.dtd b/src/chrome/locale/ga/aboutTor.dtd
index ce6fe3f5..ed933f23 100644
--- a/src/chrome/locale/ga/aboutTor.dtd
+++ b/src/chrome/locale/ga/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Maidir le Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Brabhsáil. Príobháideachas.">
<!ENTITY aboutTor.ready2.label "Tá tú réidh don bhrabhsálaí is príobháidí ar domhan.">
<!ENTITY aboutTor.failure.label "Chuaigh rud éigin ar strae!">
diff --git a/src/chrome/locale/ga/browserOnboarding.properties b/src/chrome/locale/ga/browserOnboarding.properties
index 1d44d5a0..8fe8d0cb 100644
--- a/src/chrome/locale/ga/browserOnboarding.properties
+++ b/src/chrome/locale/ga/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Mo Chosán
onboarding.tour-tor-security=Slándáil
onboarding.tour-tor-security.title=D'eispéireas féin.
onboarding.tour-tor-security.description=Soláthraímid socruithe breise duit lenar féidir leat leibhéal slándála níos airde a bhaint amach trí, mar shampla, cosc a chur ar eilimintí áirithe a d'fhéadfaí a úsáid chun ionsaí a dhéanamh ar do ríomhaire. Cliceáil thíos chun tuilleadh eolais a fháil faoi na roghanna éagsúla.
-onboarding.tour-tor-security.button=Athbhreithniú Socruithe
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Leideanna
onboarding.tour-tor-expect-differences.title=Bí ag súil le difríochtaí.
diff --git a/src/chrome/locale/he/aboutTBUpdate.dtd b/src/chrome/locale/he/aboutTBUpdate.dtd
index a9989bb1..74770a3a 100644
--- a/src/chrome/locale/he/aboutTBUpdate.dtd
+++ b/src/chrome/locale/he/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "עדכון דפדפן Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "יומן שינויים של דפדפן Tor">
<!ENTITY aboutTBUpdate.updated "דפדפן Tor עודכן.">
<!ENTITY aboutTBUpdate.linkPrefix "למידע המעודכן ביותר לגבי שחרור זה, ">
<!ENTITY aboutTBUpdate.linkLabel "בקר באתר שלנו">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "יומן שינויים:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "תצוגה חדשה ומעוצבת מחדש של מעגל">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "תצוגת מעגל של Tor מוקמה מחדש ושופרה! לחץ על כפתור הזיהוי של אתרים (ממוקם בצד השמאלי של שורת הכתובת) כדי לראות את תצוגת המעגל החדשה.">
-<!ENTITY aboutTBUpdate.learnMore "למד עוד">
+<!ENTITY aboutTBUpdate.version "גרסה">
+<!ENTITY aboutTBUpdate.releaseDate "תאריך שחרור">
+<!ENTITY aboutTBUpdate.releaseNotes "הערות שחרור">
diff --git a/src/chrome/locale/he/aboutTor.dtd b/src/chrome/locale/he/aboutTor.dtd
index 6d988035..471d2b8d 100644
--- a/src/chrome/locale/he/aboutTor.dtd
+++ b/src/chrome/locale/he/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "אודות Tor">
+<!ENTITY aboutTor.viewChangelog.label "הצג יומן שינויים">
+
<!ENTITY aboutTor.ready.label "חקור. בפרטיות.">
<!ENTITY aboutTor.ready2.label "אתה מוכן לחוויה של הגלישה הפרטית ביותר של העולם.">
<!ENTITY aboutTor.failure.label "משהו השתבש!">
diff --git a/src/chrome/locale/he/browserOnboarding.properties b/src/chrome/locale/he/browserOnboarding.properties
index 13cb89ab..05d0cf48 100644
--- a/src/chrome/locale/he/browserOnboarding.properties
+++ b/src/chrome/locale/he/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=ראה את הנתיב שלי
onboarding.tour-tor-security=אבטחה
onboarding.tour-tor-security.title=בחר את חוויתך.
onboarding.tour-tor-security.description=אנחנו מספקים לך גם הגדרות נוספות עבור הגברת אבטחת הדפדפן שלך. הגדרות האבטחה שלנו מתירות לך לחסום יסודות שעלולים לשמש כדי לתקוף את המחשב שלך. לחץ למטה כדי לראות מה האפשרויות השונות עושות.
-onboarding.tour-tor-security.button=סקור הגדרות
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=עצות חוויה
onboarding.tour-tor-expect-differences.title=צפה למספר הבדלים.
diff --git a/src/chrome/locale/hu/aboutTBUpdate.dtd b/src/chrome/locale/hu/aboutTBUpdate.dtd
index ade14fed..ad31aa8a 100644
--- a/src/chrome/locale/hu/aboutTBUpdate.dtd
+++ b/src/chrome/locale/hu/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser Frissítés">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser frissítve.">
<!ENTITY aboutTBUpdate.linkPrefix "Az erről a kiadásról szóló legfrissebb információkért">
<!ENTITY aboutTBUpdate.linkLabel "látogassa meg weboldalunkat">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Változások listája:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Új, áttervezett áramkör megjelenítés">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "A Tor áramkör megjelenítés áthelyezésre és fejlesztésre került. Kattintson az Oldal Identitás gombra (az URL sáv bal oldalánál) az új áramkör megjelenítés megtekintéséhez.">
-<!ENTITY aboutTBUpdate.learnMore "Tudjon meg többet">
+<!ENTITY aboutTBUpdate.version "Verzió">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Verziókövetési jegyzet">
diff --git a/src/chrome/locale/hu/aboutTor.dtd b/src/chrome/locale/hu/aboutTor.dtd
index 8c776575..6a4bd540 100644
--- a/src/chrome/locale/hu/aboutTor.dtd
+++ b/src/chrome/locale/hu/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "A Tor-ról">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Fedezzen fel. Privátan.">
<!ENTITY aboutTor.ready2.label "Készen áll a világ legprivátabb böngészési élményére.">
<!ENTITY aboutTor.failure.label "Valami nem jól működik!">
diff --git a/src/chrome/locale/hu/browserOnboarding.properties b/src/chrome/locale/hu/browserOnboarding.properties
index 9cd03f4b..965f4b8e 100644
--- a/src/chrome/locale/hu/browserOnboarding.properties
+++ b/src/chrome/locale/hu/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Megtekintem az útvonalam
onboarding.tour-tor-security=Biztonság
onboarding.tour-tor-security.title=Válassza ki élményét
onboarding.tour-tor-security.description=További beállítási lehetőségeket biztosítunk a böngésző biztonság növelése érdekében. A Biztonsági beállításaink lehetővé teszik, hogy blokkoljon olyan elemeket, amelyekkel támadható a számítógépe. Kattintson alább, hogy lássa, mely lehetőségek mit csinálnak.
-onboarding.tour-tor-security.button=Beállítások áttekintése
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Tapasztalati tippek
onboarding.tour-tor-expect-differences.title=Számítson különbségekre.
diff --git a/src/chrome/locale/id/aboutTBUpdate.dtd b/src/chrome/locale/id/aboutTBUpdate.dtd
index ad37dae0..1bd32dd0 100644
--- a/src/chrome/locale/id/aboutTBUpdate.dtd
+++ b/src/chrome/locale/id/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Pemutakhiran peramban Tor">
-<!ENTITY aboutTBUpdate.updated "Peramban Tor telah diperbarui.">
+<!ENTITY aboutTBUpdate.changelogTitle "Catatan Perubahan Tor Browser">
+<!ENTITY aboutTBUpdate.updated "Tor Browser telah diperbarui.">
<!ENTITY aboutTBUpdate.linkPrefix "Untuk informasi paling terbaru mengenai rilisan ini,">
<!ENTITY aboutTBUpdate.linkLabel "kunjungi situs web kami">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Catatan Perubahan:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Circuit Display yang Baru dan Didesain ulang">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor circuit display telah dipindahkan dan ditingkatkan! Klik tombol Site Identity (ada di sebelah kiri URL bar) untuk melihat circuit display yang baru.">
-<!ENTITY aboutTBUpdate.learnMore "Pelajari lebih lanjut">
+<!ENTITY aboutTBUpdate.version "Versi">
+<!ENTITY aboutTBUpdate.releaseDate "Tanggal Rilis">
+<!ENTITY aboutTBUpdate.releaseNotes "Catatan Rilis">
diff --git a/src/chrome/locale/id/aboutTor.dtd b/src/chrome/locale/id/aboutTor.dtd
index 3a4e3a27..1c265201 100644
--- a/src/chrome/locale/id/aboutTor.dtd
+++ b/src/chrome/locale/id/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tentang Tor">
+<!ENTITY aboutTor.viewChangelog.label "Lihat Catatan Perubahan">
+
<!ENTITY aboutTor.ready.label "Jelajahi. Secara Privat.">
<!ENTITY aboutTor.ready2.label "Anda siap untuk pengalaman menjelajah yang paling privat di dunia.">
<!ENTITY aboutTor.failure.label "Ada Masalah!">
diff --git a/src/chrome/locale/id/brand.dtd b/src/chrome/locale/id/brand.dtd
index 213c71d5..1361c973 100644
--- a/src/chrome/locale/id/brand.dtd
+++ b/src/chrome/locale/id/brand.dtd
@@ -2,9 +2,9 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<!ENTITY brandShorterName "Peramban Tor">
-<!ENTITY brandShortName "Peramban Tor">
-<!ENTITY brandFullName "Peramban Tor">
+<!ENTITY brandShorterName "Tor Browser">
+<!ENTITY brandShortName "Tor Browser">
+<!ENTITY brandFullName "Tor Browser">
<!ENTITY vendorShortName "Proyek Tor">
<!ENTITY trademarkInfo.part1 "Firefox dan logo Firefox merupakan merek dagang dari Mozilla Foundation.">
diff --git a/src/chrome/locale/id/brand.properties b/src/chrome/locale/id/brand.properties
index 8b36aae3..460e9602 100644
--- a/src/chrome/locale/id/brand.properties
+++ b/src/chrome/locale/id/brand.properties
@@ -2,9 +2,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-brandShorterName=Peramban Tor
-brandShortName=Peramban Tor
-brandFullName=Peramban Tor
+brandShorterName=Tor Browser
+brandShortName=Tor Browser
+brandFullName=Tor Browser
vendorShortName=Proyek Tor
homePageSingleStartMain=Firefox Start, halaman muka yang cepat dengan pencarian bawaan
diff --git a/src/chrome/locale/id/browserOnboarding.properties b/src/chrome/locale/id/browserOnboarding.properties
index 471a73b8..b5375262 100644
--- a/src/chrome/locale/id/browserOnboarding.properties
+++ b/src/chrome/locale/id/browserOnboarding.properties
@@ -4,17 +4,17 @@
onboarding.tour-tor-welcome=Selamat datang
onboarding.tour-tor-welcome.title=Anda siap.
-onboarding.tour-tor-welcome.description=Peramban Tor menawarkan standar tertinggi atas privasi dan keamanan saat menjelajahi jaringan. Anda sekarang dilindungi dari pelacakan, pengintaian, dan penyensoran. Pelatihan singkat ini akan menunjukkan Anda bagaimana caranya.
+onboarding.tour-tor-welcome.description=Tor Browser menawarkan standar tertinggi atas privasi dan keamanan saat menjelajahi jaringan. Anda sekarang dilindungi dari pelacakan, pengintaian, dan penyensoran. Pelatihan singkat ini akan menunjukkan Anda bagaimana caranya.
onboarding.tour-tor-welcome.button=Start Now
onboarding.tour-tor-privacy=Privasi
onboarding.tour-tor-privacy.title=Menolak pelacak dan pengintai.
-onboarding.tour-tor-privacy.description=Peramban tor mengisolasi kuki dan menghapus riwayat peramban anda setelah ditutup. Modifikasi ini menjamin privasi dan keamanan telah terproteksi di dalam peramban. Klik 'Jaringan Tor' untuk pempelajari bagaimana kami melindungi anda pada level jaringan.
-onboarding.tour-tor-privacy.button=Go to Tor Network
+onboarding.tour-tor-privacy.description=Tor Browser mengisolasi cookie dan menghapus riwayat peramban anda setelah ditutup. Modifikasi ini menjamin privasi dan keamanan telah terproteksi di dalam peramban. Klik 'Jaringan Tor' untuk pempelajari bagaimana kami melindungi anda pada level jaringan.
+onboarding.tour-tor-privacy.button=Pergi ke Jaringan Tor
-onboarding.tour-tor-network=Tor Network
+onboarding.tour-tor-network=Jaringan Tor
onboarding.tour-tor-network.title=Mengelilingi jaringan yang terdesentralisasi.
-onboarding.tour-tor-network.description=Peramban Tor menghubungkan Anda ke jaringan Tor yang dijalankan oleh ribuan relawan di seluruh dunia. Tidak seperti VPN, tidak ada satu titik kesalahan atau entitas sentral yang perlu anda percaya untuk menikmati internet secara privat.
+onboarding.tour-tor-network.description=Tor Browser menghubungkan Anda ke jaringan Tor yang dijalankan oleh ribuan relawan di seluruh dunia. Tidak seperti VPN, tidak ada satu titik kesalahan atau entitas sentral yang perlu anda percaya untuk menikmati internet secara privat.
onboarding.tour-tor-network.button=Go to Circuit Display
onboarding.tour-tor-circuit-display=Tampilan Sirkuit
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=See My Path
onboarding.tour-tor-security=Keamanan
onboarding.tour-tor-security.title=Putuskan pengalamanmu.
onboarding.tour-tor-security.description=Kami juga menyediakan Anda dengan pengaturan tambahan untuk meningkatkan keamanan peramban Anda. Pengaturan Keamanan kami mengizinkan anda untuk memblokir elemen-elemen yang dapat digunakan untuk menyerang komputer Anda. Klik di bawah untuk mengetahui apa saja yang dilakukan oleh pilihan yang berbeda.
-onboarding.tour-tor-security.button=Review Settings
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Tips Pengalaman
onboarding.tour-tor-expect-differences.title=Harapkan beberapa perubahan.
diff --git a/src/chrome/locale/id/torbutton.dtd b/src/chrome/locale/id/torbutton.dtd
index ecf771f4..c1e7603a 100644
--- a/src/chrome/locale/id/torbutton.dtd
+++ b/src/chrome/locale/id/torbutton.dtd
@@ -4,23 +4,23 @@
<!ENTITY torbutton.context_menu.new_circuit_key "C">
<!ENTITY torbutton.context_menu.networksettings "Pengaturan Jaringan Tor…">
<!ENTITY torbutton.context_menu.networksettings.key "N">
-<!ENTITY torbutton.context_menu.downloadUpdate "Cek Versi Peramban Tor Terkini">
+<!ENTITY torbutton.context_menu.downloadUpdate "Periksa Pembaruan untuk Tor Browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Perlindungan Cookie...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klik untuk mengaktifkan TombolTor">
<!ENTITY torbutton.prefs.security_settings "Pengaturan Keamanan Tor Browser">
-<!ENTITY torbutton.cookiedialog.title "Manage Cookie Protections">
+<!ENTITY torbutton.cookiedialog.title "Kelola Perlindungan Cookie">
<!ENTITY torbutton.cookiedialog.lockCol "Protected">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
<!ENTITY torbutton.cookiedialog.nameCol "Nama">
<!ENTITY torbutton.cookiedialog.pathCol "Path">
-<!ENTITY torbutton.cookiedialog.protectCookie "Protect Cookie">
-<!ENTITY torbutton.cookiedialog.removeCookie "Remove Cookie">
+<!ENTITY torbutton.cookiedialog.protectCookie "Lindungi Cookie">
+<!ENTITY torbutton.cookiedialog.removeCookie "Hapus Cookie">
<!ENTITY torbutton.cookiedialog.unprotectCookie "Unprotect Cookie">
<!ENTITY torbutton.cookiedialog.removeAllBut "Remove All But Protected">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Protect New Cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Do Not Protect New Cookies">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Lindungi Cookie Baru">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Jangan Lindungi Cookie Baru">
<!ENTITY torbutton.prefs.sec_caption "Tingkat Keamanan">
<!ENTITY torbutton.prefs.sec_caption_tooltip "Penggeser keamanan memungkinkan anda untuk menonaktifkan fitur browser yang dapat membuat browser anda menjadi lebih rentant dari upaya peretasan.">
<!ENTITY torbutton.prefs.sec_standard_label "Standar">
diff --git a/src/chrome/locale/id/torbutton.properties b/src/chrome/locale/id/torbutton.properties
index 89e1813c..c31e1888 100644
--- a/src/chrome/locale/id/torbutton.properties
+++ b/src/chrome/locale/id/torbutton.properties
@@ -29,12 +29,12 @@ torbutton.popup.short_torbrowser = Important Torbutton Information!\n\nTorbutton
torbutton.popup.confirm_plugins = Plugins such as Flash can harm your privacy and anonymity.\n\nThey can also bypass Tor to reveal your current location and IP address.\n\nAre you sure you want to enable plugins?\n\n
torbutton.popup.never_ask_again = Jangan pernah ditanyakan kembali
-torbutton.popup.confirm_newnym = Peramban Tor akan menutup semua jendela dan tab. Semua sesi website akan terhapus.\n\nJalankan ulang peramban Tor untuk
+torbutton.popup.confirm_newnym = Tor Browser akan menutup semua jendela dan tab. Semua sesi website akan terhapus.\n\nJalankan ulang Tor Browser untuk
torbutton.maximize_warning = Maksimalkan Browser Tor dapat mengizinkan website untuk menentukan ukuran monitor anda, yang dapat digunakan untuk track/jalur anda. kami menyarankan bahwa nda meninggalkan windows browser Tor dalam ukuran asli default nya
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=Situs ini (%S) butuh untuk mengekstrak data gambar HTML5 , yang mungkin akan mengetahui identitas komputer anda.\n\nApakah anda mengizinkan peramban Tor untuk mengekstrak data gambar HTML5
+canvas.siteprompt=Situs ini (%S) butuh untuk mengekstrak data gambar HTML5 , yang mungkin akan mengetahui identitas komputer anda.\n\nApakah anda mengizinkan Tor Browser untuk mengekstrak data gambar HTML5
canvas.notNow=Tidak untuk Sekarang
canvas.notNowAccessKey=N
canvas.allow=Izinkan kedepannya
@@ -53,7 +53,7 @@ profileMigrationFailed=Migrasi dari profil %S gagal.\nSetting baru akan digunaka
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=Mengunduh %S pembaruan
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Koneksi terenkripsi (Layanan Onion, %1$S, %2$S bit kunci, %3$S)
diff --git a/src/chrome/locale/is/aboutTBUpdate.dtd b/src/chrome/locale/is/aboutTBUpdate.dtd
index a668b89c..65480323 100644
--- a/src/chrome/locale/is/aboutTBUpdate.dtd
+++ b/src/chrome/locale/is/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Uppfærsla Tor-vafra">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor-vafrinn var uppfærður.">
<!ENTITY aboutTBUpdate.linkPrefix "Til að sjá allra nýjustu upplýsingar um þessa útgáfu,">
<!ENTITY aboutTBUpdate.linkLabel "heimsæktu vefsvæðið okkar">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Breytingaannáll:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Ný, endurhönnuð birting rása">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Birting rása í Tor hefur verið flutt á nýjan stað og endurhönnuð! Smelltu á Vefsvæði Auðkenni hnappinn (vinstra megin við staðsetningarstikuna) til að sjá nýja framsetningu rása.">
-<!ENTITY aboutTBUpdate.learnMore "Fræðast frekar">
+<!ENTITY aboutTBUpdate.version "Útgáfa">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/is/aboutTor.dtd b/src/chrome/locale/is/aboutTor.dtd
index 0a259108..39820ded 100644
--- a/src/chrome/locale/is/aboutTor.dtd
+++ b/src/chrome/locale/is/aboutTor.dtd
@@ -6,8 +6,10 @@
<!ENTITY aboutTor.title "Um Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Vafraðu í friði fyrir hnýsni.">
-<!ENTITY aboutTor.ready2.label "Nú ertu tilbúin(n) fyrir mestu fáanlegu vernd við vafur á netinu.">
+<!ENTITY aboutTor.ready2.label "Nú er allt klárt fyrir mestu fáanlegu vernd við vafur á netinu.">
<!ENTITY aboutTor.failure.label "Eitthvað fór úrskeiðis!">
<!ENTITY aboutTor.failure2.label "Tor virkar ekki í þessum vafra.">
diff --git a/src/chrome/locale/is/browserOnboarding.properties b/src/chrome/locale/is/browserOnboarding.properties
index 893ce908..15078a7d 100644
--- a/src/chrome/locale/is/browserOnboarding.properties
+++ b/src/chrome/locale/is/browserOnboarding.properties
@@ -14,8 +14,8 @@ onboarding.tour-tor-privacy.button=Fara á Tor-netið
onboarding.tour-tor-network=Tor-netið
onboarding.tour-tor-network.title=Farðu um ómiðstýrt netkerfi.
-onboarding.tour-tor-network.description=Tor-vafrinn tengir þig við Tor-netið sem rekið er af þúsundum sjálfboðaliða um víða veröld. Ólíkt VPN, þá er enginn einn punktur sem getur brugðist eða miðlægt firirbæri sem þú þarft að treysta til að geta notað netið án afskipta annarra.
-onboarding.tour-tor-network.button=Farðu í birtingu rása
+onboarding.tour-tor-network.description=Tor-vafrinn tengir þig við Tor-netið sem rekið er af þúsundum sjálfboðaliða um víða veröld. Ólíkt VPN, þá er enginn einn punktur sem getur brugðist eða miðlægt fyrirbæri sem þú þarft að treysta til að geta notað netið án afskipta annarra.
+onboarding.tour-tor-network.button=Fara í birtingu rása
onboarding.tour-tor-circuit-display=Birting rása
onboarding.tour-tor-circuit-display.title=Skoðaðu slóðina þína
@@ -25,16 +25,16 @@ onboarding.tour-tor-circuit-display.button=Skoða slóðina mína
onboarding.tour-tor-security=Öryggi
onboarding.tour-tor-security.title=Veldu hvernig þú vilt upplifa þetta.
onboarding.tour-tor-security.description=Við höfum einnig útbúið viðbótarstillingar þar sem þú getur breytt öryggisstigi vafrans. Öryggisstillingarnar gera kleift að loka á atriði sem hægt væri að nota til árása á tölvuna þína. Smelltu hér fyrir neðan til að skoða hvernig hinir mismunandi valkostir virka.
-onboarding.tour-tor-security.button=Yfirfara stillingar
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Ábendingar fyrir upplifunina
onboarding.tour-tor-expect-differences.title=Gerður ráð fyrir að eitthvað verði öðruvísi.
-onboarding.tour-tor-expect-differences.description=Vegna allra öryggis- og gagnaverndareiginleika Tor, þá gæti upplifun þín af vafri á internetinu orðið eilítið öðruvísi en annars. Hlutirnir gerast kannski aðeins hægar og það fer eftir öryggisstillingunum þínum hvort sum atriði virki eða birtist yfirhöfuð. Þú gætir líka lent í því að vera reglulega spurð(ur) hvort þú sért mannvera eða vélmenni.
-onboarding.tour-tor-expect-differences.button=Skoðaðu algengar spurningar - FAQ
+onboarding.tour-tor-expect-differences.description=Vegna allra öryggis- og gagnaverndareiginleika Tor, þá gæti upplifun þín af vafri á internetinu orðið eilítið öðruvísi en annars væri. Hlutirnir gerast kannski aðeins hægar og það fer eftir öryggisstillingunum þínum hvort sum atriði virki eða birtist yfirhöfuð. Þú gætir líka lent í því að vera reglulega spurð(ur) hvort þú sért mannvera eða vélmenni.
+onboarding.tour-tor-expect-differences.button=Skoða algengar spurningar - FAQ
onboarding.tour-tor-onion-services=Onion-þjónustur
onboarding.tour-tor-onion-services.title=Fáðu viðbótaröryggi.
-onboarding.tour-tor-onion-services.description=Onion-þjónustur eru vefsvæði sem enda á .onion viðskeyti, vefsvæði sem gefa útgefendum efnis og þeim sem skoða það aukna vernd gagnvart ritskoðun. Onion-þjónustur gera öllum kleift að birta efni eða eigin þjónustu nafnlaust. Smelltu hr fyrir neðan til að skoða onion-vefsvæði DuckDuckGo.
+onboarding.tour-tor-onion-services.description=Onion-þjónustur eru vefsvæði sem enda á .onion viðskeyti, vefsvæði sem gefa útgefendum efnis og þeim sem skoða það aukna vernd gagnvart ritskoðun. Onion-þjónustur gera öllum kleift að birta efni eða eigin þjónustu nafnlaust. Smelltu hér fyrir neðan til að skoða onion-vefsvæði DuckDuckGo.
onboarding.tour-tor-onion-services.button=Heimsækja Onion-vef
# Circuit Display onboarding.
diff --git a/src/chrome/locale/is/torbutton.dtd b/src/chrome/locale/is/torbutton.dtd
index 2468114e..b408ac95 100644
--- a/src/chrome/locale/is/torbutton.dtd
+++ b/src/chrome/locale/is/torbutton.dtd
@@ -31,7 +31,7 @@
<!ENTITY torbutton.prefs.sec_safest_label "Öruggast">
<!ENTITY torbutton.prefs.sec_safest_description "Leyfir aðeins þá eiginleika vefsvæða sem krafist er fyrir beinan lestur (static sites) og grunnþjónustur. Þessar breytingar hafa áhrif á myndir, margmiðlunargögn og skriftur.">
<!ENTITY torbutton.prefs.sec_safest_list_label "Með öruggustu stillingum:">
-<!ENTITY torbutton.prefs.sec_learn_more_label "Læra meira">
+<!ENTITY torbutton.prefs.sec_learn_more_label "Fræðast frekar">
<!ENTITY torbutton.prefs.sec_js_on_https_sites_only "JavaScript er óvirkt á öllum ekki-HTTPS vefjum.">
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript er sjálfgefið óvirkt á öllum vefsvæðum.">
<!ENTITY torbutton.prefs.sec_limit_typography "Sumt letur og stærðfræðitákn eru óvirk.">
diff --git a/src/chrome/locale/it/aboutTBUpdate.dtd b/src/chrome/locale/it/aboutTBUpdate.dtd
index 9525a0f4..e40ec576 100644
--- a/src/chrome/locale/it/aboutTBUpdate.dtd
+++ b/src/chrome/locale/it/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Aggiornamento del Browser TOR">
+<!ENTITY aboutTBUpdate.changelogTitle "Cronologia Tor Browser">
<!ENTITY aboutTBUpdate.updated "Il Browser TOR è stato aggiornato.">
<!ENTITY aboutTBUpdate.linkPrefix "Per maggiori informazioni su questa versione,">
<!ENTITY aboutTBUpdate.linkLabel "visita il nostro sito web">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Log dei cambiamenti:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Visualizzazione circuito nuova e ridisegnata">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "La visualizzazione del circuito Tor è stata spostata e migliorata! Clicca il pulsante di identità del sito (posto a sinistra dell'URL) per vedere il nuovo circuito.">
-<!ENTITY aboutTBUpdate.learnMore "Maggiori informazioni">
+<!ENTITY aboutTBUpdate.version "Versione">
+<!ENTITY aboutTBUpdate.releaseDate "Data di uscita">
+<!ENTITY aboutTBUpdate.releaseNotes "Note di rilascio">
diff --git a/src/chrome/locale/it/aboutTor.dtd b/src/chrome/locale/it/aboutTor.dtd
index b9687c45..fb65f139 100644
--- a/src/chrome/locale/it/aboutTor.dtd
+++ b/src/chrome/locale/it/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Info su Tor">
+<!ENTITY aboutTor.viewChangelog.label "Vedi cronologia">
+
<!ENTITY aboutTor.ready.label "Naviga. Privatamente.">
<!ENTITY aboutTor.ready2.label "Sei pronto per l'esperienza di navigazione più privata al mondo.">
<!ENTITY aboutTor.failure.label "Qualcosa è Andato Storto!">
diff --git a/src/chrome/locale/it/browserOnboarding.properties b/src/chrome/locale/it/browserOnboarding.properties
index e15164f4..4dae1440 100644
--- a/src/chrome/locale/it/browserOnboarding.properties
+++ b/src/chrome/locale/it/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Vedi il mio percorso
onboarding.tour-tor-security=Sicurezza
onboarding.tour-tor-security.title=Scegli la tua esperienza.
onboarding.tour-tor-security.description=Ti forniamo anche impostazioni aggiuntive per aumentare la sicurezza del tuo browser. Le nostre impostazioni di sicurezza ti permettono di bloccare elementi che potrebbero essere utilizzati per attaccare il tuo computer. Clicca qui sotto per vedere cosa fanno le diverse opzioni.
-onboarding.tour-tor-security.button=Valuta le impostazioni
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Consigli per l'esperienza
onboarding.tour-tor-expect-differences.title=Aspettati delle differenze.
diff --git a/src/chrome/locale/ja/aboutTBUpdate.dtd b/src/chrome/locale/ja/aboutTBUpdate.dtd
index 184c8a5e..413c965c 100644
--- a/src/chrome/locale/ja/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ja/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser アップデート">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser アップデート完了">
<!ENTITY aboutTBUpdate.linkPrefix "このリリースについての最新情報を入手するため、">
<!ENTITY aboutTBUpdate.linkLabel "我々のウェブサイトを見てください">
<!ENTITY aboutTBUpdate.linkSuffix "。">
-<!ENTITY aboutTBUpdate.changeLogHeading "変更履歴">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "New, Redesigned Circuit Display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "さらに詳しく">
+<!ENTITY aboutTBUpdate.version "バージョン">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "リリースノート">
diff --git a/src/chrome/locale/ja/aboutTor.dtd b/src/chrome/locale/ja/aboutTor.dtd
index 1c30c0d0..a047f9a9 100644
--- a/src/chrome/locale/ja/aboutTor.dtd
+++ b/src/chrome/locale/ja/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tor について">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "探索する。 プライベートに。">
<!ENTITY aboutTor.ready2.label "世界で最もプライベートなブラウジングを体験する準備が整いました。">
<!ENTITY aboutTor.failure.label "何かが間違っています!">
diff --git a/src/chrome/locale/ja/browserOnboarding.properties b/src/chrome/locale/ja/browserOnboarding.properties
index 40cf75b4..931b62a0 100644
--- a/src/chrome/locale/ja/browserOnboarding.properties
+++ b/src/chrome/locale/ja/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=私のパスを見る
onboarding.tour-tor-security=セキュリティ
onboarding.tour-tor-security.title=あなたの体験を選択する。
onboarding.tour-tor-security.description=また、ブラウザのセキュリティを強化するための追加設定も提供しています。私たちのセキュリティ設定では、コンピュータの攻撃に使用される可能性のある要素をブロックすることができます。以下をクリックして、さまざまな設定の機能を確認してください
-onboarding.tour-tor-security.button=設定の確認
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=体験のヒント。
onboarding.tour-tor-expect-differences.title=いくつかの違いを理解する。
diff --git a/src/chrome/locale/ka/aboutTBUpdate.dtd b/src/chrome/locale/ka/aboutTBUpdate.dtd
index 0f530ef5..0b1b779c 100644
--- a/src/chrome/locale/ka/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ka/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor-ბრაუზერის განახლება">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor-ბრაუზერის ცვლილებების ისტორია">
<!ENTITY aboutTBUpdate.updated "Tor-ბრაუზერი განახლებულია.">
<!ENTITY aboutTBUpdate.linkPrefix "ამ გამოშვების შესახებ უახლესი ინფორმაციის მისაღებად, ">
<!ENTITY aboutTBUpdate.linkLabel "ეწვიეთ ჩვენს ვებსაიტს">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "ცვლილებები:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "კავშირის წრედის არე განახლებული იერსახით">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor-ის კავშირის წრედის არემ ადგილი შეიცვალა და მეტად გაუმჯობესებულია! დაწკაპეთ საიტის ნამდვილობის (მისამართების ველის მარცხნივ განთავსებულ) აღმნიშვნელ ნიშანზე, განახლებული წრედის არეს გამოსაჩენად.">
-<!ENTITY aboutTBUpdate.learnMore "იხილეთ ვრცლად">
+<!ENTITY aboutTBUpdate.version "ვერსია">
+<!ENTITY aboutTBUpdate.releaseDate "გამოშვების თარიღი">
+<!ENTITY aboutTBUpdate.releaseNotes "გამოშვების შენიშვნები">
diff --git a/src/chrome/locale/ka/aboutTor.dtd b/src/chrome/locale/ka/aboutTor.dtd
index de623ff9..bdf92b30 100644
--- a/src/chrome/locale/ka/aboutTor.dtd
+++ b/src/chrome/locale/ka/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tor-ის შესახებ">
+<!ENTITY aboutTor.viewChangelog.label "ცვლილებების ნახვა">
+
<!ENTITY aboutTor.ready.label "მოინახულეთ. უსაფრთხოდ.">
<!ENTITY aboutTor.ready2.label "თქვენ მზად ხართ მსოფლიოში ყველაზე მეტად დაცული და პირადი ბრაუზერის გამოყენებისთვის.">
<!ENTITY aboutTor.failure.label "რაღაც რიგზე ვერაა!">
diff --git a/src/chrome/locale/ka/browserOnboarding.properties b/src/chrome/locale/ka/browserOnboarding.properties
index 2490b234..46a2a11b 100644
--- a/src/chrome/locale/ka/browserOnboarding.properties
+++ b/src/chrome/locale/ka/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=არხის ნახვა
onboarding.tour-tor-security=უსაფრთხოება
onboarding.tour-tor-security.title=მოარგეთ საკუთარ მოთხოვნილებებს
onboarding.tour-tor-security.description=ჩვენ ასევე გთავაზობთ დამატებით პარამეტრებს, ბრაუზერის უსაფრთხოების კიდევ უფრო მეტად ასამაღლებლად. ჩვენი უსაფრთხოების პარამეტრები, საშუალებას გაძლევთ შეზღუდოთ გვერდის ის ნაწილები, რომლებიც თქვენს კომპიუტერზე შეტევისთვის შეიძლება გამოიყენონ. დაწკაპეთ ქვემოთ და იხილეთ ამ პარამეტრების შესახებ ვრცლად.
-onboarding.tour-tor-security.button=პარამეტრების გადახედვა
+onboarding.tour-tor-security-level.button=უსაფრთხოების დონის ნახვა
onboarding.tour-tor-expect-differences=გამოყენებასთან დაკავშირებული საკითხები
onboarding.tour-tor-expect-differences.title=მოსალოდნელი ცვლილებები.
diff --git a/src/chrome/locale/ka/torbutton.properties b/src/chrome/locale/ka/torbutton.properties
index f5c6b912..e6750b07 100644
--- a/src/chrome/locale/ka/torbutton.properties
+++ b/src/chrome/locale/ka/torbutton.properties
@@ -6,7 +6,7 @@ torbutton.circuit_display.relay = გადამცემი
torbutton.circuit_display.tor_bridge = ხიდი
torbutton.circuit_display.unknown_country = უცნობი ქვეყანა
torbutton.circuit_display.guard = მცველი
-torbutton.circuit_display.guard_note = თქვენი [Guard] კვანძი შესაძლოა არ შეიცვალოს.
+torbutton.circuit_display.guard_note = თქვენი [მცველი] კვანძი შესაძლოა არ შეიცვალოს.
torbutton.circuit_display.learn_more = იხილეთ ვრცლად
torbutton.content_sizer.margin_tooltip = Tor-ბრაუზერი ამატებს მინდვრებს კიდეებზე, რომ თქვენი ფანჯრის სიგანე და სიმაღლე ნაკლებად გამორჩეული და შესამჩნევი იყოს, რაც შეუმცირებს სხვებს, ინტერნეტში თქვენი დევნის შესაძლებლობებს.
torbutton.panel.tooltip.disabled = დაკლიკეთ Tor-ის ჩასართავად
diff --git a/src/chrome/locale/ko/aboutTBUpdate.dtd b/src/chrome/locale/ko/aboutTBUpdate.dtd
index b8b08d7b..e95d6daf 100644
--- a/src/chrome/locale/ko/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ko/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor 브라우저 업데이트">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor 브라우저가 업데이트되었습니다.">
<!ENTITY aboutTBUpdate.linkPrefix "이번 업데이트에 대해 더 알고 싶으시면">
<!ENTITY aboutTBUpdate.linkLabel "저희 사이트를 방문해 주세요">
<!ENTITY aboutTBUpdate.linkSuffix " ">
-<!ENTITY aboutTBUpdate.changeLogHeading "변경사항:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "서킷 표시가 일신하고 재설계했습니다">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor 서킷 표시를 이전하고 개량했습니다! 새 서킷 표시를 보려고 Site Identity 버튼 (URL 막대의 왼쪽) 클릭하십시오.">
-<!ENTITY aboutTBUpdate.learnMore "더 알아보기">
+<!ENTITY aboutTBUpdate.version "버젼">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "릴리즈 노트">
diff --git a/src/chrome/locale/ko/aboutTor.dtd b/src/chrome/locale/ko/aboutTor.dtd
index 984b53af..54651755 100644
--- a/src/chrome/locale/ko/aboutTor.dtd
+++ b/src/chrome/locale/ko/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tor에 대해서">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "은밀하게 탐색하십시오.">
<!ENTITY aboutTor.ready2.label "당신은 온세상이 가장 은밀한 탐색의 경험을 준비가 되었습니다.">
<!ENTITY aboutTor.failure.label "뭔가 잘못되었습니다!">
diff --git a/src/chrome/locale/ko/browserOnboarding.properties b/src/chrome/locale/ko/browserOnboarding.properties
index b3c9363b..3780d406 100644
--- a/src/chrome/locale/ko/browserOnboarding.properties
+++ b/src/chrome/locale/ko/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=See My Path
onboarding.tour-tor-security= 보안
onboarding.tour-tor-security.title=Choose your experience.
onboarding.tour-tor-security.description=We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do.
-onboarding.tour-tor-security.button=Review Settings
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Experience Tips
onboarding.tour-tor-expect-differences.title=Expect some differences.
diff --git a/src/chrome/locale/nb/aboutTBUpdate.dtd b/src/chrome/locale/nb/aboutTBUpdate.dtd
index 37cdd9b3..658bcd96 100644
--- a/src/chrome/locale/nb/aboutTBUpdate.dtd
+++ b/src/chrome/locale/nb/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Oppdatering av Tor-nettleseren">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor-nettleseren har blitt oppdatert.">
<!ENTITY aboutTBUpdate.linkPrefix "For den mest oppdaterte informasjonen om denne utgivelsen,">
<!ENTITY aboutTBUpdate.linkLabel "besøk vårt nettsted">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Endringslogg:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "New, Redesigned Circuit Display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "Lær mer">
+<!ENTITY aboutTBUpdate.version "Versjon">
+<!ENTITY aboutTBUpdate.releaseDate "Utgivelsesdato">
+<!ENTITY aboutTBUpdate.releaseNotes "Versjonsnotater">
diff --git a/src/chrome/locale/nb/aboutTor.dtd b/src/chrome/locale/nb/aboutTor.dtd
index 708d57dc..8fb5ba56 100644
--- a/src/chrome/locale/nb/aboutTor.dtd
+++ b/src/chrome/locale/nb/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Om Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Utforsk. Privat.">
<!ENTITY aboutTor.ready2.label "Du er klar for verdens mest private surfing opplevelse.">
<!ENTITY aboutTor.failure.label "Noe gikk galt!">
diff --git a/src/chrome/locale/nb/browserOnboarding.properties b/src/chrome/locale/nb/browserOnboarding.properties
index f37c87b0..41fa07c1 100644
--- a/src/chrome/locale/nb/browserOnboarding.properties
+++ b/src/chrome/locale/nb/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Se Min Vei
onboarding.tour-tor-security=Sikkerhet
onboarding.tour-tor-security.title=Velg din opplevelse.
onboarding.tour-tor-security.description=Vi gir deg også tilleggsinnstillinger for å støte på nettleserens sikkerhet. Våre sikkerhetsinnstillinger lar deg blokkere elementer som kan brukes til å angripe datamaskinen din. Klikk nedenfor for å se hva de forskjellige alternativene gjør.
-onboarding.tour-tor-security.button=Gjennomgå Innstillinger
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Opplevelsestips
onboarding.tour-tor-expect-differences.title=Forvent noen forskjeller.
diff --git a/src/chrome/locale/nl/aboutTBUpdate.dtd b/src/chrome/locale/nl/aboutTBUpdate.dtd
index f780a834..6b095994 100644
--- a/src/chrome/locale/nl/aboutTBUpdate.dtd
+++ b/src/chrome/locale/nl/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser is bijgewerkt.">
<!ENTITY aboutTBUpdate.linkPrefix "Voor de meest recentste informatie over deze release,">
<!ENTITY aboutTBUpdate.linkLabel "bezoek onze website">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Wijzigingslogboek:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nieuw, Herontworpen Circuit Venster">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "Meer info">
+<!ENTITY aboutTBUpdate.version "Versie">
+<!ENTITY aboutTBUpdate.releaseDate "Release datum">
+<!ENTITY aboutTBUpdate.releaseNotes "Uitgaveopmerkingen">
diff --git a/src/chrome/locale/nl/aboutTor.dtd b/src/chrome/locale/nl/aboutTor.dtd
index a66ae026..b01a2f92 100644
--- a/src/chrome/locale/nl/aboutTor.dtd
+++ b/src/chrome/locale/nl/aboutTor.dtd
@@ -6,8 +6,10 @@
<!ENTITY aboutTor.title "Over Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Onderzoek. Privé.">
-<!ENTITY aboutTor.ready2.label "You’re ready for the world’s most private browsing experience.">
+<!ENTITY aboutTor.ready2.label "Je bent klaar voor de meest private browsing ervaring van de wereld">
<!ENTITY aboutTor.failure.label "Er ging iets mis!">
<!ENTITY aboutTor.failure2.label "Tor werkt niet in deze browser.">
@@ -15,12 +17,12 @@
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com/">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Vragen?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Check our Tor Browser Manual »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Bekijk onze Tor Browser Handleiding">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Browser Gebruikshandleiding">
-<!ENTITY aboutTor.tor_mission.label "The Tor Project is a US 501(c)(3) non-profit organization advancing human rights and freedoms by creating and deploying free and open source anonymity and privacy technologies, supporting their unrestricted availability and use, and furthering their scientific and popular understanding.">
+<!ENTITY aboutTor.tor_mission.label "Het Tor Project is een US 501(c)(3) goede-doelen organisatie die de Rechten en Vrijheden van de Mens bevordert door vrije open source anonimiteit en privacy technology te maken en toe te passen, hun ongerestricteerde beschikbaarheid en gebruik te ondersteunen, en hun wetenschappelijke en populaire begrip te bevorderen.">
<!ENTITY aboutTor.getInvolved.label "Doe Mee">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
diff --git a/src/chrome/locale/nl/browserOnboarding.properties b/src/chrome/locale/nl/browserOnboarding.properties
index 247eb89b..db8aa2d4 100644
--- a/src/chrome/locale/nl/browserOnboarding.properties
+++ b/src/chrome/locale/nl/browserOnboarding.properties
@@ -4,38 +4,38 @@
onboarding.tour-tor-welcome=Welkom
onboarding.tour-tor-welcome.title=Je bent klaar.
-onboarding.tour-tor-welcome.description=Tor Browser offers the highest standard of privacy and security while browsing the web. You’re now protected against tracking, surveillance, and censorship. This quick onboarding will show you how.
-onboarding.tour-tor-welcome.button=Start nu.
+onboarding.tour-tor-welcome.description=TOR Browser biedt de hoogste standaard van privacy en beveiliging terwijl u het web bezoekt. U bent nu beschermt tegen volgen, monitoring en censuur. Deze snelle 'Welkom tour' zal u laten zien hoe dit werkt.
+onboarding.tour-tor-welcome.button=Start nu
onboarding.tour-tor-privacy=Privacy
-onboarding.tour-tor-privacy.title=Snub trackers and snoopers.
-onboarding.tour-tor-privacy.description=Tor Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser. Click ‘Tor Network’ to learn how we protect you on the network level.
+onboarding.tour-tor-privacy.title=Snub volgers en neuzers.
+onboarding.tour-tor-privacy.description=Tor Browser isoleert cookies en verwijdrt jouw browser historie na jouw sessie. Deze wijzigingen waarborgen dat jouw privacy en veiligheid beschermd zijn in de browser. Klik 'Tor Netwerk" om te leren hoe we jou op netwerk niveau beveiligen.
onboarding.tour-tor-privacy.button=Ga naar het Tor Netwerk
onboarding.tour-tor-network=Tor Netwerk
onboarding.tour-tor-network.title=Reis over een gedecentraliseerd netwerk.
-onboarding.tour-tor-network.description=Tor Browser connects you to the Tor network run by thousands of volunteers around the world. Unlike a VPN, there’s no one point of failure or centralized entity you need to trust in order to enjoy the internet privately.
+onboarding.tour-tor-network.description=TOR Browser verbind u met het TOR netwerk, welke wordt mogelijk gemaakt door duizenden vrijwilligers over de hele wereld. Anders dan een VPN is er niet slecht 1 punt waar het mis kan gaan, en er is geen centrale autoriteit waar u vertrouwen in moet hebben om in privé gebruik te maken van het internet.
onboarding.tour-tor-network.button=Ga naar het Circuit Venster
onboarding.tour-tor-circuit-display=Circuit Venster
onboarding.tour-tor-circuit-display.title=Zie jouw route.
-onboarding.tour-tor-circuit-display.description=Voor elk domein dat je bezoekt wordt jouw verkeer omgeleid en vercijferd in een circuit over drie Tor omleidingen over de wereld. Geen website weet waar je verbinding vandaan maakt. Je kunt een nieuwe route aanvragen door te klikken op "Nieuw Circuit voor deze Site' in ons Circuit Venster.
-onboarding.tour-tor-circuit-display.button=Zie Mijn Route
+onboarding.tour-tor-circuit-display.description=Voor elk domein dat je bezoekt wordt jouw verkeer omgeleid en vercijferd in een circuit over drie Tor omleidingen over de wereld. Geen website weet waar je verbinding vandaan maakt. Je kunt een nieuwe circuit aanvragen door te klikken op "Nieuw Circuit voor deze Site' in ons Circuit Venster.
+onboarding.tour-tor-circuit-display.button=Zie Mijn Pad
onboarding.tour-tor-security=Beveiliging
onboarding.tour-tor-security.title=Kies jouw ervaring.
-onboarding.tour-tor-security.description=We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do.
-onboarding.tour-tor-security.button=Herzie Instellingen
+onboarding.tour-tor-security.description=We bieden ook additionele instellingen om de veiligheid van uw browser te verhogen. Onze 'Beveiligingsinstellingen' maken het mogelijk om elementen te blokkeren welk gebruikt zouden kunnen worden om uw computer aan te vallen. Klik hieronder om te zien wat de verschillende opties doen.
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Ervaring tips
onboarding.tour-tor-expect-differences.title=Verwacht enige verschillen.
-onboarding.tour-tor-expect-differences.description=With all the security and privacy features provided by Tor, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.
+onboarding.tour-tor-expect-differences.description=Met alle beveilingings- en privacy-mogelijkheden beschikbaar gesteld door TOR, is je ervaring bij het bezoeken van internet misschien een beetje anders dan je gewent bent. Dingen gaan misschien iets langzamer, en afhankelijk van het door u gekozen beveiligingsniveau, zullen sommige elementen misschien niet werken of niet laden.
onboarding.tour-tor-expect-differences.button=Zie de VGVn
-onboarding.tour-tor-onion-services=Onion Services
+onboarding.tour-tor-onion-services=Onion Diensten
onboarding.tour-tor-onion-services.title=Wees extra beschermd.
-onboarding.tour-tor-onion-services.description=Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously. Click below to visit the DuckDuckGo onion site.
-onboarding.tour-tor-onion-services.button=Visit an Onion
+onboarding.tour-tor-onion-services.description=Onion diensten zijn sites welke eindigen op .onion. Deze bieden extra bescherming voor publicisten en bezoekers, inclusief toegevoegde beveiligingsmechanismes tegen censuur. Onion diensten stellen iedereen in staat om content en diensten in anonimiteit aan te bieden. Klik hieronder om de DuckDuckGo onion site te bezoeken.
+onboarding.tour-tor-onion-services.button=Bezoek een Onion
# Circuit Display onboarding.
onboarding.tor-circuit-display.next=Volgende
@@ -48,7 +48,7 @@ onboarding.tor-circuit-display.intro.title=Hoe werken circuits?
onboarding.tor-circuit-display.intro.msg=Circuits worden gemaakt van willekeurig toegekende omleidingen, die computers over de wereld zijn, ingesteld om Tor verkeer door te sturen.
onboarding.tor-circuit-display.diagram.title=Circuit Venster
-onboarding.tor-circuit-display.diagram.msg=This diagram shows the relays that make up the circuit for this website. To prevent linking of activity across different sites, each website gets a different circuit.
+onboarding.tor-circuit-display.diagram.msg=Dit diagram laat zien dat de relays een circuit vormen naar deze website. Om te voorkomen dat activiteit wordt bijgehouden tussen bezoeken aan verschillende websites, wordt voor elke website een apart circuit opgezet.
onboarding.tor-circuit-display.new-circuit.title=Heb je een nieuw circuit nodig?
-onboarding.tor-circuit-display.new-circuit.msg=If you are not able to connect to the website you’re trying to visit or it is not loading properly, then you can use this button to reload the site with a new circuit.
+onboarding.tor-circuit-display.new-circuit.msg=Als u niet kunt verbinden met de website welke u probeert te bezoeken, dan kunt u deze knop gebruiken om de site opnieuw te laden met een nieuw circuit.
diff --git a/src/chrome/locale/nl/torbutton.properties b/src/chrome/locale/nl/torbutton.properties
index 2eee0573..c3441858 100644
--- a/src/chrome/locale/nl/torbutton.properties
+++ b/src/chrome/locale/nl/torbutton.properties
@@ -6,7 +6,7 @@ torbutton.circuit_display.relay = Relay
torbutton.circuit_display.tor_bridge = Bridge
torbutton.circuit_display.unknown_country = Onbekend land
torbutton.circuit_display.guard = Bewaking
-torbutton.circuit_display.guard_note = Your [Guard] node may not change.
+torbutton.circuit_display.guard_note = Jouw [Guard] node wijzigt mogelijk niet.
torbutton.circuit_display.learn_more = Lees meer
torbutton.content_sizer.margin_tooltip = Tor Browser voegt deze rand toe om de afmetingen van het venster minder uit de toon te laten vallen. Dit maakt het moeilijker om u online te volgen.
torbutton.panel.tooltip.disabled = Hier klikken om Tor in te schakelen
@@ -53,7 +53,7 @@ profileMigrationFailed=Migreren van uw bestaande %S profiel is mislukt.\nNieuwe
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=Ophalen %S update
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Verbinding versleuteld (Oniondienst, %1$S, %2$S bit sleutels, %3$S)
diff --git a/src/chrome/locale/pl/aboutTBUpdate.dtd b/src/chrome/locale/pl/aboutTBUpdate.dtd
index b4d70158..01075e28 100644
--- a/src/chrome/locale/pl/aboutTBUpdate.dtd
+++ b/src/chrome/locale/pl/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Aktualizacja przeglądarki Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser została zaktualizowana.">
<!ENTITY aboutTBUpdate.linkPrefix "Aby uzyskać najbardziej aktualne informacje o tym wydaniu,">
<!ENTITY aboutTBUpdate.linkLabel "odwiedź naszą stronę internetową">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Lista zmian:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nowy, przeprojektowany wyświetlacz obwodu">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Wyświetlacz obwodu Tor został przeniesiony i ulepszony! Kliknij przycisk Identyfikacja strony (znajdujący się po lewej stronie paska adresu URL), aby zobaczyć nowy widok obwodu.">
-<!ENTITY aboutTBUpdate.learnMore "Dowiedz się więcej">
+<!ENTITY aboutTBUpdate.version "Wersja">
+<!ENTITY aboutTBUpdate.releaseDate "Data wydania">
+<!ENTITY aboutTBUpdate.releaseNotes "Informacje o wydaniu">
diff --git a/src/chrome/locale/pl/aboutTor.dtd b/src/chrome/locale/pl/aboutTor.dtd
index 2e3c73f6..280d2bef 100644
--- a/src/chrome/locale/pl/aboutTor.dtd
+++ b/src/chrome/locale/pl/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Informacje na temat Tor'a">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Odkrywaj. Prywatnie.">
<!ENTITY aboutTor.ready2.label "Jesteś gotowy na najbardziej prywatne doświadczenie przeglądania na świecie.">
<!ENTITY aboutTor.failure.label "Coś poszło nie tak!">
diff --git a/src/chrome/locale/pl/browserOnboarding.properties b/src/chrome/locale/pl/browserOnboarding.properties
index 6b63e5cf..4e3f88f6 100644
--- a/src/chrome/locale/pl/browserOnboarding.properties
+++ b/src/chrome/locale/pl/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Zobacz moją ścieżkę
onboarding.tour-tor-security=Bezpieczeństwo
onboarding.tour-tor-security.title=Wybierz swoje doświadczenie.
onboarding.tour-tor-security.description=Umożliwiamy także dodatkowe ustawienia dla zwiększenia bezpieczeństwa Twojej przeglądarki. Nasze Ustawienia Bezpieczeństwa pozwalają Ci blokować elementy które mogą być użyte do ataku Twojego komputera. Kliknij poniżej aby zobaczyć co różne opcje robią.
-onboarding.tour-tor-security.button=Przeglądaj ustawienia
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Wskazówki do doświadczenia
onboarding.tour-tor-expect-differences.title=Spodziewaj się różnic.
diff --git a/src/chrome/locale/pl/torbutton.properties b/src/chrome/locale/pl/torbutton.properties
index 864804ba..23e9744f 100644
--- a/src/chrome/locale/pl/torbutton.properties
+++ b/src/chrome/locale/pl/torbutton.properties
@@ -53,7 +53,7 @@ profileMigrationFailed=Migracja Twojego isniejącego profilu %S nie powiodła si
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=Pobieranie aktualizacji %S
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Połączenie zaszyfrowane (usługa Onion, %1$S, %2$S klucze bitowe, %3$S)
diff --git a/src/chrome/locale/pt-BR/aboutTBUpdate.dtd b/src/chrome/locale/pt-BR/aboutTBUpdate.dtd
index d349e8ad..3458c99d 100644
--- a/src/chrome/locale/pt-BR/aboutTBUpdate.dtd
+++ b/src/chrome/locale/pt-BR/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Atualizar o Navegador Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "O Navegador Tor foi atualizado.">
<!ENTITY aboutTBUpdate.linkPrefix "Para obter as informações mais recentes sobre esta versão">
<!ENTITY aboutTBUpdate.linkLabel "visite nosso site.">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Registro de modificações:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Novo display de circuito reprojetado">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "O display do circuito Tor foi realocado e melhorado! Clique no Site botão de identidade (localizado no lado esquerdo da barra de URL) para ver o novo display do circuito.">
-<!ENTITY aboutTBUpdate.learnMore "Saiba Mais">
+<!ENTITY aboutTBUpdate.version "Versão">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Notas da Versão">
diff --git a/src/chrome/locale/pt-BR/aboutTor.dtd b/src/chrome/locale/pt-BR/aboutTor.dtd
index 130f2b13..c9bc04ae 100644
--- a/src/chrome/locale/pt-BR/aboutTor.dtd
+++ b/src/chrome/locale/pt-BR/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Sobre Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Navegar. Com privacidade.">
<!ENTITY aboutTor.ready2.label "Você está pronto para a maior experiência de navegação privada do mundo.">
<!ENTITY aboutTor.failure.label "Alguma coisa deu errado!">
diff --git a/src/chrome/locale/pt-BR/browserOnboarding.properties b/src/chrome/locale/pt-BR/browserOnboarding.properties
index b4d4fc8c..8d309797 100644
--- a/src/chrome/locale/pt-BR/browserOnboarding.properties
+++ b/src/chrome/locale/pt-BR/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Ver Meu Caminho
onboarding.tour-tor-security=Segurança
onboarding.tour-tor-security.title=Escolha sua experiência.
onboarding.tour-tor-security.description=Nós também fornecemos a você configurações adicionais para aumentar a segurança do seu browser. Nossas Configurações de Segurança permitem você bloquear elementos que podem ser utilizados para atacar o seu computador. Clique abaixo para ver o que as diferentes opções fazem.
-onboarding.tour-tor-security.button=Reveja Configurações
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Dicas de Experiência
onboarding.tour-tor-expect-differences.title=Espere algumas diferenças.
diff --git a/src/chrome/locale/ru/aboutTBUpdate.dtd b/src/chrome/locale/ru/aboutTBUpdate.dtd
index b246094d..9209be25 100644
--- a/src/chrome/locale/ru/aboutTBUpdate.dtd
+++ b/src/chrome/locale/ru/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Обновление Tor Browser">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser обновлен.">
<!ENTITY aboutTBUpdate.linkPrefix "Самая свежая информация об этой версии — ">
<!ENTITY aboutTBUpdate.linkLabel "на нашем сайте">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Журнал изменений:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Цепочка Tor отображается по-новому">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Цепочка узлов Tor теперь имеет другой, улучшенный вид. Нажмите на значок слева от адреса сайта, чтобы увидеть цепочку.">
-<!ENTITY aboutTBUpdate.learnMore "Подробнее">
+<!ENTITY aboutTBUpdate.version "Версия">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/ru/aboutTor.dtd b/src/chrome/locale/ru/aboutTor.dtd
index 611fc80a..84075a89 100644
--- a/src/chrome/locale/ru/aboutTor.dtd
+++ b/src/chrome/locale/ru/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "О проекте Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Исследуйте. Приватно.">
<!ENTITY aboutTor.ready2.label "Вы готовы к самому приватному просмотру веб-страниц в мире.">
<!ENTITY aboutTor.failure.label "Что-то пошло не так!">
diff --git a/src/chrome/locale/ru/browserOnboarding.properties b/src/chrome/locale/ru/browserOnboarding.properties
index 4e8e4a4a..a36fde6a 100644
--- a/src/chrome/locale/ru/browserOnboarding.properties
+++ b/src/chrome/locale/ru/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Ваш цикл
onboarding.tour-tor-security=Безопасность
onboarding.tour-tor-security.title=Выберете свой опыт.
onboarding.tour-tor-security.description=Мы также предоставляем вам дополнительные настройки для повышения безопасности вашего браузера. Наши Параметры Безопасности позволяют блокировать элементы, которые могут быть использованы для атаки вашего компьютера. Нажмите ниже, чтобы посмотреть, что делают разные функции.
-onboarding.tour-tor-security.button=Настройки Просмотра
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Рекомендации
onboarding.tour-tor-expect-differences.title=Ждите небольших различий.
diff --git a/src/chrome/locale/sv/aboutTBUpdate.dtd b/src/chrome/locale/sv/aboutTBUpdate.dtd
index 781f545a..6fd6baec 100644
--- a/src/chrome/locale/sv/aboutTBUpdate.dtd
+++ b/src/chrome/locale/sv/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser-uppdatering">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser har uppdaterats.">
<!ENTITY aboutTBUpdate.linkPrefix "För den senaste information om den här versionen,">
<!ENTITY aboutTBUpdate.linkLabel "besök vår hemsida">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Ändringslogg:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Ny, omformad kretsrutan">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor-kretsrutan har flyttats och förbättrats! Klicka på webbplatsen Identitetsknapp (ligger på vänster sida av webbadressfältet) för att se den nya kretsrutan.">
-<!ENTITY aboutTBUpdate.learnMore "Läs mer">
+<!ENTITY aboutTBUpdate.version "Version">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/src/chrome/locale/sv/aboutTor.dtd b/src/chrome/locale/sv/aboutTor.dtd
index 423d6e96..b5d5685a 100644
--- a/src/chrome/locale/sv/aboutTor.dtd
+++ b/src/chrome/locale/sv/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Om Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Utforska. Privat.">
<!ENTITY aboutTor.ready2.label "Du är redo för världens mest privata surfupplevelse.">
<!ENTITY aboutTor.failure.label "Någonting gick fel!">
diff --git a/src/chrome/locale/sv/browserOnboarding.properties b/src/chrome/locale/sv/browserOnboarding.properties
index 8cc7e3f1..29406698 100644
--- a/src/chrome/locale/sv/browserOnboarding.properties
+++ b/src/chrome/locale/sv/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=Se Min väg
onboarding.tour-tor-security=Säkerhet
onboarding.tour-tor-security.title=Välj din upplevelse.
onboarding.tour-tor-security.description=Vi ger dig också ytterligare inställningar för att stöta upp din webbläsares säkerhet. Våra säkerhetsinställningar kan du blockera element som kan användas för att attackera din dator. Klicka nedan för att se vad de olika alternativen gör.
-onboarding.tour-tor-security.button=Granska Inställningar
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Erfarenhets tips
onboarding.tour-tor-expect-differences.title=Förvänta dig vissa skillnader.
diff --git a/src/chrome/locale/sv/torbutton.properties b/src/chrome/locale/sv/torbutton.properties
index 465aaf05..510c9c49 100644
--- a/src/chrome/locale/sv/torbutton.properties
+++ b/src/chrome/locale/sv/torbutton.properties
@@ -53,7 +53,7 @@ profileMigrationFailed=Migrering av din befintliga %S profil misslyckades.\nNya
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Downloading %S update
+updateDownloadingPanelUILabel=Hämtar % s-uppdatering
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Anslutning krypterad (Onion-tjänst, %1$S, %2$S bit nycklar, %3$S)
diff --git a/src/chrome/locale/tr/aboutTBUpdate.dtd b/src/chrome/locale/tr/aboutTBUpdate.dtd
index a0058043..b947ce60 100644
--- a/src/chrome/locale/tr/aboutTBUpdate.dtd
+++ b/src/chrome/locale/tr/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser Güncellemesi">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Değişiklik Günlüğü">
<!ENTITY aboutTBUpdate.updated "Tor Browser güncellendi.">
<!ENTITY aboutTBUpdate.linkPrefix "Bu sürüm hakkındaki güncelleme bilgilerinin çoğu ">
<!ENTITY aboutTBUpdate.linkLabel "web sitemizden edinilebilir">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Sürüm notları:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "Yeni, Yeniden Tasarlanmış Devre Görünümü">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor devresi görünümünün konumu değiştirildi ve geliştirildi! Site Kimliği Düğmesine (adres çubuğunun sol tarafında bulunan) tıklayarak yeni devre görünümüne bakabilirsiniz.">
-<!ENTITY aboutTBUpdate.learnMore "Ayrıntılı Bilgi Alın">
+<!ENTITY aboutTBUpdate.version "Sürüm">
+<!ENTITY aboutTBUpdate.releaseDate "Yayım Tarihi">
+<!ENTITY aboutTBUpdate.releaseNotes "Yayım Notları">
diff --git a/src/chrome/locale/tr/aboutTor.dtd b/src/chrome/locale/tr/aboutTor.dtd
index ce8761f2..9e540252 100644
--- a/src/chrome/locale/tr/aboutTor.dtd
+++ b/src/chrome/locale/tr/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Tor Hakkında">
+<!ENTITY aboutTor.viewChangelog.label "Değişiklik Günlüğünü Görüntüle">
+
<!ENTITY aboutTor.ready.label "Keşfet. Gizlice.">
<!ENTITY aboutTor.ready2.label "Dünyanın en kişisel web tarama deneyimine hazırsınız.">
<!ENTITY aboutTor.failure.label "Bir Şeyler Ters Gitti!">
diff --git a/src/chrome/locale/tr/browserOnboarding.properties b/src/chrome/locale/tr/browserOnboarding.properties
index 1b10fd9a..2abd38c2 100644
--- a/src/chrome/locale/tr/browserOnboarding.properties
+++ b/src/chrome/locale/tr/browserOnboarding.properties
@@ -19,13 +19,13 @@ onboarding.tour-tor-network.button=Devre Görünümüne Geç
onboarding.tour-tor-circuit-display=Devre Görünümü
onboarding.tour-tor-circuit-display.title=Yolunuzu görün.
-onboarding.tour-tor-circuit-display.description=Ziyaret ettiğiniz her web sitesi için bağlantınız dünya üzerindeki üç Tor aktarıcısından oluşan bir devreden şifrelenir ve aktarılır. Hiç bir web sitesi sizin gerçekte nereden bağlandığınızı bilemez. Kullandığınız devreyi değiştirmek için Devre Görünümünde "Bu Sitenin Devresini Yenile" üzerine tıklayın.
+onboarding.tour-tor-circuit-display.description=Ziyaret ettiğiniz her web sitesi için bağlantınız, dünya üzerindeki üç Tor aktarıcısından oluşan bir devre kurularak şifrelenir ve aktarılır. Hiç bir web sitesi sizin gerçekte nereden bağlandığınızı bilemez. Kullandığınız devreyi değiştirmek için Devre Görünümünde "Bu Sitenin Devresini Yenile" üzerine tıklayın.
onboarding.tour-tor-circuit-display.button=Yolumu Göster
onboarding.tour-tor-security=Güvenlik
onboarding.tour-tor-security.title=Deneyiminizi özelleştirin.
onboarding.tour-tor-security.description=Ek ayarları kullanarak web tarayıcınızın güvenliğini arttırabilirsiniz. Güvenlik Ayarlarımız bilgisayarınıza saldırmak için kullanılabilecek bileşenleri engellemenizi sağlar. Seçeneklerinizi görebilmek için aşağıya tıklayın.
-onboarding.tour-tor-security.button=Ayarları Gözden Geçir
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Deneyim İpuçları
onboarding.tour-tor-expect-differences.title=Bazı farklılıklara açık olun.
diff --git a/src/chrome/locale/tr/torbutton.properties b/src/chrome/locale/tr/torbutton.properties
index 32ff1fed..68a6ecda 100644
--- a/src/chrome/locale/tr/torbutton.properties
+++ b/src/chrome/locale/tr/torbutton.properties
@@ -53,7 +53,7 @@ profileMigrationFailed=Mevcut %S profilinizin taşınma işlemi başarısız old
# "Downloading update" string for the hamburger menu (see #28885).
# This string is kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-updateDownloadingPanelUILabel=Güncelleme yükleniyor %S
+updateDownloadingPanelUILabel=%S güncellemesi indiriliyor
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Bağlantı Şifreli (Onion Hizmeti, %1$S, %2$S bit anahtarlar, %3$S)
diff --git a/src/chrome/locale/vi/aboutTBUpdate.dtd b/src/chrome/locale/vi/aboutTBUpdate.dtd
index fede64fa..49c282f0 100644
--- a/src/chrome/locale/vi/aboutTBUpdate.dtd
+++ b/src/chrome/locale/vi/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "Nâng cấp trình duyệt Tor">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Trình duyệt Tor đã được cập nhật">
<!ENTITY aboutTBUpdate.linkPrefix "Dành cho những thông tin cập nhật mới nhất về bản phát hành này,">
<!ENTITY aboutTBUpdate.linkLabel "đến thăm trang của chúng tôi">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Nhật ký thay đổi:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "New, Redesigned Circuit Display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "Learn More">
+<!ENTITY aboutTBUpdate.version "Phiên bản">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Ghi chú phát hành">
diff --git a/src/chrome/locale/vi/aboutTor.dtd b/src/chrome/locale/vi/aboutTor.dtd
index f8bc3896..179102fb 100644
--- a/src/chrome/locale/vi/aboutTor.dtd
+++ b/src/chrome/locale/vi/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "Thông tin về Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "Truy cập Internet. Một cách riêng tư.">
<!ENTITY aboutTor.ready2.label "Bạn đã sẵn sàng cho trải nghiệm duyệt web riêng tư nhất trên thế giới.">
<!ENTITY aboutTor.failure.label "Có Lỗi Xảy Ra!">
diff --git a/src/chrome/locale/vi/browserOnboarding.properties b/src/chrome/locale/vi/browserOnboarding.properties
index fd085289..60b685dd 100644
--- a/src/chrome/locale/vi/browserOnboarding.properties
+++ b/src/chrome/locale/vi/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=See My Path
onboarding.tour-tor-security=Bảo mật
onboarding.tour-tor-security.title=Choose your experience.
onboarding.tour-tor-security.description=We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do.
-onboarding.tour-tor-security.button=Review Settings
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Experience Tips
onboarding.tour-tor-expect-differences.title=Expect some differences.
diff --git a/src/chrome/locale/zh-CN/aboutTBUpdate.dtd b/src/chrome/locale/zh-CN/aboutTBUpdate.dtd
index 2e14767d..dfc6a2b6 100644
--- a/src/chrome/locale/zh-CN/aboutTBUpdate.dtd
+++ b/src/chrome/locale/zh-CN/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "更新 Tor Browser">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "Tor Browser 更新完成。">
<!ENTITY aboutTBUpdate.linkPrefix "有关此版本的最新信息,">
<!ENTITY aboutTBUpdate.linkLabel "访问我们的网站">
<!ENTITY aboutTBUpdate.linkSuffix "。">
-<!ENTITY aboutTBUpdate.changeLogHeading "更新日志:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "重新设计的全新线路显示">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tor 线路显示移动了位置而且更进一步,点击站点与身份按钮(在地址栏的左边)来查看新的线路显示界面。">
-<!ENTITY aboutTBUpdate.learnMore "了解更多">
+<!ENTITY aboutTBUpdate.version "版本">
+<!ENTITY aboutTBUpdate.releaseDate "发布日期">
+<!ENTITY aboutTBUpdate.releaseNotes "发行说明">
diff --git a/src/chrome/locale/zh-CN/aboutTor.dtd b/src/chrome/locale/zh-CN/aboutTor.dtd
index 36e9b9a5..8afb37fb 100644
--- a/src/chrome/locale/zh-CN/aboutTor.dtd
+++ b/src/chrome/locale/zh-CN/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "关于 Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "私密浏览">
<!ENTITY aboutTor.ready2.label "欢迎体验最私密的浏览。">
<!ENTITY aboutTor.failure.label "出错了!">
diff --git a/src/chrome/locale/zh-CN/browserOnboarding.properties b/src/chrome/locale/zh-CN/browserOnboarding.properties
index 47587585..6f172c5e 100644
--- a/src/chrome/locale/zh-CN/browserOnboarding.properties
+++ b/src/chrome/locale/zh-CN/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=查看我的路径。
onboarding.tour-tor-security=安全
onboarding.tour-tor-security.title=自定你的浏览体验。
onboarding.tour-tor-security.description=我们也提供更多选项来进一步强化 Tor Browser 的安全性。安全设置可以允许你屏蔽可能会被用于攻击你的电脑的元素。点击下方的按钮来了解不同的选项的作用。
-onboarding.tour-tor-security.button=检查设置
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=浏览提示
onboarding.tour-tor-expect-differences.title=可能会有些不同。
diff --git a/src/chrome/locale/zh-TW/aboutTBUpdate.dtd b/src/chrome/locale/zh-TW/aboutTBUpdate.dtd
index d4c86ee2..f7a236c1 100644
--- a/src/chrome/locale/zh-TW/aboutTBUpdate.dtd
+++ b/src/chrome/locale/zh-TW/aboutTBUpdate.dtd
@@ -1,10 +1,8 @@
-<!ENTITY aboutTBUpdate.title "洋蔥路由瀏覽器更新">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
<!ENTITY aboutTBUpdate.updated "洋蔥路由瀏覽器已經更新完成">
<!ENTITY aboutTBUpdate.linkPrefix "本次釋出更新的最新資訊">
<!ENTITY aboutTBUpdate.linkLabel "參訪我們的網站">
<!ENTITY aboutTBUpdate.linkSuffix "。">
-<!ENTITY aboutTBUpdate.changeLogHeading "變更歷史紀錄:">
-
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "新的、重新設計的迴路顯示">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
-<!ENTITY aboutTBUpdate.learnMore "了解更多">
+<!ENTITY aboutTBUpdate.version "版本">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "版本說明">
diff --git a/src/chrome/locale/zh-TW/aboutTor.dtd b/src/chrome/locale/zh-TW/aboutTor.dtd
index bd5fa14d..42636547 100644
--- a/src/chrome/locale/zh-TW/aboutTor.dtd
+++ b/src/chrome/locale/zh-TW/aboutTor.dtd
@@ -6,6 +6,8 @@
<!ENTITY aboutTor.title "關於 Tor">
+<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+
<!ENTITY aboutTor.ready.label "探索。隱密。">
<!ENTITY aboutTor.ready2.label "您已準備好使用全世界最私密的瀏覽體驗。">
<!ENTITY aboutTor.failure.label "發生錯誤!">
diff --git a/src/chrome/locale/zh-TW/browserOnboarding.properties b/src/chrome/locale/zh-TW/browserOnboarding.properties
index eb4f9a37..f3937ce1 100644
--- a/src/chrome/locale/zh-TW/browserOnboarding.properties
+++ b/src/chrome/locale/zh-TW/browserOnboarding.properties
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.button=See My Path
onboarding.tour-tor-security=安全
onboarding.tour-tor-security.title=Choose your experience.
onboarding.tour-tor-security.description=We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do.
-onboarding.tour-tor-security.button=Review Settings
+onboarding.tour-tor-security-level.button=See Your Security Level
onboarding.tour-tor-expect-differences=Experience Tips
onboarding.tour-tor-expect-differences.title=Expect some differences.
1
0
[tor-browser-build/master] Bug 28802: Support PTs in Tor Browser for Android
by gk@torproject.org 15 Mar '19
by gk@torproject.org 15 Mar '19
15 Mar '19
commit 68730ec4ae152475f638cd52f79b6621412b3f85
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Mar 15 15:46:58 2019 +0000
Bug 28802: Support PTs in Tor Browser for Android
---
projects/orbot/build | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/projects/orbot/build b/projects/orbot/build
index 840df3e..4bea420 100644
--- a/projects/orbot/build
+++ b/projects/orbot/build
@@ -20,6 +20,16 @@ for p in $rootdir/*.patch
do patch -p1 < $p
done
+# Use Orbot's PT capabilities
+[% IF c("var/android-armv7") %]
+ arch=armeabi-v7a
+[% ELSE %]
+ arch=x86
+[% END %]
+obfs4dir=orbotservice/src/main/libs/$arch
+mkdir -p $obfs4dir
+mv external/pluto/bin/$arch/obfs4proxy $obfs4dir/obfs4proxy.so
+
# Build Android Libraries and Apps
$GRADLE_HOME/gradle-4.1/bin/gradle --offline assembleRelease -x lint
1
0