Move Clear and Exit to the top of the navigation menu. https://redmine.stoutner...
authorSoren Stoutner <soren@stoutner.com>
Wed, 20 Mar 2019 20:32:36 +0000 (13:32 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 20 Mar 2019 20:32:36 +0000 (13:32 -0700)
86 files changed:
.idea/assetWizardSettings.xml
.idea/dictionaries/soren.xml
app/build.gradle
app/src/free/assets/de/about_permissions_dark.html
app/src/free/assets/de/about_permissions_light.html
app/src/free/assets/de/about_privacy_policy_dark.html
app/src/free/assets/de/about_privacy_policy_light.html
app/src/free/assets/it/about_permissions_dark.html
app/src/free/assets/it/about_permissions_light.html
app/src/free/assets/ru/about_permissions_dark.html
app/src/free/assets/ru/about_permissions_light.html
app/src/main/assets/de/about_contributors_dark.html
app/src/main/assets/de/about_contributors_light.html
app/src/main/assets/de/about_licenses_dark.html
app/src/main/assets/de/about_licenses_light.html
app/src/main/assets/de/about_links_dark.html
app/src/main/assets/de/about_links_light.html
app/src/main/assets/de/about_permissions_dark.html
app/src/main/assets/de/about_permissions_light.html
app/src/main/assets/de/about_privacy_policy_dark.html
app/src/main/assets/de/about_privacy_policy_light.html
app/src/main/assets/de/guide_bookmarks_dark.html
app/src/main/assets/de/guide_bookmarks_light.html
app/src/main/assets/de/guide_domain_settings_dark.html
app/src/main/assets/de/guide_domain_settings_light.html
app/src/main/assets/de/guide_javascript_dark.html
app/src/main/assets/de/guide_javascript_light.html
app/src/main/assets/de/guide_local_storage_dark.html
app/src/main/assets/de/guide_local_storage_light.html
app/src/main/assets/de/guide_overview_dark.html
app/src/main/assets/de/guide_overview_light.html
app/src/main/assets/de/guide_requests_dark.html
app/src/main/assets/de/guide_requests_light.html
app/src/main/assets/de/guide_ssl_certificates_dark.html
app/src/main/assets/de/guide_ssl_certificates_light.html
app/src/main/assets/de/guide_tor_dark.html
app/src/main/assets/de/guide_tor_light.html
app/src/main/assets/de/guide_tracking_ids_dark.html
app/src/main/assets/de/guide_tracking_ids_light.html
app/src/main/assets/de/guide_user_agent_dark.html
app/src/main/assets/de/guide_user_agent_light.html
app/src/main/assets/en/about_licenses_dark.html
app/src/main/assets/en/about_licenses_light.html
app/src/main/assets/en/guide_ssl_certificates_dark.html
app/src/main/assets/en/guide_ssl_certificates_light.html
app/src/main/assets/es/about_licenses_dark.html
app/src/main/assets/es/about_licenses_light.html
app/src/main/assets/it/about_licenses_dark.html
app/src/main/assets/it/about_licenses_light.html
app/src/main/assets/ru/about_licenses_dark.html
app/src/main/assets/ru/about_licenses_light.html
app/src/main/assets/shared_images/tab_dark.png [new file with mode: 0644]
app/src/main/assets/shared_images/tab_light.png [new file with mode: 0644]
app/src/main/assets/tr/about_licenses_dark.html
app/src/main/assets/tr/about_licenses_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/AddDomainDialog.java
app/src/main/java/com/stoutner/privacybrowser/fragments/AboutTabFragment.java
app/src/main/java/com/stoutner/privacybrowser/fragments/WebViewTabFragment.java [new file with mode: 0644]
app/src/main/java/com/stoutner/privacybrowser/helpers/BlockListHelper.java
app/src/main/res/drawable/tab.xml [new file with mode: 0644]
app/src/main/res/drawable/theme_dark.xml
app/src/main/res/drawable/theme_light.xml
app/src/main/res/layout/about_coordinatorlayout.xml
app/src/main/res/layout/custom_tab_view.xml [new file with mode: 0644]
app/src/main/res/layout/main_framelayout.xml
app/src/main/res/layout/nestedscroll_webview.xml [new file with mode: 0644]
app/src/main/res/layout/url_app_bar.xml
app/src/main/res/menu/webview_navigation_menu.xml
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values-tr/strings.xml
app/src/main/res/values/strings.xml
fastlane/metadata/android/de-DE/full_description.txt [new file with mode: 0644]
fastlane/metadata/android/de-DE/short_description.txt [new file with mode: 0644]
fastlane/metadata/android/de-DE/title.txt [new file with mode: 0644]
fastlane/metadata/android/en-US/full_description.txt
fastlane/metadata/android/en-US/short_description.txt
fastlane/metadata/android/en-US/title.txt
fastlane/metadata/android/tr-TR/full_description.txt [new file with mode: 0644]
fastlane/metadata/android/tr-TR/short_description.txt [new file with mode: 0644]
fastlane/metadata/android/tr-TR/title.txt [new file with mode: 0644]

index a2c18eb6ed7be02627a6e4e1ce48662331a3d305..e1c83ef8f36dce8e89dc57d79f9b1b975e7c46a7 100644 (file)
@@ -68,7 +68,7 @@
                                 <PersistentState>
                                   <option name="values">
                                     <map>
-                                      <entry key="url" value="jar:file:/home/soren/Android/android-studio/plugins/android/lib/android.jar!/images/material_design_icons/action/ic_payment_black_24dp.xml" />
+                                      <entry key="url" value="jar:file:/home/soren/Android/android-studio/plugins/android/lib/android.jar!/images/material_design_icons/action/ic_tab_black_24dp.xml" />
                                     </map>
                                   </option>
                                 </PersistentState>
@@ -78,7 +78,8 @@
                         </option>
                         <option name="values">
                           <map>
-                            <entry key="outputName" value="app_bar" />
+                            <entry key="autoMirrored" value="true" />
+                            <entry key="outputName" value="tab" />
                             <entry key="sourceFile" value="$USER_HOME$/ownCloud/Android/Privacy Browser/Icons/Icons/file_copy_light.svg" />
                           </map>
                         </option>
index e0dfdc07ce6af732496d21bf276ee8725a3d7228..36ddf6a6e96777955a591c1625b08146cf5edc6f 100644 (file)
       <w>mitm</w>
       <w>mozilla</w>
       <w>navigationview</w>
+      <w>nestedscroll</w>
       <w>nightmode</w>
       <w>nist</w>
       <w>nojs</w>
       <w>webpage</w>
       <w>websocket</w>
       <w>webview</w>
+      <w>webviewpager</w>
       <w>whatismyip</w>
       <w>wipo</w>
       <w>wouldn</w>
index 52f4d9b96b1f1d4fac3e178e6ba48772690fb09a..6de6e3bb5855e7d1c1ebaa9eb39e3ee5659c13ee 100644 (file)
@@ -86,5 +86,5 @@ dependencies {
     implementation 'com.google.android.material:material:1.0.0'
 
     // Only compile Firebase ads for the free flavor.
-    freeImplementation 'com.google.firebase:firebase-ads:17.1.3'
+    freeImplementation 'com.google.firebase:firebase-ads:17.2.0'
 }
\ No newline at end of file
index 06aa30163219536d83d796e6d13710044c6f0b91..4d429bce30e341cc01212dd3b50eb5e7063b15f7 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2018 Stefan Erhardt.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
-        <h3>Read storage</h3>
+        <h3>Speicher lesen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE">android.permission.READ_EXTERNAL_STORAGE</a></p>
-        <p>Required to import settings from public folders. On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can import settings from the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen aus öffentlichen Ordnern zu importieren.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen nur aus seinem eigenen Ordner importieren, wenn diese Berechtigung nicht erteilt wird.</p>
 
-        <h3>Write storage</h3>
+        <h3>Speicher schreiben</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE">android.permission.WRITE_EXTERNAL_STORAGE</a></p>
-        <p>Required to export settings and download files to the public folders.
-            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can export settings and store downloads in the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen und Downloads in öffentlichen Ordnern zu speichern.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen und Downloads nur in seinem eigenen Ordner speichern, wenn diese Berechtigung nicht erteilt wird.</p>
 
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+               <p>Zusätzlich zu den oben genannten Berechtigungen zeigt Privacy Browser Free Werbeanzeigen von Google's AdMob-Netzwerk unter Zuhilfenahme des Firebase-Backends.
+                       Für die "Kostenlos"-Plakette ergänzt Firebase die Liste der Berechtigungen um die Folgenden,
+            obwohl diese nicht im Quellcode der <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">Manifest-Datei</a>
+            von Privacy Browser aufgeführt werden:</p>
 
-        <h3>View network connections</h3>
+        <h3>Netzwerk-Verbindungen anzeigen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
-            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Erlaubt den Werbeanzeigen mitzuteilen, wenn das Gerät mit dem Internet verbunden ist und wann nicht (vermutlich damit nicht versucht wird, Werbeanzeigen neu zu laden, wenn keine Verbindung besteht).
+                       Diese können auch mitteilen, ob eine Verbindung via WLAN, 2G, 3G, 4G, usw. besteht.</p>
 
-        <h3>Prevent phone from sleeping</h3>
+        <h3>Schlaf-Modus des Telefons verhindern</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
-        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don’t think the ads actually do this.</p>
+        <p>Erlaubt den Werbeanzeigen, das Gerät nicht in den Schlaf-Modus zu versetzen und das Display nicht zu dimmen. In Stoutners Tests konnte dieses Verhalten nicht festgestellt werden.</p>
 
         <h3>Play Install Referrer API</h3>
         <p><a href="https://android-developers.googleblog.com/2017/11/google-play-referrer-api-track-and.html">com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE</a></p>
-        <p>Allows other apps to tell if their installation was launched from an ad in Privacy Browser Free.</p>
+        <p>Erlaubt anderen Apps mitzuteilen, ob ihre Installation über eine Werbeanzeige innerhalb von Privacy Browser Free ausgelöst wurde.</p>
 
-        <h3>Receive data from Internet</h3>
+        <h3>Daten aus Internet empfangen</h3>
         <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
-        <p>Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).</p>
+        <p>Erlaubt Google Informationen direkt an AdView zu senden, ohne dass zuvor eine entsprechende Anfrage getätigt wurde (cloud-to-device messaging).</p>
 
-        <h3>Receive data from Internet</h3>
+        <h3>Daten aus Internet empfangen</h3>
         <p><a href="https://developers.google.com/cloud-messaging/android/client">com.stoutner.privacybrowser.free.permission.C2D_MESSAGE</a></p>
-        <p>Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.</p>
+        <p>Sichert die cloud-to-device-Nachrichten ab, damit nur Privacy Browser Free diese empfangen kann.</p>
     </body>
 </html>
\ No newline at end of file
index ccea38eb73f5e0657a72e4291cd57310da22ae4b..235cb4e2ae0a289491cbb52fe036c900ed50433a 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2018 Stefan Erhardt.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
-        <h3>Read storage</h3>
+        <h3>Speicher lesen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE">android.permission.READ_EXTERNAL_STORAGE</a></p>
-        <p>Required to import settings from public folders. On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can import settings from the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen aus öffentlichen Ordnern zu importieren.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen nur aus seinem eigenen Ordner importieren, wenn diese Berechtigung nicht erteilt wird.</p>
 
-        <h3>Write storage</h3>
+        <h3>Speicher schreiben</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE">android.permission.WRITE_EXTERNAL_STORAGE</a></p>
-        <p>Required to export settings and download files to the public folders.
-            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can export settings and store downloads in the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen und Downloads in öffentlichen Ordnern zu speichern.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen und Downloads nur in seinem eigenen Ordner speichern, wenn diese Berechtigung nicht erteilt wird.</p>
 
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+        <p>Zusätzlich zu den oben genannten Berechtigungen zeigt Privacy Browser Free Werbeanzeigen von Google's AdMob-Netzwerk unter Zuhilfenahme des Firebase-Backends.
+            Für die "Kostenlos"-Plakette ergänzt Firebase die Liste der Berechtigungen um die Folgenden,
+            obwohl diese nicht im Quellcode der <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">Manifest-Datei</a>
+            von Privacy Browser aufgeführt werden:</p>
 
-        <h3>View network connections</h3>
+        <h3>Netzwerk-Verbindungen anzeigen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
-            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Erlaubt den Werbeanzeigen mitzuteilen, wenn das Gerät mit dem Internet verbunden ist und wann nicht (vermutlich damit nicht versucht wird, Werbeanzeigen neu zu laden, wenn keine Verbindung besteht).
+            Diese können auch mitteilen, ob eine Verbindung via WLAN, 2G, 3G, 4G, usw. besteht.</p>
 
-        <h3>Prevent phone from sleeping</h3>
+        <h3>Schlaf-Modus des Telefons verhindern</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
-        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don’t think the ads actually do this.</p>
+        <p>Erlaubt den Werbeanzeigen, das Gerät nicht in den Schlaf-Modus zu versetzen und das Display nicht zu dimmen. In Stoutners Tests konnte dieses Verhalten nicht festgestellt werden.</p>
 
         <h3>Play Install Referrer API</h3>
         <p><a href="https://android-developers.googleblog.com/2017/11/google-play-referrer-api-track-and.html">com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE</a></p>
-        <p>Allows other apps to tell if their installation was launched from an ad in Privacy Browser Free.</p>
+        <p>Erlaubt anderen Apps mitzuteilen, ob ihre Installation über eine Werbeanzeige innerhalb von Privacy Browser Free ausgelöst wurde.</p>
 
-        <h3>Receive data from Internet</h3>
+        <h3>Daten aus Internet empfangen</h3>
         <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
-        <p>Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).</p>
+        <p>Erlaubt Google Informationen direkt an AdView zu senden, ohne dass zuvor eine entsprechende Anfrage getätigt wurde (cloud-to-device messaging).</p>
 
-        <h3>Receive data from Internet</h3>
+        <h3>Daten aus Internet empfangen</h3>
         <p><a href="https://developers.google.com/cloud-messaging/android/client">com.stoutner.privacybrowser.free.permission.C2D_MESSAGE</a></p>
-        <p>Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.</p>
+        <p>Sichert die cloud-to-device-Nachrichten ab, damit nur Privacy Browser Free diese empfangen kann.</p>
     </body>
 </html>
\ No newline at end of file
index cb188bec228ad72ac97336435615718f6412584c..fdcf94b595f78ebfdcf3daf54ed9d2265174ead8 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
 
     <body>
         <h3>Privacy Browser Free</h3>
-        <p><strong class="red">Privacy Browser Free does not collect any user information</strong>.</p>
-
+        <p><strong class="red">Privacy Browser Free sammelt keinerlei Benutzer-Informationen.</strong></p>
 
         <h3>Google Play</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Google stellt Entwicklern <em>anonymisierte Installations-Informationen</em> inklusive der Anzahl der Installationen unterteilt in die folgenden Kategorien bereit:</p>
         <ul>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English [United States])</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch [USA])</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Mobilfunk-Anbieter</item> (z.B. T-Mobile - US)</li>
         </ul>
 
 
-        <h3>Google Play Ratings</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <h3>Google Play Bewertungen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Google stellt Entwicklern folgende <em>anonymisierte Installations-Informationen</em> bezüglich der Bewertungen bereit:</p>
         <ul>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English)</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch)</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
         </ul>
 
 
-        <h3>Google Play Reviews</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <h3>Google Play Rezensionen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Zusätzlich zum Namen des Rezensenten, der Bewertung und dem Text der Rezension (welche alle öffentlich zugänglich sind),
+            stellt Google dem Entwickler einige oder alle der folgenden Informationen zur Verfügung:</p>
         <ul>
-            <li><item>Version code</item> (eg. 7)</li>
-            <li><item>Version name</item> (eg. 1.6)</li>
-            <li><item>Android version</item> (eg. Android 5.1)</li>
-            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
-            <li><item>Manufacturer</item> (eg. Samsung)</li>
-            <li><item>Device type</item> (eg. Phone)</li>
-            <li><item>CPU make</item> (eg. Samsung)</li>
-            <li><item>CPU model</item> (eg. Exynos 7420)</li>
-            <li><item>Screen density</item> (eg. 560 dpi)</li>
-            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
-            <li><item>RAM</item> (eg. 4096 MB)</li>
-            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
-            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
-            <li><item>Device language</item> (eg. English)</li>
+            <li><item>Versions-Code</item> (z.B. 7)</li>
+            <li><item>Versions-Name</item> (z.B. 1.6)</li>
+            <li><item>Android-Version</item> (z.B. Android 5.1)</li>
+            <li><item>Gerät</item> (z.B. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Hersteller</item> (z.B. Samsung)</li>
+            <li><item>Gerätetyp</item> (z.B. Mobiltelefon)</li>
+            <li><item>CPU-Fabrikat</item> (z.B. Samsung)</li>
+            <li><item>CPU-Model</item> (z.B. Exynos 7420)</li>
+            <li><item>Bildschirm-Auflösung</item> (z.B. 560 dpi)</li>
+            <li><item>Bildschirm-Grösse</item> (z.B. 2560 x 1440)</li>
+            <li><item>RAM</item> (z.B. 4096 MB)</li>
+            <li><item>Native Plattform</item> (z.B. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES Version</item> (z.B. 3.1)</li>
+            <li><item>Geräte-Sprache</item> (z.B. Englisch)</li>
         </ul>
 
 
-        <h3>Advertisements</h3>
-        <p>Privacy Browser Free einen Werbebanner unten am Bildschirm ein und verwendet hierfür Googles Netzwerk AdMob,
+        <h3>Werbeeinblendungen</h3>
+        <p>Privacy Browser Free blendet einen Werbebanner unten am Bildschirm ein und verwendet hierfür Googles Netzwerk AdMob,
             dessen eigene Datenschutzbestimmungen <a href="https://www.google.com/intl/en/policies/privacy/">hier zu finden sind</a>.
             Diese Werbung wurde eingestellt als anonymisiert und der Benutzer ist als unter dem Schutzalter gesetzt,
             was sämtliches <a href="https://developers.google.com/admob/android/eu-consent#collect_consent">Tracking und Remarketing</a> deaktiviert.
-            AdMob überträgt <em>anonymisierte Zusammenfassungen</em> folgender Informationen an die Entwickler.</p>
+            AdMob überträgt <em>anonymisierte Zusammenfassungen</em> folgender Informationen an die Entwickler:</p>
         <ul>
             <li><item>Totale Besuche</item></li>
             <li><item>Totale Klicks</item></li>
-            <li><item>Platform</item> (z.B. high-end Smartphones, Tablets)</li>
-            <li><item>Activitäten nach Ländern</item></li>
+            <li><item>Platform</item> (z.B. High-End Smartphones, Tablets)</li>
+            <li><item>Aktivitäten nach Ländern</item></li>
         </ul>
 
 
-        <h3>Direct Communications</h3>
-        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
-
+         <h3>Direkte Kommunikation</h3>
+        <p>Benutzer können z.B. per Email und Kommentaren auf <a href="https://www.stoutner.com/">stoutner.com</a> direkt mit Stoutner Kontakt aufnehmen.</p>
 
-        <h3>Use of Information</h3>
-        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
-            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+        <h3>Daten-Nutzung</h3>
+        <p><strong class="blue">Stoutner kann diese Informationen nutzen, um die Entwicklung von Privacy Browser zu unterstützen und den Status des Projekts an Benutzer zu melden.</strong>
+            <strong class="red">Stoutner wird die Informationen niemals verkaufen oder an Dritte weitergeben, welche diese für Anzeigen oder Marketing nutzen.</strong></p>
 
         <hr />
         <p style="text-align: center;"><em>Revision 1.6, 22. Mai 2018</em></p>
index 5a4bb26067f7b6ebc99b86dc5f2bfd3000d4dc95..dd76b8702bbf5b22d1ab97607dde6ca20c6eeac8 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
 
     <body>
         <h3>Privacy Browser Free</h3>
-        <p><strong class="red">Privacy Browser Free does not collect any user information</strong>.</p>
-
+        <p><strong class="red">Privacy Browser Free sammelt keinerlei Benutzer-Informationen.</strong></p>
 
         <h3>Google Play</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Google stellt Entwicklern <em>anonymisierte Installations-Informationen</em> inklusive der Anzahl der Installationen unterteilt in die folgenden Kategorien bereit:</p>
         <ul>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English [United States])</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch [USA])</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Mobilfunk-Anbieter</item> (z.B. T-Mobile - US)</li>
         </ul>
 
 
-        <h3>Google Play Ratings</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <h3>Google Play Bewertungen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Google stellt Entwicklern folgende <em>anonymisierte Installations-Informationen</em> bezüglich der Bewertungen bereit:</p>
         <ul>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English)</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch)</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
         </ul>
 
 
-        <h3>Google Play Reviews</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <h3>Google Play Rezensionen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Zusätzlich zum Namen des Rezensenten, der Bewertung und dem Text der Rezension (welche alle öffentlich zugänglich sind),
+            stellt Google dem Entwickler einige oder alle der folgenden Informationen zur Verfügung:</p>
         <ul>
-            <li><item>Version code</item> (eg. 7)</li>
-            <li><item>Version name</item> (eg. 1.6)</li>
-            <li><item>Android version</item> (eg. Android 5.1)</li>
-            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
-            <li><item>Manufacturer</item> (eg. Samsung)</li>
-            <li><item>Device type</item> (eg. Phone)</li>
-            <li><item>CPU make</item> (eg. Samsung)</li>
-            <li><item>CPU model</item> (eg. Exynos 7420)</li>
-            <li><item>Screen density</item> (eg. 560 dpi)</li>
-            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
-            <li><item>RAM</item> (eg. 4096 MB)</li>
-            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
-            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
-            <li><item>Device language</item> (eg. English)</li>
+            <li><item>Versions-Code</item> (z.B. 7)</li>
+            <li><item>Versions-Name</item> (z.B. 1.6)</li>
+            <li><item>Android-Version</item> (z.B. Android 5.1)</li>
+            <li><item>Gerät</item> (z.B. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Hersteller</item> (z.B. Samsung)</li>
+            <li><item>Gerätetyp</item> (z.B. Mobiltelefon)</li>
+            <li><item>CPU-Fabrikat</item> (z.B. Samsung)</li>
+            <li><item>CPU-Model</item> (z.B. Exynos 7420)</li>
+            <li><item>Bildschirm-Auflösung</item> (z.B. 560 dpi)</li>
+            <li><item>Bildschirm-Grösse</item> (z.B. 2560 x 1440)</li>
+            <li><item>RAM</item> (z.B. 4096 MB)</li>
+            <li><item>Native Plattform</item> (z.B. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES Version</item> (z.B. 3.1)</li>
+            <li><item>Geräte-Sprache</item> (z.B. Englisch)</li>
         </ul>
 
 
-        <h3>Advertisements</h3>
-        <p>Privacy Browser Free einen Werbebanner unten am Bildschirm ein und verwendet hierfür Googles Netzwerk AdMob,
+        <h3>Werbeeinblendungen</h3>
+        <p>Privacy Browser Free blendet einen Werbebanner unten am Bildschirm ein und verwendet hierfür Googles Netzwerk AdMob,
             dessen eigene Datenschutzbestimmungen <a href="https://www.google.com/intl/en/policies/privacy/">hier zu finden sind</a>.
             Diese Werbung wurde eingestellt als anonymisiert und der Benutzer ist als unter dem Schutzalter gesetzt,
             was sämtliches <a href="https://developers.google.com/admob/android/eu-consent#collect_consent">Tracking und Remarketing</a> deaktiviert.
-            AdMob überträgt <em>anonymisierte Zusammenfassungen</em> folgender Informationen an die Entwickler.</p>
+            AdMob überträgt <em>anonymisierte Zusammenfassungen</em> folgender Informationen an die Entwickler:</p>
         <ul>
             <li><item>Totale Besuche</item></li>
             <li><item>Totale Klicks</item></li>
-            <li><item>Platform</item> (z.B. high-end Smartphones, Tablets)</li>
-            <li><item>Activitäten nach Ländern</item></li>
+            <li><item>Platform</item> (z.B. High-End Smartphones, Tablets)</li>
+            <li><item>Aktivitäten nach Ländern</item></li>
         </ul>
 
 
-        <h3>Direct Communications</h3>
-        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
-
+        <h3>Direkte Kommunikation</h3>
+        <p>Benutzer können z.B. per Email und Kommentaren auf <a href="https://www.stoutner.com/">stoutner.com</a> direkt mit Stoutner Kontakt aufnehmen.</p>
 
-        <h3>Use of Information</h3>
-        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
-            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+        <h3>Daten-Nutzung</h3>
+        <p><strong class="blue">Stoutner kann diese Informationen nutzen, um die Entwicklung von Privacy Browser zu unterstützen und den Status des Projekts an Benutzer zu melden.</strong>
+            <strong class="red">Stoutner wird die Informationen niemals verkaufen oder an Dritte weitergeben, welche diese für Anzeigen oder Marketing nutzen.</strong></p>
 
         <hr />
         <p style="text-align: center;"><em>Revision 1.6, 22. Mai 2018</em></p>
index 7f7ae05f84a6bbd7d1c5a555df31e3bf94842e03..7494432edcd6c9678107f40adcd0ba006d293106 100644 (file)
@@ -49,8 +49,8 @@
         <br/>
 
         <p>Oltre ai permessi sopraelencati, Privacy Browser Free mostra gli annunci provenienti dalla Google's AdMob network utilizzando il Firebase backend.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+            Se si utilizza la versione Free, Firebase aggiunge i seguenti permessi anche se non sono elencati nel codice sorgente del file
+            “<a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest</a>”.</p>
 
         <h3>Visualizzare connessioni di rete</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index cdf69cf1b3e5d9fea4d56b395382bfdffa24c1c6..75a4fc3ec334e0f9bfd5dd7b091a8659234578b3 100644 (file)
@@ -49,8 +49,8 @@
         <br/>
 
         <p>Oltre ai permessi sopraelencati, Privacy Browser Free mostra gli annunci provenienti dalla Google's AdMob network utilizzando il Firebase backend.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+            Se si utilizza la versione Free, Firebase aggiunge i seguenti permessi anche se non sono elencati nel codice sorgente del file
+            “<a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest</a>”.</p>
 
         <h3>Visualizzare connessioni di rete</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index 6c166aee67569937dcc7aa4a80f55f770f383ea6..878238d7ee9ef92e42d75d5035c5f34c793bc06d 100644 (file)
@@ -47,8 +47,8 @@
         <br/>
 
         <p>Кроме того, Privacy Browser Free отображает объявления из сети Google AdMob с использованием бэкенда Firebase.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+            Для бесплатной версии Firebase добавляет следующие разрешения, даже если они не перечислены в
+            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">файле манифеста</a> исходного кода.</p>
 
         <h3>Просмотр сетевых подключений</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index 96c290a32df3e558f2c6374fd4475525e0bf1b4b..e6e15b89076bb98f16ffc6ba32f48c2e8e6ccd08 100644 (file)
@@ -47,8 +47,8 @@
         <br/>
 
         <p>Кроме того, Privacy Browser Free отображает объявления из сети Google AdMob с использованием бэкенда Firebase.
-            For the free flavor, Firebase adds the following permissions even though they are not listed in the source code
-            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">manifest file</a>.</p>
+            Для бесплатной версии Firebase добавляет следующие разрешения, даже если они не перечислены в
+            <a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=blob;f=app/src/main/AndroidManifest.xml;hb=HEAD">файле манифеста</a> исходного кода.</p>
 
         <h3>Просмотр сетевых подключений</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index 7a8a054427d4f3a0734b9144fdb1f9de94d68577..ef561048684ddf988c6df3c6a606e7c471857f21 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3>Leitende Entwickler</h3>
-        <p>Privacy Browser ist primär entwickelt von <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <h3>Leitender Entwickler</h3>
+        <p>Privacy Browser wird primär von <a href="mailto:soren@stoutner.com">Soren Stoutner</a> entwickelt.</p>
 
-        <h3>Coders</h3>
+        <h3>Weitere Entwickler</h3>
         <a href="mailto:lianergoist@vongriffen.dk">Thomas Jensen</a><br/>
         Hendrik Knackstedt
 
         <h3>Mitwirkende</h3>
-        Bernhard G. Keller: Deutsche<br/>
+        Bernhard G. Keller: Deutsch<br/>
         Francesco Buratti: Italienisch<br/>
         Jose A. León: Spanisch
 
-        <h3>Past Translators</h3>
-        Stefan Erhardt: Deutsche<br/>
-        <a href="mailto:aaron@gerlach.com">Aaron Gerlach</a>: Deutsche
+        <h3>Frühere Mitwirkende</h3>
+        Stefan Erhardt: Deutsch<br/>
+        <a href="mailto:aaron@gerlach.com">Aaron Gerlach</a>: Deutsch
 
         <br/>
         <br/>
index 7bc3809a32b54656e8a96168680fba63d9fc972a..4ee41979accd52f966535afb4f91f58cc2c84a53 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3>Leitende Entwickler</h3>
-        <p>Privacy Browser ist primär entwickelt von <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <h3>Leitender Entwickler</h3>
+        <p>Privacy Browser wird primär von <a href="mailto:soren@stoutner.com">Soren Stoutner</a> entwickelt.</p>
 
-        <h3>Coders</h3>
+        <h3>Weitere Entwickler</h3>
         <a href="mailto:lianergoist@vongriffen.dk">Thomas Jensen</a><br/>
         Hendrik Knackstedt
 
         <h3>Mitwirkende</h3>
-        Bernhard G. Keller: Deutsche<br/>
+        Bernhard G. Keller: Deutsch<br/>
         Francesco Buratti: Italienisch<br/>
         Jose A. León: Spanisch
 
-        <h3>Past Translators</h3>
-        Stefan Erhardt: Deutsche<br/>
-        <a href="mailto:aaron@gerlach.com">Aaron Gerlach</a>: Deutsche
+        <h3>Frühere Mitwirkende</h3>
+        Stefan Erhardt: Deutsch<br/>
+        <a href="mailto:aaron@gerlach.com">Aaron Gerlach</a>: Deutsch
 
         <br/>
         <br/>
index 6b5bed0363783b49f5cecfc1988135df92cacd1a..aaaac72f3a1c5a39bc5f020f066f8b16b7883064 100644 (file)
@@ -49,6 +49,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 3d4fdb3cfb77c06d8c8a750a6aa8982668c5753e..69b7a2da91441610d3e938ea3137e569ae3acb01 100644 (file)
@@ -48,6 +48,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_light.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
index 0c7f32138a8af23869db72ac05a4336c94233b53..ceff2b4d4245ad9b50d0f1f72d85c769231d108a 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
@@ -29,7 +31,7 @@
         <h3>Websites</h3>
 
         <p><a href="https://www.stoutner.com/category/privacy-browser/"><img class="icon" src="../shared_images/chrome_reader_mode_blue_dark.png"></a>
-            <a href="https://www.stoutner.com/category/privacy-browser/">News</a></p>
+            <a href="https://www.stoutner.com/category/privacy-browser/">Neuigkeiten</a></p>
 
         <p><a href="https://www.stoutner.com/category/roadmap/"><img class="icon" src="../shared_images/map_blue_dark.png"></a>
             <a href="https://www.stoutner.com/category/roadmap/">Roadmap</a></p>
index 256e94f5967000a8b5c1b494c469f23807e592b0..eb21ce419253154f5d32a4b2012ac2b1fdff7406 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
@@ -29,7 +31,7 @@
         <h3>Websites</h3>
 
         <p><a href="https://www.stoutner.com/category/privacy-browser/"><img class="icon" src="../shared_images/chrome_reader_mode_blue_light.png"></a>
-            <a href="https://www.stoutner.com/category/privacy-browser/">News</a></p>
+            <a href="https://www.stoutner.com/category/privacy-browser/">Neuigkeiten</a></p>
 
         <p><a href="https://www.stoutner.com/category/roadmap/"><img class="icon" src="../shared_images/map_blue_light.png"></a>
             <a href="https://www.stoutner.com/category/roadmap/">Roadmap</a></p>
index f3879a8a7796a6433a3144aac200068111de6876..dbda03a05ad42c40807c21c723081cc4d69bd615 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2018 Stefan Erhardt.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
-        <h3>Read storage</h3>
+        <h3>Speicher lesen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE">android.permission.READ_EXTERNAL_STORAGE</a></p>
-        <p>Required to import settings from public folders. On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can import settings from the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen aus öffentlichen Ordnern zu importieren. Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen nur aus seinem eigenen Ordner importieren, wenn diese Berechtigung nicht erteilt wird.</p>
 
-        <h3>Write storage</h3>
+        <h3>Speicher schreiben</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE">android.permission.WRITE_EXTERNAL_STORAGE</a></p>
-        <p>Required to export settings and download files to the public folders.
-            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can export settings and store downloads in the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen und Downloads in öffentlichen Ordnern zu speichern.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen und Downloads nur in seinem eigenen Ordner speichern, wenn diese Berechtigung nicht erteilt wird.</p>
     </body>
 </html>
\ No newline at end of file
index d14cb9eaf9e08721ec56901978f6b52d73085929..ecaf7b57832b07694313653a5e65f34a57dd290f 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2018 Stefan Erhardt.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
-        <h3>Read storage</h3>
+        <h3>Speicher lesen</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE">android.permission.READ_EXTERNAL_STORAGE</a></p>
-        <p>Required to import settings from public folders. On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can import settings from the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen aus öffentlichen Ordnern zu importieren. Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen nur aus seinem eigenen Ordner importieren, wenn diese Berechtigung nicht erteilt wird.</p>
 
-        <h3>Write storage</h3>
+        <h3>Speicher schreiben</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE">android.permission.WRITE_EXTERNAL_STORAGE</a></p>
-        <p>Required to export settings and download files to the public folders.
-            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser can export settings and store downloads in the app’s folders instead.</p>
+        <p>Benötigt, um Einstellungen und Downloads in öffentlichen Ordnern zu speichern.
+            Unter Android Marshmallow (API 23) und neuer kann Privacy Browser Einstellungen und Downloads nur in seinem eigenen Ordner speichern, wenn diese Berechtigung nicht erteilt wird.</p>
     </body>
 </html>
\ No newline at end of file
index ef2d325f4db807aba765baf577f74d2f9a882cc9..62a05e73e248db280ccdef83abb9cc3caa96a284 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
 
     <body>
         <h3>Privacy Browser</h3>
-        <p><strong class="red">Privacy Browser does not collect any user information.</strong></p>
+        <p><strong class="red">Privacy Browser sammelt keinerlei Benutzer-Informationen.</strong></p>
 
 
         <h3>Google Play</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Google stellt Entwicklern <em>anonymisierte Installations-Informationen</em> inklusive der Anzahl der Installationen unterteilt in die folgenden Kategorien bereit:</p>
         <ul>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English [United States])</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch [USA])</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Mobilfunk-Anbieter</item> (z.B. T-Mobile - US)</li>
         </ul>
 
 
