]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/commitdiff
Add Russian strings translation. Partial EasyList Implementation.
authorSoren Stoutner <soren@stoutner.com>
Tue, 6 Feb 2018 04:38:53 +0000 (21:38 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 6 Feb 2018 04:38:53 +0000 (21:38 -0700)
19 files changed:
.gitignore
.idea/codeStyleSettings.xml
.idea/codeStyles/Project.xml [new file with mode: 0644]
.idea/codeStyles/codeStyleConfig.xml [new file with mode: 0644]
.idea/dictionaries/soren.xml
.idea/misc.xml
app/build.gradle
app/src/main/assets/es/about_privacy_policy_dark.html
app/src/main/assets/es/about_privacy_policy_light.html
app/src/main/assets/it/about_changelog_dark.html
app/src/main/assets/it/about_changelog_light.html
app/src/main/assets/it/about_privacy_policy_dark.html
app/src/main/assets/it/about_privacy_policy_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
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 [new file with mode: 0644]
app/src/main/res/values/strings.xml

index 6fe7993615a18e0ccf4e335685d5a0d8dc9542ce..c8173b9e50892515921a42b4259291f500c0753f 100644 (file)
@@ -1,5 +1,6 @@
 .gradle
 /local.properties
+/.idea/caches
 /.idea/workspace.xml
 /.idea/libraries
 .DS_Store
index 9d3a09009fe23588e238e315967d0f91cee438a8..d102bb3e2b83a7f1ac5aa1f1364e1ab9e43ca8df 100644 (file)
@@ -3,6 +3,7 @@
   <component name="ProjectCodeStyleSettingsManager">
     <option name="PER_PROJECT_SETTINGS">
       <value>
+        <option name="LINE_SEPARATOR" value="&#10;" />
         <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
         <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
         <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
@@ -35,9 +36,6 @@
           <option name="USE_CUSTOM_SETTINGS" value="true" />
         </AndroidXmlCodeStyleSettings>
         <Objective-C-extensions>
-          <option name="GENERATE_INSTANCE_VARIABLES_FOR_PROPERTIES" value="ASK" />
-          <option name="RELEASE_STYLE" value="IVAR" />
-          <option name="TYPE_QUALIFIERS_PLACEMENT" value="BEFORE" />
           <file>
             <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
             <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644 (file)
index 0000000..ae45a4a
--- /dev/null
@@ -0,0 +1,222 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <option name="RIGHT_MARGIN" value="100" />
+    <AndroidXmlCodeStyleSettings>
+      <option name="USE_CUSTOM_SETTINGS" value="true" />
+    </AndroidXmlCodeStyleSettings>
+    <JavaCodeStyleSettings>
+      <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
+      <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
+      <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
+        <value />
+      </option>
+      <option name="IMPORT_LAYOUT_TABLE">
+        <value>
+          <package name="android" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="com" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="junit" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="net" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="org" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="java" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="javax" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="" withSubpackages="true" static="false" />
+          <emptyLine />
+          <package name="" withSubpackages="true" static="true" />
+          <emptyLine />
+        </value>
+      </option>
+    </JavaCodeStyleSettings>
+    <Objective-C-extensions>
+      <file>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
+      </file>
+      <class>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
+      </class>
+      <extensions>
+        <pair source="cpp" header="h" fileNamingConvention="NONE" />
+        <pair source="c" header="h" fileNamingConvention="NONE" />
+      </extensions>
+    </Objective-C-extensions>
+    <XML>
+      <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
+    </XML>
+    <codeStyleSettings language="XML">
+      <option name="FORCE_REARRANGE_MODE" value="1" />
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="4" />
+      </indentOptions>
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:layout_width</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:layout_height</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:layout_.*</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:width</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:height</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+  </code_scheme>
+</component>
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644 (file)
index 0000000..79ee123
--- /dev/null
@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+  </state>
+</component>
\ No newline at end of file
index 02429b2f969c463af2fefa83b454b4bc03c23199..4205b54db681c3b61ea575c8ba68ae8f1712a13a 100644 (file)
@@ -87,6 +87,7 @@
       <w>parameterized</w>
       <w>parentfolder</w>
       <w>pinnedsslcertificate</w>
+      <w>privacybrowser</w>
       <w>programatically</w>
       <w>proxying</w>
       <w>qwant</w>
       <w>sslissuedtoorganization</w>
       <w>sslissuedtoorganizationalunit</w>
       <w>sslstartdate</w>
+      <w>stoutner</w>
       <w>subdomain</w>
       <w>subdomains</w>
       <w>subfolders</w>
       <w>verizons</w>
       <w>webkay</w>
       <w>webkitversion</w>
+      <w>websocket</w>
       <w>whatismyip</w>
       <w>wouldn</w>
       <w>yoyo</w>
index 4a0c9c497490c6fad7a7dc7fa0e3cce68bf8868a..75dac502959ec4f6e5232282499067f85aa716f5 100644 (file)
@@ -1,8 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="EntryPointsManager">
-    <entry_points version="2.0" />
-  </component>
   <component name="NullableNotNullManager">
     <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
     <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
index 8644364d5981838f81f4708b0967a2f20f65db11..c181e0cf7f7c81af0cf9b3e0b6fba8e300b962de 100644 (file)
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 26
-    buildToolsVersion '26.0.3'
+    compileSdkVersion 27
+    buildToolsVersion '27.0.3'
     defaultConfig {
         minSdkVersion 19
-        targetSdkVersion 26
+        targetSdkVersion 27
         versionCode 29
         versionName "2.7.2"
     }
@@ -65,7 +65,7 @@ android {
 
 dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
-    implementation 'com.android.support:design:26.1.0'
+    implementation 'com.android.support:design:27.0.2'
     // Only compile `com.google.firebase:firebase-ads` for the free flavor.
     freeImplementation 'com.google.firebase:firebase-ads:11.8.0'
 }
index e37a58bf1b915a58678d1ae956f2a98ee02e45d3..138a7c456f481dcd886b33009212e61c7768ea2f 100644 (file)
@@ -82,8 +82,7 @@
         <p>Los usuarios pueden elegir enviar comunicaciones directas a Stoutner, como mensajes de correo electrΓ³nico y comentarios en <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
 
         <h3>Uso de InformaciΓ³n</h3>
-        <p><strong class="blue">Stoutner puede usar esta informaciΓ³n de cualquier forma que ayude en el desarrollo de Navegador Privado,
-            como solucionar problemas de informes de errores o en el desarrollo de caracterΓ­sticas, incluyendo compartir la informaciΓ³n con una tercera parte para ayudar en este proceso.</strong>
+        <p><strong class="blue">Stoutner puede utilizar esta informaciΓ³n para ayudar en el desarrollo de Navegador Privado y comunicar el estado del proyecto a los usuarios.</strong>
             <strong class="red">Stoutner nunca vendrΓ‘ la informaciΓ³n ni la transferirΓ‘ a ninguna tercera parte que la pudiera usar para publicidad o marketing.</strong></p>
 
         <hr />
index c5c6609d4383c311148070f12c3906bceca6d399..820083c7c06a478a8a7f862ff80593ff294e4054 100644 (file)
@@ -82,8 +82,7 @@
         <p>Los usuarios pueden elegir enviar comunicaciones directas a Stoutner, como mensajes de correo electrΓ³nico y comentarios en <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
 
         <h3>Uso de InformaciΓ³n</h3>
-        <p><strong class="blue">Stoutner puede usar esta informaciΓ³n de cualquier forma que ayude en el desarrollo de Navegador Privado,
-            como solucionar problemas de informes de errores o en el desarrollo de caracterΓ­sticas, incluyendo compartir la informaciΓ³n con una tercera parte para ayudar en este proceso.</strong>
+        <p><strong class="blue">Stoutner puede utilizar esta informaciΓ³n para ayudar en el desarrollo de Navegador Privado y comunicar el estado del proyecto a los usuarios.</strong>
             <strong class="red">Stoutner nunca vendrΓ‘ la informaciΓ³n ni la transferirΓ‘ a ninguna tercera parte que la pudiera usar para publicidad o marketing.</strong></p>
 
         <hr />
index 79657c3502ab4af9f47f18622d8c92adc2fcf343..ed351893f32b56e1c1308b4d560020da68b852e3 100644 (file)
         </ul>
 
         <h3>1.14.1 (versione codice 17)</h3>
-        <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=5bd318993ebf675433f514dd04fc3e29545c9312">4 January 2017</a> - minima API 19, target API 25</p>
+        <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=5bd318993ebf675433f514dd04fc3e29545c9312">4 Gennaio 2017</a> - minima API 19, target API 25</p>
         <ul>
             <li>Fix a bug that caused Privacy Browser to <a href="https://redmine.stoutner.com/issues/80">crash on some websites</a> when ad blocking was enabled.</li>
         </ul>
index 3b71ff8bccef5123040cd7bc786a5819d27f3033..c6bb6413e480d79a2922c3096d02b6ff2b48578f 100644 (file)
         </ul>
 
         <h3>1.14.1 (versione codice 17)</h3>
-        <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=5bd318993ebf675433f514dd04fc3e29545c9312">4 January 2017</a> - minima API 19, target API 25</p>
+        <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=5bd318993ebf675433f514dd04fc3e29545c9312">4 Gennaio 2017</a> - minima API 19, target API 25</p>
         <ul>
             <li>Fix a bug that caused Privacy Browser to <a href="https://redmine.stoutner.com/issues/80">crash on some websites</a> when ad blocking was enabled.</li>
         </ul>
index aa420fe0fb1fc2ed33fb07d9fe817555ebdf6b20..372d277062c837753de7da371a618488b0c61d50 100644 (file)
 
 
         <h3>Utilizzo delle informazioni</h3>
-        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser, ovvero per la correzione di bug o lo sviluppo di nuove funzionalitΓ ,
-            con la possibilitΓ  di condividerle con terze parti che forniscano assistenza per queste attivitΓ .</strong>
+        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser e per comunicazioni sullo stato del progetto verso gli utenti.</strong>
             <strong class="red">Stoutner non rivenderΓ  o comunque non trasferirΓ  mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisione 1.5, 20 Aprile 2017</em></p>
+        <p style="text-align: center;"><em>Revisione 1.5, 11 Gennaio 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index fcaf6db0ae727e47d044dacaf2bed3aa7399f966..aca6756f58d058dece456034568316246a76dbbe 100644 (file)
 
 
         <h3>Utilizzo delle informazioni</h3>
-        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser, ovvero per la correzione di bug o lo sviluppo di nuove funzionalitΓ ,
-            con la possibilitΓ  di condividerle con terze parti che forniscano assistenza per queste attivitΓ .</strong>
+        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser e per comunicazioni sullo stato del progetto verso gli utenti.</strong>
             <strong class="red">Stoutner non rivenderΓ  o comunque non trasferirΓ  mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisione 1.5, 20 Aprile 2017</em></p>
+        <p style="text-align: center;"><em>Revisione 1.5, 11 Gennaio 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index 9cb3a71a4ce61628206eef57e3b0e81a1b438adf..cfe93f2740163d27a76435965151891ecfe69404 100644 (file)
@@ -22,6 +22,7 @@
 package com.stoutner.privacybrowser.activities;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.app.DialogFragment;
 import android.app.DownloadManager;
 import android.content.BroadcastReceiver;
@@ -137,29 +138,36 @@ import java.net.URLEncoder;
 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;
+import java.util.regex.Pattern;
 
 // We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21.
-public class MainWebViewActivity extends AppCompatActivity implements AddDomainDialog.AddDomainListener, CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener, CreateHomeScreenShortcutDialog.CreateHomeScreenSchortcutListener,
-        DownloadFileDialog.DownloadFileListener, DownloadImageDialog.DownloadImageListener, EditBookmarkDialog.EditBookmarkListener, EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener,
-        NavigationView.OnNavigationItemSelectedListener, PinnedSslCertificateMismatchDialog.PinnedSslCertificateMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener, UrlHistoryDialog.UrlHistoryListener {
-
-    // `darkTheme` is public static so it can be accessed from `AboutActivity`, `GuideActivity`, `AddDomainDialog`, `SettingsActivity`, `DomainsActivity`, `DomainsListFragment`, `BookmarksActivity`, `BookmarksDatabaseViewActivity`,
-    // `CreateBookmarkDialog`, `CreateBookmarkFolderDialog`, `DownloadFileDialog`, `DownloadImageDialog`, `EditBookmarkDialog`, `EditBookmarkFolderDialog`, `EditBookmarkDatabaseViewDialog`, `HttpAuthenticationDialog`, `MoveToFolderDialog`,
-    // `SslCertificateErrorDialog`, `UrlHistoryDialog`, `ViewSslCertificateDialog`, `CreateHomeScreenShortcutDialog`, and `OrbotProxyHelper`. It is also used in `onCreate()`, `applyAppSettings()`, `applyDomainSettings()`, and `updatePrivacyIcons()`.
+public class MainWebViewActivity extends AppCompatActivity implements AddDomainDialog.AddDomainListener, CreateBookmarkDialog.CreateBookmarkListener,
+        CreateBookmarkFolderDialog.CreateBookmarkFolderListener, CreateHomeScreenShortcutDialog.CreateHomeScreenSchortcutListener, DownloadFileDialog.DownloadFileListener,
+        DownloadImageDialog.DownloadImageListener, EditBookmarkDialog.EditBookmarkListener, EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener,
+        NavigationView.OnNavigationItemSelectedListener, PinnedSslCertificateMismatchDialog.PinnedSslCertificateMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener,
+        UrlHistoryDialog.UrlHistoryListener {
+
+    // `darkTheme` is public static so it can be accessed from `AboutActivity`, `GuideActivity`, `AddDomainDialog`, `SettingsActivity`, `DomainsActivity`, `DomainsListFragment`, `BookmarksActivity`,
+    // `BookmarksDatabaseViewActivity`, `CreateBookmarkDialog`, `CreateBookmarkFolderDialog`, `DownloadFileDialog`, `DownloadImageDialog`, `EditBookmarkDialog`, `EditBookmarkFolderDialog`,
+    // `EditBookmarkDatabaseViewDialog`, `HttpAuthenticationDialog`, `MoveToFolderDialog`, `SslCertificateErrorDialog`, `UrlHistoryDialog`, `ViewSslCertificateDialog`, `CreateHomeScreenShortcutDialog`,
+    //  and `OrbotProxyHelper`. It is also used in `onCreate()`, `applyAppSettings()`, `applyDomainSettings()`, and `updatePrivacyIcons()`.
     public static boolean darkTheme;
 
-    // `favoriteIconBitmap` is public static so it can be accessed from `CreateHomeScreenShortcutDialog`, `BookmarksActivity`, `BookmarksDatabaseViewActivity`, `CreateBookmarkDialog`, `CreateBookmarkFolderDialog`, `EditBookmarkDialog`,
-    // `EditBookmarkFolderDialog`, `EditBookmarkDatabaseViewDialog`, and `ViewSslCertificateDialog`.  It is also used in `onCreate()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onCreateHomeScreenShortcutCreate()`, `onSaveEditBookmark()`,
-    // `onSaveEditBookmarkFolder()`, and `applyDomainSettings()`.
+    // `favoriteIconBitmap` is public static so it can be accessed from `CreateHomeScreenShortcutDialog`, `BookmarksActivity`, `BookmarksDatabaseViewActivity`, `CreateBookmarkDialog`,
+    // `CreateBookmarkFolderDialog`, `EditBookmarkDialog`, `EditBookmarkFolderDialog`, `EditBookmarkDatabaseViewDialog`, and `ViewSslCertificateDialog`.  It is also used in `onCreate()`,
+    // `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onCreateHomeScreenShortcutCreate()`, `onSaveEditBookmark()`, `onSaveEditBookmarkFolder()`, and `applyDomainSettings()`.
     public static Bitmap favoriteIconBitmap;
 
     // `formattedUrlString` is public static so it can be accessed from `BookmarksActivity`, `CreateBookmarkDialog`, and `AddDomainDialog`.
     // It is also used in `onCreate()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onCreateHomeScreenShortcutCreate()`, and `loadUrlFromTextBox()`.
     public static String formattedUrlString;
 
-    // `sslCertificate` is public static so it can be accessed from `DomainsActivity`, `DomainsListFragment`, `DomainSettingsFragment`, `PinnedSslCertificateMismatchDialog`, and `ViewSslCertificateDialog`.  It is also used in `onCreate()`.
+    // `sslCertificate` is public static so it can be accessed from `DomainsActivity`, `DomainsListFragment`, `DomainSettingsFragment`, `PinnedSslCertificateMismatchDialog`,
+    // and `ViewSslCertificateDialog`.  It is also used in `onCreate()`.
     public static SslCertificate sslCertificate;
 
     // `orbotStatus` is public static so it can be accessed from `OrbotProxyHelper`.  It is also used in `onCreate()`.
@@ -186,8 +194,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     // `easyListVersion` is public static so it can be accessed from `AboutTabFragment`.  It is also used in `onCreate()`.
     public static String easyListVersion;
 
-    // `currentBookmarksFolder` is public static so it can be accessed from `BookmarksActivity`.  It is also used in `onCreate()`, `onBackPressed()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onSaveEditBookmark()`, `onSaveEditBookmarkFolder()`, and
-    // `loadBookmarksFolder()`.
+    // `currentBookmarksFolder` is public static so it can be accessed from `BookmarksActivity`.  It is also used in `onCreate()`, `onBackPressed()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`,
+    // `onSaveEditBookmark()`, `onSaveEditBookmarkFolder()`, and `loadBookmarksFolder()`.
     public static String currentBookmarksFolder;
 
     // `domainSettingsDatabaseId` is public static so it can be accessed from `PinnedSslCertificateMismatchDialog`.  It is also used in `onCreate()`, `onOptionsItemSelected()`, and `applyDomainSettings()`.
@@ -219,8 +227,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     // `rootCoordinatorLayout` is used in `onCreate()` and `applyAppSettings()`.
     private CoordinatorLayout rootCoordinatorLayout;
 
-    // `mainWebView` is used in `onCreate()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onRestart()`, `onCreateContextMenu()`, `findPreviousOnPage()`, `findNextOnPage()`, `closeFindOnPage()`, `loadUrlFromTextBox()`
-    // `onSslMismatchBack()`, and `setDisplayWebpageImages()`.
+    // `mainWebView` is used in `onCreate()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onRestart()`, `onCreateContextMenu()`, `findPreviousOnPage()`,
+    // `findNextOnPage()`, `closeFindOnPage()`, `loadUrlFromTextBox()`, `onSslMismatchBack()`, and `setDisplayWebpageImages()`.
     private WebView mainWebView;
 
     // `fullScreenVideoFrameLayout` is used in `onCreate()` and `onConfigurationChanged()`.
@@ -400,40 +408,734 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         // Run the default commands.
         super.onCreate(savedInstanceState);
 
-        // **DEBUG** Log the beginning of the loading of the ad blocker.
-        Log.i("AdBlocker", "Begin loading ad blocker");
-
-        // Initialize `adServerSet`.
-        final Set<String> adServersSet = new HashSet<>();
-
-        // Load the list of ad servers into memory.
+        Log.i("BlockLists", "Begin populating block lists.");
+
+        // Initialize the block lists.
+        List<String> mainWhiteList = new LinkedList<>();
+        List<String[]> multiEntryWhiteList = new LinkedList<>();
+        List<String> mainBlockList = new LinkedList<>();
+        List<String> initialBlockList = new LinkedList<>();
+        List<String> finalBlockList = new LinkedList<>();
+        List<String[]> multiEntryBlockList = new LinkedList<>();
+        List<String[]> multiEntryInitialBlockList = new LinkedList<>();
+        List<String[]> multiEntryFinalBlockList = new LinkedList<>();
+        List<String[]> domainBlockList = new LinkedList<>();
+        List<String[]> domainInitialBlockList = new LinkedList<>();
+        List<String[]> domainFinalBlockList = new LinkedList<>();
+        List<String[]> domainMultiEntryBlockList = new LinkedList<>();
+        List<String[]> domainRegularExpressionBlockList = new LinkedList<>();
+        List<String> regularExpressionBlockList = new LinkedList<>();
+
+        // Populate the block lists.
         try {
             // Load `easylist.txt` into a `BufferedReader`.
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getAssets().open("easylist.txt")));
 
-            // Create a string for storing each ad server.
-            String adBlockerEntry;
+            // Create a string for storing the block list entries.
+            String blockListEntry;
 
-            // Populate `adServersSet`.
-            while ((adBlockerEntry = bufferedReader.readLine()) != null) {
+            // Parse EasyList.
+            while ((blockListEntry = bufferedReader.readLine()) != null) {
                 //noinspection StatementWithEmptyBody
-                if (adBlockerEntry.contains("##") || adBlockerEntry.contains("#?#") || adBlockerEntry.contains("#@#") || adBlockerEntry.startsWith("[")) {
+                if (blockListEntry.contains("##") || blockListEntry.contains("#?#") || blockListEntry.contains("#@#") || blockListEntry.startsWith("[")) {
                     // Entries that contain `##`, `#?#`, and `#@#` are for hiding elements in the main page's HTML.  Entries that start with `[` describe the AdBlock compatibility level.
 
                     // Do nothing.  Privacy Browser does not currently use these entries.
 
-                    // **DEBUG** Log the entries that are not added.
-                    // Log.i("AdBlocker", "Not added: " + adBlockerEntry);
-                } else if (adBlockerEntry.startsWith("!")){  //  Entries that begin with `!` are comments.
-                    if (adBlockerEntry.startsWith("! Version:")) {
+                    //Log.i("BlackLists", "Not added: " + adBlockerEntry);
+                } else if (blockListEntry.startsWith("!")){  //  Entries that begin with `!` are comments.
+                    if (blockListEntry.startsWith("! Version:")) {
                         // Store the EasyList version number.
-                        easyListVersion = adBlockerEntry.substring(11);
+                        easyListVersion = blockListEntry.substring(11);
                     }
 
-                    // **DEBUG** Log the entries that are not added.
-                    // Log.i("AdBlocker", "Not added: " + adBlockerEntry);
-                } else {
-                    adServersSet.add(adBlockerEntry);
+                    //Log.i("BlackLists", "Not added: " + adBlockerEntry);
+                } else if (blockListEntry.startsWith("@@")) {  // Entries that begin with `@@` are excludes (whitelists).
+                    // mainWhiteList.add(blockListEntry.substring(2));
+
+                    //Log.i("BlockLists", "Main white list added: " + blockListEntry.substring(2, blockListEntry.length()));
+                } else if (blockListEntry.endsWith("|")){  // Entries that end with `|` match against the end of the URL.
+                    // Strip out the final "|"
+                    blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+
+                    // Strip out any initial `||`.  They are redundant in this case because the block list entry is being matched against the end of the URL.
+                    if (blockListEntry.startsWith("||")) {
+                        blockListEntry = blockListEntry.substring(2);
+                    }
+
+                    if (blockListEntry.contains("*")) {
+                        int wildcardIndex = blockListEntry.indexOf("*");
+
+                        String firstEntry = blockListEntry.substring(0, wildcardIndex);
+                        String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+                        if (firstEntry.endsWith("^")) {
+                            String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+                            String firstEntry1 = firstEntryBase + ":";
+                            String firstEntry2 = firstEntryBase + "/";
+                            String firstEntry3 = firstEntryBase + "?";
+                            String firstEntry4 = firstEntryBase + "=";
+                            String firstEntry5 = firstEntryBase + "&";
+
+                            String[] doubleEntry1 = {firstEntry1, secondEntry};
+                            String[] doubleEntry2 = {firstEntry2, secondEntry};
+                            String[] doubleEntry3 = {firstEntry3, secondEntry};
+                            String[] doubleEntry4 = {firstEntry4, secondEntry};
+                            String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+                            multiEntryFinalBlockList.add(doubleEntry1);
+                            multiEntryFinalBlockList.add(doubleEntry2);
+                            multiEntryFinalBlockList.add(doubleEntry3);
+                            multiEntryFinalBlockList.add(doubleEntry4);
+                            multiEntryFinalBlockList.add(doubleEntry5);
+
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry1 + " , " + secondEntry);
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry2 + " , " + secondEntry);
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry3 + " , " + secondEntry);
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry4 + " , " + secondEntry);
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry5 + " , " + secondEntry);
+                        } else {
+                            String[] doubleEntry = {firstEntry, secondEntry};
+
+                            multiEntryFinalBlockList.add(doubleEntry);
+
+                            //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntry);
+                        }
+                    } else {
+                        finalBlockList.add(blockListEntry);
+
+                        //Log.i("BlockLists", "Final block list added: " + blockListEntry);
+                    }
+                } else if (blockListEntry.contains("$")) {  // Entries that contain `$` use filter options.
+                    // Strip out any initial `||`.  These will be treated like any other entry.
+                    if (blockListEntry.startsWith("||")) {
+                        blockListEntry = blockListEntry.substring(2);
+                    }
+
+                    if (blockListEntry.contains("third-party")) {
+                        // Log.i("BlockLists", "Not added: " + blockListEntry);
+                    } else if (blockListEntry.substring(blockListEntry.indexOf("$")).contains("domain")) {
+                        if (blockListEntry.contains("~")) {  // Whitelist.
+
+                        } else {
+                            // Separate the filters.
+                            String entry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+                            String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1);
+                            String domains = filters.substring(filters.indexOf("domain=") + 7);
+
+                            // Only process the block list item if the entry is not null.  Some lines in EasyList begin with `$websocket`, which create a null entry.
+                            if (!entry.equals("")) {
+                                do {
+                                    String domain;
+
+                                    if (domains.contains("|")) {
+                                        // Get the first domain.
+                                        domain = domains.substring(0, domains.indexOf("|"));
+
+                                        // Remove the first domain from the list.
+                                        domains = domains.substring(domains.indexOf("|") + 1);
+                                    } else {
+                                        domain = domains;
+                                    }
+
+                                    if (entry.contains("*")) {
+                                        int wildcardIndex = entry.indexOf("*");
+
+                                        String firstEntry = entry.substring(0, wildcardIndex);
+                                        String secondEntry = entry.substring(wildcardIndex + 1);
+
+                                        if (firstEntry.endsWith("^")) {
+                                            String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+                                            String firstEntry1 = firstEntryBase + ":";
+                                            String firstEntry2 = firstEntryBase + "/";
+                                            String firstEntry3 = firstEntryBase + "?";
+                                            String firstEntry4 = firstEntryBase + "=";
+                                            String firstEntry5 = firstEntryBase + "&";
+
+                                            String[] domainDoubleEntry1 = {domain, firstEntry1, secondEntry};
+                                            String[] domainDoubleEntry2 = {domain, firstEntry2, secondEntry};
+                                            String[] domainDoubleEntry3 = {domain, firstEntry3, secondEntry};
+                                            String[] domainDoubleEntry4 = {domain, firstEntry4, secondEntry};
+                                            String[] domainDoubleEntry5 = {domain, firstEntry5, secondEntry};
+
+                                            domainMultiEntryBlockList.add(domainDoubleEntry1);
+                                            domainMultiEntryBlockList.add(domainDoubleEntry2);
+                                            domainMultiEntryBlockList.add(domainDoubleEntry3);
+                                            domainMultiEntryBlockList.add(domainDoubleEntry4);
+                                            domainMultiEntryBlockList.add(domainDoubleEntry5);
+
+                                            //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry1 + " , " + secondEntry);
+                                            //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry2 + " , " + secondEntry);
+                                            //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry3 + " , " + secondEntry);
+                                            //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry4 + " , " + secondEntry);
+                                            //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry5 + " , " + secondEntry);
+                                        } else {
+                                            String[] domainDoubleEntry = {domain, firstEntry, secondEntry};
+
+                                            domainMultiEntryBlockList.add(domainDoubleEntry);
+
+                                            //Log.i("BlockLists", "Domain double entry block list added: " + domain + " , " + firstEntry + " , " + secondEntry);
+                                        }
+                                    } else if (entry.endsWith("^")) {
+                                        String entryBase = entry.substring(0, entry.length() - 1);
+
+                                        String entry1 = entryBase + ":";
+                                        String entry2 = entryBase + "/";
+                                        String entry3 = entryBase + "?";
+                                        String entry4 = entryBase + "=";
+                                        String entry5 = entryBase + "&";
+
+                                        String[] domainEntry1 = {domain, entry1};
+                                        String[] domainEntry2 = {domain, entry2};
+                                        String[] domainEntry3 = {domain, entry3};
+                                        String[] domainEntry4 = {domain, entry4};
+                                        String[] domainEntry5 = {domain, entry5};
+
+                                        domainBlockList.add(domainEntry1);
+                                        domainBlockList.add(domainEntry2);
+                                        domainBlockList.add(domainEntry3);
+                                        domainBlockList.add(domainEntry4);
+                                        domainBlockList.add(domainEntry5);
+
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry1);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry2);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry3);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry4);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry5);
+                                    } else if (entry.startsWith("^")) {
+                                        String entryBase = entry.substring(1);
+
+                                        String entry1 = ":" + entryBase;
+                                        String entry2 = ":" + entryBase;
+                                        String entry3 = ":" + entryBase;
+                                        String entry4 = ":" + entryBase;
+                                        String entry5 = ":" + entryBase;
+
+                                        String[] domainEntry1 = {domain, entry1};
+                                        String[] domainEntry2 = {domain, entry2};
+                                        String[] domainEntry3 = {domain, entry3};
+                                        String[] domainEntry4 = {domain, entry4};
+                                        String[] domainEntry5 = {domain, entry5};
+
+                                        domainBlockList.add(domainEntry1);
+                                        domainBlockList.add(domainEntry2);
+                                        domainBlockList.add(domainEntry3);
+                                        domainBlockList.add(domainEntry4);
+                                        domainBlockList.add(domainEntry5);
+
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry1);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry2);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry3);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry4);
+                                        //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry5);
+                                    } else if (entry.startsWith("|")) {
+                                        // Remove the initial `|`;
+                                        String entryBase = entry.substring(1);
+
+                                        //noinspection StatementWithEmptyBody
+                                        if (entryBase.equals("http://") || entryBase.equals("https://")) {
+                                            // Do nothing.  These entries will entirely block the website.
+                                            // Often the original entry blocks `$script` but Privacy Browser does not currently differentiate between scripts and other entries.
+                                        } else {
+                                            String[] domainEntry = {domain, entryBase};
+
+                                            domainInitialBlockList.add(domainEntry);
+
+                                            //Log.i("BlockLists", "Domain initial block list added: " + domain + " , " + entryBase);
+                                        }
+                                    } else if (entry.endsWith("|")) {
+                                        // Remove the final `|`.
+                                        String entryBase = entry.substring(0, entry.length() - 1);
+
+                                        String[] domainEntry = {domain, entryBase};
+
+                                        domainFinalBlockList.add(domainEntry);
+
+                                        Log.i("BlockLists", "Domain final block list added: " + domain + " , " + entryBase);
+                                    } else if (entry.contains("\\")) {
+                                        String[] domainEntry = {domain, entry};
+
+                                        domainRegularExpressionBlockList.add(domainEntry);
+
+                                        // Log.i("BlockLists", "Domain regular expression block list added: " + domain + " , " + entry);
+                                    } else {
+                                        String[] domainEntry = {domain, entry};
+
+                                        domainBlockList.add(domainEntry);
+
+                                        //Log.i("BlockLists", "Domain block list added: " + domain + " , " + entry);
+                                    }
+                                } while (domains.contains("|"));
+                            }
+                        }
+                    } else if (blockListEntry.contains("~")) {  // Whitelist entries.
+                        // Remove the filter options.
+                        blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+                        // Strip any trailing `*`.
+                        if (blockListEntry.endsWith("*")) {
+                            blockListEntry = blockListEntry.substring(0, blockListEntry.length() -1);
+                        }
+
+                        if (blockListEntry.contains("*")) {
+                            int wildcardIndex = blockListEntry.indexOf("*");
+
+                            String firstEntry = blockListEntry.substring(0, wildcardIndex);
+                            String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+                            if (firstEntry.endsWith("^")) {
+                                String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+                                String firstEntry1 = firstEntryBase + ":";
+                                String firstEntry2 = firstEntryBase + "/";
+                                String firstEntry3 = firstEntryBase + "?";
+                                String firstEntry4 = firstEntryBase + "=";
+                                String firstEntry5 = firstEntryBase + "&";
+
+                                String[] doubleEntry1 = {firstEntry1, secondEntry};
+                                String[] doubleEntry2 = {firstEntry2, secondEntry};
+                                String[] doubleEntry3 = {firstEntry3, secondEntry};
+                                String[] doubleEntry4 = {firstEntry4, secondEntry};
+                                String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+                                multiEntryWhiteList.add(doubleEntry1);
+                                multiEntryWhiteList.add(doubleEntry2);
+                                multiEntryWhiteList.add(doubleEntry3);
+                                multiEntryWhiteList.add(doubleEntry4);
+                                multiEntryWhiteList.add(doubleEntry5);
+
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry1 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry2 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry3 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry4 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry5 + " , " + secondEntry);
+                            } else {
+                                String[] doubleEntry = {firstEntry, secondEntry};
+
+                                multiEntryWhiteList.add(doubleEntry);
+
+                                //Log.i("BlockLists", "Multi entry white list added: " + firstEntry + " , " + secondEntry);
+                            }
+                        } else {
+                            if (blockListEntry.endsWith("^")) {
+                                String blockListEntryBase = blockListEntry.substring(0, blockListEntry.length() - 1);
+
+                                String blockListEntry1 = blockListEntryBase + ":";
+                                String blockListEntry2 = blockListEntryBase + "/";
+                                String blockListEntry3 = blockListEntryBase + "?";
+                                String blockListEntry4 = blockListEntryBase + "=";
+                                String blockListEntry5 = blockListEntryBase + "&";
+
+                                mainWhiteList.add(blockListEntry1);
+                                mainWhiteList.add(blockListEntry2);
+                                mainWhiteList.add(blockListEntry3);
+                                mainWhiteList.add(blockListEntry4);
+                                mainWhiteList.add(blockListEntry5);
+
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry1);
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry2);
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry3);
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry4);
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry5);
+                            } else {
+                                mainWhiteList.add(blockListEntry);
+
+                                // Log.i("BlockLists", "Main white list added: " + blockListEntry);
+                            }
+                        }
+                    } else if (blockListEntry.contains("\\")) {  // Regular expressions.
+                        // Remove the filter options.
+                        blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+                        regularExpressionBlockList.add(blockListEntry);
+
+                        //Log.i("BlockLists", "Regular expression list added: " + blockListEntry);
+                    } else {
+                        // Remove the filter options.
+                        blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+                        // Strip any trailing `*` or `^`.  Many of these entries have `^$`, which seem redundant for the purposes of Privacy Browser.
+                        if (blockListEntry.endsWith("*") || blockListEntry.endsWith("^")) {
+                            blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+                        }
+
+                        if (blockListEntry.contains("*")) {  // Use a multi entry list.
+                            int wildcardIndex = blockListEntry.indexOf("*");
+
+                            String firstEntry = blockListEntry.substring(0, wildcardIndex);
+                            String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+                            // Remove `.*` if it appears at the beginning of the second entry.
+                            if (secondEntry.startsWith(".*")) {
+                                secondEntry = secondEntry.substring(2);
+                            }
+
+                            // Create a third entry if required.
+                            if (secondEntry.contains("*")) {
+                                wildcardIndex = secondEntry.indexOf("*");
+
+                                String thirdEntry = secondEntry.substring(wildcardIndex + 1);
+                                secondEntry = secondEntry.substring(0, wildcardIndex);
+
+                                if (firstEntry.endsWith("^")) {
+                                    String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+                                    String firstEntry1 = firstEntryBase + ":";
+                                    String firstEntry2 = firstEntryBase + "/";
+                                    String firstEntry3 = firstEntryBase + "?";
+                                    String firstEntry4 = firstEntryBase + "=";
+                                    String firstEntry5 = firstEntryBase + "&";
+
+                                    if (thirdEntry.endsWith("|")) {
+                                        thirdEntry = thirdEntry.substring(0, thirdEntry.length() - 1);
+
+                                        String[] tripleEntry1 = {firstEntry1, secondEntry, thirdEntry};
+                                        String[] tripleEntry2 = {firstEntry2, secondEntry, thirdEntry};
+                                        String[] tripleEntry3 = {firstEntry3, secondEntry, thirdEntry};
+                                        String[] tripleEntry4 = {firstEntry4, secondEntry, thirdEntry};
+                                        String[] tripleEntry5 = {firstEntry5, secondEntry, thirdEntry};
+
+                                        multiEntryFinalBlockList.add(tripleEntry1);
+                                        multiEntryFinalBlockList.add(tripleEntry2);
+                                        multiEntryFinalBlockList.add(tripleEntry3);
+                                        multiEntryFinalBlockList.add(tripleEntry4);
+                                        multiEntryFinalBlockList.add(tripleEntry5);
+
+                                        //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry1 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry2 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry3 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry4 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry5 + " , " + secondEntry + " , " + thirdEntry);
+                                    } else {
+                                        String[] tripleEntry1 = {firstEntry1, secondEntry, thirdEntry};
+                                        String[] tripleEntry2 = {firstEntry2, secondEntry, thirdEntry};
+                                        String[] tripleEntry3 = {firstEntry3, secondEntry, thirdEntry};
+                                        String[] tripleEntry4 = {firstEntry4, secondEntry, thirdEntry};
+                                        String[] tripleEntry5 = {firstEntry5, secondEntry, thirdEntry};
+
+                                        multiEntryBlockList.add(tripleEntry1);
+                                        multiEntryBlockList.add(tripleEntry2);
+                                        multiEntryBlockList.add(tripleEntry3);
+                                        multiEntryBlockList.add(tripleEntry4);
+                                        multiEntryBlockList.add(tripleEntry5);
+
+                                        //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry1 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry2 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry3 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry4 + " , " + secondEntry + " , " + thirdEntry);
+                                        //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry5 + " , " + secondEntry + " , " + thirdEntry);
+                                    }
+                                } else {
+                                    String[] tripleEntry = {firstEntry, secondEntry, thirdEntry};
+
+                                    multiEntryBlockList.add(tripleEntry);
+
+                                    // Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry + " , " + secondEntry + " , " + thirdEntry);
+                                }
+                            } else {  // This is a double entry.
+                                if (firstEntry.startsWith("|")) {
+                                    String[] doubleEntry = {firstEntry.substring(1), secondEntry};
+
+                                    multiEntryInitialBlockList.add(doubleEntry);
+
+                                    //Log.i("BlockLists", "Multi entry initial block list added: " + firstEntry.substring(1) + " , " + secondEntry);
+                                } else if (firstEntry.startsWith("^")) {
+                                    String firstEntryBase = firstEntry.substring(1);
+
+                                    String firstEntry1 = ":" + firstEntryBase;
+                                    String firstEntry2 = "/" + firstEntryBase;
+                                    String firstEntry3 = "?" + firstEntryBase;
+                                    String firstEntry4 = "=" + firstEntryBase;
+                                    String firstEntry5 = "&" + firstEntryBase;
+
+                                    String[] doubleEntry1 = {firstEntry1, secondEntry};
+                                    String[] doubleEntry2 = {firstEntry2, secondEntry};
+                                    String[] doubleEntry3 = {firstEntry3, secondEntry};
+                                    String[] doubleEntry4 = {firstEntry4, secondEntry};
+                                    String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+                                    multiEntryBlockList.add(doubleEntry1);
+                                    multiEntryBlockList.add(doubleEntry2);
+                                    multiEntryBlockList.add(doubleEntry3);
+                                    multiEntryBlockList.add(doubleEntry4);
+                                    multiEntryBlockList.add(doubleEntry5);
+
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+                                } else if (firstEntry.endsWith("^")) {
+                                    String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+                                    String firstEntry1 = firstEntryBase + ":";
+                                    String firstEntry2 = firstEntryBase + "/";
+                                    String firstEntry3 = firstEntryBase + "?";
+                                    String firstEntry4 = firstEntryBase + "=";
+                                    String firstEntry5 = firstEntryBase + "&";
+
+                                    String[] doubleEntry1 = {firstEntry1, secondEntry};
+                                    String[] doubleEntry2 = {firstEntry2, secondEntry};
+                                    String[] doubleEntry3 = {firstEntry3, secondEntry};
+                                    String[] doubleEntry4 = {firstEntry4, secondEntry};
+                                    String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+                                    multiEntryBlockList.add(doubleEntry1);
+                                    multiEntryBlockList.add(doubleEntry2);
+                                    multiEntryBlockList.add(doubleEntry3);
+                                    multiEntryBlockList.add(doubleEntry4);
+                                    multiEntryBlockList.add(doubleEntry5);
+
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+                                } else if (secondEntry.startsWith("^")) {
+                                    String secondEntryBase = secondEntry.substring(1);
+
+                                    String secondEntry1 = ":" + secondEntryBase;
+                                    String secondEntry2 = "/" + secondEntryBase;
+                                    String secondEntry3 = "?" + secondEntryBase;
+                                    String secondEntry4 = "=" + secondEntryBase;
+                                    String secondEntry5 = "&" + secondEntryBase;
+
+                                    String[] doubleEntry1 = {firstEntry, secondEntry1};
+                                    String[] doubleEntry2 = {firstEntry, secondEntry2};
+                                    String[] doubleEntry3 = {firstEntry, secondEntry3};
+                                    String[] doubleEntry4 = {firstEntry, secondEntry4};
+                                    String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+                                    multiEntryBlockList.add(doubleEntry1);
+                                    multiEntryBlockList.add(doubleEntry2);
+                                    multiEntryBlockList.add(doubleEntry3);
+                                    multiEntryBlockList.add(doubleEntry4);
+                                    multiEntryBlockList.add(doubleEntry5);
+
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+                                } else if (secondEntry.endsWith("^")) {
+                                    String secondEntryBase = secondEntry.substring(0, secondEntry.length() - 1);
+
+                                    String secondEntry1 = secondEntryBase + ":";
+                                    String secondEntry2 = secondEntryBase + "/";
+                                    String secondEntry3 = secondEntryBase + "?";
+                                    String secondEntry4 = secondEntryBase + "=";
+                                    String secondEntry5 = secondEntryBase + "&";
+
+                                    String[] doubleEntry1 = {firstEntry, secondEntry1};
+                                    String[] doubleEntry2 = {firstEntry, secondEntry2};
+                                    String[] doubleEntry3 = {firstEntry, secondEntry3};
+                                    String[] doubleEntry4 = {firstEntry, secondEntry4};
+                                    String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+                                    String[] doubleEntryFinal = {firstEntry, secondEntryBase};
+
+                                    multiEntryBlockList.add(doubleEntry1);
+                                    multiEntryBlockList.add(doubleEntry2);
+                                    multiEntryBlockList.add(doubleEntry3);
+                                    multiEntryBlockList.add(doubleEntry4);
+                                    multiEntryBlockList.add(doubleEntry5);
+
+                                    multiEntryFinalBlockList.add(doubleEntryFinal);
+
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+                                    //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+
+                                    //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntryBase);
+                                } else {
+                                    String[] doubleEntry = {firstEntry, secondEntry};
+
+                                    multiEntryBlockList.add(doubleEntry);
+
+                                    //Log.i("BlockLists", "Multi entry block list added: " + firstEntry + " , " + secondEntry);
+                                }
+                            }
+                        } else if (blockListEntry.startsWith("|")) {  // Populate the initial block list.
+                            // Strip the initial `|`.
+                            blockListEntry = blockListEntry.substring(1);
+
+                            // Populate the initial block list.
+                            initialBlockList.add(blockListEntry);
+
+                            //Log.i("BlockLists", "Initial block list added: " + blockListEntry);
+                        } else {  // Populate the main block list.
+                            mainBlockList.add(blockListEntry);
+
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry);
+                        }
+                    }
+                } else {  // Populate the standard lists.
+                    // Strip out any initial `||`.  These will be treated like any other entry.
+                    if (blockListEntry.startsWith("||")) {
+                        blockListEntry = blockListEntry.substring(2);
+                    }
+
+                    // Strip out any initial `*`.
+                    if (blockListEntry.startsWith("*")) {
+                        blockListEntry = blockListEntry.substring(1);
+                    }
+
+                    // Strip out any trailing `*`.
+                    if (blockListEntry.endsWith("*")) {
+                        blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+                    }
+
+                    if (blockListEntry.contains("*")) {  // Entries that contain a `*` in the middle have to be treated specially.
+                        int wildcardIndex = blockListEntry.indexOf("*");
+
+                        String firstEntry = blockListEntry.substring(0, wildcardIndex);
+                        String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+                        // Remove `.*` if it appears at the beginning of the second entry.
+                        if (secondEntry.startsWith(".*")) {
+                            secondEntry = secondEntry.substring(2);
+                        }
+
+                        // Create a third entry if required.
+                        if (secondEntry.contains("*")) {
+                            wildcardIndex = secondEntry.indexOf("*");
+
+                            String thirdEntry = secondEntry.substring(wildcardIndex + 1);
+                            secondEntry = secondEntry.substring(0, wildcardIndex);
+
+                            String[] tripleEntry = {firstEntry, secondEntry, thirdEntry};
+
+                            multiEntryBlockList.add(tripleEntry);
+
+                            //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry + " , " + secondEntry + " , " + thirdEntry);
+                        } else {
+                            if (firstEntry.startsWith("|")) {
+                                String[] doubleEntry = {firstEntry.substring(1), secondEntry};
+
+                                multiEntryInitialBlockList.add(doubleEntry);
+
+                                //Log.i("BlockLists", "Multi entry initial block list added: " + firstEntry.substring(1) + " , " + secondEntry);
+                            } else if (firstEntry.startsWith("^")) {
+                                String firstEntryBase = firstEntry.substring(1);
+
+                                String firstEntry1 = ":" + firstEntryBase;
+                                String firstEntry2 = "/" + firstEntryBase;
+                                String firstEntry3 = "?" + firstEntryBase;
+                                String firstEntry4 = "=" + firstEntryBase;
+                                String firstEntry5 = "&" + firstEntryBase;
+
+                                String[] doubleEntry1 = {firstEntry1, secondEntry};
+                                String[] doubleEntry2 = {firstEntry2, secondEntry};
+                                String[] doubleEntry3 = {firstEntry3, secondEntry};
+                                String[] doubleEntry4 = {firstEntry4, secondEntry};
+                                String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+                                multiEntryBlockList.add(doubleEntry1);
+                                multiEntryBlockList.add(doubleEntry2);
+                                multiEntryBlockList.add(doubleEntry3);
+                                multiEntryBlockList.add(doubleEntry4);
+                                multiEntryBlockList.add(doubleEntry5);
+
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+                            } else if (secondEntry.startsWith("^")) {
+                                String secondEntryBase = secondEntry.substring(1);
+
+                                String secondEntry1 = ":" + secondEntryBase;
+                                String secondEntry2 = "/" + secondEntryBase;
+                                String secondEntry3 = "?" + secondEntryBase;
+                                String secondEntry4 = "=" + secondEntryBase;
+                                String secondEntry5 = "&" + secondEntryBase;
+
+                                String[] doubleEntry1 = {firstEntry, secondEntry1};
+                                String[] doubleEntry2 = {firstEntry, secondEntry2};
+                                String[] doubleEntry3 = {firstEntry, secondEntry3};
+                                String[] doubleEntry4 = {firstEntry, secondEntry4};
+                                String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+                                multiEntryBlockList.add(doubleEntry1);
+                                multiEntryBlockList.add(doubleEntry2);
+                                multiEntryBlockList.add(doubleEntry3);
+                                multiEntryBlockList.add(doubleEntry4);
+                                multiEntryBlockList.add(doubleEntry5);
+
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+                            } else if (secondEntry.endsWith("^")) {
+                                String secondEntryBase = secondEntry.substring(0, secondEntry.length() - 1);
+
+                                String secondEntry1 = secondEntryBase + ":";
+                                String secondEntry2 = secondEntryBase + "/";
+                                String secondEntry3 = secondEntryBase + "?";
+                                String secondEntry4 = secondEntryBase + "=";
+                                String secondEntry5 = secondEntryBase + "&";
+
+                                String[] doubleEntry1 = {firstEntry, secondEntry1};
+                                String[] doubleEntry2 = {firstEntry, secondEntry2};
+                                String[] doubleEntry3 = {firstEntry, secondEntry3};
+                                String[] doubleEntry4 = {firstEntry, secondEntry4};
+                                String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+                                String[] doubleEntryFinal = {firstEntry, secondEntryBase};
+
+                                multiEntryBlockList.add(doubleEntry1);
+                                multiEntryBlockList.add(doubleEntry2);
+                                multiEntryBlockList.add(doubleEntry3);
+                                multiEntryBlockList.add(doubleEntry4);
+                                multiEntryBlockList.add(doubleEntry5);
+
+                                multiEntryFinalBlockList.add(doubleEntryFinal);
+
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+                                //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+
+                                //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntryBase);
+                            } else {
+                                String[] doubleEntry = {firstEntry, secondEntry};
+
+                                multiEntryBlockList.add(doubleEntry);
+
+                                //Log.i("BlockLists", "Multi entry block list added: " + firstEntry + " , " + secondEntry);
+                            }
+                        }
+                    } else {
+                        if (blockListEntry.endsWith("^")) {  // `^` matches against `:`, `/`, `?`, `=`, `&`, and the end of the URL.
+                            // Add all the variations to the main block list.
+                            mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + ":");
+                            mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "/");
+                            mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "?");
+                            mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "=");
+                            mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "&");
+
+                            // Add the base block entry to the final block list.
+                            finalBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1));
+
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + ":");
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "/");
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "?");
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "=");
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "&");
+                            //Log.i("BlockLists", "Final block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1));
+                        } else {  // This is a basic entry.
+                            // Add the modified block list entry to the main block list.
+                            mainBlockList.add(blockListEntry);
+
+                            //Log.i("BlockLists", "Main block list added: " + blockListEntry);
+                        }
+                    }
                 }
             }
 
