diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f3162a84e24dfa0e0b7d468abd1bd2e7b1d85d7d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,138 @@
+variables:
+ DEBIAN_FRONTEND: noninteractive
+
+ ANDROID_CLI_TOOLS: "6609375"
+
+ ANDROID_CLI_TOOLS_DIGEST: "89f308315e041c93a37a79e0627c47f21d5c5edbe5e80ea8dc0aac8a649e0e92"
+ ANDROID_COMPILE_SDK: "28"
+ ANDROID_BUILD_TOOLS: "28.0.3"
+
+ MAVEN_REPOSITORIES: "${CI_PROJECT_DIR}/gradle_storage"
+ GRADLE_MAVEN_REPOSITORIES: "file://${MAVEN_REPOSITORIES}"
+
+
+default:
+ # See https://about.gitlab.com/blog/2018/10/24/setting-up-gitlab-ci-for-android-projects/
+ # https://github.com/docker-library/openjdk/blob/master/8/jdk/buster/Dockerfile
+ image: openjdk:8-jdk
+ tags:
+ - 32GB
+
+ before_script:
+ - set -e
+
+ # Prepare our Debian environment.
+ - apt-get update -qq
+ - apt-get upgrade -qy
+
+ # Install needed packages from Debian.
+ - apt-get install -qy --fix-missing wget tar unzip lib32stdc++6 lib32z1 bzip2
+
+ #- ./taskcluster/scripts/toolchain/android-gradle-dependencies.sh
+
+ # Install the Android SDK Tools.
+ - wget --quiet --output-document=android-cli-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CLI_TOOLS}_latest.zip
+ - echo "${ANDROID_CLI_TOOLS_DIGEST} android-cli-tools.zip" | sha256sum -c
+ - unzip -qd cmdline-tools android-cli-tools.zip
+ - echo y | cmdline-tools/tools/bin/sdkmanager --install "platforms;android-${ANDROID_COMPILE_SDK}" > /dev/null
+ - echo y | cmdline-tools/tools/bin/sdkmanager --install "platform-tools" > /dev/null
+ - echo y | cmdline-tools/tools/bin/sdkmanager --install "build-tools;${ANDROID_BUILD_TOOLS}" > /dev/null
+
+ # Install the Android NDK.
+ - echo y | cmdline-tools/tools/bin/sdkmanager ndk-bundle > /dev/null
+
+ # Accept all the licenses.
+ - set +o pipefail
+ - yes | cmdline-tools/tools/bin/sdkmanager --licenses > /dev/null
+ - set -o pipefail
+
+ # Create local.properties file.
+ - echo "sdk.dir=$PWD" > local.properties
+
+ # Fetch tor library build dependencies
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor-onion-proxy-library/0.0.3/android-release.aar
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor-onion-proxy-library/0.0.3/universal-0.0.3.jar
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor-android-service/1.0/jsocksAndroid-release.aar
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor-android-service/1.0/service-release.aar
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor/0.4.4.4-rc/tor_x86.tar.gz
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor/0.4.4.4-rc/tor_x86_64.tar.gz
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor/0.4.4.4-rc/tor_armv7.tar.gz
+ - wget --quiet https://people.torproject.org/~sysrqb/mirrors/tor/0.4.4.4-rc/tor_aarch64.tar.gz
+
+ - echo "4e2bd087df6128a31c598d297367c106762f539c25d71cc343aae25386e4bee9 android-release.aar" | sha256sum -c
+ - echo "0082d1d035a0808d03d7e1009398ed2c3e3ea4c51811198f6ff83ccda456036f universal-0.0.3.jar" | sha256sum -c
+ - echo "3dca44a48fdbd3f6c44f7ea335ae85fe542676d8e48c6438f84a2c852daf4f54 jsocksAndroid-release.aar" | sha256sum -c
+ - echo "d38967569af56d809f09f08b888962971149411832c3bc2b7b0b64a43ceb0dcd service-release.aar" | sha256sum -c
+ - echo "0faa344f658d2e38c7cc881f51c1d8658aac56801f7def1b75be72a8d3f90c54 tor_x86.tar.gz" | sha256sum -c
+ - echo "acf1d403ca12e3302d1150d2b5fba6585aa83d46db16f15ad33fae39645c5b5d tor_x86_64.tar.gz" | sha256sum -c
+ - echo "132cb40bbc15bd8f72abd15324705ab720f8b316a2fca84baaeb5db37f602c32 tor_armv7.tar.gz" | sha256sum -c
+ - echo "6c453c5f7566c87d422ef60750cba794d9616e9197114be5dc1194f75b55b04e tor_aarch64.tar.gz" | sha256sum -c
+
+ - mv android-release.aar universal-0.0.3.jar jsocksAndroid-release.aar service-release.aar app/
+
+ - tar -C app/src/main -xf tor_x86.tar.gz
+ - tar -C app/src/main -xf tor_x86_64.tar.gz
+ - tar -C app/src/main -xf tor_armv7.tar.gz
+ - tar -C app/src/main -xf tor_aarch64.tar.gz
+ - rm tor_x86.tar.gz tor_x86_64.tar.gz tor_armv7.tar.gz tor_aarch64.tar.gz
+
+stages:
+ - build
+ - buildFenixProduction
+ - buildFennecBeta
+ - buildFennecProduction
+ - test
+
+buildDebug:
+ stage: build
+ script:
+ - ./gradlew -PdisableTor=true clean app:assembleDebug --stacktrace
+
+ # Disable for now.
+ #artifacts:
+ # paths:
+ # - app/build/outputs/apk/geckoBeta/debug/*.apk
+ # expire_in: 1 day
+
+testLight:
+ stage: test
+ script:
+ # from config/pre-push-recommended.sh
+ # `tee` into a log file because resulting output is larger than 4 MB
+ # (4 MB is max log size)
+ - ./gradlew -PdisableTor=true ktlint detekt assembleDebug assembleDebugAndroidTest testDebug | tee testLight_gradle.log
+ artifacts:
+ paths:
+ - testLight_gradle.log
+ expire_in: 1 day
+ when: always
+
+#### Scheduled Jobs (build* stages run serially) ###
+
+buildFenixProduction:
+ stage: buildFenixProduction
+ only:
+ - schedules
+ script:
+ - ./gradlew -PdisableTor=true clean app:assembleNightly --stacktrace
+
+buildFennecBeta:
+ stage: buildFennecBeta
+ only:
+ - schedules
+ script:
+ - ./gradlew -PdisableTor=true clean app:assembleBeta --stacktrace
+
+buildFennecProduction:
+ stage: buildFennecProduction
+ only:
+ - schedules
+ script:
+ - ./gradlew -PdisableTor=true clean app:assembleRelease --stacktrace
+
+testAll:
+ stage: test
+ only:
+ - schedules
+ script:
+ - ./gradlew -PdisableTor=true clean test
diff --git a/LICENSE b/LICENSE
index a612ad9813b006ce81d1ee438dd784da99a54007..f979e902a40a9d4fe03c1f6ccdfa78d2a52f90b9 100644
--- a/LICENSE
+++ b/LICENSE
@@ -371,3 +371,328 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
+
+===============================================================================
+
+"White On Black" font embedded in chrome/skin/aboutTorFonts.css is licensed under:
+
+Non Exclusive License Agreement
+
+Object: Imagex font called « White on Black »
+Owner: Daniel Hochard
+
+1. Allowed uses
+The user may use this font on any surface such as logo, paper, web sites,
+textile, Online medias, except TV, cinéma and advertising campaign.
+2. Number of users : 5
+All users must belong to the same company or household purchasing the font.
+3. Modifications
+The user can modify this font itself without written consent of the owner.
+4. This font belongs to Daniel Hochard. The user may not sell it as a font (in a
+font bank or a commercial fonts web site, for example).
+The fee for this font was paid on paypal the 29 september 2020
+
+===============================================================================
+
+"Terminal Grotesque Open" font embedded in chrome/skin/aboutTorFonts.css is licensed
+under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+===============================================================================
+
+SIL OPEN FONT LICENSE
+
+Version 1.1 - 26 February 2007
+
+PREAMBLE
+
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+DEFINITIONS
+
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting — in part or in whole — any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+PERMISSION & CONDITIONS
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+TERMINATION
+
+This license becomes null and void if any of the above conditions are
+not met.
+DISCLAIMER
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+===============================================================================
+
+The Cousine font is licensed under the Apache License, Version 2.0.
+https://fonts.google.com/specimen/Cousine
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/app/build.gradle b/app/build.gradle
index 55b4e3176714753578a2dd3e0e9ec917a262f60d..e7d2803d410ee6f961335d0b56287d78f9c0165d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,7 +20,7 @@ import static org.gradle.api.tasks.testing.TestResult.ResultType
android {
compileSdkVersion Config.compileSdkVersion
defaultConfig {
- applicationId "org.mozilla"
+ applicationId "org.torproject"
minSdkVersion Config.minSdkVersion
targetSdkVersion Config.targetSdkVersion
versionCode 1
@@ -31,11 +31,12 @@ android {
resValue "bool", "IS_DEBUG", "false"
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "false"
buildConfigField "String", "AMO_COLLECTION", "\"7dfae8669acc4312a65e8ba5553036\""
- def deepLinkSchemeValue = "fenix-dev"
+ def deepLinkSchemeValue = "torbrowser-dev"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = [
"deepLinkScheme": deepLinkSchemeValue
]
+ buildConfigField "boolean", "DATA_COLLECTION_DISABLED", "true"
}
def releaseTemplate = {
@@ -57,21 +58,21 @@ android {
debug {
shrinkResources false
minifyEnabled false
- applicationIdSuffix ".fenix.debug"
+ applicationIdSuffix ".torbrowser_debug"
resValue "bool", "IS_DEBUG", "true"
pseudoLocalesEnabled true
}
nightly releaseTemplate >> {
- applicationIdSuffix ".fenix"
+ applicationIdSuffix ".torbrowser_nightly"
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
- def deepLinkSchemeValue = "fenix-nightly"
+ def deepLinkSchemeValue = "torbrowser-nightly"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = ["deepLinkScheme": deepLinkSchemeValue]
}
beta releaseTemplate >> {
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
- applicationIdSuffix ".firefox_beta"
- def deepLinkSchemeValue = "fenix-beta"
+ applicationIdSuffix ".torbrowser_alpha"
+ def deepLinkSchemeValue = "torbrowser-alpha"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = [
// This release type is meant to replace Firefox (Beta channel) and therefore needs to inherit
@@ -81,14 +82,14 @@ android {
// fatal consequences. For example see:
// - https://issuetracker.google.com/issues/36924841
// - https://issuetracker.google.com/issues/36905922
- "sharedUserId": "org.mozilla.firefox.sharedID",
+ "sharedUserId": "org.torproject.torbrowser_alpha.sharedID",
"deepLinkScheme": deepLinkSchemeValue
]
}
release releaseTemplate >> {
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
- applicationIdSuffix ".firefox"
- def deepLinkSchemeValue = "fenix"
+ applicationIdSuffix ".torbrowser"
+ def deepLinkSchemeValue = "torbrowser"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = [
// This release type is meant to replace Firefox (Release channel) and therefore needs to inherit
@@ -98,7 +99,7 @@ android {
// fatal consequences. For example see:
// - https://issuetracker.google.com/issues/36924841
// - https://issuetracker.google.com/issues/36905922
- "sharedUserId": "org.mozilla.firefox.sharedID",
+ "sharedUserId": "org.torproject.torbrowser.sharedID",
"deepLinkScheme": deepLinkSchemeValue
]
}
@@ -192,15 +193,25 @@ android.applicationVariants.all { variant ->
// -------------------------------------------------------------------------------------------------
def isDebug = variant.buildType.resValues['IS_DEBUG']?.value ?: false
+ def isDataCollectionDisabled = variant.buildType.buildConfigFields['DATA_COLLECTION_DISABLED']?.value ?: true
+ def isDebugOrDCD = isDebug || isDataCollectionDisabled
def useReleaseVersioning = variant.buildType.buildConfigFields['USE_RELEASE_VERSIONING']?.value ?: false
def versionName = Config.releaseVersionName(project)
+ def disableTor = false
+ if (project.hasProperty("disableTor")) {
+ disableTor = project.getProperty("disableTor")
+ }
+
println("----------------------------------------------")
println("Variant name: " + variant.name)
println("Application ID: " + [variant.mergedFlavor.applicationId, variant.buildType.applicationIdSuffix].findAll().join())
println("Build type: " + variant.buildType.name)
println("Flavor: " + variant.flavorName)
- println("Telemetry enabled: " + !isDebug)
+ println("Telemetry enabled: " + !isDebugOrDCD)
+ println("Tor is disabled: " + disableTor)
+
+ buildConfigField "boolean", "DISABLE_TOR", "$disableTor"
if (useReleaseVersioning) {
// The Google Play Store does not allow multiple APKs for the same app that all have the
@@ -225,7 +236,7 @@ android.applicationVariants.all { variant ->
// -------------------------------------------------------------------------------------------------
buildConfigField 'String', 'SENTRY_TOKEN', 'null'
- if (!isDebug) {
+ if (!isDebugOrDCD) {
buildConfigField 'boolean', 'CRASH_REPORTING', 'true'
// Reading sentry token from local file (if it exists). In a release task on taskcluster it will be available.
try {
@@ -236,7 +247,7 @@ android.applicationVariants.all { variant ->
buildConfigField 'boolean', 'CRASH_REPORTING', 'false'
}
- if (!isDebug) {
+ if (!isDebugOrDCD) {
buildConfigField 'boolean', 'TELEMETRY', 'true'
} else {
buildConfigField 'boolean', 'TELEMETRY', 'false'
@@ -257,7 +268,7 @@ android.applicationVariants.all { variant ->
print("Adjust token: ")
- if (!isDebug) {
+ if (!isDebugOrDCD) {
try {
def token = new File("${rootDir}/.adjust_token").text.trim()
buildConfigField 'String', 'ADJUST_TOKEN', '"' + token + '"'
@@ -340,9 +351,9 @@ dependencies {
jnaForTest Deps.jna
testImplementation files(configurations.jnaForTest.copyRecursive().files)
- debugImplementation Deps.mozilla_browser_engine_gecko_nightly
+ debugImplementation Deps.mozilla_browser_engine_gecko_beta
- nightlyImplementation Deps.mozilla_browser_engine_gecko_nightly
+ nightlyImplementation Deps.mozilla_browser_engine_gecko_beta
betaImplementation Deps.mozilla_browser_engine_gecko_beta
releaseImplementation Deps.mozilla_browser_engine_gecko_release
@@ -462,8 +473,6 @@ dependencies {
implementation Deps.adjust
implementation Deps.installreferrer // Required by Adjust
- implementation Deps.google_ads_id // Required for the Google Advertising ID
-
implementation Deps.google_play_store // Required for in-app reviews
androidTestImplementation Deps.uiautomator
@@ -515,6 +524,18 @@ dependencies {
testImplementation "org.mozilla.telemetry:glean-forUnitTests:${project.ext.glean_version}"
lintChecks project(":mozilla-lint-rules")
+
+ // Tor Android Services Dependencies
+ implementation 'net.freehaven.tor.control:jtorctl:0.2'
+ implementation 'org.slf4j:slf4j-api:1.7.25'
+ implementation 'org.slf4j:slf4j-android:1.7.25'
+
+ // Tor Android Services.
+ implementation files('service-release.aar')
+
+ // Tor Onion Proxy Library.
+ implementation files('universal-0.0.3.jar')
+ implementation files('android-release.aar')
}
if (project.hasProperty("coverage")) {
@@ -587,16 +608,22 @@ task buildTranslationArray {
// This isn't running as a task, instead the array is build when the gradle file is parsed.
// https://github.com/mozilla-mobile/fenix/issues/14175
def foundLocales = new StringBuilder()
+ def languageCodes = []
foundLocales.append("new String[]{")
fileTree("src/main/res").visit { FileVisitDetails details ->
- if(details.file.path.endsWith("${File.separator}strings.xml")){
+ if(details.file.path.endsWith("${File.separator}torbrowser_strings.xml")){
def languageCode = details.file.parent.tokenize(File.separator).last().replaceAll('values-','').replaceAll('-r','-')
languageCode = (languageCode == "values") ? "en-US" : languageCode
- foundLocales.append("\"").append(languageCode).append("\"").append(",")
+ languageCodes.add(languageCode)
}
}
-
+ // The order of files in a `FileTree` is not stable, even on a single
+ // computer. Thus we need to sort the `languageCode`s. See: fenix#40083.
+ languageCodes.sort()
+ languageCodes.each {
+ foundLocales.append("\"").append(it).append("\"").append(",")
+ }
foundLocales.append("}")
def foundLocalesString = foundLocales.toString().replaceAll(',}','}')
android.defaultConfig.buildConfigField "String[]", "SUPPORTED_LOCALE_ARRAY", foundLocalesString
@@ -679,7 +706,13 @@ ext.updateExtensionVersion = { task, extDir ->
rename { 'manifest.json' }
into extDir
- def values = ['version': AndroidComponents.VERSION + "." + new Date().format('MMddHHmmss')]
+ def systemEnvBuildDate = System.getenv('MOZ_BUILD_DATE')
+ // MOZ_BUILD_DATE is in the yyyyMMddHHmmss format. Thus, we only use a
+ // substring of it if it is available.
+ def values = ['version': AndroidComponents.VERSION + "." +
+ (systemEnvBuildDate != null ?
+ systemEnvBuildDate.substring(4) :
+ new Date().format('MMddHHmmss'))]
inputs.properties(values)
expand(values)
}
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt
index fe6986fe4ee9488417544f4d17261aee241a3d62..313aa604be25734024ed24be34105b3b3f3191d9 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt
@@ -107,8 +107,8 @@ private fun assertVersionNumber() {
}
private fun assertProductCompany() {
- onView(withId(R.id.about_content))
- .check(matches(withText(containsString("Firefox Preview is produced by Mozilla."))))
+ onView(withId(R.id.tor_about_content))
+ .check(matches(withText(containsString("Firefox Preview is produced by the Tor Project."))))
}
private fun assertCurrentTimestamp() {
diff --git a/app/src/beta/res/drawable/ic_launcher_foreground.xml b/app/src/beta/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 736e0f6aef6bd23118c0160fd3ad6e82eb871229..0000000000000000000000000000000000000000
--- a/app/src/beta/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,221 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/beta/res/mipmap-hdpi/ic_launcher.png b/app/src/beta/res/mipmap-hdpi/ic_launcher.png
index 55f4b7622853e2c8aeb7689cb4cd59bf2aea751e..4b8a5d2e48b6746e5bd9eeafb29d6db11132a068 100644
Binary files a/app/src/beta/res/mipmap-hdpi/ic_launcher.png and b/app/src/beta/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/beta/res/mipmap-mdpi/ic_launcher.png b/app/src/beta/res/mipmap-mdpi/ic_launcher.png
index 5ef32aee0dfa98e4e1a1d1f2d793fb1f6417d4d6..4b8a5d2e48b6746e5bd9eeafb29d6db11132a068 100644
Binary files a/app/src/beta/res/mipmap-mdpi/ic_launcher.png and b/app/src/beta/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/beta/res/mipmap-xhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xhdpi/ic_launcher.png
index 4d2b67de2f6234b8482b47101552e0de993768fc..1bae7fa5fe70c9e4d817733027fb27f6bf139bd5 100644
Binary files a/app/src/beta/res/mipmap-xhdpi/ic_launcher.png and b/app/src/beta/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png
index 6e984131c66292ba8dc80b665f4d6f5fbadf1353..df944c11d7008a173c4795c64a2898270c155ce9 100644
Binary files a/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png
index 0c8b293aca97fa32946d8d1ed8bf5a385108dcb6..88005f72796869bdc5beb0cc2f1f055cc77b7c57 100644
Binary files a/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/beta/res/values/static_strings.xml b/app/src/beta/res/values/static_strings.xml
index 18bddf2c9e98e888fd6dff71c8da7c1951fcd12c..40f346f34786d0f5b0cc83050ba9411ffdb196e3 100644
--- a/app/src/beta/res/values/static_strings.xml
+++ b/app/src/beta/res/values/static_strings.xml
@@ -4,5 +4,5 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
- Firefox Beta
+ Tor Browser Alpha
diff --git a/app/src/beta/res/xml/shortcuts.xml b/app/src/beta/res/xml/shortcuts.xml
index c2e036a9f4987719ff3a22e066ecd68cd084f3ff..085c9229d639e52964a73bf4a07d6c11662c1a83 100644
--- a/app/src/beta/res/xml/shortcuts.xml
+++ b/app/src/beta/res/xml/shortcuts.xml
@@ -11,7 +11,7 @@
android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2">
diff --git a/app/src/debug/res/drawable/ic_launcher_foreground.xml b/app/src/debug/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 844e479ef48a7125aadd9719147feef2166a23b7..0000000000000000000000000000000000000000
--- a/app/src/debug/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/debug/res/xml/shortcuts.xml b/app/src/debug/res/xml/shortcuts.xml
index 1873a5af464a36a205c9434731c11d036886e6c1..4b6a060f7b004c7ca6517b4bdf0dae8402d09edb 100644
--- a/app/src/debug/res/xml/shortcuts.xml
+++ b/app/src/debug/res/xml/shortcuts.xml
@@ -12,7 +12,7 @@
android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2">
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6c4d1e1cf4f3fa0195ce9cbe95ac2b9cec0b20ed..9a85b09900d0031eb066eb3ac2ed3fe578dc85c3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -24,10 +24,10 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
- android:roundIcon="@mipmap/ic_launcher_round"
+ android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/NormalTheme"
- android:usesCleartextTraffic="true"
+ android:usesCleartextTraffic="false"
tools:ignore="UnusedAttribute">
+
+
diff --git a/app/src/main/assets/allowed_addons.json b/app/src/main/assets/allowed_addons.json
new file mode 100644
index 0000000000000000000000000000000000000000..fba73b4cd42abf333f47082a5e20600b345fab9c
--- /dev/null
+++ b/app/src/main/assets/allowed_addons.json
@@ -0,0 +1,3266 @@
+{
+ "page_size": 25,
+ "page_count": 1,
+ "count": 11,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "addon": {
+ "id": 855413,
+ "authors": [
+ {
+ "id": 13299734,
+ "name": "Alexander Shutau",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/13299734/",
+ "username": "alexanderby",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/13/13299/13299734.png?modified=1565722641"
+ }
+ ],
+ "average_daily_users": 455088,
+ "categories": {
+ "android": [
+ "experimental",
+ "user-interface"
+ ],
+ "firefox": [
+ "appearance",
+ "web-development"
+ ]
+ },
+ "contributions_url": "https://opencollective.com/darkreader?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org",
+ "created": "2017-09-19T07:03:00Z",
+ "current_version": {
+ "id": 5105134,
+ "compatibility": {
+ "firefox": {
+ "min": "54.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "54.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/versions/5105134",
+ "files": [
+ {
+ "id": 3649499,
+ "created": "2020-09-26T04:48:47Z",
+ "hash": "sha256:6b4b9ac88e660028682cb990ff2c2c573b65de72c0bca70564eefaeaf5179ea4",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 679032,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3649499/dark_reader-4.9.21-an+fx.xpi",
+ "permissions": [
+ "storage",
+ "tabs",
+ "theme",
+ ""
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 22,
+ "is_custom": false,
+ "name": {
+ "bg": "MIT/X11 Лиценз",
+ "ca": "Llicència MIT/X11",
+ "cs": "MIT/X11 licence",
+ "da": "MIT/X11-licens",
+ "de": "MIT/X11-Lizenz",
+ "el": "Άδεια MIT/X11",
+ "en-US": "MIT/X11 License",
+ "es": "Licencia MIT/X11",
+ "eu": "MIT/X11 Lizentzia",
+ "fa": "مجوز MIT/X11",
+ "fr": "Licence MIT/X11",
+ "ga-IE": "Ceadúnas MIT/X11",
+ "hu": "MIT/X11 licenc",
+ "id": "Lisensi MIT/X11",
+ "it": "Licenza MIT/X11",
+ "nl": "MIT/X11-licentie",
+ "pt-PT": "Licença MIT/X11",
+ "ru": "Лицензия MIT/X11",
+ "sk": "Licencia MIT/X11",
+ "sq": "Leje MIT/X11",
+ "sr": "MIT/X11 лиценца",
+ "sv-SE": "MIT/X11-licens",
+ "vi": "Giấy phép MIT/X11",
+ "zh-CN": "MIT/X11 许可协议"
+ },
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ },
+ "release_notes": {
+ "en-US": "- Fixed wrongly displaying pages where the extension is disabled."
+ },
+ "reviewed": null,
+ "version": "4.9.21"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "ar": "تقوم هذه الإضافة بتفعيل الوضع الليلي عن طريق إنشاء تنسيقات مظلمة للمواقع أثناء التنقل. يقوم Dark Reader بعكس الألوان الساطعة لجعلها عالية التباين وسهلة القراءة في الليل.\n\nبإمكانك ضبط السطوع، التباين، الفلتر البني، الوضع المظلم، إعدادات الخط وقائمة التجاهل.\n\nلا يقوم Dark Reader بعرض إعلانات ولا يقوم بإرسال بيانات المستخدم إلى أي مكان. الإضافة مفتوحة المصدر بالكامل https://github.com/darkreader/darkreader\n\nقبل التثبيت قم بتعطيل الإضافات المماثلة. استمتع بالمشاهدة!",
+ "bn": "এই চক্ষু-তদারক এক্সটেনশান কোনরূপ ব্যাঘাত ছাড়া ওয়েবসাইটের জন্য ডার্ক থিম তৈরি করতে নাইট মোডকে সক্ষম করে। ডার্ক রিডার উজ্জ্বল রঙগুলিকে পাল্টে এগুলোর মধ্যে উচ্চ বৈপরিত্য তৈরি করে এবং রাতে পাঠকার্য সহজ করে তোলে।\n\nআপনি উজ্জ্বলতা, বৈসাদৃশ্য, সেপিয়া ফিল্টার, অন্ধকার মোড, ফন্ট সেটিংস এবং উপেক্ষা-তালিকা সমন্বয় করতে পারেন।\n\nDark Reader বিজ্ঞাপন দেখায় না এবং ব্যবহারকারীর ডেটা কোথাও প্রেরণ করে না। এটি সম্পূর্ণ ওপেন সোর্স https://github.com/darkreader/darkreader\n\nআপনি ইনস্টল করার আগে অনুরূপ এক্সটেনশন অক্ষম করুন। দর্শন উপভোগ করুন!",
+ "cs": "Toto k očím šetrné rozšíření přepíná stránky do nočního režimu tím, že je samo převádí do tmavého motivu. Dark Reader invertuje jasné barvy tak, aby byly kontrastní a lehce čitelné v noci.\n\nMůžete upravit jas, kontrast, sépiový filtr, tmavý mód, nastavení písma a seznam ignorovaných stránek.\n\nDark Reader neobsahuje reklamy a nikam neodesílá data uživatele. Projekt je plně open-source a repositář je možné nalézt na https://github.com/darkreader/darkreader\n\nPřed instalací vypněte všechna podobná rozšíření. Přejeme příjemné surfování!",
+ "de": "Zum Schutz der Augen ermöglicht diese Erweiterung das Erstellen dunkler Farblayouts für Webseiten. Dabei invertiert Dark Reader helle Farben, macht sie kontrastreich und nachts gut lesbar.\n\nHelligkeit, Kontrast, Sepia-Filter, Dark-Modus, Schrifteinstellungen und Ignorier-Liste können manuell verwaltet und individuell eingestellt werden.\n\nDark Reader zeigt dabei keine Werbung und sendet keine Benutzerdaten irgendwohin. Es ist komplett quelloffen https://github.com/darkreader/darkreader\n\nBeachten Sie, dass Sie ähnliche Erweiterungen deaktivieren, bevor Sie Dark Reader installieren. Genießen und Gucken!",
+ "en-GB": "This eye-care extension enables night mode creating dark themes for websites on the fly. Dark Reader inverts bright colours making them high contrast and easy to read at night.\n\nYou can adjust brightness, contrast, sepia filter, dark mode, font settings and ignore-list.\n\nDark Reader doesn't show ads and doesn't send user's data anywhere. It is fully open-source https://github.com/darkreader/darkreader\n\nBefore you install disable similar extensions. Enjoy watching!",
+ "en-US": "This eye-care extension enables night mode creating dark themes for websites on the fly. Dark Reader inverts bright colors making them high contrast and easy to read at night.\n\nYou can adjust brightness, contrast, sepia filter, dark mode, font settings and ignore-list.\n\nDark Reader doesn't show ads and doesn't send user's data anywhere. It is fully open-source https://github.com/darkreader/darkreader\n\nBefore you install disable similar extensions. Enjoy watching!",
+ "es": "Esta extensión que cuida los ojos habilita el modo nocturno, creando temas oscuros para sitios de internet en el momento. Dark Reader invierte los colores brillantes, haciéndolos contrastantes y fáciles de leer a la noche.\n\nPuede ajustar brillo, contraste, filtro sepia, modo oscuro, configuración de fuentes y lista de ignorados\n\nDark Reader no muestra publicidad y no envía la información del usuario a ningún lado. Es totalmente de código abierto https://github.com/darkreader/darkreader\n\nAntes de instalarlo, desactive extensiones similares. Disfrute mirando!",
+ "fa": "این افزونه مراقبت از چشم، حالت تاریک را با ایجاد طرح تیره به صورت زنده برای سایت ها، فعال میکند. دارک ریدر رنگ های روشن را معکوس میکند، اختلاف تیره و روشن را بیشتر میکند و باعث ساده خوانی متون میشود.\n\nشما میتوانید میزان روشنایی، کنتراست، فیلتر قرمز قهوه ای، حالت تاریک، نوع قلم و لیست سایت های نادیده گرفته شده را تنظیم کنید.\n\nدارک ریدر تبلیغات نشان نمیدهد و اطلاعات کاربران را برای جایی ارسال نمیکند. همچنین بصورت کامل متن باز است https://github.com/darkreader/darkreader\n\nقبل از نصب افزونه های مشابه را حذف کنید. از تماشا کردن لذت ببرید!",
+ "fr": "Cette extension de protection oculaire active le mode nuit en créant à la volée des thèmes sombres pour les sites Web. Dark Reader inverse les couleurs vives, ce qui les rend très contrastés et faciles à lire la nuit.\n\nVous pouvez régler la luminosité, le contraste, le filtre sépia, le mode sombre, les paramètres de police et la liste des sites ignorés.\n\nDark Reader n’affiche pas de publicités et n’envoie aucune donnée utilisateur. Il est entièrement open source https://github.com/darkreader/darkreader\n\nAvant de l’installer, désactivez vos extensions similaires. Profitez et regardez!",
+ "he": "תוסף טיפוח לעיניים זה מאפשר למצב לילה ליצור ערכות נושא כהות לאתרי אינטרנט גלישה. קורא כהה ממיר צבעים בהירים מה שהופך אותם לניגודיות גבוהה וקל לקריאה בלילה.\n\nניתן להתאים את הבהירות, הניגודיות, מסנן חום-אדמדם, מצב כהה, הגדרות גופן ורשימת אתרים להתעלמות.\n\nReader Dark אינו מציג מודעות ואינו שולח את נתוני המשתמש לשום מקום. זהו קוד פתוח לחלוטין https://github.com/darkreader/darkreader\n\nלצורך פעולה תקינה, השבת תוספים דומים. צפייה נעימה!",
+ "id": "Ekstensi ini mengaktifkan mode malam dengan membuat halaman situs web menjadi gelap. Dark Reader bekerja dengan membalik warna cerah dengan warna kontras sehingga nyaman di mata.\n\nAnda bisa mengatur kecerahan, kontras, filter sepia, mode malam, setelan fon dan pengecualian situs web.\n\nDark Reader tidak menampilkan iklan dan tidak mengirimkan data penggunan ke manapun. Sepenuhnya bersumber terbuka: https://github.com/darkreader/darkreader\n\nSebelum memasang, silakan nonaktifkan ekstensi serupa. Selamat berselancar!",
+ "it": "Questa estensione si prende cura dei tuoi occhi e ti consente di creare al volo un tema scuro in modalità nottura per ogni sito. Dark Reader inverte i colori più luminosi rendendoli ad alto contrato e più semplici da leggere la notte.\n\nPuoi modificare luminosità, contrasto, filtro seppia, modalità notturna, caratteri e lista di siti da ignorare.\n\nDark Reader non mostra pubblicità e non invia i dati dell'utente da nessuna parte. È pienamente open-source https://github.com/darkreader/darkreader\n\nPrima di installare disabilita altre estensioni simili. Buona lettura!",
+ "ja": "このアイ・ケアの拡張機能は、オンザフライでウェブサイトのためのダークテーマを作成し、ナイトモードを有効にします。 Dark Readerは鮮やかな色を反転させてコントラストを高め、夜間に読みやすくします。\n\n明るさ、コントラスト、セピアフィルター、ダークモード、フォント設定、無視リストを調整することができます。\n\nDark Readerは広告を表示せず、ユーザーのデータをどこにも送信しません。 それは完全にオープンソースです https://github.com/darkreader/darkreader\n\nインストールする前に、同様の拡張機能を無効にしてください。 ブラウジングをお楽しみください!",
+ "ko": "이 눈 건강을 위한 확장 기능은 실시간으로 각 웹사이트에 어두운 테마를 적용해 야간 모드를 가능케 합니다. 다크 리더는 밝은 색상을 반전해 고대비로 만들어 밤에 읽기가 쉽도록 만듭니다.\n\n밝기, 대비, 세피아 필터, 어두운 모드, 폰트와 예외 목록을 설정할 수 있습니다.\n\n다크 리더는 광고를 보여주지 않으며 사용자의 데이터를 어디에도 보내지 않습니다. 완전히 오픈 소스입니다. https://github.com/darkreader/darkreader\n\n설치하기 전에 비슷한 기능을 가진 확장 기능을 사용 해제하시기 바랍니다. 편하게 읽으십시오!",
+ "nl": "Deze oog zorg extensie heeft een nachtstand mogelijkheid waarbij het maken van donkere themas zeer gemakkelijk is. Donkere modus keert lichte kleuren om, zo heb je een makkelijk te lezen hoog contrast.\n\nJe kunt de helderheid, het contrast, een sepia filter, donkere modus, lettertype en een lijst van te negeren websites geheel instellen naar wens.\n\nDark Reader laat nooit advertenties zien en gebruikt nooit je data. Deze extensie is volledig open-source op https://github.com/darkreader/darkreader\n\nVoor de installatie is het aangeraden soortgelijke extensies eerst uit te schakelen. Veel kijkplezier!",
+ "pl": "To rozszerzenie dbające o zdrowie oczu aktywuje tryb nocny tworząc dynamiczne ciemne motywy dla stron internetowych. Dark Reader odwraca jasność kolorów, nadając im wysokiego kontrastu i ułatwiając czytanie w nocy.\n\nMożesz dopasować jasność, kontrast, filtr sepii, tryb ciemny, ustawienia czcionki i listę ignorowanych stron.\n\nDark reader nie wyświetla reklam ani nie wysyła nigdzie danych użytkowników. Jest oprogramowaniem o w pełni otwartym kodzie źródłowym https://github.com/darkreader/darkreader\n\nPrzed instalacją usuń podobne rozszerzenia. Miłego oglądania!",
+ "pt-BR": "Esta extensão ajuda seus olhos a relaxarem ao criar e aplicar o modo escuro aos sites que você visita. O Dark Reader inverte as cores brilhantes, tornando-as de alto contraste e deixando-as fáceis de serem lidas à noite.\n\nVocê pode ajustar o brilho, o contraste, os tons de sépia, o modo escuro, as configurações de fonte e a lista negra.\n\nO Dark Reader não exibe anúncios e não compartilha os dados de seus usuários. O código-fonte é totalmente aberto (open-source) https://github.com/darkreader/darkreader\n\nAntes de instalar esta extensão, desative extensões semelhantes. Divirta-se!",
+ "pt-PT": "Esta extensão de cuidados com os olhos ativa o modo noturno criando temas escuros para sites. O Dark Reader inverte as cores brilhantes, tornando-as de alto contraste e fáceis de ler à noite.\n\nVocê pode ajustar o brilho, o contraste, o filtro sépia, o modo escuro, as configurações de fonte e a lista de ignorados.\n\nO Dark Reader não exibe anúncios e não envia dados do usuário em nenhum lugar. É totalmente open-source https://github.com/darkreader/darkreader\n\nAntes de instalar desativar extensões semelhantes. Visualização agradável!",
+ "ro": "Această extensie, care se îngrijește de ochii tăi, permite activarea modului de noapte creând pe loc o temă întunecată pentru siteuri. Dark Reader inversează culorile luminoase mărindu-le contrastul și făcându-le ușor de citit noptea.\n\nPoți ajusta luminozitatea, contrastul, filtrul sepia, modul întunecat, setările fontului si lista siteurilor de ignorat.\n\nDark Reader nu afișează reclame și nu trimite datele utilizatorului nicăieri. Este în întregime open-source https://github.com/darkreader/darkreader\n\nÎnainte de instalare dezactivează extensile similare. Vizionare plăcută!",
+ "ru": "Это расширение переводит браузер в ночной режим. Дарк Ридер заменяет светлый фон тёмным, что снижает усталость глаз при долгой работе за компьютером либо при просмотре веб-страниц ночью.\n\nИмеется возможность настраивать яркость, контрастность, шрифт, режим инверсии, режим наложения жёлтого фильтра (сепия).\n\nDark Reader не встраивает рекламу и не собирает пользовательские данные. Весь исходный код открыт https://github.com/darkreader/darkreader\n\nПеред установкой отключите подобные расширения. Приятного просмотра!",
+ "sk": "Toto rozšírenie je šetrné k očiam, vytvára nočný režim pre stránky za pochodu. Dark Reader invertuje jasné farby a robí ich kontrastnejšími, čím sa zlepšuje ich čitateľnosť v noci.\n\nUpravovať môžete jas, kontrast, sépiový filter, tmavý režim, nastavenia písma a zoznam ignorovaných stránok.\n\nDark Reader je bez reklám a nikam neodosiela žiadne dáta užívateľov. Má plne otvorený zdrojový kód https://github.com/darkreader/darkreader\n\nPred inštaláciou zakážte podobné rozšírenia. Užite si sledovanie!",
+ "sv-SE": "Detta ögonbeskyddande tillägg aktiverar nattläge och skapar mörka teman för webbplatser. Dark Reader ersätter ljusa färger med mörka färger som har hög kontrast och gör läsning på kvällen enkel.\n\nDu kan justera ljusstyrka, kontrast, sepia filter, mörkt läge, teckensnitt och ignoreringslista.\n\nDark Reader visar inte reklam och skickar inte ut användares data. Den har helt öppen källkod https://github.com/darkreader/darkreader\n\nAvaktivera liknande tillägg innan du installerar. Njut av upplevelsen!",
+ "th": "นี้เป็นส่วนเสริมที่คอยดูแลสายตาของคุณด้วยการเปิดโหมดกลางคืน และสร้างธีมมืดให้กับทุกๆเว็บ Dark Reader จะสลับสีสว่างๆให้เป็นสีดำหรือสีมืด และทำให้ง่ายต่อการอ่านตอนกลางคืน\n\nคุณสามารถปรับแต่งความสว่าง, คอนทราสต์, สีซีเปีย, โหมดมืด, ตั้งค่าฟอนต์ และทำรายการยกเว้นได้\n\nDark Reader ไม่แสดงโฆษณา และไม่ส่งข้อมูลของผู้ใช้เด็ดขาด ตัวส่วนเสริมเป็นโอเพนซอร์สโดยสมบูรณ์ดูได้ที่ https://github.com/darkreader/darkreader\n\nก่อนที่จะติดตั้ง ปิดส่วนเสริมที่ทำหน้าที่เหมือนๆกันก่อนนะ ขอให้สนุกกับธีมสีมืดนะ!",
+ "tr": "Bu göz bakım eklentisi web siteleri için anında koyu temalar oluşturarak gece modunu etkinleştirir. Dark Reader parlak renkleri ters çevirerek yüksek kontrast oluşturur ve geceleri okumayı kolaylaştırır.\n\nParlaklığı, kontrastı, sepya filtresini, koyu modu, yazı tipi ayarlarını ve yoksayma listesini ayarlayabilirsiniz.\n\nDark Reader, reklam göstermez ve kullanıcının verilerini hiçbir yere göndermez. Tamamen açık kaynak kodludur. https://github.com/darkreader/darkreader\n\nYüklemeden önce benzer uzantıları devre dışı bırakın. Gezintinin tadını çıkarın!",
+ "uk": "Це розширення для догляду за очима дозволяє створювати темні вигляди для мережевих сайтів. Dark Reader інвертує яскраві барви, роблячи їх контрастними і такими що легко читаються вночі.\n\nВи можете налаштувати яскравість, контраст, сепію, темний вигляд, налаштування вигляду тексту та список нехтування.\n\nDark Reader не містить рекламу і не надсилає дані користувача нікуди. Це розширення з відкритим кодом https://github.com/darkreader/darkreader\n\nПеред встановленням відімкніть подібні розширення. Насолоджуйтесь переглядом!",
+ "vi": "Tiện ích chăm sóc mắt này cho phép chế độ ban đêm tạo chủ đề tối cho các trang web đang hoạt động. Dark Reader đảo ngược màu sắc tươi sáng làm cho chúng có độ tương phản cao và dễ đọc vào ban đêm.\n\nBạn có thể điều chỉnh độ sáng, độ tương phản, bộ lọc màu nâu đỏ, chế độ tối, cài đặt phông chữ và danh sách bỏ qua.\n\nDark Reader không hiển thị quảng cáo và không gửi dữ liệu của người dùng ở bất cứ đâu. Nó hoàn toàn là mã nguồn mở https://github.com/darkreader/darkreader\n\nTrước khi bạn cài đặt vô hiệu hóa các phần mở rộng tương tự. Thích xem!",
+ "zh-CN": "这是一个护眼扩展程序,通过实时生成黑暗主题,为每一个网站启用夜间模式。 Dark Reader 反转明亮的颜色,使网页内容具有高对比度并易于在夜间阅读。\n\n您可以调整亮度、对比度,应用棕褐色滤镜、黑暗模式,设置字体和忽略的网站列表。\n\nDark Reader 无广告,也不会向任何地方发送用户的数据。它完全开源 https://github.com/darkreader/darkreader\n\n安装前请禁用类似的扩展。冲浪愉快!",
+ "zh-TW": "這是一個護眼擴展程序,通過實時生成黑色主題,為每一個網站啟用夜間模式。 Dark Reader反轉明亮的顏色,使其網頁內容具有高對比度並且易於在夜間閱讀。\n\n您可以調整亮度,對比度,應用棕褐色濾鏡,黑暗模式,設置字體和忽略的網站列表。\n\nDark Reader 沒有廣告,也不會在任何地方發送用戶的數據。它完全開源於 https://github.com/darkreader/darkreader\n\n安裝前停止使用類似的擴展,以避免衝突。瀏覽愉快!"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/edit",
+ "guid": "addon@darkreader.org",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "cs": "http://darkreader.org/",
+ "de": "http://darkreader.org/",
+ "en-GB": "http://darkreader.org/",
+ "en-US": "https://darkreader.org/",
+ "es": "http://darkreader.org/",
+ "fr": "http://darkreader.org/",
+ "id": "http://darkreader.org/",
+ "it": "https://darkreader.org/",
+ "ja": "http://darkreader.org/",
+ "ko": "http://darkreader.org/",
+ "pt-BR": "http://darkreader.org/",
+ "pt-PT": "http://darkreader.org/",
+ "ro": "https://darkreader.org/",
+ "ru": "http://darkreader.org/",
+ "zh-CN": "http://darkreader.org/",
+ "zh-TW": "http://darkreader.org/"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/855/855413-32.png?modified=7a53288d",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/855/855413-64.png?modified=7a53288d",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/855/855413-128.png?modified=7a53288d"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-09-26T05:34:48Z",
+ "name": {
+ "ar": "Dark Reader",
+ "bn": "Dark Reader",
+ "cs": "Dark Reader",
+ "de": "Dark Reader",
+ "en-GB": "Dark Reader",
+ "en-US": "Dark Reader",
+ "es": "Dark Reader",
+ "fa": "Dark Reader",
+ "fr": "Dark Reader",
+ "he": "Dark Reader",
+ "id": "Dark Reader",
+ "it": "Dark Reader",
+ "ja": "Dark Reader",
+ "ko": "Dark Reader",
+ "nl": "Dark Reader",
+ "pl": "Dark Reader",
+ "pt-BR": "Dark Reader",
+ "pt-PT": "Dark Reader",
+ "ro": "Dark Reader",
+ "ru": "Dark Reader",
+ "sk": "Dark Reader",
+ "sv-SE": "Dark Reader",
+ "th": "Dark Reader",
+ "tr": "Dark Reader",
+ "uk": "Dark Reader",
+ "vi": "Dark Reader",
+ "zh-CN": "Dark Reader",
+ "zh-TW": "Dark Reader"
+ },
+ "previews": [
+ {
+ "id": 201069,
+ "caption": {
+ "en-US": "Dark Reader night theme mode"
+ },
+ "image_size": [
+ 2400,
+ 1500
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/201/201069.png?modified=1545252760",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/201/201069.png?modified=1545252760"
+ },
+ {
+ "id": 201070,
+ "caption": {
+ "en-US": "Dark Reader filter settings"
+ },
+ "image_size": [
+ 2400,
+ 1500
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/201/201070.png?modified=1545252760",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/201/201070.png?modified=1545252760"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.5651,
+ "bayesian_average": 4.563324899124615,
+ "count": 2980,
+ "text_count": 986
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/855413",
+ "slug": "darkreader",
+ "status": "public",
+ "summary": {
+ "ar": "الوضع المظلم لجميع المواقع. اعتن بعينيك، استعمل التنسيق الداكن للتصفح اليومي في الليل.",
+ "bn": "প্রত্যেক ওয়েবসাইটের জন্য ডার্কমোড। নিজ চোখের যত্ম নিন, নিত্যকার ব্রাউজিং এর জন্য ব্যবহার করুন ডার্ক থিম।",
+ "cs": "Tmavý motiv pro každou stránku. Používejte Dark Reader pro celodenní prohlížení webu a šetřete tak své oči.",
+ "de": "Dunkles Design für jede Website. Schonen Sie Ihre Augen und verwenden Sie Dark Reader für die Nacht und das tägliche Surfen.",
+ "en-GB": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.",
+ "en-US": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.",
+ "es": "Tema oscuro para todos los sitios. Cuide sus ojos, utilice Dark Reader para navegar durante el día y la noche.",
+ "fa": "حالت تاریک برای همه سایت ها. مراقب چشمانتان باشید، برای وبگردی در شب یا روز از حالت تاریک استفاده کنید.",
+ "fr": "Un thème sombre pour chaque site Web. Prenez soin de vos yeux, utilisez Dark Reader pour votre navigation nocturne et quotidienne.",
+ "he": "מצב אפל לכל אתר. תשמור על העיניים שלך, השתמש בעיצוב כהה לגלישה בלילה או אפילו ביום.",
+ "id": "Mode malam untuk semua situs web. Menjaga mata anda, menggunakan tema gelap untuk berselancar siang dan malam hari.",
+ "it": "Tema scuro per ogni sito. Prenditi cura dei tuoi occhi, usa Dark Reader per navigare giorno e notte.",
+ "ja": "すべてのウェブサイトにダークテーマを適用します。夜間や毎日のブラウジングにDark Readerを使用し、あなたの目を気遣います。",
+ "ko": "모든 웹사이트에 다크 모드를 적용합니다. 밤이나 일상적인 웹 브라우징을 할 때 어두운 테마를 사용하여 눈을 보호하십시오.",
+ "nl": "Donkere modus voor elke website. Zorg goed voor je ogen, gebruik donkere modus voor gebruik in de nacht of zelfs overdag.",
+ "pl": "Tryb ciemny dla wszystkich stron internetowych. Zadbaj o swoje oczy, używaj ciemnego motywu przeglądając w dzień i w nocy.",
+ "pt-BR": "Tema escuro para todos os sites. Mantenha seus olhos relaxados usando o tema escuro em sua navegação diária.",
+ "pt-PT": "Tema escuro para todos os sites. Cuide dos seus olhos, use o Dark Reader para navegação noturna e diária.",
+ "ro": "Dark themeTemă întunecată pentru orice site. Ai grijă de ochii tăi, folosește Dark Reader pentru cititul noaptea și de zi cu zi. for every website. Care your eyes, use Dark Reader for night and daily browsing.",
+ "ru": "Тёмная тема для каждого сайта. Берегите зрение, используйте Дарк Ридер для ночного или ежедневного просмотра веб-страниц.",
+ "sk": "Tmavý režim pre každú stránku. Šetrite svoje oči a používajte tmavý motív po celý deň.",
+ "sv-SE": "Mörkt läge för varje webbplats. Ta hand om dina ögon, använd ett mörkt tema för nattlig och daglig surfning.",
+ "th": "เปลี่ยนเป็นโหมดมืดให้กับทุกๆเว็บเพื่อปกป้องสายตาของคุณ ใช้ธีมสีมืดสำหรับตอนกลางคืนและการท่องเว็บในชีวิตประจำวัน",
+ "tr": "Her web sitesi için koyu mod. Gözlerinize iyi bakın, gece ve günlük gezinti için koyu renk tema kullanın.",
+ "uk": "Темний вигляд для кожного мережевого сайту. Піклуйтеся про свої очі, використовуйте темний вид для нічного та щоденного перегляду.",
+ "vi": "Chế độ tối cho mọi trang web. Chăm sóc đôi mắt của bạn, sử dụng chủ đề tối cho trình duyệt ban đêm và hàng ngày.",
+ "zh-CN": "适用于任何网站的黑暗主题。关爱眼睛,就使用 Dark Reader 进行日常浏览。",
+ "zh-TW": "黑色主題,適用於任何網站。關愛眼睛,使用Dark Reader進行夜間和日間瀏覽。"
+ },
+ "support_email": {
+ "ar": "darkreaderapp@gmail.com",
+ "bn": "darkreaderapp@gmail.com",
+ "en-GB": "darkreaderapp@gmail.com",
+ "en-US": "darkreaderapp@gmail.com",
+ "fa": "darkreaderapp@gmail.com",
+ "fr": "darkreaderapp@gmail.com",
+ "he": "darkreaderapp@gmail.com",
+ "id": "darkreaderapp@gmail.com",
+ "it": "darkreaderapp@gmail.com",
+ "ko": "darkreaderapp@gmail.com",
+ "nl": "darkreaderapp@gmail.com",
+ "pl": "darkreaderapp@gmail.com",
+ "pt-BR": "darkreaderapp@gmail.com",
+ "sk": "darkreaderapp@gmail.com",
+ "sv-SE": "darkreaderapp@gmail.com",
+ "th": "darkreaderapp@gmail.com",
+ "tr": "darkreaderapp@gmail.com",
+ "uk": "darkreaderapp@gmail.com",
+ "vi": "darkreaderapp@gmail.com",
+ "zh-CN": "darkreaderapp@gmail.com",
+ "zh-TW": "darkreaderapp@gmail.com"
+ },
+ "support_url": {
+ "ar": "https://github.com/darkreader/darkreader",
+ "bn": "https://github.com/darkreader/darkreader",
+ "en-GB": "https://github.com/darkreader/darkreader",
+ "en-US": "https://github.com/darkreader/darkreader",
+ "fa": "https://github.com/darkreader/darkreader",
+ "fr": "https://github.com/darkreader/darkreader",
+ "he": "https://github.com/darkreader/darkreader",
+ "id": "https://github.com/darkreader/darkreader",
+ "it": "https://github.com/darkreader/darkreader",
+ "ko": "https://github.com/darkreader/darkreader",
+ "nl": "https://github.com/darkreader/darkreader",
+ "pl": "https://github.com/darkreader/darkreader",
+ "pt-BR": "https://github.com/darkreader/darkreader",
+ "sk": "https://github.com/darkreader/darkreader",
+ "sv-SE": "https://github.com/darkreader/darkreader",
+ "th": "https://github.com/darkreader/darkreader",
+ "tr": "https://github.com/darkreader/darkreader",
+ "uk": "https://github.com/darkreader/darkreader",
+ "vi": "https://github.com/darkreader/darkreader",
+ "zh-CN": "https://github.com/darkreader/darkreader",
+ "zh-TW": "https://github.com/darkreader/darkreader"
+ },
+ "tags": [
+ "contrast",
+ "dark",
+ "dynamic theme",
+ "invert",
+ "night",
+ "sepia",
+ "theme"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/",
+ "weekly_downloads": 27587
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 229918,
+ "authors": [
+ {
+ "id": 5474073,
+ "name": "EFF Technologists",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/5474073/",
+ "username": "eff-technologists",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/5/5474/5474073.png?modified=1469820907"
+ }
+ ],
+ "average_daily_users": 717982,
+ "categories": {
+ "firefox": [
+ "privacy-security"
+ ]
+ },
+ "contributions_url": "https://www.paypal.me/SupportEFF?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org",
+ "created": "2010-09-16T15:09:10Z",
+ "current_version": {
+ "id": 5081059,
+ "compatibility": {
+ "firefox": {
+ "min": "42.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "48.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/https-everywhere/versions/5081059",
+ "files": [
+ {
+ "id": 3625427,
+ "created": "2020-08-13T19:14:09Z",
+ "hash": "sha256:47034cf750c305a328e59de104cf7a5710dbffc9f2dc183283e2f770f2e74241",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 1774640,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3625427/https_everywhere-2020.8.13-an+fx.xpi",
+ "permissions": [
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "tabs",
+ "cookies",
+ "storage",
+ "*://*/*",
+ "ftp://*/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 5278,
+ "is_custom": true,
+ "name": {
+ "en-US": "Multiple"
+ },
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/license/2020.8.13"
+ },
+ "release_notes": {
+ "en-US": "* Fix port based whitelsiting issue #19291\n* Update documentation\n* Update dependencies (NPM and Chromedriver)\n* Minor code fixes in JS"
+ },
+ "reviewed": null,
+ "version": "2020.8.13"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "de": "Viele Webseiten unterstützen zwar Verschlüsslung über HTTPS, machen es aber nicht einfach, diese auch zu nutzen. Manchmal bieten diese beispielsweise standardmäßig nur unverschlüsseltes HTTP an oder haben auf verschlüsselten Seiten Links gesetzt, die Sie zurück zu einer unverschlüsselten Version führen.\n\nDie HTTPS-Everywhere Erweiterung löst dieses Problem, indem sie alle Anfragen zu diesen Seiten automatisch zu HTTPS ändert.",
+ "en-US": "Many sites on the web offer some limited support for encryption over HTTPS, but make it difficult to use. For instance, they may default to unencrypted HTTP, or fill encrypted pages with links that go back to the unencrypted site.\n\nThe HTTPS Everywhere extension fixes these problems by rewriting all requests to these sites to HTTPS.",
+ "es": "Muchos sitios en la web ofrecen soporte limitado para cifrado sobre HTTPS, pero hacen difícil su uso. Por ejemplo, puede que usen HTTP no cifrado por defecto o que llenen páginas cifradas con enlaces que vuelvan al sitio no cifrado.\n\nLa extensión HTTPS Everywhere corrige estos problemas reescribiendo todas las peticiones a estos sitios a HTTPS.",
+ "fr": "Beaucoup de sites web offrent une prise en charge limitée pour le chiffrement via HTTPS, mais la rendent difficile à utiliser. Par exemple, ils peuvent utiliser une adresse par défaut non chiffrée avec HTTPS, ou proposer sur des pages chiffrées uniquement des liens qui retournent sur le site non chiffré.\n\nL’extension HTTPS Everywhere résout le problème en redirigeant toutes les requêtes de ces sites vers HTTPS.",
+ "it": "Molti siti web offrono un limitato supporto per la crittografia HTTPS, ma lo rendono difficile da usare. Ad esempio, possono avere come impostazione predefinita HTTP non crittato, o inserire in pagine crittate collegamenti che indirizzano a siti non crittati.\n\nL'estensione HTTPS Everywhere consente di correggere questi problemi riscrivendo tutte le richieste a questi siti in HTTPS.",
+ "nl": "Veel websites bieden enigszins beperkte ondersteuning voor versleuteling via HTTPS, maar maken het moeilijk om dit te gebruiken. Ze kunnen bijvoorbeeld standaard niet-versleutelde HTTP hanteren, of versleutelde pagina’s vullen met koppelingen die naar de niet-versleutelde website terugkeren.\n\nDe HTTPS Everywhere-extensie lost deze problemen op door alle aanvragen naar deze websites naar HTTPS te herschrijven.",
+ "pt-BR": "Muitos sites na web oferecem algum suporte limitado a criptografia sobre HTTPS, mas tornam difícil seu uso. Por exemplo, podem encaminhar por padrão para HTTP não criptografado, ou colocar em páginas criptografadas links que voltam à versão não criptografada do site.\n\nA extensão HTTPS Everywhere corrige esses problemas, substituindo todas as solicitações a esses sites para HTTPS.",
+ "zh-CN": "许多网站通过 HTTPS 提供有限的网络加密,这样有时很难起作用。比如,网站还是默认使用 HTTP,或者在加密页面使用指向非加密页面的链接。\n\nHTTPS Everywhere 扩展通过把发向这些网站的请求都改写成 HTTPS 来解决这些问题。"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/https-everywhere/edit",
+ "guid": "https-everywhere-eff@eff.org",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "de": "https://www.eff.org/https-everywhere",
+ "en-US": "https://www.eff.org/https-everywhere",
+ "es": "https://www.eff.org/https-everywhere",
+ "fr": "https://www.eff.org/https-everywhere",
+ "it": "https://www.eff.org/https-everywhere",
+ "nl": "https://www.eff.org/https-everywhere",
+ "pt-BR": "https://www.eff.org/https-everywhere",
+ "zh-CN": "https://www.eff.org/https-everywhere"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/229/229918-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/229/229918-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/229/229918-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-08-19T11:57:57Z",
+ "name": {
+ "de": "HTTPS Everywhere",
+ "en-US": "HTTPS Everywhere",
+ "es": "HTTPS Everywhere",
+ "fr": "HTTPS Everywhere",
+ "it": "HTTPS Everywhere",
+ "nl": "HTTPS Everywhere",
+ "pt-BR": "HTTPS Everywhere",
+ "zh-CN": "HTTPS Everywhere - 加密网络"
+ },
+ "previews": [
+ {
+ "id": 214771,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/214/214771.png?modified=1549592598",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/214/214771.png?modified=1549592598"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.6058,
+ "bayesian_average": 4.603224910595648,
+ "count": 2075,
+ "text_count": 542
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/229918",
+ "slug": "https-everywhere",
+ "status": "public",
+ "summary": {
+ "de": "Verschlüsseln Sie das Web! HTTPS-Everywhere schützt Ihre Kommunikation indem die Verbindung zu unterstützten Seiten automatisch auf eine HTTPS-Verschlüsselung umgestellt wird, auch wenn die URL oder ein besuchter Link das https://-Präfix weg lässt.",
+ "en-US": "Encrypt the web! HTTPS Everywhere is a Firefox extension to protect your communications by enabling HTTPS encryption automatically on sites that are known to support it, even when you type URLs or follow links that omit the https: prefix.",
+ "es": "¡Cifra la web! HTTPS Everywhere es una extensión para proteger tus comunicaciones al habilitar el cifrado HTTPS automáticamente en las web que lo soportan, incluso cuando escribes URLs o sigues vínculos que omiten el prefijo \"https:\".",
+ "fr": "Chiffrez le Web ! L’extension Firefox HTTPS Everywhere protège vos communications en activant automatiquement le chiffrement HTTPS sur les sites le prenant en charge, même lorsque vous saisissez une URL ou cliquez sur un lien sans préfixe « https: ».",
+ "it": "Il Web crittato! HTTPS Everywhere è un'estensione per Firefox che protegge le comunicazioni attivando la crittografia HTTPS automaticamente su tutti i siti che la supportano, anche se si digitano URL o si seguono link che omettono il prefisso https.",
+ "nl": "Versleutel het web! HTTPS Everywhere is een Firefox-extensie die uw communicatie beschermt door automatisch HTTPS-versleuteling in te schakelen op websites die dit ondersteunen, zelfs bij URL’s of koppelingen die het voorvoegsel https: weglaten.",
+ "pt-BR": "Criptografe a web! HTTPS Everywhere é uma extensão que protege sua comunicação habilitando criptografia HTTPS automaticamente em sites que são conhecidos por suportá-la, mesmo quando você digita URLs ou segue links que omitem o prefixo https:",
+ "zh-CN": "加密网络!HTTPS Everywhere 是一个保护通信的 Firefox 扩展。它对支持加密的网站自动开启 HTTPS 通信加密,即使你在输入网址时没有加上 https: 前缀也一样。"
+ },
+ "support_email": {
+ "en-US": "extension-devs@eff.org"
+ },
+ "support_url": {
+ "en-US": "https://www.eff.org/https-everywhere"
+ },
+ "tags": [
+ "encrypt",
+ "encryption",
+ "https",
+ "https everywhere",
+ "privacy",
+ "security"
+ ],
+ "type": "extension",
+ "url": "https://www.eff.org/https-everywhere",
+ "weekly_downloads": 17543
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 521554,
+ "authors": [
+ {
+ "id": 6937656,
+ "name": "Thomas Rientjes",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/6937656/",
+ "username": "Synzvato",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/6/6937/6937656.png?modified=1550343990"
+ }
+ ],
+ "average_daily_users": 184911,
+ "categories": {
+ "android": [
+ "security-privacy"
+ ],
+ "firefox": [
+ "privacy-security"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2014-06-10T05:46:02Z",
+ "current_version": {
+ "id": 4994807,
+ "compatibility": {
+ "firefox": {
+ "min": "56.0a1",
+ "max": "*"
+ },
+ "android": {
+ "min": "56.0a1",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/decentraleyes/versions/4994807",
+ "files": [
+ {
+ "id": 3539177,
+ "created": "2020-04-01T07:50:52Z",
+ "hash": "sha256:71a55834ee991605d461f304271f989aa1147e1cf772e25787cbada19ab0ba51",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 6852197,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3539177/decentraleyes-2.0.14-an+fx.xpi",
+ "permissions": [
+ "*://*/*",
+ "privacy",
+ "storage",
+ "unlimitedStorage",
+ "tabs",
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 3338,
+ "is_custom": false,
+ "name": {
+ "en-US": "Mozilla Public License, version 2.0"
+ },
+ "url": "http://www.mozilla.org/MPL/2.0/"
+ },
+ "release_notes": {
+ "en-US": "Enhancements:\n\n- Implemented a wide range of minor usability and accessibility improvements.\n\nOther changes:\n\n- Applied various performance optimizations and stability improvements."
+ },
+ "reviewed": null,
+ "version": "2.0.14"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "ar": "بدأت المواقع الإلكترونية تتّكل بشكل متزايد على جهات ثالثة كبيرة لتوصل محتواها للمستخدمين. إلغاء الطلبات لعرض الإعلانات أو طلبات إضافة برامج التعقّب (تراكرز) يمر عادة دون مشكلة. ولكن حجب المحتوى بنفسه قد يعطّل الصفحة، وهذا أمر متوقّع. هدف برنامج الإضافة هذا (آد أون) هو التخلص من الوسيط عند تحسين الخصوصية على النت وذلك عبر توصيل حزمة من الملفات المحلية بسرعة فائقة.\n\n • يحمي الخصوصية عبر تجنّب شبكات التوصيل الكبيرة التي تدّعي تقديم خدمات مجانية.\n • يكمل مانع المحتوى المعتاد مثل يو بلوك أوريجين (موصى به)، آدبلوك بلس، و أخرى.\n • يعمل مباشرة، لا يحتاج لأي شكل من الإعدادات المسبقة.\n\nملاحظة: ديسنترالايز ليس حلا سحرياً ولكنه يمنع العديد من المواقع من إرسال هذا النوع من الطلبات لك. وأخيراً، يمكنك أيضاً أن تجعل ديسنترالايز يحجب الطلبات لأي موارد شبكات توصيل المحتوى الممقودة.\n\n > مقدمة أبسط: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nهل أنا محمي حاليا؟\n\nالتالية أداة الفحص تظهر لك إذا كنت محميًا بشكل مناسب. هي الطريقة الموصى بها، وهي الأسرع على الأرجح، لمعرفة إذا كان الآد أون مثبّتاً، مشغّلاً واعداداته صحيحة.\n\n > الرابط الكامل لأداة الفحص: https://decentraleyes.org/test\n\nالأسئلة المتكررة\n\n > الرابط الكامل للأسئلة المتكرّرة: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nمعلومات تقنية\n\n- الشبكات المدعومة: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, UpYun Libraries.\n\n- حزمة الموارد: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, Web Font Loader.\n\nالدعم الشخصي\n\nهل سؤالك غير مذكور أعلاه، أو لديك سبب ما للاتصال بي شخصياً؟ بإمكانك التواصل معي على decentraleyes@protonmail.com. التبليغ عن الأخطاء أو الاقتراحات هي في موضع ترحيب وأنا أجيب على كل إيميل يصلني.\n\nلا تتردّد في استخدام مفتاح ال PGP العمومي هذا للاتصالات المشفرة.\n\n > عنوان المفتاح العمومي PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nهل تستمتع باستخدام هذا الآد أون؟\n\nديسنترالايز هو مجاني، وسيبقى مجانياً، ولكن يمكنك دعم تطوره المستمر عبر تقديم تبرّع ما، المساهمة على GitLab، أو إخبار الآخرين عنه (وكلام الناس فعّال جدا). أي مساهمة هي في موقع تقدير!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • تبرّع: https://decentraleyes.org/donate",
+ "bg": "Сайтовете все повече започват да разчитат на големи трети страни за доставяне на съдържание. Отмяната на заявки за реклами или проследители обикновено минава без проблеми, но блокирането на действителното съдържание, без изненада, чупи страници. Целта на тази добавка е да премахне посредника чрез предоставяне на мълниеносна скорост на доставка на местните (пакетни) файлове за подобряване на неприкосновеността в мрежата.\n\n • Защитава личните данни, като избягва големи мрежи за доставяне на съдържание, твърдящи, че предлагат безплатни услуги.\n • Допълва обикновените блокировачи като Юблок Ориджин (препоръчва се), Адблок Плюс и други.\n • Работи веднага, без нужда от предварителна настройка.\n\nЗабележка: Децентралайз не е сребърен куршум, но попречва на сайтовете да ви карат да изпращате такива заявки. В крайна сметка, можете да накарате Децентралайз да блокира и заявки за всякакви липсващи ресурси от МДС.\n\n > По-просто въведение: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nЗащитен ли съм в момента?\n\nСледната проверяваща услуга ви показва дали сте правилно защитени. Това е препоръчителният и вероятно най-бързият начин да видите дали добавката е инсталирана, включена и правилно настроена.\n\n > Пълна връзка към проверяващата услуга: https://decentraleyes.org/test\n\nЧесто задавани въпроси\n\n > Пълна връзка към ЧЗВ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nТехнически сведения\n\n- Поддържани мрежи: Съхраняваните библиотеки на Гугъл, Аякс МДС на Майкрософт, CDNJS (Клаудфлеър), jQuery МДС (МаксСДН) jsDelivr (МаксСДН), МДС на Яндекс, МДС на Байду, Обществени ресурси Сина и библиотеки ЪпЮн.\n\n- Ресурси в пакета: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, и Мрежов зареждач на шрифтове.\n\nЛична поддръжка\n\nАко въпросът ви го няма в списъка или имате друга причина да се свържете с мен, винаги можете да ме намерите на адрес decentraleyes@protonmail.com. Доклади за грешки или предложения са добре дошли и отговарям на всяко едно писмо.\n\nЧувствайте се свободни да използвате този публичен ПГП ключ за шифровано общуване.\n\n > Пълна връзка към ключа: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nХаресвате ли добавката?\n\nДецентралайз е и винаги ще бъде безплатна, но можете да подкрепите разработката ѝ с дарение, с принос в Гитлаб или като разкажете за добавката (което върши чудеса). Всяка помощ ще бъде високо оценена!\n\n • Гитлаб: https://git.synz.io/Synzvato/decentraleyes\n • Даряване: https://decentraleyes.org/donate",
+ "cs": "Webové stránky využívají stále více velké služby pro doručování obsahu. Blokování požadavků stahujících reklamy je obvykle bez následků, ale blokování skutečného obsahu fungování stránek rozbíjí. Cíl tohoto doplňků je odstranit prostředníky s využitím rychle dostupných lokálně uložených souborů pro zvýšení vašeho soukromí.\n\n • Chrání vaše soukromí obcházením velkých sítí pro doručování obsahu, které nabízí \"své služby zdarma\".\n • Doplňuje běžné blokování obsahu jako doporučovaný uBlock Origin, Adblock Plus a další.\n • Funguje bez dalšího nastavování.\n\nPoznámka: Decentraleyes není všespásné řešení, ale zabrání mnoho stránkám v zasílání tohoto druhu požadavků. Pomocí Decentraleyes můžete také blokovat požadavky na všechny zdroje z CND, které nemá lokálně dostupné.\n\n > Jednoduchý úvod: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nJsem nyní chráněn(a)?\n\nNásledující testovací nástroj vám ukáže, zda jste chráněni. Je to doporučovaný a zřejmě nejrychlejší způsob pro ověření, že je doplněk nainstalovaný a správně nastavený.\n\n > Odkaz na testovací nástroj: https://decentraleyes.org/test\n\nNejčastější dotazy\n\n > Odkaz na všechny nejčastější dotazy: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnické informace\n\n- Podporované sítě: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources a UpYun Libraries.\n\n- Vložené zdroje: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js a Web Font Loader.\n\nPodpora\n\nPokud váš dotaz není výše uveden, nebo mne potřebujete z jiného důvodu kontaktovat, můžete mi vždy napsat na decentraleyes@protonmail.com. Uvítám nahlášení jakékoliv chyby nebo nápady na vylepšení a snažím se odpovědět na každý e-mail.\n\nVolně k použití tento veřejný PGP klíč pro šifrovanou komunikaci.\n\n > Odkaz na veřejný PGP klíč: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nLíbí se vám tento doplněk?\n\nDecentraleyes je a vždy bude zdarma, ale můžete podpořit další vývoj finančním příspěvkem nebo svou pomocí na GitLabu. Nebo doporučením doplňku dalším. Každá pomoc je vítána!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Přispějte: https://decentraleyes.org/donate",
+ "da": "Hjemmesider forlader sig i stigende grad på store tredjeparts-leverandører til at levere deres indhold. At annullere anmodninger for reklamer eller sporings-mekanismer sker normalt uden problemer, men at blokere noget af sidens faktiske indhold vil, nok ikke uventet, føre til at siden ikke fungerer. Formålet med denne tilføjelse er at skære mellemmanden ud, ved at levere lokale filer (som er inkluderet i pakken) hvilket både forøger hastigheden på sidevisningen og slører dit online privatliv.\n\n • Beskytter privatlivets fred ved at undgå store indholdsleverandører som påstår at de tilbyder gratis tjenester.\n • Supplerer almindelige blokeringstilføjelser såsom uBlock Origin (anbefales), Adblock Plus osv.\n • Virker lige ud af boksen; behøver overhovedet ingen konfiguration.\n\nBemærk: Decentraleyes er ingen mirakelkur, men den forhindrer at din brug af hjemmesider lægger spor på indholdsleverandørers systemer. For at komme det helt til livs, kan Decentraleyes også fuldstændigt blokere indholdsanmodninger der ikke findes lokalt.\n\n > Simpel introduktion: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nEr jeg beskyttet lige nu?\n\nDe følgende testværktøj viser om du er behørigt beskyttet. Det er den anbefalede og, måske, den hurtigste måde at verificere om tilføjelsen er installeret, aktiveret og konfigureret korrekt.\n\n > Fuldt link til testværktøjet: https://decentraleyes.org/test\n\nOfte Stillede Spørgsmål\n\n > Fuldt link til Ofte Stillede Spørgsmål: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTeknisk Information\n\n- Understøttede indholdsleverandører: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, og UpYun Libraries.\n\n- Medleverede ressourcer: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, og Web Font Loader.\n\nPersonlig Kunderservice\n\nEr dit spørgsmål ikke besvaret ovenfor, eller har du andre grunde til at kontakte mig personligt? Du kan altid kontakte mig på decentraleyes@protonmail.com. Fejlrapporter og forslag er meget velkomne, og jeg besvarer hver eneste mail.\n\nVær velkommen til at bruge denne offentlige PGP-nøgle til krypteret kommunikation.\n\n > Fuldt link til offentlig PGP-nøgle: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nKan du lide denne tilføjelse?\n\nDecentraleyes er, og vil blive ved at være, gratis, men du kan støtte dens fortsatte udvikling ved at donere, ved at bidrage på GitLab eller bare ved at fortælle om den (hvilket også gør underværker). Enhver hjælpe vil blive værdsat!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Giv et bidrag: https://decentraleyes.org/donate",
+ "de": "Heutzutage verwenden Websites zunehmend Fremdbibliotheken zur Darstellung von Inhalten. Das Blockieren von Ads oder Trackern funktioniert in der Regel ohne Probleme. Doch das Blockieren eigentlichen Inhalts führt - nicht gänzlich überraschend - oft zu Problemen. Dieses Add-on vermeidet Anfragen an Dritte, indem es Bibliotheken lokal bereitstellt, um deine Privatsphäre zu schützen.\n\n • Kappt zum Schutze deiner Privatsphäre Verbindungen zu CDNs, die ihre Dienste nur scheinbar kostenlos anbieten.\n • Ergänzt schon installierte Blocker wie uBlock Origin (empfohlen) oder Adblock Plus etc.\n • Vorkonfiguriert und sofort einsatzbereit (kein Neustart notwendig).\n\nHinweis: Decentraleyes ist kein Patentrezept, aber es schützt bei einer Vielzahl von Websiten vor Tracking. Letztlich kannst du Decentraleyes anweisen, Anfragen für nicht anwesende CDN-Dateien zu blockieren.\n\n > Einfachere Beschreibung: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nBin ich aktuell geschützt?\n\nDie folgende Testseite zeigt dir, ob du bereits geschützt bist. Dies ist der empfohlene und wahrscheinlich schnellste Weg, um festzustellen, ob dieses Add-on installiert, aktiviert und ordnungsgemäß konfiguriert ist.\n\n > Kompletter Link zur Testseite: https://decentraleyes.org/test\n\nHäufig gestellte Fragen\n\n > Kompletter Link zu den Fragen: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnische Informationen\n\n- Unterstützte Netzwerke: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources und UpYun Libraries.\n\n- Gebündelte Ressourcen: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js und Web Font Loader.\n\nPersönlicher Support\n\nIst Deine Frage oben nicht aufgeführt oder möchtest Du aus anderen Gründen mit mir persönlich Kontakt aufnehmen? Du erreichst mich immer unter decentraleyes@protonmail.com. Fehlerberichte oder Anregungen sind sehr willkommen. Ich antworte auf jede einzelne E-Mail.\n\nNutze doch diesen öffentlichen PGP-Schlüssel zur verschlüsselten Kommunikation.\n\n > Kompletter Link zu öffentlichem PGP-Schlüssel: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nDir gefällt das Add-on?\n\nDecentraleyes ist kostenlos und wird es immer bleiben. Du kannst die weitere Entwicklung aber durch eine Spende, durch einen Beitrag bei GitLab oder durch deine Weiterempfehlung unterstützen. Ich bin für jede Hilfe dankbar!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Spenden: https://decentraleyes.org/donate",
+ "el": "Οι Ιστότοποι εξταρτώνται όλο και περισσότερο από μεγάλες ενδιάμεσες εταιρίες για διανομή περιεχομένου. Η Ακύρωση αιτήσεων για διαφημίσεις ή ιχνηλάτες γίνεται συνήθως χωρίς πρόβλημα, ωστόσο το μπλοκάρισμα πραγματικού περιεχομένου προφανώς σπάει τις ιστοσελίδες. Ο σκοπός αυτού του πρόσθετου είναι η παράκαμψη του μεσάζοντα, με το να παραδίδει με αστραπιαία ταχύτητα τοπικά (συγκεντρωμένα) αρχεία, για τη βελτίωση της προστασίας των προσωπικών δεδομένων.\n\n • Προστατεύει το απόρρητο του χρήστη παρακάπτωντας τα μεγάλα δίκτυα που ισχυρίζονται ότι προσφέρουν δωρεάν υπηρεσίες.\n • Συμπληρώνει τους συνήθεις αποκλειστές (blockers) όπως τον uBlock Origin (προτείνεται), τον Adblock Plus, κλπ.\n • Λειτουργεί αυτόματα, χωρίς να απαιτείται κάποια παραπάνω ρύθμιση.\n\nΣημείωση: Το Decentraleyes δεν αποτελεί πανάκεια, αλλά αποτρέπει πολλές ιστοσελίδες από το να σας αναγκάζουν να αποστέλετε τέτοιες αιτήσεις. Τέλος, μπορείτε να ρυθμίσετε το Decentraleyes να μπλοκάρει κλήσεις προς τυχόν CDN πόρους που απουσιάζουν.\n\n > Απλή Εισαγωγή: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nΠοιά είναι η τωρινή μου κατάσταση προστασίας;\n\nΗ παρακάτω δοκιμαστική εφαρμογή δείχνει την τρέχουσα κατάσταση προστασίας σας. Αποτελεί τον προτεινόμενο και πιθανώς, τον πιό γρήγορο τρόπο, για να διαπιστώσετε αν το πρόσθετο είναι εγκατεστημένο, ενεργοποιημένο και έχει ρυθμιστεί σωστά.\n\n > Πλήρης σύνδεσμος προς την δοκιμαστική εφαρμογή: https://decentraleyes.org/test\n\nΣυχνές ερωτήσεις\n\n > Πλήρης σύνδεσμος προς τις Συχνές Ερωτήσεις: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nΤεχνικές Πληροφορίες\n\n- Υποστηριζόμενα δίκτυα: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources και UpYun Libraries.\n\n- Συσσωρευμένοι πόροι: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js και Web Font Loader.\n\nΠροσωπική υποστήριξη\n\nΗ Ερώτηση σας δεν αναφέρεται παραπάνω, ή έχετε οποιοδήποτε άλλο λόγο, να επικοινωνήσετε μαζί μου προσωπικά; Μπορείτε πάντα να με βρείτε στο decentraleyes@protonmail.com. Αναφορές σφαλμάτων ή προτάσεις είναι ιδιαίτερα ευπρόσδεκτες και απαντώ σε κάθε e-mail.\n\nΧρησιμοποιείστε ελεύθερα αυτό το δημόσιο κλειδί PGP για κρυπτογραφημένη επικοινωνία.\n\n > Πλήρης σύνδεσμος προς το δημόσιο κλειδί PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nΕίστε ικανοποιημένοι με το πρόσθετο;\n\nΤο Decentraleyes είναι, και πάντα θα είναι, δωρεάν, αλλά μπορείτε να υποστηρίξετε τη συνεχή ανάπτυξή του κάνοντας μια δωρεά, με συμβολή στο GitLab ή με το να συμβάλλετε προσωπικά στη διάδοση του (η οποία κάνει θαύματα). Οποιαδήποτε βοήθεια θα εκτιμηθεί ιδιαίτερα!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Δωρεά: https://decentraleyes.org/donate",
+ "en-GB": "Websites have increasingly begun to rely much more on large third-parties for content delivery. Cancelling requests for ads or trackers is usually without issue, however blocking actual content, not unexpectedly, breaks pages. The aim of this add-on is to cut out the middleman by providing lightning speed delivery of local (bundled) files to improve online privacy.\n\n • Protects privacy by evading large delivery networks that claim to offer free services.\n • Complements regular blockers such as uBlock Origin (recommended), Adblock Plus, et al.\n • Works directly out of the box; absolutely no prior configuration required.\n\nNote: Decentraleyes is no silver bullet, but it does prevent a lot of websites from making you send these kinds of requests. Ultimately, you can make Decentraleyes block requests for any missing CDN resources, too.\n\n > Simpler introduction: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nAm I Currently Protected?\n\nThe following testing utility shows you if you are properly protected. It's the recommended and, probably, fastest way to see if this add-on is installed, enabled, and correctly configured.\n\n > Full link to testing utility: https://decentraleyes.org/test\n\nFrequently Asked Questions\n\n > Full link to FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnical Information\n\n- Supported Networks: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, and UpYun Libraries.\n\n- Bundled Resources: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, and Web Font Loader.\n\nPersonal Support\n\nIs your question not listed above, or do you have any other reason to contact me personally? You can always reach me at decentraleyes@protonmail.com. Bug reports or suggestions are highly welcome and I reply to every single email.\n\nFeel free to use this public PGP key for encrypted communication.\n\n > Full link to public PGP key: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nAre You Enjoying this Add-on?\n\nDecentraleyes is, and will always be, free, but you can support its continued development by making a donation, by contributing on GitLab, or by spreading the word (which does wonders). Any help would be greatly appreciated!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donate: https://decentraleyes.org/donate",
+ "en-US": "Websites have increasingly begun to rely much more on large third-parties for content delivery. Canceling requests for ads or trackers is usually without issue, however blocking actual content, not unexpectedly, breaks pages. The aim of this add-on is to cut out the middleman by providing lightning speed delivery of local (bundled) files to improve online privacy.\n\n • Protects privacy by evading large delivery networks that claim to offer free services.\n • Complements regular blockers such as uBlock Origin (recommended), Adblock Plus, et al.\n • Works directly out of the box; absolutely no prior configuration required.\n\nNote: Decentraleyes is no silver bullet, but it does prevent a lot of websites from making you send these kinds of requests. Ultimately, you can make Decentraleyes block requests for any missing CDN resources, too.\n\n > Simpler introduction: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nAm I Currently Protected?\n\nThe following testing utility shows you if you are properly protected. It's the recommended and, probably, fastest way to see if this add-on is installed, enabled, and correctly configured.\n\n > Full link to testing utility: https://decentraleyes.org/test\n\nFrequently Asked Questions\n\n > Full link to FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnical Information\n\n- Supported Networks: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, and UpYun Libraries.\n\n- Bundled Resources: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, and Web Font Loader.\n\nPersonal Support\n\nIs your question not listed above, or do you have any other reason to contact me personally? You can always reach me at decentraleyes@protonmail.com. Bug reports or suggestions are highly welcome and I reply to every single email.\n\nFeel free to use this public PGP key for encrypted communication.\n\n > Full link to public PGP key: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nAre You Enjoying this Add-on?\n\nDecentraleyes is, and will always be, free, but you can support its continued development by making a donation, by contributing on GitLab, or by spreading the word (which does wonders). Any help would be greatly appreciated!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donate: https://decentraleyes.org/donate",
+ "es": "Los sitios web dependen cada vez más en software de terceros para la entrega de datos. Cancelar una petición de publicidad o de trackers no suele conllevar ningún problema; sin embargo, bloquear contenido implícito distorsiona o daña las paginas. La finalidad de este complemento es eliminar el intermediario entre estas peticiones, para así proporcionar una entrega de archivos locales (empaquetados) a velocidades exorbitantes y mejorar la privacidad en linea.\n\n • Protege la privacidad al evadir una larga red de entrega que dice ofrecer sus servicios gratuitamente.\n • Complementa las aplicaciones de bloqueo regulares tales como uBlock Origin (recomendada), Adblock Plus, y otros.\n • Funciona directamente al ser instalado; Absolutamente ninguna configuración previamente requerida.\n\nNota: Decentraleyes no es una bala de plata, pero sí previene que muchos sitios web envíen este tipo de peticiones. Así también, Decentraleyes puede bloquear peticiones para cualquier recurso CDN que no se pueda encontrar.\n\n > Introducción más simple: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\n¿Estoy protegido en este momento?\n\nLa siguiente utilidad de prueba le muestra si esta apropiadamente protegido. Es la manera recomendada, y probablemente, la más rápida para saber si este complemento esta instalado y configurado correctamente.\n\n > Enlace completo para la utilidad de prueba: https://decentraleyes.org/test\n\nPreguntas frecuentes\n\n > Enlace completo para las preguntas: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformación técnica\n\n- Redes soportadas: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, y UpYun Libraries.\n\n- Paquete de recursos: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, y Web Font Loader.\n\nSoporte individual\n\n¿No encuentra su pregunta arriba, o tiene alguna razón para contactarme personalmente? Puede encontrarme siempre en decentraleyes@protonmail.com. Los reportes de fallas o sugerencias son bienvenidos y respondo a cada email recibido.\n\nSiéntete libre de usar esta llave pública PGP para comunicación encriptada.\n\n > Enlace completo para la llave pública PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\n¿Te gusta este complemento?\n\nDecentraleyes es y será siempre gratis, pero puedes apoyar su continuo desarrollo mediante una donación, contribuyendo en GitLab o corriendo la voz (Lo cual hace maravillas). ¡Cualquier tipo de ayuda será muy apreciada!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donar: https://decentraleyes.org/donate",
+ "et": "Veebilehed on hakanud üha rohkem tuginema sisu edastamiseks kolmandatele osapooltele. Taotluste tühistamine reklaamide või jälgijate puhul ei tekita tavaliselt probleeme, ent tegeliku sisu blokeerimine ilmselgelt lõhub saite. Selle laienduse eesmärk on vältida vahendajat, pakkudes ülikiiret kohalike (köidetud) failide kasutamist, et parandada Internetiprivaatsust.\n\n • Kaitseb privaatsust, vältides suuri sisuedastusvõrke mis väidavad pakkuvat tasuta teenuseid.\n • Täiendab tavalisi blokeerijaid nagu uBlock Origin (soovitatud), Adblock Plus ja teised.\n • Töötab koheselt peale installimist, ei vaja eelnevaid seadistusi.\n\nMärkus: Decentraleyes ei ole kõikvõimas, ent väldib paljude veebisaitide poolt tehtavaid sarnaseid taotlusi sinu brauserile. Lõpptulemusena võid panna Decentraleyes'i ka blokeerima mistahes sisuedastusvõrkude puuduvate ressursside taotlusi.\n\n > Lihtsam tutvustus: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nKas ma olen hetkel kaitstud?\n\nJärgnev testimise tööriist näitab, kas oled korralikult kaitstud. See on soovitatav ja tõenäoliselt kiireim viis teada saamaks, kas see laiendus on installeeritud, lubatud ja korralikult seadistatud.\n\n > Testimistööriista aadress: https://decentraleyes.org/test\n\nKorduma kippuvad küsimused\n\n > KKK aadress: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTehniline info\n\n- Toetatud võrgustikud: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources ja UpYun Libraries.\n\n- Köidetud ressursid: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js ja Web Font Loader.\n\nIsiklik tugi\n\nKas sinu küsimus pole ülalpool välja toodud või on mõni muu põhjus minuga isiklikult kontakteerumiseks? Sa saad mind alati kätte aadressiga decentraleyes@protonmail.com. Veateated või soovitused on väga teretulnud ning ma vastan igale e-kirjale.\n\nVõid vabalt kasutada seda avalikku PGP-võtit krüpteeritud suhtluse jaoks.\n\n > Avaliku PGP-võtme aadress: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nKas sa naudid seda laiendust?\n\nDecentraleyes on ja jääb alati tasuta kättesaadavaks, kuid sa võid toetada jätkuvat arendust, tehes annetuse, kaastööd GitLabis või levitades seda teistele (mis teeb imesid). Igasugune abi oleks väga teretulnud!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Anneta: https://decentraleyes.org/donate",
+ "fi": "Sivustot käyttävät nykyään yhä enemmän isoja kolmannen osapuolen jakeluverkkoja sisällön näyttämiseen. Mainosten ja seurantaevästeiden estäminen ei yleensä aiheuta ongelmia. Varsinaisen sisällön estäminen kuitenkin saattaa yllättäen rikkoa sivustoja. Tämän lisäosan tavoite on poistaa välikäsi ja tarjota salamannopeasti korvaavia paikallisia (mukana toimitettuja) tiedostoja yksityisyyden parantamiseksi.\n\n • Suojaa yksityisyyttä välttämällä isoja jakeluverkkoja jotka väittävät tarjoavansa ilmaisia palveluita.\n • Täydentää muita lisäosia kuten uBlock Origin (suositeltu), Adblock Plus jne.\n • Toimii suoraan asennuksen jälkeen, ilman tarvetta lisäsäädöille.\n\nHuomautus: Decentraleyes ei ratkaise kaikkea, mutta se suojaa monilta nettisivujen tekemiltä sisältöpyynnöiltä. Halutessasi Decentraleyes estää kaikki pyynnöt joille ei ole tarjolla korvaavaa sisältöä.\n\n > Yksinkertainen esittely: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nOlenko tällä hetkellä suojattu?\n\nSeuraava testisivu kertoo oletko asianmukaisesti suojattu. Se on suositeltu ja luultavasti nopein tapa nähdä toimiiko Decentraleyes oikein.\n\n > Linkki testisivulle: https://decentraleyes.org/test\n\nUsein Kysytyt Kysymykset\n\n > Linkki UKK: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTekniset tiedot\n\n- Tuetut jakeluverkot: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources ja UpYun Libraries.\n\n- Käytetyt resurssit: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js ja Web Font Loader.\n\nHenkilökohtainen tuki\n\nHaluatko kysyä jotain muuta tai onko sinulla tarve ottaa minuun yhteyttä henkilökohtaisesti? Minuun saa yhteyden decentraleyes@protonmail.com. Virheraportit ja ehdotukset ovat erittäin tervetulleita. Vastaan jokaiseen viestiin.\n\nVoit käyttää halutessasi tätä julkista PGP avainta suojattuun yhteydenpitoon.\n\n > Linkki julkiseen PGP avaimeen: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nPidätkö tästä lisäosasta?\n\nDecentraleyes on ja tulee aina olemaan ilmainen, mutta voit tukea sen kehitystä tekemällä lahjoituksen GitLabin kautta tai levittämällä sanaa (joka tekee ihmeitä). Kaikki apu on erittäin tervetullutta!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Tee lahjoitus: https://decentraleyes.org/donate",
+ "fr": "Les sites web dépendent de plus en plus de bibliothèques tierces pour proposer du contenu. En général, annuler les requêtes pour les publicités ou traqueurs ne pose pas de problèmes. Cependant, bloquer le véritable contenu casse évidemment les pages. L'objectif de cet add-on est de supprimer l'intermédiaire en proposant à la vitesse de l'éclair la livraison de fichiers (regroupés) en local afin d'améliorer la protection des données personnelles en ligne.\n\n • Protège la confidentialité en contournant les diffuseurs de contenus prétendant offrir des services gratuits.\n • Complète les bloqueurs connus tels que uBlock origin (recommandé), Adblock Plus et autres.\n • Fonctionne directement tel quel ne nécessitant aucune configuration préalable.\n\nRemarque: Decentraleyes n'est pas une panacée mais il empêche de nombreux sites de vous contraindre à l'envoi de telles requêtes. Il est possible aussi d'indiquer à Decentraleyes de bloquer les requêtes manquantes.\n\n > Présentation plus simple: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nSuis-je actuellement protégé ?\n\nUn vérificateur indique si vous êtes correctement protégé. C'est la méthode conseillée et la plus rapide pour savoir si l'add-on est installé, activé et correctement configuré.\n\n > Lien vers ce vérificateur: https://decentraleyes.org/test\n\nQuestions fréquemment posées\n\n > Lien vers toutes les questions: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformations techniques\n\n- Réseaux pris en charge: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, et UpYun Libraries.\n\n- Ressources approvisionnées: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, et Web Font Loader.\n\nSupport personnalisé\n\nAvez-vous une autre question, ou une autre raison pour vouloir me contacter personnellement ? Je suis toujours joignable à decentraleyes@protonmail.com. Signaler un bug ainsi que toute suggestion sont bienvenus, je réponds à tout e-mail.\n\nN'hésitez pas à employer cette clé publique PGP pour une communication chiffrée.\n\n > Adresse de la clé publique PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nCet add-on vous plaît-il ?\n\nDecentraleyes est, sera toujours gratuit, mais vous pouvez soutenir son développement continu via une donation, une contribution sur GitLab, ou en faisant passer le mot (qui fait des merveilles). Toute aide serait grandement appréciée !\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Faire un don: https://decentraleyes.org/donate",
+ "he": "אתרי אינטרנט החלו יותר ויותר להסתמך על צד שלישי עבור העברת התוכן (CDN). בדרך כלל, חסימת בקשות של האתר לפרסומות או טראקרים (שעוקבים אחרי פעילותיך ברשת) לא מהוות בעיה. חסימת תוכן אתר, באופן לא מפתיע, יכולה להפריע בהצגת האתר. מטרת ה-add on הזה היא חתיכת \"המתווך\" - ה-CDN - דרך שליחת קבצים מקומיים, במקום שליחתם דרך ה CDN. כך Decentraleyes מגביר בצורה משמעותית את זמן הטעינה של אתרים, ומשפר את פרטיותך ברשת.\n\n • ההרחבה מגינה על פרטיותך על ידי עקיפת רשתות העברות-תוכן גדולת (CDN) המספקות את התכנים לאתר בחינם.\n • היא תואמת לחלוטין ומשלימה חסמי-פרסומות נפוצים כמו uBlock Origin (מומלץ), Adblock Plus, וכו'.\n • ההרחבה הזאת עובדת ישר - אין צורך כלשהו בהתאמה או שינוי תצורה מוקדמים.\n\nשים לב: Decentraleyes היא לא תוכנת קסמים, אבל היא תמנע מהרבה אתרים לשלוח בקשות כאלו בשמך. Decentraleyes מאפשר לך לחסום בקשות גם לתכני CDN שהאתר בו אתה מבקר לא מוצא.\n\n > היכרות מהירה עם התוספת: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nהאם Decentraleyes מגנת עלי כרגע?\n\nהבא תכנת מבחן מראה אם Decentraleyes מגנת עליך. הדרך המומלצת וכנראה גם המהירה ביותר לראות עם ה-add on הזה מותקן, מופעל, ומוגדר בצורה נכונה.\n\n > קישור לתכנת המבחן: https://decentraleyes.org/test\n\nשאלות נפוצות\n\n > קישור לשאלות ותשובות נפוצות: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nמידע טכני\n\n- רשתות העברת-תוכן בהן התוספת תומכת: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, ו UpYun Libraries.\n\n- ספריות שמגיעות עם התוספת: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, ו Web Font Loader.\n\nתמיכת משתמש-קצה\n\nאם יש לך שאלה שלא כלולה כאן, או אם תרצה ליצור קשר עם מפתח התוספת באופן ישיר, אנא צור קשר ב decentraleyes@protonmail.com. דיווחים על שגיאות בתוספת או הצות לשיפור תמיד מתקבלות בברכה. מפתח התוספת בדרך כלל עונה על כל מייל באופן ישיר.\n\nאנא צרו קשר ב מפתח ה- הציבורי הוא ליצירת קשר בתקשורת מוצפנת.\n\n > מפתח ה-PGP הציבורי של מפתח התוספת: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nהאם התוספת משמעותית לך?\n\nDecentraleyes היא חינמית, ותשאר חינמית לעד. אפשר לעזור בשיפור ובתמיכת התוספת על ידי תרומה, שיפור הקוד דרך GitLab, או פשוט בלספר לארחים על התוספת הזאת (דרך מעולה לעזור). אני מעריך מאוד כל סוג של עזרה!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • לתרום: https://decentraleyes.org/donate",
+ "hu": "Egyre inkább elterjed, hogy a weboldalak harmadik fél által üzemeltetett tartalomszolgáltató szerverekre támaszkodnak. A hirdetések és trackerek kérelmeinek elutasítása általában hibátlanul működik, azonban nem meglepő, hogy konkrét tartalmak blokkolása után hibásan működnek a weblapok. Ennek a kiegészítőnek a célja, hogy helyi (csomagolt) fájlok gyors beszúrásával megkerüljük a harmadik feleket, ezzel elősegítve az internetes adatvédelmet.\n\n • A nagy és ingyenes tartalomszolgáltató hálózatok megkerülésével megvédi az adataidat.\n • Jól kiegészíti a hagyományos blokkolókat, mint például a uBlock Origin (ajánlott), Adblock Plus, stb.\n • Telepítés után azonnal működőképes, nem igényel külön beállítást.\n\nMegjegyzés: A Decentraleyes nem csodafegyver, azonban még így is sok weblapot megakadályoz abban, hogy kérelmeket küldjön. A Decentraleyes segítségével a hiányzó tartalmakra irányuló kéréseket is elutasíthatod.\n\n > Egyszerű leírás: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nVédve vagyok?\n\nA következő tesztelő eszköz segítségével megtudhatod, hogy védve vagy-e. Ez az ajánlott, és talán a leggyorsabb módja annak, hogy megbizonyosodj arról, hogy a kiegészítő telepítve van, engedélyezted és rendesen be van állítva.\n\n > Teljes link a tesztelő szolgáltatáshoz: https://decentraleyes.org/test\n\nGyakran Ismételt Kérdések\n\n > Teljes linka GyIK-hez: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnikai Információk\n\n- Támogatott hálózatok: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources és UpYun Libraries.\n\n- Csomagolt könyvtárak: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, és Web Font Loader.\n\nSzemélyes Segítség\n\nA kérdésed nem lett megválaszolva, vagy más okból szeretnéd személyesen felvenni a kapcsolatot velem? Itt bármikor elérhetsz decentraleyes@protonmail.com. Hibajelentéseket vagy ajánlásokat nagyon várjuk, és minden e-mailra válaszolok.\n\nNyugodtan használd ezt a PGP kulcsot a titkosított kommunikációhoz.\n\n > Link a publikus PGP kulcshoz: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nTetszik ez a kiegészítő?\n\nA Decentraleyes, akár most a jelenben, a jövőben is ingyenes lesz, azonban támogathatod a fejlesztést Bitcoinnal, GitLabon, vagy azzal, hogy mások körében népszerűsíted (ami csodákra képes). Minden segítségért hálásak vagyunk!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Adományozás: https://decentraleyes.org/donate",
+ "id": "Situs web semakin mengandalkan layanan pihak ketiga untuk pengiriman konten. Membatalkan permintaan untuk iklan atau pelacak biasanya tanpa masalah, namun memblokir konten yang sebenarnya, sengaja atau tidak, membuat halaman situs rusak. Tujuan dari pengaya ini adalah untuk menghilangkan perantara dengan menyediakan pengiriman berkas (paket) super cepat secara lokal untuk meningkatkan privasi daring.\n\n • Melindungi privasi dengan menghindari jaringan distribusi pihak ketiga yang mengklaim menyediakan layanan gratis.\n • Pelengkap pemblokir iklan umum seperti uBlock Origin (disarankan), Adblock Plus, dsb.\n • Bekerja secara instan; tidak perlu lagi menyetel konfigurasi.\n\nCatatan: Decentraleyes bukan segalanya, tetapi Decentraleyes benar-benar mencegah Anda mengirimkan permintaan semacam ini ke banyak situs. Pada akhirnya, Anda juga bisa membuat Decentraleyes memblokir permintaan untuk semua sumber daya CDN yang hilang.\n\n > Introduksi singkat: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nApakah Saat Ini Saya Dilindungi?\n\nBerikut ini utilitas uji coba menunjukkan kepada Anda jika Anda benar-benar dilindungi. Hal tersebut disarankan dan, mungkin, cara paling cepat untuk mengetahui jika pengaya ini terpasang, diaktifkan dan dikonfigurasikan dengan benar.\n\n > Tautan penuh ke utilitas uji coba: https://decentraleyes.org/test\n\nPertanyaan yang Sering Ditanyakan\n\n > Tautan penuh ke FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformasi Teknis\n\n- Jaringan yang Didukung: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, dan UpYun Libraries.\n\n- Paket Sumber Daya: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, dan Web Font Loader.\n\nDukungan Personal\n\nApakah pertanyaan Anda tidak tercantum di atas, atau apakah Anda memiliki alasan lain untuk menghubungi secara personal? Anda selalu bisa menghubungi saya di decentraleyes@protonmail.com. Pelaporan bug atau saran sangat diharapkan dan Saya akan balas semua surel yang Saya terima.\n\nJangan ragu untuk menggunakan kunci publik PGP ini untuk komunikasi terenkripsi.\n\n > Tautan penuh ke kunci PGP publik: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nApakah Anda Menyukai Pengaya ini?\n\nDecentraleyes tetap, dan akan selalu gratis, tetapi Anda bisa mendukung pengembangan yang lebih lanjut dengan donasi, kontribusi di GitLab, atau dengan menyebarkan-luaskannya. Bantuan apapun akan sangat Saya hargai!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donasi: https://decentraleyes.org/donate",
+ "it": "I siti web hanno cominciato ad affidarsi sempre più su grandi terze parti per la distribuzione dei contenuti. Annullare le richieste da parte di annunci o tracciatori di solito non ha conseguenze, tuttavia bloccare il contenuto effettivo, come si può immaginare, interrompe le pagine. Lo scopo di questo componente aggiuntivo è di estromettere l'intermediario fornendo una distribuzione fulminea di file locali (in dotazione) per migliorare la privacy online.\n\n • Protegge la privacy eludendo le grandi CDN che pretendono di offrire servizi gratuiti.\n • Integra i normali bloccanti come uBlock Origin (consigliato), Adblock Plus, e altri.\n • Direttamente pronto all'uso; non è assolutamente richiesta alcuna configurazione iniziale.\n\nNota: Decentraleyes non è una soluzione miracolosa, ma impedisce ad un sacco di siti Web di inviare questi tipi di richieste. In definitiva, si possono anche bloccare tramite Decentraleyes le richieste per le risorse CDN mancanti.\n\n > Introduzione semplificata: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nSono attualmente protetto?\n\nLa seguente utilità di test consente di visualizzare se si è adeguatamente protetti. È il modo raccomandato e, probabilmente, più veloce per vedere se questo componente aggiuntivo è installato, abilitato e configurato correttamente.\n\n > Link completo utilità di test: https://decentraleyes.org/test\n\nDomande e risposte frequenti\n\n > Link completo alla FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformazioni tecniche\n\n- Reti supportate: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, risorse pubbliche Sina e librerie di UpYun.\n\n- Risorse in dotazione: AngularJS, Backbone. js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js e Web Font Loader.\n\nSupporto personale\n\nLa propria domanda non è elencata sopra, o c'è qualsiasi altra ragione per contattarmi personalmente? Posso essere sempre contattato tramite decentraleyes@protonmail.com. Le segnalazioni di bug o i suggerimenti sono davvero benvenuti e rispondo a ogni singola email.\n\nSentitevi liberi di usare questa chiave PGP pubblica per le comunicazioni crittografate.\n\n > Link completo alla chiave PGP pubblica: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nVi piace questo componente aggiuntivo?\n\nDecentraleyes è, e sarà sempre, libero, ma si può supportare il suo continuo sviluppo con una donazione, contribuendo su GitLab o col passa parola (che fa miracoli). Qualsiasi aiuto sarebbe molto apprezzato!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Fai una donazione: https://decentraleyes.org/donate",
+ "ja": "最近のウェブサイトはコンテンツ配信のため、大規模なサードパーティにいっそう依存しつつあります。多くの場合、広告や追跡のリクエストを無効にしても問題にはなりません。しかし、本当に見たい内容やページが見られなくなることがあります。このアドオンは、オンラインプライバシーをより保護するために、サードパーティー製ライブラリをアドオン内のローカルファイルからすばやく取得することで、サードパーティへのリクエストを行わないようにします。\n\n • 無料のサービスを提供すると主張する大規模CDNを回避することで、プライバシーを保護します。\n • uBlock Origin(推奨)やAdblock Plusなどの一般的な広告ブロッカーを補助します。\n • インストールするだけですぐに使えます。何かを設定する必要はありません。\n\n※Decentraleyesは万全のプライバシー保護対策ではありません。多くのウェブサイトがあなたに様々なリクエストを送らせようとするのをブロックするだけです。Decentraleyesにリソースが含まれないすべてのCDNをブロックするように設定することもできます。\n\n > 簡単な紹介はこちらをご覧ください:https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\n保護の状態を確認する方法\n\n以下の確認ページでは、あなたが正しく保護されているかを確認できます。これは、アドオンがインストールされ有効であり、正しく設定されていることを確認するのに最速と思われる、おすすめの方法です。\n\n > 確認ページへのリンク:https://decentraleyes.org/test\n\nよくある質問\n\n > FAQへのリンク:https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\n技術的な情報\n\n- 対応しているネットワーク:Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, UpYun Libraries\n\n- バンドルされているリソース:AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, Web Font Loader\n\nサポート\n\n上のリストに質問したい事項がない場合、または直接連絡をとりたい場合、いつでもへメールしてくださいdecentraleyes@protonmail.com。バグ報告や提案はいつでも歓迎いたします。また、あらゆるメールに返信いたします。\n\n暗号化通信には、こちらのPGP公開鍵をお使いください。\n\n > PGP公開鍵へのリンク:https://decentraleyes.org/3f774aff6d/public-key.txt\n\n支援する方法\n\nDecentraleyesは将来にわたって常に無料です。あなたはンによる寄付やGitLabでの貢献のほか、驚くべきことにDecentraleyesという言葉を広めるだけでも開発を支援できます。どのようなご支援にも感謝いたします。\n\n • GitLab:https://git.synz.io/Synzvato/decentraleyes\n • 寄付:https://decentraleyes.org/donate",
+ "ko": "최근의 웹 사이트는 리소스 전송을 위해 CDN 등의 서버를 사용하는 경우가 많습니다. 대부분의 경우 광고나 추적 요청을 차단해도 큰 문제는 없습니다. 하지만 종종 광고를 차단하려다가 정상적인 컨텐츠까지 차단하는 경우도 있습니다. 이 애드온의 목표는 프라이버시 보호입니다. CDN에 요청할 리소스를 미리 로컬에 가지고 있음으로써 불필요한 리퀘스트와 그로 인한 프라이버시 유출을 차단합니다.\n\n • CDN과의 불필요한 통신을 피함으로써 개인 정보를 보호합니다.\n • uBlock Origin (추천) 이나 Adblock Plus 와 같은 광고 차단기를 보조합니다.\n • 설치한 순간부터 곧바로 작동합니다. 별도의 설정이 필요하지 않습니다.\n\n참고:Decentraleyes는 프라이버시를 완전히 지켜주는 보안 프로그램이 아닙니다. 여러 웹사이트로 보내는 리소스 요청을 차단할 뿐입니다. Decentraleyes에 포함되지 않는 모든 CDN을 차단하도록 설정할 수도 있습니다.\n\n > 간단한 소개는 여기에 있습니다:https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\n보호 상태를 확인하는 방법\n\n다음 테스트 페이지는 당신이 보호받고 있는지 보여줍니다. 테스트 페이지를 통해 가장 빠르고 정확하게 Decentraleyes의 작동 상태를 확인할 수 있습니다.\n\n > 테스트 페이지의 주소:https://decentraleyes.org/test\n\n자주 묻는 질문\n\n > 자주 묻는 질문과 답변:https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\n기술 정보\n\n- 지원하는 네트워크:Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources 및 UpYun Libraries.\n\n- 지원하는 리소스:AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js 및 Web Font Loader.\n\n도움이 필요하신가요?\n\n알고싶은 사항이 위 목록에 없거나, 직접 연락을 하고싶다면 언제든지 decentraleyes@protonmail.com. 로 메일을 보내주세요. 버그 리포트나 기능 제안 등은 언제든지 환영합니다. 보내주신 메일에는 꼭 답하겠습니다.\n\n암호화 통신을 원하신다면 이 PGP 공개 키 를 사용해 주세요.\n\n > PGP 공개 키:https://decentraleyes.org/3f774aff6d/public-key.txt\n\nDecentraleyes에 만족하고 계신가요?\n\nDecentraleyes는 앞으로도 무료로 제공됩니다. 하지만 당신이 원하신다면 기부하거나, GitLab 소스 코드에 기여하거나, Decentraleyes를 널리 알림으로써 도움을 주실 수 있습니다. 어떤 도움도 감사드립니다.\n\n • GitLab:https://git.synz.io/Synzvato/decentraleyes\n • 기부하기:https://decentraleyes.org/donate",
+ "nb-NO": "Nettsteder har i økende grad begynt å avhenge mye mer på store tredjeparter for å levere innhold. Å avbryte forespørsler for reklamer eller sporer går vanligvis problemfritt, men å blokkere faktisk innhold, vil til ingens overraskelse rote til sider. Målet til dette tillegget er å dytte ut mellommannen ved å lynraskt levere lokale (inkluderte) filer for å forbedre internettprivatlivet ditt.\n\n • Beskytter privatlivet ved å unngå store leveringsnettverk som påstår at de yter gratis tjenester.\n • Komplementerer ordinære blokkerere som uBlock Origin (anbefalt), Adblock Plus, osv.\n • Fungerer rett ut av boksen; absolutt ingen forhåndsoppsetting er nødvendig.\n\nBemerk at Decentraleyes ikke er noen sølvkule, men det hindrer mange nettsteder fra å sende deg disse typene forespørsler. Alt i alt kan du få Decentraleyes til å blokkere forespørsler for enhver manglende CDN-ressurs i tillegg.\n\n > En enklere introduksjon: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nEr jeg beskyttet for øyeblikket?\n\nDet følgende testverktøyet viser deg om du er beskyttet for øyeblikket. Det er den anbefalte og (sannsynligvis) raskeste måte å se om dette tillegget er installert, skrudd på, or satt opp riktig.\n\n > Den fulle lenken til testverktøyet: https://decentraleyes.org/test\n\nOfte stilte spørsmål\n\n > Den fulle lenken til FAQen: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTeknisk informasjon\n\n- Støttede nettverk: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, og UpYun Libraries.\n\n- Inkluderte ressurser: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, og Web Font Loader.\n\nPersonlig brukerstøtte\n\nEr spørsmålet ditt ikke listet opp ovenfor, eller har du en annen grunn til å kontakte meg personlig? Du kan alltids få tak i meg på decentraleyes@protonmail.com. Feilrapportering eller forslag er høyst velkomne, og jeg svarer på hver eneste E-post.\n\nDu er velkommen til å bruke denne offentlige PGP-nøkkelen for å kryptere informasjonen.\n\n > Den fulle lenken til den offentlige PGP-nøkkelen: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nLiker du dette tillegget?\n\nDecentraleyes er, og vil alltid være, gratis, men du kan støtte dens fortsettende utvikling ved å gjøre en donasjon, ved å bidra på GitLab, eller ved å spre ordet (Noe som gjør underverker). Enhver hjelp ville blitt høyst verdsatt!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Doner: https://decentraleyes.org/donate",
+ "nl": "Websites halen afhankelijkheden steeds vaker bij grote derde partijen op. Het afwijzen van reclame of trackers zorgt vaak niet voor problemen, maar het blokkeren van essentiële inhoud maakt pagina's, logischerwijs, onbruikbaar. Deze add-on probeert de partijen te omzeilen door razendsnel (gebundelde) lokale bestanden af te leveren om zo je privacy te verbeteren.\n\n • Beschermt je privacy door grote, naar eigen zeggen gratis, afleveringsnetwerken te omzeilen.\n • Bedoeld als aanvulling op reguliere blockers als uBlock Origin (aanbevolen), Adblock Plus, etc.\n • Werkt direct na installatie; de add-on hoeft niet handmatig geconfigureerd te worden.\n\nOpmerking: Decentraleyes is geen wondermiddel, maar weerhoudt wel een groot aantal websites van het versturen van dit soort verzoeken. Je kunt Decentraleyes ook verzoeken voor ontbrekende CDN-bestanden laten blokkeren.\n\n > Eenvoudigere uitleg: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nBen ik momenteel beschermd?\n\nHet volgende testhulpmiddel laat je zien of je goed beschermd bent. Het is de aanbevolen en, waarschijnlijk, snelste manier om te zien of deze add-on geïnstalleerd, ingeschakeld, en correct geconfigureerd is.\n\n > Volledige link naar testhulpmiddel: https://decentraleyes.org/test\n\nVeelgestelde vragen\n\n > Volledige link naar vragen: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTechnische informatie\n\n- Ondersteunde netwerken: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, en UpYun Libraries.\n\n- Gebundelde pakketten: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, en Web Font Loader.\n\nPersoonlijke ondersteuning\n\nStaat je vraag niet in bovenstaande lijst, of wil je om een andere reden contact met me opnemen? Je kunt me altijd bereiken op decentraleyes@protonmail.com. Bugrapporten of suggesties zijn zeer welkom en ik beantwoord iedere e-mail.\n\nGebruik gerust deze publieke PGP-sleutel voor versleutelde communicatie.\n\n > Volledige link naar publieke PGP-sleutel: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nBen je blij met deze add-on?\n\nDecentraleyes is gratis, en dat blijft zo, maar je kunt het ontwikkelproces ondersteunen met behulp van een donatie, een bijdrage op GitLab, of mond-tot-mondreclame (doet wonderen). Je eventuele bijdrage wordt zeer op prijs gesteld!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Doneren: https://decentraleyes.org/donate",
+ "pl": "Strony internetowe coraz bardziej polegają na dużych firmach trzecich w kwestii dostarczania zawartości. Anulowanie zapytań o reklamy czy trackery zazwyczaj nie powoduje problemów, jednak blokowanie właściwej zawartości - co nie powinno dziwić - psuje strony. Celem tego dodatku jest pozbycie się pośredników poprzez szybkie dostarczanie zasobów z lokalnych plików aby poprawić prywatność.\n\n • Chroni prywatność dzięki unikaniu dużych sieci dostarczania, które twierdzą, że dostarczają darmowe usługi.\n • Uzupełnia klasyczne blokery takie jak uBlock Origin (rekomendowany), Adblock Plus itp.\n • Po prostu działa; nie wymaga żadnej konfiguracji.\n\nPamiętaj: Decentraleyes nie idealnym rozwiązaniem, ale zapobiega wysyłaniu zapytań do CDNów przez wiele stron. Możesz tak ustawić Decentraleyes, że będzie blokować nawet zapytania o brakujące zasoby z CDN.\n\n > Prostsze wprowadzenie: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nCzy teraz moja prywatność jest chroniona?\n\nTo narzędzie pokazuje czy twoja prywatność jest chroniona. Jest to rekomendowany i, prowdopodobnie, najszybszy sposób na sprawdzenie czy Decentraleyes jest zainstalowane, włączone i poprawnie skonfigurowane.\n\n > Adres narzędzia sprawdzającego: https://decentraleyes.org/test\n\nCzęsto Zadawane Pytania\n\n > Pełen adres do FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformacje techniczne\n\n- Obsługiwane sieci: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, i UpYun Libraries.\n\n- Dołączone zasoby: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, i Web Font Loader.\n\nWsparcie osobiste\n\nOdpowiedź na twoje pytanie nie została zamieszczona powyżej, lub masz jakiś inny powód żeby skontaktować się ze mną? Zawsze możesz do mnie napisać na decentraleyes@protonmail.com. Zgłoszenia błędów lub sugestie (w języku Angielskim) są mile widziane; odpowiadam na każdy email.\n\nNie krępuj się użyć tego klucza publicznego PGP do nawiązania szyfrowanej komunikacji.\n\n > Pełen adres klucza publicznego PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nPrzydał ci się ten dodatek?\n\nDecentraleyes jest - i zawsze będzie - darmowe, ale możesz wesprzeć jego rozwój poprzez drobne wpłaty, wysyłając kod na GitLab, lub mówiąc o nim swoim znajomym (to działa!). Każda pomoc jest cenna!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Przekaż datek: https://decentraleyes.org/donate",
+ "pt-BR": "Páginas da web começaram a depender muito de grandes serviços terceirizados (chamados CDNs) para disponibilizar conteúdo. Cancelar requisições de propaganda ou rastreadores normalmente não causam problemas, porém bloquear o conteúdo verdadeiro acaba por quebrar a visualização da página. O objetivo deste complemento é evitar a participação de terceiros disponibilizando arquivos locais (embutidos no complemento) que carregam muito mais rápido e melhoram a privacidade online.\n\n • Protege sua privacidade ao evitar grandes redes de distribuição de conteúdo que dizem prestar serviços gratuitos.\n • Complementa bloqueadores de conteúdo conhecidos como o uBlock Origin (recomendado), Adblock Plus, etc.\n • Funciona logo após a instalação, nenhuma pré-configuração é necessária.\n\nNota: O Decentraleyes não resolve tudo, mas previne que muitas páginas da web façam requisições que comprometem sua privacidade. Você também pode fazer com que o Decentraleyes bloqueie requisições em busca de recursos faltosos.\n\n > Introdução simplificada: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nEstou Atualmente Protegido?\n\nO seguinte utilitário de teste mostra se você está propriamente protegido. Ele é o método recomendado e provavelmente o mais rápido de verificar se o complemente foi instalado, habilitado e está configurado corretamente.\n\n > Link completo do utilitário de teste: https://decentraleyes.org/test\n\nPerguntas Frequentes\n\n > Link completo para as Perguntas Frequentes: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformações Técnicas\n\n- Redes Suportadas: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources e UpYun Libraries.\n\n- Recursos Embutidos: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js e Web Font Loader.\n\nSuporte Pessoal\n\nSua questão não está listada acima ou você tem outra razão para entrar em contato comigo pessoalmente? Você sempre pode me contactar em decentraleyes@protonmail.com. Relatos de bugs ou sugestões são sempre muito bem vindas e eu respondo a cada um dos e-mails que recebo.\n\nFique à vontade para usar esta chave PGP pública para comunicação encriptada.\n\n > Link completo para a chave PGP pública: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nVocê Gostou Deste Complemento?\n\nO Decentraleyes é e sempre será gratuito, mas você pode ajudar na continuidade do desenvolvimento fazendo uma doação, contribuindo no GitLab ou compartilhando com seus amigos (isso ajuda muito). Qualquer ajuda é muito bem vinda!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Doar: https://decentraleyes.org/donate",
+ "pt-PT": "Os websites começaram cada vez mais a depender de grandes terceiros para entregar conteúdo. Cancelar pedidos para anúncios ou trackers geralmente não tem problema, no entanto, ao bloquear conteúdo real, não inesperadamente, quebra páginas. O objetivo deste extra é cortar o intermediário ao fornecer entrega de ficheiros (empacotados) locais à velocidade da luz para melhorar a privacidade online.\n\n • Protege a privacidade ao evitar grandes redes de entrega que dizem oferecer serviços gratuitos.\n • Complementa bloqueadores regulares como o uBlock Origin (recomendado), Adblock Plus, et al.\n • Funciona diretamente fora da caixa; absolutamente nenhuma configuração prévia necessária.\n\nNota: O Decentraleyes não é nenhuma bala de prata, mas impede muitos sites de lhe fazer enviar estes tipos de pedidos. Por fim, também pode fazer com que o Decentraleyes bloqueie pedidos para quaisquer recursos CDN em falta.\n\n > Introdução mais simples: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nEstou atualmente protegido?\n\nO seguinte utilitário de teste mostra-lhe se está adequadamente protegido. É recomendado e, provavelmente, a maneira mais rápida de ver se este extra está instalado, ativado, e corretamente configurado.\n\n > Ligação completa para o utilitário de teste: https://decentraleyes.org/test\n\nPerguntas Frequentemente Colocadas\n\n > Pełen adres do FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformações técnicas\n\n- Redes suportadas: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, e UpYun Libraries.\n\n- Recursos empacotados: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, e Web Font Loader.\n\nSuporte pessoal\n\nA sua pergunta não está listada acima, ou tem outra razão para me contactar pessoalmente? Pode sempre contactar-me em decentraleyes@protonmail.com. Relatórios de bugs ou sugestões são muito bem-vindos e eu respondo a todos os emails.\n\nSinta-se livre para utilizar esta chave pública PGP para comunicação encriptada.\n\n > Ligação completa para a chave pública PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nEstá a desfrutar deste extra?\n\nO Decentraleyes é, e sempre vai ser, gratuito, mas pode apoiar o seu desenvolvimento contínuo fazendo uma doação, contribuindo no GitLab ou espalhando a palavra (que faz maravilhas). Qualquer ajuda seria muito apreciada!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Doar: https://decentraleyes.org/donate",
+ "ro": "Sit-urile de internet au început să se bazeze tot mai mult pe terți pentru a furniza conținut. Anularea cererilor pentru reclame sau a trackere-lor (urmăritoarelor), se face de obicei fără probleme, dar blocarea conținutului real, nu în mod neașteptat, strică paginile. Scopul acestei extensii este să elimine intermediarul furnizând o livrare cu viteza fulgerului a fișiere locale (pachetelor de fișiere locale) pentru a îmbunătăți confidențialitatea online.\n\n • Protejează confidențialitatea prin ocolirea rețelelor de furnizori mari, care pretind să ofere servicii gratuite.\n • Completează extensiile clasice de blocare precum uBlock Origin (recomandat), Adblock Plus, și altele.\n • Funcționează scos direct din cutie; nu necesită absolut nici o configurare înainte de utilizare.\n\nNotă: Decentraleyes nu este o apărare impenetrabilă, dar împiedică o mulţime de site-uri web să te facă să trimiți aceste feluri de cereri. În cele din urmă, îl poți face pe Decentraleyes să blocheze de asemenea și cereri pentru orice resurse CDN lipsă.\n\n > O introducere mai simplă: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nSunt eu protejat în acest moment?\n\nUrmătorul utilitar pentru testare îți va arăta dacă ești protejat în mod corespunzător. Este calea recomandată și, probabil, cea mai rapidă ca să vezi dacă această extensie este instalată, activă și corect configurată.\n\n > Link-ul complet către utilitarul de testare: https://decentraleyes.org/test\n\nÎntrebări frecvente\n\n > Link-ul complet către întrebări frecvente: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nInformaţii tehnice\n\n- Rețele în care oferă suport: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, și UpYun Libraries.\n\n- Pachete de resurse: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, și Web Font Loader.\n\nSuport Personal\n\nÎntrebarea ta nu este în lista de mai sus, sau ai vreun alt motiv să mă contactezi personal? Poți întotdeauna să dai de mine la decentraleyes@protonmail.com. Raportările de erori sau sugestii sunt foarte apreciate și răspund la fiecare e-mail primit.\n\nSimte-te liber să utilizezi această cheie publică PGP pentru comunicare criptată.\n\n > Link-ul complet spre cheia PGP publică: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nVă place această extensie?\n\nDecentraleyes este, şi va fi întotdeauna, gratuit, dar, puteţi sprijini continuarea dezvoltării sale făcând o donaţie, contribuind pe GitLab, sau răspândind vestea (ceea ce face minuni). Orice ajutor va fi apreciat foarte mult!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donează: https://decentraleyes.org/donate",
+ "ru": "Всё чаще веб-сайты стали очень сильно полагаться на крупные «третьесторонние» сервисы доставки контента. Отмена запросов для баннеров, рекламы или трекеров обычно не имеет последствий в нормальной работе сайта, в то время, как блокирование реального содержимого (включая таблицы стилей и скрипты), ожидаемо, «ломает» отображение страницы. Цель этого дополнения — исключение «посредников» с помощью предоставления локальных ресурсов для повышения конфиденциальности в Интернете.\n\n • Защищает Вашу конфиденциальность с помощью уклонения от крупных сетей доставки контента, которые утверждают, что предлагают бесплатные услуги (при этом отслеживая Вас и составляя Ваш психопрофиль).\n • Дополняет регулярные блокировщики контента, как uBlock Origin (рекомендуется), Adblock Plus, и др.\n • Работает прямо из коробки; абсолютно не требуется предварительной конфигурации.\n\nПримечание: Decentraleyes не панацея, но мешает многим сайтам заставить вас послать подобные запросы (по которым Вас можно отслеживать). В конечном счёте, Вы можете настроить Decentraleyes на блокировку запросов в том числе и отсутствующих локально ресурсов с CDN.\n\n > Введение: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nЧто с моей защитой?\n\nСледующая утилита покажет Вам, должным ли образом Вы защищены. Это рекомендуемый и, вероятно, самый быстрый способ узнать, установлено ли это дополнение, включено ли, и правильно ли настроено.\n\n > Полная ссылка для тестирования: https://decentraleyes.org/test\n\nЧасто Задаваемые Вопросы\n\n > Полная ссылка на FAQ: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nТехническая информация\n\n- Поддерживаемые сети: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Яндекс CDN, Baidu CDN, Sina Public Resources, и UpYun Libraries.\n\n- Ресурсы в «коробке»: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js, и загрузчик веб-шрифтов.\n\nПерсональная поддержка\n\nВаш вопрос не перечислен выше, или же у Вас есть любые другие причины, чтобы связаться со мной лично? Вы всегда можете связаться со мной по адресу decentraleyes@protonmail.com. Отчеты об ошибках и предложения крайне приветствуются, и я по возможности отвечаю на каждое сообщение.\n\nНе стесняйтесь использовать этот открытый PGP-ключ для шифрования переписки.\n\n > Полная ссылка на публичный ключ PGP: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nНравится ли Вам это дополнение?\n\nDecentraleyes есть и всегда будет бесплатным и свободным, но Вы можете поддержать его дальнейшее развитие, сделав пожертвование через, помогая в разработке на GitLab или же распространяя информацию о дополнении как можно более широко (среди друзей, знакомых и т.д.). Любая помощь будет принята с благодарностью!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Пожертвовать: https://decentraleyes.org/donate",
+ "sv-SE": "Webbplatser har alltmer börjat förlita sig mycket på tredjeparter för att tillhandahålla material. Avbryta förfrågningar från annonser eller trackers går vanligtvis utan problem, men att blockera sidans innehåll kan, inte oväntat, få sidor att sluta fungera. Syftet med detta tillägg är att ta bort mellanhanden genom att tillhandahålla blixtsnabb leverans av lokala (paketerade) filer för att förbättra integritet på nätet.\n\n • Skyddar integriteten genom att undvika stora leveransnätverk som hävdar att de erbjuder gratis tjänster.\n • Kompletterar vanliga blockerare som uBlock Origin (rekommenderas), Adblock Plus, med flera.\n • Fungerar direkt ur lådan; absolut ingen tidigare konfiguration krävs.\n\nObs: Decentraleyes är ingen dunderkur, men det hindrar en hel del webbplatser från att få dig att skicka dessa typer av förfrågningar. I slutändan kan du göra Decentraleyes blockera förfrågningar om eventuella saknade CDN-resurser också.\n\n > Enklare introduktion: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nÄr jag för närvarande skyddad?\n\nFöljande testverktyget visar om du är ordentligt skyddad. Det är det rekommenderade och förmodligen det snabbaste sättet att bekräfta att tillägget är installerat, aktiverat och korrekt konfigurerat.\n\n > Länk till testverktyg: https://decentraleyes.org/test\n\nVanliga frågor\n\n > Länk till vanliga frågor: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTeknisk information\n\n- Nätverk som stöds: Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources och UpYun Libraries.\n\n- Samlade resurser: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js och Web Font Loader.\n\nPersonlig support\n\nÄr din fråga inte listad ovan, eller har du någon annan anledning att kontakta mig personligen? Du kan alltid nå mig på decentraleyes@protonmail.com. Felrapporter och förslag välkomnas varmt och jag svarar på alla e-postmeddelanden.\n\nAnvänd gärna den här publika PGP-nyckeln för krypterad kommunikation.\n\n > Länk till publik PGP-nyckel: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nUppskattar du detta tillägg?\n\nDecentraleyes är och kommer alltid att vara gratis. Du kan stödja dess fortsatta utveckling genom att ge en donation, genom att hjälpa till på GitLab eller bara sprida kunskap om tillägget (vilket gör under). All hjälp uppskattas hjärtligt!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Donera: https://decentraleyes.org/donate",
+ "tr": "Web siteleri giderek daha çok büyük üçüncü taraf içerik dağıtıcılarına itibar etmeye başladı. Reklamlar veya iz sürücüler için istekleri engellemek genellikle sorunsuzdur, fakat gerçek içeriği engellemek, bekleneceği üzere, sayfaların işleyişini bozmaktadır. Bu eklentinin amacı çevrimiçi mahremiyeti artırmak için yerel (bütünleşik) dosyaları ışık hızında sunarak aracıları aradan çıkarmaktır.\n\n • Ücretsiz hizmet sunduğunu iddia eden büyük dağıtım ağlarını aradan çıkararak mahremiyeti korur.\n • uBlock Origin (önerilir), Adblock Plus, vb. gibi olağan engelleyicileri tamamlar.\n • Kutudan çıktığı gibi çalışır; ön ayarlamaya ihtiyaç duymaz.\n\nNot: Decentraleyes sihirli çözüm değildir, ama birçok web sitesinin sizi bu istekleri göndermeye zorlamasını engeller. Son olarak, Decentraleyes'ın herhangi eksik bir CDN kaynağı için istekleri engellemesini de sağlayabilirsiniz.\n\n > Basit tanıtım: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\nŞu Anda Korunuyor Muyum?\n\nAşağıdaki test yardımcı programı düzgün şekilde korunmuş iseniz size gösterir. Bu, eklentinin yüklü, etkin ve doğru yapılandırılmış olup olmadığını görmek için önerilen ve muhtemelen en hızlı yol budur.\n\n > Test yardımcı programı için tam bağlantı: https://decentraleyes.org/test\n\nSıkça Sorulan Sorular\n\n > SSS için tam bağlantı: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\nTeknik bilgi\n\n- Desteklenen Ağlar: Google Tarafından Barındırılan Kütüphaneler, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Kamusal Kaynaklar ve UpYun Kütüphaneleri.\n\n- Bütünleşik Kaynaklar: AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js ve Web Font Yükleyici.\n\nKişisel Destek\n\nSorunuz yukarıda listelenenlerden biri değil mi, veya şahsen bana ulaşmak için başka bir sebebiniz var mı? Her zaman bana buradan ulaşabilirsiniz decentraleyes@protonmail.com. Hata raporlarına veya önerilere çok açığım ve her bir e-postayı yanıtlıyorum.\n\nKullanmaktan çekinmeyin bu genel PGP anahtarı şifreli iletişim içindir.\n\n > Genel PGP anahtarına tam bağlantı: https://decentraleyes.org/3f774aff6d/public-key.txt\n\nBu Eklenti Hoşunuza Gitti Mi?\n\nDecentraleyes ücretsizdir ve her zaman öyle kalacaktır, ama sürekli geliştirilmesini bir bağışı yaparak, GitLab üzerinde katkı sunarak veya onu yayarak (ki harikalar yaratabilir) destekleyebilirsiniz. Herhangi bir yardımdan büyük mutluluk duyacağız!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • Bağış yap: https://decentraleyes.org/donate",
+ "zh-CN": "越来越多的网站开始更加依赖大型第三方来交付内容。取消对广告或跟踪器的请求通常没有问题,但屏蔽实际内容则理所当然会损坏页面。此扩展的目的是截去中间人,提供超高速的本地(自带的)文件交付以改善网上隐私。\n\n • 回避声称保护隐私并免费服务的大型交付网络以保护您的隐私。\n • 辅助常规过滤器,例如 uBlock Origin (推荐),Adblock Plus 等。\n • 即装即用;使用前绝对不需要任何配置。\n\n注意:Decentraleyes 不是万灵药,但它的确能防止许多网站让你发送此类请求。最后,你还可以让 Decentraleyes 屏蔽任何缺失的 CDN 资源。\n\n > 更简的简介:https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\n我目前是否受到保护?\n\n这个 测试工具 能告诉你你是否受到保护。我们推荐您用这个简单、快速的方式,检查本附加组件是否已被安装、启用并正确配置。\n\n > 测试工具的完整网址:https://decentraleyes.org/test\n\n常见问题和解答\n\n > 常见问题页面的完整链接:https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\n技术信息\n\n- 支持的网络:Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, 及 UpYun Libraries。\n\n- 打包的资源:AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js 及 Web Font Loader。\n\n个人支持\n\n你的问题上述没有解答?或者你有其他理由要单独联系我?您随时可以联系我: decentraleyes@protonmail.com。十分欢迎提出Bug报告或建议,我也会回复每一封电子邮件。\n\n欢迎使用 此 PGP 公钥 与我进行加密通信。\n\n > PGP 公钥完整链接:https://decentraleyes.org/3f774aff6d/public-key.txt\n\n你喜欢这个扩展吗?\n\nDecentraleyes 目前是并且将永远是免费的。但你也可以支持它的开发,比如捐款,在 GitLab 贡献,或者传播这个软件(哪怕是名称)。任何帮助都不胜感激!\n\n • GitLab:https://git.synz.io/Synzvato/decentraleyes\n • 捐款:https://decentraleyes.org/donate",
+ "zh-TW": "許多網站已逐漸開始依靠第三方大網站的服務來傳遞內容。取消與廣告服務或追蹤網站間的連線通常不會有什麼問題,然而封鎖網頁當中的實際內容就很有可能會造成網頁錯誤。此附加元件的目標是要透過在本機準備一份常用的程式庫,讓您可無須透過網路取得即可快速載入這些程式庫,也改善了線上隱私。\n\n • 避免連線至宣稱免費的大型的內容傳遞網路,以保護您的隱私。\n • 可與常見的封鎖器,例如 uBlock Origin(推薦使用)、Adblock Plus 等等一同使用,功能互補。\n • 隨裝即用,不需特別設定。\n\n註: Decentraleyes 不是萬能,但的確可避免大量網站讓您送出這類請求。最終,您還可以讓 Decentraleyes 封鎖缺少的 CDN 資源請求。\n\n > 簡單介紹: https://git.synz.io/Synzvato/decentraleyes/wikis/Simple-Introduction\n\n我目前是否受到保護?\n\n這個 小工具 可顯示您是否正確受到保護。推薦您透過這個簡便的方式來確認是否已安裝、啟用、並正確設定完成這套附加元件。\n\n > 測試工具的完整鏈結: https://decentraleyes.org/test\n\n常見問題集\n\n > 常見問題的完整鏈結: https://git.synz.io/Synzvato/decentraleyes/wikis/Frequently-Asked-Questions\n\n技術資訊\n\n- 支援的傳遞網路: Google Hosted Libraries、Microsoft Ajax CDN、CDNJS (Cloudflare)、jQuery CDN (MaxCDN)、jsDelivr (MaxCDN)、Yandex CDN、Baidu CDN、Sina Public Resources 以及 UpYun Libraries。\n\n- 內建資源: AngularJS、Backbone.js、Dojo、Ember.js、Ext Core、jQuery、jQuery UI、Modernizr、MooTools、Prototype、Scriptaculous、SWFObject、Underscore.js 以及 Web Font Loader 等。\n\n個人支援\n\n若您的問題不在上面,或還有其他問題想連絡我本人嗎?您可以寄信到 decentraleyes@protonmail.com。也非常歡迎您回報 Bug 或是提供建議,我會回覆每一封信。\n\n歡迎使用 此 PGP 公鑰 進行加密通訊。\n\n > PGP 公鑰的完整鏈結: https://decentraleyes.org/3f774aff6d/public-key.txt\n\n您喜歡這套附加元件嗎?\n\nDecentraleyes 目前免費,且將永遠免費。您可以透過捐款、在 GitLab 貢獻程式碼或幫助宣傳,來支援這套附加元件的永續發展。非常感謝您的任何幫助!\n\n • GitLab: https://git.synz.io/Synzvato/decentraleyes\n • 捐款: https://decentraleyes.org/donate"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/decentraleyes/edit",
+ "guid": "jid1-BoFifL9Vbdl2zQ@jetpack",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "ar": "https://decentraleyes.org",
+ "bg": "https://decentraleyes.org",
+ "cs": "https://decentraleyes.org",
+ "da": "https://decentraleyes.org",
+ "de": "https://decentraleyes.org",
+ "el": "https://decentraleyes.org",
+ "en-US": "https://decentraleyes.org",
+ "es": "https://decentraleyes.org",
+ "fi": "https://decentraleyes.org",
+ "fr": "https://decentraleyes.org",
+ "he": "https://decentraleyes.org",
+ "id": "https://decentraleyes.org",
+ "it": "https://decentraleyes.org",
+ "ja": "https://decentraleyes.org",
+ "ko": "https://decentraleyes.org",
+ "pl": "https://decentraleyes.org",
+ "pt-BR": "https://decentraleyes.org",
+ "pt-PT": "https://decentraleyes.org",
+ "ro": "https://decentraleyes.org",
+ "ru": "https://decentraleyes.org",
+ "sv-SE": "https://decentraleyes.org",
+ "tr": "https://decentraleyes.org",
+ "zh-CN": "https://decentraleyes.org",
+ "zh-TW": "https://decentraleyes.org"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/521/521554-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/521/521554-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/521/521554-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-04-01T13:01:54Z",
+ "name": {
+ "ar": "Decentraleyes",
+ "bg": "Decentraleyes",
+ "cs": "Decentraleyes",
+ "da": "Decentraleyes",
+ "de": "Decentraleyes",
+ "el": "Decentraleyes",
+ "en-GB": "Decentraleyes",
+ "en-US": "Decentraleyes",
+ "es": "Decentraleyes",
+ "et": "Decentraleyes",
+ "fi": "Decentraleyes",
+ "fr": "Decentraleyes",
+ "he": "Decentraleyes",
+ "hu": "Decentraleyes",
+ "id": "Decentraleyes",
+ "it": "Decentraleyes",
+ "ja": "Decentraleyes",
+ "ko": "Decentraleyes",
+ "nb-NO": "Decentraleyes",
+ "nl": "Decentraleyes",
+ "pl": "Decentraleyes",
+ "pt-BR": "Decentraleyes",
+ "pt-PT": "Decentraleyes",
+ "ro": "Decentraleyes",
+ "ru": "Decentraleyes",
+ "sv-SE": "Decentraleyes",
+ "tr": "Decentraleyes",
+ "zh-CN": "Decentraleyes",
+ "zh-TW": "Decentraleyes"
+ },
+ "previews": [
+ {
+ "id": 137406,
+ "caption": {
+ "en-US": "Evades Content Delivery Networks without breaking websites."
+ },
+ "image_size": [
+ 700,
+ 521
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/137/137406.png?modified=1543520350",
+ "thumbnail_size": [
+ 640,
+ 476
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/137/137406.png?modified=1543520350"
+ },
+ {
+ "id": 205808,
+ "caption": {
+ "en-US": "Complements regular content blockers (e.g. uBlock Origin)."
+ },
+ "image_size": [
+ 700,
+ 521
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/205/205808.png?modified=1543520352",
+ "thumbnail_size": [
+ 640,
+ 476
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/205/205808.png?modified=1543520352"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.7966,
+ "bayesian_average": 4.7917791518717365,
+ "count": 1160,
+ "text_count": 306
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/521554",
+ "slug": "decentraleyes",
+ "status": "public",
+ "summary": {
+ "ar": "يحميك من التتبع المرتبط بالوصول للمحتوى \"مجاني\"، مركزية. فهو يمنع الكثير من طلبات الشبكات من الوصول مثل المكتبات المستضافة غوغل و أخرى، ويقدم ملفات محلية للتخفيف على المواقع. يكمل مانع المحتوى المعتاد.",
+ "bg": "Защитава ви от следене чрез свободна, централизирана доставка на съдържание. Спира достигането на много заявки към мрежи за доставка на съдържание и подава местни файлове, за да не се счупват сайтовете. Допълва обикновените блокировачи на съдържание.",
+ "cs": "Chrání před sledováním skrze centrálně doručovaný obsah. Brání stahování knihoven ze serverů Googlu a místo nich používá jejich lokálně uložené kopie, takže webové stránky budou nadále fungovat. Vhodné doplnění k běžnému blokování obsahu.",
+ "da": "Beskytter dig imod sporing af \"gratis\", centraliserede indholdsleverandører. Forhindrer trafik til tjenester såsom Google Hosted Libraries, og leverer i stedet lokale filer så hjemmesider stadig fungerer. Et supplement til blokerings-tilføjelser.",
+ "de": "Schützt vor Tracking durch \"gratis\", zentralisiertes Abliefern von Content. Es sorgt dafür, dass Anfragen Netzwerke wie \"Google Hosted Libraries\" nicht erreichen, aber imitiert sie, sodass die Seiten intakt bleiben. Ergänzt reguläre Contentsperren.",
+ "el": "Προστατεύει από παρακολούθηση μέσω \"δωρεάν\" διανομής περιεχόμενου. Αποτρέπει κλήσεις προς εξωτερικά δίκτυα όπως οι βιβλιοθήκες της Google και σερβίρει τοπικά αρχεία για σωστή προβολή ιστοσελίδων. Συμπληρώνει συνήθη πρόθετα αποκλεισμού.",
+ "en-GB": "Protects you against tracking through \"free\", centralised, content delivery. It prevents a lot of requests from reaching networks like Google Hosted Libraries, and serves local files to keep sites from breaking. Complements regular content blockers.",
+ "en-US": "Protects you against tracking through \"free\", centralized, content delivery. It prevents a lot of requests from reaching networks like Google Hosted Libraries, and serves local files to keep sites from breaking. Complements regular content blockers.",
+ "es": "Protege contra el rastreo con la entrega centralizada y «gratuita» de contenido. Previene interferencia de redes como Google Hosted Libraries, sirve archivos locales para prevenir que sitios se rompan. Complementa bloqueadores regulares.",
+ "et": "Kaitseb sind \"tasuta\", tsentraliseeritud sisu edastamisest tuleneva jälitamise vastu. Keelab taotlused võrgustikesse nagu Google Hosted Libraries, asendades need kohalike failidega, et saidid jätkuvalt töötaksid. Täiendab tavalisi sisublokeerijaid.",
+ "fi": "Suojaa sinua \"ilmaisten\" keskitettyjen sisällön jakeluverkkojen jäljitykseltä. Estää sisältöpyyntöjä moniin jakeluverkkoihin ja korvaa ne paikallisilla tiedostoilla estäkseen sivujen hajoamisen. Täydentää muita sisällön suodatuksen lisäosia.",
+ "fr": "Protège du pistage lié aux diffuseurs de contenus « gratuits », centralisés. Accélère de nombreuses requêtes (Google Hosted Libraries et autres) en les servant localement, allégeant la charge des sites. Complète les bloqueurs de contenus habituels.",
+ "he": "מגן עליך מפני מעקב המבוצע דרך רשתות אספקת תוכן ריכוזיות ו\"חינמיות\". מונע מבקשות מלהגיע לרשתות כמו Google Hosted Libraries, ומשתמש בקבצים מקומיים כדי למנוע שיבושים. משלים חוסמי תוכן רגילים.",
+ "hu": "Véd attól, hogy az „ingyenes”, centralizált tartalomszolgáltatók kövessenek. Blokkolja a kéréseket a Google Hosted Libraries és efféle hálózatok elérésében, az oldalak betörését helyi fájlokkal akadályozza meg.",
+ "id": "Melindungi dari pelacakan melalui distribusi konten yang bebas dan terpusat. Mencegah permintaan ke jaringan seperti Google Hosted Libraries, dan menyediakan berkas lokal pengganti agar situs tetap bekerja baik. Pelengkap pemblokir konten umum.",
+ "it": "Protegge dal tracciamento tramite CDN centralizzato \"gratis\". Impedisce a molte richieste di raggiungere reti come Google Hosted Libraries e fornisce file locali per impedire malfunzionamenti dei siti. È complementare ai normali content blockers.",
+ "ja": "「無料」と称してあなたを追跡する大規模なCDNを迂回して、プライバシーを守ります。Google Hosted Librariesなどへのリクエストをブロックします。また、ページの表示を壊さないよう、ローカルにこれらのライブラリを保存しています。一般的なコンテンツブロッカーを補助します。",
+ "ko": "\"무료\"라는 미끼로 당신을 추적하는 대규모 CDN을 사용하지 않음으로써 프라이버시를 지킵니다. Google Hosted Libraries 와 같은 CDN을 향한 리소스 요청을 차단합니다. 대신 로컬 저장소에 직접 라이브러리를 보관해두고 사용합니다. 일반적인 요소 차단기를 보조합니다.",
+ "nb-NO": "Beskytter mot sporing gjort av \"gratis\" sentralisert innholdslevering. Den hindrer mange forespørsler fra å nå nettverk som Google Hosted Libraries, og tilbyr lokale filer for å avverge rotede nettsteder. Bistår vanlige innholdsblokkerere.",
+ "nl": "Beschermt tegen tracking via het \"gratis\", gecentraliseerd, verzorgen van content. Het zorgt ervoor dat veel verzoeken netwerken als Google Hosted Libraries niet bereiken en imiteert ze, zodat sites niet stukgaan. Vult reguliere content blockers aan.",
+ "pl": "Chroni przed śledzeniem przez ośrodki CDN. Zapobiega wysyłaniu zapytań do sieci takich jak Google Hosted Libraries i dostarcza zasoby z lokalnych plików żeby nie psuć stron. Jest uzupełnieniem do klasycznych dodatków blokujących.",
+ "pt-BR": "Te protege contra rastreamento através de entrega de conteúdo \"grátis\", e centralizado. Ele impede que muitos pedidos cheguem a redes como o Google Hosted Libraries e serve arquivos locais para impedir que os sites sejam quebrados.",
+ "pt-PT": "Protege contra monitorização através de entrega de conteúdo centralizado. Impede pedidos de chegar a redes como Google Hosted Libraries e serve ficheiros locais para que os sites não quebrem. Complementa bloqueadores de conteúdo regulares.",
+ "ro": "Protejează împotriva urmăririi prin livrare de conținut gratuit, centralizat. Previne cererile în a ajunge la reţele precum Google Hosted Libraries, şi livrează fişiere locale fără a strica sit-urile. Ajută extensiile obișnuite de blocaj de conținut.",
+ "ru": "Защищает Вас от отслеживания через «бесплатные», централизованные CDN. Предотвращает отслеживание через множество запросов к CDN (а-ля GHL, MaxCDN, YandexCDN и т.п.), «доставляя» локальные файлы, чтобы не ломать сайты. Дополняет контент-фильтры.",
+ "sv-SE": "Skyddar dig mot att spåras av \"gratis\" centraliserad innehållsleverans. Det hindrar att förfrågningar görs till nätverk som Google Hosted Libraries och tillhandahåller lokala filer, så att sidor inte går sönder. Kompletterar vanliga blockerare.",
+ "tr": "Sizi içerik dağıtımıyla yapılan merkezi ve \"ücretsiz\" takipten korur. Google Yerleşimli Kütüphaneler gibi ağlara erişimi engelleyip bunlar yerine siteler için gerekli yerel dosyaları sunar. Olağan içerik engelleyicileri işlevsel olarak tamamlar.",
+ "zh-CN": "保护您免受集中式的内容交付网络(CDN)的跟踪。它可以拦截许多种链向 CDN 的请求,转而指向本地提供的文件,从而防止网站功能受损。辅助常规的内容过滤规则。",
+ "zh-TW": "保護您不受「免費」、中心化的內容傳遞網路(CDN)的追蹤。此附加元件可防止您的瀏覽器送出請求到 Google Hosted Libraries 這類的服務,並在本機提供程式庫以達到相同的效果,而不造成網頁錯誤。可補充一般內容封鎖器的功能。"
+ },
+ "support_email": null,
+ "support_url": {
+ "ar": "https://decentraleyes.org",
+ "bg": "https://decentraleyes.org",
+ "cs": "https://decentraleyes.org",
+ "da": "https://decentraleyes.org",
+ "de": "https://decentraleyes.org",
+ "el": "https://decentraleyes.org",
+ "en-GB": "https://decentraleyes.org",
+ "en-US": "https://decentraleyes.org",
+ "es": "https://decentraleyes.org",
+ "et": "https://decentraleyes.org",
+ "fi": "https://decentraleyes.org",
+ "fr": "https://decentraleyes.org",
+ "he": "https://decentraleyes.org",
+ "hu": "https://decentraleyes.org",
+ "id": "https://decentraleyes.org",
+ "it": "https://decentraleyes.org",
+ "ja": "https://decentraleyes.org",
+ "ko": "https://decentraleyes.org",
+ "nb-NO": "https://decentraleyes.org",
+ "nl": "https://decentraleyes.org",
+ "pl": "https://decentraleyes.org",
+ "pt-BR": "https://decentraleyes.org",
+ "pt-PT": "https://decentraleyes.org",
+ "ro": "https://decentraleyes.org",
+ "ru": "https://decentraleyes.org",
+ "sv-SE": "https://decentraleyes.org",
+ "tr": "https://decentraleyes.org",
+ "zh-CN": "https://decentraleyes.org",
+ "zh-TW": "https://decentraleyes.org"
+ },
+ "tags": [
+ "block",
+ "cdn",
+ "content",
+ "decentralize",
+ "delivery",
+ "emulate",
+ "emulation",
+ "framework",
+ "googleapis",
+ "intercept",
+ "javascript",
+ "libraries",
+ "local",
+ "networks",
+ "privacy",
+ "resources",
+ "tracking"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/",
+ "weekly_downloads": 5470
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 506646,
+ "authors": [
+ {
+ "id": 5474073,
+ "name": "EFF Technologists",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/5474073/",
+ "username": "eff-technologists",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/5/5474/5474073.png?modified=1469820907"
+ }
+ ],
+ "average_daily_users": 939051,
+ "categories": {
+ "android": [
+ "security-privacy"
+ ],
+ "firefox": [
+ "privacy-security"
+ ]
+ },
+ "contributions_url": "https://www.paypal.me/SupportEFF?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org",
+ "created": "2014-05-01T18:23:16Z",
+ "current_version": {
+ "id": 5112079,
+ "compatibility": {
+ "firefox": {
+ "min": "52.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "52.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-badger17/versions/5112079",
+ "files": [
+ {
+ "id": 3656444,
+ "created": "2020-10-07T17:10:45Z",
+ "hash": "sha256:da9d488a9ee75347b73931a7d0136540292cd3db8aa0bfe4c273503291f7019e",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 1240482,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3656444/privacy_badger-2020.10.7-an+fx.xpi",
+ "permissions": [
+ "tabs",
+ "http://*/*",
+ "https://*/*",
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "storage",
+ "cookies",
+ "privacy",
+ "https://*.facebook.com/*",
+ "http://*.facebook.com/*",
+ "https://*.messenger.com/*",
+ "http://*.messenger.com/*",
+ "*://*.facebookcorewwwi.onion/*",
+ "https://www.google.com/*",
+ "http://www.google.com/*",
+ "https://www.google.ad/*",
+ "http://www.google.ad/*",
+ "https://www.google.ae/*",
+ "http://www.google.ae/*",
+ "https://www.google.com.af/*",
+ "http://www.google.com.af/*",
+ "https://www.google.com.ag/*",
+ "http://www.google.com.ag/*",
+ "https://www.google.com.ai/*",
+ "http://www.google.com.ai/*",
+ "https://www.google.al/*",
+ "http://www.google.al/*",
+ "https://www.google.am/*",
+ "http://www.google.am/*",
+ "https://www.google.co.ao/*",
+ "http://www.google.co.ao/*",
+ "https://www.google.com.ar/*",
+ "http://www.google.com.ar/*",
+ "https://www.google.as/*",
+ "http://www.google.as/*",
+ "https://www.google.at/*",
+ "http://www.google.at/*",
+ "https://www.google.com.au/*",
+ "http://www.google.com.au/*",
+ "https://www.google.az/*",
+ "http://www.google.az/*",
+ "https://www.google.ba/*",
+ "http://www.google.ba/*",
+ "https://www.google.com.bd/*",
+ "http://www.google.com.bd/*",
+ "https://www.google.be/*",
+ "http://www.google.be/*",
+ "https://www.google.bf/*",
+ "http://www.google.bf/*",
+ "https://www.google.bg/*",
+ "http://www.google.bg/*",
+ "https://www.google.com.bh/*",
+ "http://www.google.com.bh/*",
+ "https://www.google.bi/*",
+ "http://www.google.bi/*",
+ "https://www.google.bj/*",
+ "http://www.google.bj/*",
+ "https://www.google.com.bn/*",
+ "http://www.google.com.bn/*",
+ "https://www.google.com.bo/*",
+ "http://www.google.com.bo/*",
+ "https://www.google.com.br/*",
+ "http://www.google.com.br/*",
+ "https://www.google.bs/*",
+ "http://www.google.bs/*",
+ "https://www.google.bt/*",
+ "http://www.google.bt/*",
+ "https://www.google.co.bw/*",
+ "http://www.google.co.bw/*",
+ "https://www.google.by/*",
+ "http://www.google.by/*",
+ "https://www.google.com.bz/*",
+ "http://www.google.com.bz/*",
+ "https://www.google.ca/*",
+ "http://www.google.ca/*",
+ "https://www.google.cd/*",
+ "http://www.google.cd/*",
+ "https://www.google.cf/*",
+ "http://www.google.cf/*",
+ "https://www.google.cg/*",
+ "http://www.google.cg/*",
+ "https://www.google.ch/*",
+ "http://www.google.ch/*",
+ "https://www.google.ci/*",
+ "http://www.google.ci/*",
+ "https://www.google.co.ck/*",
+ "http://www.google.co.ck/*",
+ "https://www.google.cl/*",
+ "http://www.google.cl/*",
+ "https://www.google.cm/*",
+ "http://www.google.cm/*",
+ "https://www.google.cn/*",
+ "http://www.google.cn/*",
+ "https://www.google.com.co/*",
+ "http://www.google.com.co/*",
+ "https://www.google.co.cr/*",
+ "http://www.google.co.cr/*",
+ "https://www.google.com.cu/*",
+ "http://www.google.com.cu/*",
+ "https://www.google.cv/*",
+ "http://www.google.cv/*",
+ "https://www.google.com.cy/*",
+ "http://www.google.com.cy/*",
+ "https://www.google.cz/*",
+ "http://www.google.cz/*",
+ "https://www.google.de/*",
+ "http://www.google.de/*",
+ "https://www.google.dj/*",
+ "http://www.google.dj/*",
+ "https://www.google.dk/*",
+ "http://www.google.dk/*",
+ "https://www.google.dm/*",
+ "http://www.google.dm/*",
+ "https://www.google.com.do/*",
+ "http://www.google.com.do/*",
+ "https://www.google.dz/*",
+ "http://www.google.dz/*",
+ "https://www.google.com.ec/*",
+ "http://www.google.com.ec/*",
+ "https://www.google.ee/*",
+ "http://www.google.ee/*",
+ "https://www.google.com.eg/*",
+ "http://www.google.com.eg/*",
+ "https://www.google.es/*",
+ "http://www.google.es/*",
+ "https://www.google.com.et/*",
+ "http://www.google.com.et/*",
+ "https://www.google.fi/*",
+ "http://www.google.fi/*",
+ "https://www.google.com.fj/*",
+ "http://www.google.com.fj/*",
+ "https://www.google.fm/*",
+ "http://www.google.fm/*",
+ "https://www.google.fr/*",
+ "http://www.google.fr/*",
+ "https://www.google.ga/*",
+ "http://www.google.ga/*",
+ "https://www.google.ge/*",
+ "http://www.google.ge/*",
+ "https://www.google.gg/*",
+ "http://www.google.gg/*",
+ "https://www.google.com.gh/*",
+ "http://www.google.com.gh/*",
+ "https://www.google.com.gi/*",
+ "http://www.google.com.gi/*",
+ "https://www.google.gl/*",
+ "http://www.google.gl/*",
+ "https://www.google.gm/*",
+ "http://www.google.gm/*",
+ "https://www.google.gr/*",
+ "http://www.google.gr/*",
+ "https://www.google.com.gt/*",
+ "http://www.google.com.gt/*",
+ "https://www.google.gy/*",
+ "http://www.google.gy/*",
+ "https://www.google.com.hk/*",
+ "http://www.google.com.hk/*",
+ "https://www.google.hn/*",
+ "http://www.google.hn/*",
+ "https://www.google.hr/*",
+ "http://www.google.hr/*",
+ "https://www.google.ht/*",
+ "http://www.google.ht/*",
+ "https://www.google.hu/*",
+ "http://www.google.hu/*",
+ "https://www.google.co.id/*",
+ "http://www.google.co.id/*",
+ "https://www.google.ie/*",
+ "http://www.google.ie/*",
+ "https://www.google.co.il/*",
+ "http://www.google.co.il/*",
+ "https://www.google.im/*",
+ "http://www.google.im/*",
+ "https://www.google.co.in/*",
+ "http://www.google.co.in/*",
+ "https://www.google.iq/*",
+ "http://www.google.iq/*",
+ "https://www.google.is/*",
+ "http://www.google.is/*",
+ "https://www.google.it/*",
+ "http://www.google.it/*",
+ "https://www.google.je/*",
+ "http://www.google.je/*",
+ "https://www.google.com.jm/*",
+ "http://www.google.com.jm/*",
+ "https://www.google.jo/*",
+ "http://www.google.jo/*",
+ "https://www.google.co.jp/*",
+ "http://www.google.co.jp/*",
+ "https://www.google.co.ke/*",
+ "http://www.google.co.ke/*",
+ "https://www.google.com.kh/*",
+ "http://www.google.com.kh/*",
+ "https://www.google.ki/*",
+ "http://www.google.ki/*",
+ "https://www.google.kg/*",
+ "http://www.google.kg/*",
+ "https://www.google.co.kr/*",
+ "http://www.google.co.kr/*",
+ "https://www.google.com.kw/*",
+ "http://www.google.com.kw/*",
+ "https://www.google.kz/*",
+ "http://www.google.kz/*",
+ "https://www.google.la/*",
+ "http://www.google.la/*",
+ "https://www.google.com.lb/*",
+ "http://www.google.com.lb/*",
+ "https://www.google.li/*",
+ "http://www.google.li/*",
+ "https://www.google.lk/*",
+ "http://www.google.lk/*",
+ "https://www.google.co.ls/*",
+ "http://www.google.co.ls/*",
+ "https://www.google.lt/*",
+ "http://www.google.lt/*",
+ "https://www.google.lu/*",
+ "http://www.google.lu/*",
+ "https://www.google.lv/*",
+ "http://www.google.lv/*",
+ "https://www.google.com.ly/*",
+ "http://www.google.com.ly/*",
+ "https://www.google.co.ma/*",
+ "http://www.google.co.ma/*",
+ "https://www.google.md/*",
+ "http://www.google.md/*",
+ "https://www.google.me/*",
+ "http://www.google.me/*",
+ "https://www.google.mg/*",
+ "http://www.google.mg/*",
+ "https://www.google.mk/*",
+ "http://www.google.mk/*",
+ "https://www.google.ml/*",
+ "http://www.google.ml/*",
+ "https://www.google.com.mm/*",
+ "http://www.google.com.mm/*",
+ "https://www.google.mn/*",
+ "http://www.google.mn/*",
+ "https://www.google.ms/*",
+ "http://www.google.ms/*",
+ "https://www.google.com.mt/*",
+ "http://www.google.com.mt/*",
+ "https://www.google.mu/*",
+ "http://www.google.mu/*",
+ "https://www.google.mv/*",
+ "http://www.google.mv/*",
+ "https://www.google.mw/*",
+ "http://www.google.mw/*",
+ "https://www.google.com.mx/*",
+ "http://www.google.com.mx/*",
+ "https://www.google.com.my/*",
+ "http://www.google.com.my/*",
+ "https://www.google.co.mz/*",
+ "http://www.google.co.mz/*",
+ "https://www.google.com.na/*",
+ "http://www.google.com.na/*",
+ "https://www.google.com.ng/*",
+ "http://www.google.com.ng/*",
+ "https://www.google.com.ni/*",
+ "http://www.google.com.ni/*",
+ "https://www.google.ne/*",
+ "http://www.google.ne/*",
+ "https://www.google.nl/*",
+ "http://www.google.nl/*",
+ "https://www.google.no/*",
+ "http://www.google.no/*",
+ "https://www.google.com.np/*",
+ "http://www.google.com.np/*",
+ "https://www.google.nr/*",
+ "http://www.google.nr/*",
+ "https://www.google.nu/*",
+ "http://www.google.nu/*",
+ "https://www.google.co.nz/*",
+ "http://www.google.co.nz/*",
+ "https://www.google.com.om/*",
+ "http://www.google.com.om/*",
+ "https://www.google.com.pa/*",
+ "http://www.google.com.pa/*",
+ "https://www.google.com.pe/*",
+ "http://www.google.com.pe/*",
+ "https://www.google.com.pg/*",
+ "http://www.google.com.pg/*",
+ "https://www.google.com.ph/*",
+ "http://www.google.com.ph/*",
+ "https://www.google.com.pk/*",
+ "http://www.google.com.pk/*",
+ "https://www.google.pl/*",
+ "http://www.google.pl/*",
+ "https://www.google.pn/*",
+ "http://www.google.pn/*",
+ "https://www.google.com.pr/*",
+ "http://www.google.com.pr/*",
+ "https://www.google.ps/*",
+ "http://www.google.ps/*",
+ "https://www.google.pt/*",
+ "http://www.google.pt/*",
+ "https://www.google.com.py/*",
+ "http://www.google.com.py/*",
+ "https://www.google.com.qa/*",
+ "http://www.google.com.qa/*",
+ "https://www.google.ro/*",
+ "http://www.google.ro/*",
+ "https://www.google.ru/*",
+ "http://www.google.ru/*",
+ "https://www.google.rw/*",
+ "http://www.google.rw/*",
+ "https://www.google.com.sa/*",
+ "http://www.google.com.sa/*",
+ "https://www.google.com.sb/*",
+ "http://www.google.com.sb/*",
+ "https://www.google.sc/*",
+ "http://www.google.sc/*",
+ "https://www.google.se/*",
+ "http://www.google.se/*",
+ "https://www.google.com.sg/*",
+ "http://www.google.com.sg/*",
+ "https://www.google.sh/*",
+ "http://www.google.sh/*",
+ "https://www.google.si/*",
+ "http://www.google.si/*",
+ "https://www.google.sk/*",
+ "http://www.google.sk/*",
+ "https://www.google.com.sl/*",
+ "http://www.google.com.sl/*",
+ "https://www.google.sn/*",
+ "http://www.google.sn/*",
+ "https://www.google.so/*",
+ "http://www.google.so/*",
+ "https://www.google.sm/*",
+ "http://www.google.sm/*",
+ "https://www.google.sr/*",
+ "http://www.google.sr/*",
+ "https://www.google.st/*",
+ "http://www.google.st/*",
+ "https://www.google.com.sv/*",
+ "http://www.google.com.sv/*",
+ "https://www.google.td/*",
+ "http://www.google.td/*",
+ "https://www.google.tg/*",
+ "http://www.google.tg/*",
+ "https://www.google.co.th/*",
+ "http://www.google.co.th/*",
+ "https://www.google.com.tj/*",
+ "http://www.google.com.tj/*",
+ "https://www.google.tl/*",
+ "http://www.google.tl/*",
+ "https://www.google.tm/*",
+ "http://www.google.tm/*",
+ "https://www.google.tn/*",
+ "http://www.google.tn/*",
+ "https://www.google.to/*",
+ "http://www.google.to/*",
+ "https://www.google.com.tr/*",
+ "http://www.google.com.tr/*",
+ "https://www.google.tt/*",
+ "http://www.google.tt/*",
+ "https://www.google.com.tw/*",
+ "http://www.google.com.tw/*",
+ "https://www.google.co.tz/*",
+ "http://www.google.co.tz/*",
+ "https://www.google.com.ua/*",
+ "http://www.google.com.ua/*",
+ "https://www.google.co.ug/*",
+ "http://www.google.co.ug/*",
+ "https://www.google.co.uk/*",
+ "http://www.google.co.uk/*",
+ "https://www.google.com.uy/*",
+ "http://www.google.com.uy/*",
+ "https://www.google.co.uz/*",
+ "http://www.google.co.uz/*",
+ "https://www.google.com.vc/*",
+ "http://www.google.com.vc/*",
+ "https://www.google.co.ve/*",
+ "http://www.google.co.ve/*",
+ "https://www.google.vg/*",
+ "http://www.google.vg/*",
+ "https://www.google.co.vi/*",
+ "http://www.google.co.vi/*",
+ "https://www.google.com.vn/*",
+ "http://www.google.com.vn/*",
+ "https://www.google.vu/*",
+ "http://www.google.vu/*",
+ "https://www.google.ws/*",
+ "http://www.google.ws/*",
+ "https://www.google.rs/*",
+ "http://www.google.rs/*",
+ "https://www.google.co.za/*",
+ "http://www.google.co.za/*",
+ "https://www.google.co.zm/*",
+ "http://www.google.co.zm/*",
+ "https://www.google.co.zw/*",
+ "http://www.google.co.zw/*",
+ "https://www.google.cat/*",
+ "http://www.google.cat/*",
+ "https://hangouts.google.com/*",
+ "http://hangouts.google.com/*",
+ "https://docs.google.com/*",
+ "http://docs.google.com/*",
+ ""
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 6,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència GPL (General Public License) de GNU, version 3.0",
+ "cs": "GNU General Public License, verze 3.0",
+ "de": "GNU General Public License, Version 3.0",
+ "el": "GNU General Public License, έκδοση 3.0",
+ "en-US": "GNU General Public License, version 3.0",
+ "es": "Licencia pública GNU, versión 3.0",
+ "eu": "GNU General Public License, 3.0 bertsioa",
+ "fa": "مجوز عمومی کلی گنو، نسخهٔ ۳٫۰",
+ "ga-IE": "GNU General Public License, leagan 3.0",
+ "id": "GNU General Public License, versi 3.0",
+ "it": "Licenza GNU General Public License, versione 3.0",
+ "ja": "GNU General Public License バージョン 3.0",
+ "nl": "GNU General Public License, versie 3.0",
+ "pl": "General Public Licence, wersja 3.0",
+ "pt-PT": "GNU General Public License, versão 3.0",
+ "ru": "GNU General Public License, версия 3.0",
+ "sk": "GNU General Public License, verzia 3.0",
+ "sq": "Leje e Përgjithshme Publike GNU, version 3.0",
+ "uk": "GNU General Public License, версія 3.0",
+ "vi": "Giấy phép Công cộng GNU, phiên bản 3.0",
+ "zh-CN": "GNU 通用公共授权,版本 3.0",
+ "zh-TW": "GNU General Public License,版本 3.0"
+ },
+ "url": "http://www.gnu.org/licenses/gpl-3.0.html"
+ },
+ "release_notes": {
+ "en-US": "
Added support for Global Privacy Control, a new specification that lets you tell companies you'd like to opt out of data sharing and selling. Visit https://globalprivacycontrol.org/ to learn more.
Added a new section to the options page to display the browser settings that Privacy Badger overrides for privacy reasons
"
+ },
+ "reviewed": null,
+ "version": "2020.10.7"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "en-US": "Privacy Badger automatically learns to block invisible trackers. Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.\n\nPrivacy Badger sends the Global Privacy Control signal to opt you out of data sharing and selling, and the Do Not Track signal to tell companies not to track you. If trackers ignore your wishes, Privacy Badger will learn to block them.\n\nBesides automatic tracker blocking, Privacy Badger replaces potentially useful trackers (video players, comments widgets, etc.) with click-to-activate placeholders, and removes outgoing link click tracking on Facebook and Google, with more privacy protections on the way.\n\nTo learn more, see the FAQ on Privacy Badger's homepage."
+ },
+ "developer_comments": {
+ "en-US": "I need help! I found a bug! What do I do now?\n\nTo get help or to report bugs, please email extension-devs@eff.org. If you have a GitHub account, you can use our GitHub issue tracker.\n\nWhy does Privacy Badger need access to my data for all websites?\n\nWhen you install Privacy Badger, your browser warns that Privacy Badger can “access your data for all websites”. You are right to be alarmed. You should only install extensions made by organizations you trust.\n\nPrivacy Badger requires these permissions to do its job of automatically detecting and blocking trackers on all websites you visit. We are not ironically (or unironically) spying on you. For more information, see our Privacy Badger extension permissions explainer.\n\nNote that the extension permissions warnings only cover what the extension has access to, not what the extension actually does with what it has access to (such as whether the extension secretly uploads your browsing data to its servers). Privacy Badger will never share data about your browsing unless you choose to share it (by filing a broken site report). For more information, see EFF’s Privacy Policy for Software."
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-badger17/edit",
+ "guid": "jid1-MnnxcxisBPnSXQ@jetpack",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "en-US": "https://privacybadger.org/"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/506/506646-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/506/506646-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/506/506646-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-10-08T08:20:41Z",
+ "name": {
+ "en-US": "Privacy Badger"
+ },
+ "previews": [
+ {
+ "id": 225184,
+ "caption": {
+ "en-US": "Privacy Badger is a project of the Electronic Frontier Foundation"
+ },
+ "image_size": [
+ 1920,
+ 1080
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/225/225184.png?modified=1569261286",
+ "thumbnail_size": [
+ 640,
+ 360
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/225/225184.png?modified=1569261286"
+ },
+ {
+ "id": 171793,
+ "caption": {
+ "en-US": "Privacy Badger at work on the whitehouse.gov privacy policy page."
+ },
+ "image_size": [
+ 700,
+ 394
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/171/171793.png?modified=1569261279",
+ "thumbnail_size": [
+ 640,
+ 360
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/171/171793.png?modified=1569261279"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.789,
+ "bayesian_average": 4.785571867473681,
+ "count": 1630,
+ "text_count": 393
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/506646",
+ "slug": "privacy-badger17",
+ "status": "public",
+ "summary": {
+ "en-US": "Automatically learns to block invisible trackers."
+ },
+ "support_email": {
+ "en-US": "extension-devs@eff.org"
+ },
+ "support_url": {
+ "en-US": "https://privacybadger.org/#faq"
+ },
+ "tags": [],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/",
+ "weekly_downloads": 16895
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 607454,
+ "authors": [
+ {
+ "id": 11423598,
+ "name": "Raymond Hill",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/11423598/",
+ "username": "gorhill",
+ "picture_url": null
+ }
+ ],
+ "average_daily_users": 4689051,
+ "categories": {
+ "android": [
+ "security-privacy"
+ ],
+ "firefox": [
+ "privacy-security"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2015-04-25T07:26:22Z",
+ "current_version": {
+ "id": 5119123,
+ "compatibility": {
+ "firefox": {
+ "min": "55.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "55.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/versions/5119123",
+ "files": [
+ {
+ "id": 3663488,
+ "created": "2020-10-20T09:53:20Z",
+ "hash": "sha256:500ecb79d9e65ff1c4d7cb3a34763c1dc2edc2b5a3f56b6c8ca225494a4535d6",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 2784234,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3663488/ublock_origin-1.30.6-an+fx.xpi",
+ "permissions": [
+ "dns",
+ "menus",
+ "privacy",
+ "storage",
+ "tabs",
+ "unlimitedStorage",
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "",
+ "http://*/*",
+ "https://*/*",
+ "file://*/*",
+ "https://easylist.to/*",
+ "https://*.fanboy.co.nz/*",
+ "https://filterlists.com/*",
+ "https://forums.lanik.us/*",
+ "https://github.com/*",
+ "https://*.github.io/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 6,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència GPL (General Public License) de GNU, version 3.0",
+ "cs": "GNU General Public License, verze 3.0",
+ "de": "GNU General Public License, Version 3.0",
+ "el": "GNU General Public License, έκδοση 3.0",
+ "en-US": "GNU General Public License, version 3.0",
+ "es": "Licencia pública GNU, versión 3.0",
+ "eu": "GNU General Public License, 3.0 bertsioa",
+ "fa": "مجوز عمومی کلی گنو، نسخهٔ ۳٫۰",
+ "ga-IE": "GNU General Public License, leagan 3.0",
+ "id": "GNU General Public License, versi 3.0",
+ "it": "Licenza GNU General Public License, versione 3.0",
+ "ja": "GNU General Public License バージョン 3.0",
+ "nl": "GNU General Public License, versie 3.0",
+ "pl": "General Public Licence, wersja 3.0",
+ "pt-PT": "GNU General Public License, versão 3.0",
+ "ru": "GNU General Public License, версия 3.0",
+ "sk": "GNU General Public License, verzia 3.0",
+ "sq": "Leje e Përgjithshme Publike GNU, version 3.0",
+ "uk": "GNU General Public License, версія 3.0",
+ "vi": "Giấy phép Công cộng GNU, phiên bản 3.0",
+ "zh-CN": "GNU 通用公共授权,版本 3.0",
+ "zh-TW": "GNU General Public License,版本 3.0"
+ },
+ "url": "http://www.gnu.org/licenses/gpl-3.0.html"
+ },
+ "release_notes": {
+ "en-US": "See release notes.\n\n## Fixed:\n\nPrevent set-constant from trapping non-configurable properties [regression]\n\nCommits history since 1.30.4."
+ },
+ "reviewed": null,
+ "version": "1.30.6"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "ar": "مانع إعلانات كفوء: خفيف على الذاكرة و المعالج, على الرغم من قدرته على تحميل و تطبيق الألاف من الفلاتر أكثر من بعض أشهر مانعي الإعلانات.\n\nتوضيح عام لكفاءة الإضافة: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nالإستخدام: زر التشغيل الكبير في النافذة المنبثقة هو لتعطيل أو تشغيل uBlock للموقع الحالي. هو ينطبق على الموقع الحالي فقط، و ليس زر تشغيل عام.\n\n***\n\nمع مرونته، هو أكثر من مجرد \"مانع إعلانات\": بإمكانه أيضا قراءة و إنشاء فلاتر من ملفات الإستقبال.\n\nفلاتر حديثة، هذه القوائم من الفلاتر يتم تحميلها و تطبيقها:\n\n- EasyList\n- قائمة خادم الإعلانات لـPeter Lowe\n- EasyPrivacy\n- نطاقات البرامج الضارة\n\nيوفر لك قوائم أكثر لتختار منها إذا كنت ترغب:\n\nقائم التتبع المحسنة لـFanboy\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- و الكثير من القوائم الأخرى.\n\nطبعا، كلما مكَّنتَ فلاتر أكثر، كلما ازداد أثرها على الذاكرة. حتى مع الرغم من إضافة القوائم الإضافية لـFanboy، و قوائم تتبع إعلان hpHost، ما زال بإمكان uBlock₀ العمل بأدنى أثر على الذاكرة أفضل من بعض أشهر قوائم التتبع.\n\nأيضا، كن على علم أن تحديد بعض من هذه القوائم الإضافية قد يؤدي إلى إمكانية أعلى لتعطيل المواقع -- خصوصا تلك القوائم التي تستخدم عادة كملفات مضيفة.\n\n***\n\nبدون وجود قوائم الفلترات, هذه الإضافة عديمة القيمة. إذن إن كانت لديك الرغبة في المساهمة، فكر في أولئك الذين يعملون بجد لصيانة قوائم الفلترات التي تستخدمها، التي تمت إتاحتها لك لتسخدمها مجَّاناََ.\n\n***\n\nمجاناً.\nمفتوح المصدر مع رخصة (GPLv3)\nللمستخدمين من طرف مستخدمين أخرين.\n\nالمساهمون في Github:\nhttps://github.com/gorhill/uBlock/graphs/contributors\nالمساهمون في Crowdin:\n https://crowdin.net/project/ublock\n\n***\n\nالإضافة في قيد الإنجاز، خذ هذا في عين الإعتبار عندما تستعرضها.\n\nسجل التغييرات للمشروع:\nhttps://github.com/gorhill/uBlock/releases",
+ "bg": "Ефикасен блокер: с малко използване на паметта и процесора, но същевременно способен да зарежда и налага хиляди допълнителни филтри в сравнение с други популярни блокери.\n\nИлюстрация на неговата ефикасност: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nИзползване: Големият бутон за \"Включване\" в изскачащият прозорец служи за трайно включване/изключване на uBlock за текущия сайт. Той се отнася само за текущия сайт, не е глобален бутон за включване.\n\n***\n\nГъвкав, той е повече от \"блокер на реклами\": може да чете и създава филтри от хост файлове.\n\nПри първоначално използване са заредени и наложени следните списъци с филтри:\n\n- EasyList\n- Списък с рекламни сървъри от Peter Lowe\n- EasyPrivacy\n- Вредоносни домейни\n\nAко желаете, на разположение са допълнителни списъци, които да изберете:\n\n- разширен проследяващ списък от Fanboy\n- хост файл от Dan Pollock\n- рекламни и проследяващи сървъри от hpHosts\n- MVPS HOSTS\n- Spam404\n- и много други\n\nРазбира се, колкото повече списъци включите, толкова по-голямо е използването на паметта. Въпреки това, дори и след добавяне на двата допълнителни списъка от Fanboy, рекламните и проследяващи сървъри от hpHosts, uBlock₀ използва по-малко памет в сравнение с други много популярни блокери.\n\nСъщо така, имайте предвид, че избирането на някои от допълнителните списъци може да доведе до по-голяма вероятност от неправилно функциониране на уебсайтове -- особено тези списъци, които по принцип се използват като хост файлове.\n\n***\n\nБез предварително зададените списъци с филтри, това разширение е нищо. Така че, ако някога наистина искате да допринесете с нещо, помислете за хората, работещи усилено по поддържането на списъците с филтри, предоставени ви за безплатно използване от всички.\n\n***\n\nБезплатно.\nОтворен код с публичен лиценз (GPLv3)\nЗа потребители от потребителите.\n\nСътрудници @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nСътрудници @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nТова е доста ранна версия, имайте го предвид, когато я разглеждате.\n\nСписък с промени на проекта:\nhttps://github.com/gorhill/uBlock/releases",
+ "bn-BD": "একটি দক্ষ প্রতিরোধক: মেমরি ও CPU-র পদচিহ্নের জন্য সহজ, এবং এখনো অন্যান্য জনপ্রিয় ব্লকার বা অবরোধকারীর থেকে হাজার হাজার অধিক ফিল্টারকে লোড এবং জোরদার করতে পারে।\n\nএটির কার্যকারিতার সচিত্র সংক্ষিপ্ত বিবরণ: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nব্যবহার: পপআপে বড় পাওয়ার বোতাম স্থায়ীভাবে বর্তমান ওয়েব সাইটের জন্য uBlock সক্রিয়/নিষ্ক্রিয় করবে। এটা শুধুমাত্র বর্তমান ওয়েব সাইটে প্রযোজ্য, এটি একটি বৈশ্বিক পাওয়ার বোতাম নয়।\n\n***\n\nমনীয়, এটি একটি \"ad blocker\"-এর ছেয়েও অধিক: এছাড়াও এটি হোস্ট ফাইল থেকে ফিল্টার পড়তে ও তৈরি করতে পারে।\n\nবাক্সের বাইরের, এই তালিকার ফিল্টারগুলি লোড করে এবং তা প্রয়োগ করে:\n\n- সহজ তালিকা\n- পিটার লো'য়ের বিজ্ঞাপন সার্ভারের তালিকা\n- সহজ গোপনীয়তা\n- ম্যালওয়্যার ডোমেইন\n\n আপনি যদি চান আপনি নির্বাচন করার জন্য আরো তালিকা পাবেন:\n\n- ফানবয়ের উন্নত ট্র্যাকিং তালিকা\n- Dan Pollock-এর হোস্ট ফাইল\n- hpHosts-এর বিজ্ঞাপন এবং ট্র্যাকিং সার্ভার\n- MVPS হোস্টসমূহ\n- স্প্যাম৪০৪\n- এবং আরও অনেক কিছু\n\nঅবশ্যই, যতবেশি ফিল্টার সক্রিয় করবেন, মেমরি পদচিহ্ন ততবেশি হবে। এমনকি Fanboy-এর দুটি অতিরিক্ত তালিকা, hpHosts-এর বিজ্ঞাপন এবং ট্র্যাকিং সার্ভার যোগ করার পরেও uব্লক অন্যান্য খুব জনপ্রিয় ব্লকারের থেকে কম মেমরি পদচিহ্ন ব্যবহার করে।\n\nএছাড়াও, এই অতিরিক্ত তালিকার কিছু নির্বাচন ওয়েব সাইট ভাঙ্গনের জন্য উচ্চ সম্ভাবনাময় হয়ে উঠতে পারে তাই সাবধান --- বিশেষকরে এই তালিকাগুলি যা সাধারণত হোস্ট ফাইল হিসেবে ব্যবহার করা হয়।\n\n***\n\nফিল্টারের পূর্বনির্ধারিত তালিকা ছাড়া, এই এক্সটেনশনটি কিছুই নয়। তাই কখনও যদি আপনি সত্যিই কিছু অবদান রাখতে চান, আপনার ব্যবহার করা ফিল্টার তালিকা রক্ষণাবেক্ষণের জন্য কঠোর পরিশ্রম করা সেই সব মানুষের করা কথা চিন্তা করুন যারা এই সব বিনামূল্যে ব্যবহারের জন্য উপলব্ধ করেছেন।\n\n***\n\nবিনামূল্যে।\nপাবলিক লাইসেন্সসহ মুক্ত উৎসের (GPLv3)\nব্যবহারকারীদের দ্বারা ব্যবহারকারীদের জন্য।\n\nঅবদানকারীগণ @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nঅবদানকারীগণ @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nএটি একটি প্রাথমিক সংস্করণ, আপনার পর্যালোচনার সময় তা মনে রাখুন।\n\nপ্রকল্পের পরিবর্তন লগ:\nhttps://github.com/gorhill/uBlock/releases",
+ "ca": "Un bloquejador eficient: el consum de memòria i de processador és baix però, no obstant això, pot carregar i aplicar milers de filtres més que altres bloquejadors coneguts.\n\nGràfic de l'eficiència: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nÚs: El gran botó d'engegada de la finestra emergent serveix per a desactivar/activar permanentment el uBlock per al lloc web actual. No és un botó d'engegada general de l'extensió.\n\n***\n\nFlexible, és més que un \"bloquejador d'anuncis\": també pot llegir i crear filtres a partir de fitxers hosts.\n\nPer defecte, es carreguen i s'apliquen aquestes llistes de filtres:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Dominis de malware\n\nSi voleu, podeu seleccionar altres llistes disponibles:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- I altres\n\nÒbviament, com més filtres activeu, més gran serà el consum de memòria. Però fins i tot després d'afegir dues llistes extra de Fanboy, hpHosts’s Ad and tracking servers, el uBlock₀ encara té un consum de memòria inferior al d'altres bloquejadors coneguts.\n\nTambé heu de ser conscient que seleccionant algunes d'aquestes llistes extra és més probable trobar-se amb llocs webs inservibles -- especialment aquelles llistes que s'utilitzen normalment com a fitxer de hosts.\n\n***\n\nSense les llistes predefinides de filtres, aquesta extensió no és res. Així que, si en cap moment voleu fer una aportació, penseu en les persones que treballen durament per a mantenir les llistes de filtres que utilitzeu, a disposició de tothom de manera gratuïta.\n\n***\n\nLliure.\nCodi obert amb llicència pública (GPLv3)\nPer usuaris per a usuaris.\n\nCol·laboradors a Github: https://github.com/gorhill/uBlock/graphs/contributors\nCol·laboradors a Crowdin: https://crowdin.net/project/ublock\n\n***\n\nAquesta és, en certa manera, una versió primitiva. Tingueu-ho en compte quan en doneu la vostra opinió.\n\nRegistre de canvis del projecte:\nhttps://github.com/gorhill/uBlock/releases",
+ "cs": "Efektivní blokovač: nezanechává velké stopy, nezatěžuje paměť a CPU, a přesto může načítat a využívat o několik tisíc filtrů více, než jiné populární blockery.\n\nGrafický přehled jeho účinnosti: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nPoužití: Velký vypínač ve vyskakovacím okně trvale povolí/zakáže uBlock pro otevřenou stránku. Funguje pouze pro aktivní webovou stránku, není to obecný vypínač.\n\n***\n\nFlexibilní, více než jen \"blokovač reklam\": umí také číst a vytvářet filtry z hosts souborů.\n\nPo instalaci jsou načteny a použity tyto filtry:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nPokud chcete, můžete si vybrat tyto další filtry:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- A mnoho dalších\n\nČím více filtrů je povoleno, tím je samozřejmě větší stopa v paměti. I přesto má ale uBlock₀ i po přidání dvou dalších seznamů od Fanboye a \"hpHosts’s Ad and tracking servers\" menší vliv na paměť než mnohé další velmi populární blockery.\n\nDále mějte na paměti, že vybírání více filtrů zvyšuje šanci chybného zobrazení webů -- především u seznamů, které se normálně používají jako hosts soubory.\n\n***\n\nBez předvolených seznamů filtrů by toto rozšíření bylo k ničemu. Pokud tedy opravdu budete chtít něčím přispět, myslete na lidi, kteří spravují Vámi používané seznamy filtrů a uvolňují je pro všechny zdarma.\n\n***\n\nSvobodný software.\nOpen source s veřejnou licencí (GPLv3)\nOd uživatelů pro uživatele.\n\nPřispěvatelé na Githubu: https://github.com/gorhill/uBlock/graphs/contributors\nPřispěvatelé na Crowdinu: https://crowdin.net/project/ublock\n\n***\n\nJde o poměrně ranou verzi, mějte to na paměti při recenzování.\n\nChange log projektu:\nhttps://github.com/gorhill/uBlock/releases",
+ "da": "En effektiv blocker: let på hukommelse og CPU forbrug,. Kan indlæse og anvende tusindvis af flere filtre end andre populære blockere derude.\n\nIllustreret oversigt over effektiviteten: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP :-Efficiency-compared\n\nAnvendelse: Den Store power knap i pop-up-vinduet kan permanent deaktivere/aktivere uBlock på det aktuelle websted. Dette gælder kun for det aktuelle websted, det er ikke en global afbryderknap.\n\n***\n\nFleksibel, det er mere end en \"ad blocker\": den kan også læse og oprette filtre fra hosts-filer.\n\nFra starten af er disse lister over filtre indlæst og anvendt:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nFlere lister er tilgængelige hvis du ønsker det:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Osv.\n\nSelvfølgelig vil flere aktive filtre betyde højere hukommelsesforbrug. Selv efter tilføjelse af Fanboys to ekstra lister, og hpHosts’s Ad and tracking server, har uBlock₀ stadig et lavere hukommelsesforbrug end andre blockere derude.\n\nVær desuden opmærksom på, at hvis du vælger nogle af disse ekstra lister kan det føre til højere sandsynlighed for, at webstedet bliver vist forkert - især de lister der normalt anvendes som hosts-fil.\n\n***\n\nUden de forudindstillede lister med filtre er denne udvidelse intet. Hvis du nogensinde virkelig ønsker at bidrage med noget, så tænk på de mennesker der arbejder hårdt for at vedligeholde de filterlister du bruger, som alle blev stillet gratis til rådighed for alle.\n\n***\n\nGratis.\nOpen source med offentlig licens (GPLv3)\nFor brugere, af brugere.\n\nBidragydere @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nBidragydere @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nDette er en tidlig version. Hav dette i tankerne når du skriver en anmeldelse.\n\nProjekt changelog:\nhttps://github.com/gorhill/uBlock/releases",
+ "de": "Ein effizienter Blocker: Geringer Speicherbedarf und niedrige CPU-Belastung - und dennoch werden Tausende an Filtern mehr angewendet als bei anderen populären Blockern.\n\nEin illustrierter Überblick über seine Effizienz: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nBenutzung: Der An-/Ausschaltknopf beim Klicken des Erweiterungssymbols dient zum An-/Ausschalten von uBlock auf der aktuellen Webseite. Dies wirkt sich also nur auf die aktuelle Webseite aus und nicht global.\n\n***\n\nuBlock ist flexibel, denn es ist mehr als ein \"Werbeblocker\": Es verarbeitet auch Filter aus mehreren hosts-Dateien.\n\nStandardmäßig werden folgende Filterlisten geladen und angewandt:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nAuf Wunsch können zusätzliche Listen ausgewählt werden:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- etc.\n\nNatürlich ist der Speicherbedarf umso höher, desto mehr Filter angewandt werden. Aber selbst mit den zwei zusätzlichen Listen von Fanboy und hpHosts’s Ad and tracking servers ist der Speicherbedarf von uBlock₀ geringer als bei anderen sehr populären Blockern.\n\nBedenke allerdings, dass durch die Wahl zusätzlicher Listen die Wahrscheinlichkeit größer wird, dass bestimmte Webseiten nicht richtig geladen werden - vor allem bei Listen, die normalerweise als hosts-Dateien verwendet werden.\n\n***\n\nOhne die vorgegebenen Filterlisten ist diese Erweiterung nichts. Wenn du also etwas beitragen möchtest, dann denke an die Menschen, die hart dafür arbeiten, die von dir benutzten Filterlisten zu pflegen, und diese für uns alle frei verfügbar gemacht haben.\n\n***\n\nKostenlos.\nOpen source mit Public License (GPLv3)\nFür Benutzer von Benutzern.\n\nMitwirkende @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nMitwirkende @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nDies ist eine ziemlich frühe Version - bitte denke daran, wenn du sie bewertest.\n\nChange log des Projekts:\nhttps://github.com/gorhill/uBlock/releases",
+ "el": "Ένας αποτελεσματικός αναστολέας διαφημίσεων: παρόλο το ελαφρύ του αποτύπωμα στη μνήμη και τον επεξεργαστή μπορεί να εφαρμόσει χιλιάδες περισσότερα φίλτρα σε σχέση με άλλους δημοφιλείς blockers.\n\nΑπεικονιζόμενη επισκόπηση της αποτελεσματικότητάς του: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nΧρήση: Το μεγάλο πλήκτρο απενεργοποίησης/ενεργοποίησης στο αναδυόμενο παράθυρο, χρησιμεύει στην εναλλαγή κατάστασης του uBlock για τον τρέχοντα ιστότοπο. Η εφαρμογή της ρύθμισης αυτής γίνεται μόνο για τον τρέχοντα ιστότοπο και δεν επιβάλλεται καθολικά.\n\n***\n\nΕυέλικτος, είναι πολλά περισσότερα από ένας απλός \"ad blocker\": μπορεί επιπλέον να διαβάζει και να δημιουργεί φίλτρα από αρχεία hosts.\n\nΚατά προεπιλογή, οι λίστες φίλτρων που φορτώνονται και επιβάλλονται είναι οι εξής:\n\n- EasyList\n- Λίστα διακομιστών διαφημίσεων του Peter Lowe\n- EasyPrivacy\n- Κακόβουλοι τομείς\n\nΕπιπλέον λίστες είναι διαθέσιμες για να επιλέξετε εάν το επιθυμείτε:\n\n- Ενισχυμένη Ιχνωσική Λίστα του Fanboy\n- Αρχείο hosts του Dan Pollock\n- Διαφημίσεις και διακομιστές ίχνωσης hpHosts\n- MVPS HOSTS\n- Spam404\n- και πολλές άλλες\n\nΦυσικά, όσο περισσότερα φίλτρα ενεργοποιούνται, τόσο αυξάνεται το αποτύπωμα της μνήμης. Ωστόσο, ακόμη και μετά από την προσθήκη δυο επιπλέον λιστών, του Fanboy και της λίστας διαφημίσεων και διακομιστών ίχνωσης hpHosts, το uBlock₀ συνεχίζει να έχει χαμηλότερο αποτύπωμα μνήμης από άλλους δημοφιλείς αναστολείς.\n\nΕπίσης, έχετε υπ'όψην ότι διαλέγοντας μερικές από τις έξτρα λίστες μπορεί να οδηγήσει σε πιθανό σφάλμα στην ιστοσελίδα -- ειδικά εκείνες που κανονικά χρησιμοποιούνται σαν host αρχεία.\n\n***\n\nΧωρίς τις υπάρχουσες λίστες φίλτρων, αυτή η επέκταση δεν έχει καμία αξία. Εάν ποτέ λοιπόν θελήσετε πραγματικά να συνεισφέρετε κάτι, αναλογιστείτε τους ανθρώπους που εργάζονται σκληρά για να διατηρήσουν τις λίστες φίλτρων που χρησιμοποιείτε, οι οποίες διατέθηκαν προς χρήση σε όλους, δωρεάν.\n\n***\n\nΔωρεάν.\nΑνοιχτού κώδικα με άδεια δημόσιας χρήσης (GPLv3)\nΑπό τους χρήστες για τους χρήστες.\n\nΣυνεισφέροντες @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nΣυνεισφέροντες @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nΕίναι μια αρκετά πρόωρη έκδοση, κρατήστε το υπόψη κατά την αξιολόγηση.\n\nΑρχείο αλλαγών του έργου:\nhttps://github.com/gorhill/uBlock/releases",
+ "en-US": "uBlock Origin is not an \"ad blocker\", it's a wide-spectrum content blocker with CPU and memory efficiency as a primary feature.\n\n***\n\nOut of the box, these lists of filters are loaded and enforced:\n\n- EasyList (ads)\n- Peter Lowe’s Ad server list (ads and tracking)\n- EasyPrivacy (tracking)\n- Malware domains\n\nMore lists are available for you to select if you wish:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- MVPS HOSTS\n- Spam404\n- And many others\n\nAdditionally, you can point-and-click to block JavaScript locally or globally, create your own global or local rules to override entries from filter lists, and many more advanced features.\n\n***\n\nFree.\nOpen source with public license (GPLv3)\nFor users by users.\n\nIf ever you really do want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free.\n\n***\n\n
",
+ "es": "Un bloqueador eficiente: capaz de cargar y aplicar miles más de filtros en comparación con otros populares bloqueadores, manteniendo un mínimo consumo de memoria y CPU.\n\nEjemplo con imágenes ilustrando su eficiencia (en inglés): https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUso: El botón grande de apagado/encendido en la ventana emergente de la extensión, es para deshabilitar/habilitar uBlock₀ permanentemente en el sitio web actual. Aplica solo al sitio web actual, no activa o desactiva la extensión de forma general.\n\n***\n\nFlexible, es más que un \"bloqueador de anuncios\": también puede leer y crear filtros desde archivos hosts.\n\nPor defecto ya trae configuradas las siguientes listas de filtros:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nOtras listas disponibles pueden ser seleccionadas, si se desea:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Y muchas más\n\nPor supuesto, mientras más filtros se activen, mayor será el consumo de memoria. No obstante, incluso después de agregar las dos listas adicionales de \"Fanboy's\" y la \"hpHosts’s Ad and tracking servers\", uBlock₀ consume menos memoria que otros bloqueadores similares.\n\nTambién tenga en cuenta que seleccionar algunas de estas listas adicionales puede conducir a una mayor probabilidad de aparición de problemas al mostrar un sitio web -- especialmente las listas utilizadas normalmente como archivo hosts.\n\n***\n\nSin las listas preestablecidas de filtros, esta extensión no sería nada. Así que si alguna vez realmente quieres aportar algo, piensa en las personas que trabajan duro para mantener estas listas de filtros, disponibles de forma gratuita para todos.\n\n***\n\nLibre.\nCódigo abierto con licencia pública (GPLv3)\nHecho para usuarios por los usuarios.\n\nColaboradores @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nColaboradores @ Crowdin: https://crowdin.com/project/ublock\n\n***\n\nRegistro de cambios del proyecto:\nhttps://github.com/gorhill/uBlock/releases",
+ "eu": "Blokeatzaile eraginkor bat: Memoria eta PUZ erabileran arina da, eta hala ere beste blokeatzaile ezagun batzuk baino milaka iragazki gehiago kargatu eta ezarri ditzake.\n\nBere eraginkortasunaren adibide grafikoa: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nErabilera: Laster-leihoko pizte botoi handia uBlock uneko gunean behin betiko gaitu edo desgaitzeko da. Uneko guneari dagokio soilik, ez da botoi orokor bat.\n\n***\n\nMalgua, iragarki blokeatzaile bat baino gehiago da, ostalarietako iragazkiak sortu eta irakurri ditzake ere.\n\nLehenetsita, honako iragazki zerrendak kargatu eta ezartzen ditu:\n\n- EasyList\n- Peter Loweren iragarki zerbitzarien zerrenda\n- EasyPrivacy\n- Malware domeinuak\n\nZerrenda gehiago dituzu eskura hautatzeko hala nahiez gero:\n\n- Fanboyren hobetutako jarraipen zerrenda\n- Dan Pollocken ostalari zerrenda\n- hpHostsen iragarki eta jarraipen zerbitzariak\n- MVPS Ostalariak\n- Spam404\n- Eta beste hainbat gehiago\n\nJakina, iragazki gehiago kargatuta memoria erabilera handiagoa da. Hala ere, Fanboyren bi zerrenda gehigarriak eta hpHostsen iragarki eta jarraipen zerbitzariak kargatuta, uBlockek beste blokeatzaile ezagun batzuk baino memoria gutxiago erabiltzen du.\n\nBestalde, kontuan izan zerrenda gehigarri hauetako batzuk gaitzeak guneren bat hausteko aukerak handitzen dituela, batez ere ostalari fitxategi gisa erabili ohi diren zerrendak.\n\n***\n\nLehenetsitako iragazki zerrendarik gabe gehigarri honek ez du ezer egiten. Beraz ezertan lagundu nahi baduzu pentsa ezazu erabiltzen dituzun iragazki zerrendak egunean mantentzeko tinko lanean dabiltzan horietan, guztiek erabiltzeko moduan doan eskuragarri jarri dituztenak.\n\n***\n\nDoan.\nLizentzia libreduna (GPLv3)\nErabiltzaileek erabiltzaileentzat sortua.\n\nParte-hartzaileak @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nParte-hartzaileak @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nNahiko berria da bertsio hau, kontua izan honi buruz idaztean.\n\nProiektuaren aldaketa egunkaria:\nhttps://github.com/gorhill/uBlock/releases",
+ "fa": "یک بلاکر موثر: نیاز به پردازش حافظه و سی پی یو کمتر و در عین حال اجرای هزاران فیلتر بیشتر از سایر رقبای بلاکر موجود.\n\nبررسی تصویری از کارایی این محصول: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nکاربرد: دکمه ی پاور بزرگ در پنجره برای فعال یا غیر فعال کردن uBlock برای صفحه ی جاری است. فقط برای همین سایت اعمال میشود، دکمه ی پاوری برای تمام سایت ها نیست.\n\n***\n\nانعطاف پذیری آن بیشتر از \"ad blocker\" است: همچنین می تواند فیلتر ها را از هاست میزبان، بخواند و بسازد.\n\nبیرون از جعبه، این لیست فیلترها بارگذاری و اجرا میشوند:\n\n- EasyList\n- لیست سرور تبلیغاتی Peter Lowe\n- EasyPrivacy\n-دامنه های تروجان\n\nاگر میخواهید لیست های بیشتر برای انتخاب شما در دسترس هستند:\n\n- ردیابی لیست پیشرفته ی Fanboy\n- میزبانی فایل Dan Pollock\n- تبلیغ و ردیابی سرور hpHosts\n- هاست های MVPS\n- اسپم 404\n- و بسیاری دیگر\n\nالبته هرچه فیلترهای بیشتری فعال باشند، حافظه ی بیشتری اشغال خواهد شد. با اینحال، حتی پس از اضافه کردن دو لیست اضافی Fanboy و سرور های ردیابی و تبلیغ hpHosts ، میبینیم که uBlock هنوز حافظه پایین تری از دیگر برنامه های مشابه اشغال میکند.\n\nهمچنین، بدانید که انتخاب برخی از این لیست ها ممکن است افزایش احتمال شکستگی وب سایت--به ویژه آنهایی که به طور معمول به عنوان میزبان فایل شناخته میشوند را در پی داشته باشد.\n\n***\n\nبدون فهرست از پیش تعیین شده ی فیلتر، این افزونه هیچ است. پس اگر واقعا می خواهید کمکی کرده باشید، به افرادی فکر کنید که برای حفظ لیست فیلتر مورد استفاده شما سخت کار میکنند که برای استفاده همه به رایگان در دسترس باشد.\n\n***\n\nرایگان.\nمتن باز با مجوز عمومی (GPLv3)\nبرای کاربران توسط کاربران.\n\nمشارکت کنندگان در گیت هاب: https://github.com/gorhill/uBlock/graphs/contributors\nمشارکت کنندگان در کرادین https://crowdin.net/project/ublock\n\n***\n\nاین کاملا یک نسخه اولیه است، هنگام بررسی اینرا بخاطر داشته باشید.\n\nتغییرات اخیر پروژه:\nhttps://github.com/gorhill/uBlock/releases",
+ "fi": "Tehokas mainosten estäjä – käyttää vähän resursseja, mutta silti voit ladata ja pakottaa tuhansia suodatinsääntöjä enemmän kuin muut suositut mainoksia estävät lisäosat.\n\nKuvitettu yleiskatsaus uBlockin tehokkuudesta (englanniksi): https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nKäyttö: Iso virtanappi ponnahdusikkunassa on tarkoitettu pysyvästi estämään/sallimaan uBlock kyseisellä sivulla. Tämä koskee vain nykyistä sivua, ei kaikkia sivuja.\n\n***\n\nJoustava, tämä lisäosa on enemmän kuin perinteinen \"mainosten estäjä\". Voit lukea ja luoda suodattimia myös hosts-tiedostoista.\n\nNämä suodatinlistat ovat automaattisesti ladattuna ja kytketty päälle:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nHalutessasi voit valita käyttöösi lisää listoja:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Ja monia muita\n\nJos sinulla on useita listoja käytössä, keskusmuistia kuluu enemmän. Tästä huolimatta, vaikka lisäisit Fanboyn kaksi lisälistaa ja hpHostsin listan, uBlockilla on silti pienempi muistinkulutus kuin muilla suosituilla mainosten estäjillä.\n\nUseiden listojen lisääminen saattaa aiheuttaa sivujen kaatumisen tai hajoamisen. Etenkin listat, joita käytetään normaalisti hosts-tiedostona, voivat aiheuttaa ongelmia.\n\n***\n\nTämä lisäosa ei tee mitään ilman suodatinlistoja. Jos siis haluat osallistua jotenkin, muistathan kaikki ne ihmiset jotka työskentelevät pitääkseen käyttämäsi suodatinlistat ajan tasalla ja saatavilla ilmaiseksi.\n\n***\n\nIlmainen.\nAvoimen lähdekoodin julkinen lisenssi (GPLv3)\nKäyttäjiltä käyttäjille.\n\nKehittäjät @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nKehittäjät @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nOtathan huomioon testatessasi, että käytössäsi on varsin varhainen versio.\n\nProjektin muutosloki:\nhttps://github.com/gorhill/uBlock/releases",
+ "fr": "uBlock est une extension qui bloque les publicités et les pisteurs, légère en empreinte mémoire et en utilisation du processeur et qui pourtant, est capable d'utiliser et de traiter des milliers de filtres de plus que la plupart des autres bloqueurs.\n\nConsultez cette page en Anglais pour avoir une vue d'ensemble illustrée de son efficacité : https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUtilisation : Le gros bouton power dans la fenêtre pop-up permet de désactiver/activer en permanence uBlock pour le site Web en cours de consultation. Cela s'applique uniquement au site Web actuel, ce n'est pas un bouton power qui affecte entièrement le fonctionnement de l'extension.\n\n***\n\nFlexible, uBlock ne prend pas en charge que les filtres de type Adblock, elle peut également lire et créer des filtres depuis des fichiers hosts.\n\nPar défaut, ces listes de filtrage sont chargées et traitées :\n\n- EasyList (Liste anti-publicités maintenue fréquemment à jour par la communauté)\n- Peter Lowe’s Ad server list (Liste de serveurs publicitaires maintenue à jour par Peter Lowe)\n- EasyPrivacy (Liste anti-pisteurs maintenue fréquemment à jour par la communauté)\n- Malware domains (Liste de protection contre des domaines malveillants)\n\nDavantage de listes sont disponibles si vous souhaitez renforcer le blocage :\n\n- Fanboy’s Enhanced Tracking List (Liste de protection avancée contre le pistage maintenue à jour par Fanboy)\n- Dan Pollock’s hosts file (Fichier Hosts bloquant publicités, domaines malveillants et autres pisteurs, maintenue fréquemment à jour par Dan Pollock)\n- hpHosts’s Ad and tracking servers (Fichier Hosts bloquant des serveurs publicitaires et des serveurs pistant, maintenue à jour par hpHosts)\n- MVPS HOSTS (Fichier Hosts bloquant publicités, domaines malveillants et autres pisteurs, maintenue à jour par MVPS)\n- Spam404 (Liste de protection contre les spams, maintenue fréquemment à jour par la communauté)\n- Et plein d'autres\n\nBien évidemment, plus vous activez de filtres, plus l'empreinte mémoire augmentera. Pourtant, même après avoir ajouté deux listes supplémentaires crées par Fanboy et le fichier Hosts d'hpHosts, uBlock₀ utilise moins de mémoire vive que tous les autres bloqueurs de pubs populaires.\n\nVeuillez tout de même prendre en compte que le fait de choisir parmi ces listes supplémentaires peut conduire à quelques incompatibilités sur les sites Web que vous visitez, bien que ces listes soient maintenues à jour par leurs auteurs.\n\n***\n\nSans les listes prédéfinies de filtres, cette extension (comme d'autres) ne serait rien. Alors si vous tenez vraiment à contribuer d'une quelconque manière, pensez aux personnes travaillant dur pour maintenir à jour ces listes de filtres que vous utilisez, qui plus est proposées gratuitement à tout le monde.\n\n***\n\nGRATUIT.\nSource libre avec une licence publique GPLv3\nFait par des utilisateurs pour des utilisateurs.\n\nContributeurs @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nContributeurs @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nIl s'agit d'une version relativement préliminaire, veuillez garder ça à l'esprit lors de votre évaluation de l'extension.\n\nConsultez ici en Anglais le Journal des changements concernant le projet :\nhttps://github.com/gorhill/uBlock/releases",
+ "he": "חוסם יעיל: חותמת נמוכה של המעבד והזיכרון, ועדיין יכול לטעון ולאפשר אלפי מסננים יותר מאשר חוסמים פופולריים אחרים.\n\nסקירה כוללת על היעילות שלו: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nשימוש: לחצן ההפעלה הגדול בחלון הפופאפ הוא בשביל לבטל/להפעיל את uBlock עבור האתר הנוכחי. הוא חל על האתר הנוכחי בלבד, זהו לא לחצן הפעלה גלובלי.\n\n***\n\nגמיש, יותר מ \"חוסם פרסומות\": הוא יכול גם לקרוא וליצור מסננים מקבצי hosts.\n\nהיישר מהקופסה, רשימות המסננים הללו נטענות ומאופשרות:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nרשימות נוספות אלו זמינות לבחירתך אם תרצה:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- ועוד רבים אחרים\n\nכמובן שככל שכמות מסננים גדולה יותר מופעלת, ככה גם חתימת הזיכרון גדולה יותר. ובכל זאת, אפילו לאחר הוספת שתי הרשימות הנוספות של Fanboy ו hpHosts’s Ad and tracking servers, ל uBlock עדיין יש חתימת זיכרון נמוכה יותר מלחוסמים פופולריים אחרים שם בחוץ.\n\nכמו כן, תהיה מודע שבחירה של חלק מהרשימות הנוספות הללו עלולה להוביל בסבירות גבוהה לשבירה של אתרי אינטרנט -- במיוחד הרשימות אשר בדרך כלל משומשות כקובץ hosts.\n\n***\n\nללא רשימות מסננים מוגדרים מראש, תוסף זה לא שווה כלום. אז אם אי פעם תרצה באמת לתרום משהו, תחשוב על האנשים שעובדים לילות כימים כדי לתחזק את רשימות המסננים שאתה משתמש בהן, אשר הובאו לשימוש על ידי כולם ללא כל תשלום.\n\n***\n\nחינם.\nקוד פתוח עם רשיון ציבורי (GPLv3)\nבשביל המשתמשים על ידי המשתמשים.\n\nתורמים @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nתורמים @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nקח בחשבון שזוהי גרסה מוקדמת בזמן הסקירה שלך.\n\nרשימת השינויים של הפרויקט:\nhttps://github.com/gorhill/uBlock/releases",
+ "hu": "Egy hatékony blokkoló: kíméletes a processzorral és a memóriával, mégis képes nagyságrendekkel több szűrő betöltésére és alkalmazására a többi népszerű blokkolóhoz viszonyítva.\n\nÁttekintés a hatékonyságáról: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nHasználat: A nagy bekapcsológomb a kiegészítő tiltására/engedélyezésére szolgál a jelenlegi webhelyen. A gomb kizárólag a jelenlegi webhelyre érvényes, nem egy globális kapcsoló.\n\n***\n\nTöbb mint egy egyszerű reklámblokkoló: képes hosts fájlok bejegyzéseit is értelmezni, és azokból szűrőket létrehozni.\n\nAlapértelmezetten a következő szűrőlisták kerülnek betöltésre és alkalmazásra:\n\n- EasyList\n- Peter Lowe hirdetési szerverlistája\n- EasyPrivacy\n- Kártékony domainek\n\nEgyéb listák is kiválaszthatók a felhasználó igénye szerint:\n\n- Fanboy bővített követők listája\n- Dan Pollock hosts fájlja\n- hpHosts hirdetés és követőszerverek listája\n- MVPS HOSTS\n- Spam404\n- És sok más\n\nTermészetesen, több szűrő használatával a memóriaigény is növekszik. Ennek ellenére Fanboy két extra listája és a hpHosts (reklám és követőszerverek) lista hozzáadásával a uBlock memóriafogyasztása még mindig alacsonyabb, mint a legnépszerűbb blokkolóké.\n\nEmellett, néhány extra lista kiválasztásával megnövekszik az esély arra, hogy a webhelyek használhatatlanná válnak -- főleg azon listákról van szó, melyek normál esetben hosts fájlként használatosak.\n\n***\n\nA szűrőlisták nélkül a kiegészítő nem sokat érne. Tehát, ha valaha is eszedbe jutna támogatást kínálni, akkor előbb gondolj azokra, akik keményen dolgoznak a listák karbantartásával, illetve ingyenesen hozzáférhetővé teszik azokat mindenki számára.\n\n***\n\nIngyenes.\nNyílt forráskódú nyilvános licenccel (GPLv3)\nFelhasználóknak felhasználóktól.\n\nKözreműködők a Github-on: https://github.com/gorhill/uBlock/graphs/contributors\nKözreműködők a Crowdin-en: https://crowdin.net/project/ublock\n\n***\n\nEz még egy elég korai verzió, amit illik szem előtt tartani értékeléskor.\n\nVáltozások listája:\nhttps://github.com/gorhill/uBlock/releases",
+ "id": "Pemblokir yang efisien: ringan penggunaan memori dan CPU, namun dapat memuat dan menjalankan ribuan filter lain dibanding pemblokir populer lain di luar sana.\n\nRingkasan ilustrasi efisiensi: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP :-Efficiency-Compared\n\nPenggunaan: Tombol daya yang besar dalam popup berfungsi menonaktifkan/mengaktifkan uBlock secara permanen untuk situs yang sedang dibuka. Berlaku untuk situs yang sedang dibuka saja, bukan tombol daya global.\n\n***\n\nFleksibel, lebih dari sekedar \"pemblokir iklan\": juga dapat membaca dan membuat filter dari berkas host.\n\nLangsung bekerja, daftar filter berikut ini dimuat dan dijalankan:\n\n- EasyList\n- Daftar server iklan Peter Lowe\n- EasyPrivacy\n- Domain malware\n\nJika anda ingin, masih banyak tersedia daftar lain untuk anda pilih:\n\n- Daftar Pelacakan Fanboy yang DItingkatkan\n- Berkas host Dan Pollock\n- Server iklan dan pelacakan hpHosts\n- HOST MVPS\n- Spam404\n- dan banyak lainnya\n\nTentu saja, semakin banyak filter yang diaktifkan, semakin besar penggunaan memori. Namun, bahkan setelah menambahkan 2 daftar ekstra Fanboy, server iklan dan pelacakan hpHosts, penggunaan memori uBlock masih lebih kecil dibanding pemblokir iklan populer lain di luar sana.\n\nPerlu diketahui juga bahwa memilih beberapa daftar ekstra juga berpeluang lebih tinggi menyebabkan kerusakan situs -- terutama daftar yang biasanya digunakan sebagai berkas host.\n\n***\n\nTanpa daftar filter yang ada, ekstensi ini bukanlah apa-apa. Jadi, jika Anda benar-benar ingin berkontribusi sesuatu, berpikirlah tentang orang-orang yang bekerja keras mengelola daftar filter yang anda gunakan, yang dibuat dan tersedia untuk digunakan oleh semua dengan gratis.\n\n***\n\nGratis.\nSumber terbuka dengan lisensi publik (GPLv3)\nUntuk pengguna oleh pengguna.\n\nKontributor @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nKontributor @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nMasih dalam versi yang sangat awal, mohon diingat ketika anda membuat ulasan.\n\nCatatan perubahan proyek:\nhttps://github.com/gorhill/uBlock/releases",
+ "it": "uBlock è un efficiente ad-blocker: occupa poca memoria e poca CPU, ma può usare migliaia di filtri in più rispetto ad altri software simili.\n\nConsulta questa pagina (in inglese) per verificare la sua efficacia https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUso: il pulsante power nel popup serve per disabilitare/abilitare permanentemente uBlock nel sito che stai visitando. e non serve per disabilitare/abilitare l'estensione.\n\n***\n\nMolto più che un ad-blocker: può anche creare filtri dal file host.\n\nPer default sono attivate queste liste:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nPuoi anche attivare moltre altre liste:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Ecc.\n\nOvviamente, più liste attivi, maggiore sarà l'impatto sulla memoria. Anche aggiungendo altre due liste di Fanboy, ad di hpHosts e tracking server, uBlock userà meno memoria di molti altri ad-blocker.\n\nSelezionando alcuni di questi filtri può portare ad una maggiore probabilità di problemi nel visualizzare alcuni siti web.\n\n***\n\nSenza queste liste di filtri, questa estensione non è niente. osì se vuoi contribuire, pensa alle persone che lavorano duramente per mantenere queste liste che stai usando, che sono disponibili gratuitamente.\n\n***\n\nGratuito.\nOpen source with public license (GPLv3)\nFatto dagli utenti per gli utenti.\n\nCollaboratori @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nCollaboratori @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nQuesta è una versione preliminare, ricordalo quando scriverai una recensione.\n\nPer leggere le novità di ogni versione consulta questa pagina (In Inlgese):\nhttps://github.com/gorhill/uBlock/releases",
+ "ja": "効率的なブロッカー:コンピュータのメモリとCPUのフットプリントはより少なく\n、別の人気のブロッカーよりも何千ものフィルタをロードし、強制的にブロックができます\n\n他ソフトとの比較は以下のとおり: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\n使用法: ポップアップに表示される大きな電源ボタンは、現在のサイトでuBlockの有効/無効を切り替えます。 現在のサイトのみに適用されます、グローバルボタンではありません。\n\n***\n\nただの「広告ブロッカー」より柔軟です:ホストファイルを読み込みフィルターを作成できます。\n\n要するに、以下のフィルターが読み込まれ、適用されます:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nご希望であればさらに多くのリストがご利用できます:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Etc.\n\nもちろん、多くのフィルターを適用すれば使用メモリーは増えます。 ただ、それでも、Fanboy's Special Blocking List、Fanboy's Enhanced Tracking List、hpHost's Ad and tracking serversの三つのリストを追加で適用しても、uBlockは他の人気のブロッカーより少ないメモリー消費を実現しています。\n\nそれと、多くのリストの適用は(特にホストファイルとしてよく使われているリスト)ウェブサイトの崩壊を起こしかねないことに注意してください。\n\n***\n\nこの拡張機能は、あらかじめ設定されているフィルターのリストが無ければ意味を成しません。 ですので、何かしらの形で貢献したいと考えることがあった時は、これらのリストを無料で懸命に更新し続けている方々を思い出してください。\n\n***\n\n無料.\nパブリックライセンス(GPLv3)のオープンソース\nユーザーによって作られた、ユーザーのための物。\n\n貢献者 @ Github: https://github.com/gorhill/uBlock/graphs/contributors\n貢献者 @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nこれは割と初期のバージョンですので、それを念頭にレビューをお願いします。\n\nプロジェクト変更ログ:\nhttps://github.com/gorhill/uBlock/releases",
+ "ka": "რეკლამების შედეგიანი შემზღუდავი: მეხსიერებისა და პროცესორის შემსუბუქებული მოხმარება, რეკლამების სხვა შემზღუდავებთან შედარებით, ათასობით მეტი ფილტრის გამოყენების პირობებშიც კი.\n\nშედეგიანობის მიმოხილვა იხილეთ ბმულზე: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nგამოყენება: ჩართვის დიდი ღილაკით, ჩამოშლილ მენიუში, შესაძლებელია uBlock-ის ჩართვა/გამორთვა მიმდინარე ვებსაიტზე. ეს ღილაკი მოქმედებს მხოლოდ არსებულ საიტზე და არ გამოიყენება ზოგადად ჩართვა/გამორთვისთვის.\n\n***\n\nმეტად მოქნილი, ეს არაა უბრალოდ „რეკლამების შემზღუდავი“: ასევე შესაძლებელია hosts ფაილის წაკითხვა და ფილტრების შექმნა.\n\nგარდა ამისა, ნაგულისხმევად ჩართულია და გამოიყენება შემდეგი გასაფილტრი სიები:\n\n- EasyList\n- Peter Lowe-ის სარეკლამო სერვერების სია\n- EasyPrivacy\n- მავნე დომენები\n\nასევე, ხელმისაწვდომია სიები სურვილისამებრ შესარჩევად:\n\n- Fanboy-ის გაუმჯობესებული წესები თვალყურისმდევნებლების შესაზღუდად\n- Dan Pollock-ის hosts ფაილი\n- hpHosts-ის სარეკლამო და თვალყურისმდევნელი სერვერები\n- MVPS HOSTS\n- Spam404\n- და კიდევ ბევრი\n\nრასაკვირველია, რაც უფრო მეტი ფილტრია ჩართული, მეხსიერების გამოყენება იზრდება. თუმცა, Fanboy-ის გაფართოებული წესების, hpHosts-ის სარეკლამო და თვალყურისმდევნელი სერვერების დამატების შემთხვევაშიც კი, uBlock მაინც ნაკლებ მეხსიერებას იყენებს, ვიდრე ყველა სხვა ცნობილი შემზღუდავი პროგრამები.\n\nამასთან, გაითვალისწინეთ, რომ ზოგიერთი დამატებითი წესების შერჩევის შედეგად, შესაძლოა ვებსაიტები არ გამოჩნდეს გამართულად -- განსაკუთრებით იმ წესების შემთხვევაში, რომელიც ჩვეულებრივ, hosts ფაილად გამოიყენება.\n\n***\n\nწინასწარ შედგენილ წესებს, მნიშვნელოვანი ადგილი უჭირავს ამ გაფართოების შედეგიან მუშაობაში. ასე რომ, თუ ოდესმე გადაწყვეტთ ვინმესთვის შემოწირულობის გაღებას, იფიქრეთ იმ ადამიანებზე, რომლებიც თავდაუზოგავად შრომობენ იმ გასაფილტრი წესების მუდმივ განახლებაზე, რომლითაც სარგებლობთ და რომელიც ხელმისაწვდომია ყველასთვის უფასოდ.\n\n***\n\nუფასო.\nღია წყაროს მქონე საჯარო ლიცენზიით (GPLv3)\nმომხმარებლების მიერ, მომხმარებლებისთვის.\n\nწვლილის შემტანები @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nწვლილის შემტანები @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nცვლილებების ჩამონათვალი:\nhttps://github.com/gorhill/uBlock/releases",
+ "ko": "효율적인 차단기: 메모리와 CPU에 부담이 적고, 다른 인기있는 차단기에 비해 수 천 가지의 필터를 사용할 수 있습니다.\n\n효율성에 대한 소개: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\n사용 방법: 해당 웹사이트에서 팝업의 큰 전원 버튼을 눌러 uBlock을 켜고 끌 수 있습니다. 적용은 현재 웹사이트만 적용되며, 전체적으로 적용되지 않습니다.\n\n***\n\n\"AdBlocker\" 보다 더 유연합니다: 호스트 파일들로부터 필터를 만들고 볼 수 있습니다.\n\n특별한 설치 없이도 아래 목록들을 불러오고 적용할 수 있습니다:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\n당신이 원한다면 더 많은 목록을 선택할 수 있습니다:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- 그리고 무수히 많은 다른 목록들\n\n물론, 더 많은 필터를 활성화하면 할수록, 메모리 사용량도 높아집니다. 하지만 Fanboy's two extra lists와 hpHosts’s Ad and tracking servers 필터를 추가한 후에도 uBlock₀은 다른 인기있는 차단기에 비해 메모리 사용량이 적습니다.\n\n또, 이러한 일부 추가 목록(특히 일반적으로 사용되는 호스트 파일) 중 선택시 높은 확률로 웹사이트가 파손될 수 있음을 명심해주시기 바랍니다.\n\n***\n\n필터에 필터 목록이 하나도 없다면, 이 확장기능은 아무 쓸모가 없어집니다. 그래서 만약 당신이 정말 어떤것으로든 기여하고 싶을때는, 당신이 사용중인 필터 리스트를 만들고 유지하기 위해 노력중인 사람들을 생각해주세요. 필터들은 모두 무료로 사용이 가능하게 되어있습니다.\n\n***\n\n완전히 무료입니다.\n오픈소스이며, 공개 라이센스(GPLv3)를 따릅니다.\n사용자를 위해, 사용자에 의해 만들어졌습니다.\n\n기여자 @ Github: https://github.com/gorhill/uBlock/graphs/contributors\n기여자 @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\n이것은 완전히 초기 버전입니다, 리뷰할 때 이 점을 명심하세요.\n\n프로젝트 변경사항:\nhttps://github.com/gorhill/uBlock/releases",
+ "nl": "Een efficiënte adblocker: gebruikt weinig processorkracht en geheugen. Toch kan het duizenden filters meer laden en toepassen dan andere populaire adblockers.\n\nGeïllustreerde efficiëntievergelijking: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nGebruik: met de grote aan-uitknop in de pop-up kan uBlock voor de huidige website permanent worden in- of uitgeschakeld. Het wordt alleen op de huidige website toegepast; dit is geen algemene aan-uitknop.\n\n***\n\nFlexibel, want het is meer dan een ‘adblocker’: het kan ook filters inlezen en aanmaken vanuit hosts-bestanden.\n\nStandaard worden de volgende filterlijsten geladen en toegepast:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nEr zijn meer lijsten beschikbaar die u kunt inschakelen:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- en nog vele andere...\n\nNatuurlijk wordt het geheugengebruik groter naarmate er meer filters worden ingeschakeld. Maar zelfs na het inschakelen van Fanboy’s twee extra lijsten, hpHosts’s Ad en tracking servers, heeft uBlock een lager geheugengebruik dan andere populaire blockers.\n\nLet op, het gebruik van sommige van deze extra lijsten verhoogt de kans dat websites niet goed worden weergegeven - zeker de lijsten die normaal als hosts-bestand worden gebruikt.\n\n***\n\nZonder de standaard filterlijsten doet deze extensie niets. Als u dus ooit echt een bijdrage wilt leveren, denk dan aan de mensen die hard werken om de filterlijsten die u gebruikt te onderhouden, welke allemaal gratis beschikbaar zijn gemaakt.\n\n***\n\nVrij.\nOpen source met publieke licentie (GPLv3)\nVoor gebruikers, door gebruikers.\n\nMedewerkers @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nMedewerkers @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nOnthoud dat dit een hele vroege versie is wanneer u een beoordeling geeft.\n\nProjectwijzigingenlogboek:\nhttps://github.com/gorhill/uBlock/releases",
+ "pl": "Skutecznie blokuje reklamy, używa mało pamięci RAM i zasobów procesora, a przy tym może wczytywać i stosować o wiele więcej filtrów niż inne popularne rozszerzenia do blokowania reklam.\n\nIlustrowane porównanie z dodatkiem Adblock Plus: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nSposób użycia: wyświetlany w małym wyskakującym oknie przycisk służy do włączenia/wyłączenia rozszerzenia na bieżącej witrynie internetowej. Działanie przycisku ma zastosowanie tylko na bieżącej witrynie – nie działa globalnie.\n\n***\n\nElastyczny. Jest czymś więcej niż „blokerem reklam”. Może czytać i tworzyć filtry z plików hostów.\n\nPo zainstalowaniu są wczytywane i stosowane następujące listy filtrów:\n\n- EasyList\n- Lista serwerów reklam Petera Lowe'a\n- EasyPrivacy\n- Domeny ze złośliwym oprogramowaniem\n\nMożna wybrać więcej list filtrów:\n\n- Rozszerzona lista śledzenia dla fanboyów\n- Plik hostów Dana Pollocka\n- Serwery reklam i śledzenia hpHosts\n- MVPS HOSTS\n- Spam404\n- I wiele innych\n\nIm więcej filtrów jest włączonych, tym większe jest użycie pamięci RAM. Nawet po dodaniu dwóch dodatkowych list filtrów dla fanboyów – listy serwerów reklamowych i śledzących hpHosts – µBlock₀ używa mniej pamięci RAM niż inne popularne dodatki do blokowania reklam.\n\nNależy pamiętać, że wybranie niektórych dodatkowych list może prowadzić do wzrostu prawdopodobieństwa uszkodzenia witryny internetowej – zwłaszcza tych list, które są zwykle używane jako plik hostów.\n\n***\n\nBez zaprogramowanej listy filtrów, to rozszerzenie jest bezwartościowe. Pomyśl zatem o osobach, które ciężko pracują, tworząc i utrzymując udostępniane za darmo używane przez Ciebie listy filtrów.\n\n***\n\nDarmowe rozszerzenie.\nKod źródłowy udostępniany na otwartej licencji (GPLv3)\nDla użytkowników przez użytkowników.\n\nWspółtwórcy rozszerzenia: https://github.com/gorhill/uBlock/graphs/contributors\nAutorzy tłumaczeń: https://crowdin.com/project/ublock/translators\n\n***\n\nOceniając rozszerzenie pamiętaj, że jest to jego wczesna wersja.\n\nDziennik zmian:\nhttps://github.com/gorhill/uBlock/releases",
+ "pt-BR": "Um bloqueador eficaz: Com baixo consumo de memória e CPU e ainda pode carregar e aplicar milhares de filtros. Mais do que outros bloqueadores populares lá fora.\n\nVisão geral ilustrada de sua eficiência: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP :-Efficiency-compared\n\nUtilização: Use o botão de energia no pop-up para desativar/ativar o uBlock₀ para o site atual. Isso se aplica apenas ao site atual, não é um botão global.\n\n***\n\nFlexível, é mais do que um \"ad blocker\": também pode ler e criar filtros a partir de arquivos de hosts.\n\nPor padrão, essas listas de filtros são carregadas e aplicadas:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nMais listas estão disponíveis para você escolher, se desejar:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- E varios outros\n\nClaro, quanto mais filtros habilitados, maior o consumo de memória. Ainda, mesmo após a adição do Fanboy's duas listas extras, hpHosts’s e servidores de rastreamento, uBlock₀ ainda tem o consumo de memória menor do que outros bloqueadores populares lá fora.\n\nTambém, esteja ciente de que selecionar algumas dessas listas extras pode levar à maior probabilidade de quebra do layout do site, especialmente aquelas listas que são normalmente usadas como arquivo hosts.\n\n***\n\nSem as listas predefinidas de filtros, esta extensão não é nada. Então, se você realmente quiser contribuir com alguma coisa, pense sobre as pessoas que trabalham duro para manter as listas de filtro que você está usando, que estão disponíveis de graça para todos.\n\n***\n\nGratuito\nCódigo aberto com licença pública (GPLv3)\nDe usuários para usuários.\n\nContribuidores no Github: https://github.com/gorhill/uBlock/graphs/contributors\nContribuidores no Crowdin: https://crowdin.net/project/ublock\n\n***\n\nEssa é uma versão ainda em desenvolvimento, tenha isso em mente quando você avaliar.\n\nRegistro de alterações do projeto:\nhttps://github.com/gorhill/uBlock/releases",
+ "pt-PT": "Um bloqueador eficiente: leve na memória e CPU e, no entanto, consegue carregar e aplicar milhares de filtros a mais do que outros bloqueadores populares disponíveis.\n\nVisão geral ilustrada da sua eficiência:\nhttps://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUtilização: O botão grande de energia na janela serve para desativar ou ativar, permanentemente, o uBlock para o sítio web atual. Aplica-se unicamente ao sítio web atual, não sendo um botão de energia global.\n\n***\n\nFlexível, é mais do que um bloqueador de anúncios. Pode também ler e criar filtros a partir de ficheiros de servidores.\n\nPor predefinição, estas listas de filtros são carregadas e aplicadas:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nSe quiser, estão disponíveis mais listas para seleção:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- E muitas mais\n\nObviamente que quanto maior o número de filtros ativos, maior será o consumo de memória. No entanto, mesmo após adicionar as duas listas extra do Fanboy, hpHosts Ad and tracking servers, o uBlock₀ continua a consumir menos memória do que outros bloqueadores populares disponíveis.\n\nEsteja ciente de que se selecionar mais listas extra pode resultar numa probabilidade acrescida de rutura em alguns sítios web -- especialmente nas listas que, normalmente, são utilizadas como ficheiros de servidores.\n\n***\n\nSem as listas de filtros predefinidas, esta extensão não é nada. Se realmente quiser contribuir com algo, pense nas pessoas que trabalham duro para manter as listas de filtros que usa, que foram tornadas disponíveis para uso por todos sem custos.\n\n***\n\nGrátis.\nCódigo aberto com licença pública (GPLv3)\nDe utilizadores para utilizadores.\n\nContribuidores @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nContribuidores @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nEsta é uma versão inicial, tenha isso em mente quando avaliar.\n\nRegisto de alterações do projeto:\nhttps://github.com/gorhill/uBlock/releases",
+ "ro": "Un blocant (paravan) eficient: folosește foarte puțin procesorul și memoria și totuși poate încărca și aplica mii de filtre în plus față de alte paravane populare.\n\nO ilustrare a eficienței poate fi observată la:\nhttps://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUtilizare: Butonul mare de pornire/oprire în fereastra paravanului este pentru a activa/dezactiva uBlock pentru saitul curent. Funcția este valabilă doar pentru saitul curent, nu la nivel global.\n\n***\n\nFlexibil, mai mult decât un „blocant de reclame”: acesta poate citi și crea filtre din fișierele de gazde (hosts).\n\nÎn mod implicit, aceste liste de filtre sunt încărcate și aplicate:\n\n- EasyList\n- Lista serverelor de reclame a lui Peter Lowe\n- EasyPrivacy\n- Domenii malițioase\n\nDe asemenea, mai sunt disponibile și alte liste precum:\n\n- Lista îmbunătățită pentru urmărire a lui Fanboy\n- Lista de gazde a lui Dan Pollock\n- Lista de reclame și urmărire hpHosts\n- Gazdele MVPS\n- Spam404\n- Și multe altele\n\nDesigur, cu cât sunt mai multe filtre active cu atât mai mult este utilizată memoria. Totuși, chiar și după adăugarea în plus a două liste Fanboy și lista de reclame și urmărire hPhosts, uBlock₀ tot folosește mai puțină memorie decât restul paravanelor.\n\nDe ținut minte, că odată cu selectarea în plus a unora dintre liste se poate ajunge la afectarea aspectului saiturilor -- în special listele care sunt în mod normal liste de gazde.\n\n***\n\nFără listele prestabilite de filtre această extensie nu face nimic. Așadar, dacă totuși vreți să contribuiți, gândiți-vă la persoanele care muncesc să întrețină aceste filtre pe care le utilizați, care sunt oferite pentru utilizare gratuită.\n\n***\n\nGratuit.\nCu sursă liberă și licență publică (GPLv3)\nPentru utilizatori de la utilizatori.\n\nContribuitori pe Github: https://github.com/gorhill/uBlock/graphs/contributors\nContribuitori pe Crowdin: https://crowdin.net/project/ublock\n\n***\n\nEste încă o aplicație recentă, gândiți-vă la acest lucru când scrieți o recenzie.\n\nLista de schimbări a proiectului:\nhttps://github.com/gorhill/uBlock/releases",
+ "ru": "µBlock — эффективный блокировщик: он использует меньше оперативной памяти и меньше нагружает ЦП, при этом используя больше фильтров, чем другие популярные блокировщики.\n\nИллюстрированный обзор его эффективности: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nИспользование: нажмите большую кнопку «Включение» в выпадающем окне, чтобы включить или отключить uBlock для текущего сайта. Это действует только для текущего сайта, а не для всех.\n\n***\n\nБудучи гибким, это нечто большее, чем просто «блокировщик рекламы»: он также может считывать и создавать фильтры из хост-файлов.\n\nПо умолчанию следующие списки фильтров будут загружены и применены:\n\n- EasyList\n- Список рекламных серверов Питера Лоу\n- EasyPrivacy\n- Вредоносные домены\n\nТакже на выбор доступны другие списки:\n\n- Фанатский улучшенный список отслеживания\n- Хост-файл Дэна Поллока\n- Рекламные и отслеживающие сервера hpHosts\n- MVPS HOSTS\n- Spam404\n- И т. д.\n\nКонечно, чем больше фильтров, тем выше использование памяти. Тем не менее даже после добавления трёх дополнительных списков uBlock₀ всё ещё потребляет меньше памяти, чем другие популярные блокировщики.\n\nТакже имейте в виду, что некоторые их этих списков имеют высокую вероятность поломать веб-сайт, особенно те, что созданы из хост-файлов.\n\n***\n\nБез предустановленных списков фильтров это расширение — ничто. Так что, если вы действительно хотите внести свой вклад, подумайте о людях, усердно поддерживающих списки фильтров, предоставленные Вам для бесплатного использования.\n\n***\n\nБесплатно.\nОткрытый исходный код, публичная лицензия (GPLv3).\nДля пользователей от пользователей.\n\nУчастники на Github: https://github.com/gorhill/uBlock/graphs/contributors\nУчастники на Crowdin: https://crowdin.net/project/ublock\n\n***\n\nЭто ещё очень ранняя версия, имейте это в виду, оценивая программу.\n\nСписок изменений:\nhttps://github.com/gorhill/uBlock/releases",
+ "sk": "Účinný blokovač: nezaťažuje CPU a pamäť a dokáže načítať a vynútiť o niekoľko tisíc filtrov viac ako iné populárne blokovače.\n\nIlustrovaný prehľad o jeho účinnosti: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nPoužitie: Veľký vypínač vo vyskakovacom okne natrvalo zakáže/povolí uBlock pre aktuálnu webovú stránku. Vzťahuje sa len na aktuálnu webovú stránku, nie na všeobecný vypínač.\n\n***\n\nFlexibilný, je viac než len \"blokovač reklám\": dokáže tiež načítať a vytvárať filtre z hosts súborov.\n\nTieto zoznamy filtrov sú predvolene načítané a vynútené:\n\n- EasyList\n- Zoznam reklamných serverov od Petra Lowesa\n- EasyPrivacy\n- Domény malvéru\n\nĎalšie zoznamy sú k dispozícii pre vás na výber, ak si prajete:\n\n- Rozšírený stopovací zoznam od Fanboya\n- Hosts súbor od Dana Pollocka\n- Reklamné a stopovacie servery od hpHosts\n- MVPS HOSTS\n- Spam404\n- A mnoho ďalších\n\nSamozrejme, čím viac povolených filtrov, tým vyššie nároky na pamäť. Aj po pridaní dvoch ďalších zoznamov od Fanboya, reklamných a stopovacích serverov od hpHost má uBlock stále menšie nároky na pamäť ako mnohé ďalšie veľmi populárne blockovače.\n\nĎalej majte na pamäti, že výber viacerých filtrov zvyšuje šancu chybného zobrazenie webov - predovšetkým u zoznamov, ktoré sa normálne používajú ako hosts súbory.\n\n***\n\nBez predvolených zoznamov filtrov by bolo toto rozšírenie k ničomu. Ak teda naozaj budete chcieť niečím prispieť, myslite na ľudí, ktorí spravujú vami používané zoznamy filtrov a uvoľňujú ich pre všetkých zadarmo.\n\n***\n\nBezplatný.\nOtvorený zdrojový kód s verejnou licenciou (GPLv3)\nPre používateľov od používateľov.\n\nPrispievatelia @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nPrispievatelia @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nIde o pomerne skorú verziu, majte to na pamäti pri recenzovaní.\n\nZoznam zmien projektu:\nhttps://github.com/gorhill/uBlock/releases",
+ "sl": "Efektiven zatiralec oglasov: lahek na pomnilniku in procesorju, in vendar lahko nalaga in uveljavlja tisoče filtrov več kot kakšen drug popularen dodatek za blokiranje oglasov.\n\nIlustrirana efektivnost: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nUporaba: Velik gumb za vklop/izklop v pojavnem oknu je namenjen trajnemu izklopu/vklopu uBlock₀ za trenutno spletno stran. Ta uporaba velja samo za trenutno spletno stran, tako da gumb ne predstavlja globalnega vklopa/izklopa.\n\n***\n\nuBlock₀ je fleksibilen - in s tem več kot samo \"blokada oglasom\": lahko bere in ustvarja filtre iz datotek z gostitelji (HOSTS datoteka).\n\nBrez kakršnihkoli dodatnih nastavitev, uBlock₀ uporablja sledeče filtre:\n\n- EasyList\n- Seznam oglaševalskih strežnikov Peter Lowe\n- EasyPrivacy\n- Zlonamerne domene\n\nVeč filtrskih seznamov na razpolago (če to želite):\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- In mnogi drugi\n\nSeveda, več filtrov kot je aktivnih, večji je odtis v pomnilniku. Pa kljub temu - tudi z nalaganjem dveh dodatnih seznamov filtrov (Fanboy in hpHosts) ima uBlock₀ še vedno nižjo mero obremenitve pomnilnika kot ostali zelo popularni dodatki za blokiranje oglasov.\n\nPoleg tega bodite pozorni, da vklop določenih dodatnih seznamov filtrov lahko pripelje do višje verjetnosti za nefunkcionalnost spletne strani - predvsem \"ogrožajoči\" so tisti seznami, ki se jih ponavadi uporablja kot HOSTS datoteko.\n\n***\n\nBrez prednastavljenih seznamov filtrov, da dodatek ni nič. Tako da, če res želite kje pomagati ali komu plačati kavo, pomislite na ljudi, ki trdo delajo, da vzdržujejo te sezname filtrov, ki jih uporabljate, in so jih naredili dosegljive zastonj in za vse.\n\n***\n\nZastonj.\nOdprtokodno pod GPLv3 licenco\nZa uporabnike od uporabnikov.\n\nRazvijalci @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nPrevajalci @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nGre še za dokaj sveže različice, prosimo da to upoštevate pri vaši kritiki.\n\nDnevnik sprememb projekta:\nhttps://github.com/gorhill/uBlock/releases",
+ "sq": "Një bllokues efikas: me impakt të vogël te memorja dhe procesori, por mund të hapë dhe të zbatojë mijëra filtra më shumë sesa bllokuesit e tjerë të njohur.\n\nPërmbledhje e ilustruar e efikasitetit të tij: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nPërdorimi: Çelësi i komandimit te dritarja e vogël e bën uBlock përherë joaktiv/aktiv për uebsajtin aktual. Ai vlen vetëm për uebsajtin aktual, nuk është një çelës i përgjithshëm.\n\n***\n\nËshtë fleksibël dhe jo thjesht një \"bllokues reklamash\": mund të lexojë dhe të krijojë filtra nga skedat \"hosts\".\n\nFiltrat e listuar këtu hapen dhe zbatohen pas instalimit:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nPo të doni, ka edhe shumë lista të tjera të gatshme:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- Dhe shumë të tjera\n\nSigurisht që sa më shumë filtra të aktivizoni, aq më i madh do të jetë impakti te memorja. Edhe me shtimin e dy listave shtesë të Fanboy, hpHosts’s Ad and tracking servers, uBlock përsëri ka impakt më të ulët në memorje sesa bllokuesit e tjerë shumë të njohur.\n\nPor, kujdes, sepse duke përzgjedhur disa prej këtyre listave, gjasat që faqet të shfaqin probleme do të jenë më të mëdha -- sidomos listat që normalisht përdoren si skeda \"hosts\".\n\n***\n\nPa listat e programuara, ky program nuk vlen për asgjë. Prandaj, po të doni të kontribuoni diçka, mendoni pak për njerëzit që punojnë fort për mirëmbajtjen e listave me filtra që po përdorni, të cilat na ofrohen të gjithëve pa pagesë.\n\n***\n\nFalas.\nMaterial i hapur me licencë publike (GPLv3)\nKrijuar nga përdoruesit për përdoruesit.\n\nKontributorët @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nKontributorët @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nKur të bëni vlerësimin e programit, mos harroni se ky është një version paraprak.\n\nDitari i projektit:\nhttps://github.com/gorhill/uBlock/releases",
+ "sv-SE": "En effektiv blockerare: lätt på minne och CPU-fotavtryck, som ändå kan ladda och applicera tusentals fler filter jämfört med andra populära blockerare där ute.\n\nIllustrerad översikt av dess effektivitet:\nhttps://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nAnvändning: Den stora strömbrytarikonen i popuprutan är till för att avaktivera/aktivera uBlock₀ på den aktuella webbplatsen permanent. Detta gäller enbart för den aktuella webbplatsen, det är inte en global strömbrytare.\n\n***\n\nFlexibel. uBlock₀ är inte enbart en \"reklamblockerare\": den kan också läsa och skapa filter från hosts-filer.\n\nSom standard är följande filterlistor laddade och applicerade:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nFler filterlistor finns tillgängliga att använda om du vill:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- med flera\n\nJu fler aktiverade filter, desto högre minnesanvändning. Men även efter att ha lagt till Fanboys två extra filterlistor och hpHosts' Ad and tracking servers så använder uBlock₀ mindre minne än andra väldigt populära blockerare.\n\nTänk på att genom att aktivera vissa av dessa extra filterlistor finns det större risk att webbplatser går sönder - särskilt de listor som i normala fall används som hosts-filer.\n\n***\n\nuBlock₀ vore ingenting utan filterlistorna. Så om du vill bidra med någonting, tänk på människorna som arbetar hårt med att upprätthålla de filterlistor du använder, vilka är fritt tillgängliga för allas användning.\n\n***\n\nGratis.\nÖppen källkod med offentlig licens (GPLv3)\nFör användare, av användare.\n\nBidragsgivare @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nBidragsgivare @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nDetta är en ganska tidig version, tänk på detta när du skriver en recension.\n\nProjektets ändringslogg:\nhttps://github.com/gorhill/uBlock/releases",
+ "uk": "Ефективний блокувальник реклами: сильно не навантажує пам’ять та процесор і може працювати з набагато більшою кількістю фільтрів ніж інші блокувальники.\n\nІлюстрований огляд ефективності: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nВикористання: Ця велика кнопка живлення у виринаючому вікні дозволяє вимкнути або увімкнути uBlock для поточного веб-сайту. Ефект розповсюджується тільки на поточний веб-сайт. Це не глобальна кнопка живлення.\n\n***\n\nБудучи універсальним, це більш ніж просто \"блокувальник реклами\". Він також може створювати фільтри з файлів hosts.\n\nЗа замовчуванням завантажено та застосовано наступні списки фільтрів:\n\n– EasyList\n– список рекламних серверів Петра Лоу\n– EasyPrivacy\n– шкідливі домени\n\nНаступні списки можна можна увімкнути за бажанням:\n\n– покращений список слідкування від Fanboy\n– файл хостів Дена Полока\n– сервери реклами та слідкування hpHosts\n– MVPS HOSTS\n– Spam404\n– тощо.\n\nЗвичайно ж, чим більше фільтрів ви увімкнете тим більшим буде використання пам’яті. Однак, навіть після додання двох додаткових списків Fanboy, серверів слідкування та реклами phHosts, uBlock споживає менше пам’яті ніж інші популярні блокувальники.\n\nТакож майте на увазі, що задіяння деяких додаткових списків може спричинити збільшення ймовірності пошкодження функціонування сайту. Особливо ті списки, які зазвичай використовуються як hosts-файл.\n\n***\n\nБез встановлених списків фільтрів це розширення – ніщо. Тому, якщо ви дійсно хочете зробити свій внесок, подумайте про людей, які тяжко працюють для підтримки списків фільтрів якими ви користуєтесь безкоштовно.\n\n***\n\nБезкоштовно.\nВідкритий джерельний код та публічна ліцензія (GPLv3)\nДля користувачів від користувачів.\n\nУчасники @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nПерекладачі @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nЦе ще дуже дочасна версія, тому майте на увазі, коли робите огляд.\n\nЖурнал змін проекту:\nhttps://github.com/gorhill/uBlock/releases",
+ "ur": "ایک زبردست اشتہارات کو روکنے والا سافٹویئر. کم میموری اور cpu استعمال کرتا ہے مگر کام بہترین کرتا ہے.\n\nاس کا بہترین اور پراثر کام کرنے کی تصاویر:\nhttps://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nہدایات: بڑا آن/ آف کا بٹن دبا کر آپ موجودہ ویب سائٹ پر uBlock کو فعال یا غیر فعال کر سکتے ہیں. یہ بٹن صرف موجودہ ویب سائٹ کے لئے ہے، باقی ویب سائٹس کو اس سے کوئی فرق نہیں پڑے گا.\n\n***\n\nFlexible, it's more than an \"ad blocker\": it can also read and create filters from hosts files.\n\nیہ والے فلٹر پہلے سے لاگو ہوں گے:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\nMore lists are available for you to select if you wish:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- And many others\n\nجتنے زیادہ فلٹر لگائیں گے اتنی زیادہ میموری لے گا. Yet, even after adding Fanboy's two extra lists, hpHosts’s Ad and tracking servers, uBlock still has a lower memory footprint than other very popular blockers out there.\n\nAlso, be aware that selecting some of these extra lists may lead to higher likelihood of web site breakage -- especially those lists which are normally used as hosts file.\n\n***\n\nWithout the preset lists of filters, this extension is nothing. So if ever you really do want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free.\n\n***\n\nمفت.\nاوپن سورس عوامی لائسنس(جی.پی.ایل ورژن ٣) کے ساتھ\nعوام کے لیے، عوام کا بنایا ہوا.\n\nمعاونین کی فہرست Github پر دیکھیں:\nhttps://github.com/gorhill/uBlock/graphs/contributors\nمترجمین کی فہرست Crowdin پر دیکھیں:\nhttps://crowdin.net/project/ublock\nپراجیکٹ میں ترقیاتی کام کا ریکارڈ:\nhttps://github.com/gorhill/uBlock/releases",
+ "vi": "Một công cụ chặn quảng cáo hiệu quả: sử dụng ít bộ nhớ, CPU và có thể nạp, áp dụng hàng ngàn bộ lọc so với những công cụ chặn quảng cáo hiện nay.\n\nMinh hoạ tổng quan về tính hiệu quả của µBlock: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\nSử dụng: Nút nguồn lớn trong hộp thoại popup để vô hiệu/kích hoạt vĩnh viễn uBlock cho website hiện tại. Nó chỉ áp dụng cho trang hiện tại, không phải tất cả website.\n\n***\n\nLinh hoạt, hơn cả một \"công cụ chặn quảng cáo\": µBlock có thể đọc và tạo bộ lọc từ tập tin hosts.\n\nNgay lập tức, những bộ lọc này được nạp và áp dụng:\n\n- EasyList\n- Danh sách máy chủ quảng cáo của Peter Lowe\n- EasyPrivacy\n- Malware domains\n\nCó thêm nhiều danh sách để bạn lựa chọn:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- Máy chủ quảng cáo và theo dõi hpHosts\n- MVPS HOSTS\n- Spam404\n- Và nhiều hơn nữa\n\nDĩ nhiên, khi kích hoạt thêm bộ lọc, tiện ích sẽ dùng nhiều bộ nhớ hơn. Tuy vậy, sau khi thêm hai danh sách Fanboy, máy chủ quảng cáo và theo dõi của hpHosts, uBlock vẫn dùng ít bộ nhớ hơn so với những công cụ chặn quảng cáo rất phổ biến khác.\n\nNgoài ra, lưu ý rằng chọn thêm một số danh sách có thể dẫn đến khả năng một số website hiển thị không đúng cách -- đặc biệt là những danh sách thường được dùng như tập tin hosts.\n\n***\n\nKhông có danh sách bộ lọc cài sẵn, tiện ích mở rộng này chẳng là gì cả. Vậy nên nếu bạn thật sự muốn đóng góp gì đó, hãy nghĩ về những người đang chăm chỉ duy trì danh sách bộ lọc hoàn toàn miễn phí mà bạn đang dùng.\n\n***\n\nMiễn phí.\nNguồn mở với giấy phép công cộng (GPLv3)\nLàm vì người dùng bởi người dùng.\n\nNhững người đóng góp @ Github: https://github.com/gorhill/uBlock/graphs/contributors\nNhững người đóng góp @ Crowdin: https://crowdin.net/project/ublock\n\n***\n\nĐây là một phiên bản khá mới, hãy ghi nhớ điều này khi bạn đánh giá.\n\nThay đổi của dự án:\nhttps://github.com/gorhill/uBlock/releases",
+ "zh-CN": "一款高效的请求过滤工具:占用极低的内存和CPU,和其他常见的过滤工具相比,它能够加载并执行上千条过滤规则。\n\n效率概述说明: \nhttps://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared\n\n用法:点击弹出窗口中的电源按钮,uBlock 将对当前网页永久禁用/启用过滤功能。 它只控制当前网页的请求过滤,而不是一个全局开关。 它只控制当前网页的请求过滤,而不是一个全局开关。\n\n***\n\n它不只是一个广告拦截工具,它还可以从 hosts 文件里读取和创建过滤规则。\n\n初始默认加载和执行下列过滤规则列表:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n\n这里还有更多的规则列表供你选择:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- 等等\n\n当然,启用越多的过滤规则就会产生越高的内存占用。 然而,即使再添加 Fanboy 额外的两个规则列表,如 hpHosts’s Ad 和 tracking servers,uBlock 的内存占用依然比其他常见的过滤工具要低的多。\n\n另外请注意,选择一些额外的列表可能会导致网页破损可能性增高 —— 尤其是那些通常被用作 hosts 文件的列表。\n\n***\n\n没有这些过滤规则列表,这个扩展就没有了意义。 所以如果你真的想做点贡献,想想那些维护过滤规则的人们,是他们让所有人能够免费使用这一切变得可能。\n\n***\n\n免费。\n遵从 GPLv3 公共许可协议开源。\n一切为了用户。\n\n贡献者 @ Github:\nhttps://github.com/gorhill/uBlock/graphs/contributors\n贡献者 @ Crowdin:\nhttps://crowdin.net/project/ublock\n\n***\n\n它还是一个相当早期的版本,在您评论的时候请记住这一点。\n\n项目更新日志:\nhttps://github.com/gorhill/uBlock/releases",
+ "zh-TW": "一款高效率的廣告攔截工具:只使用超低的記憶體和CPU使用量,和其他常見的廣告攔截工具相比,可以載入並執行上千條過濾規則。\n\n效率概述說明: \nhttps://github.com/gorhill/uBlock/wiki/%C2%B5Block-vs.-ABP:-efficiency-compared\n\n用法:點選快顯視窗中的電源按鈕,μBlock將會在目前正在瀏覽的網頁永久停用/啟用廣告攔截功能。 它只適用於目前正在瀏覽的網頁,而不是全域按鈕。\n\n***\n\n這不只是一個廣告攔截工具,它還可以非常有彈性的從hosts檔裡讀取和建立過濾規則。\n\n初始預設載入和執行下列過濾規則:\n\n- EasyList\n- Peter Lowe’s Ad server list\n- EasyPrivacy\n- Malware domains\n- Long-lived malware domains\n- Malware Domains List\n\n這裡還擁有更多的過濾規則供你選擇:\n\n- Fanboy’s Enhanced Tracking List\n- Dan Pollock’s hosts file\n- hpHosts’s Ad and tracking servers\n- MVPS HOSTS\n- Spam404\n- 其他\n\n啟用越多的過濾規則就會佔用越多的記憶體。 然而,即使在加入 Fanboy 額外的兩個規則和 hpHosts’s Ad and tracking servers,uBlock₀ 的記憶體佔用依然比其他常見的過濾工具要小的多。\n\n另外,請注意選擇的一些額外的清單可能會導致網頁破損可能性增高 — — 尤其是那些通常用來當作hosts檔案的清單。\n\n***\n\n沒有這些過濾規則清單,這個擴充套件就沒有了意義。 所以如果你真的想要做些貢獻,試著想想那些努力維護廣告過濾規則清單的人們,至少他們讓大家可以免費使用這一切。\n\n***\n\n自由、免費。\n開放原始程式碼與公共許可證 (GPLv3)\n一切都是為了使用者。\n\n貢獻者@ Github: \nhttps://github.com/gorhill/uBlock/graphs/contributors\n貢獻者 @ Crowdin: \nhttps://crowdin.net/project/ublock\n\n***\n\n這還只是一個非常初期的版本,當您留下建議的時候請手下留情。\n\n專案更新日誌:\nhttps://github.com/gorhill/uBlock/releases"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/edit",
+ "guid": "uBlock0@raymondhill.net",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "ar": "",
+ "bg": "",
+ "bn-BD": "",
+ "ca": "",
+ "cs": "",
+ "da": "",
+ "de": "",
+ "el": "",
+ "en-US": "https://github.com/gorhill/uBlock#ublock-origin",
+ "es": "",
+ "eu": "",
+ "fa": "",
+ "fi": "",
+ "fr": "",
+ "he": "",
+ "hu": "",
+ "id": "",
+ "it": "",
+ "ja": "",
+ "ko": "",
+ "nl": "",
+ "pl": "",
+ "pt-BR": "",
+ "pt-PT": "",
+ "ro": "",
+ "ru": "",
+ "sk": "",
+ "sl": "",
+ "sq": "",
+ "sv-SE": "",
+ "uk": "",
+ "vi": "",
+ "zh-CN": "",
+ "zh-TW": ""
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/607/607454-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/607/607454-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/607/607454-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-10-22T13:50:10Z",
+ "name": {
+ "ar": "uBlock Origin",
+ "bg": "uBlock Origin",
+ "bn-BD": "uBlock Origin",
+ "ca": "uBlock Origin",
+ "cs": "uBlock Origin",
+ "da": "uBlock Origin",
+ "de": "uBlock Origin",
+ "el": "uBlock Origin",
+ "en-US": "uBlock Origin",
+ "es": "uBlock Origin",
+ "eu": "uBlock Origin",
+ "fa": "uBlock Origin",
+ "fi": "uBlock Origin",
+ "fr": "uBlock Origin",
+ "he": "uBlock Origin",
+ "hu": "uBlock Origin",
+ "id": "uBlock Origin",
+ "it": "uBlock Origin",
+ "ja": "uBlock Origin",
+ "ka": "uBlock Origin",
+ "ko": "uBlock Origin",
+ "nl": "uBlock Origin",
+ "pl": "uBlock Origin",
+ "pt-BR": "uBlock Origin",
+ "pt-PT": "uBlock Origin",
+ "ro": "uBlock Origin",
+ "ru": "uBlock Origin",
+ "sk": "uBlock Origin",
+ "sl": "uBlock Origin",
+ "sq": "uBlock Origin",
+ "sv-SE": "uBlock Origin",
+ "uk": "uBlock Origin",
+ "ur": "uBlock Origin",
+ "vi": "uBlock Origin",
+ "zh-CN": "uBlock Origin",
+ "zh-TW": "uBlock Origin"
+ },
+ "previews": [
+ {
+ "id": 238546,
+ "caption": {
+ "en-US": "The popup panel: default mode"
+ },
+ "image_size": [
+ 1011,
+ 758
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238546.png?modified=1590420038",
+ "thumbnail_size": [
+ 640,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238546.png?modified=1590420038"
+ },
+ {
+ "id": 238548,
+ "caption": {
+ "en-US": "The dashboard: stock filter lists"
+ },
+ "image_size": [
+ 1011,
+ 758
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238548.png?modified=1590420038",
+ "thumbnail_size": [
+ 640,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238548.png?modified=1590420038"
+ },
+ {
+ "id": 238547,
+ "caption": {
+ "en-US": "The popup panel: default-deny mode"
+ },
+ "image_size": [
+ 1011,
+ 758
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238547.png?modified=1590420038",
+ "thumbnail_size": [
+ 640,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238547.png?modified=1590420038"
+ },
+ {
+ "id": 238549,
+ "caption": {
+ "en-US": "The dashboard: settings"
+ },
+ "image_size": [
+ 1011,
+ 758
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238549.png?modified=1590420038",
+ "thumbnail_size": [
+ 640,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238549.png?modified=1590420038"
+ },
+ {
+ "id": 238552,
+ "caption": {
+ "en-US": "The popup panel in Firefox Preview: default mode with more blocking options revealed"
+ },
+ "image_size": [
+ 970,
+ 1800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238552.png?modified=1590420044",
+ "thumbnail_size": [
+ 259,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238552.png?modified=1590420044"
+ },
+ {
+ "id": 230370,
+ "caption": {
+ "en-US": "The unified logger tells you all that uBO is seeing and doing"
+ },
+ "image_size": [
+ 800,
+ 600
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230370.png?modified=1590420038",
+ "thumbnail_size": [
+ 640,
+ 480
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230370.png?modified=1590420038"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.7309,
+ "bayesian_average": 4.730465077117736,
+ "count": 12678,
+ "text_count": 4288
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/607454",
+ "slug": "ublock-origin",
+ "status": "public",
+ "summary": {
+ "ar": "وأخيراً, مانع اعلانات كفوء. خفيف على المعالج و الذاكرة",
+ "bg": "Най-накрая, ефективен рекламен блокер с малки изисквания за процесор и памет.",
+ "bn-BD": "অবশেষে, একটি দক্ষ প্রতিরোধক। সিপিইউ এবং মেমরির জন্য সহজ।",
+ "ca": "Finalment, un blocador eficient que utilitza pocs recursos de memòria i processador.",
+ "cs": "Konečně efektivní blokovač, který nezatěžuje CPU a paměť.",
+ "da": "Endelig en effektiv blocker til Chromium-baserede browsere. Lavt CPU- og hukommelsesbrug.",
+ "de": "Endlich ein effizienter Blocker. Prozessor-freundlich und bescheiden beim Speicherbedarf.",
+ "el": "Επιτέλους, ένας αποτελεσματικός blocker. Ελαφρύς για τον επεξεργαστή και τη μνήμη.",
+ "en-US": "Finally, an efficient wide-spectrum content blocker. Easy on CPU and memory.",
+ "es": "Por fin, un bloqueador eficiente con uso mínimo de procesador y memoria.",
+ "eu": "Behingoz, blokeatzaile eraginkor bat. PUZ eta memorian arina.",
+ "fa": "بالاخره، یک بلاکر کارآمد. کم حجم بر روی پردازنده و حافظه",
+ "fi": "Viimeinkin tehokas ja kevyt mainosten estäjä.",
+ "fr": "Un bloqueur de nuisances efficace, qui ménagera votre processeur et votre mémoire vive.",
+ "he": "סוף סוף, חוסם יעיל. קל על המעבד והזיכרון",
+ "hu": "Végre egy hatékony reklám- és követésblokkoló böngészőkhöz, amely kíméletes a processzorral és a memóriával.",
+ "id": "Akhirnya, pemblokir iklan yang efisien. Ringan penggunaan CPU dan memori.",
+ "it": "Finalmente, un blocker efficiente. Leggero sulla CPU e sulla memoria.",
+ "ja": "高効率ブロッカーが遂に登場。CPUとメモリーの負担を抑えます。",
+ "ka": "როგორც იქნა, მძლავრი და შედეგიანი რეკლამების შემზღუდავი. ზოგავს CPU-ს და მეხსიერებას.",
+ "ko": "이 부가 기능은 효율적인 차단기입니다. CPU와 메모리에 주는 부담이 적습니다.",
+ "nl": "Eindelijk, een efficiënte adblocker. Gebruikt weinig processorkracht en geheugen.",
+ "pl": "Nareszcie skuteczne blokowanie reklam, niskie użycie procesora i pamięci.",
+ "pt-BR": "Finalmente, um bloqueador eficiente. Com baixo uso de memória e CPU.",
+ "pt-PT": "Finalmente, um bloqueador eficiente. Leve na CPU e memória.",
+ "ro": "În sfârșit, un blocant eficient. Folosește procesorul și memoria foarte puțin.",
+ "ru": "Наконец-то, быстрый и эффективный блокировщик для браузеров.",
+ "sk": "Konečne efektívny blokovač, ktorý nezaťažuje CPU a pamäť.",
+ "sl": "Končno, učinkovita, procesorju in pomnilniku prijazna razširitev za blokiranje oglasov.",
+ "sq": "Më në fund, një bllokues efikas që nuk e rëndon procesorin dhe memorjen.",
+ "sv-SE": "Äntligen en effektiv blockerare! Snäll mot processor och minne.",
+ "uk": "Ефективний блокувальник реклами таки з’явився. Не навантажує процесор та пам'ять.",
+ "ur": "آخر کار، ایک مؤثر اشتہار کو روکنے والا، یہ کم cpu اور میموری لیتا ہے",
+ "vi": "Cuối cùng, đã có một công cụ chặn quảng cáo hiệu quả, tiêu tốn ít CPU và bộ nhớ.",
+ "zh-CN": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。",
+ "zh-TW": "終於出現了,一個高效率的阻擋器,使用不多的 CPU 及記憶體資源。"
+ },
+ "support_email": null,
+ "support_url": {
+ "en-US": "https://old.reddit.com/r/uBlockOrigin/",
+ "ka": "https://old.reddit.com/r/uBlockOrigin/",
+ "ur": "https://old.reddit.com/r/uBlockOrigin/"
+ },
+ "tags": [],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/",
+ "weekly_downloads": 121102
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 811592,
+ "authors": [
+ {
+ "id": 11797710,
+ "name": "JanH",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/11797710/",
+ "username": "JanH",
+ "picture_url": null
+ }
+ ],
+ "average_daily_users": 4963,
+ "categories": {
+ "android": [
+ "photos-media"
+ ],
+ "firefox": [
+ "games-entertainment"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2017-05-03T08:36:43Z",
+ "current_version": {
+ "id": 5085817,
+ "compatibility": {
+ "android": {
+ "min": "48.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/video-background-play-fix/versions/5085817",
+ "files": [
+ {
+ "id": 3630185,
+ "created": "2020-08-22T20:57:23Z",
+ "hash": "sha256:733462096633e1d3f295488552d53db205f3daa93422fc559886a017b686c763",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 11927,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3630185/videowiedergabe_im_hintergrund-1.5.1-an.xpi",
+ "permissions": [
+ "*://*.youtube.com/*",
+ "*://*.youtube-nocookie.com/*",
+ "*://*.vimeo.com/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 22,
+ "is_custom": false,
+ "name": {
+ "bg": "MIT/X11 Лиценз",
+ "ca": "Llicència MIT/X11",
+ "cs": "MIT/X11 licence",
+ "da": "MIT/X11-licens",
+ "de": "MIT/X11-Lizenz",
+ "el": "Άδεια MIT/X11",
+ "en-US": "MIT/X11 License",
+ "es": "Licencia MIT/X11",
+ "eu": "MIT/X11 Lizentzia",
+ "fa": "مجوز MIT/X11",
+ "fr": "Licence MIT/X11",
+ "ga-IE": "Ceadúnas MIT/X11",
+ "hu": "MIT/X11 licenc",
+ "id": "Lisensi MIT/X11",
+ "it": "Licenza MIT/X11",
+ "nl": "MIT/X11-licentie",
+ "pt-PT": "Licença MIT/X11",
+ "ru": "Лицензия MIT/X11",
+ "sk": "Licencia MIT/X11",
+ "sq": "Leje MIT/X11",
+ "sr": "MIT/X11 лиценца",
+ "sv-SE": "MIT/X11-licens",
+ "vi": "Giấy phép MIT/X11",
+ "zh-CN": "MIT/X11 许可协议"
+ },
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ },
+ "release_notes": {
+ "de": "Neue Version für addons.mozilla.org – kein anderweitigen Änderungen am Code.",
+ "en-US": "Version bump for addons.mozilla.org – no code changes."
+ },
+ "reviewed": null,
+ "version": "1.5.1"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "de": "ACHTUNG: Im neuen Firefox für Android (Version 79 und neuer) funktioniert Videowiedergabe im Hintergrund funktioniert erst ab Firefox 82 korrekt.\n\nUnterstützt momentan folgende Seiten:\n
Youtube
Vimeo (Wiedergabe nicht unterbrechen wenn Vollbildmodus beendet wird)
",
+ "en-US": "ATTENTION: With the new Firefox on Android (Firefox 79 and newer), background playback only properly works starting from Firefox 82.\n\nThe following pages are currently supported:\n
Youtube
Vimeo (don't stop playback when existing fullscreen)
"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/video-background-play-fix/edit",
+ "guid": "video-bg-play@timdream.org",
+ "has_eula": false,
+ "has_privacy_policy": false,
+ "homepage": {
+ "en-US": "https://github.com/mozilla/video-bg-play"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/811/811592-32.png?modified=c75499b8",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/811/811592-64.png?modified=c75499b8",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/811/811592-128.png?modified=c75499b8"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-08-24T07:07:02Z",
+ "name": {
+ "de": "Videowiedergabe im Hintergrund",
+ "en-US": "Video Background Play Fix"
+ },
+ "previews": [],
+ "promoted": {
+ "apps": [
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.5122,
+ "bayesian_average": 4.506682711353834,
+ "count": 945,
+ "text_count": 351
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/811592",
+ "slug": "video-background-play-fix",
+ "status": "public",
+ "summary": {
+ "de": "Manches Seiten verhindern die Wiedergabe von Videos im Hintergrund. Dieses Add-on blockiert die von den Webseiten dazu genutzten APIs und ermöglicht so das Abspielen von Videos, auch wenn der betreffende Tab nicht im Vordergrund ist.",
+ "en-US": "Some sites may not work with Firefox for Android video background play feature. This add-on provides a quick fix by blocking the Page Visibility API and the Fullscreen API."
+ },
+ "support_email": null,
+ "support_url": {
+ "de": "https://github.com/mozilla/video-bg-play/issues",
+ "en-US": "https://github.com/mozilla/video-bg-play/issues"
+ },
+ "tags": [
+ "fullscreen",
+ "page visibility",
+ "video",
+ "vimeo",
+ "youtube"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/",
+ "weekly_downloads": 22
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 953945,
+ "authors": [
+ {
+ "id": 12808157,
+ "name": "cowlicks",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/12808157/",
+ "username": "cowlicks",
+ "picture_url": null
+ }
+ ],
+ "average_daily_users": 93474,
+ "categories": {
+ "android": [
+ "experimental",
+ "security-privacy"
+ ],
+ "firefox": [
+ "privacy-security"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2018-03-21T18:25:52Z",
+ "current_version": {
+ "id": 4816021,
+ "compatibility": {
+ "firefox": {
+ "min": "42.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "48.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-possum/versions/4816021",
+ "files": [
+ {
+ "id": 3360398,
+ "created": "2019-07-18T08:01:21Z",
+ "hash": "sha256:0840a8c443e25d8a65da22ce1b557216456b900a699b3541e42e1b47e8cb6c0e",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 284724,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3360398/privacy_possum-2019.7.18-an+fx.xpi",
+ "permissions": [
+ "tabs",
+ "http://*/*",
+ "https://*/*",
+ "contextMenus",
+ "webRequest",
+ "webRequestBlocking",
+ "webNavigation",
+ "storage",
+ "cookies",
+ "*://twitter.com/*",
+ "*://tweetdeck.twitter.com/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 6,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència GPL (General Public License) de GNU, version 3.0",
+ "cs": "GNU General Public License, verze 3.0",
+ "de": "GNU General Public License, Version 3.0",
+ "el": "GNU General Public License, έκδοση 3.0",
+ "en-US": "GNU General Public License, version 3.0",
+ "es": "Licencia pública GNU, versión 3.0",
+ "eu": "GNU General Public License, 3.0 bertsioa",
+ "fa": "مجوز عمومی کلی گنو، نسخهٔ ۳٫۰",
+ "ga-IE": "GNU General Public License, leagan 3.0",
+ "id": "GNU General Public License, versi 3.0",
+ "it": "Licenza GNU General Public License, versione 3.0",
+ "ja": "GNU General Public License バージョン 3.0",
+ "nl": "GNU General Public License, versie 3.0",
+ "pl": "General Public Licence, wersja 3.0",
+ "pt-PT": "GNU General Public License, versão 3.0",
+ "ru": "GNU General Public License, версия 3.0",
+ "sk": "GNU General Public License, verzia 3.0",
+ "sq": "Leje e Përgjithshme Publike GNU, version 3.0",
+ "uk": "GNU General Public License, версія 3.0",
+ "vi": "Giấy phép Công cộng GNU, phiên bản 3.0",
+ "zh-CN": "GNU 通用公共授权,版本 3.0",
+ "zh-TW": "GNU General Public License,版本 3.0"
+ },
+ "url": "http://www.gnu.org/licenses/gpl-3.0.html"
+ },
+ "release_notes": {
+ "en-US": "First update in a while! Sorry, having a full-time job does that. I welcome all the help I can get at https://github.com/cowlicks/privacypossum\n\nI'm always happy to help folk contribute at any skill level. There is always some way to help.\n\nThis is mostly a release that improves testing and developer workflow stuff, which should help me make more frequent releases in the future.\n\nThere are also several minor bugfixes and updates."
+ },
+ "reviewed": null,
+ "version": "2019.7.18"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "en-US": "Privacy Possum monkey wrenches common commercial tracking methods by reducing and falsifying the data gathered by tracking companies."
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-possum/edit",
+ "guid": "woop-NoopscooPsnSXQ@jetpack",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "en-US": "https://github.com/cowlicks/privacypossum"
+ },
+ "icon_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAFGUlEQVRo3sWZe0xWZRzHPy+gCET0UkLcQiNLIKyRDnQhbeJmGZVmrQuNLixjC9dKXRAqhTV1buUmNY02W3M0W1vzurStoaVoYOSiGWxEhMhVQ1GigNMfnBfO5XfgPQd4fX7/Pc/v8n2e5zy/23Fhd9zEQh4ggQTicBOKQi89dNFIA2epoo0pG/dQzBn+QxmTfmMbiybbdCAvUTOOYT39zjrCJsf4DNbRZsu4h66wBfdEzT9HEz28y2JSSGMV73GUPhsgulmDv1PjURxCQeG0YT6YlRxiwGsQVSQ5Mf8YXaqCIRKE9ViKueAlhGu8bM+4iyIGNQresOALoZgeL0F8QoC35v353CD82RjcEVR6CeEwwWbxANH884Y58x1Gk0gCUcwkmtu83NjDHCCb6+Md/h4Be5MGXhblNDp6lgoKR5g2NoB3RLHzqvFcGhyb9lD5WOZXMiQKHQOSODVh48OUb2U+lksWIh+RY8v9eGgtGWRRRLVuto/75dv/1lLROYd7/XBEewKF1I/M/yx9CbmTdMBaajdsMYvD6kohJvfaYqnmBPvHDcJWFGHaaDaNKFwhUj+9wUJBA2kAbHEIIEa4bDdVKJTp998lip/hFpVjhSPzgwSKn3sig/Rx++jEalG8nnBNWHYC4IRoPoM/UFB4f3TqVxH9gxqhzY4AmIPYTHaNhLlWTyBIEYXLdJ6/3dEb0Cdlt7KJyzqO5da76ydu5PGsolXkqOBJZgMh5NAhcORpjMezg14Tx87hRcnN7FEFF3FS3F0NKYaMudvAcRI/APxYSoXFMz4HEK5LPTyUCaRy0OJwvyTIdLsbDccfC8xhM81jXNIQ4ZAtLDSTytcWgUlht7o3/dA68qtks4YqL76Th2CTMN1raVxhLy7B/GKdRLfXKevr8IWtL/t70bWEc96hpyzDVpSvH/GM2pFOneNwtT+AKBvZcj876ONvIIgZhDCdMGZx9wQKnygXnV4nlVMx/vIjlBs5gv3Eb9qHAFxc4jqDuG/QSfzrIpB+ACK5jyVkk+hTAJelR1UhOuepoWYZ10LHebBdqnQRSDIxhHGNGg2eUA6Q6YMr2AXLNHh+4BENhGYfnEA+hBkCx2iofXsCijspp4AlzOVmNVrMZzUXTXzJAGcNk9+puVqMRUzbRylreIZMkoghjW1C2bZWPPByA1fHsBcqkYIkAN+IAF40KV5Kv4GnQARQIDc+kk0m2tReRqr4II8IqksNPIdEABsNXMs8C7UmI2+qK9sFAAPMFRq4nYZkK0sAcFTH0zpaouYJ/b0ItU0p1QyVTDcpLzSd4iwDR4ohzyoZXQoSSrNjKr54/hQgHDClpaE0GXjq1Bfg6Uad1pU9p/SZyHqxLeHJ6cv4Ude8GOQC201xdB6/aLLi43xAvGY1kqd4hVd5gUdJN4e+ILE8f9rAE088btxjNJrCuZNoQpw4xRyxw7nIl6HxsAChy1ABTemIE5tU7b7MEJaLjsenEEpE59vCvb4C4GK3COEqK3wFwZ99Fv2eIl9l0P58ahHlD9qqoyZ0ESUW9XEX+d7/eJjoi+iy/DOYKwQjq7GAn/jYGYQ7OGKZcrWwcdyi1EUGexngOHc5P4dnxQbVaKdoK48bvotgUniC9XxFBwrtvCb2U+xUb7wl9sC09A9NVFNNve4XVg+lk1XwhZBn6PmP/+u2YPKrzXlsoGacsm2QOrYy386DszvCSGcBc5hNNG6CmEYPHVyknjpqqaXXnrr/AUHCIxVzVKDBAAAAAElFTkSuQmCC",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/953/953945-32.png?modified=8ab422b7",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/953/953945-64.png?modified=8ab422b7",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/953/953945-128.png?modified=8ab422b7"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2019-07-22T13:10:58Z",
+ "name": {
+ "en-US": "Privacy Possum"
+ },
+ "previews": [
+ {
+ "id": 201244,
+ "caption": {
+ "en-US": "Privacy possum blocking fingerprinting, cookie tracking, and referer headers on kayak.com"
+ },
+ "image_size": [
+ 640,
+ 400
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/201/201244.png?modified=1543521167",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/201/201244.png?modified=1543521167"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.5037,
+ "bayesian_average": 4.484640159908518,
+ "count": 272,
+ "text_count": 74
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/953945",
+ "slug": "privacy-possum",
+ "status": "public",
+ "summary": {
+ "en-US": "Privacy Possum monkey wrenches common commercial tracking methods by reducing and falsifying the data gathered by tracking companies."
+ },
+ "support_email": {
+ "en-US": "blake.a.griffith@gmail.com"
+ },
+ "support_url": {
+ "en-US": "https://github.com/cowlicks"
+ },
+ "tags": [
+ "cookies",
+ "etag",
+ "fingerprinting",
+ "privacy",
+ "tracking"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/",
+ "weekly_downloads": 1539
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 824288,
+ "authors": [
+ {
+ "id": 12929064,
+ "name": "Armin Sebastian",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/12929064/",
+ "username": "dessant",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/12/12929/12929064.png?modified=1557684554"
+ }
+ ],
+ "average_daily_users": 122790,
+ "categories": {
+ "android": [
+ "photos-media",
+ "user-interface"
+ ],
+ "firefox": [
+ "photos-music-videos",
+ "search-tools"
+ ]
+ },
+ "contributions_url": "https://www.paypal.me/ArminSebastian/5?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org",
+ "created": "2017-06-17T15:23:33Z",
+ "current_version": {
+ "id": 5097417,
+ "compatibility": {
+ "firefox": {
+ "min": "68.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "68.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/versions/5097417",
+ "files": [
+ {
+ "id": 3641782,
+ "created": "2020-09-11T19:40:05Z",
+ "hash": "sha256:68fb0fc2670c4cebe9bf949dab2060b40f7fcbc612f3d9eaa4b52e6c3c1969a4",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 1412269,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3641782/search_by_image-3.1.0-an+fx.xpi",
+ "permissions": [
+ "contextMenus",
+ "storage",
+ "tabs",
+ "activeTab",
+ "notifications",
+ "webRequest",
+ "webRequestBlocking",
+ "",
+ "http://*/*",
+ "https://*/*",
+ "file:///*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 6,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència GPL (General Public License) de GNU, version 3.0",
+ "cs": "GNU General Public License, verze 3.0",
+ "de": "GNU General Public License, Version 3.0",
+ "el": "GNU General Public License, έκδοση 3.0",
+ "en-US": "GNU General Public License, version 3.0",
+ "es": "Licencia pública GNU, versión 3.0",
+ "eu": "GNU General Public License, 3.0 bertsioa",
+ "fa": "مجوز عمومی کلی گنو، نسخهٔ ۳٫۰",
+ "ga-IE": "GNU General Public License, leagan 3.0",
+ "id": "GNU General Public License, versi 3.0",
+ "it": "Licenza GNU General Public License, versione 3.0",
+ "ja": "GNU General Public License バージョン 3.0",
+ "nl": "GNU General Public License, versie 3.0",
+ "pl": "General Public Licence, wersja 3.0",
+ "pt-PT": "GNU General Public License, versão 3.0",
+ "ru": "GNU General Public License, версия 3.0",
+ "sk": "GNU General Public License, verzia 3.0",
+ "sq": "Leje e Përgjithshme Publike GNU, version 3.0",
+ "uk": "GNU General Public License, версія 3.0",
+ "vi": "Giấy phép Công cộng GNU, phiên bản 3.0",
+ "zh-CN": "GNU 通用公共授权,版本 3.0",
+ "zh-TW": "GNU General Public License,版本 3.0"
+ },
+ "url": "http://www.gnu.org/licenses/gpl-3.0.html"
+ },
+ "release_notes": {
+ "en-US": "Fixed:\n- Shutterstock, PimEyes and Madrid Monitor have been updated\n- set correct browser action height on Firefox for Android\n- show correct max image size in error message"
+ },
+ "reviewed": null,
+ "version": "3.1.0"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "en-US": "Search by Image is a Firefox extension which enables you to initiate a reverse image search from the right-click context menu or the browser toolbar, and comes with support for more than 30 search engines.\n\nImages positioned at the selected area are detected regardless of how they were embedded in the page. The extension also supports uploading local images, searching for video frames, capturing details within images, and searching for images from private sites.\n\nThe continued development of Search by Image is made possible thanks to the support of awesome backers. If you'd like to join them, please consider contributing with Patreon, PayPal or Bitcoin.\n\nA diverse set of reverse image search engines are supported, which can be toggled and reordered from the extension's options. Visit the wiki for the full list of supported search engines.\n\nhttps://github.com/dessant/search-by-image/wiki/Search-engines\n\nA handful of search modes are offered that serve different use cases. The search mode can be set independently for the context menu and browser toolbar from the extension's options.\n\nSearch modes:\n
Select (context menu and toolbar): select an image on the page, then search for the image URL, whenever possible. Blob, data and file URLs will still be handled as image uploads. This is the default search mode.
Select & Upload (context menu and toolbar): select an image on the page, then fetch the image, possibly from the browser cache, and upload it. This search mode is preferred for sites which do not allow direct linking of images or are otherwise private.
Capture (context menu and toolbar): select and capture a page area, then upload it.
Upload (toolbar): select or drop an image from your device, or paste it from the clipboard, then upload it.
URL (toolbar): search for an image URL.
\nFeatures:\n
Search with a single engine, or all enabled ones, directly from the top-level context menu item, or the browser toolbar button (see options)
Detect any image on the page, including those declared in CSS and pseudo-elements
Select the desired image from a dialog when multiple images are found
Search for images from private sites (see search modes)
Search for local images
Search for the current video frame
\nRequired permissions:\n
Access your data for all tabs and websites: required for parsing web pages and performing image searches
Display notifications: needed for displaying error messages
\nThe context menu item is always visible, unless it is disabled. Visit the wiki for more details.\n\nThe image you select during a search is sent to the requested third-party service, such as Google Images. Visit the extension's privacy policy for more information.\n\nRelevant Firefox bugs:\n
The context menu API is not available on Android, use the extension from the toolbar instead (1363016)
The search results are opened as regular tabs on Android, private tabs are not supported (1372178)
\nThe extension is also available for Chrome and Edge.\n\nReviews are not monitored for bug reports, please use GitHub for issues and feature requests.\nhttps://github.com/dessant/search-by-image"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/edit",
+ "guid": "{2e5ff8c8-32fe-46d0-9fc8-6b8986621f3c}",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "en-US": "https://github.com/dessant/search-by-image"
+ },
+ "icon_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFGklEQVR42u1bzW8TRxR3KbSFXntrVXEOl0qRIM2M4yCVyvLOOglSDq167oGqHErvllr+j15oFeWMEDcT1CNSUalQhUBIhP1wSGrUevth2Gzfb3bHmaYG1l57/TUjPdlZz3vzfm9m3sfspFAwzTTThtWiWuFIVKsdiT/7oZh3YsGPo6x8wK+vv47P7TJbaNpLVzzBrrgW/74XAg94IUOXOTHg3TKfe1It+u3zZ6PWaikK1pZ7IvCAFzIgayKMsJko6Aj2fkMUHzxdWYoci7Vdiz2nGX3WC4EHvJDREPwBZOpj5DejhcJr0hnRwPVS6Wg3wm+3Pp8/FoMvvePbxdt/0Aw6EjiPshBkQBZk/kqyMQbGepU+UmfSfSDLOW3zzp172xd8q0VL2JUzmQ28IsiCTN9mNyIhTgwTw39mXi25PbH0oW/zT3zBPu1GboV/Jj8FuxqslQYKXjdCEBv2qj5mVyJdobPaLj2vBMW4bS1W9qrFn3ZsHjarSxH248uoSUQePBw0+I4RLBY2V1LoQbpCZ+gODD35DhVzYcUYNGaUS2BpaFjgD4yQTg/oDN2BAVhS5RO1Qtxhu3z6PbL2U7LgUJZzXgTdJQbCAkw6xu6zTx5UxvAK+/qvATuyURpBYiFMOsYXeMyC3CfkSL77c215f1oMACzApGN86f5HKgqP6w3Fm/N9+gyR6Ogkn8W/DdgISfQgTK/0A8M0ADw4gFKeEO2RY/qdkpvW6rIkfMczP+4Hg4RTYwDMKkAhfLWkTN4muk+yr9PzDRC+x894G33icEqGGMiKGKEBAGLXLsrihuLyz/T3Jc9mpx6WSm8dHhvP8Bv6NGx+BzzgdTOn0yMygJvk8AT8Mf198dH6wvHuByb/Vwh9wfOEeLE9shlhBAaAwgEKGKt44+HKmZN6mFWF1a35+WM6dQoYLUx5xOtbfCvIZIScDQBFUcs3BPvhXrn8Zgc4qsoU6ag0BPomhoAMyGr1bYQcDUCla4glSzF361oCfjOJu/rAzZXSByT7C89ilyXRdzw7rIfihSyKEDeTEjscSwMgdJHT2qe823tkLbwby6tJebXk0xGLH1NqWm8I/gwz+s/5s5LiFcORttbRR+dRMnZJJvkTD2P0FiZzMgBmRvJU+JeQUVfLPgHgWfzb3xD/qUBRWyUJiW21tPEb+qCvAg8Z9WQ7OBV+EWM442YAiteyTCXF7sKDo+DQwTuVxW/+pplWGaDXPb7vq4wQfcGjGwEyHTF/whHsrswTRNrKMw8DwOvjxKbKv+rMvqorqvwjKEx7+LmTIrFBH/SVPMSr8ne1ClybXYoBpXWIQzaAGyss++5W+RxmC4cPUUQrgGaNipEfsbR78eDoK3mIFzIgazOJDkiWMJZ/UFeMeAVYPMS+JWXu/7I+94buuBoVePvOUu0lrVV9Q8jQZWIMjJX4inD0KwCztQrHxq4rOUhspAEEv4Bip5/4HecTy4gOF3SZ0qHSWOkzxBwMEMQgN5QMpSxifDt2fu0+srg2eMmxXlYGONCPbQSpDWsMYLaAcYImDJpEyKTCphjKqxyWJesslsNqFch3+YLfnLkDEXMk1vVQlG95s3YoejhDxNH2Th/H4juTfCz+ghcjd/wUL0bQZ2caXox0ezUWpHg1FkzTqzHzcnTiXo/P/AWJWb8iM/OXpAZxTW5sqJ9rclkvSo4LZboo2c9V2bGjrFdlM180HsP/Xxjqdflxo4FdlzfNNNNMM80006a6/QttCg92SotlbgAAAABJRU5ErkJggg==",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/824/824288-32.png?modified=19a734a9",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/824/824288-64.png?modified=19a734a9",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/824/824288-128.png?modified=19a734a9"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-09-14T08:25:54Z",
+ "name": {
+ "en-US": "Search by Image"
+ },
+ "previews": [
+ {
+ "id": 230000,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230000.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230000.png?modified=1577353924"
+ },
+ {
+ "id": 230001,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230001.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230001.png?modified=1577353924"
+ },
+ {
+ "id": 230002,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230002.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230002.png?modified=1577353924"
+ },
+ {
+ "id": 230003,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230003.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230003.png?modified=1577353924"
+ },
+ {
+ "id": 230004,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230004.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230004.png?modified=1577353924"
+ },
+ {
+ "id": 230005,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230005.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230005.png?modified=1577353924"
+ },
+ {
+ "id": 230006,
+ "caption": null,
+ "image_size": [
+ 1280,
+ 800
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230006.png?modified=1577353924",
+ "thumbnail_size": [
+ 640,
+ 400
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230006.png?modified=1577353924"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.668,
+ "bayesian_average": 4.6605342038468205,
+ "count": 726,
+ "text_count": 150
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/824288",
+ "slug": "search_by_image",
+ "status": "public",
+ "summary": {
+ "en-US": "A powerful reverse image search tool, with support for various search engines, such as Google, Bing, Yandex, Baidu and TinEye."
+ },
+ "support_email": null,
+ "support_url": {
+ "en-US": "https://github.com/dessant/search-by-image/issues"
+ },
+ "tags": [
+ "baidu",
+ "bing",
+ "google",
+ "image",
+ "image search",
+ "photography",
+ "photos",
+ "picture",
+ "reverse",
+ "reverse image search",
+ "search",
+ "search by image",
+ "search image",
+ "search tool",
+ "tineye",
+ "video",
+ "yandex"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/",
+ "weekly_downloads": 8054
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 869140,
+ "authors": [
+ {
+ "id": 13394925,
+ "name": "Thomas Wisniewski",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/13394925/",
+ "username": "wisniewskit",
+ "picture_url": null
+ },
+ {
+ "id": 6084813,
+ "name": "Rob W",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/6084813/",
+ "username": "RobW",
+ "picture_url": null
+ }
+ ],
+ "average_daily_users": 2915,
+ "categories": {
+ "android": [
+ "other"
+ ],
+ "firefox": [
+ "search-tools"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2017-10-31T15:35:56Z",
+ "current_version": {
+ "id": 5110671,
+ "compatibility": {
+ "android": {
+ "min": "56.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/google-search-fixer/versions/5110671",
+ "files": [
+ {
+ "id": 3655036,
+ "created": "2020-10-05T16:52:49Z",
+ "hash": "sha256:ddc495ab2a764774cf1919f0c946b95a932795c344ce9784827ef818125173ae",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 13786,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3655036/google_search_fixer-1.6-an.xpi",
+ "permissions": [
+ "webRequest",
+ "webRequestBlocking",
+ "*://*/*",
+ "*://*.google.com/*",
+ "*://*.google.ac/*",
+ "*://*.google.ad/*",
+ "*://*.google.ae/*",
+ "*://*.google.com.af/*",
+ "*://*.google.com.ag/*",
+ "*://*.google.com.ai/*",
+ "*://*.google.al/*",
+ "*://*.google.am/*",
+ "*://*.google.co.ao/*",
+ "*://*.google.com.ar/*",
+ "*://*.google.as/*",
+ "*://*.google.at/*",
+ "*://*.google.com.au/*",
+ "*://*.google.az/*",
+ "*://*.google.ba/*",
+ "*://*.google.com.bd/*",
+ "*://*.google.be/*",
+ "*://*.google.bf/*",
+ "*://*.google.bg/*",
+ "*://*.google.com.bh/*",
+ "*://*.google.bi/*",
+ "*://*.google.bj/*",
+ "*://*.google.com.bn/*",
+ "*://*.google.com.bo/*",
+ "*://*.google.com.br/*",
+ "*://*.google.bs/*",
+ "*://*.google.bt/*",
+ "*://*.google.co.bw/*",
+ "*://*.google.by/*",
+ "*://*.google.com.bz/*",
+ "*://*.google.ca/*",
+ "*://*.google.cd/*",
+ "*://*.google.cf/*",
+ "*://*.google.cg/*",
+ "*://*.google.ch/*",
+ "*://*.google.ci/*",
+ "*://*.google.co.ck/*",
+ "*://*.google.cl/*",
+ "*://*.google.cm/*",
+ "*://*.google.cn/*",
+ "*://*.google.com.co/*",
+ "*://*.google.co.cr/*",
+ "*://*.google.com.cu/*",
+ "*://*.google.cv/*",
+ "*://*.google.com.cy/*",
+ "*://*.google.cz/*",
+ "*://*.google.de/*",
+ "*://*.google.dj/*",
+ "*://*.google.dk/*",
+ "*://*.google.dm/*",
+ "*://*.google.com.do/*",
+ "*://*.google.dz/*",
+ "*://*.google.com.ec/*",
+ "*://*.google.ee/*",
+ "*://*.google.com.eg/*",
+ "*://*.google.es/*",
+ "*://*.google.com.et/*",
+ "*://*.google.fi/*",
+ "*://*.google.com.fj/*",
+ "*://*.google.fm/*",
+ "*://*.google.fr/*",
+ "*://*.google.ga/*",
+ "*://*.google.ge/*",
+ "*://*.google.gg/*",
+ "*://*.google.com.gh/*",
+ "*://*.google.com.gi/*",
+ "*://*.google.gl/*",
+ "*://*.google.gm/*",
+ "*://*.google.gp/*",
+ "*://*.google.gr/*",
+ "*://*.google.com.gt/*",
+ "*://*.google.gy/*",
+ "*://*.google.com.hk/*",
+ "*://*.google.hn/*",
+ "*://*.google.hr/*",
+ "*://*.google.ht/*",
+ "*://*.google.hu/*",
+ "*://*.google.co.id/*",
+ "*://*.google.ie/*",
+ "*://*.google.co.il/*",
+ "*://*.google.im/*",
+ "*://*.google.co.in/*",
+ "*://*.google.iq/*",
+ "*://*.google.is/*",
+ "*://*.google.it/*",
+ "*://*.google.je/*",
+ "*://*.google.com.jm/*",
+ "*://*.google.jo/*",
+ "*://*.google.co.jp/*",
+ "*://*.google.co.ke/*",
+ "*://*.google.com.kh/*",
+ "*://*.google.ki/*",
+ "*://*.google.kg/*",
+ "*://*.google.co.kr/*",
+ "*://*.google.com.kw/*",
+ "*://*.google.kz/*",
+ "*://*.google.la/*",
+ "*://*.google.com.lb/*",
+ "*://*.google.li/*",
+ "*://*.google.lk/*",
+ "*://*.google.co.ls/*",
+ "*://*.google.lt/*",
+ "*://*.google.lu/*",
+ "*://*.google.lv/*",
+ "*://*.google.com.ly/*",
+ "*://*.google.co.ma/*",
+ "*://*.google.md/*",
+ "*://*.google.me/*",
+ "*://*.google.mg/*",
+ "*://*.google.mk/*",
+ "*://*.google.ml/*",
+ "*://*.google.com.mm/*",
+ "*://*.google.mn/*",
+ "*://*.google.ms/*",
+ "*://*.google.com.mt/*",
+ "*://*.google.mu/*",
+ "*://*.google.mv/*",
+ "*://*.google.mw/*",
+ "*://*.google.com.mx/*",
+ "*://*.google.com.my/*",
+ "*://*.google.co.mz/*",
+ "*://*.google.com.na/*",
+ "*://*.google.com.nf/*",
+ "*://*.google.com.ng/*",
+ "*://*.google.com.ni/*",
+ "*://*.google.ne/*",
+ "*://*.google.nl/*",
+ "*://*.google.no/*",
+ "*://*.google.com.np/*",
+ "*://*.google.nr/*",
+ "*://*.google.nu/*",
+ "*://*.google.co.nz/*",
+ "*://*.google.com.om/*",
+ "*://*.google.com.pa/*",
+ "*://*.google.com.pe/*",
+ "*://*.google.com.pg/*",
+ "*://*.google.com.ph/*",
+ "*://*.google.com.pk/*",
+ "*://*.google.pl/*",
+ "*://*.google.pn/*",
+ "*://*.google.com.pr/*",
+ "*://*.google.ps/*",
+ "*://*.google.pt/*",
+ "*://*.google.com.py/*",
+ "*://*.google.com.qa/*",
+ "*://*.google.ro/*",
+ "*://*.google.ru/*",
+ "*://*.google.rw/*",
+ "*://*.google.com.sa/*",
+ "*://*.google.com.sb/*",
+ "*://*.google.sc/*",
+ "*://*.google.se/*",
+ "*://*.google.com.sg/*",
+ "*://*.google.sh/*",
+ "*://*.google.si/*",
+ "*://*.google.sk/*",
+ "*://*.google.com.sl/*",
+ "*://*.google.sn/*",
+ "*://*.google.so/*",
+ "*://*.google.sm/*",
+ "*://*.google.sr/*",
+ "*://*.google.st/*",
+ "*://*.google.com.sv/*",
+ "*://*.google.td/*",
+ "*://*.google.tg/*",
+ "*://*.google.co.th/*",
+ "*://*.google.com.tj/*",
+ "*://*.google.tk/*",
+ "*://*.google.tl/*",
+ "*://*.google.tm/*",
+ "*://*.google.tn/*",
+ "*://*.google.to/*",
+ "*://*.google.com.tr/*",
+ "*://*.google.tt/*",
+ "*://*.google.com.tw/*",
+ "*://*.google.co.tz/*",
+ "*://*.google.com.ua/*",
+ "*://*.google.co.ug/*",
+ "*://*.google.co.uk/*",
+ "*://*.google.com.uy/*",
+ "*://*.google.co.uz/*",
+ "*://*.google.com.vc/*",
+ "*://*.google.co.ve/*",
+ "*://*.google.vg/*",
+ "*://*.google.co.vi/*",
+ "*://*.google.com.vn/*",
+ "*://*.google.vu/*",
+ "*://*.google.ws/*",
+ "*://*.google.rs/*",
+ "*://*.google.co.za/*",
+ "*://*.google.co.zm/*",
+ "*://*.google.co.zw/*",
+ "*://*.google.cat/*",
+ "*://*.google.ng/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 3338,
+ "is_custom": false,
+ "name": {
+ "en-US": "Mozilla Public License, version 2.0"
+ },
+ "url": "http://www.mozilla.org/MPL/2.0/"
+ },
+ "release_notes": {
+ "en-US": "This version features improves the performance and reliability of the add-on,\nand allows the Desktop mode to behave as intended."
+ },
+ "reviewed": null,
+ "version": "1.6"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "en-US": "Google's Web Search currently doesn't provide the same search experience to browsers like Firefox for Android as it does for Chrome. However, Firefox is actually capable of showing the more advanced page that Chrome gets (with some issues which should hopefully all be cosmetic).\n\nFirefox engineers are working with Google to fix this situation, but it is unclear how long that process will take. This add-on was made to let users opt into getting that better experience in the meantime, by simply installing the addon (no configuration required).\n\nThis add-on works by spoofing the relevant user-agent information so that Google Search sends the Chrome-specific page to Firefox for Android. It also adds a rider to that information which should hopefully make it clear to those paying attention that users are actually using Firefox, not Chrome.\n\nPlease note that using this addon will make your browser appear to Google to be an \"LG Nexus\" device, regardless of the actual make and model number of your device. As such it will appear that way on your Google \"recently used devices\" listings (https://myaccount.google.com/device-activity).\n\n\nNote: Android users seeing \"unavailable on your platform\", go to https://addons.mozilla.org/en-US/android/addon/google-search-fixer/"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/google-search-fixer/edit",
+ "guid": "{58c32ac4-0d6c-4d6f-ae2c-96aaf8ffcb66}",
+ "has_eula": false,
+ "has_privacy_policy": false,
+ "homepage": {
+ "en-US": "http://github.com/wisniewskit/google-search-fixer"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/869/869140-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/869/869140-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/869/869140-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-10-06T08:39:18Z",
+ "name": {
+ "en-US": "Google Search Fixer"
+ },
+ "previews": [],
+ "promoted": {
+ "apps": [
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.4626,
+ "bayesian_average": 4.456849155319968,
+ "count": 895,
+ "text_count": 236
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/869140",
+ "slug": "google-search-fixer",
+ "status": "public",
+ "summary": {
+ "en-US": "Override the user-agent string presented to Google Search pages to receive the search experience shown to Chrome."
+ },
+ "support_email": {
+ "en-US": "wisniewskit@gmail.com"
+ },
+ "support_url": {
+ "en-US": "http://github.com/wisniewskit/google-search-fixer"
+ },
+ "tags": [],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/",
+ "weekly_downloads": 45
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 722,
+ "authors": [
+ {
+ "id": 143,
+ "name": "Giorgio Maone",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/143/",
+ "username": "giorgio-maone",
+ "picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/0/0/143.png?modified=1506804587"
+ }
+ ],
+ "average_daily_users": 403527,
+ "categories": {
+ "android": [
+ "performance",
+ "security-privacy"
+ ],
+ "firefox": [
+ "privacy-security",
+ "web-development"
+ ]
+ },
+ "contributions_url": "https://www.paypal.me/NoScript?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org",
+ "created": "2005-05-13T10:51:32Z",
+ "current_version": {
+ "id": 5113339,
+ "compatibility": {
+ "firefox": {
+ "min": "59.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "59.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/versions/5113339",
+ "files": [
+ {
+ "id": 3657704,
+ "created": "2020-10-09T10:52:21Z",
+ "hash": "sha256:08543e4a03e0becacd10c3cdbf5eaab1ff35a1648babe6f1522ae335e21de7d4",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 601205,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3657704/noscript_security_suite-11.1.3-an+fx.xpi",
+ "permissions": [
+ "contextMenus",
+ "storage",
+ "tabs",
+ "unlimitedStorage",
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "",
+ "file://*/*",
+ "ftp://*/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 13,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència GPL (General Public License) de GNU, version 2.0",
+ "cs": "GNU General Public License, verze 2.0",
+ "de": "GNU General Public License, Version 2.0",
+ "el": "GNU General Public License, έκδοση 2.0",
+ "en-US": "GNU General Public License, version 2.0",
+ "es": "Licencia pública GNU, versión 2.0",
+ "eu": "GNU General Public License, 2.0 bertsioa",
+ "fa": "مجوز عمومی کلی گنو، نسخهٔ ۲٫۰",
+ "ga-IE": "GNU General Public License, leagan 2.0",
+ "id": "GNU General Public License, versi 2.0",
+ "it": "Licenza GNU General Public License, versione 2.0",
+ "ja": "GNU General Public License バージョン 2.0",
+ "nl": "GNU General Public License, versie 2.0",
+ "pl": "GNU General Public Licence, wersja 2.0",
+ "pt-PT": "GNU General Public License, versão 2.0",
+ "ru": "GNU General Public License, версия 2.0",
+ "sk": "GNU General Public License, verzia 2.0",
+ "sq": "Leje e Përgjithshme Publike GNU, version 2.0",
+ "uk": "GNU General Public License, версія 2.0",
+ "vi": "Giấy phép Công cộng GNU, phiên bản 2.0",
+ "zh-CN": "GNU 通用公共授权,版本 2.0",
+ "zh-TW": "GNU General Public License,版本 2.0"
+ },
+ "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+ },
+ "release_notes": {
+ "en-US": "v 11.1.3 (bump from 11.1.2 due to AMO versioning issues)\n============================================================\nx Fixed regression: document media and font restrictions\nalways cascaded (thanks BrainDedd for report)\nx Remove domPolicy logging when debugging is off\nx Trivial reordering from Mozilla source\nx Updated TLDs"
+ },
+ "reviewed": null,
+ "version": "11.1.3"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "da": "Dette værktøj, vinder af \"2006 PC World World Class Award\", giver ekstra beskyttelse til din Firefox.\nDen lader kun JavaScript, Java og andet kørbart indhold køre fra betroede domæner du har valgt, fx din home-banking hjemmeside, og forsvarer \"tillids-grænserne\" mod cross-site scripting angreb (XXS).\nEn sådan forebyggende metode forhindrer udnyttelse af sikkerhedshuller (kendte som ukendte!) uden tab af funktionalitet...\nEksperterne er enige: Firefox er faktisk mere sikker med NoScript ;-)",
+ "de": "WICHTIG\nEine Anleitung in die Grundlagen von NoScript 10\n\nIst die neue Oberfläche von NoScript 10 immer noch ungewohnt?\nSehen Sie sich diese von Nutzern erstellte NoScript 10 Einführung und diesen Vergleich zwischen NoScript 10 \"Quantum\" und NoScript 5 \"Classic\" an.\n\nAls Gewinner des \"PC World World Class Award\" und ausgeliefert als Teil des Tor Browsers bietet Ihnen NoScript den besten verfügbaren Schutz im Internet.\n\nMit NoScript können Sie JavaScript, Flash, Java und andere ausführbare Inhalte bloß auf vertrauenswürdigen Domains Ihrer Wahl zulassen, z.B. beim Online-Banking. Somit verhindern Sie aus der Ferne ausnutzbare Schwachstellen inklusive Spectre und Meltdown.\n\nIhre vertrauenswürdigen Bereiche werden dank der einmaligen ClearClick Technologie gegen seitenübergreifende Scripting-Attacken (XSS), Cross-Zone DNS Rebinding / CSRF Attacken (Router Hacking), und Clickjacking-Versuche geschützt.\n\nDieser präventive Ansatz verhindert das Ausnutzen von (bekannten und unbekannten!) Sicherheitslücken ohne Verlust an Funktionalität, wo Sie diese benötigen.\nExperten sind sich einig: Firefox wird wirklich noch sicherer mithilfe von NoScript ;-)\n\n\nFAQ: https://noscript.net/faq\nForum: https://noscript.net/forum",
+ "el": "Αυτό το πρόσθετο που κέρδισε το βραβείο «2006 World Class Award» του περιοδικού PC World, παρέχει πρόσθετη προστασία στον Firefox.\nΕπιτρέπει την εκτέλεση JavaScript, Java και άλλου εκτελέσιμου περιεχομένου, μόνο για έμπιστους τομείς δικτύου της επιλογής σας (π.χ. την δικτυακή υπηρεσία τραπεζικών συναλλαγών σας) και τους προστατεύει από τον κίνδυνο επιθέσεων cross-site scripting (XSS) .\nΑυτή η προσέγγιση προκαταβολικού μπλοκαρίσματος δεν επιτρέπει την εκμετάλλευση κενών ασφαλείας (ήδη γνωστών αλλά και άγνωστων ακόμα!) χωρίς να επηρεάζει την λειτουργικότητα...\nΟι ειδικοί συμφωνούν: Ο Firefox είναι πραγματικά ασφαλέστερος με το NoScript! ;-)",
+ "en-US": "Winner of the \"PC World - World Class Award\" and bundled with the Tor Browser, NoScript gives you the best available protection on the web. It allows JavaScript, Flash, and other executable content to run only from trusted domains of your choice (e.g. your banking site), thus mitigating remotely exploitable vulnerabilities, such as Spectre and Meltdown.\n\nIt protects your \"trust boundaries\" against cross-site scripting attacks (XSS), cross-zone DNS rebinding / CSRF attacks (router hacking), and Clickjacking attempts, thanks to its unique ClearClick technology.\n\nSuch a preemptive approach prevents exploitation of security vulnerabilities (known and unknown!) with no loss of functionality where you need it. Experts do agree: Firefox is really safer with NoScript ;-)\n\nFAQ: https://noscript.net/faq\nForum: https://noscript.net/forum\n\nA Basic NoScript 10 Guide\n\nStill confused by NoScript 10's new UI?\nCheck this user-contributed NoScript 10 primer.\nand this NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison.",
+ "es": "Protección extra para su Firefox: NoScript sólo permite JavaScript, Java y otros plugins en los sitios web de confianza que Ud. elija (como la web de su banco). Este planteamiento preventivo basado en una lista blanca evita que se puedan explotar vulnerabilidades (conocidas o incluso desconocidas) sin pérdida de funcionalidad... Los expertos lo confirmarán: Firefox es realmente más seguro con NoScript :-)",
+ "fr": "IMPORTANT\nUn Guide élémentaire pour NoScript 10 (en anglais)\n\nConfus avec la nouvelle interface graphique de NoScript 10 ?\nConsultez cette introduction à NoScript 10, contribution d’un utilisateur (en anglais)\net cette comparaison entre NoScript 10 « Quantum » et NoScript 5 « Classic » (ou « Legacy ») (en anglais).\n\nLauréat du « World Class Award » décerné par PC World et fourni avec le navigateur Tor, NoScript vous offre la meilleure protection disponible pour le Web.\n\nIl autorise le contenu actif JavaScript, Flash, Java et autres à ne s’exécuter que sur les domaines de confiance de votre choix, par exemple le site de votre banque, réduisant le risque d’exploitation à distance de vulnérabilités comme Spectre et Meltdown.\n\nIl protège vos zones de confiance contre les attaques par cross-site scripting (XSS), DNS rebinding / attaque CSRF (Cross Site Request Forgery) (piratage de routeur) et les tentatives de détournement de clic (Clickjacking) grâce à sa propre technologie ClearClick.\n\nCette approche préventive empêche l’exploitation des failles de sécurité (connues mais aussi inconnues) sans perte de fonctionnalités là où vous en avez besoin. Les experts en conviendront : Firefox est réellement plus sûr avec NoScript ;-)\n\nFAQ : https://noscript.net/faq (en anglais)\nForum : https://noscript.net/forum (en anglais)",
+ "it": "IMPORTANTE\nGuida di base a NoScript 10\n\nAncora confuso dalla nuova interfaccia di NoScript 10?\nLeggi qui i contributi degli utenti di NoScript 10.\ne una comparazione tra NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (o \"Legacy\").\n\nVincitore del premio \"PC World World Class Award\" ed incorporato nel browser Tor, NoScript ti offre la migliore protezione possibile per il web.\n\nAttiva JavaScript, Flash, Java e altri eseguibili solo sui domini fidati scelti da te, ad esempio il sito della tua banca, riducendo le possibili conseguenze di vulnerabilità, inclusi Spectre e Meltdown.\n\nProtegge la tua rete dagli attacchi cross-site scripting (XSS), cross-zone DNS rebinding / attacchi CSRF (intrusione nel router) e tentativi di Clickjacking, grazie alla sua tecnologia unica ClearClick. \n\nCon un approccio proattivo previene lo sfruttamento di vulnerabilità di sicurezza (conosciute e ancora sconosciute!) senza perdere le funzionalità necessarie.\nGli esperti sono d'accordo: Firefox è veramente più sicuro con NoScript ;-)\n\nFAQ: https://noscript.net/faq\nForum: https://noscript.net/forum",
+ "nl": "BELANGRIJK\nEen basale Handleiding voor NoScript 10\n\nNog steeds in verwarring door de nieuwe UI van NoScript 10?\nBekijk deze door gebruikers aangeleverde beknopte handleiding voor NoScript 10\nen deze vergelijking tussen NoScript 10 ‘Quantum’ en NoScript 5 ‘Classic’ (of ‘Verouderd’).\n\nAls winnaar van de ‘PC World World Class Award’ en gebundeld met de Tor-browser biedt NoScript de best beschikbare bescherming op het web.\n\nHet zorgt ervoor dat JavaScript, Flash, Java en andere uitvoerbare inhoud alleen wordt uitgevoerd vanaf vertrouwde domeinen van uw keuze, zoals uw website voor thuisbankieren, zodat op afstand te misbruiken kwetsbaarheden, waaronder Spectre en Meltdown, worden verminderd.\n\nHet beschermt uw ‘vertrouwensgrenzen’ tegen cross-site-scripting-aanvallen (XSS), cross-zone-DNS-rebinding / CSRF-aanvallen (routerhacking) en Clickjacking-pogingen, dankzij de unieke ClearClick-technologie ervan. \n\nEen dergelijke preventieve benadering voorkomt exploitatie van beveiligingskwetsbaarheden (bekende en zelfs onbekende!) zonder verlies van functionaliteit waar dat nodig is.\nExperts zijn het ermee eens: Firefox is echt veiliger met NoScript ;-)\n\nFAQ: https://noscript.net/faq\nForum: https://noscript.net/forum",
+ "pl": "Zwycięzca \"2006 PC World World Class Award\". Narzędzie to stanowi dodatkowe\nzabezpieczenie dla wszystkich przeglądarek Mozilli. NoScript pozwala\nwykonywać skrypty JavaScript i aplety Java tylko przez zaufane domeny\nwybrane przez użytkownika np. witryny banków internetowych oraz zabezpiecza\nprzed atakami typu \"cross-site scripting\" (XSS). Takie prewencyjne podejście\nzabezpiecza przed wykorzystaniem luk bezpieczeństwa - znanych i nieznanych -\nbez utraty funkcjonalności.\n\nEksperci są zgodni: Firefox z NoScript jest naprawdę bezpieczniejszy!",
+ "pt-BR": "IMPORTANTE\nUm guia básico do NoScript 10\n\nAinda confuso com a nova interface gráfica do NoScript 10?\nConsulte esta cartilha do NoScript 10 de contribuições de usuários.\ne esta comparação entre NoScript 10 \"Quantum\" e NoScript 5 \"Classic\" (ou \"Legado\").\n\nVencedor do \"PC World World Class Award\" e incorporado ao Navegador Tor, o NoScript lhe oferece a melhor proteção disponível na web.\n\nEle permite que JavaScript, Flash, Java e outros conteúdos executáveis funcionem apenas em domínios de sua confiança, por exemplo no site do seu banco, mitigando vulnerabilidades de exploração remota, incluindo Spectre e Meltdown.\n\nProtege suas \"fronteiras seguras\" contra ataques 'cross-site scripting' (XSS), ataques 'cross-zone DNS rebinding / CSRF' (invasão de roteador) e tentativas de Clickjacking, graças à sua inigualável tecnologia ClearClick. \n\nTal abordagem preemptiva previne exploração de vulnerabilidades de segurança (conhecidas e até mesmo desconhecidas!) sem perda de funcionalidade onde você precisa.\nEspecialistas concordam: o Firefox é realmente mais seguro com o NoScript ;-)\n\nFAQ: https://noscript.net/faq\nFórum: https://noscript.net/forum",
+ "ru": "Победитель \"2006 PC World World Class Award», этот инструмент обеспечивает дополнительную защиту для Вашего Firefox.\nОно позволяет запуск JavaScript, Java и другого активного содержимого только для доверенных доменов по Вашему выбору, например, Ваш личный банковский веб-сайт. Обеспечивает безопасность Вашей работы в \"зоне доверия\", защищает от атак с использованием межузловых сценариев (XSS), кросс-зоны DNS подменой / CSRF-атак (хакерских маршрутизаторов), и атаки ClickJacking, благодаря своей уникальной технологии ClearClick. Он также реализует DoNotTrack защиту по умолчанию, см. http://snipurl.com/nsdntrack.\nТакой упреждающий подход предотвращает использование уязвимостей (известных и даже неизвестных!) Без потери функциональности.\nЭксперты едины во мнении: Firefox действительно безопаснее с NoScript ;-)",
+ "sk": "Víťaz ceny \"2006 PC World World Class Award\". Tento nástroj poskytuje špeciálnu ochranu Firefoxu.\nPovoľuje spúšťanie JavaScriptu, Javy a ďalšieho spustiteľného obsahu len na dôveryhodných doménach podľa vášho výberu, napr. na webovej stránke bankingu.\nTakýto preventívny prístup chráni pred zneužitím bezpečnostných dier (známych aj neznámych) bez straty funkčnosti.\nOdborníci by súhlasili: Firefox je s rozšírením NoScript naozaj bezpečnejší ;-)",
+ "vi": "Đã chiến thắng trong \"Giải thưởng Cấp độ Thế giới PC World 2006\", công cụ này cung cấp lớp phòng vệ phụ thêm cho Firefox của bạn.\nNoScript chỉ cho phép JavaScript, Java (và các phần bổ trợ khác) trên những tên miền tin cậy mà bạn chọn (vd., trang web ngân hàng của bạn), canh gác \"vùng biên giới tin cậy\" của bạn chống lại các âm mưu tấn công cross-site scripting (XSS) và Clickjacking, nhờ công nghệ ClearClick của nó.\nPhương thức ngăn chặn trước dựa trên sổ trắng này ngăn chặn việc khai thác các lỗ hổng bảo mật (đã biết hay thậm chí chưa biết!) mà không làm mất đi chức năng...\nCác chuyên gia đều đồng ý rằng: Firefox thật sự an toàn hơn với NoScript :-)",
+ "zh-CN": "重要\n一篇基础的NoScript 10 指南\n\n仍被 NoScript 10 的新 UI 所困惑?\n看看这篇用户贡献的 NoScript 10 入门。\n还有这篇 NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison。\n\n作为“PC World World Class Award”大奖的获得者并内置于 Tor 浏览器,NoScript 将为您提供最佳的网络保护。\n\n它只允许在您选择的信任域上执行 JavaScript、Flash、Java 和其他可执行内容,例如您的家庭银行网站,能够缓解包括 Spectre 和 Meltdown 等远程可利用漏洞。\n\n多亏了其独特的 ClearClick 技术,它可以保护您的“信任边界”不受跨站点脚本攻击(XSS),跨区 DNS 重新绑定/ CSRF 攻击(路由器黑客)和点击劫持(Clickjacking)尝试。\n\n这种先发制人的机制在不损失任何功能的前提下,防止利用安全漏洞(已知甚至未知的!)进行攻击。\n专家们一致同意:拥有 NoScript 的 Firefox 更安全 :-)\n\n常见问题解答:https://noscript.net/faq\n论坛:https://noscript.net/forum",
+ "zh-TW": "這個工具是 2006 PC World 世界級大獎贏家,讓你的 Firefox 更加安全!\n\n使用此套件後,僅有你信任的網站(例如你的銀行)才能執行腳本、Java 與其他動態內容。建立「信任範圍」以抵擋跨網站腳本攻擊(XSS)。\n\n未雨綢繆、使用此套件避開安全漏洞(連未知的漏洞也照擋不誤),而不損失正常功能…\n\n連專家都同意、Firefox 有了 NoScript 後更加安全了 ;-)"
+ },
+ "developer_comments": {
+ "en-US": "Security issues affecting Firefox or the Tor Browser which can be fixed by a NoScript update are guaranteed to be addressed within 24 hours. This sometimes requires many updates to be issued in a short timespan, and when this happen you may notice NoScript UI's asking to \"reload this page in order to operate properly\". This is normal on \"live\" updates, and it just means the UI is out of sync with the page content, but there's no need to worry as all the restrictions to scripts and active content are still in place.",
+ "vi": "Vì nơi này không phải là một diễn đàn hỗ trợ, bạn sẽ không nhận được bất kì sự trợ giúp nào ở đây, và câu hỏi của bạn có thể sẽ bị biến mất.\n\nNếu bạn cần hỗ trợ, vui lòng\n1) đọc FAQ: http://noscript.net/faq\n2) vào diễn đàn này: http://noscript.net/forum\n3) liên hệ trực tiếp với tôi: http://maone.net\n\nBạn luôn được hoan nghênh!\n\nCÁC VẤN ĐỀ CÀI ĐẶT ĐƯỢC NHẮC TỚI TRONG FAQ 2.1, http://noscript.net/faq#qa2_1",
+ "zh-CN": "因为这里并不是帮助论坛,所以您在这里提出的问题将石沉大海,得不到我们的任何帮助。\n\n如果您需要帮助,您可以:\n1)阅读常见问题解答:http://noscript.net/faq\n2)访问论坛:http://noscript.net/forum\n3)直接和我联系:http://maone.net\n\n非常欢迎您!\n\n有关安装的问题都包含在常见问题解答2.1中,http://noscript.net/faq#qa2_1\n\n重要事项:在询问或评论关于启动时向https://secure.informaction.com/ipecho 发送的*完全匿名*查询或定期发送信息到您的WAN IP之前,请阅读关于WAN IP的保护特性 http://noscript.net/abe/wan (在2.0的发布说明和这里的隐私政策中也有提到)。如果您对完整的匿名性和完全的隐私保护功能有所怀疑,只需要检查(或找您信任的人检查)这里的源代码,文件是content/DNS.js。谢谢"
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/edit",
+ "guid": "{73a6fe31-595d-460b-a920-fcc0f8843232}",
+ "has_eula": false,
+ "has_privacy_policy": true,
+ "homepage": {
+ "de": "http://noscript.net",
+ "el": "http://noscript.net",
+ "en-US": "https://noscript.net",
+ "es": "http://noscript.net",
+ "fr": "http://noscript.net",
+ "it": "https://noscript.net",
+ "nl": "https://noscript.net",
+ "pt-BR": "https://noscript.net",
+ "ru": "http://noscript.net",
+ "sk": "http://noscript.net",
+ "zh-CN": "http://noscript.net"
+ },
+ "icon_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAcl0lEQVR42sWbeViV1fbHP++Bw3iAw+AAyKSoKJigIorihDM5Z2WWWU45D+V0zSE1p2bTNC0ry+ne6laWZg5N19ukHNAAURTFWdEmp0T5/v54jwqI4+3e3/s8+0Gf8w57fffaa6/9Xd8NJS4DeBQY/R+2IUBjw6BFYKC1Y/Xq3N+wIaM7d/Yb3bVrrdFdurQe3bnzA6Pvvbf/6I4dB4/u0GHA6HbtHhrdrl2HbvXq1W0dE1Oxa2wsjSpWJMHTk4aGQXOg1fXNqxVw3x30axQQwE0uC7AX0N02b2+UmEh+jx40q149MNJuf7tuWNiG9WPHrtHChVs1fXq2Ro3KV79+B9S7d4F69jyonj0L1KvXfj322N7i/v1zLo4Y8f2JkSM//KpPn1nzUlO7twsPDw90ccEV8APs4G6HoXZw2OGe4XfYx1q3AiDnbgwPCED33ouef95Da9emXVy79o3NTz65x8Pd3cTF1VVD7fY/Dri55Qi2C9LLNIcgQy4uO2SzZSs0NE/16h1SWtoRPfJI9q4HH1zxTGLi/Z5Wa0/AUeLTnzx6B/28DMT8pQD4+KBOndCiRX7auHGIVq/+Tk8+efJikyZHGnp6FpW9vQIUzYFDf0CGYJvT8PLaFWC2y8MjM71q1WMPRETIarFc14V+0Pn/B4AGDdC8eS7auLGfVq50qF+/06pada8MI+MiOD6CvU/B8UZwxmZ+++qj0XD+Xci/fMXIa15QEoBteZD1GBQCxVeeNUDhbm4Xu4WG/lrDx+fZVoYRVuTm9j8EwNcX9e2LPvooUWvXfq4RI35RVFReGXd2OA3bJth+EnYshQOecCkiKkou3t4CVBPOroB9v0DmGci8ZHrG9tOQOQ6OGHAJUGhYmGJq1VIAXPwc9pzz8spUXFz2Lykp60dFRHRrarXyvdWKDOO/DEBUFJoxA23aNFrz5x9WUtIhWSyOG4xg+kXI2Ac5a2Fvew+P3xe/+abOnjun/Px8rVq9Wo8+8YTCqlVTDTjXHU6PhOOj4FQ4/BmdkKDps2bp22+/1e+//66LFy9q4RtvqKeHxy/nrnzD33+XEhL2v1+z5qvV3d0rz3FxQRbLfwmA+Hi0eLFdn3/+joYP/1UVKuTcyPCDkLUKDg6EwiQ4aIXT0+bNU3nXiZMnFRIVdR74AfgR2BpWtWpR4alT5d4/bt48zYWDV2OIq2umIiL2761RY2Oip2fi/YbBmRuAcPcAJCWh5cvD9OGHW9StW6Gs1szyjM+H7JfgaCoUVoQsA9YBq3z97UdKGrR69WoNHDhQL774oiRp6tQpCq3Z4FxcSqdf/CqGF06a9LfiK/cWFBRo4sSJGjZsmH744QcdP3dOPQIC/igu+/3AwD1nIyO3t/Xw6FgbOFkOCHcHQGIiWr48SqtX/6iWLY+WF7V/gR1vwaGWcMoPMoD3gY/cPNx3xMYn/p7YsJEuFRVJkl555ZVSrx/8xBN6+83XVb3TVPV655xqdpmmpYteNb3jxAnVrFnz6r1eXl7avHWrHoqPP3+xvODp45NTVKnSzo6urj1iDIOTZWLCnQMQG4uWLg3RypXfq2nTI+WMuuMyZMyDAn/YA/wDeN/P7r+3a6/+mvjiag16YaNq1GupE8cOS5Li4uJKARAYGKCHH3pA1Ogn2r8nqg/Q5EkTrnpK2fFI695dHSOqXN4Gxy/Cz9f1ycsrq8jHZ0dr6FYbOHnXAISEoOef9y5es2a9WrU6Vp7xAkcxZH5mGFkh8CGurj+07frw5alLNumROZsU2XOBjJTZokJzPTd7uiSpadOmpQzycHeVb8Vw0XCSaPKsqDdRUTXjdfaPX/X1N99cB4Cfn7dC69yrXsHx2gBni6/Fnmv9cnfP/sPNbVtNaJV4VwB4eaExYyh+//2F6tHjlAzDcZOkZdtlN2vORm/vs0MHTFL/N7MV2estkTRVJD4tGk8ViX+TZ1CM3nvrdW364nOFh4fJYhjXDAtvI5rOEo2niKbPirAuatemjfL35KjPIw/Lw93t2r3eobIM2COazVGqxaXoO9h32Vw+S/fLzS0n2zC2eEDsAOfDxbcNQKdOFK9e/aiGDTsld/fMmxi//Szk5Lp7XPyt5j1yNGinsEbjRKMZotFU06DGU0ST6aLBeBFUT8ktOyqpUbLc3NyF1SZCm5ogJU8z/zaeaoIR0UOBkfWU1rm7KlcOFhar8I0QrReJkX+KdsuEq0dBKiz/EfYXQ+l+GoZDLi67l8JyIHCFE4SatwJgV3Q0WriwWvG8eXkKDs69kesL0v+Enbusbn8eiqil3Moxyg2M0GfBsapSd5BInn4NgMZTTAObzBT3jBK1B4mEEaLR06L58yJlrkiZI1Jmmx7QZKb5/6SpotYTos4Tot5I8/eun4gnjon2y4WrVxYQkQZLd8F+lfUEw8i4bBi774WnvMAlH4i/JQD9+6Nly5arSZMjN1jnr47+PsP49UBotPaExCrdFqZ072DlBYVpfWicqtQdWA4Iz4gmM8y/SZNEw4nm3+RnRLN5InWhaPumaP+2aLNUtJpvAtRsrulFTaaLjivEwEOi/Tuq5eqV87jZ9ZABsPIE7LtuoAxjZzps84Cm9wIJ3OLa9vTTbTVixHG5uWWWXer2wK4Lpqtt+wX25fpX0P6IeDn8qsrhHSKHd2U5vIOVFxTuBMHpCcnPmJ2vP1pEdxX2OsKlsrAECb9qwj9GVIwXYS1ErYdMz2j3luj2mej2qej4nmjxsulF7ZaJgQdF+7cV5+qVIzAGmF2vsQA2XYTccrx1z2h4E/C33sz4QB8f10OTJ69T7dr7S472n5AxGQ4nwr7PIP8SZOS7uPyxPyxWP1esrXSfMDm8g50AlAEhfohoOlvUfkT41xBWL8XHx2vokMGa9PQkhXp77noEhveFiQ/AohiML61W7xP41xARXUWzV8T9X4kHvxXt3xEt54vHckW7ZYoxAbAIaGSSHa23w07BjjIAZGZCTiWTP7nxNTI1tb0GDTouF5eScyn9c8iPgoPA0mR4dxMc3GXzL94XniCHf3U5bKEljL/W8oLCtT6snqpU7y58wlQfNvaGyROnTZMkHTl9WvVttjVlk5UsCEqC+XUS4hUQXFVEdhBtlohe/xYd3hXd14lWryrG1SvnshOAE0Ag0BP+dgH2lvWCi7BnCKwCKpVrvLeHBwfGjl2lOnUOlBj99F9hx8NQaMAXTgYqtAH8/QOfIGVXrqMMv+gbAuCwVVFexWitD6isYMP4Vy8wioE4u/37/cePy5GXpzTDWFpcTvo9EnovWbNGRw8VqFq1iEu42/+gdh/RerHpBQ3GKsbV8yoAAjaZplTaBBsE2WW9YANk+0DXcgFIi4uL0bBh+XJ331ly9D+BA6GwD5hhgdBEAFe31zrW66LV9iil+0YqwxZSDgDBcvhGyuEboT0+duX4+vwrymKpM8gwWAzNB48eXfz1jh3qA7PL27gsgC7zXn9d23Nz1drL8431UL0RrCIgxowTke0U4+KWWxIAOUeoNTxcDLvLesFR2NcKFprMWplrWY8eT6pNm1IZ3znIHAgnDfgcaN8ILOeBWl6+/4ye8KMaJY7Qe+4BSveurIzrRj9UDnu02VzcJR9b/kG7/csww0h4CEjz8/t40LRp6m0Y48oD4BVoPnTKFKV17Xr2S4i6Mj1mw8O4ev6KZ5AiDJefL4NR8rkDJndoT4fPZLFklQSgCLKnw3dAw1LG2zw8LEcGDfpU4eF5Jd1/O+yJNef+LCD0E+dH6vpW3Fzr2ZNiYJ7iq3XVCjcfpXtVKg2CLdSMD0Fx2u4RqJNQIB+frAK7/evqFkusP8R4eXufnGQYD5cHwLtQx4iI0AOuri+U/W0j1H4L+m6E+uU9+xgwHIbK1XVPGS/IWAd7/WAw4HoVgNbVqkXqscdyy7r/IjjiBd8DPeuB65V0span36dRTx+S+5hzIm21EkKbaoWbb2kQbCFy+EXJERgrR1CcdrjZLhXCftlsuw/b7VuiDSMuFuxnDcO9PCN+BY8XoNMx8LxTkjbXMEiCGhfc3bfJxaXkipC+C/LrwVIg6CoAk5KTO6tDhyMl0ToHO/rDcWAFUGd+iXz6Xovr8qAnc+Q5tkjc/41oMkMJwY20wr0kCMFy+FSRwx6tjAp1lFW5jn72q6xcq/u5Uzbv3/b42H6MhAZ9/hMa/kbNMLgfLFu9vd+Tp2fJvCC9EHY/CF8C91wF4IOOHScpIeFQSffPh11NoQCYaoPA4yU+8DhMsfb5XN5/k3jYYUbmhhOUEJykFe5+14PgF6XMgJrKCa6jPaGxyq1UVUdCIrUlqNKZSh7em1oYxoxXIO1HCD37F4GwqlIl5vr7j5bdXmpJvABZf4MsoJOzHGTg6NLlTYWH7ysJwLfm2r8TeLgpWMtE6I60mCnvKRL98830NGW2SBxbPgi2EDlsVeTwjVCGvZqyKsQoNyRWx6Lr66e6LdTx0XmK7jtPNRp1/i2hQujWB2DW69C8ANzvFoA9HTowOCamlSpU2F1yj1AMmQthnysMA9wItdmshzt3/kz+/rtKusrf4WAAfAW0mFvm5dkQ6BrS+JRlbLEY9pu4b7No8ZKZ5zd4qhwQnEB4B8vhHaJ0W6jSbWFy+EYor3JNfVu3g9qP+lLJC86q/YIjajJ5s6K7PKVqYbVyesDcjyD28h0CcGnwYGb26xd1tlIlh1xdS2WGa6DA1wzsftQNDKxwrkOHb+XpWWrJeBMOecMHQNw/yvlAsuGyjB6fi6ckHt9tZmgps828/4YgXJ8rpNtCtDsgXGtDEhScMk8uvb9V6JP7lPj8eaUu+E31xn2uCkk9LzRycXnvQ4i9bRBGjOCFmTP9jkVGfiMPj1K2rYOCymYgDOaegICosy1b/iQ3t5IrgON1OOwGbwGRWeV84EOIJbTpnww+IYafEb2+N2NB02fvEATn3iEwTOtC4xRaf4xIXSrSPpC1z0+q8vRvajhfqjX+e9lqtT3TFyYWlln7y23Dh/Pp2rXue2NiNsrbO6ekd2+BA2GwGqhKXX//mLNNmlznJovhkCu87gah5RVMi80oMpuEYeKJo2LIKXPT0nqRSWg0mS4S7wSEysoLDNP6kFhzA9XsOdFqobj3Axl9MlXx6Yuq9Vyx3O59Tg0srh8Ugu1WAPzjiy9cttWuvUE+PqWm9zdwIAI+BmpR126vfTYxMUMuLpllPOAQ8Fp1qHyj+XcS3BpifEL8ENE3Rww+bm5Y2r5p7u+bzCwRGH1vzxOCwrQ+NFZV6j5helOzeeb77v9G1uGFCp4l0fMDJbp6rD8JHjcEYNAgco4eddnVuPEG2WylAPgKDoTDZ8A91PX1rXk2IWF7mYTBsdQJQA2ofDOkC8GrIfyTqA6i0/ui/z7x6M+iy0cmwdFsrnOJbHR9snRLEAaZgbXpLJH6mrhviyxDTshzikTrReoE84tvAsCBwkKX/JSUDfL2LgXABigIMWsWdaljs0WcqVv3O1mtpWLAu2ZFZ3E4VD5/i/lWCC79YAq2kPPUGSg6fyAeThcPfS+6fmyOYPJ0JYQkl582lwtCCVKlyQzTG1ovEg9ulTHiDzGmSES2vfwhNLwRAKePH3c/07r1Fnl5lYoBH8DBIPgEqEOsp2fg73FxW+TuXjZSHqgAy4DQ3NuMvB9B3ST4B7bQIqK7mVxf5w/FfZtEjw2i3TIlRHXQCg9/pXsHK6MUiXIzEAaaIKTMFh2Wm4TImMsibbWSDZeV5fZn2DC2f/ON/XSzZt+VXeHegMM2+DtQC5vF4pobHf1+WTfJgPw4s9BRNf0O1t9iszpSLw3m2108CrBHi6iOot5oM1doOV8JVdO0wquS0n3DleEbbmaLtpASuUJZEK5Mh5nmO+7baOYffbPl6l/9dBYEXdeXIUM49sMP1S+lpu4qGeCLIWM6HHUxKbIoAL4KC3tVfn4ld07px2B3VzNnTnjvLrOxw+C3DNqnwUvBhmUb7vYzBNQUIY2V4BupFR4BSvepogzfKJNX9I0wM8arYJQzHVLmOonRAjHoqKjWWcug3XXfHzWK7NWrOyg5+VDJ0T8LO/vDUeB5oDIACwICRiowsBSj+idkPQM7gLRxf0Fu/gvwDUQshE5tYDqGyxcJhuXUSotV260+prH2aDn8a5hEii20HBCcS2SbJeLRnWJIobhnkAbD2LLfKxo/nvPvvDNFtWuX2uMchJyW5h5nHOALQB8Pj9YKCtpThlfPWA97PWB0DLj91Ts2J5NbPQmWfAznfjYsRQ53XxOEwNqmR5QHQkisqiSOFQ/9IIaeEonj1Afml3q/xcLZCRMsZydNWqdKlfaUBOAbc4+TDTwCmCRxjGGEFtnt38vFpdRKcBj2Noe3XKBi2UD4Zxkq6j8AITAFXvwaDhXAyQw3H5NDCKxtTgnvkOsyxvWhdVSl3Rti6K+i4UT1hbdLvTskhMtTp8bq8cf3yWotxQcsgKNe5h6nVcmCiLHdze0tubnllqn8Zr1sChcaj3e+/DS4dfH0fKt5aEROD5h11EmU/IcgVGgCL/8b8vfDaYdflDIq1pXDr5ozHlyfNq+vmqIqPTaIBk9pALxVKhC3bcv5OXMmKSXlaEmK7w/Y8YhJIL9zXZlwEjwmqzWvLJG4G/KiYGwwWM8DP0PF4NoNzjyxYLPszQYowuqxaSPE/BUgpMCLG+DkDp/KyqrsLLiUR7jaQpRXqYbW12ynShGpagrPX9UH2e0UjR/vUzxlyk+qUKFkaS/9J8irbdKGkwD/UgDUgKpnLZYfZRg7ypS/c56DDUD0YuAIVAiq2uBE3cEfqkrvNQofsFa+1ZqcHgpP7r0L+qoMCP4NYdnfPX2VVam2MnwjyiyLV1qIHPbqyguto3UBlVTRMP7W2zBMfVDbtpxbsGCQunU7XnYw58ExT5MU7Qa4XMcMr4FXVA6dfBx214ERocB2CAyu0exEzQm7ROvXFTgoXXGzz6hyr4WKDIrc+RT03Q0+dwPCUACLZdWDSR21xjfkxsmSLdRcLfyqao+PXbv8fL8Lh/gHvbw4M22av+bOdSg4eHfJ0S+A7FTT/d8EapdbG2gMzc6bBYWy9fasdWbgqNEB7JExqSdqzb5gZnitFsrt0e2qNuOCEuceU9Xerygqsu7e+2DeP6Hx7bI6OVChK7zWud84tZu6QQlVmmuF9QZ7B58wOQJqKt2rsnYaxkX52PIKAgK+qh0YeM/WWbNmqEuX42UKuelL4LDdpMKGAT43qo5Z3zUj6u5yCoy7x8M8IDwwJvVY7DyJR7PMzKzFy6LzR/Lql6laM35Ts5dPq+GEDaqRNlw1o+7JbeXm/u4gGPM6dFsMjRdD4mJouBjaj4FBXa2uS5PqxB/uN3WBnnj5W/l2eEUkji+HaC1RcLFHa5vVpgIoFGyTn9+u37t0Sf+zX7898vUtxW4XQFZbU3C5Bki+aX2wDjQ/YnpBacGBxZJ53mLJbAtjrDGph2OfczJBbZaYpe+UOeb+vf0KWR/YqCqjctRoznG1f+Ww2s/5QS3GrVSjfrMUf99wJXQbpPrdB6pF36fUbcwcDZjzrkbM36AWI1bL2mymKa5InlY+qXKl4OJVSQ7DUnwedjlFmQ7ZbFlydy8bwxzPwTFf+BkYc13wK3m5mJJ5y0R46WJ5tXardccRg/SEGs3PRjwn0W+vaLvMZICuKEGazjLJjBbzReulcum0SgG9P1P0kK/VYOx3ajnle7WbulXtJm9Ry7Gfqv7AFQrr/qpcU54xJTWNJpcWVVwBwc3XrED5RsrhU0XbXDx0CE7eSnP8PeyJN+f+ciDppqPvCzwNuEP1T+HfxZBTRmyQLqtL9lfBVS/VH/6TqdTouNLcql4VQjhH74oYoslMkfysSJ4lGs8SjZ8VjWaKpGdEw6kicbJoWMbwssqSxLHmVtozSA5biNKt3sqB85dML72hgqUQdj4Cp11hK9DPE2x+NwPA1XleINnU0jy0E/LK1NrTLxrGzgI//6ItDbor6oHN4r4touXLprFXND4lwbhlm3KLNlWkzDKLL5WT9J7FqgyMoguQddX1y2lF4JgFx/1hNzAHiB53XVGwHIlMAeYTgFtXmJsPBSUBKIKdO919Lu2NrK9v63VScue3RZe1InWRGQeuSGAaT7tNA2/Skqc5+cUZIu5x4RetuvDrT2aM2n4z118BB6vCEbPMSIs4sJwB4m5XJ7jAWWsfDGsOmgIkhyC9GDJyDZezP7r5KTuwirLrpmhoh2fl2v0z0eljU9/T6lWTy2v67DVAkqeZoJRUg5VsyWWmTvJ00XCCiO0rKjUUhrfsVutKd0/P2h8lJq5yZnnlGr8O8uNNjeSnQC8P8HLcrkosp0yVFYgZCRv2lwDhEuw4CQW5cGanh6fyq0Xr780fVOMOz4sOK0Snf5pMUNpKU9PTepEpeGrxkmj+glP49JwJUrN51/6dMls0miISholqnYQ9RuApXzf3HRPatr7v4JIlVXMWL15YPGLE/jJL3VXjv4B9DeGUBTZjVoGD3rhbqewFoIH5U71BsDkHDpQ80CBIPwu7jsKRI4H2M3vrxRcvaNZJ9RN7izoDRPyTotEzJonR/HnT+GbzTM1Q05mmRzScIBKGi5jeIqyN8Kkl8BVYLlQNDNw4Ia3jo3sXL6qnzZsnafHivUpLOyZv7x3lqdQ/hv2JpvFfOpe80KH/qVi68BoI9XvCun/BoSIzMKaXORiRftHVNftyeJWC0ynJpz9JTb3QNz7xcmRItPCpchnP0Et4hQvPcOFRRXiGCddKwvAXeBfh5X/KXjkkM75Bg/cG9+836tMZ09v9vmpVV61fv0Dz5+epc+cTCgjILk+6dwEylsLhODhpMZUyY4DwgX+VXL4ECHFJ8N67cLjQXCLL0xFul9U1XWFhO9UsZc9v93U/+OMD9+1f3rWT49XO9342ok2rJUvGj33umRHDnn1j/ssz33rlpbFvT5vSL/2jD+8/vH7dg9r6r1HavPkNLV26XUOHHldS0iHZbD+XcyLFIUg/AFnj4WSYSeN/4jy1Fzrwrz4wUQi0MG8LrwQzx8Den+BA0Y3XYrPDHh4OhYXtVFLSLnXpskv9+v2skSN3aPToTE2enKnJk3dq3LgcDR++V336HFFq6jHVrHlAfn7ZKk8IfWU5hoy1sD8NTvua3V4O9AKChv63jsxcvrJjM0VGDzWGLS/B0VzIKzY3UOm3OAVmHo8zjExZLJkyjGvt2gYs/WbvKQbHT7B7FBRWM9ndr53rfAsv8Fryvzg1ttzUl1iBeC+YlQo7XoJjO2DvhWsekX6TdfpOWrog/TxkboW88XCyLpzwNM8Pvg30B6LrguW7/+WxuXxTlIhzc9HWC15NhMzRcOyfcGgf5P5ZGozbAaXUvRcgcxfsWg6H+sKpGJPQcAArnYEuyRdsE4DbUZbcFgC5d0hifG3yCIZTgdkWeLYibG4C+wbDidfg2EY4kA27j0P2H7DjImQ6p0zGZcj4EzL/gB1HIWsn7P4M9r8Axx6FwgZwIhD2uJh8xBLnfj7ZFfwfcA7EnfT3lgBkO5G6nXalMHkJWAt0B8PV9Ih6QB/gBS/4NBQc8ZDfGo4+ACf6wclhcHIknBwKhY9DYQ8obAkn68CRENjnDekWk4p7A5hovp5YP/AZjslrlaxG3U5/i24FAM5aUc07bLWdy2Q84FaCXAEqmBQDHZxzdbKpgWQZpm73fUwVyhpnaHnN1ELypJO3T3Wedw64wuH5AvWdsveYu+irG/8/l2HusrEDIUA0EAvUdeJ2jxPHqs5yle/VosV/+fo/37coISABWD0AAAAASUVORK5CYII=",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/0/722-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/0/722-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/0/722-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-10-12T10:19:34Z",
+ "name": {
+ "de": "NoScript",
+ "el": "NoScript",
+ "en-US": "NoScript Security Suite",
+ "es": "NoScript",
+ "fr": "NoScript Security Suite",
+ "it": "NoScript Security Suite",
+ "nl": "NoScript Security Suite",
+ "pt-BR": "Suíte de Segurança NoScript",
+ "ru": "NoScript",
+ "sk": "NoScript",
+ "zh-CN": "NoScript 安全套件"
+ },
+ "previews": [
+ {
+ "id": 846,
+ "caption": {
+ "en-US": "Enable JavaScript only where you're sure it is safe, with ONE CLICK!"
+ },
+ "image_size": [
+ 291,
+ 244
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/0/846.png?modified=1543518598",
+ "thumbnail_size": [
+ 291,
+ 244
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/0/846.png?modified=1543518598"
+ },
+ {
+ "id": 1060,
+ "caption": {
+ "en-US": "NoScript can block any kind of potentially dangerous active content, not just JavaScript!"
+ },
+ "image_size": [
+ 423,
+ 447
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/1/1060.png?modified=1543518599",
+ "thumbnail_size": [
+ 423,
+ 447
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/1/1060.png?modified=1543518599"
+ },
+ {
+ "id": 1062,
+ "caption": {
+ "en-US": "NoScript's ClearClick module is the first and only client-side protection against Clickjacking!"
+ },
+ "image_size": [
+ 457,
+ 428
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/1/1062.png?modified=1543518599",
+ "thumbnail_size": [
+ 457,
+ 428
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/1/1062.png?modified=1543518599"
+ },
+ {
+ "id": 52395,
+ "caption": {
+ "en-US": "NoScript's powerful XSS filter has been the first and is still the most effective."
+ },
+ "image_size": [
+ 504,
+ 385
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/52/52395.png?modified=1543518600",
+ "thumbnail_size": [
+ 504,
+ 385
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/52/52395.png?modified=1543518600"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.5282,
+ "bayesian_average": 4.526654549689467,
+ "count": 3391,
+ "text_count": 2367
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/722",
+ "slug": "noscript",
+ "status": "public",
+ "summary": {
+ "da": "Den bedste sikkerhed du kan få i en browser! Tillad kun aktivt indhold at køre fra websteder du har tillid til og beskyt dig selv mod XXS og klik-kaprings-angreb.",
+ "de": "Die bestmögliche Sicherheit für Ihren Browser!\nErlauben Sie das Ausführen von aktiven Inhalte nur Seiten, denen Sie vertrauen – damit schützen Sie sich gegen XSS- und Clickjacking-Angriffe, \"Spectre\", \"Meltdown\" und andere JavaScript Schwachstellen.",
+ "el": "Η καλύτερη ασφάλεια που μπορεί να έχει ο περιηγητής σας! Επιτρέπει την εκτέλεση JavaScript, Java και άλλου εκτελέσιμου περιεχόμενου μόνο από ιστότοπους που εμπιστεύεστε.",
+ "en-US": "The best security you can get in a web browser! Allow potentially malicious web content to run only from sites you trust. Protect yourself against XSS other web security exploits.",
+ "es": "¡La mejor seguridad que puede obtener en un navegador web!\nPermita que el contenido activo se ejecute sólo desde los sitios de confianza, y protéjase contra XSS y los ataques Clickjacking, \"Spectre\", \"Meltdown\" y otros exploits de JavaScript.",
+ "fr": "La meilleure sécurité possible pour un navigateur web !\nCe module autorise le contenu actif des sites auxquels vous faites confiance et protège des attaques par XSS et détournement de clic, « Spectre », « Meltdown » et d’autres failles JavaScript.",
+ "it": "La massima sicurezza che puoi ottenere in un browser web!\nConsenti ai contenuti attivi di essere eseguiti solo dai siti di cui ti fidi e proteggiti dagli attacchi XSS e Clickjacking, \"Spectre\", \"Meltdown\" e altri exploit JavaScript.",
+ "nl": "De beste beveiliging die u in een webbrowser kunt krijgen!\nSta alleen actieve inhoud toe van websites die u vertrouwt en bescherm uzelf tegen XSS- en Clickjacking-aanvallen, ‘Spectre’, ‘Meltdown’ en andere JavaScript-exploits.",
+ "pl": "Najlepsze zabezpieczenia dla przeglądarek Mozilli! NoScript pozwala blokować\nwykonywanie skryptów JavaScript i apletów Java na stronach internetowych.",
+ "pt-BR": "A melhor segurança que se pode ter em um navegador! Permita conteúdos ativos somente em sites que você confia. Proteja-se contra ataques XSS, Clickjacking, Spectre, Meltdown e outras explorações de JavaScript.\nFx52? https://noscript.net/getit",
+ "ru": "Дополнение обеспечивает наилучшую безопасность, какую Вы только можете получить в веб-браузере!\nДополнение разрешает запуск активного содержимого только с сайтов, которым Вы доверяете, и защищает Вас от XSS-атак и ClickJacking.",
+ "sk": "Víťaz ceny \"2006 PC World World Class Award\". Tento nástroj urobí z Firefoxu najbezpečnejší prehliadač na svete.",
+ "vi": "Lớp bảo mật tốt nhất mà bạn có thể dùng trong một trình duyệt web!\nCho phép các nội dung hoạt động chỉ được chạy trên những trang mà bạn tin tưởng, và bảo vệ bạn chống lại các cuộc tấn công XSS và Clickjacking.",
+ "zh-CN": "您在网络浏览器中得到的最安全的保护!\n只允许在您信任的站点运行动态内容,保护您不受 XSS 点击劫持的攻击,并免遭“幽灵”、“熔断”等 JavaScript 漏洞利用风险。\n在用 Firefox 52?https://noscript.net/getit",
+ "zh-TW": "這就是最安全的瀏覽器!僅開放您所信任的網站執行動態元素,保護您免於 XSS 跨站攻擊。"
+ },
+ "support_email": {
+ "el": "noscript@informaction.com",
+ "en-US": "noscript@informaction.com"
+ },
+ "support_url": {
+ "el": "http://noscript.net/forum",
+ "en-US": "https://noscript.net/forum"
+ },
+ "tags": [
+ "adblock",
+ "adblock plus",
+ "ads",
+ "clickjacking",
+ "cookies",
+ "csrf",
+ "dnt",
+ "flash",
+ "flashblock",
+ "google",
+ "https",
+ "java",
+ "javascript",
+ "noscript",
+ "plugin",
+ "privacy",
+ "script",
+ "security",
+ "toolbar",
+ "xss"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/",
+ "weekly_downloads": 10615
+ },
+ "notes": null
+ },
+ {
+ "addon": {
+ "id": 328839,
+ "authors": [
+ {
+ "id": 4010195,
+ "name": "Baris Derin",
+ "url": "https://addons.mozilla.org/en-US/firefox/user/4010195/",
+ "username": "baris-derin",
+ "picture_url": null
+ }
+ ],
+ "average_daily_users": 120634,
+ "categories": {
+ "android": [
+ "performance",
+ "photos-media"
+ ],
+ "firefox": [
+ "games-entertainment",
+ "photos-music-videos"
+ ]
+ },
+ "contributions_url": "",
+ "created": "2011-07-15T10:42:41Z",
+ "current_version": {
+ "id": 5091396,
+ "compatibility": {
+ "firefox": {
+ "min": "42.0",
+ "max": "*"
+ },
+ "android": {
+ "min": "48.0",
+ "max": "*"
+ }
+ },
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/youtube-high-definition/versions/5091396",
+ "files": [
+ {
+ "id": 3635763,
+ "created": "2020-09-01T18:13:07Z",
+ "hash": "sha256:11cf896eb3b50b13e6bd71aee12a08a76b09dbf9af61ce919172ff12bfc6356d",
+ "is_restart_required": false,
+ "is_webextension": true,
+ "is_mozilla_signed_extension": false,
+ "platform": "all",
+ "size": 234528,
+ "status": "public",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3635763/youtube_high_definition-80.0.0-an+fx.xpi",
+ "permissions": [
+ "tabs",
+ "storage",
+ "management",
+ "downloads",
+ "cookies",
+ "contextMenus",
+ "webRequest",
+ "webRequestBlocking",
+ "",
+ "*://*.youtube.com/*",
+ "*://*.barisderin.com/*"
+ ],
+ "optional_permissions": []
+ }
+ ],
+ "is_strict_compatibility_enabled": false,
+ "license": {
+ "id": 12,
+ "is_custom": false,
+ "name": {
+ "ca": "Llicència LGPL (Lesser General Public License) de GNU, versió 3.0",
+ "cs": "GNU Lesser General Public License, verze 3.0",
+ "de": "GNU Lesser General Public License, Version 3.0",
+ "el": "GNU Lesser General Public License, έκδοση 3.0",
+ "en-US": "GNU Lesser General Public License, version 3.0",
+ "es": "Licencia pública menor GNU Lesser, versión 3.0",
+ "eu": "GNU Lesser General Public License, 3.0 bertsioa",
+ "fa": "مجوز عمومی کلی کاهشیافتهٔ گنو، نسخهٔ ۳٫۰",
+ "ga-IE": "GNU Lesser General Public License, leagan 3.0",
+ "id": "GNU Lesser General Public License, versi 3.0",
+ "it": "Licenza GNU Lesser General Public License, versione 3.0",
+ "ja": "GNU Lesser General Public License バージョン 3.0",
+ "nl": "GNU Lesser General Public License, versie 3.0",
+ "pl": "GNU Lesser General Public License, wersja 3.0",
+ "pt-PT": "GNU Lesser General Public License, versão 3.0",
+ "ru": "GNU Lesser General Public License, версия 3.0",
+ "sk": "GNU Lesser General Public License, verzia 3.0",
+ "sq": "Leje e Përgjithshme Publike Më e Pakët GNU, version 3.0",
+ "uk": "GNU Lesser General Public License, версія 3.0",
+ "vi": "Giấy phép Công cộng Ít hơn GNU, phiên bản 3.0",
+ "zh-CN": "GNU 较宽松公共许可证(LGPL),版本 3.0",
+ "zh-TW": "GNU Lesser General Public License,版本 3.0"
+ },
+ "url": "http://www.gnu.org/licenses/lgpl-3.0.html"
+ },
+ "release_notes": {
+ "en-US": "Minor bug fixes"
+ },
+ "reviewed": null,
+ "version": "80.0.0"
+ },
+ "default_locale": "en-US",
+ "description": {
+ "en-US": "YouTube High Definition solves a number of annoying YouTube issues. \n\nFeatures\n\n Automatically play all YouTube videos in the highest resolution possible\n\n Specify your preferred resolution (4k, 1440p,1080p, 720p, 480p, 360p, 240p, 144p)\n\n Change video player size \n\n Control auto-mute volume and auto-stop video play \n\n Supports HD play when videos are embedded in external sites like Facebook, Twitter, Reddit, and others\n\n Set a preferred volume level for all videos\n\n Improve music on YouTube by always playing the best sound quality automatically"
+ },
+ "developer_comments": null,
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/youtube-high-definition/edit",
+ "guid": "{7b1bf0b6-a1b9-42b0-b75d-252036438bdc}",
+ "has_eula": false,
+ "has_privacy_policy": false,
+ "homepage": {
+ "en-US": "http://barisderin.com/"
+ },
+ "icon_url": "data:image/png;base64,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",
+ "icons": {
+ "32": "https://addons.cdn.mozilla.net/user-media/addon_icons/328/328839-32.png?modified=mcrushed",
+ "64": "https://addons.cdn.mozilla.net/user-media/addon_icons/328/328839-64.png?modified=mcrushed",
+ "128": "https://addons.cdn.mozilla.net/user-media/addon_icons/328/328839-128.png?modified=mcrushed"
+ },
+ "is_disabled": false,
+ "is_experimental": false,
+ "last_updated": "2020-09-02T11:04:33Z",
+ "name": {
+ "en-US": "YouTube High Definition",
+ "zh-TW": "YouTube High Definition"
+ },
+ "previews": [
+ {
+ "id": 104784,
+ "caption": null,
+ "image_size": [
+ 256,
+ 256
+ ],
+ "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/104/104784.png?modified=1543519618",
+ "thumbnail_size": [
+ 256,
+ 256
+ ],
+ "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/104/104784.png?modified=1543519618"
+ }
+ ],
+ "promoted": {
+ "apps": [
+ "firefox",
+ "android"
+ ],
+ "category": "recommended"
+ },
+ "ratings": {
+ "average": 4.1305,
+ "bayesian_average": 4.126266281461298,
+ "count": 1111,
+ "text_count": 535
+ },
+ "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/reviews/",
+ "requires_payment": false,
+ "review_url": "https://addons.mozilla.org/en-US/reviewers/review/328839",
+ "slug": "youtube-high-definition",
+ "status": "public",
+ "summary": {
+ "en-US": "YouTube High Definition is a powerful tool that automatically plays all YouTube videos in HD, changes video player size, offers auto-stop and mute, and much more.",
+ "zh-TW": "YouTube High Definition 是一個強大的工具,可自動以高畫質撥放 YouTube 上的影片。"
+ },
+ "support_email": null,
+ "support_url": {
+ "en-US": "https://barisderin.com"
+ },
+ "tags": [
+ "1080p",
+ "1440p",
+ "144p",
+ "2160p",
+ "240p",
+ "360p",
+ "480p",
+ "4k",
+ "720p",
+ "annotation",
+ "auto play",
+ "auto stop",
+ "embedded",
+ "hd",
+ "high definition",
+ "size",
+ "video",
+ "youtube",
+ "youtube hd"
+ ],
+ "type": "extension",
+ "url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/",
+ "weekly_downloads": 2231
+ },
+ "notes": null
+ }
+ ]
+}
diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
index 4cbe1ac30cb36dccd24f16b8e62ee95a81f65389..9d7bb4505034281be830fa892bd4f46c3ab55109 100644
--- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
@@ -19,7 +19,7 @@ object FeatureFlags {
*
* Tracking issue: https://github.com/mozilla-mobile/fenix/issues/13892
*/
- val syncedTabsInTabsTray = Config.channel.isNightlyOrDebug
+ const val syncedTabsInTabsTray = false
/**
* Shows the grid view settings for the tabs tray.
@@ -34,7 +34,7 @@ object FeatureFlags {
/**
* Enables downloads with external download managers.
*/
- const val externalDownloadManager = true
+ const val externalDownloadManager = false
/**
* Enables swipe to delete in bookmarks
diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
index 086035b130052bd01e3a36222e303c52560b5b71..39c18bda89a57408e32fc2a9467f3b311e69e6df 100644
--- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
+++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
@@ -49,6 +49,7 @@ import org.mozilla.fenix.push.WebPushEngineIntegration
import org.mozilla.fenix.session.PerformanceActivityLifecycleCallbacks
import org.mozilla.fenix.session.VisibilityLifecycleCallback
import org.mozilla.fenix.utils.BrowsersCache
+import org.torproject.android.service.util.Prefs
/**
*The main application class for Fenix. Records data to measure initialization performance.
@@ -62,6 +63,8 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
private val logger = Logger("FenixApplication")
+ var terminating = false
+
open val components by lazy { Components(this) }
var visibilityLifecycleCallback: VisibilityLifecycleCallback? = null
@@ -91,6 +94,21 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
setupInMainProcessOnly()
}
+ fun isTerminating() = terminating
+
+ fun terminate() {
+ onTerminate()
+ System.exit(0)
+ }
+
+ override fun onTerminate() {
+ terminating = true
+
+ super.onTerminate()
+ components.torController.stop()
+ components.torController.stopTor()
+ }
+
protected open fun initializeGlean() {
val telemetryEnabled = settings().isTelemetryEnabled
@@ -139,6 +157,11 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
if (!megazordSetup.isCompleted) {
runBlocking { megazordSetup.await(); }
}
+
+ GlobalScope.launch(Dispatchers.IO) {
+ // Give TAS the base Context
+ Prefs.setContext(applicationContext)
+ }
}
setupLeakCanary()
@@ -157,6 +180,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
initVisualCompletenessQueueAndQueueTasks()
components.appStartupTelemetry.onFenixApplicationOnCreate()
+ components.torController.start()
}
private fun restoreDownloads() {
diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
index 341ed4249e3f4d8529be6de724c2b0157bfe6e22..04c00688a05c6cbcfdc36d81777ac50c05e540b9 100644
--- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
+++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
@@ -4,6 +4,7 @@
package org.mozilla.fenix
+import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
@@ -43,6 +44,8 @@ import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.WebExtensionState
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.EngineView
+import mozilla.components.feature.app.links.RedirectDialogFragment
+import mozilla.components.feature.app.links.SimpleRedirectDialogFragment
import mozilla.components.feature.contextmenu.DefaultSelectionActionDelegate
import mozilla.components.feature.privatemode.notification.PrivateNotificationFeature
import mozilla.components.feature.search.BrowserStoreSearchAdapter
@@ -56,6 +59,7 @@ import mozilla.components.support.ktx.kotlin.isUrl
import mozilla.components.support.ktx.kotlin.toNormalizedUrl
import mozilla.components.support.locale.LocaleAwareAppCompatActivity
import mozilla.components.support.utils.SafeIntent
+import mozilla.components.support.utils.TorUtils
import mozilla.components.support.utils.toSafeIntent
import mozilla.components.support.webextensions.WebExtensionPopupFeature
import org.mozilla.fenix.GleanMetrics.Metrics
@@ -129,6 +133,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
private var isToolbarInflated = false
+ private var isBeingRecreated = false
+
private val webExtensionPopupFeature by lazy {
WebExtensionPopupFeature(components.core.store, ::openPopup)
}
@@ -152,8 +158,11 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
private lateinit var navigationToolbar: Toolbar
+ private var dialog: RedirectDialogFragment? = null
+
final override fun onCreate(savedInstanceState: Bundle?) {
components.strictMode.attachListenerToDisablePenaltyDeath(supportFragmentManager)
+
// There is disk read violations on some devices such as samsung and pixel for android 9/10
components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
super.onCreate(savedInstanceState)
@@ -370,6 +379,14 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
)
privateNotificationObserver?.stop()
+ if (!isBeingRecreated && !(application as FenixApplication).isTerminating()) {
+ // We assume the Activity is being destroyed because the user
+ // swiped away the app on the Recent screen. When this happens,
+ // we assume the user expects the entire Application is destroyed
+ // and not only the top Activity/Task. Therefore we kill the
+ // underlying Application, as well.
+ (application as FenixApplication).terminate()
+ }
}
override fun onConfigurationChanged(newConfig: Configuration) {
@@ -389,9 +406,31 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
message = "recreate()"
)
+ isBeingRecreated = true
+
super.recreate()
}
+ // Copied from mozac AppLinksFeature.kt
+ internal fun getOrCreateDialog(): RedirectDialogFragment {
+ val existingDialog = dialog
+ if (existingDialog != null) {
+ return existingDialog
+ }
+
+ SimpleRedirectDialogFragment.newInstance().also {
+ dialog = it
+ return it
+ }
+ }
+ private fun isAlreadyADialogCreated(): Boolean {
+ return findPreviousDialogFragment() != null
+ }
+
+ private fun findPreviousDialogFragment(): RedirectDialogFragment? {
+ return supportFragmentManager.findFragmentByTag(RedirectDialogFragment.FRAGMENT_TAG) as? RedirectDialogFragment
+ }
+
/**
* Handles intents received when the activity is open.
*/
@@ -399,6 +438,26 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
super.onNewIntent(intent)
intent ?: return
+ val startIntent = intent.getParcelableExtra(TorUtils.TORBROWSER_START_ACTIVITY_PROMPT)
+ if (startIntent != null) {
+ if (startIntent.creatorPackage == applicationContext.packageName) {
+ val dialog = getOrCreateDialog()
+ dialog.onConfirmRedirect = {
+ @Suppress("EmptyCatchBlock")
+ try {
+ startIntent.send()
+ } catch (error: PendingIntent.CanceledException) {
+ }
+ }
+ dialog.onCancelRedirect = {}
+
+ if (!isAlreadyADialogCreated()) {
+ dialog.showNow(supportFragmentManager, RedirectDialogFragment.FRAGMENT_TAG)
+ }
+ }
+ return
+ }
+
// Diagnostic breadcrumb for "Display already aquired" crash:
// https://github.com/mozilla-mobile/android-components/issues/7960
breadcrumb(
@@ -579,11 +638,17 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
internal fun getModeFromIntentOrLastKnown(intent: Intent?): BrowsingMode {
intent?.toSafeIntent()?.let {
if (it.hasExtra(PRIVATE_BROWSING_MODE)) {
- val startPrivateMode = it.getBooleanExtra(PRIVATE_BROWSING_MODE, false)
+ val startPrivateMode = settings().shouldDisableNormalMode ||
+ it.getBooleanExtra(PRIVATE_BROWSING_MODE, settings().openLinksInAPrivateTab)
+
return BrowsingMode.fromBoolean(isPrivate = startPrivateMode)
}
}
- return settings().lastKnownMode
+ return when {
+ settings().shouldDisableNormalMode -> BrowsingMode.Private
+ settings().openLinksInAPrivateTab -> BrowsingMode.Private
+ else -> settings().lastKnownMode
+ }
}
/**
@@ -600,12 +665,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
}
private fun checkPrivateShortcutEntryPoint(intent: Intent) {
- if (intent.hasExtra(OPEN_TO_SEARCH) &&
- (intent.getStringExtra(OPEN_TO_SEARCH) ==
+ val shouldStartPrivate = settings().shouldDisableNormalMode ||
+ intent.getStringExtra(OPEN_TO_SEARCH) ==
StartSearchIntentProcessor.STATIC_SHORTCUT_NEW_PRIVATE_TAB ||
intent.getStringExtra(OPEN_TO_SEARCH) ==
- StartSearchIntentProcessor.PRIVATE_BROWSING_PINNED_SHORTCUT)
- ) {
+ StartSearchIntentProcessor.PRIVATE_BROWSING_PINNED_SHORTCUT
+ if (intent.hasExtra(OPEN_TO_SEARCH) && shouldStartPrivate) {
PrivateNotificationService.isStartedFromPrivateShortcut = true
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
index 49cf693d34f8ad6c0eaf19fa16afd926fc6f3bbd..a80df2959f0998cb1780a046b5272659bb4be656 100644
--- a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
@@ -21,6 +21,7 @@ import kotlinx.coroutines.launch
import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManagerException
import mozilla.components.feature.addons.ui.translatedName
+import mozilla.components.support.webextensions.WebExtensionSupport.installedExtensions
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
@@ -112,7 +113,7 @@ class InstalledAddonDetailsFragment : Fragment() {
runIfFragmentIsAttached {
this.addon = it
switch.isClickable = true
- privateBrowsingSwitch.isVisible = it.isEnabled()
+ privateBrowsingSwitch.isVisible = false
privateBrowsingSwitch.isChecked = it.isAllowedInPrivateBrowsing()
switch.setText(R.string.mozac_feature_addons_enabled)
view.settings.isVisible = shouldSettingsBeVisible()
@@ -230,7 +231,7 @@ class InstalledAddonDetailsFragment : Fragment() {
private fun bindAllowInPrivateBrowsingSwitch(view: View) {
val switch = view.allow_in_private_browsing_switch
switch.isChecked = addon.isAllowedInPrivateBrowsing()
- switch.isVisible = addon.isEnabled()
+ switch.isVisible = false
switch.setOnCheckedChangeListener { v, isChecked ->
val addonManager = v.context.components.addonManager
switch.isClickable = false
@@ -256,6 +257,8 @@ class InstalledAddonDetailsFragment : Fragment() {
}
}
private fun bindRemoveButton(view: View) {
+ val isBuiltin = installedExtensions[addon.id]?.isBuiltIn() ?: false
+ view.remove_add_on.isVisible = !isBuiltin
view.remove_add_on.setOnClickListener {
setAllInteractiveViewsClickable(view, false)
requireContext().components.addonManager.uninstallAddon(
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 17997e65aec6d993b2dfbf0e37f661c0fb21abfd..f84dd23c7f9937c6798cb2ba30f004310226ddda 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -867,7 +867,17 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
}
hideToolbar()
- getSessionById()?.let { updateThemeForSession(it) }
+ getSessionById()?.let {
+ // If the most-recent session was a tab in Normal mode, and now Normal mode is disabled,
+ // then load the Private Mode home screen, instead.
+ if (!it.private && requireContext().settings().shouldDisableNormalMode) {
+ findNavController().nav(
+ R.id.browserFragment,
+ BrowserFragmentDirections.actionGlobalHomeFragment()
+ )
+ }
+ updateThemeForSession(it)
+ }
}
@CallSuper
diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
index 120a27ac16f9b18ddefbb0d432337b0bee9690dc..58e6b0922aa427b88285b6bfbcc4ce5e267d08be 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
@@ -79,7 +79,7 @@ class Analytics(
appName = context.getString(R.string.app_name),
organizationName = "Mozilla"
),
- enabled = true,
+ enabled = !isDataColectionDisabled(),
nonFatalCrashIntent = pendingIntent
)
}
@@ -99,6 +99,7 @@ class Analytics(
}
}
+fun isDataColectionDisabled() = BuildConfig.DATA_COLLECTION_DISABLED
fun isSentryEnabled() = !BuildConfig.SENTRY_TOKEN.isNullOrEmpty()
private fun getSentryProjectUrl(): String? {
diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt
index 29b2c115c9ff9df4efa735d16e1df81e16560f1b..d480a3406907e63df02563029e5324f769871fd6 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Components.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt
@@ -9,7 +9,6 @@ import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import mozilla.components.feature.addons.AddonManager
-import mozilla.components.feature.addons.amo.AddonCollectionProvider
import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker
import mozilla.components.feature.addons.migration.SupportedAddonsChecker
import mozilla.components.feature.addons.update.AddonUpdater
@@ -22,6 +21,7 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.StrictModeManager
import org.mozilla.fenix.components.metrics.AppStartupTelemetry
import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.tor.TorController
import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.Settings
@@ -79,28 +79,7 @@ class Components(private val context: Context) {
}
val addonCollectionProvider by lazy {
- // Check if we have a customized (overridden) AMO collection (only supported in Nightly)
- if (Config.channel.isNightlyOrDebug && context.settings().amoCollectionOverrideConfigured()) {
- AddonCollectionProvider(
- context,
- core.client,
- collectionUser = context.settings().overrideAmoUser,
- collectionName = context.settings().overrideAmoCollection
- )
- }
- // Use build config otherwise
- else if (!BuildConfig.AMO_COLLECTION.isNullOrEmpty()) {
- AddonCollectionProvider(
- context,
- core.client,
- collectionName = BuildConfig.AMO_COLLECTION,
- maxCacheAgeInMinutes = DAY_IN_MINUTES
- )
- }
- // Fall back to defaults
- else {
- AddonCollectionProvider(context, core.client, maxCacheAgeInMinutes = DAY_IN_MINUTES)
- }
+ TorAddonCollectionProvider(context, core.client)
}
val appStartupTelemetry by lazy { AppStartupTelemetry(analytics.metrics) }
@@ -116,7 +95,7 @@ class Components(private val context: Context) {
onNotificationClickIntent = Intent(context, HomeActivity::class.java).apply {
action = Intent.ACTION_VIEW
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
- data = "fenix://settings_addon_manager".toUri()
+ data = "${BuildConfig.DEEP_LINK_SCHEME}://settings_addon_manager".toUri()
}
)
}
@@ -142,4 +121,6 @@ class Components(private val context: Context) {
FenixReviewSettings(settings)
)
}
+
+ val torController by lazy { TorController(context) }
}
diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt
index 562ca9d35ddc9c5177c11b1669c5343ec219ddb9..b2842e7d12d82ed7cd7ce0245c79d464388ad5e6 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Core.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt
@@ -103,7 +103,9 @@ class Core(
fontInflationEnabled = context.settings().shouldUseAutoSize,
suspendMediaWhenInactive = false,
forceUserScalableContent = context.settings().forceEnableZoom,
- loginAutofillEnabled = context.settings().shouldAutofillLogins
+ loginAutofillEnabled = context.settings().shouldAutofillLogins,
+ torSecurityLevel = context.settings().torSecurityLevel().intRepresentation,
+ spoofEnglish = context.settings().spoofEnglish
)
GeckoEngine(
@@ -115,7 +117,6 @@ class Core(
trackingProtectionPolicyFactory.createTrackingProtectionPolicy()
)
).also {
- WebCompatFeature.install(it)
/**
* There are some issues around localization to be resolved, as well as questions around
@@ -123,9 +124,12 @@ class Core(
* disabled in Fenix Release builds for now.
* This is consistent with both Fennec and Firefox Desktop.
*/
- if (Config.channel.isNightlyOrDebug || Config.channel.isBeta) {
+ if (false && (Config.channel.isNightlyOrDebug || Config.channel.isBeta)) {
+ WebCompatFeature.install(it)
WebCompatReporterFeature.install(it, "fenix")
}
+
+ TorBrowserFeatures.install(context, it)
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/components/TorAddonCollectionProvider.kt b/app/src/main/java/org/mozilla/fenix/components/TorAddonCollectionProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d1bc1022389c0af59a5b05e6737e2f928fc6a974
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/components/TorAddonCollectionProvider.kt
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Copyright (c) 2020, The Tor Project, Inc.
+
+package org.mozilla.fenix.components
+
+import android.content.Context
+import android.graphics.Bitmap
+import kotlinx.coroutines.withContext
+import mozilla.components.concept.fetch.Client
+import mozilla.components.feature.addons.Addon
+import kotlinx.coroutines.Dispatchers
+import mozilla.components.feature.addons.amo.AddonCollectionProvider
+import java.io.IOException
+
+internal const val COLLECTION_NAME = "tor_browser_collection"
+internal const val ALLOWED_ADDONS_PATH = "allowed_addons.json"
+internal const val MAX_CACHE_AGE = 1000L * 365L * 24L * 60L // 1000 years
+
+class TorAddonCollectionProvider(
+ private val context: Context,
+ client: Client
+) : AddonCollectionProvider(
+ context, client, serverURL = "",
+ collectionName = COLLECTION_NAME,
+ maxCacheAgeInMinutes = MAX_CACHE_AGE
+) {
+ private var isCacheLoaded = false
+
+ @Throws(IOException::class)
+ override suspend fun getAvailableAddons(
+ allowCache: Boolean,
+ readTimeoutInSeconds: Long?
+ ): List {
+ ensureCache()
+ return super.getAvailableAddons(true, readTimeoutInSeconds)
+ }
+
+ @Throws(IOException::class)
+ override suspend fun getAddonIconBitmap(addon: Addon): Bitmap? {
+ ensureCache()
+ return super.getAddonIconBitmap(addon)
+ }
+
+ @Throws(IOException::class)
+ private suspend fun ensureCache() {
+ if (isCacheLoaded) {
+ return
+ }
+ return withContext(Dispatchers.IO) {
+ val data = context.assets.open(ALLOWED_ADDONS_PATH).bufferedReader().use {
+ it.readText()
+ }
+ writeToDiskCache(data)
+ isCacheLoaded = true
+ }
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt b/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b059895dd64c6f222c10ad228836cdbb4c44d38d
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
@@ -0,0 +1,109 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Copyright (c) 2020, The Tor Project, Inc.
+
+package org.mozilla.fenix.components
+
+import android.content.Context
+import mozilla.components.concept.engine.webextension.WebExtension
+import mozilla.components.concept.engine.webextension.WebExtensionRuntime
+import mozilla.components.support.base.log.logger.Logger
+import org.mozilla.fenix.ext.settings
+import java.io.IOException
+
+object TorBrowserFeatures {
+ private val logger = Logger("torbrowser-features")
+
+ private fun installNoScript(
+ context: Context,
+ runtime: WebExtensionRuntime,
+ onSuccess: ((WebExtension) -> Unit),
+ onError: ((Throwable) -> Unit)
+ ) {
+ /**
+ * Copy the xpi from assets to cacheDir, we do not care if the file is later deleted.
+ */
+ val addonPath =
+ context.cacheDir.resolve("{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ try {
+ context.assets.open("extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ .use { inStream ->
+ addonPath.outputStream().use { outStream ->
+ inStream.copyTo(outStream)
+ }
+ }
+ } catch (throwable: IOException) {
+ onError(throwable)
+ return
+ }
+
+ /**
+ * Install with a file:// URI pointing to the temp location where the addon was copied to.
+ */
+ runtime.installWebExtension(
+ id = "{73a6fe31-595d-460b-a920-fcc0f8843232}",
+ url = addonPath.toURI().toString(),
+ onSuccess = { extension ->
+ runtime.setAllowedInPrivateBrowsing(
+ extension,
+ true,
+ onSuccess,
+ onError
+ )
+ },
+ onError = { _, throwable -> onError(throwable) })
+ }
+
+ private fun installHTTPSEverywhere(
+ runtime: WebExtensionRuntime,
+ onSuccess: ((WebExtension) -> Unit),
+ onError: ((Throwable) -> Unit)
+ ) {
+ runtime.installWebExtension(
+ id = "https-everywhere-eff@eff.org",
+ url = "resource://android/assets/extensions/https-everywhere/",
+ onSuccess = onSuccess,
+ onError = { _, throwable -> onError(throwable) }
+ )
+ }
+
+ fun install(context: Context, runtime: WebExtensionRuntime) {
+ /**
+ * Install HTTPS Everywhere as a builtin addon, with a resource://android/ URI.
+ * No signatures will be checked/required and there will be no automatic
+ * extension updates. It's ok to always try to install, since for builtin extensions it will
+ * be checked internally whether it is necessary to install or not: it will only be done
+ * if this is the first time or if it's a newer version.
+ */
+ installHTTPSEverywhere(
+ runtime,
+ onSuccess = {
+ logger.debug("HTTPS Everywhere extension was installed successfully")
+ },
+ onError = { throwable ->
+ logger.error("Could not install HTTPS Everywhere extension", throwable)
+ }
+ )
+
+ /**
+ * Install NoScript as a user WebExtension if we have not already done so.
+ * AMO signature is checked, and AMO automatic updates will work. The extension should
+ * behave as if the user had installed it manually.
+ */
+ if (!context.settings().noscriptInstalled) {
+ installNoScript(
+ context,
+ runtime,
+ onSuccess = {
+ context.settings().noscriptInstalled = true
+ logger.debug("NoScript extension was installed successfully")
+ },
+ onError = { throwable ->
+ logger.error("Could not install NoScript extension", throwable)
+ }
+ )
+ }
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
index baf4566d8b309e3eee500482da08454285ca4c93..01ebacf0defd68b9a0e0369d1cba8638c63de4a7 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
@@ -22,7 +22,7 @@ class AdjustMetricsService(private val application: Application) : MetricsServic
if ((BuildConfig.ADJUST_TOKEN.isNullOrBlank())) {
Log.i(LOGTAG, "No adjust token defined")
- if (Config.channel.isReleased) {
+ if (Config.channel.isReleased && !BuildConfig.DATA_COLLECTION_DISABLED) {
throw IllegalStateException("No adjust token defined for release build")
}
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt
index 2c9bf3eff72c5418e22044652ac6120ecd28385e..c3b9d09dcfb4e439dc796c7825c034cea1bb1a50 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt
@@ -7,9 +7,6 @@ package org.mozilla.fenix.components.metrics
import android.content.Context
import android.util.Base64
import androidx.annotation.VisibleForTesting
-import com.google.android.gms.ads.identifier.AdvertisingIdClient
-import com.google.android.gms.common.GooglePlayServicesNotAvailableException
-import com.google.android.gms.common.GooglePlayServicesRepairableException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import mozilla.components.browser.search.SearchEngine
@@ -82,14 +79,8 @@ object MetricsUtils {
*/
@Suppress("TooGenericExceptionCaught")
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
- internal fun getAdvertisingID(context: Context): String? {
+ internal fun getAdvertisingID(@Suppress("UNUSED_PARAMETER") context: Context): String? {
return try {
- AdvertisingIdClient.getAdvertisingIdInfo(context).id
- } catch (e: GooglePlayServicesNotAvailableException) {
- Logger.debug("ActivationPing - Google Play not installed on the device")
- null
- } catch (e: GooglePlayServicesRepairableException) {
- Logger.debug("ActivationPing - recoverable error connecting to Google Play Services")
null
} catch (e: IllegalStateException) {
// This is unlikely to happen, as this should be running off the main thread.
diff --git a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt
index e3935944a16af08d9628a9431ea82e88c3d4e8ae..5edc4ba84097a91fc3c740b8c653f36ede6421fa 100644
--- a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt
@@ -27,7 +27,6 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.Config
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
-import java.util.Locale
@SuppressWarnings("TooManyFunctions")
open class FenixSearchEngineProvider(
@@ -148,8 +147,6 @@ open class FenixSearchEngineProvider(
defaultList.copy(
list = defaultList.list.filter {
installedIdentifiers.contains(it.identifier)
- }.sortedBy {
- it.name.toLowerCase(Locale.getDefault())
},
default = defaultList.default?.let {
if (installedIdentifiers.contains(it.identifier)) {
diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt
index 8457e33cece86bcd89fc439be84ea9dfa98f697d..47afed108c1ecad11067a54e03424f31671aa797 100644
--- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt
@@ -177,24 +177,19 @@ class DefaultToolbarMenu(
// Predicates that are called once, during screen init
val shouldShowSaveToCollection = (context.asActivity() as? HomeActivity)
?.browsingModeManager?.mode == BrowsingMode.Normal
- val shouldDeleteDataOnQuit = context.components.settings
- .shouldDeleteBrowsingDataOnQuit
- val syncedTabsInTabsTray = context.components.settings
- .syncedTabsInTabsTray
val menuItems = listOfNotNull(
downloadsItem,
- historyItem,
+ // historyItem,
bookmarksItem,
- if (syncedTabsInTabsTray) null else syncedTabs,
settings,
- if (shouldDeleteDataOnQuit) deleteDataOnQuit else null,
+ deleteDataOnQuit,
BrowserMenuDivider(),
reportSiteIssuePlaceholder,
findInPage,
addToTopSites,
- addToHomescreen.apply { visible = ::canAddToHomescreen },
- installToHomescreen.apply { visible = ::canInstall },
+ // addToHomescreen.apply { visible = ::canAddToHomescreen },
+ // installToHomescreen.apply { visible = ::canInstall },
if (shouldShowSaveToCollection) saveToCollection else null,
desktopMode,
openInApp.apply { visible = ::shouldShowOpenInApp },
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
index 7a6e20d2e26094fd5375d12e4782c695d688809b..720319cbd722c94cb0fe3cbd69d6f9615cd45c9f 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
@@ -28,7 +28,9 @@ import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
+import androidx.core.view.children
import androidx.core.view.doOnLayout
+import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
@@ -41,6 +43,7 @@ import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE
+import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.fragment_home.view.*
@@ -70,7 +73,9 @@ import mozilla.components.feature.top.sites.TopSitesFeature
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.android.content.res.resolveAttribute
+import mozilla.components.support.locale.LocaleManager
import org.mozilla.fenix.BrowserDirection
+import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions
@@ -81,9 +86,7 @@ import org.mozilla.fenix.components.PrivateShortcutCreateManager
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.components.metrics.Event
-import org.mozilla.fenix.components.tips.FenixTipManager
import org.mozilla.fenix.components.tips.Tip
-import org.mozilla.fenix.components.tips.providers.MasterPasswordTipProvider
import org.mozilla.fenix.components.toolbar.TabCounterMenu
import org.mozilla.fenix.components.toolbar.ToolbarPosition
import org.mozilla.fenix.ext.components
@@ -99,8 +102,9 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.topsites.DefaultTopSitesView
import org.mozilla.fenix.onboarding.FenixOnboarding
import org.mozilla.fenix.settings.SupportUtils
-import org.mozilla.fenix.settings.SupportUtils.SumoTopic.HELP
+import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit
+import org.mozilla.fenix.tor.bootstrap.TorQuickStart
import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.utils.FragmentPreDrawManager
import org.mozilla.fenix.utils.ToolbarPopupWindow
@@ -164,6 +168,7 @@ class HomeFragment : Fragment() {
private lateinit var currentMode: CurrentMode
private val topSitesFeature = ViewBoundFeatureWrapper()
+ private val torQuickStart by lazy { TorQuickStart(requireContext()) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -186,9 +191,21 @@ class HomeFragment : Fragment() {
val activity = activity as HomeActivity
val components = requireComponents
+ // Splits by full stops or commas and puts the parts in different lines.
+ // Ignoring separators at the end of the string, it is expected
+ // that there are at most two parts (e.g. "Explore. Privately.").
+ view.exploreprivately.text = view
+ .exploreprivately
+ .text
+ ?.replace(" *([.,。।]) *".toRegex(), "$1\n")
+ ?.trim()
+
currentMode = CurrentMode(
view.context,
onboarding,
+ torQuickStart,
+ !BuildConfig.DISABLE_TOR,
+ components.torController,
browsingModeManager,
::dispatchModeChanges
)
@@ -200,17 +217,6 @@ class HomeFragment : Fragment() {
expandedCollections = emptySet(),
mode = currentMode.getCurrentMode(),
topSites = components.core.topSitesStorage.cachedTopSites,
- tip = components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
- FenixTipManager(
- listOf(
- MasterPasswordTipProvider(
- requireContext(),
- ::navToSavedLogins,
- ::dismissTip
- )
- )
- ).getTip()
- },
showCollectionPlaceholder = components.settings.showCollectionsPlaceholderOnHome
)
)
@@ -242,7 +248,11 @@ class HomeFragment : Fragment() {
registerCollectionStorageObserver = ::registerCollectionStorageObserver,
showDeleteCollectionPrompt = ::showDeleteCollectionPrompt,
showTabTray = ::openTabTray,
- handleSwipedItemDeletionCancel = ::handleSwipedItemDeletionCancel
+ handleSwipedItemDeletionCancel = ::handleSwipedItemDeletionCancel,
+ handleTorBootstrapConnect = ::handleTorBootstrapConnect,
+ cancelTorBootstrap = ::cancelTorBootstrap,
+ initiateTorBootstrap = ::initiateTorBootstrap,
+ openTorNetworkSettings = ::openTorNetworkSettings
)
)
@@ -257,6 +267,32 @@ class HomeFragment : Fragment() {
updateSessionControlView(view)
activity.themeManager.applyStatusBarTheme(activity)
+
+ adjustHomeFragmentView(currentMode.getCurrentMode(), view)
+ showSessionControlView(view)
+
+ view.donationmatch.setOnClickListener {
+ activity.openToBrowserAndLoad(
+ searchTermOrURL = "https://blog.torproject.org/friends-of-tor-match-2020",
+ newTab = true,
+ from = BrowserDirection.FromHome
+ )
+ }
+
+ view.donate_now_button.setOnClickListener {
+ val country = LocaleManager.getSelectedLocale(requireContext()).country
+ var locale = LocaleManager.getSelectedLocale(requireContext()).language
+ if (country != "") {
+ locale = "${locale}-${country}"
+ }
+ val localeUrl = "https://www.torproject.org/donate/donate-usetor-mobile-${locale}"
+ activity.openToBrowserAndLoad(
+ searchTermOrURL = localeUrl,
+ newTab = true,
+ from = BrowserDirection.FromHome
+ )
+ }
+
return view
}
@@ -328,6 +364,148 @@ class HomeFragment : Fragment() {
}
}
+ // This function should be paired with showSessionControlView()
+ @SuppressWarnings("ComplexMethod", "NestedBlockDepth", "LongMethod")
+ private fun adjustHomeFragmentView(mode: Mode, view: View?) {
+ view?.sessionControlRecyclerView?.apply {
+ visibility = View.INVISIBLE
+ }
+
+ if (mode == Mode.Bootstrap) {
+ view?.sessionControlRecyclerView?.apply {
+ setPadding(0, 0, 0, 0)
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(0, 0, 0, 0)
+ }
+ view?.homeAppBar?.apply {
+ visibility = View.GONE
+
+ // Reset this as SCROLL in case it was previously set as NO_SCROLL after bootstrap
+ children.forEach {
+ (it.layoutParams as AppBarLayout.LayoutParams).scrollFlags =
+ AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
+ }
+ }
+ view?.onion_pattern_image?.apply {
+ visibility = View.GONE
+ }
+ view?.toolbarLayout?.apply {
+ visibility = View.GONE
+ }
+ } else {
+ // Keep synchronized with xml layout (somehow).
+ view?.sessionControlRecyclerView?.apply {
+ setPadding(
+ SESSION_CONTROL_VIEW_PADDING,
+ SESSION_CONTROL_VIEW_PADDING,
+ SESSION_CONTROL_VIEW_PADDING,
+ SESSION_CONTROL_VIEW_PADDING
+ )
+ // Default margin until it is re-set below (either set immediately or after Layout)
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
+ 0,
+ 0,
+ 0,
+ DEFAULT_ONBOARDING_FINISH_MARGIN
+ )
+ }
+ view?.toolbarLayout?.apply {
+ visibility = View.VISIBLE
+ // If the Layout rendering pass was completed, then we have a |height| value,
+ // if it wasn't completed then we have 0.
+ if (height == 0) {
+ // Set the bottom margin after the toolbar height is defined during Layout
+ doOnLayout {
+ val toolbarLayoutHeight = view.toolbarLayout.height
+ view.sessionControlRecyclerView?.apply {
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
+ 0,
+ 0,
+ 0,
+ toolbarLayoutHeight - SESSION_CONTROL_VIEW_PADDING
+ )
+ }
+ view.donate_now_button?.apply {
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
+ 0,
+ 0,
+ 0,
+ toolbarLayoutHeight - SESSION_CONTROL_VIEW_PADDING
+ )
+ }
+ }
+ } else {
+ view.sessionControlRecyclerView?.apply {
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
+ 0,
+ 0,
+ 0,
+ height - SESSION_CONTROL_VIEW_PADDING
+ )
+ }
+ view.donate_now_button?.apply {
+ (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
+ 0,
+ 0,
+ 0,
+ height - SESSION_CONTROL_VIEW_PADDING
+ )
+ }
+ }
+ }
+
+ // Hide the EOY image during Onboarding, too.
+ view?.illo_image?.apply {
+ visibility = if (onboarding.userHasBeenOnboarded()) {
+ View.VISIBLE
+ } else {
+ View.GONE
+ }
+ }
+ // Hide the EOY donate button during Onboarding, too.
+ view?.donate_now_button?.apply {
+ visibility = if (onboarding.userHasBeenOnboarded()) {
+ View.VISIBLE
+ } else {
+ View.GONE
+ }
+ }
+ view?.resistsurveillance?.apply {
+ visibility = if (onboarding.userHasBeenOnboarded()) {
+ View.VISIBLE
+ } else {
+ View.GONE
+ }
+ }
+ // Hide the onion pattern during Onboarding, too.
+ view?.onion_pattern_image?.apply {
+ visibility = if (onboarding.userHasBeenOnboarded()) {
+ View.VISIBLE
+ } else {
+ View.GONE
+ }
+ }
+ view?.homeAppBar?.apply {
+ visibility = View.VISIBLE
+
+ children.forEach {
+ (it.layoutParams as AppBarLayout.LayoutParams).scrollFlags =
+ if (onboarding.userHasBeenOnboarded()) {
+ AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL
+ } else {
+ AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
+ }
+ }
+ }
+ }
+ }
+
+ // This function should be paired with adjustHomeFragmentView()
+ private fun showSessionControlView(view: View?) {
+ view?.sessionControlRecyclerView?.apply {
+ visibility = View.VISIBLE
+ }
+ }
+
@Suppress("LongMethod", "ComplexMethod")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -427,6 +605,8 @@ class HomeFragment : Fragment() {
}
}
+ privateBrowsingButton.isGone = view.context.settings().shouldDisableNormalMode
+
// We call this onLayout so that the bottom bar width is correctly set for us to center
// the CFR in.
view.toolbar_wrapper.doOnLayout {
@@ -540,17 +720,6 @@ class HomeFragment : Fragment() {
collections = components.core.tabCollectionStorage.cachedTabCollections,
mode = currentMode.getCurrentMode(),
topSites = components.core.topSitesStorage.cachedTopSites,
- tip = components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
- FenixTipManager(
- listOf(
- MasterPasswordTipProvider(
- requireContext(),
- ::navToSavedLogins,
- ::dismissTip
- )
- )
- ).getTip()
- },
showCollectionPlaceholder = components.settings.showCollectionsPlaceholderOnHome
)
)
@@ -602,8 +771,13 @@ class HomeFragment : Fragment() {
}
private fun dispatchModeChanges(mode: Mode) {
- if (mode != Mode.fromBrowsingMode(browsingModeManager.mode)) {
- homeFragmentStore.dispatch(HomeFragmentAction.ModeChange(mode))
+ homeFragmentStore.dispatch(HomeFragmentAction.ModeChange(mode))
+
+ val localView = view
+ if (localView != null) {
+ adjustHomeFragmentView(mode, localView)
+ updateSessionControlView(localView)
+ showSessionControlView(localView)
}
}
@@ -644,6 +818,8 @@ class HomeFragment : Fragment() {
}
homeViewModel.layoutManagerState =
sessionControlView!!.view.layoutManager?.onSaveInstanceState()
+
+ currentMode.unregisterTorListener()
}
override fun onResume() {
@@ -715,6 +891,11 @@ class HomeFragment : Fragment() {
mode = currentMode.getCurrentMode()
)
)
+ adjustHomeFragmentView(
+ currentMode.getCurrentMode(),
+ view
+ )
+ showSessionControlView(view)
}
}
@@ -779,7 +960,7 @@ class HomeFragment : Fragment() {
HomeMenu.Item.Help -> {
hideOnboardingIfNeeded()
(activity as HomeActivity).openToBrowserAndLoad(
- searchTermOrURL = SupportUtils.getSumoURLForTopic(context, HELP),
+ searchTermOrURL = SupportUtils.getTorHelpPageUrl(),
newTab = true,
from = BrowserDirection.FromHome
)
@@ -971,6 +1152,25 @@ class HomeFragment : Fragment() {
view?.sessionControlRecyclerView?.adapter?.notifyDataSetChanged()
}
+ private fun handleTorBootstrapConnect() {
+ requireComponents.torController.onTorConnecting()
+ }
+
+ private fun cancelTorBootstrap() {
+ requireComponents.torController.stopTor()
+ }
+
+ private fun initiateTorBootstrap(withDebugLogging: Boolean = false) {
+ requireComponents.torController.initiateTorBootstrap(lifecycleScope, withDebugLogging)
+ }
+
+ private fun openTorNetworkSettings() {
+ val directions =
+ HomeFragmentDirections
+ .actionHomeFragmentToTorNetworkSettingsFragment()
+ findNavController().navigate(directions)
+ }
+
companion object {
const val ALL_NORMAL_TABS = "all_normal"
const val ALL_PRIVATE_TABS = "all_private"
@@ -985,5 +1185,9 @@ class HomeFragment : Fragment() {
private const val ANIM_SNACKBAR_DELAY = 100L
private const val CFR_WIDTH_DIVIDER = 1.7
private const val CFR_Y_OFFSET = -20
+
+ // Layout
+ private const val DEFAULT_ONBOARDING_FINISH_MARGIN = 60
+ private const val SESSION_CONTROL_VIEW_PADDING = 16
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
index 3e172e8f81ca3cc75a9cde5533c128e0e8e90960..502651f45d0346e157ee34814f19f2f4dd5f2528 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
@@ -104,21 +104,21 @@ class HomeMenu(
onItemTapped.invoke(Item.Bookmarks)
}
- val historyItem = BrowserMenuImageText(
- context.getString(R.string.library_history),
- R.drawable.ic_history,
- primaryTextColor
- ) {
- onItemTapped.invoke(Item.History)
- }
-
- val addons = BrowserMenuImageText(
- context.getString(R.string.browser_menu_add_ons),
- R.drawable.ic_addons_extensions,
- primaryTextColor
- ) {
- onItemTapped.invoke(Item.AddonsManager)
- }
+ // val historyItem = BrowserMenuImageText(
+ // context.getString(R.string.library_history),
+ // R.drawable.ic_history,
+ // primaryTextColor
+ // ) {
+ // onItemTapped.invoke(Item.History)
+ // }
+
+ // val addons = BrowserMenuImageText(
+ // context.getString(R.string.browser_menu_add_ons),
+ // R.drawable.ic_addons_extensions,
+ // primaryTextColor
+ // ) {
+ // onItemTapped.invoke(Item.AddonsManager)
+ // }
val settingsItem = BrowserMenuImageText(
context.getString(R.string.browser_menu_settings),
@@ -128,13 +128,13 @@ class HomeMenu(
onItemTapped.invoke(Item.Settings)
}
- val syncedTabsItem = BrowserMenuImageText(
- context.getString(R.string.library_synced_tabs),
- R.drawable.ic_synced_tabs,
- primaryTextColor
- ) {
- onItemTapped.invoke(Item.SyncedTabs)
- }
+ // val syncedTabsItem = BrowserMenuImageText(
+ // context.getString(R.string.library_synced_tabs),
+ // R.drawable.ic_synced_tabs,
+ // primaryTextColor
+ // ) {
+ // onItemTapped.invoke(Item.SyncedTabs)
+ // }
val helpItem = BrowserMenuImageText(
context.getString(R.string.browser_menu_help),
@@ -160,18 +160,18 @@ class HomeMenu(
null
}
- val settings = context.components.settings
+ // val settings = context.components.settings
val menuItems = listOfNotNull(
- if (settings.shouldDeleteBrowsingDataOnQuit) quitItem else null,
+ quitItem,
settingsItem,
BrowserMenuDivider(),
- if (settings.syncedTabsInTabsTray) null else syncedTabsItem,
+ // if (settings.syncedTabsInTabsTray) null else syncedTabsItem,
bookmarksItem,
- historyItem,
+ // historyItem,
downloadsItem,
BrowserMenuDivider(),
- addons,
+ // addons,
BrowserMenuDivider(),
whatsNewItem,
helpItem,
diff --git a/app/src/main/java/org/mozilla/fenix/home/Mode.kt b/app/src/main/java/org/mozilla/fenix/home/Mode.kt
index f4e60ea1870e4c3409e761d28658d2ec2466f577..e5ba75fa6cb363c36c9f4735873029d69cfcfec6 100644
--- a/app/src/main/java/org/mozilla/fenix/home/Mode.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/Mode.kt
@@ -10,6 +10,9 @@ import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.concept.sync.Profile
import mozilla.components.service.fxa.sharing.ShareableAccount
+import org.mozilla.fenix.tor.TorController
+import org.mozilla.fenix.tor.TorEvents
+import org.mozilla.fenix.tor.bootstrap.TorQuickStart
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.ext.components
@@ -22,6 +25,7 @@ sealed class Mode {
object Normal : Mode()
object Private : Mode()
data class Onboarding(val state: OnboardingState) : Mode()
+ object Bootstrap : Mode()
companion object {
fun fromBrowsingMode(browsingMode: BrowsingMode) = when (browsingMode) {
@@ -43,16 +47,26 @@ sealed class OnboardingState {
object SignedIn : OnboardingState()
}
+@SuppressWarnings("LongParameterList", "TooManyFunctions")
class CurrentMode(
private val context: Context,
private val onboarding: FenixOnboarding,
+ private val torQuickStart: TorQuickStart,
+ private val shouldStartTor: Boolean,
+ private val torController: TorController,
private val browsingModeManager: BrowsingModeManager,
private val dispatchModeChanges: (mode: Mode) -> Unit
-) : AccountObserver {
+) : AccountObserver, TorEvents {
private val accountManager by lazy { context.components.backgroundServices.accountManager }
- fun getCurrentMode() = if (onboarding.userHasBeenOnboarded()) {
+ init {
+ torController.registerTorListener(this)
+ }
+
+ fun getCurrentMode() = if (shouldStartTor && (!torQuickStart.quickStartTor() && !torController.isBootstrapped)) {
+ Mode.Bootstrap
+ } else if (onboarding.userHasBeenOnboarded()) {
Mode.fromBrowsingMode(browsingModeManager.mode)
} else {
val account = accountManager.authenticatedAccount()
@@ -72,6 +86,26 @@ class CurrentMode(
dispatchModeChanges(getCurrentMode())
}
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ override fun onTorConnected() {
+ dispatchModeChanges(getCurrentMode())
+ }
+
+ override fun onTorStopped() {
+ dispatchModeChanges(getCurrentMode())
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ }
+
+ fun unregisterTorListener() {
+ torController.unregisterTorListener(this)
+ }
+
override fun onAuthenticated(account: OAuthAccount, authType: AuthType) = emitModeChanges()
override fun onAuthenticationProblems() = emitModeChanges()
override fun onLoggedOut() = emitModeChanges()
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt
index e789a9b90864006742ec7f1ddd2779becd09d65f..629838e11434b8d247b408df74660f21febf56a4 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt
@@ -22,6 +22,7 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHol
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.NoCollectionsMessageViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder
+import org.mozilla.fenix.home.sessioncontrol.viewholders.TorBootstrapPagerViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSitePagerViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingAutomaticSignInViewHolder
@@ -35,6 +36,8 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingTh
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingToolbarPositionPickerViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingTrackingProtectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingWhatsNewViewHolder
+import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.TorOnboardingSecurityLevelViewHolder
+import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.TorOnboardingDonateViewHolder
import org.mozilla.fenix.home.tips.ButtonTipViewHolder
import mozilla.components.feature.tab.collections.Tab as ComponentTab
@@ -61,6 +64,8 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) {
object PrivateBrowsingDescription : AdapterItem(PrivateBrowsingDescriptionViewHolder.LAYOUT_ID)
object NoCollectionsMessage : AdapterItem(NoCollectionsMessageViewHolder.LAYOUT_ID)
+ object TorBootstrap : AdapterItem(TorBootstrapPagerViewHolder.LAYOUT_ID)
+
object CollectionHeader : AdapterItem(CollectionHeaderViewHolder.LAYOUT_ID)
data class CollectionItem(
val collection: TabCollection,
@@ -110,6 +115,9 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) {
object OnboardingWhatsNew : AdapterItem(OnboardingWhatsNewViewHolder.LAYOUT_ID)
+ object TorOnboardingSecurityLevel : AdapterItem(TorOnboardingSecurityLevelViewHolder.LAYOUT_ID)
+ object TorOnboardingDonate : AdapterItem(TorOnboardingDonateViewHolder.LAYOUT_ID)
+
/**
* True if this item represents the same value as other. Used by [AdapterItemDiffCallback].
*/
@@ -153,6 +161,11 @@ class SessionControlAdapter(
view,
interactor
)
+ TorBootstrapPagerViewHolder.LAYOUT_ID -> TorBootstrapPagerViewHolder(
+ view,
+ components,
+ interactor
+ )
NoCollectionsMessageViewHolder.LAYOUT_ID ->
NoCollectionsMessageViewHolder(
view,
@@ -189,6 +202,14 @@ class SessionControlAdapter(
OnboardingToolbarPositionPickerViewHolder.LAYOUT_ID -> OnboardingToolbarPositionPickerViewHolder(
view
)
+ TorOnboardingSecurityLevelViewHolder.LAYOUT_ID -> TorOnboardingSecurityLevelViewHolder(
+ view,
+ interactor
+ )
+ TorOnboardingDonateViewHolder.LAYOUT_ID -> TorOnboardingDonateViewHolder(
+ view,
+ interactor
+ )
else -> throw IllegalStateException()
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt
index c2a35df94ecaf1716d6e33df07e50742b67b1d83..91714d68d98939be5979d8e1ce12d7cc5cb66ccd 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt
@@ -110,6 +110,11 @@ interface SessionControlController {
*/
fun handleOpenSettingsClicked()
+ /**
+ * @see [OnboardingInteractor.onOpenSecurityLevelSettingsClicked]
+ */
+ fun handleOpenSecurityLevelSettingsClicked()
+
/**
* @see [OnboardingInteractor.onWhatsNewGetAnswersClicked]
*/
@@ -120,6 +125,11 @@ interface SessionControlController {
*/
fun handleReadPrivacyNoticeClicked()
+ /**
+ * @see [OnboardingInteractor.onDonateClicked]
+ */
+ fun handleDonateClicked()
+
/**
* @see [CollectionInteractor.onToggleCollectionExpanded]
*/
@@ -149,6 +159,31 @@ interface SessionControlController {
* @see [CollectionInteractor.onRemoveCollectionsPlaceholder]
*/
fun handleRemoveCollectionsPlaceholder()
+
+ /**
+ * @see [TorBootstrapInteractor.onTorBootstrapConnectClicked]
+ */
+ fun handleTorBootstrapConnectClicked()
+
+ /**
+ * @see [TorBootstrapInteractor.onTorStopBootstrapping]
+ */
+ fun handleTorStopBootstrapping()
+
+ /**
+ * @see [TorBootstrapInteractor.onTorStartBootstrapping]
+ */
+ fun handleTorStartBootstrapping()
+
+ /**
+ * @see [TorBootstrapInteractor.onTorStartDebugBootstrapping]
+ */
+ fun handleTorStartDebugBootstrapping()
+
+ /**
+ * @see [TorBootstrapInteractor.onTorBootstrapNetworkSettingsClicked]
+ */
+ fun handleTorNetworkSettingsClicked()
}
@Suppress("TooManyFunctions", "LargeClass")
@@ -173,7 +208,11 @@ class DefaultSessionControlController(
handleSwipedItemDeletionCancel: () -> Unit
) -> Unit,
private val showTabTray: () -> Unit,
- private val handleSwipedItemDeletionCancel: () -> Unit
+ private val handleSwipedItemDeletionCancel: () -> Unit,
+ private val handleTorBootstrapConnect: () -> Unit,
+ private val initiateTorBootstrap: (Boolean) -> Unit,
+ private val cancelTorBootstrap: () -> Unit,
+ private val openTorNetworkSettings: () -> Unit
) : SessionControlController {
override fun handleCollectionAddTabTapped(collection: TabCollection) {
@@ -330,6 +369,11 @@ class DefaultSessionControlController(
navController.nav(R.id.homeFragment, directions)
}
+ override fun handleOpenSecurityLevelSettingsClicked() {
+ val directions = HomeFragmentDirections.actionGlobalTorSecurityLevelFragment()
+ navController.nav(R.id.homeFragment, directions)
+ }
+
override fun handleWhatsNewGetAnswersClicked() {
activity.openToBrowserAndLoad(
searchTermOrURL = SupportUtils.getWhatsNewUrl(activity),
@@ -346,6 +390,14 @@ class DefaultSessionControlController(
)
}
+ override fun handleDonateClicked() {
+ activity.openToBrowserAndLoad(
+ searchTermOrURL = SupportUtils.DONATE_URL,
+ newTab = true,
+ from = BrowserDirection.FromHome
+ )
+ }
+
override fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
fragmentStore.dispatch(HomeFragmentAction.CollectionExpanded(collection, expand))
}
@@ -434,4 +486,24 @@ class DefaultSessionControlController(
)
navController.nav(R.id.homeFragment, directions)
}
+
+ override fun handleTorBootstrapConnectClicked() {
+ handleTorBootstrapConnect()
+ }
+
+ override fun handleTorStopBootstrapping() {
+ cancelTorBootstrap()
+ }
+
+ override fun handleTorStartBootstrapping() {
+ initiateTorBootstrap(false)
+ }
+
+ override fun handleTorStartDebugBootstrapping() {
+ initiateTorBootstrap(true)
+ }
+
+ override fun handleTorNetworkSettingsClicked() {
+ openTorNetworkSettings()
+ }
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt
index b600d098343f47edc19d61d993e6474baff79144..2f025e92d3ad03ffaf08ce10a98bb425dba2f08e 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt
@@ -126,6 +126,11 @@ interface OnboardingInteractor {
*/
fun onOpenSettingsClicked()
+ /**
+ * Hides the onboarding and navigates to Settings. Called when a user clicks on the "Open Security Settings" button.
+ */
+ fun onOpenSecurityLevelSettingsClicked()
+
/**
* Opens a custom tab to what's new url. Called when a user clicks on the "Get answers here" link.
*/
@@ -135,6 +140,11 @@ interface OnboardingInteractor {
* Opens a custom tab to privacy notice url. Called when a user clicks on the "read our privacy notice" button.
*/
fun onReadPrivacyNoticeClicked()
+
+ /**
+ * Opens a custom tab to privacy notice url. Called when a user clicks on the "read our privacy notice" button.
+ */
+ fun onDonateClicked()
}
interface TipInteractor {
@@ -144,6 +154,34 @@ interface TipInteractor {
fun onCloseTip(tip: Tip)
}
+interface TorBootstrapInteractor {
+ /**
+ * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button.
+ */
+ fun onTorBootstrapConnectClicked()
+
+ /**
+ * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button.
+ */
+ fun onTorStartBootstrapping()
+
+ /**
+ * Stop Tor bootstrapping. Called when a user clicks on the "settings" cog/button.
+ */
+ fun onTorStopBootstrapping()
+
+ /**
+ * Initiates Tor bootstrapping with debug logging. Called when bootstrapping fails with
+ * the control.txt file not existing.
+ */
+ fun onTorStartDebugBootstrapping()
+
+ /**
+ * Open Tor Network Settings preference screen
+ */
+ fun onTorBootstrapNetworkSettingsClicked()
+}
+
/**
* Interface for top site related actions in the [SessionControlInteractor].
*/
@@ -181,7 +219,7 @@ interface TopSiteInteractor {
class SessionControlInteractor(
private val controller: SessionControlController
) : CollectionInteractor, OnboardingInteractor, TopSiteInteractor, TipInteractor,
- TabSessionInteractor, ToolbarInteractor {
+ TabSessionInteractor, ToolbarInteractor, TorBootstrapInteractor {
override fun onCollectionAddTabTapped(collection: TabCollection) {
controller.handleCollectionAddTabTapped(collection)
}
@@ -230,6 +268,10 @@ class SessionControlInteractor(
controller.handleOpenSettingsClicked()
}
+ override fun onOpenSecurityLevelSettingsClicked() {
+ controller.handleOpenSecurityLevelSettingsClicked()
+ }
+
override fun onWhatsNewGetAnswersClicked() {
controller.handleWhatsNewGetAnswersClicked()
}
@@ -238,6 +280,10 @@ class SessionControlInteractor(
controller.handleReadPrivacyNoticeClicked()
}
+ override fun onDonateClicked() {
+ controller.handleDonateClicked()
+ }
+
override fun onToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
controller.handleToggleCollectionExpanded(collection, expand)
}
@@ -265,4 +311,24 @@ class SessionControlInteractor(
override fun onRemoveCollectionsPlaceholder() {
controller.handleRemoveCollectionsPlaceholder()
}
+
+ override fun onTorBootstrapConnectClicked() {
+ controller.handleTorBootstrapConnectClicked()
+ }
+
+ override fun onTorStopBootstrapping() {
+ controller.handleTorStopBootstrapping()
+ }
+
+ override fun onTorStartBootstrapping() {
+ controller.handleTorStartBootstrapping()
+ }
+
+ override fun onTorStartDebugBootstrapping() {
+ controller.handleTorStartDebugBootstrapping()
+ }
+
+ override fun onTorBootstrapNetworkSettingsClicked() {
+ controller.handleTorNetworkSettingsClicked()
+ }
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt
index 3258fb31de14e8d0704482fc305502827999c2d7..a82cd9fe51b2e66b27044a0d2f20905be3951dea 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt
@@ -68,6 +68,8 @@ private fun showCollections(
private fun privateModeAdapterItems() = listOf(AdapterItem.PrivateBrowsingDescription)
+private fun bootstrapAdapterItems() = listOf(AdapterItem.TorBootstrap)
+
private fun onboardingAdapterItems(onboardingState: OnboardingState): List {
val items: MutableList = mutableListOf(AdapterItem.OnboardingHeader)
@@ -106,6 +108,13 @@ private fun onboardingAdapterItems(onboardingState: OnboardingState): List = when (mode) {
is Mode.Normal -> normalModeAdapterItems(
topSites,
@@ -115,7 +124,8 @@ private fun HomeFragmentState.toAdapterList(): List = when (mode) {
showCollectionPlaceholder
)
is Mode.Private -> privateModeAdapterItems()
- is Mode.Onboarding -> onboardingAdapterItems(mode.state)
+ is Mode.Onboarding -> torOnboardingAdapterItems()
+ is Mode.Bootstrap -> bootstrapAdapterItems()
}
private fun collectionTabItems(collection: TabCollection) =
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt
index dc032922704a1c535c2160f0fa83e0052f34b65a..fb692427ad1b09060a48c79e313f355fec9e5447 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt
@@ -4,12 +4,10 @@
package org.mozilla.fenix.home.sessioncontrol.viewholders
-import android.text.method.LinkMovementMethod
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.private_browsing_description.view.*
import org.mozilla.fenix.R
-import org.mozilla.fenix.ext.addUnderline
import org.mozilla.fenix.home.sessioncontrol.TabSessionInteractor
class PrivateBrowsingDescriptionViewHolder(
@@ -18,18 +16,18 @@ class PrivateBrowsingDescriptionViewHolder(
) : RecyclerView.ViewHolder(view) {
init {
- val resources = view.resources
- val appName = resources.getString(R.string.app_name)
- view.private_session_description.text = resources.getString(
- R.string.private_browsing_placeholder_description_2, appName
- )
- with(view.private_session_common_myths) {
- movementMethod = LinkMovementMethod.getInstance()
- addUnderline()
- setOnClickListener {
- interactor.onPrivateBrowsingLearnMoreClicked()
- }
- }
+ // val resources = view.resources
+ // val appName = resources.getString(R.string.app_name)
+ // view.private_session_description.text = resources.getString(
+ // R.string.private_browsing_placeholder_description_2, appName
+ // )
+ // with(view.private_session_common_myths) {
+ // movementMethod = LinkMovementMethod.getInstance()
+ // addUnderline()
+ // setOnClickListener {
+ // interactor.onPrivateBrowsingLearnMoreClicked()
+ // }
+ // }
}
companion object {
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapConnectViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapConnectViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..38aa0ffdb165d16b84290f905727724efe42b50c
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapConnectViewHolder.kt
@@ -0,0 +1,113 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders
+
+import android.view.View
+import androidx.appcompat.widget.SwitchCompat
+import androidx.recyclerview.widget.RecyclerView
+import kotlinx.android.synthetic.main.tor_bootstrap_connect.view.*
+import org.mozilla.fenix.R
+import org.mozilla.fenix.tor.TorEvents
+import org.mozilla.fenix.tor.bootstrap.TorQuickStart
+import org.mozilla.fenix.components.Components
+import org.mozilla.fenix.home.sessioncontrol.TorBootstrapInteractor
+
+class TorBootstrapConnectViewHolder(
+ private val view: View,
+ private val components: Components,
+ private val interactor: TorBootstrapInteractor
+) : RecyclerView.ViewHolder(view), TorEvents {
+
+ init {
+ val torQuickStart = TorQuickStart(view.context)
+ setQuickStartDescription(view, torQuickStart)
+
+ with(view.quick_start_toggle as SwitchCompat) {
+ setOnCheckedChangeListener { _, isChecked ->
+ torQuickStart.setQuickStartTor(isChecked)
+ setQuickStartDescription(view, torQuickStart)
+ }
+
+ isChecked = torQuickStart.quickStartTor()
+ }
+
+ with(view.tor_bootstrap_network_settings_button) {
+ setOnClickListener {
+ interactor.onTorStopBootstrapping()
+ interactor.onTorBootstrapNetworkSettingsClicked()
+
+ with(view.tor_bootstrap_progress) {
+ visibility = View.INVISIBLE
+ }
+
+ with(view.tor_bootstrap_connect_button) {
+ visibility = View.VISIBLE
+ }
+ }
+ }
+
+ with(view.tor_bootstrap_connect_button) {
+ setOnClickListener {
+ interactor.onTorBootstrapConnectClicked()
+ interactor.onTorStartBootstrapping()
+
+ visibility = View.INVISIBLE
+
+ with(view.tor_bootstrap_progress) {
+ visibility = View.VISIBLE
+ }
+ }
+ }
+
+ components.torController.registerTorListener(this)
+ }
+
+ private fun setQuickStartDescription(view: View, torQuickStart: TorQuickStart) {
+ val resources = view.context.resources
+ val appName = resources.getString(R.string.app_name)
+ if (torQuickStart.quickStartTor()) {
+ view.tor_bootstrap_quick_start_description.text = resources.getString(
+ R.string.tor_bootstrap_quick_start_enabled, appName
+ )
+ } else {
+ view.tor_bootstrap_quick_start_description.text = resources.getString(
+ R.string.tor_bootstrap_quick_start_disabled
+ )
+ }
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ override fun onTorConnected() {
+ components.torController.unregisterTorListener(this)
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
+
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ if (entry == null) return
+
+ view.tor_bootstrap_status_message.text = entry
+ if (entry.startsWith(BOOTSTRAPPED_PREFIX)) {
+ val percentIdx = entry.indexOf("%")
+ val percent = entry.substring(
+ BOOTSTRAPPED_PREFIX.length,
+ percentIdx
+ )
+ with(view.tor_bootstrap_progress) {
+ progress = percent.toInt()
+ }
+ }
+ }
+
+ companion object {
+ const val LAYOUT_ID = R.layout.tor_bootstrap_connect
+ const val BOOTSTRAPPED_PREFIX = "NOTICE: Bootstrapped "
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapLoggerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapLoggerViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..17b970e7cad0c1b47325c990b71a3a989b8ef48c
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapLoggerViewHolder.kt
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders
+
+import android.text.method.ScrollingMovementMethod
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import kotlinx.android.synthetic.main.tor_bootstrap_logger.view.*
+import org.mozilla.fenix.R
+import org.mozilla.fenix.tor.TorEvents
+import org.mozilla.fenix.components.Components
+
+class TorBootstrapLoggerViewHolder(
+ private val view: View,
+ private val components: Components
+) : RecyclerView.ViewHolder(view), TorEvents {
+
+ private var entries = mutableListOf()
+
+ init {
+ components.torController.registerTorListener(this)
+
+ val currentEntries = components.torController.logEntries
+ .filter { it.first != null }
+ .filter { !(it.first!!.startsWith("Circuit") && it.second == "ON") }
+ // Keep synchronized with format in onTorStatusUpdate
+ .flatMap { listOf("(${it.second}) '${it.first}'") }
+ val entriesLen = currentEntries.size
+ val subListOffset = if (entriesLen > MAX_NEW_ENTRIES) MAX_NEW_ENTRIES else entriesLen
+ entries = currentEntries.subList((entriesLen - subListOffset), entriesLen) as MutableList
+ val initLog = "---------------" + view.resources.getString(R.string.tor_initializing_log) + "---------------"
+ entries.add(0, initLog)
+
+ with(view.tor_bootstrap_log_entries) {
+ movementMethod = ScrollingMovementMethod()
+ text = formatLogEntries(entries)
+ }
+ }
+
+ private fun formatLogEntries(entries: List) = entries.joinToString("\n")
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ override fun onTorConnected() {
+ components.torController.unregisterTorListener(this)
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
+
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ if (status == null || entry == null) return
+ if (status == "ON" && entry.startsWith("Circuit")) return
+
+ if (entries.size > MAX_LINES) {
+ entries = entries.drop(1) as MutableList
+ }
+ entries.add("($status) '$entry'")
+
+ view.tor_bootstrap_log_entries.text = formatLogEntries(entries)
+ }
+
+ companion object {
+ const val LAYOUT_ID = R.layout.tor_bootstrap_logger
+ const val MAX_NEW_ENTRIES = 24
+ const val MAX_LINES = 25
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapPagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapPagerViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ab7d5f5186c612f44c51e6df77d1514b67e2ba2b
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TorBootstrapPagerViewHolder.kt
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders
+
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import kotlinx.android.synthetic.main.tor_bootstrap_pager.view.*
+import org.mozilla.fenix.R
+import org.mozilla.fenix.components.Components
+import org.mozilla.fenix.home.sessioncontrol.TorBootstrapInteractor
+import org.mozilla.fenix.home.sessioncontrol.viewholders.torbootstrap.BootstrapPagerAdapter
+
+class TorBootstrapPagerViewHolder(
+ view: View,
+ components: Components,
+ interactor: TorBootstrapInteractor
+) : RecyclerView.ViewHolder(view) {
+
+ private val bootstrapPagerAdapter = BootstrapPagerAdapter(components, interactor)
+
+ init {
+ view.bootstrap_pager.apply {
+ adapter = bootstrapPagerAdapter
+ }
+ }
+
+ companion object {
+ const val LAYOUT_ID = R.layout.tor_bootstrap_pager
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingDonateViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingDonateViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5f19ba88d51248d16ecdf0743c96923ed24bc4ab
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingDonateViewHolder.kt
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
+
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import kotlinx.android.synthetic.main.tor_onboarding_donate.view.*
+import org.mozilla.fenix.R
+import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor
+
+class TorOnboardingDonateViewHolder(
+ view: View,
+ private val interactor: OnboardingInteractor
+) : RecyclerView.ViewHolder(view) {
+
+ init {
+ view.donate_now_button.setOnClickListener {
+ interactor.onDonateClicked()
+ }
+ }
+
+ companion object {
+ const val LAYOUT_ID = R.layout.tor_onboarding_donate
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7e0b756d88ea10da330586e206bc781d8560edf2
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
+
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import kotlinx.android.synthetic.main.tor_onboarding_security_level.view.*
+import org.mozilla.fenix.R
+import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor
+import org.mozilla.fenix.onboarding.OnboardingRadioButton
+import org.mozilla.fenix.tor.SecurityLevel
+import org.mozilla.fenix.tor.SecurityLevelUtil
+import org.mozilla.fenix.utils.view.addToRadioGroup
+
+class TorOnboardingSecurityLevelViewHolder(
+ view: View,
+ private val interactor: OnboardingInteractor
+) : RecyclerView.ViewHolder(view) {
+
+ private var standardSecurityLevel: OnboardingRadioButton
+ private var saferSecurityLevel: OnboardingRadioButton
+ private var safestSecurityLevel: OnboardingRadioButton
+
+ init {
+ view.header_text.setOnboardingIcon(R.drawable.ic_onboarding_tracking_protection)
+
+ standardSecurityLevel = view.security_level_standard_option
+ saferSecurityLevel = view.security_level_safer_option
+ safestSecurityLevel = view.security_level_safest_option
+
+ view.description_text.text = view.context.getString(
+ R.string.tor_onboarding_security_level_description
+ )
+
+ view.open_settings_button.setOnClickListener {
+ interactor.onOpenSecurityLevelSettingsClicked()
+ }
+
+ setupRadioGroup(view)
+ }
+
+ private fun setupRadioGroup(view: View) {
+
+ addToRadioGroup(standardSecurityLevel, saferSecurityLevel, safestSecurityLevel)
+
+ val securityLevel = try {
+ SecurityLevelUtil.getSecurityLevelFromInt(
+ view.context.components.core.engine.settings.torSecurityLevel
+ )
+ } catch (e: IllegalStateException) {
+ SecurityLevel.STANDARD
+ }
+
+ standardSecurityLevel.isChecked = securityLevel == SecurityLevel.STANDARD
+ safestSecurityLevel.isChecked = securityLevel == SecurityLevel.SAFEST
+ saferSecurityLevel.isChecked = securityLevel == SecurityLevel.SAFER
+
+ standardSecurityLevel.onClickListener {
+ updateSecurityLevel(SecurityLevel.STANDARD)
+ }
+
+ saferSecurityLevel.onClickListener {
+ updateSecurityLevel(SecurityLevel.SAFER)
+ }
+
+ safestSecurityLevel.onClickListener {
+ updateSecurityLevel(SecurityLevel.SAFEST)
+ }
+
+ updateSecurityLevel(securityLevel)
+ }
+
+ private fun updateSecurityLevel(newLevel: SecurityLevel) {
+ val resources = itemView.context.resources
+ val securityLevel = when (newLevel) {
+ SecurityLevel.STANDARD -> resources.getString(R.string.tor_security_level_standard_option)
+ SecurityLevel.SAFER -> resources.getString(R.string.tor_security_level_safer_option)
+ SecurityLevel.SAFEST -> resources.getString(R.string.tor_security_level_safest_option)
+ }
+ itemView.current_level.text = resources.getString(
+ R.string.tor_onboarding_chosen_security_level_label, securityLevel
+ )
+ itemView.context.components.let {
+ it.core.engine.settings.torSecurityLevel = newLevel.intRepresentation
+ }
+ }
+
+ companion object {
+ const val LAYOUT_ID = R.layout.tor_onboarding_security_level
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/torbootstrap/BootstrapPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/torbootstrap/BootstrapPagerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3c4fc7ccff2481b6ee91c9ba49750c5ac38dc68e
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/torbootstrap/BootstrapPagerAdapter.kt
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.home.sessioncontrol.viewholders.torbootstrap
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.ViewHolder
+import org.mozilla.fenix.components.Components
+import org.mozilla.fenix.home.sessioncontrol.TorBootstrapInteractor
+import org.mozilla.fenix.home.sessioncontrol.viewholders.TorBootstrapConnectViewHolder
+import org.mozilla.fenix.home.sessioncontrol.viewholders.TorBootstrapLoggerViewHolder
+
+class BootstrapPagerAdapter(
+ private val components: Components,
+ private val interactor: TorBootstrapInteractor
+) : RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ if (viewType == BOOTSTRAP_UI_PAGE_TYPE) {
+ val viewDVH = LayoutInflater.from(parent.context)
+ .inflate(TorBootstrapConnectViewHolder.LAYOUT_ID, parent, false)
+ return TorBootstrapConnectViewHolder(viewDVH, components, interactor)
+ } else {
+ val viewLVH = LayoutInflater.from(parent.context)
+ .inflate(TorBootstrapLoggerViewHolder.LAYOUT_ID, parent, false)
+ return TorBootstrapLoggerViewHolder(viewLVH, components)
+ }
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+ }
+
+ override fun getItemViewType(position: Int): Int = position
+
+ override fun getItemCount(): Int = BOOTSTRAP_PAGE_COUNT
+
+ companion object {
+ const val BOOTSTRAP_UI_PAGE_TYPE = 0
+ const val BOOTSTRAP_LOG_PAGE_TYPE = 1
+ const val BOOTSTRAP_PAGE_COUNT = 2
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt
index 974551b44e8808a44ca2b4fc9a114f1360445c6d..56659f9e443fe5d88f34bdbf001f948e584b00f0 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt
@@ -131,16 +131,9 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan
@ExperimentalCoroutinesApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- val accountManager = requireComponents.backgroundServices.accountManager
consumeFrom(bookmarkStore) {
bookmarkView.update(it)
-
- // Only display the sign-in prompt if we're inside of the virtual "Desktop Bookmarks" node.
- // Don't want to pester user too much with it, and if there are lots of bookmarks present,
- // it'll just get visually lost. Inside of the "Desktop Bookmarks" node, it'll nicely stand-out,
- // since there are always only three other items in there. It's also the right place contextually.
- bookmarkView.view.bookmark_folders_sign_in.isVisible =
- it.tree?.guid == BookmarkRoot.Root.id && accountManager.authenticatedAccount() == null
+ bookmarkView.view.bookmark_folders_sign_in.isVisible = false
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
index 3540c697eefb0cc4857cf50c541a8b2f6748d27a..71926735620a527d9aea75608fb8bb091fe7ccc1 100644
--- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
@@ -274,6 +274,13 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
inflated.title.text =
getString(R.string.search_suggestions_onboarding_title)
+
+ // Hide Search Suggestions prompt and disable
+ inflated.visibility = View.GONE
+ requireContext().settings().also {
+ it.shouldShowSearchSuggestionsInPrivate = false
+ it.showSearchSuggestionsInPrivateOnboardingFinished = true
+ }
}
view.search_suggestions_hint.setOnInflateListener((stubListener))
diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
index 2a55d96b14f9599281d21c59387117db4cd6c224..888a791348d9be35000010536f98c50100fdac19 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
@@ -189,6 +189,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
requirePreference(R.string.pref_key_tabs)
tabSettingsPreference.summary = context?.settings()?.getTabTimeoutString()
+ // Hide "Delete browsing data on quit" when in Private Browsing-only mode
+ deleteBrowsingDataPreference.isVisible =
+ !deleteBrowsingDataPreference.context.settings().shouldDisableNormalMode
+
setupPreferences()
if (shouldUpdateAccountUIState) {
@@ -217,6 +221,12 @@ class SettingsFragment : PreferenceFragmentCompat() {
resources.getString(R.string.pref_key_search_settings) -> {
SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment()
}
+ resources.getString(R.string.pref_key_tor_network_settings) -> {
+ SettingsFragmentDirections.actionSettingsFragmentToTorNetworkSettingsFragment()
+ }
+ resources.getString(R.string.pref_key_tor_security_level_settings) -> {
+ SettingsFragmentDirections.actionSettingsFragmentToTorSecurityLevelFragment()
+ }
resources.getString(R.string.pref_key_tracking_protection_settings) -> {
requireContext().metrics.track(Event.TrackingProtectionSettings)
SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment()
@@ -242,10 +252,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
resources.getString(R.string.pref_key_help) -> {
(activity as HomeActivity).openToBrowserAndLoad(
- searchTermOrURL = SupportUtils.getSumoURLForTopic(
- requireContext(),
- SupportUtils.SumoTopic.HELP
- ),
+ searchTermOrURL = SupportUtils.getTorHelpPageUrl(),
newTab = true,
from = BrowserDirection.FromSettings
)
@@ -271,6 +278,15 @@ class SettingsFragment : PreferenceFragmentCompat() {
resources.getString(R.string.pref_key_about) -> {
SettingsFragmentDirections.actionSettingsFragmentToAboutFragment()
}
+ resources.getString(R.string.pref_key_donate) -> {
+ (activity as HomeActivity).openToBrowserAndLoad(
+ searchTermOrURL = SupportUtils.DONATE_URL,
+ newTab = true,
+ from = BrowserDirection.FromSettings
+ )
+ null
+ }
+
resources.getString(R.string.pref_key_account) -> {
SettingsFragmentDirections.actionSettingsFragmentToAccountSettingsFragment()
}
@@ -369,6 +385,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
setTint(requireContext().getColorFromAttr(R.attr.primaryText))
}
+ requirePreference(R.string.pref_key_allow_screenshots_in_private_mode).apply {
+ onPreferenceChangeListener = SharedPreferenceUpdater()
+ }
+
if (!Config.channel.isReleased) {
preferenceLeakCanary?.setOnPreferenceChangeListener { _, newValue ->
val isEnabled = newValue == true
diff --git a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
index 7687274c64c0e3629e5aad0cf19c8bba76489ce8..d9e98020b42a1006968d0bb4c2edd2e00fb02576 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
@@ -18,6 +18,7 @@ import java.io.UnsupportedEncodingException
import java.net.URLEncoder
import java.util.Locale
+@Suppress("TooManyFunctions")
object SupportUtils {
const val RATE_APP_URL = "market://details?id=" + BuildConfig.APPLICATION_ID
const val POCKET_TRENDING_URL = "https://getpocket.com/fenix-top-articles"
@@ -26,6 +27,9 @@ object SupportUtils {
const val FIREFOX_BETA_PLAY_STORE_URL = "market://details?id=org.mozilla.firefox_beta"
const val FIREFOX_NIGHTLY_PLAY_STORE_URL = "market://details?id=org.mozilla.fenix"
const val GOOGLE_URL = "https://www.google.com/"
+ const val DONATE_URL = "https://donate.torproject.org/"
+ const val TB_MANUAL_URL = "https://tb-manual.torproject.org/mobile-tor"
+ const val TOR_RELEASES = "https://www.torproject.org/releases/"
enum class SumoTopic(internal val topicStr: String) {
FENIX_MOVING("sync-delist"),
@@ -77,13 +81,23 @@ object SupportUtils {
return "https://support.mozilla.org/kb/access-mozilla-services-firefox-account"
}
+ fun getTorHelpPageUrl(): String {
+ return TB_MANUAL_URL
+ }
+
+ fun getTorReleasePageUrl(): String {
+ return TOR_RELEASES
+ }
+
fun getMozillaPageUrl(page: MozillaPage, locale: Locale = Locale.getDefault()): String {
val path = page.path
val langTag = getLanguageTag(locale)
return "https://www.mozilla.org/$langTag/$path"
}
- fun getWhatsNewUrl(context: Context) = getSumoURLForTopic(context, SumoTopic.WHATS_NEW)
+ fun getWhatsNewUrl(@Suppress("UNUSED_PARAMETER") context: Context): String {
+ return getTorReleasePageUrl()
+ }
fun createCustomTabIntent(context: Context, url: String): Intent = CustomTabsIntent.Builder()
.setInstantAppsEnabled(false)
diff --git a/app/src/main/java/org/mozilla/fenix/settings/TorBridgeConfigFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TorBridgeConfigFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..92d08c3270f86e96067150f46393119bcdf156b5
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/settings/TorBridgeConfigFragment.kt
@@ -0,0 +1,162 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.settings
+
+import android.os.Bundle
+import androidx.preference.EditTextPreference
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.SwitchPreference
+import org.mozilla.fenix.Config
+import org.mozilla.fenix.R
+import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.ext.showToolbar
+import org.mozilla.fenix.tor.TorBridgeTransportConfig
+import org.mozilla.fenix.utils.view.addToRadioGroup
+import org.mozilla.fenix.utils.view.GroupableRadioButton
+import org.mozilla.fenix.utils.view.uncheckAll
+
+/**
+ * Displays the toggle for enabling bridges, options for built-in pluggable transports, and an additional
+ * preference for configuring a user-provided bridge.
+ */
+@Suppress("SpreadOperator")
+class TorBridgeConfigFragment : PreferenceFragmentCompat() {
+ private val builtinBridgeRadioGroups = mutableListOf()
+ private var previousTransportConfig: TorBridgeTransportConfig? = null
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.tor_bridge_config_preferences, rootKey)
+
+ // Initialize radio button group for built-in bridge transport types
+ val radioObfs4 = bindBridgeTransportRadio(TorBridgeTransportConfig.BUILTIN_OBFS4)
+ val radioMeekAzure = bindBridgeTransportRadio(TorBridgeTransportConfig.BUILTIN_MEEK_AZURE)
+ val radioSnowflake = bindBridgeTransportRadio(TorBridgeTransportConfig.BUILTIN_SNOWFLAKE)
+
+ builtinBridgeRadioGroups.addAll(mutableListOf(radioObfs4, radioMeekAzure, radioSnowflake))
+
+ // `*` is Kotlin's "spread" operator, for expanding an Array as a vararg.
+ addToRadioGroup(*builtinBridgeRadioGroups.toTypedArray())
+
+ // Snowflake is not available on Release at this time.
+ if (Config.channel.isRelease) {
+ radioSnowflake.apply {
+ isVisible = false
+ }
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+
+ showToolbar(getString(R.string.preferences_tor_network_settings_bridge_config))
+
+ val bridgesEnabled = requireContext().components.torController.bridgesEnabled
+
+ val prefBridgeConfig =
+ requirePreference(R.string.pref_key_tor_network_settings_bridge_config_toggle)
+ prefBridgeConfig.apply {
+ isChecked = bridgesEnabled
+ setOnPreferenceChangeListener { preference, enabled ->
+ preference.context.components.torController.bridgesEnabled = enabled
+ updateCurrentConfiguredBridgePref(preference)
+ preference.context.components.torController.restartTor()
+ true
+ }
+ }
+
+ val userProvidedBridges = requirePreference(
+ R.string.pref_key_tor_network_settings_bridge_config_user_provided_bridge
+ )
+ userProvidedBridges.apply {
+ setOnPreferenceChangeListener { preference, userProvidedBridge ->
+ builtinBridgeRadioGroups.uncheckAll()
+
+ preference.context.components.torController.bridgeTransport = TorBridgeTransportConfig.USER_PROVIDED
+ preference.context.components.torController.userProvidedBridges = userProvidedBridge
+ updateCurrentConfiguredBridgePref(preference)
+ preference.context.components.torController.restartTor()
+ true
+ }
+ val userProvidedBridge: String? = context.components.torController.userProvidedBridges
+ if (userProvidedBridge != null) {
+ setText(userProvidedBridge)
+ }
+ }
+
+ val currentBridgeType = prefBridgeConfig.context.components.torController.bridgeTransport
+ // Cache the current configured transport type
+ previousTransportConfig = currentBridgeType
+ builtinBridgeRadioGroups.uncheckAll()
+ if (currentBridgeType != TorBridgeTransportConfig.USER_PROVIDED) {
+ val bridgeRadioButton = requirePreference(currentBridgeType.preferenceKey)
+ bridgeRadioButton.setCheckedWithoutClickListener(true)
+ }
+
+ updateCurrentConfiguredBridgePref(prefBridgeConfig)
+ }
+
+ private fun bindBridgeTransportRadio(
+ bridge: TorBridgeTransportConfig
+ ): RadioButtonPreference {
+ val radio = requirePreference(bridge.preferenceKey)
+
+ radio.apply {
+ setOnPreferenceChangeListener { preference, isChecked ->
+ if (isChecked && (previousTransportConfig!! != bridge)) {
+ preference.context.components.torController.bridgeTransport = bridge
+ previousTransportConfig = bridge
+ updateCurrentConfiguredBridgePref(preference)
+ context.components.torController.restartTor()
+ }
+ true
+ }
+ }
+
+ return radio
+ }
+
+ private fun setCurrentBridgeLabel(currentBridgePref: Preference?, bridge: String) {
+ currentBridgePref?.apply {
+ title = getString(
+ R
+ .string
+ .preferences_tor_network_settings_bridge_config_current_bridge,
+ bridge
+ )
+ }
+ }
+
+ private fun updateCurrentConfiguredBridgePref(preference: Preference) {
+ val currentBridge: Preference? =
+ findPreference(
+ getString(
+ R.string.pref_key_tor_network_settings_bridge_config_current_bridge
+ )
+ )
+
+ val enabled = requireContext().components.torController.bridgesEnabled
+
+ if (enabled) {
+ val configuredBridge = preference.context.components.torController.bridgeTransport
+ var bridges = when (configuredBridge) {
+ TorBridgeTransportConfig.USER_PROVIDED ->
+ preference.context.components.torController.userProvidedBridges
+ else -> configuredBridge.transportName
+ }
+
+ if (bridges == null) {
+ bridges = "not known"
+ }
+ setCurrentBridgeLabel(currentBridge, bridges)
+ } else {
+ setCurrentBridgeLabel(
+ currentBridge,
+ getString(R.string.tor_network_settings_bridge_not_configured)
+ )
+ }
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3883c80a164a91b3161595933f6b3e6ba4a6b964
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt
@@ -0,0 +1,162 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.settings
+
+import android.os.Bundle
+import androidx.navigation.findNavController
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import org.mozilla.fenix.R
+import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.ext.showToolbar
+import org.mozilla.fenix.tor.TorBridgeTransportConfig
+import org.mozilla.fenix.tor.TorEvents
+
+/**
+ * Lets the user configure Tor network connection settings
+ */
+class TorNetworkSettingsFragment : PreferenceFragmentCompat(), TorEvents {
+ override fun onResume() {
+ super.onResume()
+
+ val torController = requireContext().components.torController
+
+ torController.registerTorListener(this)
+
+ showToolbar(getString(R.string.preferences_tor_network_settings))
+
+ val yesString = getString(R.string.preferences_tor_network_settings_yes)
+ val noString = getString(R.string.preferences_tor_network_settings_no)
+
+ requirePreference(R.string.pref_key_tor_network_settings_bridge_config).apply {
+ setOnPreferenceClickListener {
+ val directions =
+ TorNetworkSettingsFragmentDirections
+ .actionTorNetworkSettingsFragmentToTorBridgeConfigFragment()
+ requireView().findNavController().navigate(directions)
+ true
+ }
+
+ if (torController.bridgesEnabled) {
+ if (torController.bridgeTransport == TorBridgeTransportConfig.USER_PROVIDED) {
+ summary =
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_bridge_config_description_user_provided_enabled
+ )
+ } else {
+ summary =
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_bridge_config_description_builtin_transport_enabled
+ )
+ }
+ } else {
+ summary =
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_bridge_config_description
+ )
+ }
+ }
+
+ requirePreference(R.string.pref_key_tor_network_settings_bridges_enabled).apply {
+ val formatStringRes = R.string.preferences_tor_network_settings_bridges_enabled
+ title = if (torController.bridgesEnabled) {
+ getString(formatStringRes, yesString)
+ } else {
+ getString(formatStringRes, noString)
+ }
+ }
+
+ setStatus()
+ }
+
+ private fun setStatus() {
+ val torController = requireContext().components.torController
+ val yesString = getString(R.string.preferences_tor_network_settings_yes)
+ val noString = getString(R.string.preferences_tor_network_settings_no)
+
+ requirePreference(R.string.pref_key_tor_network_settings_tor_ready).apply {
+ val formatStringRes = R.string.preferences_tor_network_settings_tor_ready
+ @SuppressWarnings("ComplexCondition")
+ title = if (!torController.isStarting &&
+ torController.isConnected &&
+ torController.isBootstrapped &&
+ !torController.isRestarting) {
+ getString(formatStringRes, yesString)
+ } else {
+ getString(formatStringRes, noString)
+ }
+ }
+
+ requirePreference(R.string.pref_key_tor_network_settings_state).apply {
+ val formatStringRes = R.string.preferences_tor_network_settings_state
+
+ title = if (torController.isRestarting) {
+ getString(formatStringRes,
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_restarting
+ )
+ )
+ } else if (torController.isStarting) {
+ getString(formatStringRes,
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_connecting
+ )
+ )
+ } else if (torController.isConnected) {
+ getString(formatStringRes,
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_connected
+ )
+ )
+ } else {
+ getString(formatStringRes,
+ getString(
+ R
+ .string
+ .preferences_tor_network_settings_disconnected
+ )
+ )
+ }
+ }
+ }
+
+ override fun onStop() {
+ super.onStop()
+ requireContext().components.torController.unregisterTorListener(this)
+ }
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.tor_network_settings_preferences, rootKey)
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnected() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
+
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ setStatus()
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/settings/TorSecurityLevelFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TorSecurityLevelFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..99e718551b4028af7fc6eafb795d8344a42c6b34
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/settings/TorSecurityLevelFragment.kt
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.settings
+
+import android.os.Bundle
+import androidx.preference.PreferenceFragmentCompat
+import org.mozilla.fenix.R
+import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.ext.showToolbar
+import org.mozilla.fenix.tor.SecurityLevel
+import org.mozilla.fenix.tor.SecurityLevelUtil
+import org.mozilla.fenix.utils.view.GroupableRadioButton
+import org.mozilla.fenix.utils.view.addToRadioGroup
+import org.mozilla.fenix.utils.view.uncheckAll
+
+/**
+ * Lets the user choose their security level
+ */
+@Suppress("SpreadOperator")
+class TorSecurityLevelFragment : PreferenceFragmentCompat() {
+ private val securityLevelRadioGroups = mutableListOf()
+ private var previousSecurityLevel: SecurityLevel? = null
+
+ override fun onResume() {
+ super.onResume()
+ showToolbar(getString(R.string.preferences_tor_security_level_options))
+ }
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.tor_security_level_preferences, rootKey)
+
+ val currentLevel: SecurityLevel? = context?.components?.let {
+ try {
+ SecurityLevelUtil.getSecurityLevelFromInt(
+ it.core.engine.settings.torSecurityLevel
+ )
+ } catch (e: IllegalStateException) {
+ // The default state is 0. If we get an invalid state then
+ // default to Standard (4).
+ SecurityLevel.STANDARD
+ }
+ }
+
+ if (currentLevel == null) {
+ throw IllegalStateException("context or Components is null.")
+ }
+
+ val radioSafer = bindSecurityLevelRadio(SecurityLevel.SAFER)
+ val radioSafest = bindSecurityLevelRadio(SecurityLevel.SAFEST)
+ val radioStandard = bindSecurityLevelRadio(SecurityLevel.STANDARD)
+
+ securityLevelRadioGroups.addAll(mutableListOf(radioSafer, radioSafest, radioStandard))
+ // `*` is Kotlin's "spread" operator, for expanding an Array as a vararg.
+ addToRadioGroup(*securityLevelRadioGroups.toTypedArray())
+
+ securityLevelRadioGroups.uncheckAll()
+ val securityLevelRadioButton = requirePreference(currentLevel.preferenceKey)
+ // Cache this for later comparison in the OnPreferenceChangeListener
+ previousSecurityLevel = currentLevel
+ securityLevelRadioButton.setCheckedWithoutClickListener(true)
+ }
+
+ private fun bindSecurityLevelRadio(
+ level: SecurityLevel
+ ): RadioButtonPreference {
+ val radio = requirePreference(level.preferenceKey)
+
+ radio.summary = getString(level.contentDescriptionRes)
+
+ radio.apply {
+ setOnPreferenceChangeListener { preference, isChecked ->
+ if (isChecked && (previousSecurityLevel!! != level)) {
+ preference.context.components.core.engine.settings.torSecurityLevel =
+ level.intRepresentation
+ previousSecurityLevel = level
+ }
+ true
+ }
+ }
+
+ return radio
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt
index 9f80cf5e6c55ad628aa427ea293a29b74a38e42a..25356c336fad68f88f5d14e0fcb53e19916cc2f2 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt
@@ -17,7 +17,6 @@ import androidx.recyclerview.widget.DividerItemDecoration
import kotlinx.android.synthetic.main.fragment_about.*
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.BuildConfig
-import org.mozilla.fenix.Config
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
@@ -50,8 +49,7 @@ class AboutFragment : Fragment(), AboutPageListener {
): View? {
val rootView = inflater.inflate(R.layout.fragment_about, container, false)
appName = getString(R.string.app_name)
- headerAppName =
- if (Config.channel.isRelease) getString(R.string.daylight_app_name) else appName
+ headerAppName = appName
activity?.title = getString(R.string.preferences_about, appName)
return rootView
@@ -117,7 +115,7 @@ class AboutFragment : Fragment(), AboutPageListener {
""
}
- val content = getString(R.string.about_content, headerAppName)
+ val content = getString(R.string.tor_about_content, headerAppName)
val buildDate = BuildConfig.BUILD_DATE
about_text.text = aboutText
@@ -138,25 +136,25 @@ class AboutFragment : Fragment(), AboutPageListener {
AboutPageItem(
AboutItem.ExternalLink(
SUPPORT,
- SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.HELP)
+ SupportUtils.getTorHelpPageUrl()
), getString(R.string.about_support)
),
- AboutPageItem(
- AboutItem.Crashes,
- getString(R.string.about_crashes)
- ),
- AboutPageItem(
- AboutItem.ExternalLink(
- PRIVACY_NOTICE,
- SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE)
- ), getString(R.string.about_privacy_notice)
- ),
- AboutPageItem(
- AboutItem.ExternalLink(
- RIGHTS,
- SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.YOUR_RIGHTS)
- ), getString(R.string.about_know_your_rights)
- ),
+ // AboutPageItem(
+ // AboutItem.Crashes,
+ // getString(R.string.about_crashes)
+ // ),
+ // AboutPageItem(
+ // AboutItem.ExternalLink(
+ // PRIVACY_NOTICE,
+ // SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE)
+ // ), getString(R.string.about_privacy_notice)
+ // ),
+ // AboutPageItem(
+ // AboutItem.ExternalLink(
+ // RIGHTS,
+ // SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.YOUR_RIGHTS)
+ // ), getString(R.string.about_know_your_rights)
+ // ),
AboutPageItem(
AboutItem.ExternalLink(LICENSING_INFO, ABOUT_LICENSE_URL),
getString(R.string.about_licensing_information)
diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt
index 965ff46cfb25b4ac309dadb130995c942f48cbe4..4f25c58537ad63ad24c8ca9ec537c9f50032a37a 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt
@@ -86,7 +86,7 @@ class AccountUiView(
// Signed-out.
} else {
- preferenceSignIn.isVisible = true
+ preferenceSignIn.isVisible = false
preferenceFirefoxAccount.isVisible = false
preferenceFirefoxAccountAuthError.isVisible = false
accountPreferenceCategory.isVisible = false
diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt
index 46f30d451a579793c1b0ca845fe1f29674368cf8..81386ef2f97b20131f0db33b551b6a257469c017 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt
@@ -7,6 +7,7 @@ package org.mozilla.fenix.settings.advanced
import android.app.Activity
import android.content.Context
import mozilla.components.support.locale.LocaleManager
+import org.mozilla.fenix.ext.components
import java.util.Locale
interface LocaleSettingsController {
@@ -55,5 +56,9 @@ class DefaultLocaleSettingsController(
config.setLocale(locale)
config.setLayoutDirection(locale)
resources.updateConfiguration(config, resources.displayMetrics)
+ // A slightly hacky way of triggering a `runtime.settings.locales` update,
+ // so that the locales are updated in GeckoView.
+ val spoofEnglish = context.components.core.engine.settings.spoofEnglish
+ context.components.core.engine.settings.spoofEnglish = spoofEnglish
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt
index 4a307d29d64c8e662db305b44de6a1a70bcafca5..2de150a207a5bf42520640ded10558ef4a5d6767 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt
@@ -19,6 +19,8 @@ import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.R
import org.mozilla.fenix.components.StoreProvider
+import org.mozilla.fenix.ext.requireComponents
+import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
class LocaleSettingsFragment : Fragment() {
@@ -37,7 +39,9 @@ class LocaleSettingsFragment : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
- val view = inflater.inflate(R.layout.fragment_locale_settings, container, false)
+ val view = inflater.inflate(R.layout.fragment_locale_settings, container, false).also {
+ bindEnableSwitch(it)
+ }
store = StoreProvider.get(this) {
LocaleSettingsStore(
@@ -54,6 +58,16 @@ class LocaleSettingsFragment : Fragment() {
return view
}
+ @SuppressWarnings("LongMethod")
+ private fun bindEnableSwitch(view: View) {
+ val switch = view.enable_switch
+ switch.isChecked = requireComponents.core.engine.settings.spoofEnglish
+ switch.setOnCheckedChangeListener { _, isChecked ->
+ context?.settings()?.spoofEnglish = isChecked
+ requireComponents.core.engine.settings.spoofEnglish = isChecked
+ }
+ }
+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.languages_list, menu)
val searchItem = menu.findItem(R.id.search)
diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt
index c01c305d0bc751a96c436a11648ad7e590ee919f..4479b954362e92fce87381af098e411a341ce568 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt
@@ -32,7 +32,6 @@ import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getRootView
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.utils.allowUndo
-import java.util.Locale
abstract class SearchEngineListPreference @JvmOverloads constructor(
context: Context,
@@ -115,7 +114,6 @@ abstract class SearchEngineListPreference @JvmOverloads constructor(
searchEngineList.list
.filter { it.identifier != searchEngineList.default?.identifier }
- .sortedBy { it.name.toLowerCase(Locale.getDefault()) }
.forEachIndexed(setupSearchEngineItem)
}
diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt
index e3c1a7310e8d5be05e6c741a8945c9e0e906558d..53547d68804d71e937047be28f295c2e303e37af 100644
--- a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt
+++ b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt
@@ -26,6 +26,7 @@ import mozilla.components.concept.sync.TabData
import mozilla.components.feature.accounts.push.SendTabUseCases
import mozilla.components.feature.share.RecentAppsStorage
import mozilla.components.support.ktx.kotlin.isExtensionUrl
+import mozilla.components.support.utils.TorUtils
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
@@ -101,7 +102,7 @@ class DefaultShareController(
@Suppress("TooGenericExceptionCaught")
val result = try {
- context.startActivity(intent)
+ TorUtils.startActivityPrompt(context, intent)
ShareController.Result.SUCCESS
} catch (e: Exception) {
when (e) {
diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt
index 419f5c43598c42a8a4811bf02be4c60b62441a61..648cfe05cdf9634fba299aff35dbc13ac0064cf3 100644
--- a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt
@@ -37,7 +37,6 @@ class ShareFragment : AppCompatDialogFragment() {
}
private lateinit var shareInteractor: ShareInteractor
private lateinit var shareCloseView: ShareCloseView
- private lateinit var shareToAccountDevicesView: ShareToAccountDevicesView
private lateinit var shareToAppsView: ShareToAppsView
override fun onAttach(context: Context) {
@@ -92,9 +91,6 @@ class ShareFragment : AppCompatDialogFragment() {
)
view.shareWrapper.setOnClickListener { shareInteractor.onShareClosed() }
- shareToAccountDevicesView =
- ShareToAccountDevicesView(view.devicesShareLayout, shareInteractor)
-
if (args.showPage) {
// Show the previous fragment underneath the share background scrim
// by making it translucent.
@@ -113,9 +109,6 @@ class ShareFragment : AppCompatDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- viewModel.devicesList.observe>(viewLifecycleOwner) { devicesShareOptions ->
- shareToAccountDevicesView.setShareTargets(devicesShareOptions)
- }
viewModel.appsList.observe>(viewLifecycleOwner) { appsToShareTo ->
shareToAppsView.setShareTargets(appsToShareTo)
}
diff --git a/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt b/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt
index cc30b74211881165638e4da362d98815c8cca8b4..b3536ba1f45459cadbb2f8182a06442e1f978712 100644
--- a/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt
+++ b/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt
@@ -22,8 +22,9 @@ class PwaOnboardingObserver(
) : Session.Observer {
override fun onLoadingStateChanged(session: Session, loading: Boolean) {
+ @SuppressWarnings("CollapsibleIfStatements")
if (!loading && webAppUseCases.isInstallable() && !settings.userKnowsAboutPwas) {
- settings.incrementVisitedInstallableCount()
+ // settings.incrementVisitedInstallableCount()
if (settings.shouldShowPwaCfr) {
val directions =
BrowserFragmentDirections.actionBrowserFragmentToPwaOnboardingDialogFragment()
diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt
index 25eaad1cfddebb05c5495509829b83e9237df257..fa1d3f21aa42fbbebe28568ad26cde04e5afdc81 100644
--- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt
+++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt
@@ -16,6 +16,7 @@ import androidx.cardview.widget.CardView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.content.ContextCompat
+import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
@@ -43,6 +44,7 @@ import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.tabstray.TabViewHolder
import mozilla.components.feature.syncedtabs.SyncedTabsFeature
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
+import mozilla.components.support.base.log.logger.Logger
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.InfoBanner
import org.mozilla.fenix.components.metrics.Event
@@ -81,6 +83,8 @@ class TabTrayView(
private val isPrivateModeSelected: Boolean get() = view.tab_layout.selectedTabPosition == PRIVATE_TAB_ID
+ private val isNormalModeDisabled = container.context.settings().shouldDisableNormalMode
+
private val behavior = BottomSheetBehavior.from(view.tab_wrapper)
private val concatAdapter = ConcatAdapter(tabsAdapter)
@@ -96,6 +100,8 @@ class TabTrayView(
private var hasLoaded = false
+ private val logger = Logger("TabTrayView")
+
override val containerView: View?
get() = container
@@ -112,6 +118,10 @@ class TabTrayView(
init {
components.analytics.metrics.track(Event.TabsTrayOpened)
+ if (!isPrivate && isNormalModeDisabled) {
+ logger.debug("TabTrayView: isNormalModeDisabled but not Private tabs")
+ }
+
toggleFabText(isPrivate)
behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
@@ -139,6 +149,15 @@ class TabTrayView(
PRIVATE_TAB_ID
}
+ // Find non-private mode tab and set visibility
+ view.tab_layout.getTabAt(DEFAULT_TAB_ID)?.getCustomView()?.apply {
+ // The View we get from getCustomView() is only a sub-component
+ // of the actual tab (for example, the tab-count box). We need
+ // the "Custom View"'s parent for controlling the visibility
+ // of the entire tab.
+ (getParent() as? View)?.isGone = isNormalModeDisabled
+ }
+
view.tab_layout.getTabAt(selectedTabIndex)?.also {
view.tab_layout.selectTab(it, true)
}
diff --git a/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt b/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
index f39c8dd0f95556dbcb0f92142e2e3d944810b292..cc5fbf4a6368e61bffc556c707a7ca043e3fb25f 100644
--- a/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
+++ b/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
@@ -32,7 +32,7 @@ abstract class ThemeManager {
@get:StyleRes
val currentThemeResource get() = when (currentTheme) {
BrowsingMode.Normal -> R.style.NormalTheme
- BrowsingMode.Private -> R.style.PrivateTheme
+ BrowsingMode.Private -> R.style.PrivateEOYTheme
}
/**
diff --git a/app/src/main/java/org/mozilla/fenix/tor/SecurityLevel.kt b/app/src/main/java/org/mozilla/fenix/tor/SecurityLevel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9a0743e6aebd7dfab7c02abc5fc5e8ecea68c209
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/tor/SecurityLevel.kt
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.tor
+
+import android.os.Parcelable
+import androidx.annotation.StringRes
+import kotlinx.android.parcel.Parcelize
+import org.mozilla.fenix.R
+
+@Parcelize
+enum class SecurityLevel(
+ @StringRes val preferenceKey: Int,
+ @StringRes val contentDescriptionRes: Int,
+ val intRepresentation: Int
+) : Parcelable {
+
+ STANDARD(
+ preferenceKey = R.string.pref_key_tor_security_level_standard_option,
+ contentDescriptionRes = R.string.tor_security_level_standard_description,
+ intRepresentation = SecurityLevel.SECURITY_LEVEL_STANDARD
+ ),
+ SAFER(
+ preferenceKey = R.string.pref_key_tor_security_level_safer_option,
+ contentDescriptionRes = R.string.tor_security_level_safer_description,
+ intRepresentation = SecurityLevel.SECURITY_LEVEL_SAFER
+ ),
+ SAFEST(
+ preferenceKey = R.string.pref_key_tor_security_level_safest_option,
+ contentDescriptionRes = R.string.tor_security_level_safest_description,
+ intRepresentation = SecurityLevel.SECURITY_LEVEL_SAFEST
+ );
+
+ companion object {
+ const val SECURITY_LEVEL_STANDARD = 4
+ const val SECURITY_LEVEL_SAFER = 2
+ const val SECURITY_LEVEL_SAFEST = 1
+ }
+}
+
+object SecurityLevelUtil {
+ fun getSecurityLevelFromInt(level: Int): SecurityLevel {
+ return when (level) {
+ SecurityLevel.SECURITY_LEVEL_STANDARD -> SecurityLevel.STANDARD
+ SecurityLevel.SECURITY_LEVEL_SAFER -> SecurityLevel.SAFER
+ SecurityLevel.SECURITY_LEVEL_SAFEST -> SecurityLevel.SAFEST
+ else -> throw IllegalStateException("Security Level $level is not valid")
+ }
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/tor/TorBridgeTransports.kt b/app/src/main/java/org/mozilla/fenix/tor/TorBridgeTransports.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b88ae41641e29a6fb913298f98b4219b444d1ce0
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/tor/TorBridgeTransports.kt
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.tor
+
+import android.os.Parcelable
+import androidx.annotation.StringRes
+import kotlinx.android.parcel.Parcelize
+import org.mozilla.fenix.R
+
+@Parcelize
+enum class TorBridgeTransportConfig(
+ @StringRes val preferenceKey: Int,
+ val transportName: String
+) : Parcelable {
+
+ BUILTIN_OBFS4(
+ preferenceKey = R.string.pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4,
+ transportName = "obfs4"
+ ),
+ BUILTIN_MEEK_AZURE(
+ preferenceKey = R.string.pref_key_tor_network_settings_bridge_config_builtin_bridge_meek_azure,
+ transportName = "meek"
+ ),
+ BUILTIN_SNOWFLAKE(
+ preferenceKey = R.string.pref_key_tor_network_settings_bridge_config_builtin_bridge_snowflake,
+ transportName = "snowflake"
+ ),
+ USER_PROVIDED(
+ preferenceKey = R.string.pref_key_tor_network_settings_bridge_config_user_provided_bridge,
+ transportName = "user_provided"
+ )
+}
+
+object TorBridgeTransportConfigUtil {
+ fun getStringToBridgeTransport(bridge: String): TorBridgeTransportConfig {
+ return when (bridge) {
+ TorBridgeTransportConfig.BUILTIN_OBFS4.transportName ->
+ TorBridgeTransportConfig.BUILTIN_OBFS4
+ TorBridgeTransportConfig.BUILTIN_MEEK_AZURE.transportName ->
+ TorBridgeTransportConfig.BUILTIN_MEEK_AZURE
+ TorBridgeTransportConfig.BUILTIN_SNOWFLAKE.transportName ->
+ TorBridgeTransportConfig.BUILTIN_SNOWFLAKE
+ else -> TorBridgeTransportConfig.USER_PROVIDED
+ }
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/tor/TorController.kt b/app/src/main/java/org/mozilla/fenix/tor/TorController.kt
new file mode 100644
index 0000000000000000000000000000000000000000..baa4e3919ed01857abbdc5b5d12e8e48271917ff
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/tor/TorController.kt
@@ -0,0 +1,374 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.tor
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import androidx.lifecycle.LifecycleCoroutineScope
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withTimeoutOrNull
+
+import org.mozilla.fenix.BuildConfig
+
+import org.torproject.android.service.TorService
+import org.torproject.android.service.TorServiceConstants
+import org.torproject.android.service.util.Prefs
+
+interface TorEvents {
+ fun onTorConnecting()
+ fun onTorConnected()
+ fun onTorStatusUpdate(entry: String?, status: String?)
+ fun onTorStopped()
+}
+
+private enum class TorStatus {
+ OFF,
+ STARTING,
+ ON,
+ STOPPING,
+ UNKNOWN;
+
+ fun getStateFromString(status: String): TorStatus {
+ return when (status) {
+ TorServiceConstants.STATUS_ON -> ON
+ TorServiceConstants.STATUS_STARTING -> STARTING
+ TorServiceConstants.STATUS_STOPPING -> STOPPING
+ TorServiceConstants.STATUS_OFF -> OFF
+ else -> UNKNOWN
+ }
+ }
+
+ fun isOff() = this == OFF
+ fun isOn() = this == ON
+ fun isStarting() = this == STARTING
+ fun isStarted() = ((this == TorStatus.STARTING) || (this == TorStatus.ON))
+ fun isStopping() = this == STOPPING
+ fun isUnknown() = this == UNKNOWN
+}
+
+@SuppressWarnings("TooManyFunctions")
+class TorController(
+ private val context: Context
+) : TorEvents {
+
+ private val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context)
+ private val entries = mutableListOf>()
+ val logEntries get() = entries
+
+ private var torListeners = mutableListOf()
+
+ private var pendingRegisterChangeList = mutableListOf>()
+ private var lockTorListenersMutation = false
+
+ private var lastKnownStatus = TorStatus.OFF
+ private var wasTorBootstrapped = false
+ private var isTorRestarting = false
+
+ // This may be a lie
+ private var isTorBootstrapped = false
+ get() = ((lastKnownStatus == TorStatus.ON) && wasTorBootstrapped)
+
+ val isDebugLoggingEnabled get() =
+ context
+ .getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE)
+ .getBoolean("pref_enable_logging", false)
+
+ val isStarting get() = lastKnownStatus.isStarting()
+ val isRestarting get() = isTorRestarting
+ val isBootstrapped get() = isTorBootstrapped
+ val isConnected get() = (lastKnownStatus.isStarted() && !isTorRestarting)
+
+ var bridgesEnabled: Boolean
+ get() = Prefs.bridgesEnabled()
+ set(value) { Prefs.putBridgesEnabled(value) }
+
+ var bridgeTransport: TorBridgeTransportConfig
+ get() {
+ return TorBridgeTransportConfigUtil.getStringToBridgeTransport(
+ Prefs.getBridgesList()
+ )
+ }
+ set(value) {
+ if (value == TorBridgeTransportConfig.USER_PROVIDED) {
+ // Don't set the pref when the value is USER_PROVIDED because
+ // "user_provided" is not a valid bridge or transport type.
+ // This call should be followed by setting userProvidedBridges.
+ return
+ }
+ Prefs.setBridgesList(value.transportName)
+ }
+
+ var userProvidedBridges: String?
+ get() {
+ val bridges = Prefs.getBridgesList()
+ val bridgeType =
+ TorBridgeTransportConfigUtil.getStringToBridgeTransport(bridges)
+ return when (bridgeType) {
+ TorBridgeTransportConfig.USER_PROVIDED -> bridges
+ else -> null
+ }
+ }
+ set(value) {
+ Prefs.setBridgesList(value)
+ }
+
+ fun start() {
+ // Register receiver
+ lbm.registerReceiver(
+ persistentBroadcastReceiver,
+ IntentFilter(TorServiceConstants.ACTION_STATUS)
+ )
+ lbm.registerReceiver(
+ persistentBroadcastReceiver,
+ IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG)
+ )
+ }
+
+ fun stop() {
+ lbm.unregisterReceiver(persistentBroadcastReceiver)
+ }
+
+ private val persistentBroadcastReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ if (intent.action == null ||
+ (intent.action != TorServiceConstants.ACTION_STATUS &&
+ intent.action != TorServiceConstants.LOCAL_ACTION_LOG)
+ ) {
+ return
+ }
+ val action = intent.action
+
+ val logentry: String?
+ val status: String?
+ if (action == TorServiceConstants.LOCAL_ACTION_LOG) {
+ logentry = intent.getExtras()
+ ?.getCharSequence(TorServiceConstants.LOCAL_EXTRA_LOG) as? String?
+ } else {
+ logentry = null
+ }
+
+ status = intent.getExtras()
+ ?.getCharSequence(TorServiceConstants.EXTRA_STATUS) as? String?
+
+ if (logentry == null && status == null) {
+ return
+ }
+
+ onTorStatusUpdate(logentry, status)
+
+ if (status == null) {
+ return
+ }
+
+ val newStatus = lastKnownStatus.getStateFromString(status)
+
+ if (newStatus.isUnknown() && wasTorBootstrapped) {
+ stopTor()
+ }
+
+ entries.add(Pair(logentry, status))
+
+ if (logentry != null && logentry.contains(TorServiceConstants.TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)) {
+ wasTorBootstrapped = true
+ onTorConnected()
+ }
+
+ if (lastKnownStatus.isStopping() && newStatus.isOff()) {
+ if (isTorRestarting) {
+ initiateTorBootstrap()
+ } else {
+ onTorStopped()
+ }
+ }
+
+ if (lastKnownStatus.isOff() && newStatus.isStarting()) {
+ isTorRestarting = false
+ }
+
+ lastKnownStatus = newStatus
+ }
+ }
+
+ override fun onTorConnecting() {
+ lockTorListenersMutation = true
+ torListeners.forEach { it.onTorConnecting() }
+ lockTorListenersMutation = false
+
+ handlePendingRegistrationChanges()
+ }
+
+ override fun onTorConnected() {
+ lockTorListenersMutation = true
+ torListeners.forEach { it.onTorConnected() }
+ lockTorListenersMutation = false
+
+ handlePendingRegistrationChanges()
+ }
+
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ lockTorListenersMutation = true
+ torListeners.forEach { it.onTorStatusUpdate(entry, status) }
+ lockTorListenersMutation = false
+
+ handlePendingRegistrationChanges()
+ }
+
+ override fun onTorStopped() {
+ lockTorListenersMutation = true
+ torListeners.forEach { it.onTorStopped() }
+ lockTorListenersMutation = false
+
+ handlePendingRegistrationChanges()
+ }
+
+ fun registerTorListener(l: TorEvents) {
+ if (torListeners.contains(l)) {
+ return
+ }
+
+ if (lockTorListenersMutation) {
+ pendingRegisterChangeList.add(Pair(l, true))
+ } else {
+ torListeners.add(l)
+ }
+ }
+
+ fun unregisterTorListener(l: TorEvents) {
+ if (!torListeners.contains(l)) {
+ return
+ }
+
+ if (lockTorListenersMutation) {
+ pendingRegisterChangeList.add(Pair(l, false))
+ } else {
+ torListeners.remove(l)
+ }
+ }
+
+ private fun handlePendingRegistrationChanges() {
+ pendingRegisterChangeList.forEach {
+ if (it.second) {
+ registerTorListener(it.first)
+ } else {
+ unregisterTorListener(it.first)
+ }
+ }
+
+ pendingRegisterChangeList.clear()
+ }
+
+ /**
+ * Receive the current Tor status.
+ *
+ * Send a request for the current status and receive the response.
+ * Returns true if Tor is running, false otherwise.
+ *
+ */
+ private suspend fun checkTorIsStarted(): Boolean {
+ val channel = Channel()
+
+ // Register receiver
+ val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context)
+ val localBroadcastReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ val action = intent.action ?: return
+ // We only want ACTION_STATUS messages
+ if (action != TorServiceConstants.ACTION_STATUS) {
+ return
+ }
+ // The current status has the EXTRA_STATUS key
+ val currentStatus =
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS)
+ channel.offer(currentStatus === TorServiceConstants.STATUS_ON)
+ }
+ }
+ lbm.registerReceiver(
+ localBroadcastReceiver,
+ IntentFilter(TorServiceConstants.ACTION_STATUS)
+ )
+
+ // Request service status
+ sendServiceAction(TorServiceConstants.ACTION_STATUS)
+
+ // Wait for response and unregister receiver
+ var torIsStarted = false
+ withTimeoutOrNull(torServiceResponseTimeout) {
+ torIsStarted = channel.receive()
+ }
+ lbm.unregisterReceiver(localBroadcastReceiver)
+ return torIsStarted
+ }
+
+ fun initiateTorBootstrap(lifecycleScope: LifecycleCoroutineScope? = null, withDebugLogging: Boolean = false) {
+ if (BuildConfig.DISABLE_TOR) {
+ return
+ }
+
+ context.getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE)
+ .edit().putBoolean("pref_enable_logging", withDebugLogging).apply()
+
+ if (lifecycleScope == null) {
+ sendServiceAction(TorServiceConstants.ACTION_START)
+ } else {
+ lifecycleScope.launch {
+ val torNeedsStart = !checkTorIsStarted()
+ if (torNeedsStart) {
+ sendServiceAction(TorServiceConstants.ACTION_START)
+ }
+ }
+ }
+ }
+
+ fun stopTor() {
+ if (BuildConfig.DISABLE_TOR) {
+ return
+ }
+
+ val torService = Intent(context, TorService::class.java)
+ context.stopService(torService)
+ }
+
+ fun setTorStopped() {
+ lastKnownStatus = TorStatus.OFF
+ onTorStopped()
+ }
+
+ fun restartTor() {
+ // tor-android-service doesn't dynamically update the torrc file,
+ // and it doesn't use SETCONF, so we completely restart the service.
+ // However, don't restart if we aren't started and we weren't
+ // previously started.
+ if (!lastKnownStatus.isStarted() && !wasTorBootstrapped) {
+ return
+ }
+
+ if (!lastKnownStatus.isStarted() && wasTorBootstrapped) {
+ // If we aren't started, but we were previously bootstrapped,
+ // then we handle a "restart" request as a "start" restart
+ initiateTorBootstrap()
+ } else {
+ // |isTorRestarting| tracks the state of restart. When we receive an |OFF| state
+ // from TorService in persistentBroadcastReceiver::onReceive we restart the Tor
+ // service.
+ isTorRestarting = true
+ stopTor()
+ }
+ }
+
+ private fun sendServiceAction(action: String) {
+ val torServiceStatus = Intent(context, TorService::class.java)
+ torServiceStatus.action = action
+ context.startService(torServiceStatus)
+ }
+
+ companion object {
+ const val torServiceResponseTimeout = 5000L
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/tor/bootstrap/TorQuickStart.kt b/app/src/main/java/org/mozilla/fenix/tor/bootstrap/TorQuickStart.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9cd90575e656c7c239c582b2f0ed5ee86540aa6b
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/tor/bootstrap/TorQuickStart.kt
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.tor.bootstrap
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.StrictMode
+import androidx.annotation.VisibleForTesting
+import mozilla.components.support.ktx.android.content.PreferencesHolder
+import mozilla.components.support.ktx.android.content.booleanPreference
+import org.mozilla.fenix.ext.application
+import org.mozilla.fenix.ext.components
+
+class TorQuickStart(val context: Context) : PreferencesHolder {
+
+ override val preferences: SharedPreferences =
+ context.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
+ context.getSharedPreferences(
+ PREF_NAME_TOR_BOOTSTRAP_KEY,
+ Context.MODE_PRIVATE
+ )
+ }
+
+ private var torQuickStart by booleanPreference(TOR_QUICK_START, default = false)
+
+ fun quickStartTor() =
+ context.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { torQuickStart }
+
+ fun enableQuickStartTor() {
+ torQuickStart = true
+ }
+ fun disableQuickStartTor() {
+ torQuickStart = false
+ }
+ fun setQuickStartTor(enabled: Boolean) = if (enabled) {
+ enableQuickStartTor()
+ } else {
+ disableQuickStartTor()
+ }
+
+ companion object {
+ /**
+ * Name of the shared preferences file.
+ */
+ private const val PREF_NAME_TOR_BOOTSTRAP_KEY = "tor.bootstrap"
+
+ /**
+ * Key for [quickStartTor].
+ */
+ @VisibleForTesting
+ internal const val TOR_QUICK_START = "tor.bootstrap.quick_start_enabled"
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
index f1a50f454d1dd710f82963a1ff5c8e4408ed8e61..dacadec5ac6be91bd44184271020c6976652b043 100644
--- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
+++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
@@ -40,6 +40,7 @@ import org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataOnQuitTyp
import org.mozilla.fenix.settings.logins.SavedLoginsSortingStrategyMenu
import org.mozilla.fenix.settings.logins.SortingStrategy
import org.mozilla.fenix.settings.registerOnSharedPreferenceChangeListener
+import org.mozilla.fenix.tor.SecurityLevel
import java.security.InvalidParameterException
private const val AUTOPLAY_USER_SETTING = "AUTOPLAY_USER_SETTING"
@@ -168,7 +169,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var openLinksInAPrivateTab by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_open_links_in_a_private_tab),
- default = false
+ default = true
)
var allowScreenshotsInPrivateMode by booleanPreference(
@@ -186,6 +187,38 @@ class Settings(private val appContext: Context) : PreferencesHolder {
false
)
+ var standardSecurityLevel by booleanPreference(
+ appContext.getPreferenceKey(SecurityLevel.STANDARD.preferenceKey),
+ default = true
+ )
+
+ var saferSecurityLevel by booleanPreference(
+ appContext.getPreferenceKey(SecurityLevel.SAFER.preferenceKey),
+ default = false
+ )
+
+ var safestSecurityLevel by booleanPreference(
+ appContext.getPreferenceKey(SecurityLevel.SAFEST.preferenceKey),
+ default = false
+ )
+
+ // torSecurityLevel is defined as the first |true| preference,
+ // beginning at the safest level.
+ // If multiple preferences are true, then that is a bug and the
+ // highest |true| security level is chosen.
+ // Standard is the default level.
+ fun torSecurityLevel(): SecurityLevel = when {
+ safestSecurityLevel -> SecurityLevel.SAFEST
+ saferSecurityLevel -> SecurityLevel.SAFER
+ standardSecurityLevel -> SecurityLevel.STANDARD
+ else -> SecurityLevel.STANDARD
+ }
+
+ var spoofEnglish by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_spoof_english),
+ default = false
+ )
+
// If any of the prefs have been modified, quit displaying the fenix moved tip
fun shouldDisplayFenixMovingTip(): Boolean =
preferences.getBoolean(
@@ -286,17 +319,17 @@ class Settings(private val appContext: Context) : PreferencesHolder {
val isTelemetryEnabled by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_telemetry),
- default = true
+ default = BuildConfig.DATA_COLLECTION_DISABLED == false
)
val isMarketingTelemetryEnabled by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_marketing_telemetry),
- default = true
+ default = BuildConfig.DATA_COLLECTION_DISABLED == false
)
val isExperimentationEnabled by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_experimentation),
- default = true
+ default = BuildConfig.DATA_COLLECTION_DISABLED == false
)
private var trackingProtectionOnboardingShownThisSession = false
@@ -444,7 +477,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var shouldUseTrackingProtection by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_tracking_protection),
- default = true
+ default = false
)
/**
@@ -534,11 +567,16 @@ class Settings(private val appContext: Context) : PreferencesHolder {
return touchExplorationIsEnabled || switchServiceIsEnabled
}
- var lastKnownMode: BrowsingMode = BrowsingMode.Normal
+ val shouldDisableNormalMode by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_disable_normal_mode),
+ true
+ )
+
+ var lastKnownMode: BrowsingMode = BrowsingMode.Private
get() {
val lastKnownModeWasPrivate = preferences.getBoolean(
appContext.getPreferenceKey(R.string.pref_key_last_known_mode_private),
- false
+ shouldDisableNormalMode
)
return if (lastKnownModeWasPrivate) {
@@ -723,7 +761,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var userKnowsAboutPwas by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_user_knows_about_pwa),
- default = false
+ default = true
)
var shouldShowOpenInAppBanner by booleanPreference(
@@ -909,7 +947,8 @@ class Settings(private val appContext: Context) : PreferencesHolder {
numTimesPrivateModeOpened.value == CFR_COUNT_CONDITION_FOCUS_NOT_INSTALLED
}
- if (showCondition && !showedPrivateModeContextualFeatureRecommender) {
+ if (!shouldDisableNormalMode && showCondition &&
+ !showedPrivateModeContextualFeatureRecommender) {
showedPrivateModeContextualFeatureRecommender = true
return true
}
@@ -1000,4 +1039,9 @@ class Settings(private val appContext: Context) : PreferencesHolder {
appContext.getPreferenceKey(R.string.pref_key_swipe_toolbar_switch_tabs),
default = true
)
+
+ var noscriptInstalled by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_noscript_installed),
+ default = false
+ )
}
diff --git a/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt b/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt
index 57a62160d449729fd392ebb6d03689dfe839cbde..8d2ea8a58283bfdb58e4f1e70093b6f9d0f22cb9 100644
--- a/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt
+++ b/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt
@@ -152,13 +152,13 @@ class SearchWidgetProvider : AppWidgetProvider() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setImageViewResource(
R.id.button_search_widget_new_tab_icon,
- R.drawable.ic_launcher_foreground)
+ R.mipmap.ic_launcher)
} else {
setImageViewBitmap(
R.id.button_search_widget_new_tab_icon,
AppCompatResources.getDrawable(
context,
- R.drawable.ic_launcher_foreground
+ R.mipmap.ic_launcher
)?.toBitmap())
}
}
diff --git a/app/src/main/res/drawable/connectoncropped.png b/app/src/main/res/drawable/connectoncropped.png
new file mode 100644
index 0000000000000000000000000000000000000000..efccd4377f067f5606d8baf49d582fced81614ed
Binary files /dev/null and b/app/src/main/res/drawable/connectoncropped.png differ
diff --git a/app/src/main/res/drawable/ic_favorite.xml b/app/src/main/res/drawable/ic_favorite.xml
new file mode 100644
index 0000000000000000000000000000000000000000..121817c6feb5d5ffeff16fa6aa9abcb6a04d9b0f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_favorite.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_illo.png b/app/src/main/res/drawable/ic_illo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e4efc872411aaa1562de2f7e448e04b74c6d3c4
Binary files /dev/null and b/app/src/main/res/drawable/ic_illo.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 8c5623c666a1932d8ba0a7261471bb1a0d2af703..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_onion_pattern.xml b/app/src/main/res/drawable/ic_onion_pattern.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3aa3b9493fa5e4ccd9bad6cd450fd36f11f9cbb4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_onion_pattern.xml
@@ -0,0 +1,806 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_screenshot.xml b/app/src/main/res/drawable/ic_screenshot.xml
new file mode 100644
index 0000000000000000000000000000000000000000..13b02088e392f6dfc0792cc463b5b457ff1c2ede
--- /dev/null
+++ b/app/src/main/res/drawable/ic_screenshot.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_tape.png b/app/src/main/res/drawable/ic_tape.png
new file mode 100644
index 0000000000000000000000000000000000000000..d481eef1b8790e9ede47ef3e0acffe7b187049d1
Binary files /dev/null and b/app/src/main/res/drawable/ic_tape.png differ
diff --git a/app/src/main/res/drawable/ic_tor_config_bridge.xml b/app/src/main/res/drawable/ic_tor_config_bridge.xml
new file mode 100644
index 0000000000000000000000000000000000000000..838a2d0085b936570b53315b83742a538ed8ef49
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tor_config_bridge.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml b/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe37ed73ef5d5afb3135a48f645aa0e40ea8fd9a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml
@@ -0,0 +1,506 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_tor_network_settings.xml b/app/src/main/res/drawable/ic_tor_network_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..31059730a7318218b590734b7bc7c0f660b908ba
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tor_network_settings.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/app/src/main/res/drawable/rounded_corners.xml b/app/src/main/res/drawable/rounded_corners.xml
new file mode 100644
index 0000000000000000000000000000000000000000..24af9e5666be92fa40ee1fc1090d484583cb7a58
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_corners.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/tor_bootstrap_background_gradient.xml b/app/src/main/res/drawable/tor_bootstrap_background_gradient.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0db58d29ce6019d73af520ad108d19702aecab29
--- /dev/null
+++ b/app/src/main/res/drawable/tor_bootstrap_background_gradient.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/tor_onboarding_donate_gradient.xml b/app/src/main/res/drawable/tor_onboarding_donate_gradient.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ca20bc39f40288402b97948389dae650bfdbde74
--- /dev/null
+++ b/app/src/main/res/drawable/tor_onboarding_donate_gradient.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/tor_onboarding_donate_rounded_corners.xml b/app/src/main/res/drawable/tor_onboarding_donate_rounded_corners.xml
new file mode 100644
index 0000000000000000000000000000000000000000..23be2591b999aaacd001de6a23c523eab02fecc8
--- /dev/null
+++ b/app/src/main/res/drawable/tor_onboarding_donate_rounded_corners.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/font/cousine.ttf b/app/src/main/res/font/cousine.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1980d62a49266dc4aa707bd84c018f684a7de1e4
Binary files /dev/null and b/app/src/main/res/font/cousine.ttf differ
diff --git a/app/src/main/res/font/terminal_grotesque.otf b/app/src/main/res/font/terminal_grotesque.otf
new file mode 100644
index 0000000000000000000000000000000000000000..41e3de66bd3f4ad0bd2b4428f99c615d4518fc12
Binary files /dev/null and b/app/src/main/res/font/terminal_grotesque.otf differ
diff --git a/app/src/main/res/font/white_on_black.ttf b/app/src/main/res/font/white_on_black.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..9db4d8b71e55705f02ae41b41e4f09321c14bcd1
Binary files /dev/null and b/app/src/main/res/font/white_on_black.ttf differ
diff --git a/app/src/main/res/layout/activity_migration.xml b/app/src/main/res/layout/activity_migration.xml
index 884af730c66258ffa534de36a7c0ac81f15f7f16..888dbf60133f0755aea33ba7b9723d4671338f9e 100644
--- a/app/src/main/res/layout/activity_migration.xml
+++ b/app/src/main/res/layout/activity_migration.xml
@@ -37,7 +37,7 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/migration_welcome_title"
app:layout_constraintTop_toTopOf="@+id/migration_welcome_title"
- app:srcCompat="@drawable/ic_firefox" />
+ app:srcCompat="@mipmap/ic_launcher" />
+
+
+ app:layout_constraintStart_toEndOf="@id/wordmark" />
+ tools:text="@string/tor_about_content" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/enable_switch" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/private_browsing_description.xml b/app/src/main/res/layout/private_browsing_description.xml
index d964945a04674d3b8c5e78e6a3c0b2794b753277..f7119eb94b1cf3b965009847000960a77cbef8ea 100644
--- a/app/src/main/res/layout/private_browsing_description.xml
+++ b/app/src/main/res/layout/private_browsing_description.xml
@@ -24,7 +24,7 @@
android:textColor="?primaryText"
android:textDirection="locale"
android:textSize="14sp"
- tools:text="@string/private_browsing_placeholder_description_2" />
+ tools:text="" />
diff --git a/app/src/main/res/layout/search_widget_extra_small_v1.xml b/app/src/main/res/layout/search_widget_extra_small_v1.xml
index c2e79e542ce37f39256bdb26a39df2fc97db6b4e..03df50e50b1197906d0b0a8c0e8f75f856ea1414 100644
--- a/app/src/main/res/layout/search_widget_extra_small_v1.xml
+++ b/app/src/main/res/layout/search_widget_extra_small_v1.xml
@@ -17,6 +17,6 @@
android:layout_gravity="center"
android:contentDescription="@string/search_widget_content_description"
android:scaleType="centerInside"
- tools:src="@drawable/ic_launcher_foreground" />
+ tools:src="@mipmap/ic_launcher"/>
diff --git a/app/src/main/res/layout/search_widget_extra_small_v2.xml b/app/src/main/res/layout/search_widget_extra_small_v2.xml
index 6719541066bc0e15fd16ede7b487052e939ac862..842526d73c0d514e97fb63d564af1f165bb29238 100644
--- a/app/src/main/res/layout/search_widget_extra_small_v2.xml
+++ b/app/src/main/res/layout/search_widget_extra_small_v2.xml
@@ -17,5 +17,5 @@
android:layout_gravity="center"
android:contentDescription="@string/search_widget_content_description"
android:scaleType="centerInside"
- tools:src="@drawable/ic_launcher_foreground" />
+ tools:src="@mipmap/ic_launcher" />
diff --git a/app/src/main/res/layout/tor_bootstrap_connect.xml b/app/src/main/res/layout/tor_bootstrap_connect.xml
new file mode 100644
index 0000000000000000000000000000000000000000..275ced464e8bbdefbf781cc37cbf892f3b6b0649
--- /dev/null
+++ b/app/src/main/res/layout/tor_bootstrap_connect.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/tor_bootstrap_logger.xml b/app/src/main/res/layout/tor_bootstrap_logger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6438676d184e9ea28f79c1183f43f5ccbf3c0c5a
--- /dev/null
+++ b/app/src/main/res/layout/tor_bootstrap_logger.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/tor_bootstrap_pager.xml b/app/src/main/res/layout/tor_bootstrap_pager.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b04ef760cc8ec85a0851ba6c05739ae413fc8e4c
--- /dev/null
+++ b/app/src/main/res/layout/tor_bootstrap_pager.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/tor_onboarding_donate.xml b/app/src/main/res/layout/tor_onboarding_donate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..186a3dd230cc1058629659299842d46c878c4715
--- /dev/null
+++ b/app/src/main/res/layout/tor_onboarding_donate.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/tor_onboarding_security_level.xml b/app/src/main/res/layout/tor_onboarding_security_level.xml
new file mode 100644
index 0000000000000000000000000000000000000000..853225c7622087a9ba50bd9f0e72b060dd45db52
--- /dev/null
+++ b/app/src/main/res/layout/tor_onboarding_security_level.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index be0fd11ac43d3567f79343f043d94b3afe4e8b36..0000000000000000000000000000000000000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private.xml
deleted file mode 100644
index a527ca92eba4e0956444c105b962228a87fbaffa..0000000000000000000000000000000000000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private_round.xml
deleted file mode 100644
index a527ca92eba4e0956444c105b962228a87fbaffa..0000000000000000000000000000000000000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_private_round.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index be0fd11ac43d3567f79343f043d94b3afe4e8b36..0000000000000000000000000000000000000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 57e35ae9c855ecdbc5083465c544f70ff21c0064..756d37856e1985e330c19c3a5f4f7c4ebc62dffd 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 33e7e6215668e6222850110a6bf1839a1786102e..756d37856e1985e330c19c3a5f4f7c4ebc62dffd 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 44255b50d99aeb9ce29f46a264b50456fb4916bc..03fe48da2707397144906272b6d2059f8f52a5c7 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 02264c22f386d69d2940db21c8053c2be37e808a..1288d3f106b0b89af180aa1f8d9890d12ed5ec5a 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index f88c4862a117980a27e164026ea6874fd106849b..d7d3f99c1d2c568ec399239310670733fcc5d7b8 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 9a6cf4ee5454a7acbe11c658c9d9ca497bffb21c..371127dc3f2e7de16a2f99899e70707919739f48 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -58,6 +58,9 @@
+
@@ -113,6 +116,9 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 1c34c476f0a8ae74fd0ea8c5986ad4f8c71edd3e..725d3841775a8a256e77763bd7233ae60e4455d9 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -29,6 +29,7 @@
+
diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml
index 0a88f97c51f6709c3862e589912a13f7dbe1a833..6c480aed07ed48e325881a5a60dc8cf85707a9f1 100644
--- a/app/src/main/res/values/preference_keys.xml
+++ b/app/src/main/res/values/preference_keys.xml
@@ -33,6 +33,7 @@
pref_key_delete_caches_nowpref_key_delete_permissions_nowpref_key_delete_browsing_data_on_quit_categories
+ pref_key_disable_normal_modepref_key_last_known_mode_privatepref_key_addonspref_key_override_amo_user
@@ -40,6 +41,7 @@
pref_key_last_maintenancepref_key_helppref_key_rate
+ pref_key_donatepref_key_feedbackpref_key_aboutpref_key_your_rights
@@ -237,4 +239,30 @@
pref_key_camera_permissions_neededpref_key_return_to_browser
+
+ pref_key_noscript_installed
+
+
+ pref_key_tor_security_level_settings
+ pref_key_tor_security_level_standard_option
+ pref_key_tor_security_level_safer_option
+ pref_key_tor_security_level_safest_option
+
+ pref_key_tor_network_settings
+ pref_key_tor_network_settings_explanation
+ pref_key_tor_network_settings_bridge_config
+ pref_key_tor_network_settings_bridge_config_explanation
+ pref_key_tor_network_settings_bridge_config_toggle
+ pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4
+ pref_key_tor_network_settings_bridge_config_builtin_bridge_meek_azure
+ pref_key_tor_network_settings_bridge_config_builtin_bridge_snowflake
+ pref_key_tor_network_settings_bridge_config_user_provided_bridge
+ pref_key_tor_network_settings_bridge_config_user_provided_bridge_preference
+ pref_key_tor_network_settings_bridge_config_current_bridge
+ pref_key_tor_network_settings_status
+ pref_key_tor_network_settings_tor_ready
+ pref_key_tor_network_settings_state
+ pref_key_tor_network_settings_bridges_enabled
+
+ pref_key_spoof_english
diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml
index 51c58369f0d5f741eb526c4f3b9ed80c39c3273c..160a9686affb5773009d1edc21d8a608324b3e19 100644
--- a/app/src/main/res/values/static_strings.xml
+++ b/app/src/main/res/values/static_strings.xml
@@ -4,7 +4,7 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
- Firefox Preview
+ Tor Browser DevLeakCanary
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index c9f3fff562d43a7737be2ec86ca2bb384f97129a..d2085a51298e1b8e63f7381596043a0cc27be156 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -251,6 +251,7 @@
@drawable/ic_logo_wordmark_private@drawable/private_home_background_gradient
+ @drawable/tor_bootstrap_background_gradient@drawable/private_home_bottom_bar_background_gradient@drawable/private_home_bottom_bar_background_gradient_top@color/primary_text_private_theme
@@ -266,6 +267,10 @@
+
+
+
+
+
+
+
+
+
+
+
+
+