-        <h3>Google Play Ratings</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <h3>Google Play Bewertungen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Google stellt Entwicklern folgende <em>anonymisierte Installations-Informationen</em> bezüglich der Bewertungen bereit:</p>
         <ul>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English)</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch)</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
         </ul>
 
 
-        <h3>Google Play Reviews</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <h3>Google Play Rezensionen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+                       Zusätzlich zum Namen des Rezensenten, der Bewertung und dem Text der Rezension (welche alle öffentlich zugänglich sind), stellt Google dem Entwickler einige oder alle der folgenden Informationen zur Verfügung:</p>
         <ul>
-            <li><item>Version code</item> (eg. 7)</li>
-            <li><item>Version name</item> (eg. 1.6)</li>
-            <li><item>Android version</item> (eg. Android 5.1)</li>
-            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
-            <li><item>Manufacturer</item> (eg. Samsung)</li>
-            <li><item>Device type</item> (eg. Phone)</li>
-            <li><item>CPU make</item> (eg. Samsung)</li>
-            <li><item>CPU model</item> (eg. Exynos 7420)</li>
-            <li><item>Screen density</item> (eg. 560 dpi)</li>
-            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
-            <li><item>RAM</item> (eg. 4096 MB)</li>
-            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
-            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
-            <li><item>Device language</item> (eg. English)</li>
+            <li><item>Versions-Code</item> (z.B. 7)</li>
+            <li><item>Versions-Name</item> (z.B. 1.6)</li>
+            <li><item>Android-Version</item> (z.B. Android 5.1)</li>
+            <li><item>Gerät</item> (z.B. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Hersteller</item> (z.B. Samsung)</li>
+            <li><item>Gerätetyp</item> (z.B. Mobiltelefon)</li>
+            <li><item>CPU-Fabrikat</item> (z.B. Samsung)</li>
+            <li><item>CPU-Model</item> (z.B. Exynos 7420)</li>
+            <li><item>Bildschirm-Auflösung</item> (z.B. 560 dpi)</li>
+            <li><item>Bildschirm-Grösse</item> (z.B. 2560 x 1440)</li>
+            <li><item>RAM</item> (z.B. 4096 MB)</li>
+            <li><item>Native Plattform</item> (z.B. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES Version</item> (z.B. 3.1)</li>
+            <li><item>Geräte-Sprache</item> (z.B. Englisch)</li>
         </ul>
 
 
-        <h3>Direct Communications</h3>
-        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+        <h3>Direkte Kommunication</h3>
+        <p>Benutzer können z.B. per Email und Kommentaren auf <a href="https://www.stoutner.com/">stoutner.com</a> direkt mit Stoutner Kontakt aufnehmen.</p>
 
-        <h3>Use of Information</h3>
-        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
-            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+        <h3>Daten-Nutzung</h3>
+        <p><strong class="blue">Stoutner kann diese Informationen nutzen, um die Entwicklung von Privacy Browser zu unterstützen und den Status des Projekts an Benutzer zu melden.</strong>
+            <strong class="red">Stoutner wird die Informationen niemals verkaufen oder an Dritte weitergeben, welche diese für Anzeigen oder Marketing nutzen.</strong></p>
 
         <hr />
         <p style="text-align: center;"><em>Revision 1.6, 22. Mai 2018</em></p>
index 793142744b61274a55f03f9e635ad3330ffea9e7..dccd9447e8cef1b2f328099aff0d20f7d54c0073 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
 
     <body>
         <h3>Privacy Browser</h3>
-        <p><strong class="red">Privacy Browser does not collect any user information.</strong></p>
+        <p><strong class="red">Privacy Browser sammelt keinerlei Benutzer-Informationen.</strong></p>
 
 
         <h3>Google Play</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Google stellt Entwicklern <em>anonymisierte Installations-Informationen</em> inklusive der Anzahl der Installationen unterteilt in die folgenden Kategorien bereit:</p>
         <ul>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English [United States])</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch [USA])</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Mobilfunk-Anbieter</item> (z.B. T-Mobile - US)</li>
         </ul>
 
 
-        <h3>Google Play Ratings</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <h3>Google Play Bewertungen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Google stellt Entwicklern folgende <em>anonymisierte Installations-Informationen</em> bezüglich der Bewertungen bereit:</p>
         <ul>