@@ -443,8 +1145,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             // The asset exists, so the `IOException` will never be thrown.
         }
 
-        // **DEBUG** Log the finishing of the loading of the ad blocker.
-        Log.i("AdBlocker", "Finish loading ad blocker");
+        Log.i("BlockLists", "Finish populating block lists");
 
         // Set the content view.
         setContentView(R.layout.main_drawerlayout);
@@ -625,7 +1326,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                             // Set `rootCoordinatorLayout` to fit under the status and navigation bars.
                             rootCoordinatorLayout.setFitsSystemWindows(false);
 
-                            if (translucentNavigationBarOnFullscreen) {  // There is an Android Support Library bug that causes a scrim to print on the right side of the `Drawer Layout` when the navigation bar is displayed on the right of the screen.
+                            // There is an Android Support Library bug that causes a scrim to print on the right side of the `Drawer Layout` when the navigation bar is displayed on the right of the screen.
+                            if (translucentNavigationBarOnFullscreen) {
                                 // Set the navigation bar to be translucent.
                                 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                             }
@@ -812,15 +1514,15 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         // The `DrawerListener` allows us to update the Navigation Menu.
         drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
             @Override
-            public void onDrawerSlide(View drawerView, float slideOffset) {
+            public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
             }
 
             @Override
-            public void onDrawerOpened(View drawerView) {
+            public void onDrawerOpened(@NonNull View drawerView) {
             }
 
             @Override
-            public void onDrawerClosed(View drawerView) {
+            public void onDrawerClosed(@NonNull View drawerView) {
             }
 
             @Override
@@ -888,37 +1590,164 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                 }
             }
 
-            // Block ads.  We have to use the deprecated `shouldInterceptRequest` until minimum API >= 21.
+            // 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){
-                if (adBlockerEnabled) {  // Block ads.
-                    // Extract the host from `url`.
-                    Uri requestUri = Uri.parse(url);
-                    String requestHost = requestUri.getHost();
-
-                    // Initialize a variable to track if this is an ad server.
-                    boolean requestHostIsAdServer = false;
-
-                    // Check all the subdomains of `requestHost` if it is not `null` against the ad server database.
-                    if (requestHost != null) {
-                        while (requestHost.contains(".") && !requestHostIsAdServer) {  // Stop checking if we run out of `.` or if we already know that `requestHostIsAdServer` is `true`.
-                            if (adServersSet.contains(requestHost)) {
-                                requestHostIsAdServer = true;
+                if (adBlockerEnabled) {  // Check the block lists.
+                    Log.i("BlockLists", "Begin check for " + url);
+
+                    Uri uri = Uri.parse(url);
+                    String domain = uri.getHost();
+
+                    for (String whiteListEntry : mainWhiteList) {
+                        if (url.contains(whiteListEntry)) {
+                            Log.i("BlockLists", "Request allowed by main white list: " + whiteListEntry + " | " + url);
+
+                            // `Return null` loads the requested resource.
+                            return null;
+                        }
+                    }
+
+                    for (String[] whiteListEntry : multiEntryWhiteList) {
+                        if (whiteListEntry.length == 2) {  // There are two entries.
+                            if (url.contains(whiteListEntry[0]) && url.contains(whiteListEntry[1])) {
+                                Log.i("BlockLists", "Request allowed by multi entry white list:  " + whiteListEntry[0] + " , " + whiteListEntry[1] + " | " + url);
+
+                                // `Return null` loads the requested resource.
+                                return null;
                             }
+                        } else {  // There are three entries.
+                            if (url.contains(whiteListEntry[0]) && url.contains(whiteListEntry[1]) && url.contains(whiteListEntry[2])) {
+                                Log.i("BlockLists", "Request allowed by multi entry white list:  " + whiteListEntry[0] + " , " + whiteListEntry[1] + " , " + whiteListEntry[2] + " | " + url);
+
+                                // `Return null` loads the requested resource.
+                                return null;
+                            }
+                        }
+                    }
+
+                    for (String blockListEntry : mainBlockList) {
+                        if (url.contains(blockListEntry)) {
+                            Log.i("BlockLists", "Request blocked by main block list: " + blockListEntry + " | " + url);
 
-                            // Strip out the lowest subdomain of `requestHost`.
-                            requestHost = requestHost.substring(requestHost.indexOf(".") + 1);
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
                         }
                     }
 
-                    if (requestHostIsAdServer) {  // It is an ad server.
-                        // Return an empty `WebResourceResponse`.
-                        return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
-                    } else {  // It is not an ad server.
-                        // `return null` loads the requested resource.
-                        return null;
+                    for (String blockListEntry : initialBlockList) {
+                        if (url.startsWith(blockListEntry)) {
+                            Log.i("BlockLists", "Request blocked by initial block list: " + blockListEntry + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
                     }
+
+                    for (String blockListEntry : finalBlockList) {
+                        if (url.endsWith(blockListEntry)) {
+                            Log.i("BlockLists", "Request blocked by final block list: " + blockListEntry + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : multiEntryBlockList) {
+                        if (blockListEntry.length == 2) {  // There are two entries.
+                            if (url.contains(blockListEntry[0]) && url.contains(blockListEntry[1])) {
+                                Log.i("BlockLists", "Request blocked by multi entry block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                                // Return an empty `WebResourceResponse`.
+                                return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                            }
+                        } else {  // There are three entries.
+                            if (url.contains(blockListEntry[0]) && url.contains(blockListEntry[1]) && url.contains(blockListEntry[2])) {
+                                Log.i("BlockLists", "Request blocked by multi entry block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " , " + blockListEntry[2] + " | " + url);
+
+                                // Return an empty `WebResourceResponse`.
+                                return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                            }
+                        }
+                    }
+
+                    for (String[] blockListEntry : multiEntryInitialBlockList) {
+                        if (url.startsWith(blockListEntry[0]) && url.contains(blockListEntry[1])) {
+                            Log.i("BlockLists", "Request blocked by multi entry initial block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : multiEntryFinalBlockList) {
+                        if (url.contains(blockListEntry[0]) && url.endsWith(blockListEntry[1])) {
+                            Log.i("BlockLists", "Request blocked by multi entry final block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : domainBlockList) {
+                        if (domain.endsWith(blockListEntry[0]) && url.contains(blockListEntry[1])) {
+                            Log.i("BlockLists", "Request blocked by domain block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : domainInitialBlockList) {
+                        if (domain.endsWith(blockListEntry[0]) && url.startsWith(blockListEntry[1])) {
+                            Log.i("BlockLists", "Request blocked by domain initial block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : domainFinalBlockList) {
+                        if (domain.endsWith(blockListEntry[0]) && url.endsWith(blockListEntry[2])) {
+                            Log.i("BlockLists", "Request blocked by domain final block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : domainMultiEntryBlockList) {
+                        if (domain.endsWith(blockListEntry[0]) && url.contains(blockListEntry[1]) && url.contains(blockListEntry[2])) {
+                            Log.i("BlockLists", "Request blocked by domain multi entry block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " , " + blockListEntry[2] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String[] blockListEntry : domainRegularExpressionBlockList) {
+                        if (domain.endsWith(blockListEntry[0]) && Pattern.matches(blockListEntry[1], url)) {
+                            Log.i("BlockLists", "Request blocked by domain regular expression block list: " + blockListEntry[0] + " , " + blockListEntry[1] + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    for (String blockListEntry : regularExpressionBlockList) {
+                        if (Pattern.matches(blockListEntry, url)) {
+                            Log.i("BlockLists", "Request blocked by regular expression block list: " + blockListEntry + " | " + url);
+
+                            // Return an empty `WebResourceResponse`.
+                            return new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes()));
+                        }
+                    }
+
+                    Log.i("BlockLists", "End check for " + url);
+
+                    // `return null` loads the requested resource.
+                    return null;
                 } else {  // Ad blocking is disabled.
                     // `return null` loads the requested resource.
                     return null;
@@ -1077,9 +1906,11 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                         }
 
                         // Check to see if the pinned SSL certificate matches the current website certificate.
-                        if (!currentWebsiteIssuedToCName.equals(pinnedDomainSslIssuedToCNameString) || !currentWebsiteIssuedToOName.equals(pinnedDomainSslIssuedToONameString) || !currentWebsiteIssuedToUName.equals(pinnedDomainSslIssuedToUNameString) ||
-                                !currentWebsiteIssuedByCName.equals(pinnedDomainSslIssuedByCNameString) || !currentWebsiteIssuedByOName.equals(pinnedDomainSslIssuedByONameString) || !currentWebsiteIssuedByUName.equals(pinnedDomainSslIssuedByUNameString) ||
-                                !currentWebsiteSslStartDateString.equals(pinnedDomainSslStartDateString) || !currentWebsiteSslEndDateString.equals(pinnedDomainSslEndDateString)) {  // The pinned SSL certificate doesn't match the current domain certificate.
+                        if (!currentWebsiteIssuedToCName.equals(pinnedDomainSslIssuedToCNameString) || !currentWebsiteIssuedToOName.equals(pinnedDomainSslIssuedToONameString) ||
+                                !currentWebsiteIssuedToUName.equals(pinnedDomainSslIssuedToUNameString) || !currentWebsiteIssuedByCName.equals(pinnedDomainSslIssuedByCNameString) ||
+                                !currentWebsiteIssuedByOName.equals(pinnedDomainSslIssuedByONameString) || !currentWebsiteIssuedByUName.equals(pinnedDomainSslIssuedByUNameString) ||
+                                !currentWebsiteSslStartDateString.equals(pinnedDomainSslStartDateString) || !currentWebsiteSslEndDateString.equals(pinnedDomainSslEndDateString)) {
+                                // The pinned SSL certificate doesn't match the current domain certificate.
                             //Display the pinned SSL certificate mismatch `AlertDialog`.
                             AppCompatDialogFragment pinnedSslCertificateMismatchDialogFragment = new PinnedSslCertificateMismatchDialog();
                             pinnedSslCertificateMismatchDialogFragment.show(getSupportFragmentManager(), getString(R.string.ssl_certificate_mismatch));
@@ -1106,9 +1937,11 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
 
                 // Proceed to the website if the current SSL website certificate matches the pinned domain certificate.
                 if (pinnedDomainSslCertificate &&
-                        currentWebsiteIssuedToCName.equals(pinnedDomainSslIssuedToCNameString) && currentWebsiteIssuedToOName.equals(pinnedDomainSslIssuedToONameString) && currentWebsiteIssuedToUName.equals(pinnedDomainSslIssuedToUNameString) &&
-                        currentWebsiteIssuedByCName.equals(pinnedDomainSslIssuedByCNameString) && currentWebsiteIssuedByOName.equals(pinnedDomainSslIssuedByONameString) && currentWebsiteIssuedByUName.equals(pinnedDomainSslIssuedByUNameString) &&
-                        currentWebsiteSslStartDate.equals(pinnedDomainSslStartDate) && currentWebsiteSslEndDate.equals(pinnedDomainSslEndDate)) {  // An SSL certificate is pinned and matches the current domain certificate.
+                        currentWebsiteIssuedToCName.equals(pinnedDomainSslIssuedToCNameString) && currentWebsiteIssuedToOName.equals(pinnedDomainSslIssuedToONameString) &&
+                        currentWebsiteIssuedToUName.equals(pinnedDomainSslIssuedToUNameString) && currentWebsiteIssuedByCName.equals(pinnedDomainSslIssuedByCNameString) &&
+                        currentWebsiteIssuedByOName.equals(pinnedDomainSslIssuedByONameString) && currentWebsiteIssuedByUName.equals(pinnedDomainSslIssuedByUNameString) &&
+                        currentWebsiteSslStartDate.equals(pinnedDomainSslStartDate) && currentWebsiteSslEndDate.equals(pinnedDomainSslEndDate)) {
+                        // An SSL certificate is pinned and matches the current domain certificate.
                     // Proceed to the website without displaying an error.
                     handler.proceed();
                 } else {  // Either there isn't a pinned SSL certificate or it doesn't match the current website certificate.
@@ -1131,13 +1964,13 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             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.
+                    // `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.  `!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;}" +
-                            "'; parent.appendChild(style)})()", value -> {
+                    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;}'; parent.appendChild(style)})()", value -> {
                                 // Initialize a `Handler` to display `mainWebView`.
                                 Handler displayWebViewHandler = new Handler();
 
@@ -1166,7 +1999,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                     progressBar.setVisibility(View.GONE);
 
                     // 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.
+                    // 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);
                     }
@@ -1296,7 +2130,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         privacyBrowserRuntime = Runtime.getRuntime();
 
         // 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`.
+        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`.
 
         // Initialize `inFullScreenBrowsingMode`, which is always false at this point because Privacy Browser never starts in full screen browsing mode.
         inFullScreenBrowsingMode = false;
@@ -1315,9 +2150,10 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         // Initialize `webViewTitle`.
         webViewTitle = getString(R.string.no_title);
 
-        // Initialize `favoriteIconBitmap`.  We have to use `ContextCompat` until API >= 21.
+        // Initialize `favoriteIconBitmap`.  `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();
 
         // If the favorite icon is null, load the default.
@@ -1922,7 +2758,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                 // Show the Find on Page `RelativeLayout`.
                 findOnPageLinearLayout.setVisibility(View.VISIBLE);
 
-                // Display the keyboard.  We have to wait 200 ms before running the command to work around a bug in Android.  http://stackoverflow.com/questions/5520085/android-show-softkeyboard-with-showsoftinput-is-not-working
+                // Display the keyboard.  We have to wait 200 ms before running the command to work around a bug in Android.
+                // http://stackoverflow.com/questions/5520085/android-show-softkeyboard-with-showsoftinput-is-not-working
                 findOnPageEditText.postDelayed(() -> {
                     // Set the focus on `findOnPageEditText`.
                     findOnPageEditText.requestFocus();
@@ -2122,8 +2959,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                     try {
                         // Delete the main cache directory.
                         privacyBrowserRuntime.exec("rm -rf " + privateDataDirectoryString + "/cache");
-
-                        // Delete the secondary `Service Worker` cache directory.  We have to use a `String[]` because the directory contains a space and `Runtime.exec` will not escape the string correctly otherwise.
+                        // Delete the secondary `Service Worker` cache directory.
+                        // We have to use a `String[]` because the directory contains a space and `Runtime.exec` will not escape the string correctly otherwise.
                         privacyBrowserRuntime.exec(new String[] {"rm", "-rf", privateDataDirectoryString + "/app_webview/Service Worker/"});
                     } catch (IOException e) {
                         // Do nothing if an error is thrown.
@@ -2196,7 +3033,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             adView = findViewById(R.id.adview);
         }
 
-        // `invalidateOptionsMenu` should recalculate the number of action buttons from the menu to display on the app bar, but it doesn't because of the this bug:  https://code.google.com/p/android/issues/detail?id=20493#c8
+        // `invalidateOptionsMenu` should recalculate the number of action buttons from the menu to display on the app bar, but it doesn't because of the this bug:
+        // https://code.google.com/p/android/issues/detail?id=20493#c8
         // ActivityCompat.invalidateOptionsMenu(this);
     }
 
@@ -3185,7 +4023,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                     cookieManager.setAcceptThirdPartyCookies(mainWebView, thirdPartyCookiesEnabled);
                 }
 
-                // Only set the user agent if the webpage is not currently loading.  Otherwise, changing the user agent on redirects can cause the original website to reload.  <https://redmine.stoutner.com/issues/160>
+                // Only set the user agent if the webpage is not currently loading.  Otherwise, changing the user agent on redirects can cause the original website to reload.
+                // <https://redmine.stoutner.com/issues/160>
                 if (!urlIsLoading) {
                     switch (userAgentString) {
                         case "System default user agent":
@@ -3264,7 +4103,8 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                     cookieManager.setAcceptThirdPartyCookies(mainWebView, thirdPartyCookiesEnabled);
                 }
 
-                // Only set the user agent if the webpage is not currently loading.  Otherwise, changing the user agent on redirects can cause the original website to reload.  <https://redmine.stoutner.com/issues/160>
+                // Only set the user agent if the webpage is not currently loading.  Otherwise, changing the user agent on redirects can cause the original website to reload.
+                // <https://redmine.stoutner.com/issues/160>
                 if (!urlIsLoading) {
                     switch (defaultUserAgentString) {
                         case "WebView default user agent":
@@ -3381,9 +4221,9 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             }
         }
 
-        // `invalidateOptionsMenu` calls `onPrepareOptionsMenu()` and redraws the icons in the `AppBar`.  `this` references the current activity.
+        // `invalidateOptionsMenu` calls `onPrepareOptionsMenu()` and redraws the icons in the `AppBar`.
         if (runInvalidateOptionsMenu) {
-            ActivityCompat.invalidateOptionsMenu(this);
+            invalidateOptionsMenu();
         }
     }
 
index 5e9f791b302548219f036d5d2cdb3033800fb718..a8ce68ca3f199858e700538ad2dce5081e99056b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright Β© 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright Β© 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -27,7 +27,8 @@
     <!-- Activities. -->
     <string name="privacy_browser">Privacy Browser</string>
     <string name="privacy_browser_settings">Privacy Browser Einstellungen</string>
-    <string name="android_asset_path">de</string>  <!-- For translations, this should be the localization abbreviation. -->
+    <!-- For translations, `android_asset_path` should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <string name="android_asset_path">de</string>
 
     <!-- MainWebView. -->
     <string name="privacy_mode">PrivatsphΓ€re-Modus</string>
index 89a088d8e699a3ba098e36fc3c85cb07bc48d32f..2b5964ec3bc669aa711b798d1de555a037829f33 100644 (file)
@@ -24,7 +24,8 @@
     <!-- Activities. -->
     <string name="privacy_browser">Navegador Privado</string>
     <string name="privacy_browser_settings">ConfiguraciΓ³n de Navegador Privado</string>
-    <string name="android_asset_path">es</string>  <!-- For translations, this should be the localization abbreviation. -->
+    <!-- For translations, `android_asset_path` should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <string name="android_asset_path">es</string>
 
     <!-- MainWebViewActivity. -->
     <string name="privacy_mode">Modo Privado</string>
index 7184b0a66238b618ace9b93885c40b91c5fefb23..59a5b907617f08c2e8d06b188fed1d00f18d9efb 100644 (file)
@@ -24,7 +24,8 @@
     <!-- Activities. -->
     <string name="privacy_browser">Privacy Browser</string>
     <string name="privacy_browser_settings">Impostazioni</string>
-    <string name="android_asset_path">it</string>  <!-- For translations, this should be the localization abbreviation. -->
+    <!-- For translations, `android_asset_path` should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <string name="android_asset_path">it</string>
 
     <!-- MainWebView. -->
     <string name="privacy_mode">ModalitΓ  privata</string>
     <string name="find_on_page">Cerca nella pagina</string>
     <string name="print">Stampa</string>
         <string name="privacy_browser_web_page">Pagina web di Privacy Browser</string>
-    <string name="view_source">Visualizza Sorgente</string>
+    <string name="view_source">Visualizza sorgente</string>
     <string name="add_to_home_screen">Aggiungi collegamento</string>
     <string name="refresh">Aggiorna</string>
 
 
     <!-- View Source. -->
     <string name="request_headers">Richiesta Intestazioni</string>
-    <string name="response_message">Messaggio di risposta</string>
+    <string name="response_message">Messaggio di Risposta</string>
     <string name="response_headers">Risposta Intestazioni</string>
-    <string name="response_body">Testo della risposta</string>
-    <string name="error_body">Testo errore</string>
+    <string name="response_body">Testo della Risposta</string>
+    <string name="error_body">Testo Errore</string>
     <string name="about_view_source">Informazioni sulla visualizzazione della sorgente</string>
     <string name="about_view_source_message">Dal momento che la WebView di Android non fornisce indicazioni sulla sorgente Γ¨ stata effettuata una richiesta separata utilizzando i system tools in modo da ottenere le informazioni mostrate.
         Potrebbero esserci alcune differenze tra questi dati e quelli utilizzati da WebView. Questa limitazione sarΓ  eliminata nella serie 4.x quando verrΓ  rilasciata Privacy WebView.</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644 (file)
index 0000000..04ce5ee
--- /dev/null
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright Β© 2015-2018 Soren Stoutner <soren@stoutner.com>.
+
+  Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» ΡΠ²Π»ΡΠ΅Ρ‚ся Ρ‡Π°ΡΡ‚ΡŒΡŽ Privacy Browser <https://www.stoutner.com/privacy-browser>.
+
+  Privacy Browser ΡΠ²Π»ΡΠ΅Ρ‚ся ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ
+  Π΅Π³ΠΎ ΠΈ/ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΡƒΡΠ»ΠΎΠ²ΠΈΡΡ… ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU,
+  ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ Π€ΠΎΠ½Π΄ΠΎΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡ, Π»ΠΈΠ±ΠΎ
+  Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ Π²Π΅Ρ€ΡΠΈΠΈ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ, Π»ΠΈΠ±ΠΎ (ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ) Π»ΡŽΠ±ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ Π²Π΅Ρ€ΡΠΈΠΈ.
+
+  Privacy Browser Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚раняСтся Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½,
+  Π½ΠΎ Π‘Π•Π— ΠšΠΠšΠ˜Π₯-Π›Π˜Π‘Πž Π“ΠΠ ΠΠΠ’Π˜Π™; Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΠΈ
+  Πš ΠšΠžΠœΠœΠ•Π Π§Π•Π‘ΠšΠžΠ™ Π”Π•Π―Π’Π•Π›Π¬ΠΠžΠ‘Π’Π˜ Π˜Π›Π˜ Π”Π›Π― ΠžΠŸΠ Π•Π”Π•Π›Π•ΠΠΠžΠ™ Π¦Π•Π›Π˜.  Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ
+  ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ²ΡˆΠΈΡΡŒ Ρ ΡƒΡΠ»ΠΎΠ²ΠΈΡΠΌΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU.
+
+  Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡŽ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU Π²ΠΌΠ΅ΡΡ‚Π΅ Ρ
+  Privacy Browser.  Π•ΡΠ»ΠΈ Π½Π΅Ρ‚, ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅ <http://www.gnu.org/licenses/>. -->
+
+<!-- `tools:ignore="MissingTranslation"` allows release APKs to be built if translation strings are missing.  The missing strings will fall back to English. -->
+<resources
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="MissingTranslation" >
+
+    <!-- Activities. -->
+    <string name="privacy_browser">Privacy Browser</string>
+    <string name="privacy_browser_settings">Настройки Privacy Browser</string>
+    <!-- For translations, `android_asset_path` should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <!-- <string name="android_asset_path">ru</string> -->
+
+    <!-- MainWebView. -->
+    <string name="privacy_mode">Π Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚ности</string>
+    <string name="javascript_enabled">JavaScript Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</string>
+    <string name="javascript_disabled">JavaScript ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½</string>
+    <string name="first_party_cookies_enabled">ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="first_party_cookies_disabled">ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="third_party_cookies_enabled">Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="third_party_cookies_disabled">Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="dom_storage_enabled">Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ</string>
+    <string name="dom_storage_disabled">Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ</string>
+    <string name="form_data_enabled">Π”Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="form_data_disabled">Π”Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</string>
+    <string name="cookies_deleted">Π€Π°ΠΉΠ»Ρ‹ cookie ΡƒΠ΄Π°Π»Π΅Π½Ρ‹</string>
+    <string name="dom_storage_deleted">Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM ΡƒΠ΄Π°Π»Π΅Π½ΠΎ</string>
+    <string name="form_data_deleted">Π”Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹</string>
+    <string name="open_navigation_drawer">ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ°Π½Π΅Π»ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ</string>
+    <string name="close_navigation_drawer">Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ°Π½Π΅Π»ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ</string>
+    <string name="no_title">Π‘Π΅Π· Π½Π°Π·Π²Π°Π½ΠΈΡ</string>
+
+    <!-- Save As. -->
+    <string name="save_as">Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ</string>
+    <string name="save_image_as">Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ</string>
+    <string name="file_name">Имя Ρ„Π°ΠΉΠ»Π°</string>
+    <string name="image_name">НазваниС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ</string>
+    <string name="unknown_size">нСизвСстный Ρ€Π°Π·ΠΌΠ΅Ρ€</string>
+    <string name="download">Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ</string>
+    <string name="cannot_download_file">НСвозмоТно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΡ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΡΡƒΡ€ΡΠ° HTTP ΠΈΠ»ΠΈ HTTPS.</string>
+    <string name="cannot_download_image">НСвозмоТно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΡΡƒΡ€ΡΠ° HTTP ΠΈΠ»ΠΈ HTTPS.</string>
+
+    <!-- Custom App Bar. -->
+    <string name="favorite_icon">Π—Π½Π°Ρ‡ΠΎΠΊ ΡΠ°ΠΉΡ‚Π°</string>
+    <string name="url_or_search_terms">URL ΠΈΠ»ΠΈ ΠΏΠΎΠΈΡΠΊΠΎΠ²Ρ‹ΠΉ Π·Π°ΠΏΡ€ΠΎΡ</string>
+
+    <!-- View SSL Certificate. -->
+    <string name="view_ssl_certificate">ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° SSL</string>
+    <string name="unencrypted_website">ΠΠ΅Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Π΅Π±-сайт</string>
+    <string name="no_ssl_certificate">Бвязь Ρ ΡΡ‚ΠΈΠΌ ΡΠ°ΠΉΡ‚ΠΎΠΌ Π½Π΅ ΡˆΠΈΡ„руСтся. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ ΡΡ‚ΠΎΡ€ΠΎΠ½Π°ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ€Π΅Π΄ΠΎΠ½ΠΎΡΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚.</string>
+    <string name="ssl_certificate">Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ SSL</string>
+    <string name="close">Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ</string>
+    <string name="domain">Π”ΠΎΠΌΠ΅Π½</string>
+    <string name="domain_label">Π”ΠΎΠΌΠ΅Π½:</string>
+    <string name="issued_to">Π’Ρ‹Π΄Π°Π½</string>
+    <string name="issued_by">КСм Π²Ρ‹Π΄Π°Π½</string>
+    <string name="common_name">ΠžΠ±Ρ‰Π΅ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΎΠ΅ ΠΈΠΌΡ (CN):</string>
+    <string name="organization">ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ (O):</string>
+    <string name="organizational_unit">ΠŸΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (OU):</string>
+    <string name="valid_dates">Π‘Ρ€ΠΎΠΊ Π΄Π΅ΠΉΡΡ‚вия</string>
+    <string name="start_date">Начало:</string>
+    <string name="end_date">ΠšΠΎΠ½Π΅Ρ†:</string>
+
+    <!-- SSL Certificate Error. -->
+    <string name="ssl_certificate_error">Ошибка ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° SSL</string>
+    <string name="proceed">ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ</string>
+    <string name="future_certificate">Π”Π°Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° Π΄Π΅ΠΉΡΡ‚вия ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° Π΅Ρ‰Π΅ Π½Π΅ Π½Π°ΡΡ‚ΡƒΠΏΠΈΠ»Π°</string>
+    <string name="expired_certificate">Π‘Ρ€ΠΎΠΊ Π΄Π΅ΠΉΡΡ‚вия ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° ΠΈΡΡ‚Π΅ΠΊ</string>
+    <string name="cn_mismatch">ΠžΠ±Ρ‰Π΅ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΎΠ΅ ΠΈΠΌΡ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ…оста</string>
+    <string name="untrusted">Π¦Π΅Π½Ρ‚Ρ€ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ</string>
+    <string name="invalid_date">НСдопустимая Π΄Π°Ρ‚Π° ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π°</string>
+    <string name="invalid_certificate">НСдопустимый ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚.</string>
+    <string name="url">URL</string>
+    <string name="url_label">URL:</string>
+
+    <!-- Pinned SSL Certificate Mismatch. -->
+    <string name="update_ssl">ОбновлСниС SSL</string>
+    <string name="ssl_certificate_mismatch">НСсоотвСтствиС ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° SSL</string>
+    <string name="current_ssl">Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ SSL</string>
+    <string name="pinned_ssl">Π—Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ SSL</string>
+
+    <!-- HTTP Authentication. -->
+    <string name="http_authentication">АутСнтификация HTTP</string>
+    <string name="host">Host:</string>
+    <string name="username">Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля</string>
+    <string name="password">ΠŸΠ°Ρ€ΠΎΠ»ΡŒ</string>
+
+    <!-- MainWebViewActivity Navigation Drawer. -->
+    <string name="navigation_drawer">Навигационная ΠΏΠ°Π½Π΅Π»ΡŒ</string>
+    <string name="navigation">Навигация</string>
+    <string name="home">Π”ΠΎΠΌΠΎΠΉ</string>
+    <string name="back">Назад</string>
+    <string name="forward">Π’ΠΏΠ΅Ρ€Π΅Π΄</string>
+    <string name="history">Π˜ΡΡ‚ΠΎΡ€ΠΈΡ</string>
+        <string name="clear_history">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ</string>
+    <string name="bookmarks">Π—Π°ΠΊΠ»Π°Π΄ΠΊΠΈ</string>
+    <string name="downloads">Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ</string>
+    <string name="settings">Настройки</string>
+    <string name="guide">Руководство</string>
+    <string name="about">О Privacy Browser</string>
+    <string name="clear_and_exit">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ</string>
+
+    <!-- MainWebViewActivity Options Menu. -->
+    <string name="javascript">JavaScript</string>
+    <string name="add_domain_settings">Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠΌΠ΅Π½Π°</string>
+    <string name="edit_domain_settings">ИзмСнСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠΌΠ΅Π½Π°</string>
+    <string name="first_party_cookies">ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie</string>
+    <string name="third_party_cookies">Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie</string>
+    <string name="dom_storage">Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM</string>
+    <string name="form_data">Π”Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹</string>
+    <string name="clear_data">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅</string>
+        <string name="clear_cookies">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ cookie</string>
+        <string name="clear_dom_storage"> ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM</string>
+        <string name="clear_form_data">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹</string>
+    <string name="font_size">Π Π°Π·ΠΌΠ΅Ρ€ ΡˆΡ€ΠΈΡ„Ρ‚Π°</string>
+        <string name="twenty_five_percent">25%</string>
+        <string name="fifty_percent">50%</string>
+        <string name="seventy_five_percent">75%</string>
+        <string name="one_hundred_percent">100%</string>
+        <string name="one_hundred_twenty_five_percent">125%</string>
+        <string name="one_hundred_fifty_percent">150%</string>
+        <string name="one_hundred_seventy_five_percent">175%</string>
+        <string name="two_hundred_percent">200%</string>
+    <string name="display_images">ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ</string>
+    <string name="share">ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ</string>
+    <string name="find_on_page">Найти Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅</string>
+    <string name="print">ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ</string>
+        <string name="privacy_browser_web_page">Privacy Browser Π²Π΅Π±-страница</string>
+    <string name="view_source">ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ</string>
+    <string name="add_to_home_screen">Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π΄ΠΎΠΌΠ°ΡˆΠ½ΠΈΠΉ ΡΠΊΡ€Π°Π½</string>
+    <string name="refresh">ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ</string>
+
+    <!-- Context Menus. -->
+    <string name="load_url">Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ URL</string>
+    <string name="copy_url">ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ URL</string>
+    <string name="email_address">АдрСс email</string>
+    <string name="copy_email_address">ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π΄Ρ€Π΅Ρ email</string>
+    <string name="write_email">ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ email</string>
+    <string name="view_image">ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ</string>
+    <string name="download_image">Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅</string>
+
+    <!-- Find on Page. -->
+    <string name="previous">ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ</string>
+    <string name="next">Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ</string>
+
+    <!-- View Source. -->
+    <string name="request_headers">Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ</string>
+    <string name="response_message">ΠžΡ‚Π²Π΅Ρ‚Π½ΠΎΠ΅ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅</string>
+    <string name="response_headers">Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²</string>
+    <string name="response_body">Π’Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°</string>
+    <string name="error_body">Π’Π΅Π»ΠΎ ΠΎΡˆΠΈΠ±ΠΊΠΈ</string>
+    <string name="about_view_source">Об ΠΈΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠ΅ ΠΏΡ€Π΅Π΄ΡΡ‚авлСния</string>
+    <string name="about_view_source_message">ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Android WebView Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π΄Π»Ρ ΡΠ±ΠΎΡ€Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠΉ Π² ΡΡ‚ΠΎΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠΈ,
+        Π±Ρ‹Π» ΡΠ΄Π΅Π»Π°Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°ΠΏΡ€ΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹Ρ… ΡΡ€Π΅Π΄ΡΡ‚Π². ΠœΠ΅ΠΆΠ΄Ρƒ ΡΡ‚ΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ся Π² WebView, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚личия.
+        Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ Π² ΡΠ΅Ρ€ΠΈΠΈ 4.x Ρ Π²Ρ‹ΠΏΡƒΡΠΊΠΎΠΌ Privacy WebView.</string>
+
+    <!-- Create Home Screen Shortcut Alert Dialog. -->
+    <string name="create_shortcut">Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΡ€Π»Ρ‹ΠΊ</string>
+    <string name="shortcut_name">Имя ΡΡ€Π»Ρ‹ΠΊΠ°</string>
+    <string name="cancel">ΠžΡ‚ΠΌΠ΅Π½Π°</string>
+    <string name="create">Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ</string>
+
+    <!-- Bookmarks. -->
+    <string name="database_view">ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…</string>
+    <string name="create_bookmark">Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°ΠΊΠ»Π°Π΄ΠΊΡƒ</string>
+    <string name="create_folder">Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ</string>
+    <string name="current_bookmark_icon">Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡ΠΎΠΊ Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ</string>
+    <string name="current_folder_icon">Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡ΠΎΠΊ ΠΏΠ°ΠΏΠΊΠΈ</string>
+    <string name="default_folder_icon">Π—Π½Π°Ρ‡ΠΎΠΊ ΠΏΠ°ΠΏΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+    <string name="web_page_favorite_icon">Π—Π½Π°Ρ‡ΠΎΠΊ ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠΉ Π²Π΅Π±-страницы</string>
+    <string name="bookmark_name">Имя Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ</string>
+    <string name="folder_name">Имя ΠΏΠ°ΠΏΠΊΠΈ</string>
+    <string name="bookmark_url">URL-адрСс Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ</string>
+    <string name="folder_names_must_be_unique">ИмСна ΠΏΠ°ΠΏΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ</string>
+    <string name="edit_bookmark">Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π°ΠΊΠ»Π°Π΄ΠΊΡƒ</string>
+    <string name="edit_folder">Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ</string>
+    <string name="move_to_folder">ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΏΠ°ΠΏΠΊΡƒ</string>
+    <string name="move">ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ</string>
+    <string name="save">Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ</string>
+
+    <!-- Bookmarks Contextual App Bar. -->
+    <string name="one_selected">1 Π²Ρ‹Π±Ρ€Π°Π½Π°</string>
+    <string name="selected">Π²Ρ‹Π±Ρ€Π°Π½Ρ‹</string>  <!--This is a plural adjective.-->
+    <string name="move_up">Π’Π²Π΅Ρ€Ρ…</string>
+    <string name="move_down">Π’Π½ΠΈΠ·</string>
+    <string name="edit">Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ</string>
+    <string name="delete">Π£Π΄Π°Π»ΠΈΡ‚ΡŒ</string>
+    <string name="select_all">Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π²ΡΠ΅</string>
+    <string name="one_bookmark_deleted">1 Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ° ΡƒΠ΄Π°Π»Π΅Π½Π°</string>
+    <string name="bookmarks_deleted">Π·Π°ΠΊΠ»Π°Π΄ΠΎΠΊ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹</string>
+    <string name="undo">Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ</string>
+
+    <!-- Bookmarks Database View. -->
+    <string name="bookmarks_database_view">ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΊΠ»Π°Π΄ΠΎΠΊ</string>
+    <string name="all_folders">ВсС ΠΏΠ°ΠΏΠΊΠΈ</string>
+    <string name="home_folder">Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ ΠΏΠ°ΠΏΠΊΠ°</string>
+    <string name="database_id">ID Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:</string>
+    <string name="folder">Папка:</string>
+    <string name="parent_folder">Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠ°Ρ ΠΏΠ°ΠΏΠΊΠ°:</string>
+    <string name="display_order">ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΎΡ‚обраТСния:</string>
+
+    <!-- Domains. -->
+    <string name="domains">Π”ΠΎΠΌΠ΅Π½Ρ‹</string>
+    <string name="domain_settings">Настройки Π΄ΠΎΠΌΠ΅Π½Π°</string>
+    <string name="add_domain">Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½</string>
+    <string name="domain_name_already_exists">Π”ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚</string>
+    <string name="add">Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ</string>
+    <string name="domain_name">Имя Π΄ΠΎΠΌΠ΅Π½Π°</string>
+    <string name="domain_deleted">Π”ΠΎΠΌΠ΅Π½ ΡƒΠ΄Π°Π»Π΅Π½</string>
+    <string name="domain_name_instructions">Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ *. Π΄Π»Ρ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ… ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² (Π½Π°ΠΏΡ€. * .yandex.ru)</string>
+    <string-array name="display_webpage_images_array">
+        <item>Настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+        <item>Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</item>
+        <item>Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹</item>
+    </string-array>
+    <string-array name="night_mode_array">
+        <item>Настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+        <item>Ночной Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+        <item>Ночной Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+    </string-array>
+    <string name="pinned_ssl_certificate">Π—Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ SSL</string>
+    <string name="saved_ssl_certificate">Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½Π½Ρ‹ΠΉ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ SSL</string>
+    <string name="current_website_ssl_certificate">Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ SSL ΡΠ°ΠΉΡ‚Π°</string>
+    <string name="load_an_encrypted_website">ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡΠ°ΠΉΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ SSL Π²Π΅Π±-сайта.</string>
+
+    <!-- Guide. -->
+    <string name="privacy_browser_guide">Руководство ΠΏΠΎ Privacy Browser</string>
+    <string name="overview">ΠžΠ±Π·ΠΎΡ€</string>
+    <string name="local_storage">Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅</string>
+    <string name="ssl_certificates">Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Ρ‹ SSL</string>
+    <string name="tracking_ids">Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚слСТивания</string>
+
+    <!-- Preferences. -->
+    <string name="privacy">ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ</string>
+        <string name="javascript_preference">Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ JavaScript ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string name="javascript_preference_summary">JavaScript ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Π΅Π±-сайтам Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (скрипты) Π½Π° ΡƒΡΡ‚ройствС.</string>
+        <string name="first_party_cookies_preference">Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string name="first_party_cookies_preference_summary">На ΡƒΡΡ‚ройствах Ρ Π²Π΅Ρ€ΡΠΈΠ΅ΠΉ Android ΡΡ‚Π°Ρ€ΡˆΠ΅ Lollipop (вСрсия 5.0) ΡΡ‚ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie.</string>
+        <string name="third_party_cookies_preference">Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string name="third_party_cookies_summary">Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Android Lollipop (вСрсия 5.0) ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅. ΠžΠ½ Π½Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚, Π΅ΡΠ»ΠΈ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹.</string>
+        <string name="dom_storage_preference">Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string name="dom_storage_preference_summary">Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° DOM Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ JavaScript.</string>
+        <string name="save_form_data_preference">Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string name="save_form_data_preference_summary">Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π°Π²Ρ‚оматичСски Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»Ρ Π½Π° Π²Π΅Π±-сайтах.</string>
+        <string name="user_agent">User agent</string>
+        <string-array name="user_agent_entries">
+            <item>Privacy Browser 1.0</item>
+            <item>WebView ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+            <item>Firefox 56 Π½Π° Android 8.0.0</item>
+            <item>Chrome 62 Π½Π° Android 8.0.0</item>
+            <item>Safari 11 Π½Π° iOS 11.1</item>
+            <item>Firefox 52 Π½Π° Linux</item>
+            <item>Chromium 61 Π½Π° Linux</item>
+            <item>Firefox 56 Π½Π° Windows 10</item>
+            <item>Chrome 62 Π½Π° Windows 10</item>
+            <item>Edge 16 Π½Π° Windows 10</item>
+            <item>Internet Explorer 11 Π½Π° Windows 10</item>
+            <item>Safari 11.0.1 Π½Π° macOS 10.13.1</item>
+            <item>ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ</item>
+        </string-array>
+            <string-array name="domain_settings_user_agent_entries">
+                <item>БистСмный ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+                <item>Privacy Browser 1.0</item>
+                <item>WebView ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+                <item>Firefox 56 Π½Π° Android 8.0.0</item>
+                <item>Chrome 62 Π½Π° Android 8.0.0</item>
+                <item>Safari 11 Π½Π° iOS 11.1</item>
+                <item>Firefox 52 Π½Π° Linux</item>
+                <item>Chromium 61 Π½Π° Linux</item>
+                <item>Firefox 56 Π½Π° Windows 10</item>
+                <item>Chrome 62 Π½Π° Windows 10</item>
+                <item>Edge 16 Π½Π° Windows 10</item>
+                <item>Internet Explorer 11 Π½Π° Windows 10</item>
+                <item>Safari 11.0.1 Π½Π° macOS 10.13.1</item>
+                <item>ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ</item>
+            </string-array>
+        <string name="custom_user_agent">ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ user agent</string>
+        <string name="block_ads">Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ</string>
+        <string name="block_ads_summary">Для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠ² pgl.yoyo.org.</string>
+        <string name="incognito_mode">Π Π΅ΠΆΠΈΠΌ ΠΈΠ½ΠΊΠΎΠ³Π½ΠΈΡ‚ΠΎ</string>
+        <string name="incognito_mode_summary">ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈ ΠΊΡΡˆΠ° ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Π±-страницы.</string>
+        <string name="do_not_track">НС ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ</string>
+        <string name="do_not_track_summary">ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ \'Π½Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ\', ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΠΌ Π²Π΅Π±-сСрвСру Π½Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€.</string>
+    <string name="tor">Tor</string>
+        <string name="proxy_through_orbot">ΠŸΡ€ΠΎΠΊΡΠΈ Ρ‡Π΅Ρ€Π΅Π· Orbot</string>
+        <string name="proxy_through_orbot_summary">ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅ΡΡŒ Π²Π΅Π±-Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Ρ‡Π΅Ρ€Π΅Π· Orbot Π½Π° localhost:8118.</string>
+        <string name="tor_homepage">Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π° Tor</string>
+        <string name="tor_search">Поиск Tor</string>
+        <string-array name="tor_search_entries">
+            <item>DuckDuckGo - JavaScript Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>DuckDuckGo - JavaScript Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ</item>
+        </string-array>
+        <string name="tor_search_custom_url">ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ URL-адрСс ΠΏΠΎΠΈΡΠΊΠ° Tor</string>
+    <string name="search">Поиск</string>
+        <string-array name="search_entries">
+            <item>DuckDuckGo - JavaScript Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>DuckDuckGo - JavaScript Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>StartPage</item>
+            <item>Qwant - JavaScript Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>Qwant - JavaScript Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>Searx</item>
+            <item>Google</item>
+            <item>Bing</item>
+            <item>Yahoo - JavaScript Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>Yahoo - JavaScript Π²ΠΊΠ»ΡŽΡ‡Π΅Π½</item>
+            <item>ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ</item>
+        </string-array>
+        <string name="search_custom_url">ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ URL-адрСс ΠΏΠΎΠΈΡΠΊΠ°</string>
+        <string name="custom_url">ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ URL-адрСс</string>
+    <string name="full_screen">Π’ΠΎ Π²Π΅ΡΡŒ ΡΠΊΡ€Π°Π½</string>
+        <string name="full_screen_browsing_mode">ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π°</string>
+        <string name="full_screen_browsing_mode_summary">Π”Π²ΠΎΠΉΠ½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π°.</string>
+        <string name="hide_system_bars">Π‘ΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ</string>
+        <string name="hide_system_bars_summary">Π‘ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ°Π½Π΅Π»ΠΈ ΡΡ‚атуса ΠΈ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π² ΠΏΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π°. Π­Ρ‚ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π°.</string>
+        <string name="translucent_navigation_bar">ΠŸΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Π°Ρ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ ΠΏΠ°Π½Π΅Π»ΡŒ</string>
+        <string name="translucent_navigation_bar_summary">ПанСль Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ΡΡ‚Π°Π½Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ Π² ΠΏΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π°.</string>
+    <string name="clear_everything">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π²ΡΠ΅</string>
+    <string name="clear_everything_summary">ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ cookie, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM, Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ ΠΊΡΡˆ WebView. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ся Π²ΡΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ "app_webview" ΠΈ "cache".</string>
+    <string name="clear_cookies_preference">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ cookie</string>
+    <string name="clear_cookies_summary">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ ΠΈ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ cookie.</string>
+    <string name="clear_dom_storage_preference">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM</string>
+    <string name="clear_dom_storage_summary">ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DOM.</string>
+    <string name="clear_form_data_preference">ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡ‹</string>
+    <string name="clear_form_data_summary">ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹.</string>
+    <string name="clear_cache">ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΊΡΡˆ</string>
+    <string name="clear_cache_summary">ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΊΡΡˆ WebView.</string>
+    <string name="general">ΠžΠ±Ρ‰Π΅Π΅</string>
+        <string name="homepage">Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π°</string>
+        <string name="default_font_size">Π Π°Π·ΠΌΠ΅Ρ€ ΡˆΡ€ΠΈΡ„Ρ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</string>
+        <string-array name="default_font_size_entries">
+            <item>25%</item>
+            <item>50%</item>
+            <item>75%</item>
+            <item>100%</item>
+            <item>125%</item>
+            <item>150%</item>
+            <item>175%</item>
+            <item>200%</item>
+        </string-array>
+            <string-array name="domain_settings_font_size_entries">
+                <item>БистСмный ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ</item>
+                <item>25%</item>
+                <item>50%</item>
+                <item>75%</item>
+                <item>100%</item>
+                <item>125%</item>
+                <item>150%</item>
+                <item>175%</item>
+                <item>200%</item>
+            </string-array>
+        <string name="swipe_to_refresh_enabled">ΠŸΠΎΡ‚ΡΠ½ΡƒΡ‚ΡŒ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ</string>
+        <string name="swipe_to_refresh_enabled_summary">НСкоторыС Π²Π΅Π±-сайты ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ.</string>
+        <string name="display_additional_app_bar_icons">ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°Ρ‡ΠΊΠΈ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ</string>
+        <string name="display_additional_app_bar_icons_summary">ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΊΠΎΠ² Π΄Π»Ρ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² cookie, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° DOM ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΌΠ΅ΡΡ‚Π°.</string>
+        <string name="dark_theme">ВСмная Ρ‚Π΅ΠΌΠ°</string>
+        <string name="dark_theme_summary">ИзмСнСниС Ρ‚Π΅ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ Privacy Browser.</string>
+        <string name="night_mode">Ночной Ρ€Π΅ΠΆΠΈΠΌ</string>
+        <string name="night_mode_summary">Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ JavaScript Π΄Π»Ρ Π²ΡΠ΅Ρ… Π²Π΅Π±-страниц.</string>
+        <string name="display_webpage_images">ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π²Π΅Π±-страницы</string>
+        <string name="display_webpage_images_summary">ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅, Π΄Π»Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°.</string>
+
+    <!-- Orbot. -->
+    <string name="orbot_proxy_not_installed">ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Orbot Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Orbot.</string>
+    <string name="waiting_for_orbot">ОТиданиС Orbot Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ...</string>
+
+    <!-- About Activity. -->
+    <string name="about_privacy_browser">О Privacy Browser</string>
+    <string name="version">ВСрсия</string>
+        <string name="version_code">ΠΊΠΎΠ΄ Π²Π΅Ρ€ΡΠΈΠΈ</string>
+        <string name="hardware">ΠžΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅</string>
+            <string name="brand">Π‘Ρ€Π΅Π½Π΄:</string>
+            <string name="manufacturer">ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ:</string>
+            <string name="model">МодСль:</string>
+            <string name="device">Устройство:</string>
+            <string name="bootloader">Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ:</string>
+            <string name="radio">Π Π°Π΄ΠΈΠΎ:</string>
+        <string name="software">ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅</string>
+            <string name="android">Android:</string>
+                <string name="api">API</string>
+            <string name="build">Π‘Π±ΠΎΡ€ΠΊΠ°:</string>
+            <string name="security_patch">ΠŸΠ°Ρ‚Ρ‡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΠΈ:</string>
+            <string name="webkit">WebKit:</string>
+            <string name="chrome">Chrome:</string>
+            <string name="easylist">EasyList:</string>
+            <string name="orbot">Orbot:</string>
+        <string name="package_signature">Подпись ΠΏΠ°ΠΊΠ΅Ρ‚Π°</string>
+            <string name="issuer_dn">DN ΡΠΌΠΈΡ‚Π΅Π½Ρ‚Π°:</string>
+            <string name="subject_dn">DN ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π°:</string>
+            <string name="certificate_version">ВСрсия ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π°:</string>
+            <string name="serial_number">Π‘Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€:</string>
+            <string name="signature_algorithm">Алгоритм ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ:</string>
+    <string name="permissions">Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ</string>
+    <string name="privacy_policy">ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ</string>
+    <string name="changelog">Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ</string>
+    <string name="licenses">Π›ΠΈΡ†Π΅Π½Π·ΠΈΠΈ</string>
+    <string name="contributors">Благодарности</string>
+    <string name="links">Бсылки</string>
+</resources>
index ac38ae34c7e2166747a3e3afbac859c4253371f1..4d1d3a651d1fe86cbf9d2054860635776ddf9624 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright Β© 2015-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright Β© 2015-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
@@ -26,7 +26,8 @@
     <!-- Activities. -->
     <string name="privacy_browser">Privacy Browser</string>
     <string name="privacy_browser_settings">Privacy Browser Settings</string>
-    <string name="android_asset_path">en</string>  <!-- For translations, this should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <!-- For translations, `android_asset_path` should be the localization abbreviation.  For example, Spanish is `es`.  This should not be translated unless the Guide and About sections are localized. -->
+    <string name="android_asset_path">en</string>
 
     <!-- MainWebView. -->
     <string name="privacy_mode">Privacy Mode</string>
                 <item>Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko</item>
                 <item>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.4 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.4</item>
                 <item>Custom user agent</item>  <!-- This item must not be translated into other languages because it is referenced in code.  It is never displayed on the screen. -->
-        </string-array>
+            </string-array>
         <string name="custom_user_agent">Custom user agent</string>
         <string name="block_ads">Block ads</string>
         <string name="block_ads_summary">Use the list of ad servers from pgl.yoyo.org to block ads.</string>