-            <li><item>Country</item> (eg. United States)</li>
-            <li><item>Language</item> (eg. English)</li>
-            <li><item>App version</item> (eg. 14)</li>
-            <li><item>Android version</item> (eg. Android 7.1)</li>
-            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
-            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Land</item> (z.B. USA)</li>
+            <li><item>Sprache</item> (z.B. Englisch)</li>
+            <li><item>App-Version</item> (z.B. 14)</li>
+            <li><item>Android-Version</item> (z.B. Android 7.1)</li>
+            <li><item>Gerät</item> (z.B. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (z.B. 10"-Tablet oder höher)</li>
         </ul>
 
 
-        <h3>Google Play Reviews</h3>
-        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
-            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <h3>Google Play Rezensionen</h3>
+        <p>Google Play hat seine eigene <a href="https://policies.google.com/privacy?hl=de">Datenschutzerklärung</a>.
+            Zusätzlich zum Namen des Rezensenten, der Bewertung und dem Text der Rezension (welche alle öffentlich zugänglich sind), stellt Google dem Entwickler einige oder alle der folgenden Informationen zur Verfügung:</p>
         <ul>
-            <li><item>Version code</item> (eg. 7)</li>
-            <li><item>Version name</item> (eg. 1.6)</li>
-            <li><item>Android version</item> (eg. Android 5.1)</li>
-            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
-            <li><item>Manufacturer</item> (eg. Samsung)</li>
-            <li><item>Device type</item> (eg. Phone)</li>
-            <li><item>CPU make</item> (eg. Samsung)</li>
-            <li><item>CPU model</item> (eg. Exynos 7420)</li>
-            <li><item>Screen density</item> (eg. 560 dpi)</li>
-            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
-            <li><item>RAM</item> (eg. 4096 MB)</li>
-            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
-            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
-            <li><item>Device language</item> (eg. English)</li>
+            <li><item>Versions-Code</item> (z.B. 7)</li>
+            <li><item>Versions-Name</item> (z.B. 1.6)</li>
+            <li><item>Android-Version</item> (z.B. Android 5.1)</li>
+            <li><item>Gerät</item> (z.B. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Hersteller</item> (z.B. Samsung)</li>
+            <li><item>Gerätetyp</item> (z.B. Mobiltelefon)</li>
+            <li><item>CPU-Fabrikat</item> (z.B. Samsung)</li>
+            <li><item>CPU-Model</item> (z.B. Exynos 7420)</li>
+            <li><item>Bildschirm-Auflösung</item> (z.B. 560 dpi)</li>
+            <li><item>Bildschirm-Grösse</item> (z.B. 2560 x 1440)</li>
+            <li><item>RAM</item> (z.B. 4096 MB)</li>
+            <li><item>Native Plattform</item> (z.B. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES Version</item> (z.B. 3.1)</li>
+            <li><item>Geräte-Sprache</item> (z.B. Englisch)</li>
         </ul>
 
 
-        <h3>Direct Communications</h3>
-        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+        <h3>Direkte Kommunication</h3>
+        <p>Benutzer können z.B. per Email und Kommentaren auf <a href="https://www.stoutner.com/">stoutner.com</a> direkt mit Stoutner Kontakt aufnehmen.</p>
 
-        <h3>Use of Information</h3>
-        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
-            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+        <h3>Daten-Nutzung</h3>
+        <p><strong class="blue">Stoutner kann diese Informationen nutzen, um die Entwicklung von Privacy Browser zu unterstützen und den Status des Projekts an Benutzer zu melden.</strong>
+            <strong class="red">Stoutner wird die Informationen niemals verkaufen oder an Dritte weitergeben, welche diese für Anzeigen oder Marketing nutzen.</strong></p>
 
         <hr />
         <p style="text-align: center;"><em>Revision 1.6, 22. Mai 2018</em></p>
index a5566ba760912490ec36450e4a383813a65cf420..5c6bb3186d3693d5ac22763a4f1bb387a348f909 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2018-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     <body>
         <h3><img class="title" src="../shared_images/bookmarks_blue_guide_dark.png"> Lesezeichen</h3>
 
-        <p>Bookmarks can be accessed in a drawer layout by swiping from the right of the screen.</p>
+        <p>Lesezeichen können im Privacy Browser durch Wischen vom rechten Rand erreicht werden.</p>
 
         <img class="center21" src="images/bookmarks.png">
 
-        <p>Tapping the top floating action button loads the bookmarks activity, which has advanced options like moving and deleting bookmarks.
-            From the bookmarks activity, there is an option to load the bookmarks database view.
-            This shows the bookmarks as they exist in the SQLite database, which can be useful for troubleshooting problems with importing and exporting bookmarks.</p>
+        <p>Tippen Sie eines der Icons an, um Lesezeichen in der Lesezeichen-Übersicht zu ändern, umszuortieren oder zu löschen.
+                       In der Lesezeichen-Übersicht gibt es eine Option, um die Lesezeichen in der Datenbank-Ansicht anzuzeigen.
+                       Diese zeigt die Lesezeichen, wie sie in der SQLite-Datenbank enthalten sind. Dies kann bei Problemen beim Importieren oder Exportieren von Lesezeichen hilfreich sein.</p>
     </body>
 </html>
\ No newline at end of file
index dabbf0e07179447f95cd5a3ec9670528b8a5ff9f..f54f21ce3c0131930df4c0400cbd995d066fbc1f 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2018-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     <body>
         <h3><img class="title" src="../shared_images/bookmarks_blue_light.png"> Lesezeichen</h3>
 
-        <p>Bookmarks can be accessed in a drawer layout by swiping from the right of the screen.</p>
+        <p>Lesezeichen können im Privacy Browser durch Wischen vom rechten Rand erreicht werden.</p>
 
         <img class="center21" src="images/bookmarks.png">
 
-        <p>Tapping the top floating action button loads the bookmarks activity, which has advanced options like moving and deleting bookmarks.
-            From the bookmarks activity, there is an option to load the bookmarks database view.
-            This shows the bookmarks as they exist in the SQLite database, which can be useful for troubleshooting problems with importing and exporting bookmarks.</p>
+        <p>Tippen Sie eines der Icons an, um Lesezeichen in der Lesezeichen-Übersicht zu ändern, umszuortieren oder zu löschen.
+            In der Lesezeichen-Übersicht gibt es eine Option, um die Lesezeichen in der Datenbank-Ansicht anzuzeigen.
+            Diese zeigt die Lesezeichen, wie sie in der SQLite-Datenbank enthalten sind. Dies kann bei Problemen beim Importieren oder Exportieren von Lesezeichen hilfreich sein.</p>
     </body>
 </html>
\ No newline at end of file
index 4a5a87d298b6c7e4f06b4451273bb38216f84f38..3eb483c54e0c19323756dddcd64a1ed9ffe3a144 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/dns_blue_dark.png"> Secure Web Browsing</h3>
+        <h3><img class="title" src="../shared_images/dns_blue_dark.png"> Sicheres Internet-Surfen</h3>
 
-        <p>Privacy Browser’s default is to browse with JavaScript, cookies, and DOM storage disabled.
-            However, some websites legitimately need these features enabled to function correctly.
-            Domain settings can automatically turn on a specified set of features when visiting a designated domain.</p>
+        <p>Privacy Browser’s Vorgabe ist das Surfen ohne JavaScript, Cookies und DOM-Speicher.
+                       Allerdings gibt es Websites, die nur korrekt funktionieren, wenn eine oder mehrere dieser Funktionen aktiviert sind.
+                       Sie können daher eine oder mehrere dieser Funktionen automatisch aktivieren, wenn Sie eine solche Seite (Domain) besuchen.</p>
 
         <p><img class="center21" src="images/domain_settings.png"></p>
 
-        <p>When visiting a domain that has domain settings specified, the background of the URL text box is green.</p>
+        <p>Wenn Sie ein Seite besuchen, für die zuvor bereits entsprechende Einstellungen getätigt wurden, wird der Hintergrund der URL-Textbox grün dargestellt.</p>
 
         <p><img class="center21" src="../en/images/green_url_bar.png"></p>
     </body>
index ab4387a7376c20b8e8fc5f696e6eed749c2341ca..b763fe80ed028a82070d324ada5f1b1d385605dd 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/dns_blue_light.png"> Secure Web Browsing</h3>
+        <h3><img class="title" src="../shared_images/dns_blue_light.png"> Sicheres Internet-Surfen</h3>
 
-        <p>Privacy Browser’s default is to browse with JavaScript, cookies, and DOM storage disabled.
-            However, some websites legitimately need these features enabled to function correctly.
-            Domain settings can automatically turn on a specified set of features when visiting a designated domain.</p>
+        <p>Privacy Browser’s Vorgabe ist das Surfen ohne JavaScript, Cookies und DOM-Speicher.
+            Allerdings gibt es Websites, die nur korrekt funktionieren, wenn eine oder mehrere dieser Funktionen aktiviert sind.
+            Sie können daher eine oder mehrere dieser Funktionen automatisch aktivieren, wenn Sie eine solche Seite (Domain) besuchen.</p>
 
         <p><img class="center21" src="images/domain_settings.png"></p>
 
-        <p>When visiting a domain that has domain settings specified, the background of the URL text box is green.</p>
+        <p>Wenn Sie ein Seite besuchen, für die zuvor bereits entsprechende Einstellungen getätigt wurden, wird der Hintergrund der URL-Textbox grün dargestellt.</p>
 
         <p><img class="center21" src="../en/images/green_url_bar.png"></p>
     </body>
index fcd4d7cc257d201d5f531d56c02e1814a148617c..58a258dc96e3603cfe6b199924f1468836b0f77c 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/privacy_browser.png"> JavaScript ist machtvoll</h3>
+        <h3><img class="title" src="../shared_images/privacy_browser.png"> JavaScript ist mächtig</h3>
 
-        <p>In den frühen Tagen des Internets waren Websites statisch, zeigten also nur Text und Bilder, welche auf dem Bildschirm sichtbar sind, veränderten sich aber nicht oder interagierten.
+        <p>In den frühen Tagen des Internets waren Websites statisch, zeigten also nur Text und Bilder, welche auf dem Bildschirm sichtbar sind, veränderten sich  oder interagierten aber nicht.
             Natürlich passierte auf solch statischen Websites nicht viel Interessantes. Viele verschiedene Technologien wurden für dynamische Websites entwickelt. Javascript war eine davon.</p>
 
-        <p>Javascript ist eine Programmiersprache. Viele Webserver hosten Programme geschrieben in Javascript, welche an die Geräte als Teil der Website gesandt werden.
-            Das Gerät führt das Javascript auf dem lokalen Prozessor aus und folgt den Anweisungen des Programms, was beispielsweise Bilder animieren kann, ein Menü öffnen und viele andere großartige Dinge.</p>
+        <p>Javascript ist eine Programmiersprache. Viele Webserver hosten in Javascript geschriebene Programme, welche als Teil der Website an die abrufenden Geräte gesandt werden.
+            Das Gerät führt die Skripts dann auf dem lokalen Gerät aus und folgt den Anweisungen des Programms, um beispielsweise Bilder zu animieren, Menüs zu öffnen und andere derartige Dinge.</p>
 
         <h3><img class="title" src="../shared_images/javascript_enabled.png"> JavaScript ist gefährlich</h3>
 
-        <p>Natürlich birgt das Konzept von willkürlich ausgeführten Programmen aus einer Website heraus ein großes gefahrenprotenzial.
-            Also werden Limitierungen in Javascript gesetzt, damit Dinge wie Viren vorgebeugt wird. Wie auch immer, im Endeffekt sind diese Limitationen sehr ausgedehnt.
-            Unten ist ein Screenshot von <a href="http://webkay.robinlinus.com">webkay</a>,
+        <p>Natürlich birgt das Konzept von willkürlich ausgeführten Programmen aus einer Website heraus auch ein großes Gefahrenprotenzial.
+            Also werden Limitierungen in Javascript gesetzt, die etwa Viren verhindern sollen, jedoch nicht immer wirksam sind.
+            Das Bild unten zeigt einen Screenshot von <a href="http://webkay.robinlinus.com">webkay</a>,
             einer Website die Beispiele für von einem Gerät produzierten Informationen bietet, wenn Javascript auf einem Gerät läuft.
             <a href="http://www.browserleaks.com/">Browser Leaks</a> ist eine andere gute Quelle.</p>
 
         <p><img class="center" src="../en/images/webkay.png"></p>
 
-        <p>Zum Schutz der Privatsphäre wäre es ideal das Web ohne Javascript zu nutzen.  Jedoch benötigen manche Websites legitimerweise
+        <p>Zum Schutz der Privatsphäre wäre es ideal, das Web ohne Javascript zu nutzen.  Jedoch benötigen manche Websites legitimerweise
             JavaScript, um ihre Zwecke zu erfüllen und andere funktionieren nicht korrekt ohne Javascript, selbst wenn sie dazu umprogrammiert werden könnten.
             Privacy Browser geht auf diese Problematik ein und macht es einfach, Javascript zu (de-)aktivieren. Ein Knopfdruck auf das Privatsphäre-Schild wechselt zwischen blau
             <img class="inline" src="../shared_images/privacy_browser.png"> oder gelb <img class="inline" src="../shared_images/warning.png"> (beide zeigen an, dass
-            JavaScript aus ist) und rot <img class="inline" src="../shared_images/javascript_enabled.png"> (JavaScript aktiviert) und aktualisieren die Website.
-            Der Vergleich der verschiedenen Informationen, die <a href="http://webkay.robinlinus.com">webkay</a> mit und ohne Javascript sammeln kann ist informativ.</p>
+            JavaScript aus ist) und rot <img class="inline" src="../shared_images/javascript_enabled.png"> (JavaScript aktiviert) und aktualisiert die Website.
+            Der Vergleich der verschiedenen Informationen, die <a href="http://webkay.robinlinus.com">webkay</a> mit und ohne Javascript sammeln kann, ist sehr informativ.</p>
 
-        <p>Browsing the internet with JavaScript disabled, and only enabling it if needed, goes a long way toward protecting privacy.
-            In addition, JavaScript is used to load much of the annoying advertisements and extra cruft that comes along with most modern websites.
-            With it disabled, websites will load faster, consume less network traffic, and use less CPU power, which leads to longer battery life.</p>
+        <p>Im Internet ohne Javascript unterwegs zu sein oder dieses nur bei Bedarf zu aktivieren, ist ein daher wichtiger Schritt, um die Privatsphäre zu schützen.
+                       Darüber hinaus werden von den meisten modernen Websites nervige Werbebanner und und überflüssiger Müll mit Javascript geladen. 
+                       Wird Javascript deaktiviert, laden Websites daher meist wesentlich schneller, brauchen weniger Datenvolumen und CPU-Leistung, was auch die Lebenszeit der Batterien verlängert.</p>
     </body>
 </html>
\ No newline at end of file
index f6027508088855fab29885d1de3cf25b912598b4..b0446a9ab88bba089957cb020db29b0dfa4c105d 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/privacy_browser.png"> JavaScript ist machtvoll</h3>
+        <h3><img class="title" src="../shared_images/privacy_browser.png"> JavaScript ist mächtig</h3>
 
-        <p>In den frühen Tagen des Internets waren Websites statisch, zeigten also nur Text und Bilder, welche auf dem Bildschirm sichtbar sind, veränderten sich aber nicht oder interagierten.
+        <p>In den frühen Tagen des Internets waren Websites statisch, zeigten also nur Text und Bilder, welche auf dem Bildschirm sichtbar sind, veränderten sich  oder interagierten aber nicht.
             Natürlich passierte auf solch statischen Websites nicht viel Interessantes. Viele verschiedene Technologien wurden für dynamische Websites entwickelt. Javascript war eine davon.</p>
 
-        <p>Javascript ist eine Programmiersprache. Viele Webserver hosten Programme geschrieben in Javascript, welche an die Geräte als Teil der Website gesandt werden.
-            Das Gerät führt das Javascript auf dem lokalen Prozessor aus und folgt den Anweisungen des Programms, was beispielsweise Bilder animieren kann, ein Menü öffnen und viele andere großartige Dinge.</p>
+        <p>Javascript ist eine Programmiersprache. Viele Webserver hosten in Javascript geschriebene Programme, welche als Teil der Website an die abrufenden Geräte gesandt werden.
+            Das Gerät führt die Skripts dann auf dem lokalen Gerät aus und folgt den Anweisungen des Programms, um beispielsweise Bilder zu animieren, Menüs zu öffnen und andere derartige Dinge.</p>
 
         <h3><img class="title" src="../shared_images/javascript_enabled.png"> JavaScript ist gefährlich</h3>
 
-        <p>Natürlich birgt das Konzept von willkürlich ausgeführten Programmen aus einer Website heraus ein großes gefahrenprotenzial.
-            Also werden Limitierungen in Javascript gesetzt, damit Dinge wie Viren vorgebeugt wird. Wie auch immer, im Endeffekt sind diese Limitationen sehr ausgedehnt.
-            Unten ist ein Screenshot von <a href="http://webkay.robinlinus.com">webkay</a>,
+        <p>Natürlich birgt das Konzept von willkürlich ausgeführten Programmen aus einer Website heraus auch ein großes Gefahrenprotenzial.
+            Also werden Limitierungen in Javascript gesetzt, die etwa Viren verhindern sollen, jedoch nicht immer wirksam sind.
+            Das Bild unten zeigt einen Screenshot von <a href="http://webkay.robinlinus.com">webkay</a>,
             einer Website die Beispiele für von einem Gerät produzierten Informationen bietet, wenn Javascript auf einem Gerät läuft.
             <a href="http://www.browserleaks.com/">Browser Leaks</a> ist eine andere gute Quelle.</p>
 
         <p><img class="center" src="../en/images/webkay.png"></p>
 
-        <p>Zum Schutz der Privatsphäre wäre es ideal das Web ohne Javascript zu nutzen.  Jedoch benötigen manche Websites legitimerweise
+        <p>Zum Schutz der Privatsphäre wäre es ideal, das Web ohne Javascript zu nutzen.  Jedoch benötigen manche Websites legitimerweise
             JavaScript, um ihre Zwecke zu erfüllen und andere funktionieren nicht korrekt ohne Javascript, selbst wenn sie dazu umprogrammiert werden könnten.
             Privacy Browser geht auf diese Problematik ein und macht es einfach, Javascript zu (de-)aktivieren. Ein Knopfdruck auf das Privatsphäre-Schild wechselt zwischen blau
             <img class="inline" src="../shared_images/privacy_browser.png"> oder gelb <img class="inline" src="../shared_images/warning.png"> (beide zeigen an, dass
-            JavaScript aus ist) und rot <img class="inline" src="../shared_images/javascript_enabled.png"> (JavaScript aktiviert) und aktualisieren die Website.
-            Der Vergleich der verschiedenen Informationen, die <a href="http://webkay.robinlinus.com">webkay</a> mit und ohne Javascript sammeln kann ist informativ.</p>
+            JavaScript aus ist) und rot <img class="inline" src="../shared_images/javascript_enabled.png"> (JavaScript aktiviert) und aktualisiert die Website.
+            Der Vergleich der verschiedenen Informationen, die <a href="http://webkay.robinlinus.com">webkay</a> mit und ohne Javascript sammeln kann, ist sehr informativ.</p>
 
-        <p>Browsing the internet with JavaScript disabled, and only enabling it if needed, goes a long way toward protecting privacy.
-            In addition, JavaScript is used to load much of the annoying advertisements and extra cruft that comes along with most modern websites.
-            With it disabled, websites will load faster, consume less network traffic, and use less CPU power, which leads to longer battery life.</p>
+        <p>Im Internet ohne Javascript unterwegs zu sein oder dieses nur bei Bedarf zu aktivieren, ist ein daher wichtiger Schritt, um die Privatsphäre zu schützen.
+            Darüber hinaus werden von den meisten modernen Websites nervige Werbebanner und und überflüssiger Müll mit Javascript geladen.
+            Wird Javascript deaktiviert, laden Websites daher meist wesentlich schneller, brauchen weniger Datenvolumen und CPU-Leistung, was auch die Lebenszeit der Batterien verlängert.</p>
     </body>
 </html>
\ No newline at end of file
index 016071720bfa65fed448bad761d52f4e57e563a0..a31c0fca539c8403e92291ad0d42140300215567 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/cookie_blue_dark.png"> Erstanbieter-Cookies</h3>
 
-        <p>Cookies können in zwei Typen unterteilt werden. Erstanbieter-Cookies sind Cookies, die von aktuell besuchten Website gesetzt werden.</p>
-
-        <p>From the early days of the internet, it became obvious that it would be advantageous for websites to be able to store information on a computer for future access.
-            For example, a website that displays weather information could ask the user for a zip code, and then store it in a cookie.
-            The next time the user visited the website, weather information would automatically load for that zip code, without the user having to enter it again.</p>
-
-        <p>Like everything else on the web, clever people figured out all types of ways to abuse cookies to do things that users would not approve of if they knew they were happening.
-            For example, a website can set a cookie with a unique serial number on a device.
-            Then, every time a user visits the website on that device, it can be linked to a unique profile the server maintains for that serial number,
-            even if the device connects from different IP addresses.</p>
-
-        <p>Almost all websites with logins require first-party cookies to be enabled for a user to log in.
-            That is how they make sure it is still you as you move from page to page on the site, and is, in my opinion, one of the few legitimate uses for cookies.</p>
+        <p>Cookies können in zwei Typen unterteilt werden: Erstanbieter-Cookies sind Cookies, die von der aktuell besuchten Website gesetzt werden.</p>
+        
+        <p>Mit solchen Erstanbieter-Cookies können Websites z.B. Informationen auf einem Computer speichern, um diese bei späteren Aufrufen derselben Seite wieder zu verwenden.
+                       Zum Beispiel kann eine Internet-Seite, die das Wetter anzeigt, den Benutzer nach seiner Postleitzahl fragen und diese in einem Cookie speichern.
+                       Beim nächsten Besuch der Website wird dem Benutzer dann automatisch das Wetter für diese Postleitzahl/Region angezeigt, ohne dass der Benutzer diese erneut eingeben muss.</p>
+                       
+               <p>Wie viele anderen Dingen im Internet werden solche Cookies jedoch mittlerweile auch für Zwecke missbraucht, die Website-Besucher normalerweise nicht gestatten würden, wenn sie davon wüssten.
+                       Zum Beispiel können Websites eindeutige Kennzeichen oder Seriennummern in Cookies speichern.
+                       Jedes Mal wenn der Benutzer dann mit seinem Gerät diese Website aufruft, können dessen Bewegungen mit dem Profil dieser Seriennummer verknüpft werden,
+            auch wenn dem Gerät inzwischen eine andere IP-Adresse zugewiesen wurde. So entstehen umfangreiche Profile über die Vorlieben von Website-Besuchern.</p>
 
-        <p>Wenn Erstanbieter-Cookies aktiviert sind aber Javascript deaktiviert, ist das Privatsphäre-Icon gelb <img class="inline" src="../shared_images/warning.png"> als Warnung.</p>
+               <p>Nahezu alle Webseiten, bei denen eine Anmeldung notwendig ist, nutzen Erstanbieter-Cookies für den Anmeldevorgang. 
+                       Damit wird sichergestellt, dass nur der angemeldete Benutzer Zugang zu den entsprechenden Informationen hat. Dies ist meiner Meinung nach eine der wenigen legitimen Verwendungen von Cookies.</p>
 
+        <p>Wenn Erstanbieter-Cookies aktiviert sind, aber Javascript deaktiviert, ist das Privatsphäre-Icon als Warnung gelb <img class="inline" src="../shared_images/warning.png">.</p>
 
         <h3><img class="title" src="../shared_images/cookie_blue_dark.png"> Drittanbieter-Cookies</h3>
 
-        <p>Drittanbieter-Cookies werden von Teilen einer Website gesetzt, die von einem anderen Server als dem aktuell besuchten.
+        <p>Drittanbieter-Cookies werden von Teilen einer Website gesetzt, die von einem anderen Server als dem aktuell besuchten geladen werden.
             Beispielsweise laden viele Websites Werbungen von einem Drittanbieter-Broker wie Googles <a href="https://www.google.com/adsense/start/">Ad Sense</a>.
-            Jedes Mal wenn die Website lädt, fragt bei dem Werbe-Broker an, dass er Werbung zeigen soll.
-            Der Werbe-Broker analysiert jegliche information, die er über den Nutzer hat, vergleicht mit dem aktuell gezahlten Satz der Werbenden Firmen, die die Werbung platziert haben wollen,
-            und wählt die anzuzeigenden Werbungen aus. Der Bereich der Website, auf dem die Werbung angezeigt wird, wird vom Drittanbieter-Broker statt von der eigentlich besuchten Website geladen.</p>
-
-        <p>Weil die meisten Werbungen im Internet von ein paar wenigen Brokern betrieben werden hat es nicht lange gedauert, bis sie gemerkt haben,
-            dass sie einfach einen Tracking-Cookie auf dem Gerät des Benutzers hinterlassen können um immer bescheid zu wissen, wohin er geht.
-            Jedes Mal, wenn eine Werbung von einem Broker geladen wird, ist es seine erste Aufgabe, das Gerät auf eine einmalige Seriennummer in einem cookie zu überprüfen.
-            Wenn es den hat, sucht er das Profil für diese Seriennummer heraus und merkt sich die neu besuchte Seite.
-            Deshalb kann der Nutzer auf der einen Seite nach einem Produkt suchen, nach dem er normalerweise nicht sucht, wie z. B. Walnüsse,
+            Jedes Mal wenn die Website lädt, fragt diese bei dem Werbe-Broker an, dass er Werbung zeigen soll.
+            Der Werbe-Broker analysiert jegliche information, die er über den Nutzer hat, vergleicht diese mit dem aktuell gezahlten Satz der werbenden Firmen,
+            die die Werbung platziert haben wollen und wählt die anzuzeigenden Werbungen aus.
+            Der Bereich der Website, auf dem die Werbung angezeigt wird, wird vom Drittanbieter-Broker statt von der eigentlich besuchten Website geladen.</p>
+
+        <p>Weil die meisten Werbungen im Internet von ein paar wenigen Brokern betrieben werden, hat es nicht lange gedauert, bis diese gemerkt haben,
+            dass sie einfach ein Tracking-Cookie auf dem Gerät des Benutzers hinterlassen können, um immer Bescheid zu wissen, wo sich dieser - auch über Seiten- und Domain-Grenzen hinweg - im Internet bewegt.
+            Jedes Mal, wenn eine Werbung von einem Broker geladen wird, ist es dessen erste Aufgabe, das Gerät auf eine einmalige Seriennummer in einem cookie zu überprüfen.
+            Wenn es diesen hat, sucht er das Profil für diese Seriennummer heraus und merkt sich die neu besuchte Seite.
+            Deshalb kann der Nutzer auf einer Seite nach einem Produkt suchen, nach dem er normalerweise nicht sucht, wie z. B. Walnüsse,
             und plötzlich auf jeder anderen besuchten Website Werbungen für Walnüsse angezeigt bekommen.</p>
 
         <p>Zusätzlich zu Werbe-Brokern machen Social-Media-Plattformen das Gleiche.
-            Vor ein paar Jahren haben die großen Plattformen wie Facebook und Twitter eine große Auswahl von Websites ausgemacht, auf denen es in ihrem größten Interesse wäre,
-            kleine Social Media-Icons zu platzieren. Das sind nicht nur Bilder.
-            Sie beinhalten <a href="https://developers.facebook.com/docs/plugins/like-button/">eingebettete Codes</a>,
-            welche zurück auf die Social-Media-Plattform verlinken und - neben anderen Dingen - einen Drittanbieter-Cookie auf dem Gerät hinterlassen.
+            Vor ein paar Jahren haben die großen Plattformen wie Facebook und Twitter eine große Auswahl von Websites ausgemacht, auf denen es in ihrem größten Interesse wäre, Social Media-Icons zu platzieren.
+            Das sind nicht nur Bilder, sondern auch <a href="https://developers.facebook.com/docs/plugins/like-button/">eingebettete Codes</a>,
+            welche zurück auf die Social-Media-Plattform verlinken und - neben anderen Dingen - ein Drittanbieter-Cookie auf dem Gerät hinterlassen.
             Diese Cookies werden selbst dann gesetzt, wenn der Benutzer keinen Account bei der Social-Media-Plattform hat.
             Mit der Zeit bauten Firmen wie Facebook (welche ebenfalls einen Werbe-Broker betreiben) eine große Anzahl von detaillierten Profilen über Personen an, die
             <a href="http://www.theverge.com/2016/5/27/11795248/facebook-ad-network-non-users-cookies-plug-ins">niemals einen Account auf ihrer Seite erstellt haben</a>.</p>
 
-        <p>There is no good reason to ever enable third-party cookies. On devices with Android KitKat or older (version <= 4.4.4 or API <= 20), WebView does not
-            <a href="https://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptThirdPartyCookies(android.webkit.WebView, boolean)">differentiate
-            between first-party and third-party cookies</a>. Thus, enabling first-party cookies will also enable third-party cookies.</p>
-
+               <p>Es gibt daher kaum einen Grund, solche Drittanbieter-Cookies zuzulassen. Auf Geräten mit Android KitKat oder älter (version <= 4.4.4 or API <= 20) kann 
+                       Webkit leider nicht zwischen Erstanbieter- und Drittanbieter-Cookies unterscheiden.
+            Daher werden auf diesen Geräten <a href="https://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptThirdPartyCookies(android.webkit.WebView, boolean)">
+            auch Drittanbieter-Cookies erlaubt, wenn Erstanbieter-Cookies zugelassen werden.</a></p>
 
         <h3><img class="title" src="../shared_images/web_blue_dark.png"> DOM-Speicher</h3>
-
-        <p>Document Object Model storage, also known as web storage, is like cookies on steroids.
-            Whereas the maximum combined storage size for all cookies from a single URL is 4 kilobytes,
-            DOM storage can hold <a href="https://en.wikipedia.org/wiki/Web_storage#Storage_size">megabytes per site</a>.
-            Because DOM storage uses JavaScript to read and write data, it cannot be enabled unless JavaScript is also enabled.</p>
-
+        
+        <p>DOM-Speicher (Document Object Model-Speicher) - auch bekannt als "Web Storage" - ist ein andere Art, mit der Websites Informationen speichern können.
+                       Während der gesamte Speicherplatz für Cookies einer Webseite auf maximal 4 Kilobytes begrenzt ist, können im DOM-Speicher
+            <a href="https://en.wikipedia.org/wiki/Web_storage#Storage_size">Megabytes pro Seite</a> gespeichert werden - diese Art der Speicherung ist daher gewissermassen Cookies auf Steroiden.
+                       Da der DOM-Speicher jedoch Javascript benötigt um Daten zu schreiben oder zu lesen, kann er nicht aktiviert werden, solange nicht auch JavaScript aktiviert ist.</p>
 
         <h3><img class="title" src="../shared_images/subtitles_blue_dark.png"> Formulardaten</h3>
 
-        <p>Form data contains information typed into web forms, like user names, addresses, phone numbers, etc., and lists them in a drop-down box on future visits.
-            Unlike the other forms of local storage, form data is not sent to the web server without specific user interaction.
-            Beginning in Android Oreo (8.0), WebView’s form data was replaced by the <a href="https://medium.com/@bherbst/getting-androids-autofill-to-work-for-you-21435debea1">Autofill service</a>.
-            As such, controls for form data no longer appear on newer Android devices.</p>
+               <p>Formulardaten umfassen Informationen, die in Web-Formulare eingetippt werden, wie etwa Namen, Adressen, Telefonnummern, usw.
+            Diese werden in Drop-Down-Listen angezeigt, wenn die betreffenden Seiten später wieder aufgerufen werden.
+                       Anders als die oben genannten Formen lokal gespeicherter Informationen werden Formulardaten dabei nicht ohne bewusste Interaktion des Benutzers
+            (z.B. Abschicken eines Formulars) an einen Webserver geschickt.
+                       Ab Android Oreo (8.0) verwendet WebView den <a href="https://medium.com/@bherbst/getting-androids-autofill-to-work-for-you-21435debea1">Autofill-Service</a>.
+            Daher werden die entsprechenden Wahlmöglichkeiten für Formulardaten bei neueren Android-Geräten nicht mehr angezeigt.</p>
     </body>
 </html>
\ No newline at end of file
index 1cb74c4d5626e189aa911190981a4dcccad83113..a6cd9d5c8d6220872fe09eb390d11db3047bd86c 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/cookie_blue_light.png"> Erstanbieter-Cookies</h3>
 
-        <p>Cookies können in zwei Typen unterteilt werden. Erstanbieter-Cookies sind Cookies, die von aktuell besuchten Website gesetzt werden.</p>
-
-        <p>From the early days of the internet, it became obvious that it would be advantageous for websites to be able to store information on a computer for future access.
-            For example, a website that displays weather information could ask the user for a zip code, and then store it in a cookie.
-            The next time the user visited the website, weather information would automatically load for that zip code, without the user having to enter it again.</p>
+        <p>Cookies können in zwei Typen unterteilt werden: Erstanbieter-Cookies sind Cookies, die von der aktuell besuchten Website gesetzt werden.</p>
 
-        <p>Like everything else on the web, clever people figured out all types of ways to abuse cookies to do things that users would not approve of if they knew they were happening.
-            For example, a website can set a cookie with a unique serial number on a device.
-            Then, every time a user visits the website on that device, it can be linked to a unique profile the server maintains for that serial number,
-            even if the device connects from different IP addresses.</p>
+        <p>Mit solchen Erstanbieter-Cookies können Websites z.B. Informationen auf einem Computer speichern, um diese bei späteren Aufrufen derselben Seite wieder zu verwenden.
+            Zum Beispiel kann eine Internet-Seite, die das Wetter anzeigt, den Benutzer nach seiner Postleitzahl fragen und diese in einem Cookie speichern.
+            Beim nächsten Besuch der Website wird dem Benutzer dann automatisch das Wetter für diese Postleitzahl/Region angezeigt, ohne dass der Benutzer diese erneut eingeben muss.</p>
 
-        <p>Almost all websites with logins require first-party cookies to be enabled for a user to log in.
-            That is how they make sure it is still you as you move from page to page on the site, and is, in my opinion, one of the few legitimate uses for cookies.</p>
+        <p>Wie viele anderen Dingen im Internet werden solche Cookies jedoch mittlerweile auch für Zwecke missbraucht, die Website-Besucher normalerweise nicht gestatten würden, wenn sie davon wüssten.
+            Zum Beispiel können Websites eindeutige Kennzeichen oder Seriennummern in Cookies speichern.
+            Jedes Mal wenn der Benutzer dann mit seinem Gerät diese Website aufruft, können dessen Bewegungen mit dem Profil dieser Seriennummer verknüpft werden,
+            auch wenn dem Gerät inzwischen eine andere IP-Adresse zugewiesen wurde. So entstehen umfangreiche Profile über die Vorlieben von Website-Besuchern.</p>
 
-        <p>Wenn Erstanbieter-Cookies aktiviert sind aber Javascript deaktiviert, ist das Privatsphäre-Icon gelb <img class="inline" src="../shared_images/warning.png"> als Warnung.</p>
+        <p>Nahezu alle Webseiten, bei denen eine Anmeldung notwendig ist, nutzen Erstanbieter-Cookies für den Anmeldevorgang.
+            Damit wird sichergestellt, dass nur der angemeldete Benutzer Zugang zu den entsprechenden Informationen hat. Dies ist meiner Meinung nach eine der wenigen legitimen Verwendungen von Cookies.</p>
 
+        <p>Wenn Erstanbieter-Cookies aktiviert sind, aber Javascript deaktiviert, ist das Privatsphäre-Icon als Warnung gelb <img class="inline" src="../shared_images/warning.png">.</p>
 
         <h3><img class="title" src="../shared_images/cookie_blue_light.png"> Drittanbieter-Cookies</h3>
 
-        <p>Drittanbieter-Cookies werden von Teilen einer Website gesetzt, die von einem anderen Server als dem aktuell besuchten.
+        <p>Drittanbieter-Cookies werden von Teilen einer Website gesetzt, die von einem anderen Server als dem aktuell besuchten geladen werden.
             Beispielsweise laden viele Websites Werbungen von einem Drittanbieter-Broker wie Googles <a href="https://www.google.com/adsense/start/">Ad Sense</a>.
-            Jedes Mal wenn die Website lädt, fragt bei dem Werbe-Broker an, dass er Werbung zeigen soll.
-            Der Werbe-Broker analysiert jegliche information, die er über den Nutzer hat, vergleicht mit dem aktuell gezahlten Satz der Werbenden Firmen, die die Werbung platziert haben wollen,
-            und wählt die anzuzeigenden Werbungen aus. Der Bereich der Website, auf dem die Werbung angezeigt wird, wird vom Drittanbieter-Broker statt von der eigentlich besuchten Website geladen.</p>
-
-        <p>Weil die meisten Werbungen im Internet von ein paar wenigen Brokern betrieben werden hat es nicht lange gedauert, bis sie gemerkt haben,
-            dass sie einfach einen Tracking-Cookie auf dem Gerät des Benutzers hinterlassen können um immer bescheid zu wissen, wohin er geht.
-            Jedes Mal, wenn eine Werbung von einem Broker geladen wird, ist es seine erste Aufgabe, das Gerät auf eine einmalige Seriennummer in einem cookie zu überprüfen.
-            Wenn es den hat, sucht er das Profil für diese Seriennummer heraus und merkt sich die neu besuchte Seite.
-            Deshalb kann der Nutzer auf der einen Seite nach einem Produkt suchen, nach dem er normalerweise nicht sucht, wie z. B. Walnüsse,
+            Jedes Mal wenn die Website lädt, fragt diese bei dem Werbe-Broker an, dass er Werbung zeigen soll.
+            Der Werbe-Broker analysiert jegliche information, die er über den Nutzer hat, vergleicht diese mit dem aktuell gezahlten Satz der werbenden Firmen,
+            die die Werbung platziert haben wollen und wählt die anzuzeigenden Werbungen aus.
+            Der Bereich der Website, auf dem die Werbung angezeigt wird, wird vom Drittanbieter-Broker statt von der eigentlich besuchten Website geladen.</p>
+
+        <p>Weil die meisten Werbungen im Internet von ein paar wenigen Brokern betrieben werden, hat es nicht lange gedauert, bis diese gemerkt haben,
+            dass sie einfach ein Tracking-Cookie auf dem Gerät des Benutzers hinterlassen können, um immer Bescheid zu wissen, wo sich dieser - auch über Seiten- und Domain-Grenzen hinweg - im Internet bewegt.
+            Jedes Mal, wenn eine Werbung von einem Broker geladen wird, ist es dessen erste Aufgabe, das Gerät auf eine einmalige Seriennummer in einem cookie zu überprüfen.
+            Wenn es diesen hat, sucht er das Profil für diese Seriennummer heraus und merkt sich die neu besuchte Seite.
+            Deshalb kann der Nutzer auf einer Seite nach einem Produkt suchen, nach dem er normalerweise nicht sucht, wie z. B. Walnüsse,
             und plötzlich auf jeder anderen besuchten Website Werbungen für Walnüsse angezeigt bekommen.</p>
 
         <p>Zusätzlich zu Werbe-Brokern machen Social-Media-Plattformen das Gleiche.
-            Vor ein paar Jahren haben die großen Plattformen wie Facebook und Twitter eine große Auswahl von Websites ausgemacht, auf denen es in ihrem größten Interesse wäre,
-            kleine Social Media-Icons zu platzieren. Das sind nicht nur Bilder.
-            Sie beinhalten <a href="https://developers.facebook.com/docs/plugins/like-button/">eingebettete Codes</a>,
-            welche zurück auf die Social-Media-Plattform verlinken und - neben anderen Dingen - einen Drittanbieter-Cookie auf dem Gerät hinterlassen.
+            Vor ein paar Jahren haben die großen Plattformen wie Facebook und Twitter eine große Auswahl von Websites ausgemacht, auf denen es in ihrem größten Interesse wäre, Social Media-Icons zu platzieren.
+            Das sind nicht nur Bilder, sondern auch <a href="https://developers.facebook.com/docs/plugins/like-button/">eingebettete Codes</a>,
+            welche zurück auf die Social-Media-Plattform verlinken und - neben anderen Dingen - ein Drittanbieter-Cookie auf dem Gerät hinterlassen.
             Diese Cookies werden selbst dann gesetzt, wenn der Benutzer keinen Account bei der Social-Media-Plattform hat.
             Mit der Zeit bauten Firmen wie Facebook (welche ebenfalls einen Werbe-Broker betreiben) eine große Anzahl von detaillierten Profilen über Personen an, die
             <a href="http://www.theverge.com/2016/5/27/11795248/facebook-ad-network-non-users-cookies-plug-ins">niemals einen Account auf ihrer Seite erstellt haben</a>.</p>
 
-        <p>There is no good reason to ever enable third-party cookies. On devices with Android KitKat or older (version <= 4.4.4 or API <= 20), WebView does not
-            <a href="https://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptThirdPartyCookies(android.webkit.WebView, boolean)">differentiate
-            between first-party and third-party cookies</a>. Thus, enabling first-party cookies will also enable third-party cookies.</p>
-
+        <p>Es gibt daher kaum einen Grund, solche Drittanbieter-Cookies zuzulassen. Auf Geräten mit Android KitKat oder älter (version <= 4.4.4 or API <= 20) kann
+            Webkit leider nicht zwischen Erstanbieter- und Drittanbieter-Cookies unterscheiden.
+            Daher werden auf diesen Geräten <a href="https://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptThirdPartyCookies(android.webkit.WebView, boolean)">
+                auch Drittanbieter-Cookies erlaubt, wenn Erstanbieter-Cookies zugelassen werden.</a></p>
 
         <h3><img class="title" src="../shared_images/web_blue_light.png"> DOM-Speicher</h3>
 
-        <p>Document Object Model storage, also known as web storage, is like cookies on steroids.
-            Whereas the maximum combined storage size for all cookies from a single URL is 4 kilobytes,
-            DOM storage can hold <a href="https://en.wikipedia.org/wiki/Web_storage#Storage_size">megabytes per site</a>.
-            Because DOM storage uses JavaScript to read and write data, it cannot be enabled unless JavaScript is also enabled.</p>
-
+        <p>DOM-Speicher (Document Object Model-Speicher) - auch bekannt als "Web Storage" - ist ein andere Art, mit der Websites Informationen speichern können.
+            Während der gesamte Speicherplatz für Cookies einer Webseite auf maximal 4 Kilobytes begrenzt ist, können im DOM-Speicher
+            <a href="https://en.wikipedia.org/wiki/Web_storage#Storage_size">Megabytes pro Seite</a> gespeichert werden - diese Art der Speicherung ist daher gewissermassen Cookies auf Steroiden.
+            Da der DOM-Speicher jedoch Javascript benötigt um Daten zu schreiben oder zu lesen, kann er nicht aktiviert werden, solange nicht auch JavaScript aktiviert ist.</p>
 
         <h3><img class="title" src="../shared_images/subtitles_blue_light.png"> Formulardaten</h3>
 
-        <p>Form data contains information typed into web forms, like user names, addresses, phone numbers, etc., and lists them in a drop-down box on future visits.
-            Unlike the other forms of local storage, form data is not sent to the web server without specific user interaction.
-            Beginning in Android Oreo (8.0), WebView’s form data was replaced by the <a href="https://medium.com/@bherbst/getting-androids-autofill-to-work-for-you-21435debea1">Autofill service</a>.
-            As such, controls for form data no longer appear on newer Android devices.</p>
+        <p>Formulardaten umfassen Informationen, die in Web-Formulare eingetippt werden, wie etwa Namen, Adressen, Telefonnummern, usw.
+            Diese werden in Drop-Down-Listen angezeigt, wenn die betreffenden Seiten später wieder aufgerufen werden.
+            Anders als die oben genannten Formen lokal gespeicherter Informationen werden Formulardaten dabei nicht ohne bewusste Interaktion des Benutzers
+            (z.B. Abschicken eines Formulars) an einen Webserver geschickt.
+            Ab Android Oreo (8.0) verwendet WebView den <a href="https://medium.com/@bherbst/getting-androids-autofill-to-work-for-you-21435debea1">Autofill-Service</a>.
+            Daher werden die entsprechenden Wahlmöglichkeiten für Formulardaten bei neueren Android-Geräten nicht mehr angezeigt.</p>
     </body>
 </html>
\ No newline at end of file
index 10e5f250937b0dece28ed815e0c2f8bc04e7b98b..89aa1f5b82efa5f50fed6fd2d8c0d26f40c5ec20 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/visibility_off_blue_dark.png"> Echte Privatsphäre</h3>
 
-        <p>Privacy Browser wurde entwickelt um Ihnen während des Surfens die maximal mögliche Kontrolle über Ihre Privatsphäre zu gewähren.
-            Wenn Sie sich mit einer Website verbinden werden bestimmte Informationen, die zum Verarbeiten der Verbindung nötig sind, an den Server gesandt.
+        <p>Privacy Browser wurde entwickelt, um Ihnen während des Surfens die maximal mögliche Kontrolle über Ihre Privatsphäre zu gewähren.
+            Wenn Sie sich mit einer Website verbinden, werden bestimmte Informationen, die zum Verarbeiten der Verbindung nötig sind, an den Server gesandt.
             Der Server erhält beispielsweise Ihre IP-Adresse und eine Port-Nummer, welche er benötigt, damit er weiß, wohin er antworten soll.
-            Diese Informationen werden häufig gespeichert, damit der Webseitenbetreiber Statistiken generieren kann darüber,
-            wie oft eine Website geladen wird und wie viele verschiedene IP-Adressen sie besucht haben.</p>
+            Diese Informationen werden häufig gespeichert, damit der Webseitenbetreiber Statistiken darüber generieren kann,
+            wie oft eine Website geladen wird und wie viele verschiedene IP-Adressen bzw. Besucher sie besucht haben.</p>
 
-        <p>Darüber hinaus wollen die meisten Webseitenbetreiber Ihr Surfverhalten im ganzen Internet und nicht nur auf einem einzigen Server nachverfolgen.
+        <p>Darüber hinaus wollen viele Webseitenbetreiber das Surfverhalten ihrer Besucher im ganzen Internet und nicht nur auf einem einzigen Server nachverfolgen.
             Sie nutzen dabei verschiedene technische Möglichkeiten. Einige davon nutzen das Anfragen oder Platzieren von bestimmten Informationen auf Ihrem Gerät, die das Nachverfolgen ermöglichen.
             Nahezu alle Browser nehmen freiwillig an dieser Verfolgung Teil, ohne den Nutzer darüber zu informieren.
-            Privacy Browser ist dazu entwickelt, dass der Benutzer so viel Information und Kontrolle über diese Verfolgungstechniken wie möglich erhält.</p>
-
+            Privacy Browser ist dazu entwickelt, dass der Benutzer so viel Information und Kontrolle wie möglich über diese Verfolgungstechniken erhält.</p>
 
         <h3><img class="title" src="../shared_images/chrome_reader_mode_blue_guide_dark.png"> Android's WebView Einschränkungen</h3>
-
-        <p>Privacy Browser uses Android’s built-in WebView to render websites. There are some limitations in the controls WebView exposes for managing privacy settings.
-            For example, it isn’t possible to enable some JavaScript commands while disabling others.
-            In the future, Privacy Browser will switch to a custom WebView called <a href="https://www.stoutner.com/category/roadmap/">Privacy WebView</a>.</p>
+        
+        <p>Privacy Browser nutzt Android's eingebaute WebView-Komponente zum Anzeigen von Websites.
+            Daher gibt es einige Einschränkungen in Bezug auf die von WebView bereitgestellten Kontrollmöglichkeiten der Privatsphäre-Einstellungen.
+                       Zum Beispiel ist es nicht möglich, manche JavaScript-Kommandos zu aktivieren und andere zu deaktivieren.
+                       Für die Zukunft ist geplant, dass Privacy Browser zu einer eigenen WebView-Komponente namens <a href="https://www.stoutner.com/category/roadmap/">Privacy WebView</a> wechselt.</p>
     </body>
 </html>
\ No newline at end of file
index 26e3413830d525c0d9a7f4b0422c02c9be10e4b3..38d4fc5de1534321a1b4ccb69bc96b9bdaf2af84 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/visibility_off_blue_light.png"> Echte Privatsphäre</h3>
 
-        <p>Privacy Browser wurde entwickelt um Ihnen während des Surfens die maximal mögliche Kontrolle über Ihre Privatsphäre zu gewähren.
-            Wenn Sie sich mit einer Website verbinden werden bestimmte Informationen, die zum Verarbeiten der Verbindung nötig sind, an den Server gesandt.
+        <p>Privacy Browser wurde entwickelt, um Ihnen während des Surfens die maximal mögliche Kontrolle über Ihre Privatsphäre zu gewähren.
+            Wenn Sie sich mit einer Website verbinden, werden bestimmte Informationen, die zum Verarbeiten der Verbindung nötig sind, an den Server gesandt.
             Der Server erhält beispielsweise Ihre IP-Adresse und eine Port-Nummer, welche er benötigt, damit er weiß, wohin er antworten soll.
-            Diese Informationen werden häufig gespeichert, damit der Webseitenbetreiber Statistiken generieren kann darüber,
-            wie oft eine Website geladen wird und wie viele verschiedene IP-Adressen sie besucht haben.</p>
+            Diese Informationen werden häufig gespeichert, damit der Webseitenbetreiber Statistiken darüber generieren kann,
+            wie oft eine Website geladen wird und wie viele verschiedene IP-Adressen bzw. Besucher sie besucht haben.</p>
 
-        <p>Darüber hinaus wollen die meisten Webseitenbetreiber Ihr Surfverhalten im ganzen Internet und nicht nur auf einem einzigen Server nachverfolgen.
+        <p>Darüber hinaus wollen viele Webseitenbetreiber das Surfverhalten ihrer Besucher im ganzen Internet und nicht nur auf einem einzigen Server nachverfolgen.
             Sie nutzen dabei verschiedene technische Möglichkeiten. Einige davon nutzen das Anfragen oder Platzieren von bestimmten Informationen auf Ihrem Gerät, die das Nachverfolgen ermöglichen.
             Nahezu alle Browser nehmen freiwillig an dieser Verfolgung Teil, ohne den Nutzer darüber zu informieren.
-            Privacy Browser ist dazu entwickelt, dass der Benutzer so viel Information und Kontrolle über diese Verfolgungstechniken wie möglich erhält.</p>
-
+            Privacy Browser ist dazu entwickelt, dass der Benutzer so viel Information und Kontrolle wie möglich über diese Verfolgungstechniken erhält.</p>
 
         <h3><img class="title" src="../shared_images/chrome_reader_mode_blue_light.png"> Android's WebView Einschränkungen</h3>
 
-        <p>Privacy Browser uses Android’s built-in WebView to render websites. There are some limitations in the controls WebView exposes for managing privacy settings.
-            For example, it isn’t possible to enable some JavaScript commands while disabling others.
-            In the future, Privacy Browser will switch to a custom WebView called <a href="https://www.stoutner.com/category/roadmap/">Privacy WebView</a>.</p>
+        <p>Privacy Browser nutzt Android's eingebaute WebView-Komponente zum Anzeigen von Websites.
+            Daher gibt es einige Einschränkungen in Bezug auf die von WebView bereitgestellten Kontrollmöglichkeiten der Privatsphäre-Einstellungen.
+            Zum Beispiel ist es nicht möglich, manche JavaScript-Kommandos zu aktivieren und andere zu deaktivieren.
+            Für die Zukunft ist geplant, dass Privacy Browser zu einer eigenen WebView-Komponente namens <a href="https://www.stoutner.com/category/roadmap/">Privacy WebView</a> wechselt.</p>
     </body>
 </html>
\ No newline at end of file
index 3d19c542e3b1d9341473573b0de3a8b9c7e30eb5..4cb32db026ea7025f77c93d4c06785ce44fc3496 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/local_activity_blue_dark.png"> Resource Requests</h3>
-
-        <p>When a URL is loaded, it typically makes a number of resource requests for CCS, JavaScript, image, and other files. Details about these requests can be viewed in the Requests activity.
-            The navigation drawer has a link to the Requests activity and also shows how many requests were blocked. Tapping on a request displays details about why it was allowed or blocked.</p>
+        <h3><img class="title" src="../shared_images/local_activity_blue_dark.png"> Resourcen-Zugriffe</h3>
+        
+        <p>Wenn eine URL geladen wird, wird üblicherweise eine Menge Anfragen für mit der Seite verbundene Ressourcen wie Bilder, CSS-, JavaScript- und andere Dateien an den betreffenden Webserver gestellt.
+                       Details dazu können in der Ansicht "Zugriffe" betrachtet werden, welche über das Navigations-Menü links erreicht werden kann.
+                       In dieser Ansicht wird auch dargestellt, wie viele (und welche) Anfragen geblockt wurden.
+            Durch Antippen der betreffenden Anfragen können weitere Details dazu angezeigt werden, die zeigen, warum die Anfrage erlaubt oder blockiert wurde.</p>
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Privacy Browser includes four <a href="https://easylist.to/">common blocklists</a> based on the <a href="https://adblockplus.org/filters">Adblock syntax</a>:
-            EasyList, EasyPrivacy, Fanboy’s Annoyance List, and Fanboy’s Social Blocking List.
-            These blocklists are processed by Privacy Browser into the following 22 sublists, which check resource requests in the order listed.</p>
+               <p>Privacy Browser enthält vier <a href="https://easylist.to/">gebräuchliche Filterlisten</a>, die auf der <a href="https://adblockplus.org/filters">Adblock-Syntax</a> basieren:
+                       EasyList, EasyPrivacy, Fanboy’s Annoyance Filterliste und Fanboy’s Social Blocking Filterliste.
+                       Diese werden in 22 Unter-Listen aufgeteilt, welche die Ressourcen-Zugriffe in der folgenden Reihenfolge überprüfen:</p>
 
         <ol>
-            <li>Main Whitelist</li>
-            <li>Final Whitelist</li>
-            <li>Domain Whitelist</li>
-            <li>Domain Initial Whitelist</li>
-            <li>Domain Final Whitelist</li>
-            <li>Third-Party Whitelist</li>
-            <li>Third-Party Domain Whitelist</li>
-            <li>Third-Party Domain Initial Whitelist</li>
-            <li>Main Blacklist</li>
-            <li>Initial Blacklist</li>
-            <li>Final Blacklist</li>
-            <li>Domain Blacklist</li>
-            <li>Domain Initial Blacklist</li>
-            <li>Domain Final Blacklist</li>
-            <li>Domain Regular Expression Blacklist</li>
-            <li>Third-Party Blacklist</li>
-            <li>Third-Party Initial Blacklist</li>
-            <li>Third-Party Domain Blacklist</li>
-            <li>Third-Party Domain Initial Blacklist</li>
-            <li>Third-Party Regular Expression Blacklist</li>
-            <li>Third-Party Domain Regular Expression Blacklist</li>
-            <li>Regular Expression Blacklist</li>
+            <li>Haupt-Positivliste</li>
+            <li>Positivliste (URL-Ende)</li>
+            <li>Domänen-Positivliste</li>
+            <li>Domänen-Positivliste (URL-Anfang)</li>
+            <li>Domänen-Positivliste (URL-Ende)</li>
+            <li>Drittanbieter-Positivliste</li>
+            <li>Drittanbieter-Domänen-Positivliste</li>
+            <li>Drittanbieter-Domänen-Positivliste (URL-Anfang)</li>
+            <li>Haupt-Negativliste</li>
+            <li>Negativliste (URL-Anfang)</li>
+            <li>Negativliste (URL-Ende)</li>
+            <li>Domänen-Negativliste</li>
+            <li>Domänen-Negativliste (URL-Anfang)</li>
+            <li>Domänen-Negativliste (URL-Ende)</li>
+            <li>Domänen-Negativliste mit regulären Ausdrücken</li>
+            <li>Drittanbieter-Negativliste</li>
+            <li>Drittanbieter-Negativliste (URL-Anfang)</li>
+            <li>Drittanbieter-Domänen-Negativliste</li>
+            <li>Drittanbieter-Domänen-Negativliste (URL-Anfang)</li>
+            <li>Drittanbieter-Negativliste mit regulären Ausdrücken</li>
+            <li>Drittanbieter-Domänen-Negativliste mit regulären Ausdrücken</li>
+            <li>Negativliste mit regulären Ausdrücken</li>
         </ol>
 
-        <p>Initial lists check against the beginning of the URL. Final lists check against the end of the URL. Domain lists only check against certain domains.
-            Third-party lists only apply if the root domain of the request is different than the root domain of the main URL.
-            Regular expression lists follow the <a href="https://en.wikipedia.org/wiki/Regular_expression">regular expression syntax</a>. Each sublist item has one or more entry.
-            In the case of domain sublists, the resource request is only checked against the item if the first entry matches the domain of the main URL.</p>
+        <p>Listen mit "(URL-Anfang)" prüfen gegen den Anfang einer URL, solche mit "(URL-Ende)" gegen das Ende der URL. Domänen-Listen prüfen gegen bestimmte Domains.
+                       Drittanbieter-Listen greifen nur, wenn die Domain der Anfrage eine andere ist als die Domain der aufgerufenen URL.
+                       Listen mit regulären Ausdrücken folgen der <a href="https://de.wikipedia.org/wiki/Reguläre_Ausdrücke">Syntax für reguläre Ausdrücke</a>. Jede Unter-Liste hat dabei einen oder mehrere Einträge.
+                       Bei Domänen-Unterlisten werden die Ressourcen-Zugriffe nur dann überprüft, wenn der erste Eintrag der Domain der aufgerufenen URL entspricht.</p>
 
-        <p>Because of limitations in Android’s WebView, and to speed up processing of requests, Privacy Browser implements a simplified interpretation of the Adblock syntax.
-            This can sometimes lead to false positives, where resources are allowed or blocked in ways that weren’t intended by the original entry.
-            A more detailed description of how the blocklist entries are processed is available at <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
+               <p>Aufgrund von Einschränkungen in Android’s WebView und um die Geschwindigkeit von Anfragen zu steigern, verwendet Privacy Browser eine vereinfachte Auswertung der Adblock-Syntax.
+                       Dies kann manchmal zu "false positives" führen, bei denen Ressourcen erlaubt oder blockiert werden, die in den originalen Einträgen anders intendiert wären.
+                       Eine detailiertere Beschreibung, wie die Listen-Einträge abgearbeitet werden, ist unter <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a> verfügbar.</p>
 
-        <p>Privacy Browser has two additional blocklists,
-            one called <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a> that blocks trackers that EasyPrivacy allows,
-            and the other that blocks all third-party requests.
-            A request is only considered third-party if the base domain of the request is different than the base domain of the URL.
-            For example, if <code>www.website.com</code> loads a picture from <code>images.website.com</code>,
-            this is not blocked as a third-party request because they both share the same base domain of <code>website.com</code>.
-            Blocking all third-party requests increases privacy, but this blocklist is disabled by default because it breaks a large number of websites.</p>
+               <p>Privacy Browser hat zwei weitere Sperrlisten: <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a>, welche Tracker blockiert, die EasyPrivacy erlaubt,
+            und eine andere, die alle Drittanbieter-Anfragen blockiert.
+                       Eine Anfrage wird dabei nur als Drittanbieter-Anfrage gewertet, wenn die Basis-Domain der Anfrage eine andere ist als die Basis-Domain der angefragten URL.
+                       Lädt zum Beispiel die Seite <code>www.website.com</code> ein Bild von <code>images.website.com</code>, wird diese Anfrage nicht als Drittanbieter-Anfrage gewertet,
+            da die beiden Anfragen dieselbe Basis-Domain <code>website.com</code> haben.
+                       Alle Drittanbieter-Anfragen zu blockieren verbessert zwar die Privatsphäre, diese Einstellung ist jedoch standardmäßig deaktiviert, da dadurch viele Webseiten verunstaltet werden können.</p>
     </body>
 </html>
\ No newline at end of file
index b7511a464624cb4cda4dd5f0ec9ee0b6a4ab1a08..587f4f01eef31a37fea80b61299f6f0bea1d62e3 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/local_activity_blue_light.png"> Resource Requests</h3>
+        <h3><img class="title" src="../shared_images/local_activity_blue_light.png"> Resourcen-Zugriffe</h3>
 
-        <p>When a URL is loaded, it typically makes a number of resource requests for CCS, JavaScript, image, and other files. Details about these requests can be viewed in the Requests activity.
-            The navigation drawer has a link to the Requests activity and also shows how many requests were blocked. Tapping on a request displays details about why it was allowed or blocked.</p>
+        <p>Wenn eine URL geladen wird, wird üblicherweise eine Menge Anfragen für mit der Seite verbundene Ressourcen wie Bilder, CSS-, JavaScript- und andere Dateien an den betreffenden Webserver gestellt.
+            Details dazu können in der Ansicht "Zugriffe" betrachtet werden, welche über das Navigations-Menü links erreicht werden kann.
+            In dieser Ansicht wird auch dargestellt, wie viele (und welche) Anfragen geblockt wurden.
+            Durch Antippen der betreffenden Anfragen können weitere Details dazu angezeigt werden, die zeigen, warum die Anfrage erlaubt oder blockiert wurde.</p>
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Privacy Browser includes four <a href="https://easylist.to/">common blocklists</a> based on the <a href="https://adblockplus.org/filters">Adblock syntax</a>:
-            EasyList, EasyPrivacy, Fanboy’s Annoyance List, and Fanboy’s Social Blocking List.
-            These blocklists are processed by Privacy Browser into the following 22 sublists, which check resource requests in the order listed.</p>
+        <p>Privacy Browser enthält vier <a href="https://easylist.to/">gebräuchliche Filterlisten</a>, die auf der <a href="https://adblockplus.org/filters">Adblock-Syntax</a> basieren:
+            EasyList, EasyPrivacy, Fanboy’s Annoyance Filterliste und Fanboy’s Social Blocking Filterliste.
+            Diese werden in 22 Unter-Listen aufgeteilt, welche die Ressourcen-Zugriffe in der folgenden Reihenfolge überprüfen:</p>
 
         <ol>
-            <li>Main Whitelist</li>
-            <li>Final Whitelist</li>
-            <li>Domain Whitelist</li>
-            <li>Domain Initial Whitelist</li>
-            <li>Domain Final Whitelist</li>
-            <li>Third-Party Whitelist</li>
-            <li>Third-Party Domain Whitelist</li>
-            <li>Third-Party Domain Initial Whitelist</li>
-            <li>Main Blacklist</li>
-            <li>Initial Blacklist</li>
-            <li>Final Blacklist</li>
-            <li>Domain Blacklist</li>
-            <li>Domain Initial Blacklist</li>
-            <li>Domain Final Blacklist</li>
-            <li>Domain Regular Expression Blacklist</li>
-            <li>Third-Party Blacklist</li>
-            <li>Third-Party Initial Blacklist</li>
-            <li>Third-Party Domain Blacklist</li>
-            <li>Third-Party Domain Initial Blacklist</li>
-            <li>Third-Party Regular Expression Blacklist</li>
-            <li>Third-Party Domain Regular Expression Blacklist</li>
-            <li>Regular Expression Blacklist</li>
+            <li>Haupt-Positivliste</li>
+            <li>Positivliste (URL-Ende)</li>
+            <li>Domänen-Positivliste</li>
+            <li>Domänen-Positivliste (URL-Anfang)</li>
+            <li>Domänen-Positivliste (URL-Ende)</li>
+            <li>Drittanbieter-Positivliste</li>
+            <li>Drittanbieter-Domänen-Positivliste</li>
+            <li>Drittanbieter-Domänen-Positivliste (URL-Anfang)</li>
+            <li>Haupt-Negativliste</li>
+            <li>Negativliste (URL-Anfang)</li>
+            <li>Negativliste (URL-Ende)</li>
+            <li>Domänen-Negativliste</li>
+            <li>Domänen-Negativliste (URL-Anfang)</li>
+            <li>Domänen-Negativliste (URL-Ende)</li>
+            <li>Domänen-Negativliste mit regulären Ausdrücken</li>
+            <li>Drittanbieter-Negativliste</li>
+            <li>Drittanbieter-Negativliste (URL-Anfang)</li>
+            <li>Drittanbieter-Domänen-Negativliste</li>
+            <li>Drittanbieter-Domänen-Negativliste (URL-Anfang)</li>
+            <li>Drittanbieter-Negativliste mit regulären Ausdrücken</li>
+            <li>Drittanbieter-Domänen-Negativliste mit regulären Ausdrücken</li>
+            <li>Negativliste mit regulären Ausdrücken</li>
         </ol>
 
-        <p>Initial lists check against the beginning of the URL. Final lists check against the end of the URL. Domain lists only check against certain domains.
-            Third-party lists only apply if the root domain of the request is different than the root domain of the main URL.
-            Regular expression lists follow the <a href="https://en.wikipedia.org/wiki/Regular_expression">regular expression syntax</a>. Each sublist item has one or more entry.
-            In the case of domain sublists, the resource request is only checked against the item if the first entry matches the domain of the main URL.</p>
+        <p>Listen mit "(URL-Anfang)" prüfen gegen den Anfang einer URL, solche mit "(URL-Ende)" gegen das Ende der URL. Domänen-Listen prüfen gegen bestimmte Domains.
+            Drittanbieter-Listen greifen nur, wenn die Domain der Anfrage eine andere ist als die Domain der aufgerufenen URL.
+            Listen mit regulären Ausdrücken folgen der <a href="https://de.wikipedia.org/wiki/Reguläre_Ausdrücke">Syntax für reguläre Ausdrücke</a>. Jede Unter-Liste hat dabei einen oder mehrere Einträge.
+            Bei Domänen-Unterlisten werden die Ressourcen-Zugriffe nur dann überprüft, wenn der erste Eintrag der Domain der aufgerufenen URL entspricht.</p>
 
-        <p>Because of limitations in Android’s WebView, and to speed up processing of requests, Privacy Browser implements a simplified interpretation of the Adblock syntax.
-            This can sometimes lead to false positives, where resources are allowed or blocked in ways that weren’t intended by the original entry.
-            A more detailed description of how the blocklist entries are processed is available at <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
+        <p>Aufgrund von Einschränkungen in Android’s WebView und um die Geschwindigkeit von Anfragen zu steigern, verwendet Privacy Browser eine vereinfachte Auswertung der Adblock-Syntax.
+            Dies kann manchmal zu "false positives" führen, bei denen Ressourcen erlaubt oder blockiert werden, die in den originalen Einträgen anders intendiert wären.
+            Eine detailiertere Beschreibung, wie die Listen-Einträge abgearbeitet werden, ist unter <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a> verfügbar.</p>
 
-        <p>Privacy Browser has two additional blocklists,
-            one called <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a> that blocks trackers that EasyPrivacy allows,
-            and the other that blocks all third-party requests.
-            A request is only considered third-party if the base domain of the request is different than the base domain of the URL.
-            For example, if <code>www.website.com</code> loads a picture from <code>images.website.com</code>,
-            this is not blocked as a third-party request because they both share the same base domain of <code>website.com</code>.
-            Blocking all third-party requests increases privacy, but this blocklist is disabled by default because it breaks a large number of websites.</p>
+        <p>Privacy Browser hat zwei weitere Sperrlisten: <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a>, welche Tracker blockiert, die EasyPrivacy erlaubt,
+            und eine andere, die alle Drittanbieter-Anfragen blockiert.
+            Eine Anfrage wird dabei nur als Drittanbieter-Anfrage gewertet, wenn die Basis-Domain der Anfrage eine andere ist als die Basis-Domain der angefragten URL.
+            Lädt zum Beispiel die Seite <code>www.website.com</code> ein Bild von <code>images.website.com</code>, wird diese Anfrage nicht als Drittanbieter-Anfrage gewertet,
+            da die beiden Anfragen dieselbe Basis-Domain <code>website.com</code> haben.
+            Alle Drittanbieter-Anfragen zu blockieren verbessert zwar die Privatsphäre, diese Einstellung ist jedoch standardmäßig deaktiviert, da dadurch viele Webseiten verunstaltet werden können.</p>
     </body>
 </html>
\ No newline at end of file
index 937c7951f5b323563b7efb7a144207bad50c5024..848d6304209e2659402b18b6b7009d55d355501b 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/vpn_lock_blue_dark.png"> Connect with Confidence</h3>
+        <h3><img class="title" src="../shared_images/vpn_lock_blue_dark.png"> Verbindungen mit Vertrauen</h3>
 
-        <p>When visiting an encrypted URL (one that begins with HTTPS), the webserver uses an SSL certificate to both encrypt the information sent to the browser and to identify the server.
-            The purpose of the server identification is to prevent a machine located between the browser and the webserver from pretending to be the server and decrypting the information in transit.
-            This type of attack is known as a Man In The Middle (MITM) attack. SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
-            Android has a list of trusted certificate authorities, and will accept any of their certificates for any website.
-            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control, but in practice many governments and large corporations have been able to do so.</p>
+        <p>Wenn Sie verschlüsselte URLs (also solche, die mit HTTPS beginnen) besuchen, verwendet der Webserver ein SSL-Zertifikat,
+            um einerseits die zum Browser gesendeten Informationen zu verschlüsseln und andererseits um sich selbst zu identifizieren.
+                       Der Zweck der Server-Identifikation ist dabei, zu verhindern, dass ein Rechner zwischen Server und Ihrem Browser geschaltet werden kann,
+            der vorgibt der Server zu sein und die übertragenen Informationen auf dem Transportweg entschlüsseln oder verändern kann. Solche Angriffe werden als "Man-in-the-Middle-Atacken" (MITM) bezeichnet.
+                       SSL-Zertifikate werden von Zertifikats-Stellen generiert, d.h. Unternehmen, die die Identität eines Servers überprüfen und dafür (meist gegen Entgelt) ein Zertifikat ausstellen.
+                       Android beinhaltet eine Liste zuverlässiger Zertifikats-Stellen und akzeptiert jedes von einer solchen ausgestellte Zertifikat einer Webseite.
+                       Es wird dabei davon ausgegangen, dass eine Organisation kein SSL-Zertifikat für eine Domain beantragen kann, die nicht ihr gehört.
+            In der Praxis konnten dies jedoch bereits viele Regierungen und große Unternehmen tun.</p>
 
-        <p>Pinning an SSL certificate tells the browser that only one specific SSL certificate is to be trusted for a particular domain. Any other certificate, even if it is valid, will be rejected.</p>
+        <p>Mittels Zertifikats-Verankerung ("Pinning") kann Privacy Browser angewiesen werden, nur ein spezielles SSL-Zertifikat für eine Domäne zuzulassen.
+            Jedes andere Zertifikat - auch wenn dies gültig ist - wird in diesem Fall abgelehnt.</p>
 
         <p><img class="center21" src="images/pinned_mismatch.png"></p>
 
-        <p>SSL certificates expire on a specified date, so even pinned SSL certificates will legitimately need to be updated from time to time.
-            As a general rule, pinning SSL certificates probably isn’t needed in the majority of cases.
-            But for those who suspect that powerful organizations may be targeting them, SSL certificate pinning can detect and thwart a MITM attack.
-            Privacy Browser also has the ability to pin IP addresses.</p>
+        <p>SSL-Zertifikate laufen zu einem festgelegten Datum ab, sodass auch verankerte Zertifikate legitimerweise von Zeit zu Zeit aktualisiert werden müssen.
+                       In der Regel müssen SSL-Zertifikate in der Mehrzahl der Fälle nicht verankert werden. Für jene, die jedoch damit rechnen müssen, dass mächtige Organisationen auf sie abzielen,
+            kann das verankern von SSL-Zertifikaten Man-in-the-middle-Attacken aufdecken und ggf. vereiteln. Privacy Browser bietet auch die Möglichkeit, IP-Adressen zu verankern.</p>
 
         <p><img class="center21" src="images/pinned_ssl_certificate.png"></p>
-
-        <p>SSL certificates can be pinned in Domain Settings.
-            Besides protecting against MITM attacks, pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
-            To view the current website SSL certificate, tap on the favorite icon next to the URL bar.</p>
+        
+        <p>SSL-Zertifikate können in den Domänen-Einstellungen verankert werden.
+                       Neben dem Schutz gegen MITM-Attacken kann das Verankern von Zertifikaten auch für selbst-erzeugte Zertifikate genutzt werden (z.B. bei WLAN-Routern oder Access-Points).
+            In diesen Fällen werden die sonst üblichen Fehlermeldungen unterdrückt, wenn die Website des Geräts geladen wird.
+                       Um das aktuelle SSL-Zertifikat einer Webseite anzusehen, tippen Sie bitte auf das Lesezeichen-Icon neben der URL-Leiste.</p>
     </body>
 </html>
\ No newline at end of file
index 72cce3e99d98247eec728eab8644a099890df011..bcd69decaeb9d34c014fa6d765eca80c00c1f6b7 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
   Privacy Browser is free software: you can redistribute it and/or modify
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/vpn_lock_blue_light.png"> Connect with Confidence</h3>
+        <h3><img class="title" src="../shared_images/vpn_lock_blue_light.png"> Verbindungen mit Vertrauen</h3>
 
-        <p>When visiting an encrypted URL (one that begins with HTTPS), the webserver uses an SSL certificate to both encrypt the information sent to the browser and to identify the server.
-            The purpose of the server identification is to prevent a machine located between the browser and the webserver from pretending to be the server and decrypting the information in transit.
-            This type of attack is known as a Man In The Middle (MITM) attack. SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
-            Android has a list of trusted certificate authorities, and will accept any of their certificates for any website.
-            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control, but in practice many governments and large corporations have been able to do so.</p>
+        <p>Wenn Sie verschlüsselte URLs (also solche, die mit HTTPS beginnen) besuchen, verwendet der Webserver ein SSL-Zertifikat,
+            um einerseits die zum Browser gesendeten Informationen zu verschlüsseln und andererseits um sich selbst zu identifizieren.
+            Der Zweck der Server-Identifikation ist dabei, zu verhindern, dass ein Rechner zwischen Server und Ihrem Browser geschaltet werden kann,
+            der vorgibt der Server zu sein und die übertragenen Informationen auf dem Transportweg entschlüsseln oder verändern kann. Solche Angriffe werden als "Man-in-the-Middle-Atacken" (MITM) bezeichnet.
+            SSL-Zertifikate werden von Zertifikats-Stellen generiert, d.h. Unternehmen, die die Identität eines Servers überprüfen und dafür (meist gegen Entgelt) ein Zertifikat ausstellen.
+            Android beinhaltet eine Liste zuverlässiger Zertifikats-Stellen und akzeptiert jedes von einer solchen ausgestellte Zertifikat einer Webseite.
+            Es wird dabei davon ausgegangen, dass eine Organisation kein SSL-Zertifikat für eine Domain beantragen kann, die nicht ihr gehört.
+            In der Praxis konnten dies jedoch bereits viele Regierungen und große Unternehmen tun.</p>
 
-        <p>Pinning an SSL certificate tells the browser that only one specific SSL certificate is to be trusted for a particular domain. Any other certificate, even if it is valid, will be rejected.</p>
+        <p>Mittels Zertifikats-Verankerung ("Pinning") kann Privacy Browser angewiesen werden, nur ein spezielles SSL-Zertifikat für eine Domäne zuzulassen.
+            Jedes andere Zertifikat - auch wenn dies gültig ist - wird in diesem Fall abgelehnt.</p>
 
         <p><img class="center21" src="images/pinned_mismatch.png"></p>
 
-        <p>SSL certificates expire on a specified date, so even pinned SSL certificates will legitimately need to be updated from time to time.
-            As a general rule, pinning SSL certificates probably isn’t needed in the majority of cases.
-            But for those who suspect that powerful organizations may be targeting them, SSL certificate pinning can detect and thwart a MITM attack.
-            Privacy Browser also has the ability to pin IP addresses.</p>
+        <p>SSL-Zertifikate laufen zu einem festgelegten Datum ab, sodass auch verankerte Zertifikate legitimerweise von Zeit zu Zeit aktualisiert werden müssen.
+            In der Regel müssen SSL-Zertifikate in der Mehrzahl der Fälle nicht verankert werden. Für jene, die jedoch damit rechnen müssen, dass mächtige Organisationen auf sie abzielen,
+            kann das verankern von SSL-Zertifikaten Man-in-the-middle-Attacken aufdecken und ggf. vereiteln. Privacy Browser bietet auch die Möglichkeit, IP-Adressen zu verankern.</p>
 
         <p><img class="center21" src="images/pinned_ssl_certificate.png"></p>
 
-        <p>SSL certificates can be pinned in Domain Settings.
-            Besides protecting against MITM attacks, pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
-            To view the current website SSL certificate, tap on the favorite icon next to the URL bar.</p>
+        <p>SSL-Zertifikate können in den Domänen-Einstellungen verankert werden.
+            Neben dem Schutz gegen MITM-Attacken kann das Verankern von Zertifikaten auch für selbst-erzeugte Zertifikate genutzt werden (z.B. bei WLAN-Routern oder Access-Points).
+            In diesen Fällen werden die sonst üblichen Fehlermeldungen unterdrückt, wenn die Website des Geräts geladen wird.
+            Um das aktuelle SSL-Zertifikat einer Webseite anzusehen, tippen Sie bitte auf das Lesezeichen-Icon neben der URL-Leiste.</p>
     </body>
 </html>
\ No newline at end of file
index 7305ec0f6ea62f9a8f7fb94c243418ed8ee1c7b6..9daf83c7bd5061d5c4391869dab9f545756ec2b9 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/vpn_key_blue_dark.png"> Tor und seine Grenzen</h3>
 
-        <p>Faktoren, die in die Privatsphäre im Web eindringen wollen lassen sich hauptsächlich in zwei verschiedene Kategorien unterteilen:
-            Neugierige Behörden mit Zugriff auf Internetprovider und Megafirmen, die Soziale und Werbenetzwerke betreiben.
-            TOR (The Onion Router) ist nützlich, wenn es auf den Schutz der Privatsphäre vor neugierigen Behörden ankommt, aber nicht bei den Megafirmen.</p>
+        <p>Faktoren, die die Privatsphäre im Web einschränken wollen, lassen sich hauptsächlich in zwei verschiedene Kategorien unterteilen:
+            Neugierige Behörden mit Zugriff auf Internetprovider und grosse Konzerne, die "soziale" und Werbe-Netzwerke betreiben.
+            TOR (The Onion Router) ist nützlich, wenn es auf den Schutz der Privatsphäre vor neugierigen Behörden ankommt, nicht jedoch bei Konzernen bzw. Megafirmen.</p>
 
 
         <h3><img class="title" src="../shared_images/language_blue_dark.png"> Neugierige Behörden</h3>
 
-        <p>Oft spähen neugierige Behörden die Bürger aus, um Fehlverhalten und Menschenrechtsaktivitäten zu bestrafen.
-            Üblicherweise betreiben sie entweder die Internetprovider selber oder sie können die Provider dazu zwingen, Informationen über jede besuchte IP-Adresse und die zugehörigen Benutzer herauszugeben.
+        <p>Oft spähen neugierige Behörden Bürger aus, um Fehlverhalten und Menschenrechtsaktivitäten zu bestrafen.
+            Üblicherweise betreiben sie entweder die Internetprovider selbst oder sie können Provider dazu zwingen, Informationen über jede besuchte IP-Adresse und die zugehörigen Benutzer herauszugeben.
             TOR wurde entwickelt, um diese Eingriffe in die Privatsphäre zu bekämpfen, indem es die Daten verschlüsselt, die ein Nutzer sendet und sie durch viele verschiedene Server schleust,
             bevor sie die Zieladresse erreichen.
             Das bedeutet, dass kein individueller Internetprovider, Server oder Website sowohl die <a href="https://ipleak.net">IP-Adresse des Nutzers</a>
@@ -44,7 +46,7 @@
             Neugierige Behörden und die von ihnen kontrollierten Internetprovider können nur vermuten, welche Webserver ein Benutzer besucht, da sie letztendlich nur sehen, dass er TOR benutzt.
             In einigen Teilen der Welt könnte das Benutzen von TOR als illegale Aktivität ausgelegt werden ("wenn Du nichts zu verstecken hättest,
             würdest Du nicht Deinen Traffic vor uns verstecken") und Benutzer könnten bestraft werden, da die Regierung vermutet, sie würden etwas Untersagtes tun.
-            Also kann TOR hilfreich sein, ist jedoch kein Allheilmittel.</p>
+            Also kann TOR hilfreich sein, ein Allheilmittel ist es jedoch nicht.</p>
 
 
         <h3><img class="title" src="../shared_images/language_blue_dark.png"> Megafirmen</h3>
         <p>Wenn ein Benutzer sich mit einem Webserver verbindet, kann der Webserver seine IP-Adresse sehen.
             Obwohl es keine ausgereifte Methode ist, können IP-Adressen in physische Adressen umgewandelt werden - <a href="https://www.whatismyip.com/">mit erstaunlicher Genauigkeit</a>.
             Kleine Webserver nutzen normalerweise die IP-Adresse, um festzulegen, woher der Benutzer die Seite besucht. TOR ist eine gute Lösung, wenn man seinen Standort vor diesen Servern verstecken möchte.
-            Große Megafirmen, die Soziale Netzwerke und Werbenetzwerke betreiben nutzen jedoch richtige Profile an Informationen, um Benutzer über ihre Geräte und IP-Adressen hinaus zu tracken.
-            Diese Profile nutzen verschiedene Möglichkeiten an Techniken um Benutzer ausfindig zu machen, inklusive JavaScript, Cookies, Tracking-IDs und ein
+            Große Megafirmen, die "soziale" und Werbe-Netzwerke betreiben, nutzen jedoch Profile an Informationen, um Benutzer über ihre Geräte und IP-Adressen hinweg zu tracken.
+            Diese Profile nutzen verschiedene Techniken um Benutzer ausfindig zu machen, inklusive JavaScript, Cookies, Tracking-IDs und den sogenannten
             <a href="https://panopticlick.eff.org/">"Browser-Fingerabdruck" (fingerprinting)</a>.
-            Weil die große Mehrheit der Websites im Internet eine Werbung entweder von den großen Werbenetzwerken oder von eingebetteten Social-Media-Buttons mit ihrem zugewiesenen JavaScript lädt,
-            haben diese großen Megafirmen Profile von so gut wie jedem Internetnutzer angefertigt und verfolgen ihre Aktivitäten über zueinander unabhängige Seiten.</p>
+            Weil die große Mehrheit der Websites im Internet Werbung entweder von den großen Werbenetzwerken oder von eingebetteten Social-Media-Buttons mit ihrem zugewiesenen JavaScript lädt,
+            haben die großen Megafirmen Profile von so gut wie jedem Internetnutzer angefertigt und verfolgen deren Aktivitäten über zueinander unabhängige Seiten.</p>
 
-        <p>Sie verfolgen jede besuchte Seite, alles online Gekaufte, jede für Einkäufe genutzte Kreditkarte, jede Adresse,
-            an die Waren verschickt werden und die GPS-Metadaten von jedem ins Internet hochgeladene Foto.
-            Sie fertigen Profile an von Alter, Geschlecht, Beziehungsstatus, Adresse, politischen Ansichten, religiösen Ansichten, familiären Zuständen,
-            Anzahl der Haustiere und allem anderen was sie über einen Nutzer herausfinden können.
+        <p>Sie verfolgen jede besuchte Seite, Alles online Gekaufte, jede für Einkäufe genutzte Kreditkarte, jede Adresse,
+            an die Waren verschickt werden, und die GPS-Metadaten von jedem ins Internet hochgeladene Foto.
+            Sie fertigen Profile an, die Alter, Geschlecht, Beziehungsstatus, Adresse, politische und religiöse Ansichten, familiäre Umstände,
+            Anzahl der Haustiere und alles Andere, was sie über einen Nutzer herausfinden können, beinhalten.
             Sie kaufen sogar ganze Datenbanken mit Informationen über Kreditkartennutzungen in Geschäften auf, damit sie Offline-Einkaufsverhalten von Nutzern in ihren Profilen nachverfolgen können.
-            Weil sie bereits weitaus genauere Adressinformationen über einen Nutzer haben als eine IP-Adresse aussagt, bietet TOR keinen echten Schutz der Privatsphäre gegen Megafirmen.</p>
+            Weil sie bereits weitaus genauere Adressinformationen über einen Nutzer haben, als eine IP-Adresse aussagt, bietet TOR keinen echten Schutz der Privatsphäre gegen derartige Megafirmen.</p>
 
         <p>Der einzige und beste Schutz der Privatsphäre gegen Megafirmen ist es, mit deaktivieren JavaScript durchs Web zu surfen, gefolgt von geblockten Werbenetzwerken,
-            deaktivieren Cookies und DOM-Speicher und das Benutzen eines Browsers, der schwierig zu "fingerprinten" ist.</p>
+            deaktivierten Cookies und DOM-Speicher und das Benutzen eines Browsers, der schwierig zu "fingerprinten" ist.</p>
 
 
         <h3><img class="title" src="../shared_images/orbot_blue_dark.png"> Benutzen von TOR</h3>
 
-        <p>Neben den Einschränkungen kann TOR in bestimmten Situationen hilfreich sein.
-            Das TOR Project hat eine App für Android namens Orbot, die auf <a href="https://f-droid.org/repository/browse/?fdfilter=orbot&fdid=org.torproject.android">F-Droid</a>
-            verfügbar ist und überall sonst wo Privacy Browser angeboten wird. Privacy Browser hat eine Option um Orbot als Proxy zu benutzen.
-            Wenn diese aktiviert wird, hat Privacy Browser einen hellblauen Hintergrund bei der Adresszeile statt dem standardmäßigen Hellgrau.
-            Wenn Privacy Browsers Orbot-Proxy-Einstellung aktiviert ist, wird das Internet ausschließlich funktionieren, solange Orbot ausgeführt und mit dem TOR-Netzwerk verbunden wird.
-            Weil die Daten durch verschiedene Anlaufstellen geleitet werden ist das Nutzen von TOR oft weitaus langsamer als das direkte Verbinden mit dem Internet. </p>
+        <p>Neben den vorhin genannten Einschränkungen kann TOR in bestimmten Situationen hilfreich sein.
+            Das TOR Project bietet eine App für Android namens Orbot an, die auf <a href="https://f-droid.org/repository/browse/?fdfilter=orbot&fdid=org.torproject.android">F-Droid</a>
+            verfügbar ist und überall sonst, wo Privacy Browser angeboten wird. Privacy Browser hat eine Option, um Orbot als Proxy zu benutzen.
+            Wenn diese aktiviert wird, hat Privacy Browser einen hellblauen Hintergrund für die Adresszeile statt dem standardmäßigen Hellgrau.
+            Wenn Privacy Browsers Orbot-Proxy-Einstellung aktiviert ist, wird das Internet ausschließlich funktionieren, solange Orbot ausgeführt und mit dem TOR-Netzwerk verbunden ist.
+            Weil die Daten durch verschiedene Anlaufstellen geleitet werden, ist das Nutzen von TOR oft weitaus langsamer als bei einer direkten Verbindung mit dem Internet.</p>
 
         <img class="center" src="images/tor.png">
 
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Downloading Files Via Tor</h3>
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the Tor network, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn't have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.</p>
+
+        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Herunterladen von Dateien mittels TOR</h3>
+        <p>Wenn Orbot im Proxy-Modus genutzt wird, werden zwar beim Surfen mit dem Privacy Browser die Daten über das TOR-Netzwerk geroutet, nicht jedoch heruntergeladene Dateien.
+            Die Ursache dafür ist, dass Privacy Browser den in Android eingebauten Download-Manager verwendet, der keine Proxy-Optionen hat.
+            Benutzer, die auch Dateien über Orbot herunterladen möchten, müssen daher dessen VPN-Modus aktivieren.</p>
 
         <img class="center21" src="../shared_images/vpn_mode.png">
     </body>
index c69c203b27e311ad41cb9f3cffb387c30888fc89..0c1bb26e36a9af6dc84b3e21480b0b62b07d6a95 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/vpn_key_blue_light.png"> Tor und seine Grenzen</h3>
 
-        <p>Faktoren, die in die Privatsphäre im Web eindringen wollen lassen sich hauptsächlich in zwei verschiedene Kategorien unterteilen:
-            Neugierige Behörden mit Zugriff auf Internetprovider und Megafirmen, die Soziale und Werbenetzwerke betreiben.
-            TOR (The Onion Router) ist nützlich, wenn es auf den Schutz der Privatsphäre vor neugierigen Behörden ankommt, aber nicht bei den Megafirmen.</p>
+        <p>Faktoren, die die Privatsphäre im Web einschränken wollen, lassen sich hauptsächlich in zwei verschiedene Kategorien unterteilen:
+            Neugierige Behörden mit Zugriff auf Internetprovider und grosse Konzerne, die "soziale" und Werbe-Netzwerke betreiben.
+            TOR (The Onion Router) ist nützlich, wenn es auf den Schutz der Privatsphäre vor neugierigen Behörden ankommt, nicht jedoch bei Konzernen bzw. Megafirmen.</p>
 
 
         <h3><img class="title" src="../shared_images/language_blue_light.png"> Neugierige Behörden</h3>
 
-        <p>Oft spähen neugierige Behörden die Bürger aus, um Fehlverhalten und Menschenrechtsaktivitäten zu bestrafen.
-            Üblicherweise betreiben sie entweder die Internetprovider selber oder sie können die Provider dazu zwingen, Informationen über jede besuchte IP-Adresse und die zugehörigen Benutzer herauszugeben.
+        <p>Oft spähen neugierige Behörden Bürger aus, um Fehlverhalten und Menschenrechtsaktivitäten zu bestrafen.
+            Üblicherweise betreiben sie entweder die Internetprovider selbst oder sie können Provider dazu zwingen, Informationen über jede besuchte IP-Adresse und die zugehörigen Benutzer herauszugeben.
             TOR wurde entwickelt, um diese Eingriffe in die Privatsphäre zu bekämpfen, indem es die Daten verschlüsselt, die ein Nutzer sendet und sie durch viele verschiedene Server schleust,
             bevor sie die Zieladresse erreichen.
             Das bedeutet, dass kein individueller Internetprovider, Server oder Website sowohl die <a href="https://ipleak.net">IP-Adresse des Nutzers</a>
@@ -44,7 +46,7 @@
             Neugierige Behörden und die von ihnen kontrollierten Internetprovider können nur vermuten, welche Webserver ein Benutzer besucht, da sie letztendlich nur sehen, dass er TOR benutzt.
             In einigen Teilen der Welt könnte das Benutzen von TOR als illegale Aktivität ausgelegt werden ("wenn Du nichts zu verstecken hättest,
             würdest Du nicht Deinen Traffic vor uns verstecken") und Benutzer könnten bestraft werden, da die Regierung vermutet, sie würden etwas Untersagtes tun.
-            Also kann TOR hilfreich sein, ist jedoch kein Allheilmittel.</p>
+            Also kann TOR hilfreich sein, ein Allheilmittel ist es jedoch nicht.</p>
 
 
         <h3><img class="title" src="../shared_images/language_blue_light.png"> Megafirmen</h3>
         <p>Wenn ein Benutzer sich mit einem Webserver verbindet, kann der Webserver seine IP-Adresse sehen.
             Obwohl es keine ausgereifte Methode ist, können IP-Adressen in physische Adressen umgewandelt werden - <a href="https://www.whatismyip.com/">mit erstaunlicher Genauigkeit</a>.
             Kleine Webserver nutzen normalerweise die IP-Adresse, um festzulegen, woher der Benutzer die Seite besucht. TOR ist eine gute Lösung, wenn man seinen Standort vor diesen Servern verstecken möchte.
-            Große Megafirmen, die Soziale Netzwerke und Werbenetzwerke betreiben nutzen jedoch richtige Profile an Informationen, um Benutzer über ihre Geräte und IP-Adressen hinaus zu tracken.
-            Diese Profile nutzen verschiedene Möglichkeiten an Techniken um Benutzer ausfindig zu machen, inklusive JavaScript, Cookies, Tracking-IDs und ein
+            Große Megafirmen, die "soziale" und Werbe-Netzwerke betreiben, nutzen jedoch Profile an Informationen, um Benutzer über ihre Geräte und IP-Adressen hinweg zu tracken.
+            Diese Profile nutzen verschiedene Techniken um Benutzer ausfindig zu machen, inklusive JavaScript, Cookies, Tracking-IDs und den sogenannten
             <a href="https://panopticlick.eff.org/">"Browser-Fingerabdruck" (fingerprinting)</a>.
-            Weil die große Mehrheit der Websites im Internet eine Werbung entweder von den großen Werbenetzwerken oder von eingebetteten Social-Media-Buttons mit ihrem zugewiesenen JavaScript lädt,
-            haben diese großen Megafirmen Profile von so gut wie jedem Internetnutzer angefertigt und verfolgen ihre Aktivitäten über zueinander unabhängige Seiten.</p>
+            Weil die große Mehrheit der Websites im Internet Werbung entweder von den großen Werbenetzwerken oder von eingebetteten Social-Media-Buttons mit ihrem zugewiesenen JavaScript lädt,
+            haben die großen Megafirmen Profile von so gut wie jedem Internetnutzer angefertigt und verfolgen deren Aktivitäten über zueinander unabhängige Seiten.</p>
 
-        <p>Sie verfolgen jede besuchte Seite, alles online Gekaufte, jede für Einkäufe genutzte Kreditkarte, jede Adresse,
-            an die Waren verschickt werden und die GPS-Metadaten von jedem ins Internet hochgeladene Foto.
-            Sie fertigen Profile an von Alter, Geschlecht, Beziehungsstatus, Adresse, politischen Ansichten, religiösen Ansichten, familiären Zuständen,
-            Anzahl der Haustiere und allem anderen was sie über einen Nutzer herausfinden können.
+        <p>Sie verfolgen jede besuchte Seite, Alles online Gekaufte, jede für Einkäufe genutzte Kreditkarte, jede Adresse,
+            an die Waren verschickt werden, und die GPS-Metadaten von jedem ins Internet hochgeladene Foto.
+            Sie fertigen Profile an, die Alter, Geschlecht, Beziehungsstatus, Adresse, politische und religiöse Ansichten, familiäre Umstände,
+            Anzahl der Haustiere und alles Andere, was sie über einen Nutzer herausfinden können, beinhalten.
             Sie kaufen sogar ganze Datenbanken mit Informationen über Kreditkartennutzungen in Geschäften auf, damit sie Offline-Einkaufsverhalten von Nutzern in ihren Profilen nachverfolgen können.
-            Weil sie bereits weitaus genauere Adressinformationen über einen Nutzer haben als eine IP-Adresse aussagt, bietet TOR keinen echten Schutz der Privatsphäre gegen Megafirmen.</p>
+            Weil sie bereits weitaus genauere Adressinformationen über einen Nutzer haben, als eine IP-Adresse aussagt, bietet TOR keinen echten Schutz der Privatsphäre gegen derartige Megafirmen.</p>
 
         <p>Der einzige und beste Schutz der Privatsphäre gegen Megafirmen ist es, mit deaktivieren JavaScript durchs Web zu surfen, gefolgt von geblockten Werbenetzwerken,
-            deaktivieren Cookies und DOM-Speicher und das Benutzen eines Browsers, der schwierig zu "fingerprinten" ist.</p>
+            deaktivierten Cookies und DOM-Speicher und das Benutzen eines Browsers, der schwierig zu "fingerprinten" ist.</p>
 
 
         <h3><img class="title" src="../shared_images/orbot_blue_light.png"> Benutzen von TOR</h3>
 
-        <p>Neben den Einschränkungen kann TOR in bestimmten Situationen hilfreich sein.
-            Das TOR Project hat eine App für Android namens Orbot, die auf <a href="https://f-droid.org/repository/browse/?fdfilter=orbot&fdid=org.torproject.android">F-Droid</a>
-            verfügbar ist und überall sonst wo Privacy Browser angeboten wird. Privacy Browser hat eine Option um Orbot als Proxy zu benutzen.
-            Wenn diese aktiviert wird, hat Privacy Browser einen hellblauen Hintergrund bei der Adresszeile statt dem standardmäßigen Hellgrau.
-            Wenn Privacy Browsers Orbot-Proxy-Einstellung aktiviert ist, wird das Internet ausschließlich funktionieren, solange Orbot ausgeführt und mit dem TOR-Netzwerk verbunden wird.
-            Weil die Daten durch verschiedene Anlaufstellen geleitet werden ist das Nutzen von TOR oft weitaus langsamer als das direkte Verbinden mit dem Internet. </p>
+        <p>Neben den vorhin genannten Einschränkungen kann TOR in bestimmten Situationen hilfreich sein.
+            Das TOR Project bietet eine App für Android namens Orbot an, die auf <a href="https://f-droid.org/repository/browse/?fdfilter=orbot&fdid=org.torproject.android">F-Droid</a>
+            verfügbar ist und überall sonst, wo Privacy Browser angeboten wird. Privacy Browser hat eine Option, um Orbot als Proxy zu benutzen.
+            Wenn diese aktiviert wird, hat Privacy Browser einen hellblauen Hintergrund für die Adresszeile statt dem standardmäßigen Hellgrau.
+            Wenn Privacy Browsers Orbot-Proxy-Einstellung aktiviert ist, wird das Internet ausschließlich funktionieren, solange Orbot ausgeführt und mit dem TOR-Netzwerk verbunden ist.
+            Weil die Daten durch verschiedene Anlaufstellen geleitet werden, ist das Nutzen von TOR oft weitaus langsamer als bei einer direkten Verbindung mit dem Internet.</p>
 
         <img class="center" src="images/tor.png">
 
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Downloading Files Via Tor</h3>
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the Tor network, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn't have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.</p>
+
+        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Herunterladen von Dateien mittels TOR</h3>
+        <p>Wenn Orbot im Proxy-Modus genutzt wird, werden zwar beim Surfen mit dem Privacy Browser die Daten über das TOR-Netzwerk geroutet, nicht jedoch heruntergeladene Dateien.
+            Die Ursache dafür ist, dass Privacy Browser den in Android eingebauten Download-Manager verwendet, der keine Proxy-Optionen hat.
+            Benutzer, die auch Dateien über Orbot herunterladen möchten, müssen daher dessen VPN-Modus aktivieren.</p>
 
         <img class="center21" src="../shared_images/vpn_mode.png">
     </body>
index 70079102c8b14e38f5a2c6497587481b260ecfdf..496f29f6cc7e2513c5a88b699a9a820b78b4cf47 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/location_off_blue_dark.png"> Do Not Track</h3>
-
-        <p>A few years ago the W3C (World Wide Web Consortium) created a mechanism for browsers to inform web servers that they would not like to be tracked.
-            This is accomplished by including a <a href="https://en.wikipedia.org/wiki/Do_Not_Track">DNT (Do Not Track) header</a> with web requests.</p>
-
-        <p>The DNT header doesn't really provide any privacy because most web servers ignore it. For example, Yahoo, Google, Microsoft, and Facebook all ignore at least some DNT headers.</p>
+        <h3><img class="title" src="../shared_images/location_off_blue_dark.png"> Do-Not-Track</h3>
+
+               <p>Vor einigen Jahren wurde vom W3C (World Wide Web Consortium) ein Mechanismus für Internet-Browser entwickelt, der Webserver davon in Kenntnis setzen sollte,
+            dass deren Benutzer nicht getrackt werden wollen.
+                       Dies wird über den <a href="https://de.wikipedia.org/wiki/Do_Not_Track_(Software)">DNT-Header (Do-Not-Track-Header)</a> innerhalb von Ressourcen-Anfragen bewerkstelligt.</p>
+               
+               <p>Der DNT-Header bewirkt jedoch de facto so gut wie keine Privatsphäre, da er von den meisten Webservern schlicht ignoriert wird.
+            So ignorieren zum Beispiel mit Yahoo, Google, Microsoft und Facebook so gut wie alle grossen Internet-Anbieter zumindest einige DNT-Header.</p>
     </body>
 </html>
\ No newline at end of file
index 345372beb3cdef62b693a1ab2b13cab8e2fc1597..54795f1c33f2999bfd30dc9d031a33c1018aefe8 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     </head>
 
     <body>
-        <h3><img class="title" src="../shared_images/location_off_blue_light.png"> Do Not Track</h3>
+        <h3><img class="title" src="../shared_images/location_off_blue_light.png"> Do-Not-Track</h3>
 
-        <p>A few years ago the W3C (World Wide Web Consortium) created a mechanism for browsers to inform web servers that they would not like to be tracked.
-            This is accomplished by including a <a href="https://en.wikipedia.org/wiki/Do_Not_Track">DNT (Do Not Track) header</a> with web requests.</p>
+        <p>Vor einigen Jahren wurde vom W3C (World Wide Web Consortium) ein Mechanismus für Internet-Browser entwickelt, der Webserver davon in Kenntnis setzen sollte,
+            dass deren Benutzer nicht getrackt werden wollen.
+            Dies wird über den <a href="https://de.wikipedia.org/wiki/Do_Not_Track_(Software)">DNT-Header (Do-Not-Track-Header)</a> innerhalb von Ressourcen-Anfragen bewerkstelligt.</p>
 
-        <p>The DNT header doesn't really provide any privacy because most web servers ignore it. For example, Yahoo, Google, Microsoft, and Facebook all ignore at least some DNT headers.</p>
+        <p>Der DNT-Header bewirkt jedoch de facto so gut wie keine Privatsphäre, da er von den meisten Webservern schlicht ignoriert wird.
+            So ignorieren zum Beispiel mit Yahoo, Google, Microsoft und Facebook so gut wie alle grossen Internet-Anbieter zumindest einige DNT-Header.</p>
     </body>
 </html>
\ No newline at end of file
index 6f720c93a2a3bde760d33fa5805fa63bd00a39b5..4c64910b2f2a016346f8c3497e4d3afe993fed45 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
     <body>
         <h3><img class="title" src="../shared_images/devices_other_blue_dark.png"> Browser-Identifikation</h3>
-
-        <p>When web browsers connect to websites, they send a user agent, which identifies the browser and the rendering capabilities it possesses.
-            The web server can use this information to decide which version of the website to send to the browser.
-            For example, many websites have different versions for desktop and mobile browsers.</p>
-
-        <p>By default, Privacy Browser uses its own user agent, which is <code>PrivacyBrowser/1.0</code>. This sends a minimum of information to the web server.
-            Because web servers do not recognize this to be a mobile user agent, they typically display the desktop version of the site.</p>
-
-        <p>By comparison, WebView’s default user agent divulges a large amount of information about the hardware and software of the device.
-            On the <strong>Settings</strong> screen, selecting <strong>WebView Default</strong> as the <strong>User agent</strong> displays the user agent that will be sent.
-            The screenshot below shows a Pixel 2 XL running Android 9 with Android System WebView 72.0.3626.105 installed.
-            Most web servers will recognize this as a mobile browser and will display the mobile version of the site if they have one.</p>
+        
+        <p>Wenn sich Internet-Browser mit Webseiten verbinden, senden Sie automatisch den sog. "User-Agent", welcher den Browser und dessen Anzeige-Fähigkeiten ausweist.
+                       Der Webserver kann diese Informationen dann nutzen, um verschiedene Versionen der Webseite an unterschiedliche Browser auszuliefern.
+                       Zum Beispiel haben viele Internet-Seiten unterschiedliche Versionen für Desktop- und Mobil-Browser,
+            damit die Seiten in Anhängigkeit von der Displaygrösse möglichst optimal genutzt werden können.</p>
+
+               <p>In der Voreinstellung nutzt Privacy Browser seinen eigenen User-Agent, welcher <code>PrivacyBrowser/1.0</code> lautet.
+            Damit wird lediglich ein Minimum an Informationen an den jeweiligen Webserver gesendet.
+                       Da jedoch manche Webserver diesen User-Agent nicht als mobilen Browser erkennen, liefern sie ggf. die Desktop-Version der betreffenden Webseite aus.</p>
+               
+               <p>Im Vergleich dazu plaudert der Standard-User-Agent von WebView eine grosse Menge an Informationen über die Hard- und Software des genutzten Geräts aus.
+                       Wird auf der <strong>Einstellungen-Seite</strong> von Privacy Browser <strong>WebView-Standard</strong> als <strong>User-Agent</strong> ausgewählt,
+            wird der dadurch übermittelte User-Agent angezeigt.
+                       Der Screenshot unterhalb zeigt ein Pixel 2 XL mit Android 9 und Android WebView 72.0.3626.105.
+                       Die meisten Webserver erkennen diesen User-Agent als Mobil-Browser und liefern eine Mobil-Version der Seite aus, so eine solche existiert.</p>
 
         <img class="center21" src="images/user_agent.png">
 
-        <p>There is enough information in the user agent that sometimes only a few visitors to a website will be the same.
-            If the user agent is combined with another piece of non-unique identifying information, often it results in a unique fingerprint.
-            The Electronic Frontier Foundation created a tool called <a href="https://panopticlick.eff.org/">Panopticlick</a> to demonstrate how much information can be gleaned from these sources.
-            If this test is run with JavaScript enabled the amount of information that is disclosed increases greatly.
-            <a href="https://www.browserleaks.com">Browser Leaks</a> and <a href="https://amiunique.org/">Am I Unique</a> are also good sources of information on this topic.</p>
+               <p>Der User-Agent beinhaltet normalerweise genügend Informationen, dass nur wenige Besucher einer Webseite denselben haben.
+                       Wenn der User-Agent daher mit anderen nicht-eindeutigen Identifizierungs-Informationen kombiniert wird, kann dies ausreichen, um einen eindeutigen Fingerabdruck zu ergeben.
+                       Die Electronic Frontier Foundation hat das Werkzeug <a href="https://panopticlick.eff.org/">Panopticlick</a> geschaffen,
+            um zu zeigen, wie viele Informationen aus diesen Quellen gesammelt werden kann.
+                       Wenn dieser Test mit aktiviertem JavaScript absolviert wird, steigt die Menge der offengelegten Informationen drastisch an.
+                       <a href="https://www.browserleaks.com">Browser Leaks</a> und <a href="https://amiunique.org/">Am I Unique</a> sind ebenfalls gute Quellen für Informationen zu diesem Thema.</p>
 
         <img class="center" src="../en/images/panopticlick.png">
-
-        <p>There are several preset user agents that match common browsers and operating systems. For browser fingerprinting purposes, anything that is rare is easier to track.
-            If Privacy Browser becomes common and many people use <code>PrivacyBrowser/1.0</code> as their user agent, it will be a good choice for privacy.
-            Firefox or Chrome are the most common user agents, but they auto-update and their version numbers change so quickly that it is likely the user agents included in Privacy Browser
-            will often be out of step with the majority of user agents in the server logs.</p>
-
-        <p>Some websites <a href="https://www.stoutner.com/user-agent-problems/">do not function correctly</a> if they do not recognize the user agent.
-            Using domain settings to set the user agent to <strong>WebView Default</strong>, or another user agent that is commonly recognized, usually resolves the problem.
+        
+        <p>Privacy Browser bietet verschiedene Voreinstellungen für den User-Agent an, um sich als gebräuchliche Browser und Betriebssysteme auszugeben.
+                       Dabei gilt grundsätzlich: Je unüblicher der User-Agent ist, des einfacher ist das Tracking.
+                       Wenn Privacy Browser gebräuchlicher wird und viele Personen den User-Agent <code>PrivacyBrowser/1.0</code> nutzen, wird dies eine gute Wahl für die Privatsphäre sein.
+                       Firefox und Chrome sind aktuell die gebräuchlichsten Browser.
+            Da sie jedoch häufig aktualisiert werden und in deren User-Agent auch die jeweilige Browser-Version mitsenden, kann es sein,
+            dass die in Privacy Browser mitgelieferten User-Agents für Firefox und Chrome wiederum in den Server-Logs auffallen.</p>
+               
+               <p>Manche Websites <a href="https://www.stoutner.com/user-agent-problems/">funktionieren nicht korrekt</a>, wenn sie einen User-Agent nicht erkennen.
+                       Wird für derartige Webseiten in den Domänen-Einstellungen von Privacy Browser der User-Agent <strong>WebView Standard</strong> oder ein anderer gebräuchlicher User-Agent ausgewählt,
+            verschwinden diese Probleme meist.
             Androids WebView erlaubt keinen leeren User Agent. Wenn das der Fall ist, wird der Standard-User Agent an den Server gesandt.</p>
     </body>
 </html>
\ No newline at end of file
index 56e4c3d5c74fac5251d74894a93bc6d9411d31c0..0818ea9d81d3c2b1d0fa7b9545f734bf6a976229 100644 (file)
@@ -1,6 +1,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <body>
         <h3><img class="title" src="../shared_images/devices_other_blue_light.png"> Browser-Identifikation</h3>
 
-        <p>When web browsers connect to websites, they send a user agent, which identifies the browser and the rendering capabilities it possesses.
-            The web server can use this information to decide which version of the website to send to the browser.
-            For example, many websites have different versions for desktop and mobile browsers.</p>
+        <p>Wenn sich Internet-Browser mit Webseiten verbinden, senden Sie automatisch den sog. "User-Agent", welcher den Browser und dessen Anzeige-Fähigkeiten ausweist.
+            Der Webserver kann diese Informationen dann nutzen, um verschiedene Versionen der Webseite an unterschiedliche Browser auszuliefern.
+            Zum Beispiel haben viele Internet-Seiten unterschiedliche Versionen für Desktop- und Mobil-Browser,
+            damit die Seiten in Anhängigkeit von der Displaygrösse möglichst optimal genutzt werden können.</p>
 
-        <p>By default, Privacy Browser uses its own user agent, which is <code>PrivacyBrowser/1.0</code>. This sends a minimum of information to the web server.
-            Because web servers do not recognize this to be a mobile user agent, they typically display the desktop version of the site.</p>
+        <p>In der Voreinstellung nutzt Privacy Browser seinen eigenen User-Agent, welcher <code>PrivacyBrowser/1.0</code> lautet.
+            Damit wird lediglich ein Minimum an Informationen an den jeweiligen Webserver gesendet.
+            Da jedoch manche Webserver diesen User-Agent nicht als mobilen Browser erkennen, liefern sie ggf. die Desktop-Version der betreffenden Webseite aus.</p>
 
-        <p>By comparison, WebView’s default user agent divulges a large amount of information about the hardware and software of the device.
-            On the <strong>Settings</strong> screen, selecting <strong>WebView Default</strong> as the <strong>User agent</strong> displays the user agent that will be sent.
-            The screenshot below shows a Pixel 2 XL running Android 9 with Android System WebView 72.0.3626.105 installed.
-            Most web servers will recognize this as a mobile browser and will display the mobile version of the site if they have one.</p>
+        <p>Im Vergleich dazu plaudert der Standard-User-Agent von WebView eine grosse Menge an Informationen über die Hard- und Software des genutzten Geräts aus.
+            Wird auf der <strong>Einstellungen-Seite</strong> von Privacy Browser <strong>WebView-Standard</strong> als <strong>User-Agent</strong> ausgewählt,
+            wird der dadurch übermittelte User-Agent angezeigt.
+            Der Screenshot unterhalb zeigt ein Pixel 2 XL mit Android 9 und Android WebView 72.0.3626.105.
+            Die meisten Webserver erkennen diesen User-Agent als Mobil-Browser und liefern eine Mobil-Version der Seite aus, so eine solche existiert.</p>
 
         <img class="center21" src="images/user_agent.png">
 
-        <p>There is enough information in the user agent that sometimes only a few visitors to a website will be the same.
-            If the user agent is combined with another piece of non-unique identifying information, often it results in a unique fingerprint.
-            The Electronic Frontier Foundation created a tool called <a href="https://panopticlick.eff.org/">Panopticlick</a> to demonstrate how much information can be gleaned from these sources.
-            If this test is run with JavaScript enabled the amount of information that is disclosed increases greatly.
-            <a href="https://www.browserleaks.com">Browser Leaks</a> and <a href="https://amiunique.org/">Am I Unique</a> are also good sources of information on this topic.</p>
+        <p>Der User-Agent beinhaltet normalerweise genügend Informationen, dass nur wenige Besucher einer Webseite denselben haben.
+            Wenn der User-Agent daher mit anderen nicht-eindeutigen Identifizierungs-Informationen kombiniert wird, kann dies ausreichen, um einen eindeutigen Fingerabdruck zu ergeben.
+            Die Electronic Frontier Foundation hat das Werkzeug <a href="https://panopticlick.eff.org/">Panopticlick</a> geschaffen,
+            um zu zeigen, wie viele Informationen aus diesen Quellen gesammelt werden kann.
+            Wenn dieser Test mit aktiviertem JavaScript absolviert wird, steigt die Menge der offengelegten Informationen drastisch an.
+            <a href="https://www.browserleaks.com">Browser Leaks</a> und <a href="https://amiunique.org/">Am I Unique</a> sind ebenfalls gute Quellen für Informationen zu diesem Thema.</p>
 
         <img class="center" src="../en/images/panopticlick.png">
 
-        <p>There are several preset user agents that match common browsers and operating systems. For browser fingerprinting purposes, anything that is rare is easier to track.
-            If Privacy Browser becomes common and many people use <code>PrivacyBrowser/1.0</code> as their user agent, it will be a good choice for privacy.
-            Firefox or Chrome are the most common user agents, but they auto-update and their version numbers change so quickly that it is likely the user agents included in Privacy Browser
-            will often be out of step with the majority of user agents in the server logs.</p>
+        <p>Privacy Browser bietet verschiedene Voreinstellungen für den User-Agent an, um sich als gebräuchliche Browser und Betriebssysteme auszugeben.
+            Dabei gilt grundsätzlich: Je unüblicher der User-Agent ist, des einfacher ist das Tracking.
+            Wenn Privacy Browser gebräuchlicher wird und viele Personen den User-Agent <code>PrivacyBrowser/1.0</code> nutzen, wird dies eine gute Wahl für die Privatsphäre sein.
+            Firefox und Chrome sind aktuell die gebräuchlichsten Browser.
+            Da sie jedoch häufig aktualisiert werden und in deren User-Agent auch die jeweilige Browser-Version mitsenden, kann es sein,
+            dass die in Privacy Browser mitgelieferten User-Agents für Firefox und Chrome wiederum in den Server-Logs auffallen.</p>
 
-        <p>Some websites <a href="https://www.stoutner.com/user-agent-problems/">do not function correctly</a> if they do not recognize the user agent.
-            Using domain settings to set the user agent to <strong>WebView Default</strong>, or another user agent that is commonly recognized, usually resolves the problem.
+        <p>Manche Websites <a href="https://www.stoutner.com/user-agent-problems/">funktionieren nicht korrekt</a>, wenn sie einen User-Agent nicht erkennen.
+            Wird für derartige Webseiten in den Domänen-Einstellungen von Privacy Browser der User-Agent <strong>WebView Standard</strong> oder ein anderer gebräuchlicher User-Agent ausgewählt,
+            verschwinden diese Probleme meist.
             Androids WebView erlaubt keinen leeren User Agent. Wenn das der Fall ist, wird der Standard-User Agent an den Server gesandt.</p>
     </body>
 </html>
\ No newline at end of file
index 296d35677074ba57f1c9a5978d9d10f8d2fc84e9..0283e5b5b4fc5e2648ac212c0597eb7e6634a9b0 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 1a29f13904683f86d28060205958b25668b037f6..2a0b87a1dc5f4b8aa3c5a075936ce83a39adb89a 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_light.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
index 937c7951f5b323563b7efb7a144207bad50c5024..e729d6b22cd1700624cb136b7411e416b0c6851d 100644 (file)
 
         <p>When visiting an encrypted URL (one that begins with HTTPS), the webserver uses an SSL certificate to both encrypt the information sent to the browser and to identify the server.
             The purpose of the server identification is to prevent a machine located between the browser and the webserver from pretending to be the server and decrypting the information in transit.
-            This type of attack is known as a Man In The Middle (MITM) attack. SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
+            This type of attack is known as a Man In The Middle (MITM) attack.
+            SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
             Android has a list of trusted certificate authorities, and will accept any of their certificates for any website.
-            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control, but in practice many governments and large corporations have been able to do so.</p>
+            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control,
+            but in practice many governments and large corporations have been able to do so.</p>
 
         <p>Pinning an SSL certificate tells the browser that only one specific SSL certificate is to be trusted for a particular domain. Any other certificate, even if it is valid, will be rejected.</p>
 
@@ -44,7 +46,8 @@
         <p><img class="center21" src="images/pinned_ssl_certificate.png"></p>
 
         <p>SSL certificates can be pinned in Domain Settings.
-            Besides protecting against MITM attacks, pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
+            Besides protecting against MITM attacks,
+            pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
             To view the current website SSL certificate, tap on the favorite icon next to the URL bar.</p>
     </body>
 </html>
\ No newline at end of file
index 72cce3e99d98247eec728eab8644a099890df011..4dfb257e346b64fe5ee1c6eabd2729bfc9669c23 100644 (file)
 
         <p>When visiting an encrypted URL (one that begins with HTTPS), the webserver uses an SSL certificate to both encrypt the information sent to the browser and to identify the server.
             The purpose of the server identification is to prevent a machine located between the browser and the webserver from pretending to be the server and decrypting the information in transit.
-            This type of attack is known as a Man In The Middle (MITM) attack. SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
+            This type of attack is known as a Man In The Middle (MITM) attack.
+            SSL certificates are generated by certificate authorities: companies that verify a server’s identity and produce a certificate for a fee.
             Android has a list of trusted certificate authorities, and will accept any of their certificates for any website.
-            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control, but in practice many governments and large corporations have been able to do so.</p>
+            It isn’t supposed to be possible for an organization to acquire an SSL certificate for a domain they do not control,
+            but in practice many governments and large corporations have been able to do so.</p>
 
         <p>Pinning an SSL certificate tells the browser that only one specific SSL certificate is to be trusted for a particular domain. Any other certificate, even if it is valid, will be rejected.</p>
 
@@ -44,7 +46,8 @@
         <p><img class="center21" src="images/pinned_ssl_certificate.png"></p>
 
         <p>SSL certificates can be pinned in Domain Settings.
-            Besides protecting against MITM attacks, pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
+            Besides protecting against MITM attacks,
+            pinning a self-signed certificate for a device like a wireless router or access point will remove the error message that is normally presented every time its website is loaded.
             To view the current website SSL certificate, tap on the favorite icon next to the URL bar.</p>
     </body>
 </html>
\ No newline at end of file
index 3cef43b9681d0a8b32722060c13d395177b2a306..27318b7edb2fd27989d16594f2fd00933b30e1fb 100644 (file)
@@ -49,6 +49,7 @@
         <p>Navegador Privado está construido con las <a href="https://developer.android.com/jetpack/androidx/">librerías de AndroidX</a>
             y código del <a href="https://mvnrepository.com/artifact/com.google.android.material/material">repositorio de Google Material Maven</a>,
             que se publican bajo la <a href="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.</p>
+
         <p>El sabor o versión libre de Navegador Privado está construido con <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">anuncios de Firebase</a>,
             que se libera bajo la <a href="https://developer.android.com/studio/terms">Licencia del Android Software Development Kit</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 8f2770a2fec0c3616750f5a43ff655986617f137..97b70bf80171cd80c5f738e8659cea1f67d596ca 100644 (file)
@@ -49,6 +49,7 @@
         <p>Navegador Privado está construido con las <a href="https://developer.android.com/jetpack/androidx/">librerías de AndroidX</a>
             y código del <a href="https://mvnrepository.com/artifact/com.google.android.material/material">repositorio de Google Material Maven</a>,
             que se publican bajo la <a href="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.</p>
+
         <p>El sabor o versión libre de Navegador Privado está construido con <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">anuncios de Firebase</a>,
             que se libera bajo la <a href="https://developer.android.com/studio/terms">Licencia del Android Software Development Kit</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
index ef967d1d59138ecc150de09009eeb4119df8cc42..4e01d4fa8d3e926f6bbb6532f3e9e21fe62d36c4 100644 (file)
@@ -52,6 +52,7 @@
         <p>Privacy Browser è compilato utilizzando le <a href="https://developer.android.com/jetpack/androidx/">Librerie AndroidX</a>
             e il codice disponibile nella <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             entrambi rilasciati con <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.</p>
+
         <p>La versione gratuita di Privacy Browser è compilata con <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             che è rilasciato sotto la <a href="https://developer.android.com/studio/terms">Licenza Android Software Development Kit</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 361155ad6ae526bc6c662467bb134f7077a51aef..320d866835b1287d978cb6afe4ee28a1034ac380 100644 (file)
@@ -52,6 +52,7 @@
         <p>Privacy Browser è compilato utilizzando le <a href="https://developer.android.com/jetpack/androidx/">Librerie AndroidX</a>
             e il codice disponibile nella <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             entrambi rilasciati con <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.</p>
+
         <p>La versione gratuita di Privacy Browser è compilata con <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             che è rilasciato sotto la <a href="https://developer.android.com/studio/terms">Licenza Android Software Development Kit</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
index 9b60e92c0fe942f06b99fe8b133814eefb812db2..1ca17ea5d640f36f2b84f984e31c3c8aeb6084a6 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser создан на базе библиотек <a href="https://developer.android.com/jetpack/androidx/">AndroidX</a>
             и кодовой базы из репозитория <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven</a>,
             которые выпущены под лицензией <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.</p>
+
         <p>Бесплатный вариант Privacy Browser создан с помощью <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             выпущенной по лицензии <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 373b61f2ea3834642c990b73482c5cf7b72d5976..7f90a11b9e25ab1b942c1d7883585dbfae450cab 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser создан на базе библиотек <a href="https://developer.android.com/jetpack/androidx/">AndroidX</a>
             и кодовой базы из репозитория <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven</a>,
             которые выпущены под лицензией <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.</p>
+
         <p>Бесплатный вариант Privacy Browser создан с помощью <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             выпущенной по лицензии <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
diff --git a/app/src/main/assets/shared_images/tab_dark.png b/app/src/main/assets/shared_images/tab_dark.png
new file mode 100644 (file)
index 0000000..1509a09
Binary files /dev/null and b/app/src/main/assets/shared_images/tab_dark.png differ
diff --git a/app/src/main/assets/shared_images/tab_light.png b/app/src/main/assets/shared_images/tab_light.png
new file mode 100644 (file)
index 0000000..39c05d4
Binary files /dev/null and b/app/src/main/assets/shared_images/tab_light.png differ
index c852efefbca7e711c2477aea197fbc68fc54842e..627b822bf0856087db6357dfb6439adcaabdfa0a 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_dark.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_dark.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_dark.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_dark.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_dark.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_dark.png"> vertical_align_bottom.</p>
index 6bc97ec97afff386150e216ce4415ea65bc8a2d6..8876b9dcad499e407d8d83fa314f25460463b4ed 100644 (file)
@@ -47,6 +47,7 @@
         <p>Privacy Browser is built with the <a href="https://developer.android.com/jetpack/androidx/">AndroidX Libraries</a>
             and code from the <a href="https://mvnrepository.com/artifact/com.google.android.material/material">Google Material Maven repository</a>,
             which are released under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
+
         <p>The free flavor of Privacy Browser is built with <a href="https://mvnrepository.com/artifact/com.google.firebase/firebase-ads">Firebase Ads</a>,
             which is released under the <a href="https://developer.android.com/studio/terms">Android Software Development Kit License</a>.</p>
 
         <p><img class="icon" src="../shared_images/sort_light.png"> sort.</p>
         <p><img class="icon" src="../shared_images/style_light.png"> style.</p>
         <p><img class="icon" src="../shared_images/subtitles_light.png"> subtitles.</p>
+        <p><img class="icon" src="../shared_images/tab_dark.png"> tab.</p>
         <p><img class="icon" src="../shared_images/text_fields_light.png"> text_fields.</p>
         <p><img class="icon" src="../shared_images/thumbs_up_down_light.png"> thumbs_up_down.</p>
         <p><img class="icon" src="../shared_images/vertical_align_bottom_light.png"> vertical_align_bottom.</p>
index d84b9c49f1b536e66ede32b67216ce7e142ed6a1..3508b7521f3de43efec13ac42c3ca111abaabaa8 100644 (file)
@@ -56,8 +56,12 @@ public class AboutActivity extends AppCompatActivity {
         // Set the content view.
         setContentView(R.layout.about_coordinatorlayout);
 
-        // `SupportActionBar` from `android.support.v7.app.ActionBar` must be used until the minimum API is >= 21.
+        // Get handles for the views.
         Toolbar toolbar = findViewById(R.id.about_toolbar);
+        TabLayout aboutTabLayout = findViewById(R.id.about_tablayout);
+        ViewPager aboutViewPager = findViewById(R.id.about_viewpager);
+
+        // Set the action bar.  `SupportActionBar` must be used until the minimum API is >= 21.
         setSupportActionBar(toolbar);
 
         // Get a handle for the action bar.
@@ -70,16 +74,14 @@ public class AboutActivity extends AppCompatActivity {
         actionBar.setDisplayHomeAsUpEnabled(true);
 
         //  Setup the ViewPager.
-        ViewPager aboutViewPager = findViewById(R.id.about_viewpager);
-        aboutViewPager.setAdapter(new aboutPagerAdapter(getSupportFragmentManager()));
+        aboutViewPager.setAdapter(new AboutPagerAdapter(getSupportFragmentManager()));
 
-        // Setup the TabLayout and connect it to the ViewPager.
-        TabLayout aboutTabLayout = findViewById(R.id.about_tablayout);
+        // Connect the tab layout to the view pager.
         aboutTabLayout.setupWithViewPager(aboutViewPager);
     }
 
-    private class aboutPagerAdapter extends FragmentPagerAdapter {
-        private aboutPagerAdapter(FragmentManager fragmentManager) {
+    private class AboutPagerAdapter extends FragmentPagerAdapter {
+        private AboutPagerAdapter(FragmentManager fragmentManager) {
             // Run the default commands.
             super(fragmentManager);
         }
index 360f858d4c0d4de543033fd1fe4721b637bfedb0..d635cbc6a0b6d5296bd7dee083a78127f5e61361 100644 (file)
@@ -24,14 +24,11 @@ import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.sqlite.SQLiteCursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Typeface;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
 import android.os.Bundle;
 import android.util.SparseBooleanArray;
 import android.view.ActionMode;
@@ -93,8 +90,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     // `bookmarksCursor` is used in `onCreate()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`, `onMoveToFolder()`, `deleteBookmarkFolderContents()`,
     // `loadFolder()`, and `onDestroy()`.
-    // TODO This should be switched back to a `Cursor` after the release of 2.17.1.
-    private SQLiteCursor bookmarksCursor;
+    private Cursor bookmarksCursor;
 
     // `bookmarksCursorAdapter` is used in `onCreate(), `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`, `onMoveToFolder()`, and `onLoadFolder()`.
     private CursorAdapter bookmarksCursorAdapter;
@@ -338,8 +334,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         }
 
                         // Update the bookmarks cursor with the current contents of the bookmarks database.
-                        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-                        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+                        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
                         // Update the `ListView`.
                         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -385,8 +380,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         }
 
                         // Update the bookmarks cursor with the current contents of the bookmarks database.
-                        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-                        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+                        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
                         // Update the `ListView`.
                         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -447,8 +441,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         selectedBookmarksPositionsSparseBooleanArray = bookmarksListView.getCheckedItemPositions().clone();
 
                         // Update the bookmarks cursor with the current contents of the bookmarks database except for the specified database IDs.
-                        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-                        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, currentFolder);
+                        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, currentFolder);
 
                         // Update the list view.
                         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -467,8 +460,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                                             // The user pushed the `Undo` button.
                                             case Snackbar.Callback.DISMISS_EVENT_ACTION:
                                                 // Update the bookmarks cursor with the current contents of the bookmarks database, including the "deleted" bookmarks.
-                                                // TODO Change this back to a `Cursor` after 2.17.1 is released.
-                                                bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+                                                bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
                                                 // Update the list view.
                                                 bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -681,8 +673,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         bookmarksDatabaseHelper.createBookmark(bookmarkNameString, bookmarkUrlString, currentFolder, newBookmarkDisplayOrder, favoriteIconByteArray);
 
         // Update the bookmarks cursor with the current contents of this folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Update the `ListView`.
         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -743,8 +734,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         bookmarksDatabaseHelper.createFolder(folderNameString, currentFolder, folderIconByteArray);
 
         // Update the bookmarks cursor with the current contents of this folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Update the `ListView`.
         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -793,8 +783,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         contextualActionMode.finish();
 
         // Update the bookmarks cursor with the contents of the current folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Update the `ListView`.
         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -888,8 +877,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         }
 
         // Update the bookmarks cursor with the current contents of this folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Update the `ListView`.
         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -934,8 +922,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         }
 
         // Update the bookmarks cursor with the current contents of this folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Update the `ListView`.
         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
@@ -1039,16 +1026,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     private void loadFolder() {
         // Update bookmarks cursor with the contents of the bookmarks database for the current folder.
-        // TODO Change this back to a `Cursor` after 2.17.1 is released.
-        bookmarksCursor = (SQLiteCursor) bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
-
-        // TODO Remove after the release of 2.17.1.
-        if (Build.VERSION.SDK_INT >= 28) {
-            // Create a big cursor window.
-            CursorWindow bigCursorWindow = new CursorWindow("Big Cursor Window", 4194304);
-
-            bookmarksCursor.setWindow(bigCursorWindow);
-        }
+        bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
 
         // Setup a `CursorAdapter`.  `this` specifies the `Context`.  `false` disables `autoRequery`.
         bookmarksCursorAdapter = new CursorAdapter(this, bookmarksCursor, false) {
index c6e065b18391a39bbd92e453f30640a9f3d4f405..a174230d851af1cd9444184b5769d182a51f81ca 100644 (file)
@@ -103,13 +103,17 @@ import androidx.core.content.ContextCompat;
 import androidx.core.view.GravityCompat;
 import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+import androidx.viewpager.widget.ViewPager;
 
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.navigation.NavigationView;
 import com.google.android.material.snackbar.Snackbar;
 
+import com.google.android.material.tabs.TabLayout;
 import com.stoutner.privacybrowser.BuildConfig;
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.dialogs.AdConsentDialog;
@@ -124,6 +128,7 @@ import com.stoutner.privacybrowser.dialogs.HttpAuthenticationDialog;
 import com.stoutner.privacybrowser.dialogs.PinnedMismatchDialog;
 import com.stoutner.privacybrowser.dialogs.UrlHistoryDialog;
 import com.stoutner.privacybrowser.dialogs.ViewSslCertificateDialog;
+import com.stoutner.privacybrowser.fragments.WebViewTabFragment;
 import com.stoutner.privacybrowser.helpers.AdHelper;
 import com.stoutner.privacybrowser.helpers.BlockListHelper;
 import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper;
@@ -149,6 +154,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -156,8 +162,8 @@ import java.util.Set;
 // AppCompatActivity from android.support.v7.app.AppCompatActivity must be used to have access to the SupportActionBar until the minimum API is >= 21.
 public class MainWebViewActivity extends AppCompatActivity implements CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener,
         DownloadFileDialog.DownloadFileListener, DownloadImageDialog.DownloadImageListener, DownloadLocationPermissionDialog.DownloadLocationPermissionDialogListener, EditBookmarkDialog.EditBookmarkListener,
-        EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener, NavigationView.OnNavigationItemSelectedListener, PinnedMismatchDialog.PinnedMismatchListener,
-        SslCertificateErrorDialog.SslCertificateErrorListener, UrlHistoryDialog.UrlHistoryListener {
+        EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener, NavigationView.OnNavigationItemSelectedListener, WebViewTabFragment.NewTabListener,
+        PinnedMismatchDialog.PinnedMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener, UrlHistoryDialog.UrlHistoryListener {
 
     // `darkTheme` is public static so it can be accessed from everywhere.
     public static boolean darkTheme;
@@ -309,22 +315,19 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     private static FragmentManager fragmentManager;
 
 
+    // A handle for the activity is set in `onCreate()` and accessed in `WebViewPagerAdapter`.
+    private Activity activity;
+
     // `navigatingHistory` is used in `onCreate()`, `onNavigationItemSelected()`, `onSslMismatchBack()`, and `applyDomainSettings()`.
     private boolean navigatingHistory;
 
-    // `mainWebView` is used in `onCreate()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onRestart()`, `onCreateContextMenu()`, `findPreviousOnPage()`,
+    // The current WebView is used in `onCreate()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onRestart()`, `onCreateContextMenu()`, `findPreviousOnPage()`,
     // `findNextOnPage()`, `closeFindOnPage()`, `loadUrlFromTextBox()`, `onSslMismatchBack()`, and `applyProxyThroughOrbot()`.
-    private NestedScrollWebView mainWebView;
+    private NestedScrollWebView currentWebView;
 
     // `fullScreenVideoFrameLayout` is used in `onCreate()` and `onConfigurationChanged()`.
     private FrameLayout fullScreenVideoFrameLayout;
 
-    // `urlAppBarRelativeLayout` is used in `onCreate()` and `applyDomainSettings()`.
-    private RelativeLayout urlAppBarRelativeLayout;
-
-    // `favoriteIconImageView` is used in `onCreate()` and `applyDomainSettings()`
-    private ImageView favoriteIconImageView;
-
     // `cookieManager` is used in `onCreate()`, `onOptionsItemSelected()`, and `onNavigationItemSelected()`, `loadUrlFromTextBox()`, `onDownloadImage()`, `onDownloadFile()`, and `onRestart()`.
     private CookieManager cookieManager;
 
@@ -361,6 +364,22 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     // `refreshMenuItem` is used in `onCreate()` and `onCreateOptionsMenu()`.
     private MenuItem refreshMenuItem;
 
+    // The WebView pager adapter is used in `onCreate()`, `onResume()`, and `addTab()`.
+    private WebViewPagerAdapter webViewPagerAdapter;
+
+    // The navigation requests menu item is used in `onCreate()` and accessed from `WebViewPagerAdapter`.
+    private MenuItem navigationRequestsMenuItem;
+
+    // The blocklist helper is used in `onCreate()` and `WebViewPagerAdapter`.
+    BlockListHelper blockListHelper;
+
+    // The blocklists are populated in `onCreate()` and accessed from `WebViewPagerAdapter`.
+    private ArrayList<List<String[]>> easyList;
+    private ArrayList<List<String[]>> easyPrivacy;
+    private ArrayList<List<String[]>> fanboysAnnoyanceList;
+    private ArrayList<List<String[]>> fanboysSocialList;
+    private ArrayList<List<String[]>> ultraPrivacy;
+
     // The blocklist menu items are used in `onCreate()`, `onCreateOptionsMenu()`, and `onPrepareOptionsMenu()`.
     private MenuItem blocklistsMenuItem;
     private MenuItem easyListMenuItem;
@@ -487,7 +506,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     // `fileChooserCallback` is used in `onCreate()` and `onActivityResult()`.
     private ValueCallback<Uri[]> fileChooserCallback;
 
-    // The download strings are used in `onCreate()` and `onRequestPermissionResult()`.
+    // The download strings are used in `onCreate()`, `onRequestPermissionResult()` and `initializeWebView()`.
     private String downloadUrl;
     private String downloadContentDisposition;
     private long downloadContentLength;
@@ -499,7 +518,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     private ArrayAdapter<CharSequence> userAgentNamesArray;
     private String[] userAgentDataArray;
 
-    // The request codes are used in `onCreate()`, `onCreateContextMenu()`, `onCloseDownloadLocationPermissionDialog()`, and `onRequestPermissionResult()`.
+    // The request codes are used in `onCreate()`, `onCreateContextMenu()`, `onCloseDownloadLocationPermissionDialog()`, `onRequestPermissionResult()`, and `initializeWebView()`.
     private final int DOWNLOAD_FILE_REQUEST_CODE = 1;
     private final int DOWNLOAD_IMAGE_REQUEST_CODE = 2;
 
@@ -536,6 +555,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         setContentView(R.layout.main_framelayout);
 
         // Get handles for views, resources, and managers.
+        activity = this;
         Resources resources = getResources();
         fragmentManager = getSupportFragmentManager();
         inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -620,12 +640,32 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         // Register `orbotStatusBroadcastReceiver` on `this` context.
         this.registerReceiver(orbotStatusBroadcastReceiver, new IntentFilter("org.torproject.android.intent.action.STATUS"));
 
+        // Instantiate the block list helper.
+        blockListHelper = new BlockListHelper();
+
+        // Initialize the list of resource requests.
+        resourceRequests = new ArrayList<>();
+
+        // Parse the block lists.
+        easyList = blockListHelper.parseBlockList(getAssets(), "blocklists/easylist.txt");
+        easyPrivacy = blockListHelper.parseBlockList(getAssets(), "blocklists/easyprivacy.txt");
+        fanboysAnnoyanceList = blockListHelper.parseBlockList(getAssets(), "blocklists/fanboy-annoyance.txt");
+        fanboysSocialList = blockListHelper.parseBlockList(getAssets(), "blocklists/fanboy-social.txt");
+        ultraPrivacy = blockListHelper.parseBlockList(getAssets(), "blocklists/ultraprivacy.txt");
+
+        // Store the list versions.
+        easyListVersion = easyList.get(0).get(0)[0];
+        easyPrivacyVersion = easyPrivacy.get(0).get(0)[0];
+        fanboysAnnoyanceVersion = fanboysAnnoyanceList.get(0).get(0)[0];
+        fanboysSocialVersion = fanboysSocialList.get(0).get(0)[0];
+        ultraPrivacyVersion = ultraPrivacy.get(0).get(0)[0];
+
         // Get handles for views that need to be modified.
-        FrameLayout rootFrameLayout = findViewById(R.id.root_framelayout);
         DrawerLayout drawerLayout = findViewById(R.id.drawerlayout);
-        RelativeLayout mainContentRelativeLayout = findViewById(R.id.main_content_relativelayout);
+        final NavigationView navigationView = findViewById(R.id.navigationview);
+        TabLayout tabLayout = findViewById(R.id.tablayout);
         SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.swiperefreshlayout);
-        mainWebView = findViewById(R.id.main_webview);
+        ViewPager webViewPager = findViewById(R.id.webviewpager);
         bookmarksListView = findViewById(R.id.bookmarks_drawer_listview);
         bookmarksTitleTextView = findViewById(R.id.bookmarks_title_textview);
         FloatingActionButton launchBookmarksActivityFab = findViewById(R.id.launch_bookmarks_activity_fab);
@@ -633,8 +673,87 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         FloatingActionButton createBookmarkFab = findViewById(R.id.create_bookmark_fab);
         findOnPageEditText = findViewById(R.id.find_on_page_edittext);
         fullScreenVideoFrameLayout = findViewById(R.id.full_screen_video_framelayout);
-        urlAppBarRelativeLayout = findViewById(R.id.url_app_bar_relativelayout);
-        favoriteIconImageView = findViewById(R.id.favorite_icon);
+
+        // Listen for touches on the navigation menu.
+        navigationView.setNavigationItemSelectedListener(this);
+
+        // Get handles for the navigation menu and the back and forward menu items.  The menu is zero-based.
+        final Menu navigationMenu = navigationView.getMenu();
+        final MenuItem navigationCloseTabMenuItem = navigationMenu.getItem(0);
+        final MenuItem navigationBackMenuItem = navigationMenu.getItem(3);
+        final MenuItem navigationForwardMenuItem = navigationMenu.getItem(4);
+        final MenuItem navigationHistoryMenuItem = navigationMenu.getItem(5);
+        navigationRequestsMenuItem = navigationMenu.getItem(6);
+
+        // Initialize the web view pager adapter.
+        webViewPagerAdapter = new WebViewPagerAdapter(fragmentManager);
+
+        // Set the pager adapter on the web view pager.
+        webViewPager.setAdapter(webViewPagerAdapter);
+
+        // Store up to 100 tabs in memory.
+        webViewPager.setOffscreenPageLimit(100);
+
+        // Update the web view pager every time a tab is modified.
+        webViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+                // Do nothing.
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                // TODO.  Consider using an array of the WebViews.
+                // Get the current WebView fragment.  Instantiate item returns the current item if it already exists.
+                Fragment webViewFragment = (Fragment) webViewPagerAdapter.instantiateItem(webViewPager, position);
+
+                // Store the current WebView.
+                currentWebView = (NestedScrollWebView) webViewFragment.getView();
+
+                // Select the corresponding tab if it does not match the currently selected page.  This will happen if the page was scrolled via swiping in the view pager.
+                if (tabLayout.getSelectedTabPosition() != position) {
+                    // Get a handle for the corresponding tab.
+                    TabLayout.Tab correspondingTab = tabLayout.getTabAt(position);
+
+                    // Assert that the corresponding tab is not null.
+                    assert correspondingTab != null;
+
+                    // Select the corresponding tab.
+                    correspondingTab.select();
+                }
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+                // Do nothing.
+            }
+        });
+
+        // Display the View SSL Certificate dialog when the currently selected tab is reselected.
+        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                // Select the same page in the view pager.
+                webViewPager.setCurrentItem(tab.getPosition());
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+                // Do nothing.
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+                // Instantiate the View SSL Certificate dialog.
+                DialogFragment viewSslCertificateDialogFragment = new ViewSslCertificateDialog();
+
+                // Display the View SSL Certificate dialog.
+                viewSslCertificateDialogFragment.show(getSupportFragmentManager(), getString(R.string.view_ssl_certificate));
+            }
+        });
+
+        // Add the first tab.
+        webViewPagerAdapter.addPage();
 
         // Set the bookmarks drawer resources according to the theme.  This can't be done in the layout due to compatibility issues with the `DrawerLayout` support widget.
         if (darkTheme) {
@@ -675,95 +794,6 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             createBookmarkDialog.show(fragmentManager, resources.getString(R.string.create_bookmark));
         });
 
-        // Create a double-tap listener to toggle full-screen mode.
-        final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
-            // Override `onDoubleTap()`.  All other events are handled using the default settings.
-            @Override
-            public boolean onDoubleTap(MotionEvent event) {
-                if (fullScreenBrowsingModeEnabled) {  // Only process the double-tap if full screen browsing mode is enabled.
-                    // Toggle the full screen browsing mode tracker.
-                    inFullScreenBrowsingMode = !inFullScreenBrowsingMode;
-
-                    // Toggle the full screen browsing mode.
-                    if (inFullScreenBrowsingMode) {  // Switch to full screen mode.
-                        // Hide the app bar if specified.
-                        if (hideAppBar) {
-                            actionBar.hide();
-                        }
-
-                        // Hide the banner ad in the free flavor.
-                        if (BuildConfig.FLAVOR.contentEquals("free")) {
-                            AdHelper.hideAd(findViewById(R.id.adview));
-                        }
-
-                        // Remove the translucent status flag.  This is necessary so the root frame layout can fill the entire screen.
-                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-
-                        /* Hide the system bars.
-                         * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
-                         * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN makes the root frame layout fill the area that is normally reserved for the status bar.
-                         * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
-                         * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically re-hides them after they are shown.
-                         */
-                        rootFrameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
-                                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
-                    } else {  // Switch to normal viewing mode.
-                        // Show the app bar.
-                        actionBar.show();
-
-                        // Show the banner ad in the free flavor.
-                        if (BuildConfig.FLAVOR.contentEquals("free")) {
-                            // Reload the ad.
-                            AdHelper.loadAd(findViewById(R.id.adview), getApplicationContext(), getString(R.string.ad_unit_id));
-                        }
-
-                        // Remove the `SYSTEM_UI` flags from the root frame layout.
-                        rootFrameLayout.setSystemUiVisibility(0);
-
-                        // Add the translucent status flag.
-                        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-                    }
-
-                    // Consume the double-tap.
-                    return true;
-                } else { // Do not consume the double-tap because full screen browsing mode is disabled.
-                    return false;
-                }
-            }
-        });
-
-        // Pass all touch events on `mainWebView` through `gestureDetector` to check for double-taps.
-        mainWebView.setOnTouchListener((View view, MotionEvent event) -> {
-            // Call `performClick()` on the view, which is required for accessibility.
-            view.performClick();
-
-            // Send the `event` to `gestureDetector`.
-            return gestureDetector.onTouchEvent(event);
-        });
-
-        // Update `findOnPageCountTextView`.
-        mainWebView.setFindListener(new WebView.FindListener() {
-            // Get a handle for `findOnPageCountTextView`.
-            final TextView findOnPageCountTextView = findViewById(R.id.find_on_page_count_textview);
-
-            @Override
-            public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting) {
-                if ((isDoneCounting) && (numberOfMatches == 0)) {  // There are no matches.
-                    // Set `findOnPageCountTextView` to `0/0`.
-                    findOnPageCountTextView.setText(R.string.zero_of_zero);
-                } else if (isDoneCounting) {  // There are matches.
-                    // `activeMatchOrdinal` is zero-based.
-                    int activeMatch = activeMatchOrdinal + 1;
-
-                    // Build the match string.
-                    String matchString = activeMatch + "/" + numberOfMatches;
-
-                    // Set `findOnPageCountTextView`.
-                    findOnPageCountTextView.setText(matchString);
-                }
-            }
-        });
-
         // Search for the string on the page whenever a character changes in the `findOnPageEditText`.
         findOnPageEditText.addTextChangedListener(new TextWatcher() {
             @Override
@@ -779,7 +809,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             @Override
             public void afterTextChanged(Editable s) {
                 // Search for the text in `mainWebView`.
-                mainWebView.findAllAsync(findOnPageEditText.getText().toString());
+                currentWebView.findAllAsync(findOnPageEditText.getText().toString());
             }
         });
 
@@ -787,7 +817,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         findOnPageEditText.setOnKeyListener((v, keyCode, event) -> {
             if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {  // The `enter` key was pressed.
                 // Hide the soft keyboard.  `0` indicates no additional flags.
-                inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0);
+                inputMethodManager.hideSoftInputFromWindow(currentWebView.getWindowToken(), 0);
 
                 // Consume the event.
                 return true;
@@ -798,7 +828,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         });
 
         // Implement swipe to refresh.
-        swipeRefreshLayout.setOnRefreshListener(() -> mainWebView.reload());
+        swipeRefreshLayout.setOnRefreshListener(() -> currentWebView.reload());
 
         // The swipe to refresh circle doesn't always hide itself completely unless it is moved up 10 pixels.
         swipeRefreshLayout.setProgressViewOffset(false, swipeRefreshLayout.getProgressViewStartOffset() - 10, swipeRefreshLayout.getProgressViewEndOffset());
@@ -815,17 +845,6 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         drawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.navigation_drawer));
         drawerLayout.setDrawerTitle(GravityCompat.END, getString(R.string.bookmarks));
 
-        // Listen for touches on the navigation menu.
-        final NavigationView navigationView = findViewById(R.id.navigationview);
-        navigationView.setNavigationItemSelectedListener(this);
-
-        // Get handles for `navigationMenu` and the back and forward menu items.  The menu is zero-based, so items 1, 2, and 3 are the second, third, and fourth entries in the menu.
-        final Menu navigationMenu = navigationView.getMenu();
-        final MenuItem navigationBackMenuItem = navigationMenu.getItem(1);
-        final MenuItem navigationForwardMenuItem = navigationMenu.getItem(2);
-        final MenuItem navigationHistoryMenuItem = navigationMenu.getItem(3);
-        final MenuItem navigationRequestsMenuItem = navigationMenu.getItem(4);
-
         // Initialize the bookmarks database helper.  The `0` specifies a database version, but that is ignored and set instead using a constant in `BookmarksDatabaseHelper`.
         bookmarksDatabaseHelper = new BookmarksDatabaseHelper(this, null, null, 0);
 
@@ -929,18 +948,19 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                         bookmarksHeaderTextView.setPadding(drawerHeaderPaddingLeftAndRight, drawerHeaderPaddingTop, drawerHeaderPaddingLeftAndRight, drawerHeaderPaddingBottom);
                     }
 
-                    // Update the back, forward, history, and requests menu items.
-                    navigationBackMenuItem.setEnabled(mainWebView.canGoBack());
-                    navigationForwardMenuItem.setEnabled(mainWebView.canGoForward());
-                    navigationHistoryMenuItem.setEnabled((mainWebView.canGoBack() || mainWebView.canGoForward()));
+                    // Update the navigation menu items.
+                    navigationCloseTabMenuItem.setEnabled(tabLayout.getTabCount() > 1);
+                    navigationBackMenuItem.setEnabled(currentWebView.canGoBack());
+                    navigationForwardMenuItem.setEnabled(currentWebView.canGoForward());
+                    navigationHistoryMenuItem.setEnabled((currentWebView.canGoBack() || currentWebView.canGoForward()));
                     navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
 
                     // Hide the keyboard (if displayed).
-                    inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0);
+                    inputMethodManager.hideSoftInputFromWindow(currentWebView.getWindowToken(), 0);
 
                     // Clear the focus from from the URL text box and the WebView.  This removes any text selection markers and context menus, which otherwise draw above the open drawers.
                     urlTextBox.clearFocus();
-                    mainWebView.clearFocus();
+                    currentWebView.clearFocus();
                 }
             }
         });
@@ -948,4112 +968,4390 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         // Create the hamburger icon at the start of the AppBar.
         actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open_navigation_drawer, R.string.close_navigation_drawer);
 
-        // Get a handle for the progress bar.
-        final ProgressBar progressBar = findViewById(R.id.progress_bar);
+        // Initialize cookieManager.
+        cookieManager = CookieManager.getInstance();
 
-        mainWebView.setWebChromeClient(new WebChromeClient() {
-            // Update the progress bar when a page is loading.
-            @Override
-            public void onProgressChanged(WebView view, int progress) {
-                // Inject the night mode CSS if night mode is enabled.
-                if (nightMode) {
-                    // `background-color: #212121` sets the background to be dark gray.  `color: #BDBDBD` sets the text color to be light gray.  `box-shadow: none` removes a lower underline on links
-                    // used by WordPress.  `text-decoration: none` removes all text underlines.  `text-shadow: none` removes text shadows, which usually have a hard coded color.
-                    // `border: none` removes all borders, which can also be used to underline text.  `a {color: #1565C0}` sets links to be a dark blue.
-                    // `::selection {background: #0D47A1}' sets the text selection highlight color to be a dark blue. `!important` takes precedent over any existing sub-settings.
-                    mainWebView.evaluateJavascript("(function() {var parent = document.getElementsByTagName('head').item(0); var style = document.createElement('style'); style.type = 'text/css'; " +
-                            "style.innerHTML = '* {background-color: #212121 !important; color: #BDBDBD !important; box-shadow: none !important; text-decoration: none !important;" +
-                            "text-shadow: none !important; border: none !important;} a {color: #1565C0 !important;} ::selection {background: #0D47A1 !important;}'; parent.appendChild(style)})()", value -> {
-                                // Initialize a handler to display `mainWebView`.
-                                Handler displayWebViewHandler = new Handler();
-
-                                // Setup a runnable to display `mainWebView` after a delay to allow the CSS to be applied.
-                                Runnable displayWebViewRunnable = () -> {
-                                    // Only display `mainWebView` if the progress bar is gone.  This prevents the display of the `WebView` while it is still loading.
-                                    if (progressBar.getVisibility() == View.GONE) {
-                                        mainWebView.setVisibility(View.VISIBLE);
-                                    }
-                                };
-
-                                // Displaying of `mainWebView` after 500 milliseconds.
-                                displayWebViewHandler.postDelayed(displayWebViewRunnable, 500);
-                            });
-                }
+        // Replace the header that `WebView` creates for `X-Requested-With` with a null value.  The default value is the application ID (com.stoutner.privacybrowser.standard).
+        customHeaders.put("X-Requested-With", "");
 
-                // Update the progress bar.
-                progressBar.setProgress(progress);
+        // Initialize the default preference values the first time the program is run.  `false` keeps this command from resetting any current preferences back to default.
+        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
 
-                // Set the visibility of the progress bar.
-                if (progress < 100) {
-                    // Show the progress bar.
-                    progressBar.setVisibility(View.VISIBLE);
-                } else {
-                    // Hide the progress bar.
-                    progressBar.setVisibility(View.GONE);
+        // Get a handle for the `Runtime`.
+        privacyBrowserRuntime = Runtime.getRuntime();
 
-                    // Display `mainWebView` if night mode is disabled.
-                    // Because of a race condition between `applyDomainSettings` and `onPageStarted`, when night mode is set by domain settings the `WebView` may be hidden even if night mode is not
-                    // currently enabled.
-                    if (!nightMode) {
-                        mainWebView.setVisibility(View.VISIBLE);
-                    }
+        // Store the application's private data directory.
+        privateDataDirectoryString = getApplicationInfo().dataDir;
+        // `dataDir` will vary, but will be something like `/data/user/0/com.stoutner.privacybrowser.standard`, which links to `/data/data/com.stoutner.privacybrowser.standard`.
 
-                    //Stop the swipe to refresh indicator if it is running
-                    swipeRefreshLayout.setRefreshing(false);
-                }
-            }
+        // Initialize `inFullScreenBrowsingMode`, which is always false at this point because Privacy Browser never starts in full screen browsing mode.
+        inFullScreenBrowsingMode = false;
 
-            // Set the favorite icon when it changes.
-            @Override
-            public void onReceivedIcon(WebView view, Bitmap icon) {
-                // Only update the favorite icon if the website has finished loading.
-                if (progressBar.getVisibility() == View.GONE) {
-                    // Save a copy of the favorite icon.
-                    favoriteIconBitmap = icon;
+        // Initialize the privacy settings variables.
+        javaScriptEnabled = false;
+        firstPartyCookiesEnabled = false;
+        thirdPartyCookiesEnabled = false;
+        domStorageEnabled = false;
+        saveFormDataEnabled = false;  // Form data can be removed once the minimum API >= 26.
+        nightMode = false;
 
-                    // Place the favorite icon in the appBar.
-                    favoriteIconImageView.setImageBitmap(Bitmap.createScaledBitmap(icon, 64, 64, true));
-                }
-            }
+        // Store the default user agent.
+        // TODO webViewDefaultUserAgent = mainWebView.getSettings().getUserAgentString();
 
-            // Save a copy of the title when it changes.
-            @Override
-            public void onReceivedTitle(WebView view, String title) {
-                // Save a copy of the title.
-                webViewTitle = title;
-            }
+        // Initialize the WebView title.
+        webViewTitle = getString(R.string.no_title);
 
-            // Enter full screen video.
-            @Override
-            public void onShowCustomView(View video, CustomViewCallback callback) {
-                // Set the full screen video flag.
-                displayingFullScreenVideo = true;
+        // Initialize the favorite icon bitmap.  `ContextCompat` must be used until API >= 21.
+        Drawable favoriteIconDrawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.world);
+        BitmapDrawable favoriteIconBitmapDrawable = (BitmapDrawable) favoriteIconDrawable;
+        assert favoriteIconBitmapDrawable != null;
+        favoriteIconDefaultBitmap = favoriteIconBitmapDrawable.getBitmap();
 
-                // Pause the ad if this is the free flavor.
-                if (BuildConfig.FLAVOR.contentEquals("free")) {
-                    // The AdView is destroyed and recreated, which changes the ID, every time it is reloaded to handle possible rotations.
-                    AdHelper.pauseAd(findViewById(R.id.adview));
-                }
+        // If the favorite icon is null, load the default.
+        if (favoriteIconBitmap == null) {
+            favoriteIconBitmap = favoriteIconDefaultBitmap;
+        }
 
-                // Hide the keyboard.
-                inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0);
+        // Initialize the user agent array adapter and string array.
+        userAgentNamesArray = ArrayAdapter.createFromResource(this, R.array.user_agent_names, R.layout.spinner_item);
+        userAgentDataArray = resources.getStringArray(R.array.user_agent_data);
 
-                // Hide the main content relative layout.
-                mainContentRelativeLayout.setVisibility(View.GONE);
+        // Get the intent that started the app.
+        Intent launchingIntent = getIntent();
 
-                // Remove the translucent status bar overlay on the `Drawer Layout`, which is special and needs its own command.
-                drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        // Get the information from the intent.
+        String launchingIntentAction = launchingIntent.getAction();
+        Uri launchingIntentUriData = launchingIntent.getData();
 
-                // Remove the translucent status flag.  This is necessary so the root frame layout can fill the entire screen.
-                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+        // If the intent action is a web search, perform the search.
+        if ((launchingIntentAction != null) && launchingIntentAction.equals(Intent.ACTION_WEB_SEARCH)) {
+            // Create an encoded URL string.
+            String encodedUrlString;
 
-                /* Hide the system bars.
-                 * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
-                 * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN makes the root frame layout fill the area that is normally reserved for the status bar.
-                 * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
-                 * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically re-hides them after they are shown.
-                 */
-                rootFrameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
-                        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
-
-                // Disable the sliding drawers.
-                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
-
-                // Add the video view to the full screen video frame layout.
-                fullScreenVideoFrameLayout.addView(video);
-
-                // Show the full screen video frame layout.
-                fullScreenVideoFrameLayout.setVisibility(View.VISIBLE);
+            // Sanitize the search input and convert it to a search.
+            try {
+                encodedUrlString = URLEncoder.encode(launchingIntent.getStringExtra(SearchManager.QUERY), "UTF-8");
+            } catch (UnsupportedEncodingException exception) {
+                encodedUrlString = "";
             }
 
-            // Exit full screen video.
-            @Override
-            public void onHideCustomView() {
-                // Unset the full screen video flag.
-                displayingFullScreenVideo = false;
-
-                // Remove all the views from the full screen video frame layout.
-                fullScreenVideoFrameLayout.removeAllViews();
-
-                // Hide the full screen video frame layout.
-                fullScreenVideoFrameLayout.setVisibility(View.GONE);
+            // Add the base search URL.
+            formattedUrlString = searchURL + encodedUrlString;
+        } else if (launchingIntentUriData != null){  // Check to see if the intent contains a new URL.
+            // Set the formatted URL string.
+            formattedUrlString = launchingIntentUriData.toString();
+        }
+    }
 
-                // Enable the sliding drawers.
-                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
+    @Override
+    protected void onNewIntent(Intent intent) {
+        // Sets the new intent as the activity intent, so that any future `getIntent()`s pick up this one instead of creating a new activity.
+        setIntent(intent);
 
-                // Show the main content relative layout.
-                mainContentRelativeLayout.setVisibility(View.VISIBLE);
+        // Get the information from the intent.
+        String intentAction = intent.getAction();
+        Uri intentUriData = intent.getData();
 
-                // Apply the appropriate full screen mode the `SYSTEM_UI` flags.
-                if (fullScreenBrowsingModeEnabled && inFullScreenBrowsingMode) {  // Privacy Browser is currently in full screen browsing mode.
-                    // Hide the app bar if specified.
-                    if (hideAppBar) {
-                        actionBar.hide();
-                    }
+        // If the intent action is a web search, perform the search.
+        if ((intentAction != null) && intentAction.equals(Intent.ACTION_WEB_SEARCH)) {
+            // Create an encoded URL string.
+            String encodedUrlString;
 
-                    // Hide the banner ad in the free flavor.
-                    if (BuildConfig.FLAVOR.contentEquals("free")) {
-                        AdHelper.hideAd(findViewById(R.id.adview));
-                    }
+            // Sanitize the search input and convert it to a search.
+            try {
+                encodedUrlString = URLEncoder.encode(intent.getStringExtra(SearchManager.QUERY), "UTF-8");
+            } catch (UnsupportedEncodingException exception) {
+                encodedUrlString = "";
+            }
 
-                    // Remove the translucent status flag.  This is necessary so the root frame layout can fill the entire screen.
-                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            // Add the base search URL.
+            formattedUrlString = searchURL + encodedUrlString;
+        } else if (intentUriData != null){  // Check to see if the intent contains a new URL.
+            // Set the formatted URL string.
+            formattedUrlString = intentUriData.toString();
+        }
 
-                    /* Hide the system bars.
-                     * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
-                     * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN makes the root frame layout fill the area that is normally reserved for the status bar.
-                     * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
-                     * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically re-hides them after they are shown.
-                     */
-                    rootFrameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
-                            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
-                } else {  // Switch to normal viewing mode.
-                    // Remove the `SYSTEM_UI` flags from the root frame layout.
-                    rootFrameLayout.setSystemUiVisibility(0);
+        // Load the URL.
+        loadUrl(formattedUrlString);
 
-                    // Add the translucent status flag.
-                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-                }
+        // Get a handle for the drawer layout.
+        DrawerLayout drawerLayout = findViewById(R.id.drawerlayout);
 
-                // Reload the ad for the free flavor if not in full screen mode.
-                if (BuildConfig.FLAVOR.contentEquals("free") && !inFullScreenBrowsingMode) {
-                    // Reload the ad.
-                    AdHelper.loadAd(findViewById(R.id.adview), getApplicationContext(), getString(R.string.ad_unit_id));
-                }
-            }
+        // Close the navigation drawer if it is open.
+        if (drawerLayout.isDrawerVisible(GravityCompat.START)) {
+            drawerLayout.closeDrawer(GravityCompat.START);
+        }
 
-            // Upload files.
-            @Override
-            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
-                // Show the file chooser if the device is running API >= 21.
-                if (Build.VERSION.SDK_INT >= 21) {
-                    // Store the file path callback.
-                    fileChooserCallback = filePathCallback;
+        // Close the bookmarks drawer if it is open.
+        if (drawerLayout.isDrawerVisible(GravityCompat.END)) {
+            drawerLayout.closeDrawer(GravityCompat.END);
+        }
 
-                    // Create an intent to open a chooser based ont the file chooser parameters.
-                    Intent fileChooserIntent = fileChooserParams.createIntent();
+        // Clear the keyboard if displayed and remove the focus on the urlTextBar if it has it.
+        currentWebView.requestFocus();
+    }
 
-                    // Open the file chooser.  Currently only one `startActivityForResult` exists in this activity, so the request code, used to differentiate them, is simply `0`.
-                    startActivityForResult(fileChooserIntent, 0);
-                }
-                return true;
-            }
-        });
+    @Override
+    public void onRestart() {
+        // Run the default commands.
+        super.onRestart();
 
-        // Register `mainWebView` for a context menu.  This is used to see link targets and download images.
-        registerForContextMenu(mainWebView);
+        // Make sure Orbot is running if Privacy Browser is proxying through Orbot.
+        if (proxyThroughOrbot) {
+            // Request Orbot to start.  If Orbot is already running no hard will be caused by this request.
+            Intent orbotIntent = new Intent("org.torproject.android.intent.action.START");
 
-        // Allow the downloading of files.
-        mainWebView.setDownloadListener((String url, String userAgent, String contentDisposition, String mimetype, long contentLength) -> {
-            // Check if the download should be processed by an external app.
-            if (downloadWithExternalApp) {  // Download with an external app.
-                openUrlWithExternalApp(url);
-            } else {  // Download with Android's download manager.
-                // Check to see if the WRITE_EXTERNAL_STORAGE permission has already been granted.
-                if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {  // The storage permission has not been granted.
-                    // The WRITE_EXTERNAL_STORAGE permission needs to be requested.
+            // Send the intent to the Orbot package.
+            orbotIntent.setPackage("org.torproject.android");
 
-                    // Store the variables for future use by `onRequestPermissionsResult()`.
-                    downloadUrl = url;
-                    downloadContentDisposition = contentDisposition;
-                    downloadContentLength = contentLength;
+            // Make it so.
+            sendBroadcast(orbotIntent);
+        }
 
-                    // Show a dialog if the user has previously denied the permission.
-                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {  // Show a dialog explaining the request first.
-                        // Instantiate the download location permission alert dialog and set the download type to DOWNLOAD_FILE.
-                        DialogFragment downloadLocationPermissionDialogFragment = DownloadLocationPermissionDialog.downloadType(DownloadLocationPermissionDialog.DOWNLOAD_FILE);
+        // Apply the app settings if returning from the Settings activity..
+        if (reapplyAppSettingsOnRestart) {
+            // Apply the app settings.
+            applyAppSettings();
 
-                        // Show the download location permission alert dialog.  The permission will be requested when the the dialog is closed.
-                        downloadLocationPermissionDialogFragment.show(fragmentManager, getString(R.string.download_location));
-                    } else {  // Show the permission request directly.
-                        // Request the permission.  The download dialog will be launched by `onRequestPermissionResult()`.
-                        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_FILE_REQUEST_CODE);
-                    }
-                } else {  // The storage permission has already been granted.
-                    // Get a handle for the download file alert dialog.
-                    DialogFragment downloadFileDialogFragment = DownloadFileDialog.fromUrl(url, contentDisposition, contentLength);
+            // Reload the webpage if displaying of images has been disabled in the Settings activity.
+            if (reloadOnRestart) {
+                // Reload the WebViews.
+                // TODO
+                currentWebView.reload();
 
-                    // Show the download file alert dialog.
-                    downloadFileDialogFragment.show(fragmentManager, getString(R.string.download));
-                }
+                // Reset `reloadOnRestartBoolean`.
+                reloadOnRestart = false;
             }
-        });
-
-        // Allow pinch to zoom.
-        mainWebView.getSettings().setBuiltInZoomControls(true);
 
-        // Hide zoom controls.
-        mainWebView.getSettings().setDisplayZoomControls(false);
-
-        // Don't allow mixed content (HTTP and HTTPS) on the same website.
-        if (Build.VERSION.SDK_INT >= 21) {
-            mainWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
+            // Reset the return from settings flag.
+            reapplyAppSettingsOnRestart = false;
         }
 
-        // Set the WebView to use a wide viewport.  Otherwise, some web pages will be scrunched and some content will render outside the screen.
-        mainWebView.getSettings().setUseWideViewPort(true);
+        // Apply the domain settings if returning from the Domains activity.
+        if (reapplyDomainSettingsOnRestart) {
+            // Reapply the domain settings.
+            applyDomainSettings(formattedUrlString, false, true);
 
-        // Set the WebView to load in overview mode (zoomed out to the maximum width).
-        mainWebView.getSettings().setLoadWithOverviewMode(true);
+            // Reset `reapplyDomainSettingsOnRestart`.
+            reapplyDomainSettingsOnRestart = false;
+        }
 
-        // Explicitly disable geolocation.
-        mainWebView.getSettings().setGeolocationEnabled(false);
+        // Load the URL on restart to apply changes to night mode.
+        if (loadUrlOnRestart) {
+            // Load the current `formattedUrlString`.
+            loadUrl(formattedUrlString);
 
-        // Initialize cookieManager.
-        cookieManager = CookieManager.getInstance();
+            // Reset `loadUrlOnRestart.
+            loadUrlOnRestart = false;
+        }
 
-        // Replace the header that `WebView` creates for `X-Requested-With` with a null value.  The default value is the application ID (com.stoutner.privacybrowser.standard).
-        customHeaders.put("X-Requested-With", "");
+        // Update the bookmarks drawer if returning from the Bookmarks activity.
+        if (restartFromBookmarksActivity) {
+            // Get a handle for the drawer layout.
+            DrawerLayout drawerLayout = findViewById(R.id.drawerlayout);
 
-        // Initialize the default preference values the first time the program is run.  `false` keeps this command from resetting any current preferences back to default.
-        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
+            // Close the bookmarks drawer.
+            drawerLayout.closeDrawer(GravityCompat.END);
 
-        // Get a handle for the `Runtime`.
-        privacyBrowserRuntime = Runtime.getRuntime();
+            // Reload the bookmarks drawer.
+            loadBookmarksFolder();
 
-        // Store the application's private data directory.
-        privateDataDirectoryString = getApplicationInfo().dataDir;
-        // `dataDir` will vary, but will be something like `/data/user/0/com.stoutner.privacybrowser.standard`, which links to `/data/data/com.stoutner.privacybrowser.standard`.
+            // Reset `restartFromBookmarksActivity`.
+            restartFromBookmarksActivity = false;
+        }
 
-        // Initialize `inFullScreenBrowsingMode`, which is always false at this point because Privacy Browser never starts in full screen browsing mode.
-        inFullScreenBrowsingMode = false;
+        // Update the privacy icon.  `true` runs `invalidateOptionsMenu` as the last step.  This can be important if the screen was rotated.
+        updatePrivacyIcons(true);
+    }
 
-        // Initialize the privacy settings variables.
-        javaScriptEnabled = false;
-        firstPartyCookiesEnabled = false;
-        thirdPartyCookiesEnabled = false;
-        domStorageEnabled = false;
-        saveFormDataEnabled = false;  // Form data can be removed once the minimum API >= 26.
-        nightMode = false;
+    // `onResume()` runs after `onStart()`, which runs after `onCreate()` and `onRestart()`.
+    @Override
+    public void onResume() {
+        // Run the default commands.
+        super.onResume();
 
-        // Store the default user agent.
-        webViewDefaultUserAgent = mainWebView.getSettings().getUserAgentString();
+        // Resume JavaScript (if enabled).
+        // TODO mainWebView.resumeTimers();
 
-        // Initialize the WebView title.
-        webViewTitle = getString(R.string.no_title);
+        // Resume `mainWebView`.
+        // TODO mainWebView.onResume();
 
-        // Initialize the favorite icon bitmap.  `ContextCompat` must be used until API >= 21.
-        Drawable favoriteIconDrawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.world);
-        BitmapDrawable favoriteIconBitmapDrawable = (BitmapDrawable) favoriteIconDrawable;
-        assert favoriteIconBitmapDrawable != null;
-        favoriteIconDefaultBitmap = favoriteIconBitmapDrawable.getBitmap();
+        // Display a message to the user if waiting for Orbot.
+        if (waitingForOrbot && !orbotStatus.equals("ON")) {
+            // Disable the wide view port so that the waiting for Orbot text is displayed correctly.
+            currentWebView.getSettings().setUseWideViewPort(false);
 
-        // If the favorite icon is null, load the default.
-        if (favoriteIconBitmap == null) {
-            favoriteIconBitmap = favoriteIconDefaultBitmap;
+            // Load a waiting page.  `null` specifies no encoding, which defaults to ASCII.
+            currentWebView.loadData(waitingForOrbotHtmlString, "text/html", null);
         }
 
-        // Initialize the user agent array adapter and string array.
-        userAgentNamesArray = ArrayAdapter.createFromResource(this, R.array.user_agent_names, R.layout.spinner_item);
-        userAgentDataArray = resources.getStringArray(R.array.user_agent_data);
-
-        // Apply the app settings from the shared preferences.
-        applyAppSettings();
-
-        // Instantiate the block list helper.
-        BlockListHelper blockListHelper = new BlockListHelper();
+        if (displayingFullScreenVideo || inFullScreenBrowsingMode) {
+            // Get a handle for the root frame layouts.
+            FrameLayout rootFrameLayout = findViewById(R.id.root_framelayout);
 
-        // Initialize the list of resource requests.
-        resourceRequests = new ArrayList<>();
+            // Remove the translucent status flag.  This is necessary so the root frame layout can fill the entire screen.
+            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 
-        // Parse the block lists.
-        final ArrayList<List<String[]>> easyList = blockListHelper.parseBlockList(getAssets(), "blocklists/easylist.txt");
-        final ArrayList<List<String[]>> easyPrivacy = blockListHelper.parseBlockList(getAssets(), "blocklists/easyprivacy.txt");
-        final ArrayList<List<String[]>> fanboysAnnoyanceList = blockListHelper.parseBlockList(getAssets(), "blocklists/fanboy-annoyance.txt");
-        final ArrayList<List<String[]>> fanboysSocialList = blockListHelper.parseBlockList(getAssets(), "blocklists/fanboy-social.txt");
-        final ArrayList<List<String[]>> ultraPrivacy = blockListHelper.parseBlockList(getAssets(), "blocklists/ultraprivacy.txt");
+            /* Hide the system bars.
+             * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
+             * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN makes the root frame layout fill the area that is normally reserved for the status bar.
+             * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
+             * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically re-hides them after they are shown.
+             */
+            rootFrameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+        } else if (BuildConfig.FLAVOR.contentEquals("free")) {  // Resume the adView for the free flavor.
+            // Resume the ad.
+            AdHelper.resumeAd(findViewById(R.id.adview));
+        }
+    }
 
-        // Store the list versions.
-        easyListVersion = easyList.get(0).get(0)[0];
-        easyPrivacyVersion = easyPrivacy.get(0).get(0)[0];
-        fanboysAnnoyanceVersion = fanboysAnnoyanceList.get(0).get(0)[0];
-        fanboysSocialVersion = fanboysSocialList.get(0).get(0)[0];
-        ultraPrivacyVersion = ultraPrivacy.get(0).get(0)[0];
+    @Override
+    public void onPause() {
+        // Run the default commands.
+        super.onPause();
 
-        // Get a handle for the activity.  This is used to update the requests counter while the navigation menu is open.
-        Activity activity = this;
+        // Pause `mainWebView`.
+        // TODO
+        currentWebView.onPause();
 
-        mainWebView.setWebViewClient(new WebViewClient() {
-            // `shouldOverrideUrlLoading` makes this `WebView` the default handler for URLs inside the app, so that links are not kicked out to other apps.
-            // The deprecated `shouldOverrideUrlLoading` must be used until API >= 24.
-            @SuppressWarnings("deprecation")
-            @Override
-            public boolean shouldOverrideUrlLoading(WebView view, String url) {
-                if (url.startsWith("http")) {  // Load the URL in Privacy Browser.
-                    // Reset the formatted URL string so the page will load correctly if blocking of third-party requests is enabled.
-                    formattedUrlString = "";
+        // Stop all JavaScript.
+        // TODO
+        currentWebView.pauseTimers();
 
-                    // Apply the domain settings for the new URL.  `applyDomainSettings` doesn't do anything if the domain has not changed.
-                    boolean userAgentChanged = applyDomainSettings(url, true, false);
+        // Pause the ad or it will continue to consume resources in the background on the free flavor.
+        if (BuildConfig.FLAVOR.contentEquals("free")) {
+            // Pause the ad.
+            AdHelper.pauseAd(findViewById(R.id.adview));
+        }
+    }
 
-                    // Check if the user agent has changed.
-                    if (userAgentChanged) {
-                        // Manually load the URL.  The changing of the user agent will cause WebView to reload the previous URL.
-                        mainWebView.loadUrl(url, customHeaders);
+    @Override
+    public void onDestroy() {
+        // Unregister the Orbot status broadcast receiver.
+        this.unregisterReceiver(orbotStatusBroadcastReceiver);
 
-                        // Returning true indicates that Privacy Browser is manually handling the loading of the URL.
-                        return true;
-                    } else {
-                        // Returning false causes the current WebView to handle the URL and prevents it from adding redirects to the history list.
-                        return false;
-                    }
-                } else if (url.startsWith("mailto:")) {  // Load the email address in an external email program.
-                    // Use `ACTION_SENDTO` instead of `ACTION_SEND` so that only email programs are launched.
-                    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
+        // Close the bookmarks cursor and database.
+        bookmarksCursor.close();
+        bookmarksDatabaseHelper.close();
 
-                    // Parse the url and set it as the data for the intent.
-                    emailIntent.setData(Uri.parse(url));
+        // Run the default commands.
+        super.onDestroy();
+    }
 
-                    // Open the email program in a new task instead of as part of Privacy Browser.
-                    emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Inflate the menu.  This adds items to the action bar if it is present.
+        getMenuInflater().inflate(R.menu.webview_options_menu, menu);
 
-                    // Make it so.
-                    startActivity(emailIntent);
+        // Set mainMenu so it can be used by `onOptionsItemSelected()` and `updatePrivacyIcons`.
+        mainMenu = menu;
 
-                    // Returning true indicates Privacy Browser is handling the URL by creating an intent.
-                    return true;
-                } else if (url.startsWith("tel:")) {  // Load the phone number in the dialer.
-                    // Open the dialer and load the phone number, but wait for the user to place the call.
-                    Intent dialIntent = new Intent(Intent.ACTION_DIAL);
+        // Set the initial status of the privacy icons.  `false` does not call `invalidateOptionsMenu` as the last step.
+        updatePrivacyIcons(false);
 
-                    // Add the phone number to the intent.
-                    dialIntent.setData(Uri.parse(url));
+        // Get handles for the menu items.
+        MenuItem toggleFirstPartyCookiesMenuItem = menu.findItem(R.id.toggle_first_party_cookies);
+        MenuItem toggleThirdPartyCookiesMenuItem = menu.findItem(R.id.toggle_third_party_cookies);
+        MenuItem toggleDomStorageMenuItem = menu.findItem(R.id.toggle_dom_storage);
+        MenuItem toggleSaveFormDataMenuItem = menu.findItem(R.id.toggle_save_form_data);  // Form data can be removed once the minimum API >= 26.
+        MenuItem clearFormDataMenuItem = menu.findItem(R.id.clear_form_data);  // Form data can be removed once the minimum API >= 26.
+        refreshMenuItem = menu.findItem(R.id.refresh);
+        blocklistsMenuItem = menu.findItem(R.id.blocklists);
+        easyListMenuItem = menu.findItem(R.id.easylist);
+        easyPrivacyMenuItem = menu.findItem(R.id.easyprivacy);
+        fanboysAnnoyanceListMenuItem = menu.findItem(R.id.fanboys_annoyance_list);
+        fanboysSocialBlockingListMenuItem = menu.findItem(R.id.fanboys_social_blocking_list);
+        ultraPrivacyMenuItem = menu.findItem(R.id.ultraprivacy);
+        blockAllThirdPartyRequestsMenuItem = menu.findItem(R.id.block_all_third_party_requests);
+        MenuItem adConsentMenuItem = menu.findItem(R.id.ad_consent);
 
-                    // Open the dialer in a new task instead of as part of Privacy Browser.
-                    dialIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        // Only display third-party cookies if API >= 21
+        toggleThirdPartyCookiesMenuItem.setVisible(Build.VERSION.SDK_INT >= 21);
 
-                    // Make it so.
-                    startActivity(dialIntent);
+        // Only display the form data menu items if the API < 26.
+        toggleSaveFormDataMenuItem.setVisible(Build.VERSION.SDK_INT < 26);
+        clearFormDataMenuItem.setVisible(Build.VERSION.SDK_INT < 26);
 
-                    // Returning true indicates Privacy Browser is handling the URL by creating an intent.
-                    return true;
-                } else {  // Load a system chooser to select an app that can handle the URL.
-                    // Open an app that can handle the URL.
-                    Intent genericIntent = new Intent(Intent.ACTION_VIEW);
+        // Only show Ad Consent if this is the free flavor.
+        adConsentMenuItem.setVisible(BuildConfig.FLAVOR.contentEquals("free"));
 
-                    // Add the URL to the intent.
-                    genericIntent.setData(Uri.parse(url));
+        // Get the shared preference values.
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 
-                    // List all apps that can handle the URL instead of just opening the first one.
-                    genericIntent.addCategory(Intent.CATEGORY_BROWSABLE);
+        // Get the status of the additional AppBar icons.
+        displayAdditionalAppBarIcons = sharedPreferences.getBoolean("display_additional_app_bar_icons", false);
 
-                    // Open the app in a new task instead of as part of Privacy Browser.
-                    genericIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        // Set the status of the additional app bar icons.  Setting the refresh menu item to `SHOW_AS_ACTION_ALWAYS` makes it appear even on small devices like phones.
+        if (displayAdditionalAppBarIcons) {
+            toggleFirstPartyCookiesMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            toggleDomStorageMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            refreshMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        } else { //Do not display the additional icons.
+            toggleFirstPartyCookiesMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+            toggleDomStorageMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+            refreshMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        }
 
-                    // Start the app or display a snackbar if no app is available to handle the URL.
-                    try {
-                        startActivity(genericIntent);
-                    } catch (ActivityNotFoundException exception) {
-                        Snackbar.make(mainWebView, getString(R.string.unrecognized_url) + "  " + url, Snackbar.LENGTH_SHORT).show();
-                    }
+        // Replace Refresh with Stop if a URL is already loading.
+        if (urlIsLoading) {
+            // Set the title.
+            refreshMenuItem.setTitle(R.string.stop);
 
-                    // Returning true indicates Privacy Browser is handling the URL by creating an intent.
-                    return true;
+            // If the icon is displayed in the AppBar, set it according to the theme.
+            if (displayAdditionalAppBarIcons) {
+                if (darkTheme) {
+                    refreshMenuItem.setIcon(R.drawable.close_dark);
+                } else {
+                    refreshMenuItem.setIcon(R.drawable.close_light);
                 }
             }
+        }
 
-            // Check requests against the block lists.  The deprecated `shouldInterceptRequest()` must be used until minimum API >= 21.
-            @SuppressWarnings("deprecation")
-            @Override
-            public WebResourceResponse shouldInterceptRequest(WebView view, String url){
-                // Create an empty web resource response to be used if the resource request is blocked.
-                WebResourceResponse emptyWebResourceResponse = new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+        return true;
+    }
 
-                // Reset the whitelist results tracker.
-                whiteListResultStringArray = null;
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        // Get a handle for the swipe refresh layout.
+        SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.swiperefreshlayout);
 
-                // Initialize the third party request tracker.
-                boolean isThirdPartyRequest = false;
+        // Get handles for the menu items.
+        MenuItem addOrEditDomain = menu.findItem(R.id.add_or_edit_domain);
+        MenuItem toggleFirstPartyCookiesMenuItem = menu.findItem(R.id.toggle_first_party_cookies);
+        MenuItem toggleThirdPartyCookiesMenuItem = menu.findItem(R.id.toggle_third_party_cookies);
+        MenuItem toggleDomStorageMenuItem = menu.findItem(R.id.toggle_dom_storage);
+        MenuItem toggleSaveFormDataMenuItem = menu.findItem(R.id.toggle_save_form_data);  // Form data can be removed once the minimum API >= 26.
+        MenuItem clearDataMenuItem = menu.findItem(R.id.clear_data);
+        MenuItem clearCookiesMenuItem = menu.findItem(R.id.clear_cookies);
+        MenuItem clearDOMStorageMenuItem = menu.findItem(R.id.clear_dom_storage);
+        MenuItem clearFormDataMenuItem = menu.findItem(R.id.clear_form_data);  // Form data can be removed once the minimum API >= 26.
+        MenuItem fontSizeMenuItem = menu.findItem(R.id.font_size);
+        MenuItem swipeToRefreshMenuItem = menu.findItem(R.id.swipe_to_refresh);
+        MenuItem displayImagesMenuItem = menu.findItem(R.id.display_images);
+        MenuItem nightModeMenuItem = menu.findItem(R.id.night_mode);
+        MenuItem proxyThroughOrbotMenuItem = menu.findItem(R.id.proxy_through_orbot);
 
-                // Initialize the current domain string.
-                String currentDomain = "";
+        // Set the text for the domain menu item.
+        if (domainSettingsApplied) {
+            addOrEditDomain.setTitle(R.string.edit_domain_settings);
+        } else {
+            addOrEditDomain.setTitle(R.string.add_domain_settings);
+        }
 
-                // Nobody is happy when comparing null strings.
-                if (!(formattedUrlString == null) && !(url == null)) {
-                    // Get the domain strings to URIs.
-                    Uri currentDomainUri = Uri.parse(formattedUrlString);
-                    Uri requestDomainUri = Uri.parse(url);
+        // Set the status of the menu item checkboxes.
+        toggleFirstPartyCookiesMenuItem.setChecked(firstPartyCookiesEnabled);
+        toggleThirdPartyCookiesMenuItem.setChecked(thirdPartyCookiesEnabled);
+        toggleDomStorageMenuItem.setChecked(domStorageEnabled);
+        toggleSaveFormDataMenuItem.setChecked(saveFormDataEnabled);  // Form data can be removed once the minimum API >= 26.
+        easyListMenuItem.setChecked(easyListEnabled);
+        easyPrivacyMenuItem.setChecked(easyPrivacyEnabled);
+        fanboysAnnoyanceListMenuItem.setChecked(fanboysAnnoyanceListEnabled);
+        fanboysSocialBlockingListMenuItem.setChecked(fanboysSocialBlockingListEnabled);
+        ultraPrivacyMenuItem.setChecked(ultraPrivacyEnabled);
+        blockAllThirdPartyRequestsMenuItem.setChecked(blockAllThirdPartyRequests);
+        swipeToRefreshMenuItem.setChecked(swipeRefreshLayout.isEnabled());
+        // TODO displayImagesMenuItem.setChecked(mainWebView.getSettings().getLoadsImagesAutomatically());
+        nightModeMenuItem.setChecked(nightMode);
+        proxyThroughOrbotMenuItem.setChecked(proxyThroughOrbot);
 
-                    // Get the domain host names.
-                    String currentBaseDomain = currentDomainUri.getHost();
-                    String requestBaseDomain = requestDomainUri.getHost();
+        // Enable third-party cookies if first-party cookies are enabled.
+        toggleThirdPartyCookiesMenuItem.setEnabled(firstPartyCookiesEnabled);
 
-                    // Update the current domain variable.
-                    currentDomain = currentBaseDomain;
+        // Enable DOM Storage if JavaScript is enabled.
+        toggleDomStorageMenuItem.setEnabled(javaScriptEnabled);
 
-                    // Only compare the current base domain and the request base domain if neither is null.
-                    if (!(currentBaseDomain == null) && !(requestBaseDomain == null)) {
-                        // Determine the current base domain.
-                        while (currentBaseDomain.indexOf(".", currentBaseDomain.indexOf(".") + 1) > 0) {  // There is at least one subdomain.
-                            // Remove the first subdomain.
-                            currentBaseDomain = currentBaseDomain.substring(currentBaseDomain.indexOf(".") + 1);
-                        }
+        // Enable Clear Cookies if there are any.
+        clearCookiesMenuItem.setEnabled(cookieManager.hasCookies());
 
-                        // Determine the request base domain.
-                        while (requestBaseDomain.indexOf(".", requestBaseDomain.indexOf(".") + 1) > 0) {  // There is at least one subdomain.
-                            // Remove the first subdomain.
-                            requestBaseDomain = requestBaseDomain.substring(requestBaseDomain.indexOf(".") + 1);
-                        }
+        // Get a count of the number of files in the Local Storage directory.
+        File localStorageDirectory = new File (privateDataDirectoryString + "/app_webview/Local Storage/");
+        int localStorageDirectoryNumberOfFiles = 0;
+        if (localStorageDirectory.exists()) {
+            localStorageDirectoryNumberOfFiles = localStorageDirectory.list().length;
+        }
 
-                        // Update the third party request tracker.
-                        isThirdPartyRequest = !currentBaseDomain.equals(requestBaseDomain);
-                    }
-                }
+        // Get a count of the number of files in the IndexedDB directory.
+        File indexedDBDirectory = new File (privateDataDirectoryString + "/app_webview/IndexedDB");
+        int indexedDBDirectoryNumberOfFiles = 0;
+        if (indexedDBDirectory.exists()) {
+            indexedDBDirectoryNumberOfFiles = indexedDBDirectory.list().length;
+        }
 
-                // Block third-party requests if enabled.
-                if (isThirdPartyRequest && blockAllThirdPartyRequests) {
-                    // Increment the blocked requests counters.
-                    blockedRequests++;
-                    thirdPartyBlockedRequests++;
+        // Enable Clear DOM Storage if there is any.
+        clearDOMStorageMenuItem.setEnabled(localStorageDirectoryNumberOfFiles > 0 || indexedDBDirectoryNumberOfFiles > 0);
 
-                    // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                    activity.runOnUiThread(() -> {
-                        navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                        blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                        blockAllThirdPartyRequestsMenuItem.setTitle(thirdPartyBlockedRequests + " - " + getString(R.string.block_all_third_party_requests));
-                    });
+        // Enable Clear Form Data is there is any.  This can be removed once the minimum API >= 26.
+        if (Build.VERSION.SDK_INT < 26) {
+            WebViewDatabase mainWebViewDatabase = WebViewDatabase.getInstance(this);
+            clearFormDataMenuItem.setEnabled(mainWebViewDatabase.hasFormData());
+        } else {
+            // Disable clear form data because it is not supported on current version of Android.
+            clearFormDataMenuItem.setEnabled(false);
+        }
 
-                    // Add the request to the log.
-                    resourceRequests.add(new String[]{String.valueOf(REQUEST_THIRD_PARTY), url});
+        // Enable Clear Data if any of the submenu items are enabled.
+        clearDataMenuItem.setEnabled(clearCookiesMenuItem.isEnabled() || clearDOMStorageMenuItem.isEnabled() || clearFormDataMenuItem.isEnabled());
 
-                    // Return an empty web resource response.
-                    return emptyWebResourceResponse;
-                }
+        // Disable Fanboy's Social Blocking List if Fanboy's Annoyance List is checked.
+        fanboysSocialBlockingListMenuItem.setEnabled(!fanboysAnnoyanceListEnabled);
 
-                // Check UltraPrivacy if it is enabled.
-                if (ultraPrivacyEnabled) {
-                    if (blockListHelper.isBlocked(currentDomain, url, isThirdPartyRequest, ultraPrivacy)) {
-                        // Increment the blocked requests counters.
-                        blockedRequests++;
-                        ultraPrivacyBlockedRequests++;
+        // Initialize the display names for the blocklists with the number of blocked requests.
+        blocklistsMenuItem.setTitle(getString(R.string.blocklists) + " - " + blockedRequests);
+        easyListMenuItem.setTitle(easyListBlockedRequests + " - " + getString(R.string.easylist));
+        easyPrivacyMenuItem.setTitle(easyPrivacyBlockedRequests + " - " + getString(R.string.easyprivacy));
+        fanboysAnnoyanceListMenuItem.setTitle(fanboysAnnoyanceListBlockedRequests + " - " + getString(R.string.fanboys_annoyance_list));
+        fanboysSocialBlockingListMenuItem.setTitle(fanboysSocialBlockingListBlockedRequests + " - " + getString(R.string.fanboys_social_blocking_list));
+        ultraPrivacyMenuItem.setTitle(ultraPrivacyBlockedRequests + " - " + getString(R.string.ultraprivacy));
+        blockAllThirdPartyRequestsMenuItem.setTitle(thirdPartyBlockedRequests + " - " + getString(R.string.block_all_third_party_requests));
 
-                        // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                        activity.runOnUiThread(() -> {
-                            navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            ultraPrivacyMenuItem.setTitle(ultraPrivacyBlockedRequests + " - " + getString(R.string.ultraprivacy));
-                        });
+        // Get the current user agent.
+        // TODO String currentUserAgent = mainWebView.getSettings().getUserAgentString();
+        String currentUserAgent = "";
 
-                        // The resource request was blocked.  Return an empty web resource response.
-                        return emptyWebResourceResponse;
-                    }
+        // Select the current user agent menu item.  A switch statement cannot be used because the user agents are not compile time constants.
+        if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[0])) {  // Privacy Browser.
+            menu.findItem(R.id.user_agent_privacy_browser).setChecked(true);
+        } else if (currentUserAgent.equals(webViewDefaultUserAgent)) {  // WebView Default.
+            menu.findItem(R.id.user_agent_webview_default).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[2])) {  // Firefox on Android.
+            menu.findItem(R.id.user_agent_firefox_on_android).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[3])) {  // Chrome on Android.
+            menu.findItem(R.id.user_agent_chrome_on_android).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[4])) {  // Safari on iOS.
+            menu.findItem(R.id.user_agent_safari_on_ios).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[5])) {  // Firefox on Linux.
+            menu.findItem(R.id.user_agent_firefox_on_linux).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[6])) {  // Chromium on Linux.
+            menu.findItem(R.id.user_agent_chromium_on_linux).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[7])) {  // Firefox on Windows.
+            menu.findItem(R.id.user_agent_firefox_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[8])) {  // Chrome on Windows.
+            menu.findItem(R.id.user_agent_chrome_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[9])) {  // Edge on Windows.
+            menu.findItem(R.id.user_agent_edge_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[10])) {  // Internet Explorer on Windows.
+            menu.findItem(R.id.user_agent_internet_explorer_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[11])) {  // Safari on macOS.
+            menu.findItem(R.id.user_agent_safari_on_macos).setChecked(true);
+        } else {  // Custom user agent.
+            menu.findItem(R.id.user_agent_custom).setChecked(true);
+        }
 
-                    // If the whitelist result is not null, the request has been allowed by UltraPrivacy.
-                    if (whiteListResultStringArray != null) {
-                        // Add a whitelist entry to the resource requests array.
-                        resourceRequests.add(whiteListResultStringArray);
+        // Initialize font size variables.
+        // TODO int fontSize = mainWebView.getSettings().getTextZoom();
+        int fontSize = 100;
+        String fontSizeTitle;
+        MenuItem selectedFontSizeMenuItem;
 
-                        // The resource request has been allowed by UltraPrivacy.  `return null` loads the requested resource.
-                        return null;
-                    }
+        // Prepare the font size title and current size menu item.
+        switch (fontSize) {
+            case 25:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.twenty_five_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_twenty_five_percent);
+                break;
+
+            case 50:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.fifty_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_fifty_percent);
+                break;
+
+            case 75:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.seventy_five_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_seventy_five_percent);
+                break;
+
+            case 100:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_percent);
+                break;
+
+            case 125:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_twenty_five_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_twenty_five_percent);
+                break;
+
+            case 150:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_fifty_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_fifty_percent);
+                break;
+
+            case 175:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_seventy_five_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_seventy_five_percent);
+                break;
+
+            case 200:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.two_hundred_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_two_hundred_percent);
+                break;
+
+            default:
+                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_percent);
+                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_percent);
+                break;
+        }
+
+        // Set the font size title and select the current size menu item.
+        fontSizeMenuItem.setTitle(fontSizeTitle);
+        selectedFontSizeMenuItem.setChecked(true);
+
+        // Run all the other default commands.
+        super.onPrepareOptionsMenu(menu);
+
+        // Display the menu.
+        return true;
+    }
+
+    @Override
+    // Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled.
+    @SuppressLint("SetJavaScriptEnabled")
+    // removeAllCookies is deprecated, but it is required for API < 21.
+    @SuppressWarnings("deprecation")
+    public boolean onOptionsItemSelected(MenuItem menuItem) {
+        // Reenter full screen browsing mode if it was interrupted by the options menu.  <https://redmine.stoutner.com/issues/389>
+        if (inFullScreenBrowsingMode) {
+            // Remove the translucent status flag.  This is necessary so the root frame layout can fill the entire screen.
+            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+            FrameLayout rootFrameLayout = findViewById(R.id.root_framelayout);
+
+            /* Hide the system bars.
+             * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
+             * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN makes the root frame layout fill the area that is normally reserved for the status bar.
+             * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
+             * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically re-hides them after they are shown.
+             */
+            rootFrameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+        }
+
+        // Get the selected menu item ID.
+        int menuItemId = menuItem.getItemId();
+
+        // Run the commands that correlate to the selected menu item.
+        switch (menuItemId) {
+            case R.id.toggle_javascript:
+                // Switch the status of javaScriptEnabled.
+                javaScriptEnabled = !javaScriptEnabled;
+
+                // Apply the new JavaScript status.
+                currentWebView.getSettings().setJavaScriptEnabled(javaScriptEnabled);
+
+                // Update the privacy icon.  `true` runs `invalidateOptionsMenu` as the last step.
+                updatePrivacyIcons(true);
+
+                // Display a `Snackbar`.
+                if (javaScriptEnabled) {  // JavaScrip is enabled.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.javascript_enabled, Snackbar.LENGTH_SHORT).show();
+                } else if (firstPartyCookiesEnabled) {  // JavaScript is disabled, but first-party cookies are enabled.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.javascript_disabled, Snackbar.LENGTH_SHORT).show();
+                } else {  // Privacy mode.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.privacy_mode, Snackbar.LENGTH_SHORT).show();
                 }
 
-                // Check EasyList if it is enabled.
-                if (easyListEnabled) {
-                    if (blockListHelper.isBlocked(currentDomain, url, isThirdPartyRequest, easyList)) {
-                        // Increment the blocked requests counters.
-                        blockedRequests++;
-                        easyListBlockedRequests++;
+                // Reload the current WebView.
+                currentWebView.reload();
+                return true;
 
-                        // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                        activity.runOnUiThread(() -> {
-                            navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            easyListMenuItem.setTitle(easyListBlockedRequests + " - " + getString(R.string.easylist));
-                        });
+            case R.id.add_or_edit_domain:
+                if (domainSettingsApplied) {  // Edit the current domain settings.
+                    // Reapply the domain settings on returning to `MainWebViewActivity`.
+                    reapplyDomainSettingsOnRestart = true;
+                    currentDomainName = "";
 
-                        // Reset the whitelist results tracker (because otherwise it will sometimes add results to the list due to a race condition).
-                        whiteListResultStringArray = null;
+                    // Create an intent to launch the domains activity.
+                    Intent domainsIntent = new Intent(this, DomainsActivity.class);
 
-                        // The resource request was blocked.  Return an empty web resource response.
-                        return emptyWebResourceResponse;
-                    }
+                    // Put extra information instructing the domains activity to directly load the current domain and close on back instead of returning to the domains list.
+                    domainsIntent.putExtra("loadDomain", domainSettingsDatabaseId);
+                    domainsIntent.putExtra("closeOnBack", true);
+
+                    // Make it so.
+                    startActivity(domainsIntent);
+                } else {  // Add a new domain.
+                    // Apply the new domain settings on returning to `MainWebViewActivity`.
+                    reapplyDomainSettingsOnRestart = true;
+                    currentDomainName = "";
+
+                    // Get the current domain
+                    Uri currentUri = Uri.parse(formattedUrlString);
+                    String currentDomain = currentUri.getHost();
+
+                    // Initialize the database handler.  The `0` specifies the database version, but that is ignored and set instead using a constant in `DomainsDatabaseHelper`.
+                    DomainsDatabaseHelper domainsDatabaseHelper = new DomainsDatabaseHelper(this, null, null, 0);
+
+                    // Create the domain and store the database ID.
+                    int newDomainDatabaseId = domainsDatabaseHelper.addDomain(currentDomain);
+
+                    // Create an intent to launch the domains activity.
+                    Intent domainsIntent = new Intent(this, DomainsActivity.class);
+
+                    // Put extra information instructing the domains activity to directly load the new domain and close on back instead of returning to the domains list.
+                    domainsIntent.putExtra("loadDomain", newDomainDatabaseId);
+                    domainsIntent.putExtra("closeOnBack", true);
+
+                    // Make it so.
+                    startActivity(domainsIntent);
                 }
+                return true;
 
-                // Check EasyPrivacy if it is enabled.
-                if (easyPrivacyEnabled) {
-                    if (blockListHelper.isBlocked(currentDomain, url, isThirdPartyRequest, easyPrivacy)) {
-                        // Increment the blocked requests counters.
-                        blockedRequests++;
-                        easyPrivacyBlockedRequests++;
+            case R.id.toggle_first_party_cookies:
+                // Switch the status of firstPartyCookiesEnabled.
+                firstPartyCookiesEnabled = !firstPartyCookiesEnabled;
 
-                        // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                        activity.runOnUiThread(() -> {
-                            navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            easyPrivacyMenuItem.setTitle(easyPrivacyBlockedRequests + " - " + getString(R.string.easyprivacy));
-                        });
+                // Update the menu checkbox.
+                menuItem.setChecked(firstPartyCookiesEnabled);
 
-                        // Reset the whitelist results tracker (because otherwise it will sometimes add results to the list due to a race condition).
-                        whiteListResultStringArray = null;
+                // Apply the new cookie status.
+                cookieManager.setAcceptCookie(firstPartyCookiesEnabled);
 
-                        // The resource request was blocked.  Return an empty web resource response.
-                        return emptyWebResourceResponse;
-                    }
+                // Update the privacy icon.  `true` runs `invalidateOptionsMenu` as the last step.
+                updatePrivacyIcons(true);
+
+                // Display a `Snackbar`.
+                if (firstPartyCookiesEnabled) {  // First-party cookies are enabled.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.first_party_cookies_enabled, Snackbar.LENGTH_SHORT).show();
+                } else if (javaScriptEnabled) {  // JavaScript is still enabled.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.first_party_cookies_disabled, Snackbar.LENGTH_SHORT).show();
+                } else {  // Privacy mode.
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.privacy_mode, Snackbar.LENGTH_SHORT).show();
                 }
 
-                // Check Fanboy’s Annoyance List if it is enabled.
-                if (fanboysAnnoyanceListEnabled) {
-                    if (blockListHelper.isBlocked(currentDomain, url, isThirdPartyRequest, fanboysAnnoyanceList)) {
-                        // Increment the blocked requests counters.
-                        blockedRequests++;
-                        fanboysAnnoyanceListBlockedRequests++;
+                // Reload the current WebView.
+                currentWebView.reload();
+                return true;
 
-                        // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                        activity.runOnUiThread(() -> {
-                            navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            fanboysAnnoyanceListMenuItem.setTitle(fanboysAnnoyanceListBlockedRequests + " - " + getString(R.string.fanboys_annoyance_list));
-                        });
+            case R.id.toggle_third_party_cookies:
+                if (Build.VERSION.SDK_INT >= 21) {
+                    // Switch the status of thirdPartyCookiesEnabled.
+                    thirdPartyCookiesEnabled = !thirdPartyCookiesEnabled;
 
-                        // Reset the whitelist results tracker (because otherwise it will sometimes add results to the list due to a race condition).
-                        whiteListResultStringArray = null;
+                    // Update the menu checkbox.
+                    menuItem.setChecked(thirdPartyCookiesEnabled);
 
-                        // The resource request was blocked.  Return an empty web resource response.
-                        return emptyWebResourceResponse;
+                    // Apply the new cookie status.
+                    cookieManager.setAcceptThirdPartyCookies(currentWebView, thirdPartyCookiesEnabled);
+
+                    // Display a `Snackbar`.
+                    if (thirdPartyCookiesEnabled) {
+                        Snackbar.make(findViewById(R.id.webviewpager), R.string.third_party_cookies_enabled, Snackbar.LENGTH_SHORT).show();
+                    } else {
+                        Snackbar.make(findViewById(R.id.webviewpager), R.string.third_party_cookies_disabled, Snackbar.LENGTH_SHORT).show();
                     }
-                } else if (fanboysSocialBlockingListEnabled){  // Only check Fanboy’s Social Blocking List if Fanboy’s Annoyance List is disabled.
-                    if (blockListHelper.isBlocked(currentDomain, url, isThirdPartyRequest, fanboysSocialList)) {
-                        // Increment the blocked requests counters.
-                        blockedRequests++;
-                        fanboysSocialBlockingListBlockedRequests++;
 
-                        // Update the titles of the blocklist menu items.  This must be run from the UI thread.
-                        activity.runOnUiThread(() -> {
-                            navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            blocklistsMenuItem.setTitle(getString(R.string.requests) + " - " + blockedRequests);
-                            fanboysSocialBlockingListMenuItem.setTitle(fanboysSocialBlockingListBlockedRequests + " - " + getString(R.string.fanboys_social_blocking_list));
-                        });
+                    // Reload the current WebView.
+                    currentWebView.reload();
+                } // Else do nothing because SDK < 21.
+                return true;
 
-                        // Reset the whitelist results tracker (because otherwise it will sometimes add results to the list due to a race condition).
-                        whiteListResultStringArray = null;
+            case R.id.toggle_dom_storage:
+                // Switch the status of domStorageEnabled.
+                domStorageEnabled = !domStorageEnabled;
 
-                        // The resource request was blocked.  Return an empty web resource response.
-                        return emptyWebResourceResponse;
-                    }
+                // Update the menu checkbox.
+                menuItem.setChecked(domStorageEnabled);
+
+                // Apply the new DOM Storage status.
+                currentWebView.getSettings().setDomStorageEnabled(domStorageEnabled);
+
+                // Update the privacy icon.  `true` runs `invalidateOptionsMenu` as the last step.
+                updatePrivacyIcons(true);
+
+                // Display a `Snackbar`.
+                if (domStorageEnabled) {
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.dom_storage_enabled, Snackbar.LENGTH_SHORT).show();
+                } else {
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.dom_storage_disabled, Snackbar.LENGTH_SHORT).show();
                 }
 
-                // Add the request to the log because it hasn't been processed by any of the previous checks.
-                if (whiteListResultStringArray != null ) {  // The request was processed by a whitelist.
-                    resourceRequests.add(whiteListResultStringArray);
-                } else {  // The request didn't match any blocklist entry.  Log it as a default request.
-                    resourceRequests.add(new String[]{String.valueOf(REQUEST_DEFAULT), url});
+                // Reload the current WebView.
+                currentWebView.reload();
+                return true;
+
+            // Form data can be removed once the minimum API >= 26.
+            case R.id.toggle_save_form_data:
+                // Switch the status of saveFormDataEnabled.
+                saveFormDataEnabled = !saveFormDataEnabled;
+
+                // Update the menu checkbox.
+                menuItem.setChecked(saveFormDataEnabled);
+
+                // Apply the new form data status.
+                currentWebView.getSettings().setSaveFormData(saveFormDataEnabled);
+
+                // Display a `Snackbar`.
+                if (saveFormDataEnabled) {
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.form_data_enabled, Snackbar.LENGTH_SHORT).show();
+                } else {
+                    Snackbar.make(findViewById(R.id.webviewpager), R.string.form_data_disabled, Snackbar.LENGTH_SHORT).show();
                 }
 
-                // The resource request has not been blocked.  `return null` loads the requested resource.
-                return null;
-            }
+                // Update the privacy icon.  `true` runs `invalidateOptionsMenu` as the last step.
+                updatePrivacyIcons(true);
+
+                // Reload the current WebView.
+                currentWebView.reload();
+                return true;
+
+            case R.id.clear_cookies:
+                Snackbar.make(findViewById(R.id.webviewpager), R.string.cookies_deleted, Snackbar.LENGTH_LONG)
+                        .setAction(R.string.undo, v -> {
+                            // Do nothing because everything will be handled by `onDismissed()` below.
+                        })
+                        .addCallback(new Snackbar.Callback() {
+                            @SuppressLint("SwitchIntDef")  // Ignore the lint warning about not handling the other possible events as they are covered by `default:`.
+                            @Override
+                            public void onDismissed(Snackbar snackbar, int event) {
+                                switch (event) {
+                                    // The user pushed the undo button.
+                                    case Snackbar.Callback.DISMISS_EVENT_ACTION:
+                                        // Do nothing.
+                                        break;
+
+                                    // The snackbar was dismissed without the undo button being pushed.
+                                    default:
+                                        // `cookieManager.removeAllCookie()` varies by SDK.
+                                        if (Build.VERSION.SDK_INT < 21) {
+                                            cookieManager.removeAllCookie();
+                                        } else {
+                                            cookieManager.removeAllCookies(null);
+                                        }
+                                }
+                            }
+                        })
+                        .show();
+                return true;
+
+            case R.id.clear_dom_storage:
+                Snackbar.make(findViewById(R.id.webviewpager), R.string.dom_storage_deleted, Snackbar.LENGTH_LONG)
+                        .setAction(R.string.undo, v -> {
+                            // Do nothing because everything will be handled by `onDismissed()` below.
+                        })
+                        .addCallback(new Snackbar.Callback() {
+                            @SuppressLint("SwitchIntDef")  // Ignore the lint warning about not handling the other possible events as they are covered by `default:`.
+                            @Override
+                            public void onDismissed(Snackbar snackbar, int event) {
+                                switch (event) {
+                                    // The user pushed the undo button.
+                                    case Snackbar.Callback.DISMISS_EVENT_ACTION:
+                                        // Do nothing.
+                                        break;
+
+                                    // The snackbar was dismissed without the undo button being pushed.
+                                    default:
+                                        // Delete the DOM Storage.
+                                        WebStorage webStorage = WebStorage.getInstance();
+                                        webStorage.deleteAllData();
+
+                                        // Initialize a handler to manually delete the DOM storage files and directories.
+                                        Handler deleteDomStorageHandler = new Handler();
+
+                                        // Setup a runnable to manually delete the DOM storage files and directories.
+                                        Runnable deleteDomStorageRunnable = () -> {
+                                            try {
+                                                // A string array must be used because the directory contains a space and `Runtime.exec` will otherwise not escape the string correctly.
+                                                Process deleteLocalStorageProcess = privacyBrowserRuntime.exec(new String[]{"rm", "-rf", privateDataDirectoryString + "/app_webview/Local Storage/"});
+
+                                                // Multiple commands must be used because `Runtime.exec()` does not like `*`.
+                                                Process deleteIndexProcess = privacyBrowserRuntime.exec("rm -rf " + privateDataDirectoryString + "/app_webview/IndexedDB");
+                                                Process deleteQuotaManagerProcess = privacyBrowserRuntime.exec("rm -f " + privateDataDirectoryString + "/app_webview/QuotaManager");
+                                                Process deleteQuotaManagerJournalProcess = privacyBrowserRuntime.exec("rm -f " + privateDataDirectoryString + "/app_webview/QuotaManager-journal");
+                                                Process deleteDatabasesProcess = privacyBrowserRuntime.exec("rm -rf " + privateDataDirectoryString + "/app_webview/databases");
 
-            // Handle HTTP authentication requests.
-            @Override
-            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
-                // Store `handler` so it can be accessed from `onHttpAuthenticationCancel()` and `onHttpAuthenticationProceed()`.
-                httpAuthHandler = handler;
+                                                // Wait for the processes to finish.
+                                                deleteLocalStorageProcess.waitFor();
+                                                deleteIndexProcess.waitFor();
+                                                deleteQuotaManagerProcess.waitFor();
+                                                deleteQuotaManagerJournalProcess.waitFor();
+                                                deleteDatabasesProcess.waitFor();
+                                            } catch (Exception exception) {
+                                                // Do nothing if an error is thrown.
+                                            }
+                                        };
 
-                // Display the HTTP authentication dialog.
-                DialogFragment httpAuthenticationDialogFragment = HttpAuthenticationDialog.displayDialog(host, realm);
-                httpAuthenticationDialogFragment.show(fragmentManager, getString(R.string.http_authentication));
-            }
+                                        // Manually delete the DOM storage files after 200 milliseconds.
+                                        deleteDomStorageHandler.postDelayed(deleteDomStorageRunnable, 200);
+                                }
+                            }
+                        })
+                        .show();
+                return true;
 
-            // Update the URL in urlTextBox when the page starts to load.
-            @Override
-            public void onPageStarted(WebView view, String url, Bitmap favicon) {
-                // Set `urlIsLoading` to `true`, so that redirects while loading do not trigger changes in the user agent, which forces another reload of the existing page.
-                // This is also used to determine when to check for pinned mismatches.
-                urlIsLoading = true;
+            // Form data can be remove once the minimum API >= 26.
+            case R.id.clear_form_data:
+                Snackbar.make(findViewById(R.id.webviewpager), R.string.form_data_deleted, Snackbar.LENGTH_LONG)
+                        .setAction(R.string.undo, v -> {
+                            // Do nothing because everything will be handled by `onDismissed()` below.
+                        })
+                        .addCallback(new Snackbar.Callback() {
+                            @SuppressLint("SwitchIntDef")  // Ignore the lint warning about not handling the other possible events as they are covered by `default:`.
+                            @Override
+                            public void onDismissed(Snackbar snackbar, int event) {
+                                switch (event) {
+                                    // The user pushed the undo button.
+                                    case Snackbar.Callback.DISMISS_EVENT_ACTION:
+                                        // Do nothing.
+                                        break;
 
-                // Reset the list of host IP addresses.
-                currentHostIpAddresses = "";
+                                    // The snackbar was dismissed without the `Undo` button being pushed.
+                                    default:
+                                        // Delete the form data.
+                                        WebViewDatabase mainWebViewDatabase = WebViewDatabase.getInstance(getApplicationContext());
+                                        mainWebViewDatabase.clearFormData();
+                                }
+                            }
+                        })
+                        .show();
+                return true;
 
-                // Reset the list of resource requests.
-                resourceRequests.clear();
+            case R.id.easylist:
+                // Toggle the EasyList status.
+                easyListEnabled = !easyListEnabled;
 
-                // Initialize the counters for requests blocked by each blocklist.
-                blockedRequests = 0;
-                easyListBlockedRequests = 0;
-                easyPrivacyBlockedRequests = 0;
-                fanboysAnnoyanceListBlockedRequests = 0;
-                fanboysSocialBlockingListBlockedRequests = 0;
-                ultraPrivacyBlockedRequests = 0;
-                thirdPartyBlockedRequests = 0;
+                // Update the menu checkbox.
+                menuItem.setChecked(easyListEnabled);
 
-                // If night mode is enabled, hide `mainWebView` until after the night mode CSS is applied.
-                if (nightMode) {
-                &n