diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 05:50:18 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 05:50:18 +0000 |
commit | 55a5d29a66503248916f249ad2a1d8b37cde5a03 (patch) | |
tree | a3beb6a90dd3bdaaf67ecb05d42152a494aff946 | |
parent | Adding upstream version 1.55.0+dfsg. (diff) | |
download | ublock-origin-upstream.tar.xz ublock-origin-upstream.zip |
Adding upstream version 1.57.0+dfsg.upstream/1.57.0+dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
296 files changed, 34946 insertions, 16237 deletions
diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..c888f4c --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,26 @@ +env: + browser: true + es2022: true +extends: eslint:recommended +parserOptions: + sourceType: module +rules: + eqeqeq: + - warn + - always + indent: + - error + - 4 + - ignoredNodes: + - Program > IfStatement > BlockStatement + - Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement + - CallExpression > MemberExpression + - ArrayExpression > Literal + no-control-regex: off + no-empty: off + sort-imports: warn + strict: warn +globals: + browser: readonly + chrome: readonly + vAPI: readonly diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ed4445a..5ce7af1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,7 +19,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: persist-credentials: false - name: Clone uAssets diff --git a/CHANGELOG.md b/CHANGELOG.md index ef76821..c5cfa18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,78 @@ ## Fixes / changes +- [Do not block large media resources when loaded as top-level document](https://github.com/gorhill/uBlock/commit/3919a16bb8) +- [Properly manage cache storage regarding managed user filters](https://github.com/gorhill/uBlock/commit/90ab1a76ab) +- [Improve `[trusted-]set-cookie` scriptlets](https://github.com/gorhill/uBlock/commit/11a48561e0) +- [Fixed Belgian and Nepali flags for Windows Chromium users](https://github.com/gorhill/uBlock/commit/499c80bd8a) (by @DandelionSprout) +- [Mind that `tabs.sendMessage` can throw](https://github.com/gorhill/uBlock/commit/3f7374c1f1) +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/9146134874) +- [Append wildcard character only when filter starts & ends with `/`](https://github.com/gorhill/uBlock/commit/1cb190e102) +- [Fix failure to create popup logger window sometimes](https://github.com/gorhill/uBlock/commit/c8762945d9) +- [Improve json-prune-related scriptlets](https://github.com/gorhill/uBlock/commit/e7a0f8c781) +- [Support maximizing editor to viewport size](https://github.com/gorhill/uBlock/commit/664dd95700) +- [Add advanced setting to force popup panel orientation](https://github.com/gorhill/uBlock/commit/0d77ccded7) +- [Add checkboxes to "My filters" pane](https://github.com/gorhill/uBlock/commit/46ea5519c1) +- [Assume UTF-8 when no encoding can be looked up](https://github.com/gorhill/uBlock/commit/63acdcbdeb) +- [Fix issue with "My filters" pane on mobile](https://github.com/gorhill/uBlock/commit/24d94e559d) +- [Support aborting "Pick" mode in element picker](https://github.com/gorhill/uBlock/commit/a557f62112) +- [Remove sections with no lists in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/0f4e50db07) +- [Add "Social widgets", "Cookie notices" sections in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/21a76e32a1) +- [No longer disable generic cosmetic filters by default on mobile](https://github.com/gorhill/uBlock/commit/7a768e7b1a) +- [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/603239970d) +- [Make asset updater compatible with non-persistent background page](https://github.com/gorhill/uBlock/commit/96704f2fda) +- [Move dragbar to the top of element picker dialog](https://github.com/gorhill/uBlock/commit/953c978d59) + - [Move "Quit" button to top bar in element picker](https://github.com/gorhill/uBlock/commit/6266c4718d) +- [Add advanced setting `requestStatsDisabled`](https://github.com/gorhill/uBlock/commit/e02ea69c86) +- [First lookup matching stock lists when importing URLs](https://github.com/gorhill/uBlock/commit/2b16a10b82) +- [Reset filter lists in worker when creating filters via "Block element"](https://github.com/gorhill/uBlock/commit/b0067b79d5) +- [Remove trusted-source requirement when using `badfilter`](https://github.com/gorhill/uBlock/commit/3c299b8632) +- [Redesign cache storage](https://github.com/gorhill/uBlock/commit/086766a924) +- [Don't match network filter-derived regexes against non-network URIs](https://github.com/gorhill/uBlock/commit/2262a129ec) +- [Remove obsolete trusted directives](https://github.com/gorhill/uBlock/commit/439a059cca) +- [Support logging details of calls to `json-prune-fetch-response`](https://github.com/gorhill/uBlock/commit/e527a8f9af) +- [Escape special whitespace characters in attribute values](https://github.com/gorhill/uBlock/commit/be3e366019) + +---------- + +# 1.56.0 + +## Fixes / changes + +- [Mind that multiple `uritransform` may apply to a single request](https://github.com/gorhill/uBlock/commit/2a5a444482) +- [Fix incorrect built-in filtering expression in logger](https://github.com/gorhill/uBlock/commit/9bff0c2f94) +- [Fix improper invalidation of valid `uritransform` exception filters](https://github.com/gorhill/uBlock/commit/21ec5a277c) +- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/b22b3d729b) +- [Fix Chartbeat flicker control `div`'s](https://github.com/gorhill/uBlock/commit/397d6d47b9) (by @ryanbr) +- [Fix potential exfiltration of browsing history by a rogue list author through `permissions=`](https://github.com/gorhill/uBlock/commit/7b138b58c6) +- [Ignore event handler-related attributes in `set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/3037ae5f04) (suggested by @distinctmondaylilac) +- [Fix potential exfiltration of browsing history by a rogue list author through `csp=`](https://github.com/gorhill/uBlock/commit/db5656f607) (reported by @distinctmondaylilac) +- [Output scriptlet logging information to the logger](https://github.com/gorhill/uBlock/commit/869a653fdf) +- [Fix decompiling of scriptlet parameters](https://github.com/gorhill/uBlock/commit/49dd68ef3d) +- [Add support for `extraMatch` in `trusted-click-element` scriptlet](https://github.com/gorhill/uBlock/commit/45e62c939f) +- [Remove minimum height constraint from "My filters" pane](https://github.com/gorhill/uBlock/commit/f624c835c2) +- [Unregister all scriptlets when disabling uBO on a specific site](https://github.com/gorhill/uBlock/commit/13dcd844a7) +- [Allow `uritransform` to process the hash part of a URL](https://github.com/gorhill/uBlock/commit/b19094339f) +- [Remember presentation state of "My rules" pane](https://github.com/gorhill/uBlock/commit/3d1b100646) +- [Fix improperly assembled `!#include` sublists](https://github.com/gorhill/uBlock/commit/0e00010b91) +- [Mark procedural filters with pseudo-elements selector as invalid](https://github.com/gorhill/uBlock/commit/757b8be9cd) +- [Prevent access to picker when "My filters" is not enabled](https://github.com/gorhill/uBlock/commit/bc641fc024) +- [Provide visual feedback when applying changes in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/c4bb8a0f64) +- [Empty query parameters must still use `=`](https://github.com/gorhill/uBlock/commit/1cac61a9a4) +- [Add support to toggle no-scripting switch with keyboard shortcut](https://github.com/gorhill/uBlock/commit/936444883f) +- [Do not exceed rate-limited calls to `handlerBehaviorChanged()`](https://github.com/gorhill/uBlock/commit/63fe18a761) +- [Shield some code paths against potentially tampered global properties](https://github.com/gorhill/uBlock/commit/534d877e95) (in scriptlets) +- [Do not prevent applying changes when lists are updating](https://github.com/gorhill/uBlock/commit/f6b726136c) +- [Add `elements` vararg to `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/060f9d68fc) +- [Do not use tab character as field separator](https://github.com/gorhill/uBlock/commit/a9eb9630cf) (in logger) +- [Prevent `:others()` from hiding `html` tag](https://github.com/gorhill/uBlock/commit/9a104bcbd2) + +---------- + +# 1.55.0 + +## Fixes / changes + +- [Discard repeating adjacent entries in the logger](https://github.com/gorhill/uBlock/commit/55e4cee6e8) - [Mind drop events in filter expression field of logger](https://github.com/gorhill/uBlock/commit/c8b7d1a526) - [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/d7063a052f) - [Fix message entries overflowing in logger](https://github.com/gorhill/uBlock/commit/49c8310e22) @@ -1,7 +1,7 @@ # https://stackoverflow.com/a/6273809 run_options := $(filter-out $@,$(MAKECMDGOALS)) -.PHONY: all clean test lint chromium opera firefox npm dig mv3 mv3-quick \ +.PHONY: all clean cleanassets test lint chromium opera firefox npm dig mv3 mv3-quick \ compare maxcost medcost mincost modifiers record wasm sources := $(wildcard assets/* assets/*/* dist/version src/* src/*/* src/*/*/* src/*/*/*/*) @@ -73,6 +73,8 @@ dist/build/uAssets: clean: rm -rf dist/build tmp/node_modules +cleanassets: + rm -rf dist/build/mv3-data dist/build/uAssets # Not real targets, just convenient for auto-completion at shell prompt compare: diff --git a/assets/assets.dev.json b/assets/assets.dev.json index 129cc75..94e1b8c 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -125,7 +125,7 @@ "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt", "https://ublockorigin.pages.dev/filters/quick-fixes.min.txt", "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt?dev=1" + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, @@ -155,10 +155,10 @@ "group": "ads", "title": "EasyList", "tags": "ads", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt", - "assets/thirdparties/easylist/easylist.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt" + "assets/thirdparties/easylist/easylist.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist.txt", @@ -206,10 +206,10 @@ "group": "privacy", "title": "EasyPrivacy", "tags": "privacy", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt", - "assets/thirdparties/easylist/easyprivacy.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt" + "assets/thirdparties/easylist/easyprivacy.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easyprivacy.txt", @@ -246,21 +246,11 @@ ], "supportURL": "https://gitlab.com/malware-filter/phishing-filter#phishing-url-blocklist" }, - "adguard-social": { - "content": "filters", - "group": "annoyances", - "parent": "AdGuard – Annoyances", - "off": true, - "title": "AdGuard – Social Media", - "tags": "annoyances social", - "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" - }, "adguard-cookies": { "content": "filters", "group": "annoyances", - "parent": "AdGuard – Annoyances|AdGuard/uBO – Cookie Notices", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", "off": true, "title": "AdGuard – Cookie Notices", "tags": "annoyances cookies", @@ -271,10 +261,51 @@ "ublock-cookies-adguard": { "content": "filters", "group": "annoyances", - "parent": "AdGuard – Annoyances|AdGuard/uBO – Cookie Notices", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "fanboy-cookiemonster": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", + "off": true, + "title": "EasyList – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "ublock-cookies-easylist": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", "off": true, "title": "uBlock filters – Cookie Notices", "tags": "annoyances cookies", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", @@ -284,6 +315,50 @@ ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, + "adguard-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "AdGuard – Social Widgets", + "tags": "annoyances social", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", + "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + }, + "fanboy-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "EasyList – Social Widgets", + "tags": "annoyances social", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "supportURL": "https://easylist.to/" + }, + "fanboy-thirdparty_social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "off": true, + "title": "Fanboy – Anti-Facebook", + "tags": "privacy", + "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", + "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" + }, "adguard-popup-overlays": { "content": "filters", "group": "annoyances", @@ -328,15 +403,6 @@ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" }, - "fanboy-thirdparty_social": { - "content": "filters", - "group": "annoyances", - "off": true, - "title": "Fanboy – Anti-Facebook", - "tags": "privacy", - "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", - "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" - }, "easylist-annoyances": { "content": "filters", "group": "annoyances", @@ -344,6 +410,7 @@ "off": true, "title": "EasyList – Other Annoyances", "tags": "annoyances", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-annoyances.txt", @@ -360,6 +427,7 @@ "off": true, "title": "EasyList – Chat Widgets", "tags": "annoyances", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-chat.txt", @@ -369,42 +437,6 @@ ], "supportURL": "https://github.com/easylist/easylist#fanboy-lists" }, - "fanboy-cookiemonster": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances|EasyList/uBO – Cookie Notices", - "off": true, - "title": "EasyList – Cookie Notices", - "tags": "annoyances cookies", - "contentURL": [ - "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", - "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" - ], - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", - "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", - "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" - ], - "supportURL": "https://github.com/easylist/easylist#fanboy-lists" - }, - "ublock-cookies-easylist": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances|EasyList/uBO – Cookie Notices", - "off": true, - "title": "uBlock filters – Cookie Notices", - "tags": "annoyances cookies", - "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", - "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" - ], - "supportURL": "https://github.com/uBlockOrigin/uAssets" - }, "easylist-newsletters": { "content": "filters", "group": "annoyances", @@ -412,6 +444,7 @@ "off": true, "title": "EasyList – Newsletter Notices", "tags": "annoyances", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt" ], @@ -430,6 +463,7 @@ "off": true, "title": "EasyList – Notifications", "tags": "annoyances", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist-notifications.txt" ], @@ -441,26 +475,6 @@ ], "supportURL": "https://easylist.to/" }, - "fanboy-social": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances", - "off": true, - "title": "EasyList – Social Widgets", - "tags": "annoyances social", - "contentURL": [ - "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", - "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" - ], - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", - "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", - "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" - ], - "supportURL": "https://easylist.to/" - }, "ublock-annoyances": { "content": "filters", "group": "annoyances", @@ -492,6 +506,7 @@ "updateAfter": 13, "title": "Peter Lowe’s Ad and tracking server list", "tags": "ads privacy security", + "preferred": true, "contentURL": [ "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext", "assets/thirdparties/pgl.yoyo.org/as/serverlist.txt", @@ -651,8 +666,7 @@ "lang": "fa ps tg", "contentURL": [ "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt", - "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt", - "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt" + "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/MasterKia/PersianBlocker@main/PersianBlocker.txt", @@ -866,6 +880,10 @@ "tags": "ads swedish svenska", "lang": "sv", "contentURL": "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt", + "cdnURLs": [ + "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/swefilter/swefilter.min.txt", + "https://cdn.jsdelivr.net/gh/lassekongo83/Frellwits-filter-lists@swefilter/swefilter.min.txt" + ], "supportURL": "https://github.com/lassekongo83/Frellwits-filter-lists" }, "THA-0": { diff --git a/assets/assets.json b/assets/assets.json index 7773314..50131ec 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -124,7 +124,8 @@ "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt", "https://ublockorigin.pages.dev/filters/quick-fixes.min.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt" + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, @@ -154,16 +155,15 @@ "group": "ads", "title": "EasyList", "tags": "ads", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt", - "assets/thirdparties/easylist/easylist.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt" + "assets/thirdparties/easylist/easylist.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt", - "https://ublockorigin.pages.dev/thirdparties/easylist.txt", - "https://easylist.to/easylist/easylist.txt" + "https://ublockorigin.pages.dev/thirdparties/easylist.txt" ], "supportURL": "https://easylist.to/" }, @@ -206,16 +206,15 @@ "group": "privacy", "title": "EasyPrivacy", "tags": "privacy", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt", - "assets/thirdparties/easylist/easyprivacy.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt" + "assets/thirdparties/easylist/easyprivacy.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easyprivacy.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt", - "https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt", - "https://easylist.to/easylist/easyprivacy.txt" + "https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt" ], "supportURL": "https://easylist.to/" }, @@ -247,21 +246,11 @@ ], "supportURL": "https://gitlab.com/malware-filter/phishing-filter#phishing-url-blocklist" }, - "adguard-social": { - "content": "filters", - "group": "annoyances", - "parent": "AdGuard – Annoyances", - "off": true, - "title": "AdGuard – Social Media", - "tags": "annoyances social", - "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" - }, "adguard-cookies": { "content": "filters", "group": "annoyances", - "parent": "AdGuard – Annoyances|AdGuard/uBO – Cookie Notices", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", "off": true, "title": "AdGuard – Cookie Notices", "tags": "annoyances cookies", @@ -272,10 +261,51 @@ "ublock-cookies-adguard": { "content": "filters", "group": "annoyances", - "parent": "AdGuard – Annoyances|AdGuard/uBO – Cookie Notices", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "fanboy-cookiemonster": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", + "off": true, + "title": "EasyList – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "ublock-cookies-easylist": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", "off": true, "title": "uBlock filters – Cookie Notices", "tags": "annoyances cookies", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", @@ -285,6 +315,50 @@ ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, + "adguard-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "AdGuard – Social Widgets", + "tags": "annoyances social", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", + "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + }, + "fanboy-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "EasyList – Social Widgets", + "tags": "annoyances social", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "supportURL": "https://easylist.to/" + }, + "fanboy-thirdparty_social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "off": true, + "title": "Fanboy – Anti-Facebook", + "tags": "privacy", + "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", + "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" + }, "adguard-popup-overlays": { "content": "filters", "group": "annoyances", @@ -329,15 +403,6 @@ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" }, - "fanboy-thirdparty_social": { - "content": "filters", - "group": "annoyances", - "off": true, - "title": "Fanboy – Anti-Facebook", - "tags": "privacy", - "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", - "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" - }, "easylist-annoyances": { "content": "filters", "group": "annoyances", @@ -345,6 +410,7 @@ "off": true, "title": "EasyList – Other Annoyances", "tags": "annoyances", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-annoyances.txt", @@ -361,6 +427,7 @@ "off": true, "title": "EasyList – Chat Widgets", "tags": "annoyances", + "preferred": true, "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-chat.txt", @@ -370,42 +437,6 @@ ], "supportURL": "https://github.com/easylist/easylist#fanboy-lists" }, - "fanboy-cookiemonster": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances|EasyList/uBO – Cookie Notices", - "off": true, - "title": "EasyList – Cookie Notices", - "tags": "annoyances cookies", - "contentURL": [ - "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", - "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" - ], - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", - "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", - "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" - ], - "supportURL": "https://github.com/easylist/easylist#fanboy-lists" - }, - "ublock-cookies-easylist": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances|EasyList/uBO – Cookie Notices", - "off": true, - "title": "uBlock filters – Cookie Notices", - "tags": "annoyances cookies", - "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", - "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" - ], - "supportURL": "https://github.com/uBlockOrigin/uAssets" - }, "easylist-newsletters": { "content": "filters", "group": "annoyances", @@ -413,6 +444,7 @@ "off": true, "title": "EasyList – Newsletter Notices", "tags": "annoyances", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt" ], @@ -431,6 +463,7 @@ "off": true, "title": "EasyList – Notifications", "tags": "annoyances", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist-notifications.txt" ], @@ -442,26 +475,6 @@ ], "supportURL": "https://easylist.to/" }, - "fanboy-social": { - "content": "filters", - "group": "annoyances", - "parent": "EasyList – Annoyances", - "off": true, - "title": "EasyList – Social Widgets", - "tags": "annoyances social", - "contentURL": [ - "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", - "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" - ], - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", - "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", - "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" - ], - "supportURL": "https://easylist.to/" - }, "ublock-annoyances": { "content": "filters", "group": "annoyances", @@ -493,6 +506,7 @@ "updateAfter": 13, "title": "Peter Lowe’s Ad and tracking server list", "tags": "ads privacy security", + "preferred": true, "contentURL": [ "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext", "assets/thirdparties/pgl.yoyo.org/as/serverlist.txt", @@ -652,8 +666,7 @@ "lang": "fa ps tg", "contentURL": [ "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt", - "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt", - "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt" + "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" ], "cdnURLs": [ "https://cdn.jsdelivr.net/gh/MasterKia/PersianBlocker@main/PersianBlocker.txt", @@ -867,6 +880,10 @@ "tags": "ads swedish svenska", "lang": "sv", "contentURL": "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt", + "cdnURLs": [ + "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/swefilter/swefilter.min.txt", + "https://cdn.jsdelivr.net/gh/lassekongo83/Frellwits-filter-lists@swefilter/swefilter.min.txt" + ], "supportURL": "https://github.com/lassekongo83/Frellwits-filter-lists" }, "THA-0": { diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 6e2654f..bbef272 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -22,11 +22,11 @@ web page context. */ +/* eslint no-prototype-builtins: 0 */ + // Externally added to the private namespace in which scriptlets execute. /* global scriptletGlobals */ -'use strict'; - export const builtinScriptlets = []; /******************************************************************************* @@ -42,8 +42,8 @@ builtinScriptlets.push({ fn: safeSelf, }); function safeSelf() { - if ( scriptletGlobals.has('safeSelf') ) { - return scriptletGlobals.get('safeSelf'); + if ( scriptletGlobals.safeSelf ) { + return scriptletGlobals.safeSelf; } const self = globalThis; const safe = { @@ -55,7 +55,10 @@ function safeSelf() { 'Math_max': Math.max, 'Math_min': Math.min, 'Math_random': Math.random, + 'Object': Object, 'Object_defineProperty': Object.defineProperty.bind(Object), + 'Object_fromEntries': Object.fromEntries.bind(Object), + 'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object), 'RegExp': self.RegExp, 'RegExp_test': self.RegExp.prototype.test, 'RegExp_exec': self.RegExp.prototype.exec, @@ -70,11 +73,25 @@ function safeSelf() { 'JSON_parse': (...args) => safe.JSON_parseFn.call(safe.JSON, ...args), 'JSON_stringify': (...args) => safe.JSON_stringifyFn.call(safe.JSON, ...args), 'log': console.log.bind(console), + // Properties + logLevel: 0, + // Methods + makeLogPrefix(...args) { + return this.sendToLogger && `[${args.join(' \u205D ')}]` || ''; + }, uboLog(...args) { - if ( scriptletGlobals.has('canDebug') === false ) { return; } - if ( args.length === 0 ) { return; } - if ( `${args[0]}` === '' ) { return; } - this.log('[uBO]', ...args); + if ( this.sendToLogger === undefined ) { return; } + if ( args === undefined || args[0] === '' ) { return; } + return this.sendToLogger('info', ...args); + + }, + uboErr(...args) { + if ( this.sendToLogger === undefined ) { return; } + if ( args === undefined || args[0] === '' ) { return; } + return this.sendToLogger('error', ...args); + }, + escapeRegexChars(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }, initPattern(pattern, options = {}) { if ( pattern === '' ) { @@ -96,8 +113,7 @@ function safeSelf() { } if ( options.flags !== undefined ) { return { - re: new this.RegExp(pattern.replace( - /[.*+?^${}()|[\]\\]/g, '\\$&'), + re: new this.RegExp(this.escapeRegexChars(pattern), options.flags ), expect, @@ -116,7 +132,7 @@ function safeSelf() { if ( pattern === '' ) { return /^/; } const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern); if ( match === null ) { - const reStr = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const reStr = this.escapeRegexChars(pattern); return new RegExp(verbatim ? `^${reStr}$` : reStr, flags); } try { @@ -137,10 +153,42 @@ function safeSelf() { } return out; }, []); - return Object.fromEntries(entries); + return this.Object_fromEntries(entries); }, }; - scriptletGlobals.set('safeSelf', safe); + scriptletGlobals.safeSelf = safe; + if ( scriptletGlobals.bcSecret === undefined ) { return safe; } + // This is executed only when the logger is opened + const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); + let bcBuffer = []; + safe.logLevel = scriptletGlobals.logLevel || 1; + safe.sendToLogger = (type, ...args) => { + if ( args.length === 0 ) { return; } + const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; + if ( bcBuffer === undefined ) { + return bc.postMessage({ what: 'messageToLogger', type, text }); + } + bcBuffer.push({ type, text }); + }; + bc.onmessage = ev => { + const msg = ev.data; + switch ( msg ) { + case 'iamready!': + if ( bcBuffer === undefined ) { break; } + bcBuffer.forEach(({ type, text }) => + bc.postMessage({ what: 'messageToLogger', type, text }) + ); + bcBuffer = undefined; + break; + case 'setScriptletLogLevelToOne': + safe.logLevel = 1; + break; + case 'setScriptletLogLevelToTwo': + safe.logLevel = 2; + break; + } + }; + bc.postMessage('areyouready?'); return safe; } @@ -176,18 +224,7 @@ builtinScriptlets.push({ }); function shouldDebug(details) { if ( details instanceof Object === false ) { return false; } - return scriptletGlobals.has('canDebug') && details.debug; -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'should-log.fn', - fn: shouldLog, -}); -function shouldLog(details) { - if ( details instanceof Object === false ) { return false; } - return scriptletGlobals.has('canDebug') && details.log; + return scriptletGlobals.canDebug && details.debug; } /******************************************************************************/ @@ -292,12 +329,12 @@ function generateContentFn(directive) { return Promise.resolve(randomize(len | 0)); } } - if ( directive.startsWith('war:') && scriptletGlobals.has('warOrigin') ) { + if ( directive.startsWith('war:') && scriptletGlobals.warOrigin ) { return new Promise(resolve => { - const warOrigin = scriptletGlobals.get('warOrigin'); + const warOrigin = scriptletGlobals.warOrigin; const warName = directive.slice(4); const fullpath = [ warOrigin, '/', warName ]; - const warSecret = scriptletGlobals.get('warSecret'); + const warSecret = scriptletGlobals.warSecret; if ( warSecret !== undefined ) { fullpath.push('?secret=', warSecret); } @@ -322,7 +359,6 @@ builtinScriptlets.push({ 'get-exception-token.fn', 'safe-self.fn', 'should-debug.fn', - 'should-log.fn', ], }); // Issues to mind before changing anything: @@ -335,6 +371,7 @@ function abortCurrentScriptCore( if ( typeof target !== 'string' ) { return; } if ( target === '' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('abort-current-script', target, needle, context); const reNeedle = safe.patternToRegex(needle); const reContext = safe.patternToRegex(context); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); @@ -358,7 +395,6 @@ function abortCurrentScriptCore( value = owner[prop]; desc = undefined; } - const log = shouldLog(extraArgs); const debug = shouldDebug(extraArgs); const exceptionToken = getExceptionToken(); const scriptTexts = new WeakMap(); @@ -388,20 +424,29 @@ function abortCurrentScriptCore( if ( e instanceof HTMLScriptElement === false ) { return; } if ( e === thisScript ) { return; } if ( context !== '' && reContext.test(e.src) === false ) { - if ( debug === 'nomatch' || debug === 'all' ) { debugger; } // jshint ignore: line + // eslint-disable-next-line no-debugger + if ( debug === 'nomatch' || debug === 'all' ) { debugger; } return; } - if ( log && e.src !== '' ) { safe.uboLog(`matched src: ${e.src}`); } + if ( safe.logLevel > 1 && context !== '' ) { + safe.uboLog(logPrefix, `Matched src\n${e.src}`); + } const scriptText = getScriptText(e); if ( reNeedle.test(scriptText) === false ) { - if ( debug === 'nomatch' || debug === 'all' ) { debugger; } // jshint ignore: line + // eslint-disable-next-line no-debugger + if ( debug === 'nomatch' || debug === 'all' ) { debugger; } return; } - if ( log ) { safe.uboLog(`matched script text: ${scriptText}`); } - if ( debug === 'match' || debug === 'all' ) { debugger; } // jshint ignore: line + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Matched text\n${scriptText}`); + } + // eslint-disable-next-line no-debugger + if ( debug === 'match' || debug === 'all' ) { debugger; } + safe.uboLog(logPrefix, 'Aborted'); throw new ReferenceError(exceptionToken); }; - if ( debug === 'install' ) { debugger; } // jshint ignore: line + // eslint-disable-next-line no-debugger + if ( debug === 'install' ) { debugger; } try { Object.defineProperty(owner, prop, { get: function() { @@ -420,40 +465,97 @@ function abortCurrentScriptCore( } }); } catch(ex) { - if ( log ) { safe.uboLog(ex); } + safe.uboErr(logPrefix, `Error: ${ex}`); } } /******************************************************************************/ builtinScriptlets.push({ - name: 'set-constant-core.fn', - fn: setConstantCore, + name: 'validate-constant.fn', + fn: validateConstantFn, dependencies: [ - 'run-at.fn', 'safe-self.fn', ], }); +function validateConstantFn(trusted, raw) { + const safe = safeSelf(); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + let value; + if ( raw === 'undefined' ) { + value = undefined; + } else if ( raw === 'false' ) { + value = false; + } else if ( raw === 'true' ) { + value = true; + } else if ( raw === 'null' ) { + value = null; + } else if ( raw === "''" || raw === '' ) { + value = ''; + } else if ( raw === '[]' || raw === 'emptyArr' ) { + value = []; + } else if ( raw === '{}' || raw === 'emptyObj' ) { + value = {}; + } else if ( raw === 'noopFunc' ) { + value = function(){}; + } else if ( raw === 'trueFunc' ) { + value = function(){ return true; }; + } else if ( raw === 'falseFunc' ) { + value = function(){ return false; }; + } else if ( /^-?\d+$/.test(raw) ) { + value = parseInt(raw); + if ( isNaN(raw) ) { return; } + if ( Math.abs(raw) > 0x7FFF ) { return; } + } else if ( trusted ) { + if ( raw.startsWith('{') && raw.endsWith('}') ) { + try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } + } + } else { + return; + } + if ( extraArgs.as !== undefined ) { + if ( extraArgs.as === 'function' ) { + return ( ) => value; + } else if ( extraArgs.as === 'callback' ) { + return ( ) => (( ) => value); + } else if ( extraArgs.as === 'resolved' ) { + return Promise.resolve(value); + } else if ( extraArgs.as === 'rejected' ) { + return Promise.reject(value); + } + } + return value; +} + +/******************************************************************************/ -function setConstantCore( +builtinScriptlets.push({ + name: 'set-constant.fn', + fn: setConstantFn, + dependencies: [ + 'run-at.fn', + 'safe-self.fn', + 'validate-constant.fn', + ], +}); +function setConstantFn( trusted = false, chain = '', - cValue = '' + rawValue = '' ) { if ( chain === '' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-constant', chain, rawValue); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - function setConstant(chain, cValue) { + function setConstant(chain, rawValue) { const trappedProp = (( ) => { const pos = chain.lastIndexOf('.'); if ( pos === -1 ) { return chain; } return chain.slice(pos+1); })(); - if ( trappedProp === '' ) { return; } - const thisScript = document.currentScript; const cloakFunc = fn => { safe.Object_defineProperty(fn, 'name', { value: trappedProp }); - const proxy = new Proxy(fn, { + return new Proxy(fn, { defineProperty(target, prop) { if ( prop !== 'toString' ) { return Reflect.defineProperty(...arguments); @@ -475,50 +577,12 @@ function setConstantCore( return Reflect.get(...arguments); }, }); - return proxy; }; - if ( cValue === 'undefined' ) { - cValue = undefined; - } else if ( cValue === 'false' ) { - cValue = false; - } else if ( cValue === 'true' ) { - cValue = true; - } else if ( cValue === 'null' ) { - cValue = null; - } else if ( cValue === "''" || cValue === '' ) { - cValue = ''; - } else if ( cValue === '[]' || cValue === 'emptyArr' ) { - cValue = []; - } else if ( cValue === '{}' || cValue === 'emptyObj' ) { - cValue = {}; - } else if ( cValue === 'noopFunc' ) { - cValue = cloakFunc(function(){}); - } else if ( cValue === 'trueFunc' ) { - cValue = cloakFunc(function(){ return true; }); - } else if ( cValue === 'falseFunc' ) { - cValue = cloakFunc(function(){ return false; }); - } else if ( /^-?\d+$/.test(cValue) ) { - cValue = parseInt(cValue); - if ( isNaN(cValue) ) { return; } - if ( Math.abs(cValue) > 0x7FFF ) { return; } - } else if ( trusted ) { - if ( cValue.startsWith('{') && cValue.endsWith('}') ) { - try { cValue = safe.JSON_parse(cValue).value; } catch(ex) { return; } - } - } else { - return; - } - if ( extraArgs.as !== undefined ) { - const value = cValue; - if ( extraArgs.as === 'function' ) { - cValue = ( ) => value; - } else if ( extraArgs.as === 'callback' ) { - cValue = ( ) => (( ) => value); - } else if ( extraArgs.as === 'resolved' ) { - cValue = Promise.resolve(value); - } else if ( extraArgs.as === 'rejected' ) { - cValue = Promise.reject(value); - } + if ( trappedProp === '' ) { return; } + const thisScript = document.currentScript; + let normalValue = validateConstantFn(trusted, rawValue); + if ( rawValue === 'noopFunc' || rawValue === 'trueFunc' || rawValue === 'falseFunc' ) { + normalValue = cloakFunc(normalValue); } let aborted = false; const mustAbort = function(v) { @@ -526,18 +590,21 @@ function setConstantCore( if ( aborted ) { return true; } aborted = (v !== undefined && v !== null) && - (cValue !== undefined && cValue !== null) && - (typeof v !== typeof cValue); + (normalValue !== undefined && normalValue !== null) && + (typeof v !== typeof normalValue); + if ( aborted ) { + safe.uboLog(logPrefix, `Aborted because value set to ${v}`); + } return aborted; }; // https://github.com/uBlockOrigin/uBlock-issues/issues/156 // Support multiple trappers for the same property. const trapProp = function(owner, prop, configurable, handler) { - if ( handler.init(configurable ? owner[prop] : cValue) === false ) { return; } - const odesc = Object.getOwnPropertyDescriptor(owner, prop); + if ( handler.init(configurable ? owner[prop] : normalValue) === false ) { return; } + const odesc = safe.Object_getOwnPropertyDescriptor(owner, prop); let prevGetter, prevSetter; - if ( odesc instanceof Object ) { - owner[prop] = cValue; + if ( odesc instanceof safe.Object ) { + owner[prop] = normalValue; if ( odesc.get instanceof Function ) { prevGetter = odesc.get; } @@ -552,7 +619,7 @@ function setConstantCore( if ( prevGetter !== undefined ) { prevGetter(); } - return handler.getter(); // cValue + return handler.getter(); }, set(a) { if ( prevSetter !== undefined ) { @@ -561,7 +628,9 @@ function setConstantCore( handler.setter(a); } }); + safe.uboLog(logPrefix, 'Trap installed'); } catch(ex) { + safe.uboErr(logPrefix, ex); } }; const trapChain = function(owner, chain) { @@ -575,13 +644,15 @@ function setConstantCore( return true; }, getter: function() { - return document.currentScript === thisScript - ? this.v - : cValue; + if ( document.currentScript === thisScript ) { + return this.v; + } + safe.uboLog(logPrefix, 'Property read'); + return normalValue; }, setter: function(a) { if ( mustAbort(a) === false ) { return; } - cValue = a; + normalValue = a; } }); return; @@ -589,7 +660,7 @@ function setConstantCore( const prop = chain.slice(0, pos); const v = owner[prop]; chain = chain.slice(pos + 1); - if ( v instanceof Object || typeof v === 'object' && v !== null ) { + if ( v instanceof safe.Object || typeof v === 'object' && v !== null ) { trapChain(v, chain); return; } @@ -604,7 +675,7 @@ function setConstantCore( }, setter: function(a) { this.v = a; - if ( a instanceof Object ) { + if ( a instanceof safe.Object ) { trapChain(a, chain); } } @@ -613,7 +684,7 @@ function setConstantCore( trapChain(window, chain); } runAt(( ) => { - setConstant(chain, cValue); + setConstant(chain, rawValue); }, extraArgs.runAt); } @@ -633,18 +704,18 @@ function replaceNodeTextFn( replacement = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('replace-node-text.fn', ...Array.from(arguments)); const reNodeName = safe.patternToRegex(nodeName, 'i', true); const rePattern = safe.patternToRegex(pattern, 'gms'); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const shouldLog = scriptletGlobals.has('canDebug') && extraArgs.log || 0; const reCondition = safe.patternToRegex(extraArgs.condition || '', 'ms'); const stop = (takeRecord = true) => { if ( takeRecord ) { handleMutations(observer.takeRecords()); } observer.disconnect(); - if ( shouldLog !== 0 ) { - safe.uboLog(`replace-node-text-core.fn: quitting "${pattern}" => "${replacement}"`); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, 'Quitting'); } }; let sedCount = extraArgs.sedCount || 0; @@ -659,10 +730,10 @@ function replaceNodeTextFn( ? before.replace(rePattern, replacement) : replacement; node.textContent = after; - if ( shouldLog !== 0 ) { - safe.uboLog('replace-node-text.fn before:\n', before); - safe.uboLog('replace-node-text.fn after:\n', after); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Text before:\n${before.trim()}`); } + safe.uboLog(logPrefix, `Text after:\n${after.trim()}`); return sedCount === 0 || (sedCount -= 1) !== 0; }; const handleMutations = mutations => { @@ -690,9 +761,7 @@ function replaceNodeTextFn( if ( handleNode(node) ) { continue; } stop(); break; } - if ( shouldLog !== 0 ) { - safe.uboLog(`replace-node-text-core.fn ${count} nodes present before installing mutation observer`); - } + safe.uboLog(logPrefix, `${count} nodes present before installing mutation observer`); } if ( extraArgs.stay ) { return; } runAt(( ) => { @@ -713,8 +782,6 @@ builtinScriptlets.push({ dependencies: [ 'matches-stack-trace.fn', 'object-find-owner.fn', - 'safe-self.fn', - 'should-log.fn', ], }); // When no "prune paths" argument is provided, the scriptlet is @@ -731,15 +798,12 @@ function objectPruneFn( extraArgs = {} ) { if ( typeof rawPrunePaths !== 'string' ) { return; } - const safe = safeSelf(); const prunePaths = rawPrunePaths !== '' ? rawPrunePaths.split(/ +/) : []; const needlePaths = prunePaths.length !== 0 && rawNeedlePaths !== '' ? rawNeedlePaths.split(/ +/) : []; - const logLevel = shouldLog({ log: rawPrunePaths === '' || extraArgs.log }); - const reLogNeedle = safe.patternToRegex(logLevel === true ? rawNeedlePaths : ''); if ( stackNeedleDetails.matchAll !== true ) { if ( matchesStackTrace(stackNeedleDetails, extraArgs.logstack) === false ) { return; @@ -754,14 +818,6 @@ function objectPruneFn( } return true; }; - objectPruneFn.logJson = (json, msg, reNeedle) => { - if ( reNeedle.test(json) === false ) { return; } - safeSelf().uboLog(`objectPrune()`, msg, location.hostname, json); - }; - } - const jsonBefore = logLevel ? safe.JSON_stringify(obj, null, 2) : ''; - if ( logLevel === true || logLevel === 'all' ) { - objectPruneFn.logJson(jsonBefore, `prune:"${rawPrunePaths}" log:"${logLevel}"`, reLogNeedle); } if ( prunePaths.length === 0 ) { return; } let outcome = 'nomatch'; @@ -772,9 +828,6 @@ function objectPruneFn( } } } - if ( logLevel === outcome ) { - objectPruneFn.logJson(jsonBefore, `prune:"${rawPrunePaths}" log:"${logLevel}"`, reLogNeedle); - } if ( outcome === 'match' ) { return obj; } } @@ -812,14 +865,33 @@ function objectFindOwnerFn( return modified; } const prop = chain.slice(0, pos); + const next = chain.slice(pos + 1); + let found = false; + if ( prop === '[-]' && Array.isArray(owner) ) { + let i = owner.length; + while ( i-- ) { + if ( objectFindOwnerFn(owner[i], next) === false ) { continue; } + owner.splice(i, 1); + found = true; + } + return found; + } + if ( prop === '{-}' && owner instanceof Object ) { + for ( const key of Object.keys(owner) ) { + if ( objectFindOwnerFn(owner[key], next) === false ) { continue; } + delete owner[key]; + found = true; + } + return found; + } if ( prop === '[]' && Array.isArray(owner) || + prop === '{}' && owner instanceof Object || prop === '*' && owner instanceof Object ) { - const next = chain.slice(pos + 1); - let found = false; for ( const key of Object.keys(owner) ) { - found = objectFindOwnerFn(owner[key], next, prune) || found; + if (objectFindOwnerFn(owner[key], next, prune) === false ) { continue; } + found = true; } return found; } @@ -827,7 +899,57 @@ function objectFindOwnerFn( owner = owner[prop]; chain = chain.slice(pos + 1); } - return true; +} + +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'get-all-cookies.fn', + fn: getAllCookiesFn, +}); +function getAllCookiesFn() { + return document.cookie.split(/\s*;\s*/).map(s => { + const pos = s.indexOf('='); + if ( pos === 0 ) { return; } + if ( pos === -1 ) { return `${s.trim()}=`; } + const key = s.slice(0, pos).trim(); + const value = s.slice(pos+1).trim(); + return { key, value }; + }).filter(s => s !== undefined); +} + +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'get-all-local-storage.fn', + fn: getAllLocalStorageFn, +}); +function getAllLocalStorageFn(which = 'localStorage') { + const storage = self[which]; + const out = []; + for ( let i = 0; i < storage.length; i++ ) { + const key = storage.key(i); + const value = storage.getItem(key); + return { key, value }; + } + return out; +} + +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'get-cookie.fn', + fn: getCookieFn, +}); +function getCookieFn( + name = '' +) { + for ( const s of document.cookie.split(/\s*;\s*/) ) { + const pos = s.indexOf('='); + if ( pos === -1 ) { continue; } + if ( s.slice(0, pos) !== name ) { continue; } + return s.slice(pos+1).trim(); + } } /******************************************************************************/ @@ -835,6 +957,9 @@ function objectFindOwnerFn( builtinScriptlets.push({ name: 'set-cookie.fn', fn: setCookieFn, + dependencies: [ + 'get-cookie.fn', + ], }); function setCookieFn( trusted = false, @@ -844,16 +969,17 @@ function setCookieFn( path = '', options = {}, ) { - const getCookieValue = name => { - for ( const s of document.cookie.split(/\s*;\s*/) ) { - const pos = s.indexOf('='); - if ( pos === -1 ) { continue; } - if ( s.slice(0, pos) !== name ) { continue; } - return s.slice(pos+1); - } - }; + // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2 + // https://github.com/uBlockOrigin/uBlock-issues/issues/2777 + if ( trusted === false && /[^!#$%&'*+\-.0-9A-Z[\]^_`a-z|~]/.test(name) ) { + name = encodeURIComponent(name); + } + // https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1 + if ( /[^!#-+\--:<-[\]-~]/.test(value) ) { + value = encodeURIComponent(value); + } - const cookieBefore = getCookieValue(name); + const cookieBefore = getCookieFn(name); if ( cookieBefore !== undefined && options.dontOverwrite ) { return; } if ( cookieBefore === value && options.reload ) { return; } @@ -881,9 +1007,12 @@ function setCookieFn( } catch(_) { } - if ( options.reload && getCookieValue(name) === value ) { + const done = getCookieFn(name) === value; + if ( done && options.reload ) { window.location.reload(); } + + return done; } /******************************************************************************/ @@ -1070,7 +1199,7 @@ function matchObjectProperties(propNeedles, ...objs) { let value = haystack[prop]; if ( value === undefined ) { continue; } if ( typeof value !== 'string' ) { - try { value = JSON.stringify(value); } + try { value = safe.JSON_stringify(value); } catch(ex) { } if ( typeof value !== 'string' ) { continue; } } @@ -1090,7 +1219,6 @@ builtinScriptlets.push({ 'object-prune.fn', 'parse-properties-to-match.fn', 'safe-self.fn', - 'should-log.fn', ], }); function jsonPruneFetchResponseFn( @@ -1098,23 +1226,22 @@ function jsonPruneFetchResponseFn( rawNeedlePaths = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('json-prune-fetch-response', rawPrunePaths, rawNeedlePaths); const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); - const logLevel = shouldLog({ log: rawPrunePaths === '' || extraArgs.log, }); - const log = logLevel ? ((...args) => { safe.uboLog(...args); }) : (( ) => { }); const propNeedles = parsePropertiesToMatch(extraArgs.propsToMatch, 'url'); const stackNeedle = safe.initPattern(extraArgs.stackToMatch || '', { canNegate: true }); + const logall = rawPrunePaths === ''; const applyHandler = function(target, thisArg, args) { const fetchPromise = Reflect.apply(target, thisArg, args); - if ( logLevel === true ) { - log('json-prune-fetch-response:', JSON.stringify(Array.from(args)).slice(1,-1)); - } - if ( rawPrunePaths === '' ) { return fetchPromise; } - let outcome = 'match'; + let outcome = logall ? 'nomatch' : 'match'; if ( propNeedles.size !== 0 ) { const objs = [ args[0] instanceof Object ? args[0] : { url: args[0] } ]; if ( objs[0] instanceof Request ) { - try { objs[0] = safe.Request_clone.call(objs[0]); } - catch(ex) { log(ex); } + try { + objs[0] = safe.Request_clone.call(objs[0]); + } catch(ex) { + safe.uboErr(logPrefix, 'Error:', ex); + } } if ( args[1] instanceof Object ) { objs.push(args[1]); @@ -1122,19 +1249,19 @@ function jsonPruneFetchResponseFn( if ( matchObjectProperties(propNeedles, ...objs) === false ) { outcome = 'nomatch'; } - if ( outcome === logLevel || logLevel === 'all' ) { - log( - `json-prune-fetch-response (${outcome})`, - `\n\tfetchPropsToMatch: ${JSON.stringify(Array.from(propNeedles)).slice(1,-1)}`, - '\n\tprops:', ...objs, - ); - } } - if ( outcome === 'nomatch' ) { return fetchPromise; } + if ( logall === false && outcome === 'nomatch' ) { return fetchPromise; } + if ( safe.logLevel > 1 && outcome !== 'nomatch' && propNeedles.size !== 0 ) { + safe.uboLog(logPrefix, `Matched optional "propsToMatch"\n${extraArgs.propsToMatch}`); + } return fetchPromise.then(responseBefore => { const response = responseBefore.clone(); return response.json().then(objBefore => { if ( typeof objBefore !== 'object' ) { return responseBefore; } + if ( logall ) { + safe.uboLog(logPrefix, safe.JSON_stringify(objBefore, null, 2)); + return responseBefore; + } const objAfter = objectPruneFn( objBefore, rawPrunePaths, @@ -1143,6 +1270,7 @@ function jsonPruneFetchResponseFn( extraArgs ); if ( typeof objAfter !== 'object' ) { return responseBefore; } + safe.uboLog(logPrefix, 'Pruned'); const responseAfter = Response.json(objAfter, { status: responseBefore.status, statusText: responseBefore.statusText, @@ -1156,11 +1284,11 @@ function jsonPruneFetchResponseFn( }); return responseAfter; }).catch(reason => { - log('json-prune-fetch-response:', reason); + safe.uboErr(logPrefix, 'Error:', reason); return responseBefore; }); }).catch(reason => { - log('json-prune-fetch-response:', reason); + safe.uboErr(logPrefix, 'Error:', reason); return fetchPromise; }); }; @@ -1178,7 +1306,6 @@ builtinScriptlets.push({ 'match-object-properties.fn', 'parse-properties-to-match.fn', 'safe-self.fn', - 'should-log.fn', ], }); function replaceFetchResponseFn( @@ -1189,27 +1316,24 @@ function replaceFetchResponseFn( ) { if ( trusted !== true ) { return; } const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); - const logLevel = shouldLog({ - log: pattern === '' || extraArgs.log, - }); - const log = logLevel ? ((...args) => { safe.uboLog(...args); }) : (( ) => { }); + const logPrefix = safe.makeLogPrefix('replace-fetch-response', pattern, replacement, propsToMatch); if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); self.fetch = new Proxy(self.fetch, { apply: function(target, thisArg, args) { - if ( logLevel === true ) { - log('replace-fetch-response:', JSON.stringify(Array.from(args)).slice(1,-1)); - } const fetchPromise = Reflect.apply(target, thisArg, args); if ( pattern === '' ) { return fetchPromise; } let outcome = 'match'; if ( propNeedles.size !== 0 ) { const objs = [ args[0] instanceof Object ? args[0] : { url: args[0] } ]; if ( objs[0] instanceof Request ) { - try { objs[0] = safe.Request_clone.call(objs[0]); } - catch(ex) { log(ex); } + try { + objs[0] = safe.Request_clone.call(objs[0]); + } + catch(ex) { + safe.uboErr(logPrefix, ex); + } } if ( args[1] instanceof Object ) { objs.push(args[1]); @@ -1217,28 +1341,18 @@ function replaceFetchResponseFn( if ( matchObjectProperties(propNeedles, ...objs) === false ) { outcome = 'nomatch'; } - if ( outcome === logLevel || logLevel === 'all' ) { - log( - `replace-fetch-response (${outcome})`, - `\n\tpropsToMatch: ${JSON.stringify(Array.from(propNeedles)).slice(1,-1)}`, - '\n\tprops:', ...args, - ); - } } if ( outcome === 'nomatch' ) { return fetchPromise; } + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Matched "propsToMatch"\n${propsToMatch}`); + } return fetchPromise.then(responseBefore => { const response = responseBefore.clone(); return response.text().then(textBefore => { const textAfter = textBefore.replace(rePattern, replacement); const outcome = textAfter !== textBefore ? 'match' : 'nomatch'; - if ( outcome === logLevel || logLevel === 'all' ) { - log( - `replace-fetch-response (${outcome})`, - `\n\tpattern: ${pattern}`, - `\n\treplacement: ${replacement}`, - ); - } if ( outcome === 'nomatch' ) { return responseBefore; } + safe.uboLog(logPrefix, 'Replaced'); const responseAfter = new Response(textAfter, { status: responseBefore.status, statusText: responseBefore.statusText, @@ -1252,17 +1366,48 @@ function replaceFetchResponseFn( }); return responseAfter; }).catch(reason => { - log('replace-fetch-response:', reason); + safe.uboErr(logPrefix, reason); return responseBefore; }); }).catch(reason => { - log('replace-fetch-response:', reason); + safe.uboErr(logPrefix, reason); return fetchPromise; }); } }); } +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'proxy-apply.fn', + fn: proxyApplyFn, + dependencies: [ + 'safe-self.fn', + ], +}); +function proxyApplyFn( + target = '', + handler = '' +) { + let context = globalThis; + let prop = target; + for (;;) { + const pos = prop.indexOf('.'); + if ( pos === -1 ) { break; } + context = context[prop.slice(0, pos)]; + if ( context instanceof Object === false ) { return; } + prop = prop.slice(pos+1); + } + const fn = context[prop]; + if ( typeof fn !== 'function' ) { return; } + if ( fn.prototype && fn.prototype.constructor === fn ) { + context[prop] = new Proxy(fn, { construct: handler }); + return (...args) => { return Reflect.construct(...args); }; + } + context[prop] = new Proxy(fn, { apply: handler }); + return (...args) => { return Reflect.apply(...args); }; +} /******************************************************************************* @@ -1303,6 +1448,7 @@ builtinScriptlets.push({ fn: abortOnPropertyRead, dependencies: [ 'get-exception-token.fn', + 'safe-self.fn', ], }); function abortOnPropertyRead( @@ -1310,8 +1456,11 @@ function abortOnPropertyRead( ) { if ( typeof chain !== 'string' ) { return; } if ( chain === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('abort-on-property-read', chain); const exceptionToken = getExceptionToken(); const abort = function() { + safe.uboLog(logPrefix, 'Aborted'); throw new ReferenceError(exceptionToken); }; const makeProxy = function(owner, chain) { @@ -1359,6 +1508,7 @@ builtinScriptlets.push({ fn: abortOnPropertyWrite, dependencies: [ 'get-exception-token.fn', + 'safe-self.fn', ], }); function abortOnPropertyWrite( @@ -1366,6 +1516,8 @@ function abortOnPropertyWrite( ) { if ( typeof prop !== 'string' ) { return; } if ( prop === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('abort-on-property-write', prop); const exceptionToken = getExceptionToken(); let owner = window; for (;;) { @@ -1378,6 +1530,7 @@ function abortOnPropertyWrite( delete owner[prop]; Object.defineProperty(owner, prop, { set: function() { + safe.uboLog(logPrefix, 'Aborted'); throw new ReferenceError(exceptionToken); } }); @@ -1462,7 +1615,6 @@ builtinScriptlets.push({ 'run-at.fn', 'safe-self.fn', 'should-debug.fn', - 'should-log.fn', ], }); // https://github.com/uBlockOrigin/uAssets/issues/9123#issuecomment-848255120 @@ -1472,32 +1624,68 @@ function addEventListenerDefuser( ) { const safe = safeSelf(); const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const logPrefix = safe.makeLogPrefix('prevent-addEventListener', type, pattern); const reType = safe.patternToRegex(type, undefined, true); const rePattern = safe.patternToRegex(pattern); - const log = shouldLog(extraArgs); const debug = shouldDebug(extraArgs); + const targetSelector = extraArgs.elements || undefined; + const elementMatches = elem => { + if ( elem && elem.matches && elem.matches(targetSelector) ) { return true; } + const elems = Array.from(document.querySelectorAll(targetSelector)); + return elems.includes(elem); + }; + const elementDetails = elem => { + if ( elem instanceof Window ) { return 'window'; } + if ( elem instanceof Document ) { return 'document'; } + if ( elem instanceof Element === false ) { return '?'; } + const parts = []; + if ( elem.id !== '' ) { parts.push(`#${CSS.escape(elem.id)}`); } + for ( let i = 0; i < elem.classList.length; i++ ) { + parts.push(`.${CSS.escape(elem.classList.item(i))}`); + } + for ( let i = 0; i < elem.attributes.length; i++ ) { + const attr = elem.attributes.item(i); + if ( attr.name === 'id' ) { continue; } + if ( attr.name === 'class' ) { continue; } + parts.push(`[${CSS.escape(attr.name)}="${attr.value}"]`); + } + return parts.join(''); + }; + const shouldPrevent = (thisArg, type, handler) => { + const matchesType = safe.RegExp_test.call(reType, type); + const matchesHandler = safe.RegExp_test.call(rePattern, handler); + const matchesEither = matchesType || matchesHandler; + const matchesBoth = matchesType && matchesHandler; + if ( debug === 1 && matchesBoth || debug === 2 && matchesEither ) { + debugger; // eslint-disable-line no-debugger + } + if ( matchesBoth && targetSelector !== undefined ) { + if ( elementMatches(thisArg) === false ) { return false; } + } + return matchesBoth; + }; const trapEddEventListeners = ( ) => { const eventListenerHandler = { apply: function(target, thisArg, args) { - let type, handler; + let t, h; try { - type = String(args[0]); - handler = args[1] instanceof Function - ? String(safe.Function_toString(args[1])) - : String(args[1]); + t = String(args[0]); + if ( typeof args[1] === 'function' ) { + h = String(safe.Function_toString(args[1])); + } else if ( typeof args[1] === 'object' && args[1] !== null ) { + if ( typeof args[1].handleEvent === 'function' ) { + h = String(safe.Function_toString(args[1].handleEvent)); + } + } else { + h = String(args[1]); + } } catch(ex) { } - const matchesType = safe.RegExp_test.call(reType, type); - const matchesHandler = safe.RegExp_test.call(rePattern, handler); - const matchesEither = matchesType || matchesHandler; - const matchesBoth = matchesType && matchesHandler; - if ( log === 1 && matchesBoth || log === 2 && matchesEither || log === 3 ) { - safe.uboLog(`addEventListener('${type}', ${handler})`); + if ( type === '' && pattern === '' ) { + safe.uboLog(logPrefix, `Called: ${t}\n${h}\n${elementDetails(thisArg)}`); + } else if ( shouldPrevent(thisArg, t, h) ) { + return safe.uboLog(logPrefix, `Prevented: ${t}\n${h}\n${elementDetails(thisArg)}`); } - if ( debug === 1 && matchesBoth || debug === 2 && matchesEither ) { - debugger; // jshint ignore:line - } - if ( matchesBoth ) { return; } return Reflect.apply(target, thisArg, args); }, get(target, prop, receiver) { @@ -1533,19 +1721,28 @@ function jsonPrune( stackNeedle = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('json-prune', rawPrunePaths, rawNeedlePaths, stackNeedle); const stackNeedleDetails = safe.initPattern(stackNeedle, { canNegate: true }); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); JSON.parse = new Proxy(JSON.parse, { apply: function(target, thisArg, args) { const objBefore = Reflect.apply(target, thisArg, args); + if ( rawPrunePaths === '' ) { + safe.uboLog(logPrefix, safe.JSON_stringify(objBefore, null, 2)); + } const objAfter = objectPruneFn( objBefore, rawPrunePaths, rawNeedlePaths, stackNeedleDetails, extraArgs - ); - return objAfter || objBefore; + ); + if ( objAfter === undefined ) { return objBefore; } + safe.uboLog(logPrefix, 'Pruned'); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `After pruning:\n${safe.JSON_stringify(objAfter, null, 2)}`); + } + return objAfter; }, }); } @@ -1579,7 +1776,6 @@ builtinScriptlets.push({ 'object-prune.fn', 'parse-properties-to-match.fn', 'safe-self.fn', - 'should-log.fn', ], }); function jsonPruneXhrResponse( @@ -1587,10 +1783,9 @@ function jsonPruneXhrResponse( rawNeedlePaths = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('json-prune-xhr-response', rawPrunePaths, rawNeedlePaths); const xhrInstances = new WeakMap(); const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); - const logLevel = shouldLog({ log: rawPrunePaths === '' || extraArgs.log, }); - const log = logLevel ? ((...args) => { safe.uboLog(...args); }) : (( ) => { }); const propNeedles = parsePropertiesToMatch(extraArgs.propsToMatch, 'url'); const stackNeedle = safe.initPattern(extraArgs.stackToMatch || '', { canNegate: true }); self.XMLHttpRequest = class extends self.XMLHttpRequest { @@ -1602,10 +1797,10 @@ function jsonPruneXhrResponse( outcome = 'nomatch'; } } - if ( outcome === logLevel || outcome === 'all' ) { - log(`xhr.open(${method}, ${url}, ${args.join(', ')})`); - } if ( outcome === 'match' ) { + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Matched optional "propsToMatch", "${extraArgs.propsToMatch}"`); + } xhrInstances.set(this, xhrDetails); } return super.open(method, url, ...args); @@ -1630,8 +1825,10 @@ function jsonPruneXhrResponse( if ( typeof innerResponse === 'object' ) { objBefore = innerResponse; } else if ( typeof innerResponse === 'string' ) { - try { objBefore = safe.JSON_parse(innerResponse); } - catch(ex) { } + try { + objBefore = safe.JSON_parse(innerResponse); + } catch(ex) { + } } if ( typeof objBefore !== 'object' ) { return (xhrDetails.response = innerResponse); @@ -1648,6 +1845,7 @@ function jsonPruneXhrResponse( outerResponse = typeof innerResponse === 'string' ? safe.JSON_stringify(objAfter) : objAfter; + safe.uboLog(logPrefix, 'Pruned'); } else { outerResponse = innerResponse; } @@ -1826,9 +2024,9 @@ function noEvalIf( /******************************************************************************/ builtinScriptlets.push({ - name: 'no-fetch-if.js', + name: 'prevent-fetch.js', aliases: [ - 'prevent-fetch.js', + 'no-fetch-if.js', ], fn: noFetchIf, dependencies: [ @@ -1842,6 +2040,7 @@ function noFetchIf( ) { if ( typeof propsToMatch !== 'string' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-fetch', propsToMatch, responseBody); const needles = []; for ( const condition of propsToMatch.split(/\s+/) ) { if ( condition === '' ) { continue; } @@ -1856,7 +2055,6 @@ function noFetchIf( } needles.push({ key, re: safe.patternToRegex(value) }); } - const log = needles.length === 0 ? console.log.bind(console) : undefined; self.fetch = new Proxy(self.fetch, { apply: function(target, thisArg, args) { const details = args[0] instanceof self.Request @@ -1868,17 +2066,16 @@ function noFetchIf( for ( const prop in details ) { let v = details[prop]; if ( typeof v !== 'string' ) { - try { v = JSON.stringify(v); } + try { v = safe.JSON_stringify(v); } catch(ex) { } } if ( typeof v !== 'string' ) { continue; } props.set(prop, v); } - if ( log !== undefined ) { - const out = Array.from(props) - .map(a => `${a[0]}:${a[1]}`) - .join(' '); - log(`uBO: fetch(${out})`); + if ( propsToMatch === '' && responseBody === '' ) { + const out = Array.from(props).map(a => `${a[0]}:${a[1]}`); + safe.uboLog(logPrefix, `Called: ${out.join('\n')}`); + return Reflect.apply(target, thisArg, args); } proceed = needles.length === 0; for ( const { key, re } of needles ) { @@ -1902,21 +2099,23 @@ function noFetchIf( responseType = desURL.origin !== document.location.origin ? 'cors' : 'basic'; - } catch(_) { + } catch(ex) { + safe.uboErr(logPrefix, `Error: ${ex}`); } } return generateContentFn(responseBody).then(text => { + safe.uboLog(logPrefix, `Prevented with response "${text}"`); const response = new Response(text, { statusText: 'OK', headers: { 'Content-Length': text.length, } }); - Object.defineProperty(response, 'url', { + safe.Object_defineProperty(response, 'url', { value: details.url }); if ( responseType !== '' ) { - Object.defineProperty(response, 'type', { + safe.Object_defineProperty(response, 'type', { value: responseType }); } @@ -1937,6 +2136,7 @@ builtinScriptlets.push({ world: 'ISOLATED', dependencies: [ 'run-at.fn', + 'safe-self.fn', ], }); // https://www.reddit.com/r/uBlockOrigin/comments/q0frv0/while_reading_a_sports_article_i_was_redirected/hf7wo9v/ @@ -1944,9 +2144,12 @@ function preventRefresh( arg1 = '' ) { if ( typeof arg1 !== 'string' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-refresh', arg1); const defuse = ( ) => { const meta = document.querySelector('meta[http-equiv="refresh" i][content]'); if ( meta === null ) { return; } + safe.uboLog(logPrefix, `Prevented "${meta.textContent}"`); const s = arg1 === '' ? meta.getAttribute('content') : arg1; @@ -2146,13 +2349,13 @@ builtinScriptlets.push({ ], fn: setConstant, dependencies: [ - 'set-constant-core.fn' + 'set-constant.fn' ], }); function setConstant( ...args ) { - setConstantCore(false, ...args); + setConstantFn(false, ...args); } /******************************************************************************/ @@ -2175,6 +2378,7 @@ function noSetIntervalIf( ) { if ( typeof needle !== 'string' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-setInterval', needle, delay); const needleNot = needle.charAt(0) === '!'; if ( needleNot ) { needle = needle.slice(1); } if ( delay === '' ) { delay = undefined; } @@ -2184,9 +2388,6 @@ function noSetIntervalIf( if ( delayNot ) { delay = delay.slice(1); } delay = parseInt(delay, 10); } - const log = needleNot === false && needle === '' && delay === undefined - ? console.log - : undefined; const reNeedle = safe.patternToRegex(needle); self.setInterval = new Proxy(self.setInterval, { apply: function(target, thisArg, args) { @@ -2194,19 +2395,20 @@ function noSetIntervalIf( ? String(safe.Function_toString(args[0])) : String(args[0]); const b = args[1]; - if ( log !== undefined ) { - log('uBO: setInterval("%s", %s)', a, b); - } else { - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } + if ( needle === '' && delay === undefined ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); + return Reflect.apply(target, thisArg, args); + } + let defuse; + if ( needle !== '' ) { + defuse = reNeedle.test(a) !== needleNot; + } + if ( defuse !== false && delay !== undefined ) { + defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; + } + if ( defuse ) { + args[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); } return Reflect.apply(target, thisArg, args); }, @@ -2239,6 +2441,7 @@ function noSetTimeoutIf( ) { if ( typeof needle !== 'string' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-setTimeout', needle, delay); const needleNot = needle.charAt(0) === '!'; if ( needleNot ) { needle = needle.slice(1); } if ( delay === '' ) { delay = undefined; } @@ -2248,9 +2451,6 @@ function noSetTimeoutIf( if ( delayNot ) { delay = delay.slice(1); } delay = parseInt(delay, 10); } - const log = needleNot === false && needle === '' && delay === undefined - ? console.log - : undefined; const reNeedle = safe.patternToRegex(needle); self.setTimeout = new Proxy(self.setTimeout, { apply: function(target, thisArg, args) { @@ -2258,19 +2458,20 @@ function noSetTimeoutIf( ? String(safe.Function_toString(args[0])) : String(args[0]); const b = args[1]; - if ( log !== undefined ) { - log('uBO: setTimeout("%s", %s)', a, b); - } else { - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } + if ( needle === '' && delay === undefined ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); + return Reflect.apply(target, thisArg, args); + } + let defuse; + if ( needle !== '' ) { + defuse = reNeedle.test(a) !== needleNot; + } + if ( defuse !== false && delay !== undefined ) { + defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; + } + if ( defuse ) { + args[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); } return Reflect.apply(target, thisArg, args); }, @@ -2371,10 +2572,11 @@ function noXhrIf( directive = '' ) { if ( typeof propsToMatch !== 'string' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-xhr', propsToMatch, directive); const xhrInstances = new WeakMap(); const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); - const log = propNeedles.size === 0 ? console.log.bind(console) : undefined; - const warOrigin = scriptletGlobals.get('warOrigin'); + const warOrigin = scriptletGlobals.warOrigin; const headers = { 'date': '', 'content-type': '', @@ -2382,15 +2584,15 @@ function noXhrIf( }; self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { - if ( log !== undefined ) { - log(`uBO: xhr.open(${method}, ${url}, ${args.join(', ')})`); - return super.open(method, url, ...args); - } xhrInstances.delete(this); if ( warOrigin !== undefined && url.startsWith(warOrigin) ) { return super.open(method, url, ...args); } const haystack = { method, url }; + if ( propsToMatch === '' && directive === '' ) { + safe.uboLog(logPrefix, `Called: ${safe.JSON_stringify(haystack, null, 2)}`); + return super.open(method, url, ...args); + } if ( matchObjectProperties(propNeedles, haystack) ) { xhrInstances.set(this, haystack); } @@ -2468,6 +2670,7 @@ function noXhrIf( details.xhr.dispatchEvent(new Event('readystatechange')); details.xhr.dispatchEvent(new Event('load')); details.xhr.dispatchEvent(new Event('loadend')); + safe.uboLog(logPrefix, `Prevented with response:\n${details.xhr.response}`); }); } getResponseHeader(headerName) { @@ -2507,7 +2710,6 @@ builtinScriptlets.push({ fn: noWindowOpenIf, dependencies: [ 'safe-self.fn', - 'should-log.fn', ], }); function noWindowOpenIf( @@ -2516,6 +2718,7 @@ function noWindowOpenIf( decoy = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('no-window-open-if', pattern, delay, decoy); const targetMatchResult = pattern.startsWith('!') === false; if ( targetMatchResult === false ) { pattern = pattern.slice(1); @@ -2525,8 +2728,6 @@ function noWindowOpenIf( if ( isNaN(autoRemoveAfter) ) { autoRemoveAfter = -1; } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const logLevel = shouldLog(extraArgs); const createDecoy = function(tag, urlProp, url) { const decoyElem = document.createElement(tag); decoyElem[urlProp] = url; @@ -2541,12 +2742,13 @@ function noWindowOpenIf( window.open = new Proxy(window.open, { apply: function(target, thisArg, args) { const haystack = args.join(' '); - if ( logLevel ) { - safe.uboLog('window.open:', haystack); - } if ( rePattern.test(haystack) !== targetMatchResult ) { + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Allowed (${args.join(', ')})`); + } return Reflect.apply(target, thisArg, args); } + safe.uboLog(logPrefix, `Prevented (${args.join(', ')})`); if ( autoRemoveAfter < 0 ) { return null; } const decoyElem = decoy === 'obj' ? createDecoy('object', 'data', ...args) @@ -2568,14 +2770,14 @@ function noWindowOpenIf( }, }); } - if ( logLevel ) { + if ( safe.logLevel !== 0 ) { popup = new Proxy(popup, { get: function(target, prop) { - safe.uboLog('window.open / get', prop, '===', target[prop]); + safe.uboLog(logPrefix, 'window.open / get', prop, '===', target[prop]); return Reflect.get(...arguments); }, set: function(target, prop, value) { - safe.uboLog('window.open / set', prop, '=', value); + safe.uboLog(logPrefix, 'window.open / set', prop, '=', value); return Reflect.set(...arguments); }, }); @@ -2758,31 +2960,6 @@ function noWebrtc() { /******************************************************************************/ builtinScriptlets.push({ - name: 'golem.de.js', - fn: golemDe, -}); -// https://github.com/uBlockOrigin/uAssets/issues/88 -function golemDe() { - const rael = window.addEventListener; - window.addEventListener = function(a, b) { - rael(...arguments); - let haystack; - try { - haystack = b.toString(); - } catch(ex) { - } - if ( - typeof haystack === 'string' && - /^\s*function\s*\(\)\s*\{\s*window\.clearTimeout\(r\)\s*\}\s*$/.test(haystack) - ) { - b(); - } - }.bind(window); -} - -/******************************************************************************/ - -builtinScriptlets.push({ name: 'disable-newtab-links.js', fn: disableNewtabLinks, }); @@ -2884,7 +3061,6 @@ builtinScriptlets.push({ fn: xmlPrune, dependencies: [ 'safe-self.fn', - 'should-log.fn', ], }); function xmlPrune( @@ -2895,9 +3071,9 @@ function xmlPrune( if ( typeof selector !== 'string' ) { return; } if ( selector === '' ) { return; } const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('xml-prune', selector, selectorCheck, urlPattern); const reUrl = safe.patternToRegex(urlPattern); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const log = shouldLog(extraArgs) ? ((...args) => { safe.uboLog(...args); }) : (( ) => { }); const queryAll = (xmlDoc, selector) => { const isXpath = /^xpath\(.+\)$/.test(selector); if ( isXpath === false ) { @@ -2924,21 +3100,21 @@ function xmlPrune( } if ( extraArgs.logdoc ) { const serializer = new XMLSerializer(); - log(`xmlPrune: document is\n\t${serializer.serializeToString(xmlDoc)}`); + safe.uboLog(logPrefix, `Document is\n\t${serializer.serializeToString(xmlDoc)}`); } const items = queryAll(xmlDoc, selector); if ( items.length === 0 ) { return xmlDoc; } - log(`xmlPrune: removing ${items.length} items`); + safe.uboLog(logPrefix, `Removing ${items.length} items`); for ( const item of items ) { if ( item.nodeType === 1 ) { item.remove(); } else if ( item.nodeType === 2 ) { item.ownerElement.removeAttribute(item.nodeName); } - log(`xmlPrune: ${item.constructor.name}.${item.nodeName} removed`); + safe.uboLog(logPrefix, `${item.constructor.name}.${item.nodeName} removed`); } } catch(ex) { - log(ex); + safe.uboErr(logPrefix, `Error: ${ex}`); } return xmlDoc; }; @@ -3030,7 +3206,6 @@ builtinScriptlets.push({ fn: m3uPrune, dependencies: [ 'safe-self.fn', - 'should-log.fn', ], }); // https://en.wikipedia.org/wiki/M3U @@ -3040,9 +3215,8 @@ function m3uPrune( ) { if ( typeof m3uPattern !== 'string' ) { return; } const safe = safeSelf(); - const options = safe.getExtraArgs(Array.from(arguments), 2); - const logLevel = shouldLog(options); - const uboLog = logLevel ? ((...args) => safe.uboLog(...args)) : (( ) => { }); + const logPrefix = safe.makeLogPrefix('m3u-prune', m3uPattern, urlPattern); + const toLog = []; const regexFromArg = arg => { if ( arg === '' ) { return /^/; } const match = /^\/(.+)\/([gms]*)$/.exec(arg); @@ -3061,22 +3235,22 @@ function m3uPrune( if ( lines[i].startsWith('#EXT-X-CUE:TYPE="SpliceOut"') === false ) { return false; } - uboLog('m3u-prune: discarding', `\n\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; if ( lines[i].startsWith('#EXT-X-ASSET:CAID') ) { - uboLog(`\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; } if ( lines[i].startsWith('#EXT-X-SCTE35:') ) { - uboLog(`\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; } if ( lines[i].startsWith('#EXT-X-CUE-IN') ) { - uboLog(`\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; } if ( lines[i].startsWith('#EXT-X-SCTE35:') ) { - uboLog(`\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; } return true; @@ -3084,10 +3258,10 @@ function m3uPrune( const pruneInfBlock = (lines, i) => { if ( lines[i].startsWith('#EXTINF') === false ) { return false; } if ( reM3u.test(lines[i+1]) === false ) { return false; } - uboLog('m3u-prune: discarding', `\n\t${lines[i]}, \n\t${lines[i+1]}`); + toLog.push('Discarding', `\t${lines[i]}, \t${lines[i+1]}`); lines[i] = lines[i+1] = undefined; i += 2; if ( lines[i].startsWith('#EXT-X-DISCONTINUITY') ) { - uboLog(`\t${lines[i]}`); + toLog.push(`\t${lines[i]}`); lines[i] = undefined; i += 1; } return true; @@ -3124,9 +3298,7 @@ function m3uPrune( } text = before.trim() + '\n' + after.trim(); reM3u.lastIndex = before.length + 1; - uboLog('m3u-prune: discarding\n', - discard.split(/\n+/).map(s => `\t${s}`).join('\n') - ); + toLog.push('Discarding', ...discard.split(/\n+/).map(s => `\t${s}`)); if ( reM3u.global === false ) { break; } } return text; @@ -3151,13 +3323,18 @@ function m3uPrune( return Reflect.apply(target, thisArg, args); } return realFetch(...args).then(realResponse => - realResponse.text().then(text => - new Response(pruner(text), { + realResponse.text().then(text => { + const response = new Response(pruner(text), { status: realResponse.status, statusText: realResponse.statusText, headers: realResponse.headers, - }) - ) + }); + if ( toLog.length !== 0 ) { + toLog.unshift(logPrefix); + safe.uboLog(toLog.join('\n')); + } + return response; + }) ); } }); @@ -3175,6 +3352,10 @@ function m3uPrune( if ( textout === textin ) { return; } Object.defineProperty(thisArg, 'response', { value: textout }); Object.defineProperty(thisArg, 'responseText', { value: textout }); + if ( toLog.length !== 0 ) { + toLog.unshift(logPrefix); + safe.uboLog(toLog.join('\n')); + } }); return Reflect.apply(target, thisArg, args); } @@ -3220,6 +3401,7 @@ builtinScriptlets.push({ world: 'ISOLATED', dependencies: [ 'run-at.fn', + 'safe-self.fn', ], }); function hrefSanitizer( @@ -3228,6 +3410,8 @@ function hrefSanitizer( ) { if ( typeof selector !== 'string' ) { return; } if ( selector === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('href-sanitizer', selector, source); if ( source === '' ) { source = 'text'; } const sanitizeCopycats = (href, text) => { let elems = []; @@ -3239,6 +3423,7 @@ function hrefSanitizer( for ( const elem of elems ) { elem.setAttribute('href', text); } + return elems.length; }; const validateURL = text => { if ( text === '' ) { return ''; } @@ -3266,7 +3451,7 @@ function hrefSanitizer( return elem.textContent .replace(/^[^\x21-\x7e]+/, '') // remove leading invalid characters .replace(/[^\x21-\x7e]+$/, '') // remove trailing invalid characters - ; + ; } return ''; }; @@ -3287,7 +3472,8 @@ function hrefSanitizer( if ( hrefAfter === '' ) { continue; } if ( hrefAfter === href ) { continue; } elem.setAttribute('href', hrefAfter); - sanitizeCopycats(href, hrefAfter); + const count = sanitizeCopycats(href, hrefAfter); + safe.uboLog(logPrefix, `Sanitized ${count+1} links to\n${hrefAfter}`); } return true; }; @@ -3305,7 +3491,7 @@ function hrefSanitizer( if ( shouldSanitize ) { break; } } if ( shouldSanitize === false ) { return; } - timer = self.requestAnimationFrame(( ) => { + timer = self.requestIdleCallback(( ) => { timer = undefined; sanitize(); }); @@ -3402,21 +3588,28 @@ function spoofCSS( propToValueMap.set(toCamelCase(args[i+0]), args[i+1]); } const safe = safeSelf(); - const canDebug = scriptletGlobals.has('canDebug'); + const logPrefix = safe.makeLogPrefix('spoof-css', selector, ...args); + const canDebug = scriptletGlobals.canDebug; const shouldDebug = canDebug && propToValueMap.get('debug') || 0; - const shouldLog = canDebug && propToValueMap.has('log') || 0; + const instanceProperties = [ 'cssText', 'length', 'parentRule' ]; const spoofStyle = (prop, real) => { const normalProp = toCamelCase(prop); const shouldSpoof = propToValueMap.has(normalProp); const value = shouldSpoof ? propToValueMap.get(normalProp) : real; - if ( shouldLog === 2 || shouldSpoof && shouldLog === 1 ) { - safe.uboLog(prop, value); + if ( shouldSpoof ) { + safe.uboLog(logPrefix, `Spoofing ${prop} to ${value}`); } return value; }; + const cloackFunc = (fn, thisArg, name) => { + const trap = fn.bind(thisArg); + Object.defineProperty(trap, 'name', { value: name }); + return trap; + }; self.getComputedStyle = new Proxy(self.getComputedStyle, { apply: function(target, thisArg, args) { - if ( shouldDebug !== 0 ) { debugger; } // jshint ignore: line + // eslint-disable-next-line no-debugger + if ( shouldDebug !== 0 ) { debugger; } const style = Reflect.apply(target, thisArg, args); const targetElements = new WeakSet(document.querySelectorAll(selector)); if ( targetElements.has(args[0]) === false ) { return style; } @@ -3424,11 +3617,14 @@ function spoofCSS( get(target, prop, receiver) { if ( typeof target[prop] === 'function' ) { if ( prop === 'getPropertyValue' ) { - return (function(prop) { + return cloackFunc(function(prop) { return spoofStyle(prop, target[prop]); - }).bind(target); + }, target, 'getPropertyValue'); } - return target[prop].bind(target); + return cloackFunc(target[prop], target, prop); + } + if ( instanceProperties.includes(prop) ) { + return Reflect.get(target, prop); } return spoofStyle(prop, Reflect.get(target, prop, receiver)); }, @@ -3455,7 +3651,8 @@ function spoofCSS( }); Element.prototype.getBoundingClientRect = new Proxy(Element.prototype.getBoundingClientRect, { apply: function(target, thisArg, args) { - if ( shouldDebug !== 0 ) { debugger; } // jshint ignore: line + // eslint-disable-next-line no-debugger + if ( shouldDebug !== 0 ) { debugger; } const rect = Reflect.apply(target, thisArg, args); const targetElements = new WeakSet(document.querySelectorAll(selector)); if ( targetElements.has(thisArg) === false ) { return rect; } @@ -3524,7 +3721,8 @@ function setCookie( path = '' ) { if ( name === '' ) { return; } - name = encodeURIComponent(name); + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); const validValues = [ 'accept', 'reject', @@ -3545,17 +3743,21 @@ function setCookie( if ( validValues.includes(unquoted) === false ) { if ( /^\d+$/.test(unquoted) === false ) { return; } const n = parseInt(value, 10); - if ( n > 15 ) { return; } + if ( n > 32767 ) { return; } } - setCookieFn( + const done = setCookieFn( false, name, value, '', path, - safeSelf().getExtraArgs(Array.from(arguments), 3) + safe.getExtraArgs(Array.from(arguments), 3) ); + + if ( done ) { + safe.uboLog(logPrefix, 'Done'); + } } // For compatibility with AdGuard @@ -3641,6 +3843,7 @@ builtinScriptlets.push({ world: 'ISOLATED', dependencies: [ 'run-at.fn', + 'safe-self.fn', ], }); function setAttr( @@ -3648,9 +3851,11 @@ function setAttr( attr = '', value = '' ) { - if ( typeof selector !== 'string' ) { return; } if ( selector === '' ) { return; } + if ( attr === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-attr', attr, value); const validValues = [ '', 'false', 'true' ]; let copyFrom = ''; @@ -3685,7 +3890,11 @@ function setAttr( const before = elem.getAttribute(attr); const after = extractValue(elem); if ( after === before ) { continue; } + if ( after !== '' && /^on/i.test(attr) ) { + if ( attr.toLowerCase() in elem ) { continue; } + } elem.setAttribute(attr, after); + safe.uboLog(logPrefix, `${attr}="${after}"`); } return true; }; @@ -3806,6 +4015,58 @@ function multiup() { document.addEventListener('click', handler, { capture: true }); } +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'remove-cache-storage-item.js', + fn: removeCacheStorageItem, + world: 'ISOLATED', + dependencies: [ + 'safe-self.fn', + ], +}); +function removeCacheStorageItem( + cacheNamePattern = '', + requestPattern = '' +) { + if ( cacheNamePattern === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('remove-cache-storage-item', cacheNamePattern, requestPattern); + const cacheStorage = self.caches; + if ( cacheStorage instanceof Object === false ) { return; } + const reCache = safe.patternToRegex(cacheNamePattern, undefined, true); + const reRequest = safe.patternToRegex(requestPattern, undefined, true); + cacheStorage.keys().then(cacheNames => { + for ( const cacheName of cacheNames ) { + if ( reCache.test(cacheName) === false ) { continue; } + if ( requestPattern === '' ) { + cacheStorage.delete(cacheName).then(result => { + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Deleting ${cacheName}`); + } + if ( result !== true ) { return; } + safe.uboLog(logPrefix, `Deleted ${cacheName}: ${result}`); + }); + continue; + } + cacheStorage.open(cacheName).then(cache => { + cache.keys().then(requests => { + for ( const request of requests ) { + if ( reRequest.test(request.url) === false ) { continue; } + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Deleting ${cacheName}/${request.url}`); + } + cache.delete(request).then(result => { + if ( result !== true ) { return; } + safe.uboLog(logPrefix, `Deleted ${cacheName}/${request.url}: ${result}`); + }); + } + }); + }); + } + }); +} + /******************************************************************************* * @@ -3883,13 +4144,13 @@ builtinScriptlets.push({ ], fn: trustedSetConstant, dependencies: [ - 'set-constant-core.fn' + 'set-constant.fn' ], }); function trustedSetConstant( ...args ) { - setConstantCore(true, ...args); + setConstantFn(true, ...args); } /******************************************************************************* @@ -3921,6 +4182,8 @@ function trustedSetCookie( ) { if ( name === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); const time = new Date(); if ( value === '$now$' ) { @@ -3942,7 +4205,7 @@ function trustedSetCookie( expires = time.toUTCString(); } - setCookieFn( + const done = setCookieFn( true, name, value, @@ -3950,6 +4213,10 @@ function trustedSetCookie( path, safeSelf().getExtraArgs(Array.from(arguments), 4) ); + + if ( done ) { + safe.uboLog(logPrefix, 'Done'); + } } // For compatibility with AdGuard @@ -4018,6 +4285,9 @@ function trustedSetSessionStorageItem(key = '', value = '') { builtinScriptlets.push({ name: 'trusted-replace-fetch-response.js', requiresTrust: true, + aliases: [ + 'trusted-rpfr.js', + ], fn: trustedReplaceFetchResponse, dependencies: [ 'replace-fetch-response.fn', @@ -4037,7 +4307,6 @@ builtinScriptlets.push({ 'match-object-properties.fn', 'parse-properties-to-match.fn', 'safe-self.fn', - 'should-log.fn', ], }); function trustedReplaceXhrResponse( @@ -4046,12 +4315,8 @@ function trustedReplaceXhrResponse( propsToMatch = '' ) { const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-replace-xhr-response', pattern, replacement, propsToMatch); const xhrInstances = new WeakMap(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const logLevel = shouldLog({ - log: pattern === '' && 'all' || extraArgs.log, - }); - const log = logLevel ? ((...args) => { safe.uboLog(...args); }) : (( ) => { }); if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); @@ -4065,10 +4330,10 @@ function trustedReplaceXhrResponse( outcome = 'nomatch'; } } - if ( outcome === logLevel || outcome === 'all' ) { - log(`xhr.open(${method}, ${url}, ${args.join(', ')})`); - } if ( outcome === 'match' ) { + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Matched "propsToMatch"`); + } xhrInstances.set(outerXhr, xhrDetails); } return super.open(method, url, ...args); @@ -4094,13 +4359,8 @@ function trustedReplaceXhrResponse( } const textBefore = innerResponse; const textAfter = textBefore.replace(rePattern, replacement); - const outcome = textAfter !== textBefore ? 'match' : 'nomatch'; - if ( outcome === logLevel || logLevel === 'all' ) { - log( - `trusted-replace-xhr-response (${outcome})`, - `\n\tpattern: ${pattern}`, - `\n\treplacement: ${replacement}`, - ); + if ( textAfter !== textBefore ) { + safe.uboLog(logPrefix, 'Match'); } return (xhrDetails.response = textAfter); } @@ -4129,22 +4389,63 @@ builtinScriptlets.push({ fn: trustedClickElement, world: 'ISOLATED', dependencies: [ + 'get-all-cookies.fn', + 'get-all-local-storage.fn', 'run-at-html-element.fn', 'safe-self.fn', ], }); function trustedClickElement( selectors = '', - extraMatch = '', // not yet supported + extraMatch = '', delay = '' ) { - if ( extraMatch !== '' ) { return; } - const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const uboLog = extraArgs.log !== undefined - ? ((...args) => { safe.uboLog(...args); }) - : (( ) => { }); + const logPrefix = safe.makeLogPrefix('trusted-click-element', selectors, extraMatch, delay); + + if ( extraMatch !== '' ) { + const assertions = extraMatch.split(',').map(s => { + const pos1 = s.indexOf(':'); + const s1 = pos1 !== -1 ? s.slice(0, pos1) : s; + const not = s1.startsWith('!'); + const type = not ? s1.slice(1) : s1; + const s2 = pos1 !== -1 ? s.slice(pos1+1).trim() : ''; + if ( s2 === '' ) { return; } + const out = { not, type }; + const match = /^\/(.+)\/(i?)$/.exec(s2); + if ( match !== null ) { + out.re = new RegExp(match[1], match[2] || undefined); + return out; + } + const pos2 = s2.indexOf('='); + const key = pos2 !== -1 ? s2.slice(0, pos2).trim() : s2; + const value = pos2 !== -1 ? s2.slice(pos2+1).trim() : ''; + out.re = new RegExp(`^${this.escapeRegexChars(key)}=${this.escapeRegexChars(value)}`); + return out; + }).filter(details => details !== undefined); + const allCookies = assertions.some(o => o.type === 'cookie') + ? getAllCookiesFn() + : []; + const allStorageItems = assertions.some(o => o.type === 'localStorage') + ? getAllLocalStorageFn() + : []; + const hasNeedle = (haystack, needle) => { + for ( const { key, value } of haystack ) { + if ( needle.test(`${key}=${value}`) ) { return true; } + } + return false; + }; + for ( const { not, type, re } of assertions ) { + switch ( type ) { + case 'cookie': + if ( hasNeedle(allCookies, re) === not ) { return; } + break; + case 'localStorage': + if ( hasNeedle(allStorageItems, re) === not ) { return; } + break; + } + } + } const querySelectorEx = (selector, context = document) => { const pos = selector.indexOf(' >>> '); @@ -4181,12 +4482,12 @@ function trustedClickElement( const next = notFound => { if ( selectorList.length === 0 ) { - uboLog(`trusted-click-element: Completed`); + safe.uboLog(logPrefix, 'Completed'); return terminate(); } const tnow = Date.now(); if ( tnow >= tbye ) { - uboLog(`trusted-click-element: Timed out`); + safe.uboLog(logPrefix, 'Timed out'); return terminate(); } if ( notFound ) { observe(); } @@ -4195,7 +4496,7 @@ function trustedClickElement( next.timer = undefined; process(); }, delay); - uboLog(`trusted-click-element: Waiting for ${selectorList[0]}...`); + safe.uboLog(logPrefix, `Waiting for ${selectorList[0]}...`); }; next.stop = ( ) => { if ( next.timer === undefined ) { return; } @@ -4239,7 +4540,7 @@ function trustedClickElement( selectorList.unshift(selector); return next(true); } - uboLog(`trusted-click-element: Clicked ${selector}`); + safe.uboLog(logPrefix, `Clicked ${selector}`); elem.click(); tnext += clickDelay; next(); @@ -4336,40 +4637,67 @@ builtinScriptlets.push({ fn: trustedPruneOutboundObject, dependencies: [ 'object-prune.fn', + 'proxy-apply.fn', 'safe-self.fn', ], }); function trustedPruneOutboundObject( - entryPoint = '', + propChain = '', rawPrunePaths = '', rawNeedlePaths = '' ) { - if ( entryPoint === '' ) { return; } - let context = globalThis; - let prop = entryPoint; - for (;;) { - const pos = prop.indexOf('.'); - if ( pos === -1 ) { break; } - context = context[prop.slice(0, pos)]; - if ( context instanceof Object === false ) { return; } - prop = prop.slice(pos+1); - } - if ( typeof context[prop] !== 'function' ) { return; } + if ( propChain === '' ) { return; } const safe = safeSelf(); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - context[prop] = new Proxy(context[prop], { - apply: function(target, thisArg, args) { - const objBefore = Reflect.apply(target, thisArg, args); - if ( objBefore instanceof Object === false ) { return objBefore; } - const objAfter = objectPruneFn( - objBefore, - rawPrunePaths, - rawNeedlePaths, - { matchAll: true }, - extraArgs - ); - return objAfter || objBefore; - }, + const reflector = proxyApplyFn(propChain, function(...args) { + const objBefore = reflector(...args); + if ( objBefore instanceof Object === false ) { return objBefore; } + const objAfter = objectPruneFn( + objBefore, + rawPrunePaths, + rawNeedlePaths, + { matchAll: true }, + extraArgs + ); + return objAfter || objBefore; + }); +} + +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'trusted-replace-argument.js', + requiresTrust: true, + fn: trustedReplaceArgument, + dependencies: [ + 'proxy-apply.fn', + 'safe-self.fn', + 'validate-constant.fn', + ], +}); +function trustedReplaceArgument( + propChain = '', + argpos = '', + argraw = '' +) { + if ( propChain === '' ) { return; } + if ( argpos === '' ) { return; } + if ( argraw === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argpos, argraw); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const normalValue = validateConstantFn(true, argraw); + const reCondition = extraArgs.condition + ? safe.patternToRegex(extraArgs.condition) + : /^/; + const reflector = proxyApplyFn(propChain, function(...args) { + const arglist = args[args.length-1]; + if ( Array.isArray(arglist) === false ) { return reflector(...args); } + const argBefore = arglist[argpos]; + if ( reCondition.test(argBefore) === false ) { return reflector(...args); } + arglist[argpos] = normalValue; + safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${normalValue}`); + return reflector(...args); }); } diff --git a/dist/chromium/publish-beta.py b/dist/chromium/publish-beta.py index 5a6e19f..a731e9b 100755 --- a/dist/chromium/publish-beta.py +++ b/dist/chromium/publish-beta.py @@ -43,9 +43,9 @@ github_owner = 'gorhill' github_repo = 'uBlock' # Load/save auth secrets -# The build directory is excluded from git +# The tmp directory is excluded from git ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') +ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets') if os.path.isfile(ubo_secrets_filename): with open(ubo_secrets_filename) as f: ubo_secrets = json.load(f) diff --git a/dist/firefox/publish-signed-beta.py b/dist/firefox/publish-signed-beta.py index 2e56d12..ed542ef 100755 --- a/dist/firefox/publish-signed-beta.py +++ b/dist/firefox/publish-signed-beta.py @@ -69,9 +69,9 @@ github_owner = 'gorhill' github_repo = 'uBlock' # Load/save auth secrets -# The build directory is excluded from git +# The tmp directory is excluded from git ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') +ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets') if os.path.isfile(ubo_secrets_filename): with open(ubo_secrets_filename) as f: ubo_secrets = json.load(f) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 880063f..0eab531 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.54.1.102", + "version": "1.56.1.105", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.54.1rc2/uBlock0_1.54.1rc2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.56.1rc5/uBlock0_1.56.1rc5.firefox.signed.xpi" } ] } diff --git a/dist/mv3/firefox/publish-signed-beta.py b/dist/mv3/firefox/publish-signed-beta.py index 0c5f8cd..f298cc8 100755 --- a/dist/mv3/firefox/publish-signed-beta.py +++ b/dist/mv3/firefox/publish-signed-beta.py @@ -64,9 +64,9 @@ github_owner = 'gorhill' github_repo = 'uBlock' # Load/save auth secrets -# The build directory is excluded from git +# The tmp directory is excluded from git ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') +ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets') if os.path.isfile(ubo_secrets_filename): with open(ubo_secrets_filename) as f: ubo_secrets = json.load(f) diff --git a/dist/version b/dist/version index 094d6ad..373aea9 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.55.0 +1.57.0 diff --git a/platform/chromium/manifest.json b/platform/chromium/manifest.json index 28ceec5..df686a0 100644 --- a/platform/chromium/manifest.json +++ b/platform/chromium/manifest.json @@ -30,6 +30,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ @@ -94,6 +97,7 @@ "open_in_tab": true }, "permissions": [ + "alarms", "contextMenus", "privacy", "storage", diff --git a/platform/chromium/webext.js b/platform/chromium/webext.js index 851b653..f044649 100644 --- a/platform/chromium/webext.js +++ b/platform/chromium/webext.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - // `webext` is a promisified api of `chrome`. Entries are added as // the promisification of uBO progress. @@ -54,6 +52,15 @@ const promisify = function(thisArg, fnName) { }; const webext = { + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/alarms + alarms: { + clear: promisifyNoFail(chrome.alarms, 'clear'), + clearAll: promisifyNoFail(chrome.alarms, 'clearAll'), + create: promisifyNoFail(chrome.alarms, 'create'), + get: promisifyNoFail(chrome.alarms, 'get'), + getAll: promisifyNoFail(chrome.alarms, 'getAll'), + onAlarm: chrome.alarms.onAlarm, + }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction browserAction: { setBadgeBackgroundColor: promisifyNoFail(chrome.browserAction, 'setBadgeBackgroundColor'), @@ -95,6 +102,7 @@ const webext = { query: promisifyNoFail(chrome.tabs, 'query', tabs => Array.isArray(tabs) ? tabs : []), reload: promisifyNoFail(chrome.tabs, 'reload'), remove: promisifyNoFail(chrome.tabs, 'remove'), + sendMessage: promisifyNoFail(chrome.tabs, 'sendMessage'), update: promisifyNoFail(chrome.tabs, 'update', tab => tab instanceof Object ? tab : null), }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation diff --git a/platform/common/vapi-background.js b/platform/common/vapi-background.js index 0d6fcdd..2ff99ac 100644 --- a/platform/common/vapi-background.js +++ b/platform/common/vapi-background.js @@ -87,6 +87,19 @@ vAPI.app = { }, }; +/******************************************************************************/ + +// Generate segments of random six alphanumeric characters, thus one segment +// is a value out of 36^6 = over 2x10^9 values. + +vAPI.generateSecret = (size = 1) => { + let secret = ''; + while ( size-- ) { + secret += (Math.floor(Math.random() * 2176782336) + 2176782336).toString(36).slice(1); + } + return secret; +}; + /******************************************************************************* * * https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/storage/session @@ -96,9 +109,9 @@ vAPI.app = { * * */ -vAPI.sessionStorage = { +vAPI.sessionStorage = browser.storage.session || { get() { - return Promise.resolve({}); + return Promise.resolve(); }, set() { return Promise.resolve(); @@ -109,7 +122,7 @@ vAPI.sessionStorage = { clear() { return Promise.resolve(); }, - implemented: false, + unavailable: true, }; /******************************************************************************* @@ -124,46 +137,21 @@ vAPI.sessionStorage = { vAPI.storage = { get(key, ...args) { - if ( vAPI.sessionStorage.implemented !== true ) { - return webext.storage.local.get(key, ...args).catch(reason => { - console.log(reason); - }); - } - return vAPI.sessionStorage.get(key, ...args).then(bin => { - const size = Object.keys(bin).length; - if ( size === 1 && typeof key === 'string' && bin[key] === null ) { - return {}; - } - if ( size !== 0 ) { return bin; } - return webext.storage.local.get(key, ...args).then(bin => { - if ( bin instanceof Object === false ) { return bin; } - // Mirror empty result as null value in order to prevent - // from falling back to storage.local when there is no need. - const tomirror = Object.assign({}, bin); - if ( typeof key === 'string' && Object.keys(bin).length === 0 ) { - Object.assign(tomirror, { [key]: null }); - } - vAPI.sessionStorage.set(tomirror); - return bin; - }).catch(reason => { - console.log(reason); - }); + return webext.storage.local.get(key, ...args).catch(reason => { + console.log(reason); }); }, set(...args) { - vAPI.sessionStorage.set(...args); return webext.storage.local.set(...args).catch(reason => { console.log(reason); }); }, remove(...args) { - vAPI.sessionStorage.remove(...args); return webext.storage.local.remove(...args).catch(reason => { console.log(reason); }); }, clear(...args) { - vAPI.sessionStorage.clear(...args); return webext.storage.local.clear(...args).catch(reason => { console.log(reason); }); @@ -328,10 +316,10 @@ vAPI.Tabs = class { }); } - async executeScript() { + async executeScript(...args) { let result; try { - result = await webext.tabs.executeScript(...arguments); + result = await webext.tabs.executeScript(...args); } catch(reason) { } @@ -445,22 +433,26 @@ vAPI.Tabs = class { // For some reasons, some platforms do not honor the left,top // position when specified. I found that further calling // windows.update again with the same position _may_ help. + // + // https://github.com/uBlockOrigin/uBlock-issues/issues/2249 + // Mind that the creation of the popup window might fail. if ( details.popup !== undefined && vAPI.windows instanceof Object ) { - const createDetails = { + const basicDetails = { url: details.url, type: details.popup, }; - if ( details.box instanceof Object ) { - Object.assign(createDetails, details.box); + const shouldRestorePosition = details.box instanceof Object; + const extraDetails = shouldRestorePosition + ? Object.assign({}, basicDetails, details.box) + : basicDetails; + const win = await vAPI.windows.create(extraDetails); + if ( win === null ) { + if ( shouldRestorePosition === false ) { return; } + return vAPI.windows.create(basicDetails); } - const win = await vAPI.windows.create(createDetails); - if ( win === null ) { return; } - if ( details.box instanceof Object === false ) { return; } - if ( - win.left === details.box.left && - win.top === details.box.top - ) { - return; + if ( shouldRestorePosition === false ) { return; } + if ( win.left === details.box.left ) { + if ( win.top === details.box.top ) { return; } } vAPI.windows.update(win.id, { left: details.box.left, @@ -556,7 +548,7 @@ vAPI.Tabs = class { targetURL = vAPI.getURL(targetURL); } - vAPI.tabs.update(tabId, { url: targetURL }); + return vAPI.tabs.update(tabId, { url: targetURL }); } async remove(tabId) { @@ -1165,11 +1157,6 @@ vAPI.messaging = { // Support using a new secret for every network request. { - // Generate a 6-character alphanumeric string, thus one random value out - // of 36^6 = over 2x10^9 values. - const generateSecret = ( ) => - (Math.floor(Math.random() * 2176782336) + 2176782336).toString(36).slice(1); - const root = vAPI.getURL('/'); const reSecret = /\?secret=(\w+)/; const shortSecrets = []; @@ -1207,7 +1194,7 @@ vAPI.messaging = { } } lastShortSecretTime = Date.now(); - const secret = generateSecret(); + const secret = vAPI.generateSecret(); shortSecrets.push(secret); return secret; }, @@ -1215,7 +1202,7 @@ vAPI.messaging = { if ( previous !== undefined ) { longSecrets.delete(previous); } - const secret = `${generateSecret()}${generateSecret()}${generateSecret()}`; + const secret = vAPI.generateSecret(3); longSecrets.add(secret); return secret; }, @@ -1663,10 +1650,7 @@ vAPI.cloud = (( ) => { const push = async function(details) { const { datakey, data, encode } = details; - if ( - data === undefined || - typeof data === 'string' && data === '' - ) { + if ( data === undefined || typeof data === 'string' && data === '' ) { return deleteChunks(datakey, 0); } const item = { @@ -1674,10 +1658,9 @@ vAPI.cloud = (( ) => { tstamp: Date.now(), data, }; - const json = JSON.stringify(item); const encoded = encode instanceof Function - ? await encode(json) - : json; + ? await encode(item) + : JSON.stringify(item); // Chunkify taking into account QUOTA_BYTES_PER_ITEM: // https://developer.chrome.com/extensions/storage#property-sync @@ -1742,13 +1725,16 @@ vAPI.cloud = (( ) => { i += 1; } encoded = encoded.join(''); - const json = decode instanceof Function - ? await decode(encoded) - : encoded; + let entry = null; try { - entry = JSON.parse(json); - } catch(ex) { + if ( decode instanceof Function ) { + entry = await decode(encoded) || null; + } + if ( typeof entry === 'string' ) { + entry = JSON.parse(entry); + } + } catch(_) { } return entry; }; @@ -1797,15 +1783,24 @@ vAPI.cloud = (( ) => { /******************************************************************************/ /******************************************************************************/ -vAPI.alarms = browser.alarms || { - create() { +vAPI.alarms = { + create(...args) { + webext.alarms.create(...args); }, - clear() { + createIfNotPresent(name, ...args) { + webext.alarms.get(name).then(details => { + if ( details !== undefined ) { return; } + webext.alarms.create(name, ...args); + }); + }, + async clear(...args) { + return webext.alarms.clear(...args); }, onAlarm: { - addListener() { - } - } + addListener(...args) { + webext.alarms.onAlarm.addListener(...args); + }, + }, }; /******************************************************************************/ diff --git a/platform/common/vapi-client.js b/platform/common/vapi-client.js index 9375e88..a6d46c6 100644 --- a/platform/common/vapi-client.js +++ b/platform/common/vapi-client.js @@ -22,10 +22,6 @@ // For non-background page -/* globals browser */ - -'use strict'; - /******************************************************************************/ // https://github.com/chrisaljoudi/uBlock/issues/456 @@ -85,6 +81,7 @@ vAPI.messaging = { portTimerDelay: 10000, msgIdGenerator: 1, pending: new Map(), + waitStartTime: 0, shuttingDown: false, shutdown: function() { @@ -115,16 +112,11 @@ vAPI.messaging = { // revisited to isolate the picker dialog DOM from the page DOM. messageListener: function(details) { if ( typeof details !== 'object' || details === null ) { return; } - - // Response to specific message previously sent - if ( details.msgId !== undefined ) { - const resolver = this.pending.get(details.msgId); - if ( resolver !== undefined ) { - this.pending.delete(details.msgId); - resolver(details.msg); - return; - } - } + if ( details.msgId === undefined ) { return; } + const resolver = this.pending.get(details.msgId); + if ( resolver === undefined ) { return; } + this.pending.delete(details.msgId); + resolver(details.msg); }, messageListenerBound: null, @@ -203,13 +195,18 @@ vAPI.messaging = { // the main process is no longer reachable: memory leaks and bad // performance become a risk -- especially for long-lived, dynamic // pages. Guard against this. - if ( this.pending.size > 50 ) { - vAPI.shutdown.exec(); + if ( this.pending.size > 64 ) { + if ( (Date.now() - this.waitStartTime) > 60000 ) { + vAPI.shutdown.exec(); + } } const port = this.getPort(); if ( port === null ) { return Promise.resolve(); } + if ( this.pending.size === 0 ) { + this.waitStartTime = Date.now(); + } const msgId = this.msgIdGenerator++; const promise = new Promise(resolve => { this.pending.set(msgId, resolve); diff --git a/platform/firefox/manifest.json b/platform/firefox/manifest.json index 4ee0b56..db021f2 100644 --- a/platform/firefox/manifest.json +++ b/platform/firefox/manifest.json @@ -43,6 +43,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ diff --git a/platform/mv3/description/webstore.be.txt b/platform/mv3/description/webstore.be.txt index e03fa80..d5a2e98 100644 --- a/platform/mv3/description/webstore.be.txt +++ b/platform/mv3/description/webstore.be.txt @@ -27,4 +27,4 @@ Keep in mind this is still a work in progress, with these end goals: - No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. -- Entirely declarative for reliability and CPU/memory efficiency. +- Цалкам дэкларатыўная ацэнка надзейнасці і эфектыўнасці работы працэсара/памяці. diff --git a/platform/mv3/description/webstore.br_FR.txt b/platform/mv3/description/webstore.br_FR.txt index bfc4ce6..0335493 100644 --- a/platform/mv3/description/webstore.br_FR.txt +++ b/platform/mv3/description/webstore.br_FR.txt @@ -1,4 +1,4 @@ -uBO Lite (uBOL) zo ur stanker noazadurioù *hep aotreoù* diazezet war ar manifesto MV3. +uBO Lite (uBOL) zo ur stanker noazadurioù *hep aotre rekis ebet* diazezet war ar manifesto MV3. Ar reolennoù dre ziouer a glot gant silañ dre ziouer uBlock Origin: diff --git a/platform/mv3/description/webstore.cy.txt b/platform/mv3/description/webstore.cy.txt new file mode 100644 index 0000000..e03fa80 --- /dev/null +++ b/platform/mv3/description/webstore.cy.txt @@ -0,0 +1,30 @@ +uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. + +The default ruleset corresponds to uBlock Origin's default filterset: + +- uBlock Origin's built-in filter lists +- EasyList +- EasyPrivacy +- Peter Lowe’s Ad and tracking server list + +You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. + +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. + +uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. + +However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. + +To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. + +The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. + +If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. + +You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. + +Keep in mind this is still a work in progress, with these end goals: + +- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. + +- Entirely declarative for reliability and CPU/memory efficiency. diff --git a/platform/mv3/description/webstore.et.txt b/platform/mv3/description/webstore.et.txt index d3bf236..520e4ce 100644 --- a/platform/mv3/description/webstore.et.txt +++ b/platform/mv3/description/webstore.et.txt @@ -17,14 +17,14 @@ Kuid uBOL võimaldab *selgesõnaliselt* anda täpsemaid lubasid teie valitud vee Veebilehele täpsustatud lubade andmiseks ava hüpikpaneel ja vali põhjalikum filtreerimisrežiim, näiteks Optimaalne või Põhjalik. -Seejärel hoiatab brauser teid praeguse saidi laienduse taotletud täiendavate õiguste andmise tagajärgede eest ja peate brauserile ütlema, kas nõustute taotlusega või keeldute sellest. +Seejärel hoiatab veebilehitseja praeguse veebilehe laienduse taotletud täiendavate õiguste andmise tagajärgede eest ja peate veebilehitsejale ütlema, kas nõustute taotlusega või keeldute sellest. -Kui nõustute uBOLi taotlusega täiendavate õiguste saamiseks praegusel saidil, saab see praeguse saidi sisu paremini filtreerida. +Kui nõustute uBOLi taotlusega täiendavate õiguste saamiseks praegusel veebilehel, saab see praeguse veebilehe sisu paremini filtreerida. -Vaikimisi filtreerimisrežiimi saate määrata uBOLi suvandite lehelt Kui määrate optimaalse või põhjaliku režiimi tavaliseks, peate andma uBOLile loa kõikide veebilehtede andmete lugemiseks ja muutmiseks. +Fltreerimise tavarežiimi saate määrata uBOLi valikute lehelt. Kui määrate optimaalse või põhjaliku režiimi tavaliseks, peate andma uBOLile loa kõikide veebilehtede andmete lugemiseks ja muutmiseks. -Pidage meeles, et see on veel pooleliolev töö, mille lõppeesmärgid on järgmised: +Pidage meeles, et see on veel arendamisel, mille lõppeesmärgid on järgmised: -- Installimise ajal laialdased hostiõigused puuduvad – kasutaja annab laiendatud load selgesõnaliselt saidipõhiselt. +- Paigaldamise ajal laialdased hostiõigused puuduvad – kasutaja annab laiendatud load selgesõnaliselt ja veebilehe põhiselt. - Täiesti deklaratiivne töökindluse ja protsessori/mälu tõhususe osas. diff --git a/platform/mv3/description/webstore.ms.txt b/platform/mv3/description/webstore.ms.txt index e03fa80..2a48cf6 100644 --- a/platform/mv3/description/webstore.ms.txt +++ b/platform/mv3/description/webstore.ms.txt @@ -1,30 +1,30 @@ -uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. +uBO Lite (uBOL) ialah penyekat kandungan berasaskan MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Set peraturan lalai sepadan dengan set penapis lalai uBlock Origin: -- uBlock Origin's built-in filter lists +- Senarai penapis terbina dalam uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list +- Senarai pelayan iklan dan penjejakan 'Peter Lowe' -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Anda boleh menambah lebih banyak set peraturan dengan melawat halaman pilihan -- klik the _Cogs_ icon pada panel timbul. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. +uBOL adalah deklaratif sepenuhnya, bermakna tidak ada keperluan untuk proses uBOL kekal untuk penapisan berlaku, dan penapisan kandungan berasaskan suntikan CSS/JS dilakukan sepenuhnya oleh penyemak imbas itu sendiri dan bukannya oleh sambungan. Ini bermakna uBOL sendiri tidak menggunakan sumber CPU/memori semasa penyekatan kandungan sedang berjalan -- proses pekerja perkhidmatan uBOL diperlukan _hanya_ apabila anda berinteraksi dengan panel timbul atau halaman pilihan. -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. +uBOL tidak memerlukan kebenaran "baca dan ubah suai data" yang luas pada masa pemasangan, oleh itu keupayaan terhadnya di luar kotak berbanding dengan uBlock Origin atau penyekat kandungan lain yang memerlukan kebenaran "baca dan ubah suai data" yang luas pada masa pemasangan. -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. +Walau bagaimanapun, uBOL membenarkan anda *dengan jelas* memberikan kebenaran lanjutan pada tapak tertentu pilihan anda supaya ia boleh menapis dengan lebih baik pada tapak tersebut menggunakan penapisan kosmetik dan suntikan skrip. -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. +Untuk memberikan kebenaran lanjutan pada tapak tertentu, buka panel timbul dan pilih mod penapisan yang lebih tinggi seperti Optimum atau Lengkap. -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. +Penyemak imbas kemudian akan memberi amaran kepada anda tentang kesan pemberian kebenaran tambahan yang diminta oleh sambungan pada tapak semasa dan anda perlu memberitahu penyemak imbas sama ada anda menerima atau menolak permintaan tersebut. -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. +Jika anda menerima permintaan uBOL untuk mendapatkan kebenaran tambahan pada tapak semasa, ia akan dapat menapis kandungan dengan lebih baik untuk tapak semasa. -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. +Anda boleh menetapkan mod penapisan lalai dari halaman pilihan 'uBOL'. Jika anda memilih mod Optimum atau Lengkap sebagai mod lalai, anda perlu memberikan uBOL kebenaran untuk membaca dan mengubah suai data pada semua tapak web. -Keep in mind this is still a work in progress, with these end goals: +Perlu diingat bahawa ini masih dalam proses, dengan matlamat akhir ini: -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. +- Tiada kebenaran hos pada masa pemasangan -- kebenaran lanjutan diberikan secara eksplisit oleh pengguna pada asas setiap tapak. -- Entirely declarative for reliability and CPU/memory efficiency. +- Deklaratif sepenuhnya untuk kebolehpercayaan dan kecekapan CPU/memori. diff --git a/platform/mv3/description/webstore.pl.txt b/platform/mv3/description/webstore.pl.txt index a65d0db..4f5c524 100644 --- a/platform/mv3/description/webstore.pl.txt +++ b/platform/mv3/description/webstore.pl.txt @@ -1,13 +1,13 @@ -uBO Lite (uBOL) to *niewymagający uprawnień* bloker treści bazujący na MV3. +uBO Lite (uBOL) to *niewymagający uprawnień* bloker treści oparty na MV3. Domyślny zestaw reguł odpowiada domyślnemu zestawowi filtrów uBlock Origin: -– wbudowane listy filtrów uBlock Origin +– wbudowane listy filtrów rozszerzenia uBlock Origin – EasyList – EasyPrivacy – lista serwerów śledzących i reklam Petera Lowe'a -Możesz dodać więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _Trybika_ w wyskakującym panelu. +Możesz dodać więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _koła zębatego_ w wyskakującym panelu. uBOL jest całkowicie deklaratywny, co oznacza, że nie jest potrzebny stały proces uBOL w celu filtrowania, a filtrowanie treści oparte na wstrzykiwaniu CSS/JS jest wykonywane niezawodnie przez samą przeglądarkę, a nie przez rozszerzenie. Oznacza to, że sam uBOL nie zużywa zasobów procesora/pamięci, gdy trwa blokowanie treści – proces Service Worker uBOL jest wymagany _tylko_ podczas interakcji z panelem wyskakującym lub stronami opcji. diff --git a/platform/mv3/description/webstore.pt_PT.txt b/platform/mv3/description/webstore.pt_PT.txt index f390d5d..fcd3823 100644 --- a/platform/mv3/description/webstore.pt_PT.txt +++ b/platform/mv3/description/webstore.pt_PT.txt @@ -7,7 +7,7 @@ O conjunto de regras padrão corresponde ao conjunto de filtros padrão do uBloc - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Pode adicionar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ no painel pop-up. +Pode adicionar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ na janela flutuante. O uBOL é totalmente declarativo, o que elimina a necessidade de um processo ativo constante para a filtragem ocorrer. A injeção de CSS e JS para filtragem de conteúdo é efetuada de maneira confiável pelo navegador, não dependendo da extensão. Isso significa que o uBOL por si só não gasta recursos de CPU/memória enquanto o bloqueio de conteúdo está a acontecer -- o processo do trabalhador de serviço do uBOL é necessário apenas quando se interage com a janela flutuante ou as páginas de opções. @@ -25,6 +25,6 @@ Pode definir o modo de filtragem padrão na página de opções do uBOL. Se esco Tenha em mente que este ainda é um trabalho em curso, com estes objetivos finais: -Sem permissões amplas de anfitrião no momento da instalação -- permissões estendidas são concedidas explicitamente pelo utilizador numa base por site. +- Sem permissões amplas de anfitrião no momento da instalação -- permissões estendidas são concedidas explicitamente pelo utilizador numa base por site. - Totalmente declarativo para fiabilidade e eficiência de CPU/memória diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index d907faa..6b6b476 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "إعادة تحميل الصفحة تلقائيًا عند تغيير وضع التصفية", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "إظهار عدد الطلبات المحظورة على أيقونة شريط الأدوات", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 59b7d81..deef8d2 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index 795f961..3e96e72 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Аўтаматычна абнаўляць старонку пры змене рэжыму фільтравання", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index c440a4b..f4606dd 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Автоматично презареждане на страницата при промяна на режима на филтриране", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показване на брояч в иконката за блокираните заявки", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index ba12b5d..1232fc7 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -16,7 +16,7 @@ "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { - "message": "পছন্দসমূহ", + "message": "সেটিংস", "description": "appears as tab name in dashboard" }, "aboutPageName": { @@ -116,7 +116,7 @@ "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "ছাঁকনি নেই", + "message": "ফিল্টারিং নেই", "description": "Name of blocking mode 0" }, "filteringMode1Name": { @@ -152,7 +152,11 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "ফিল্টারিং মোড পরিবর্তন করার সময় স্বয়ংক্রিয়ভাবে পেজ পুনরায় লোড করুন", + "message": "ফিল্টারিং মোড পরিবর্তন করার সময় স্বয়ংক্রিয়ভাবে পুনরায় লোড করুন", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 48f7013..3039596 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -88,7 +88,7 @@ "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Troidigezhioù", + "message": "Treiñ", "description": "Link text to translations repo" }, "aboutFilterLists": { @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Roll eus anvioù domanioù el-lec'h ne vo silañ ebet", + "message": "Roll anvioù domanioù ha ne vint ket silet.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Adkargañ ar bajenn ent-emgefreek pa vez cheñchet an doare silañ", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Diskouez an niver a rekedoù bet stanket war arouez ar varrenn-ostilhoù", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index 14e847d..ab768f6 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatski ponovo učitajte stranicu prilikom promjene načina filtriranja", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index abe76eb..5e1f1eb 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recarrega automàticament la pàgina quan canvieu el mode de filtratge", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostra el nombre de sol·licituds blocades a la icona de la barra d'eines", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index abc5164..db051f0 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Experimentální blokátor obsahu vyžadující méně oprávnění. Blokuje reklamy, sledovače, těžaře a jiné ihned po instalaci.", + "message": "Blokátor obsahu vyžadující méně oprávnění. Blokuje reklamy, sledovače, těžaře a jiné ihned po instalaci.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -80,7 +80,7 @@ "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Přispívající", + "message": "Přispěvatelé", "description": "English: Contributors" }, "aboutSourceCode": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automaticky znovu načíst stránku při změně filtrovacího režimu", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Zobrazit počet blokovaných požadavků u ikony v panelu nástrojů", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json new file mode 100644 index 0000000..c9d0e36 --- /dev/null +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -0,0 +1,162 @@ +{ + "extName": { + "message": "uBlock Origin Lite", + "description": "extension name." + }, + "extShortDesc": { + "message": "Rhwystrydd cynnwys nad yw'n gofyn am hawliau. Rhwystrwch hysbysebion, tracwyr, cloddwyr, a mwy, yn syth ar ôl gosod.", + "description": "this will be in the Chrome web store: must be 132 characters or less" + }, + "perRulesetStats": { + "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "description": "Appears aside each filter list in the _3rd-party filters_ pane" + }, + "dashboardName": { + "message": "uBO Lite — Dashfwrdd", + "description": "English: uBO Lite — Dashboard" + }, + "settingsPageName": { + "message": "Gosodiadau", + "description": "appears as tab name in dashboard" + }, + "aboutPageName": { + "message": "Ynghylch", + "description": "appears as tab name in dashboard" + }, + "aboutPrivacyPolicy": { + "message": "Polisi preifatrwydd", + "description": "Link to privacy policy on GitHub (English)" + }, + "popupFilteringModeLabel": { + "message": "modd hidlo", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupTipDashboard": { + "message": "Agor y dashfwrdd", + "description": "English: Click to open the dashboard" + }, + "popupMoreButton": { + "message": "Mwy", + "description": "Label to be used to show popup panel sections" + }, + "popupLessButton": { + "message": "Llai", + "description": "Label to be used to hide popup panel sections" + }, + "3pGroupDefault": { + "message": "Default", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAds": { + "message": "Hysbysebion", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupPrivacy": { + "message": "Preifatrwydd", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMalware": { + "message": "Malware domains", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAnnoyances": { + "message": "Pethau diflas", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMisc": { + "message": "Amrywiol", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupRegions": { + "message": "Rhanbarthau, ieithoedd", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "aboutChangelog": { + "message": "Cofnod newidiadau", + "description": "" + }, + "aboutCode": { + "message": "Cod ffynhonnell (GPLv3)", + "description": "English: Source code (GPLv3)" + }, + "aboutContributors": { + "message": "Cyfranwyr", + "description": "English: Contributors" + }, + "aboutSourceCode": { + "message": "Cod ffynhonnell", + "description": "Link text to source code repo" + }, + "aboutTranslations": { + "message": "Cyfieithiadau", + "description": "Link text to translations repo" + }, + "aboutFilterLists": { + "message": "Rhestri hidlo", + "description": "Link text to uBO's own filter lists repo" + }, + "aboutDependencies": { + "message": "Gofynion allanol (cydnaws â GPLv3):", + "description": "Shown in the About pane" + }, + "firstRunSectionLabel": { + "message": "Croeso", + "description": "The header text for the welcome message section" + }, + "firstRunDescription": { + "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, <em>Basic</em> mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "description": "Descriptive text shown at first install time only " + }, + "defaultFilteringModeSectionLabel": { + "message": "Default filtering mode", + "description": "The header text for the default filtering mode section" + }, + "defaultFilteringModeDescription": { + "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "description": "This describes the default filtering mode setting" + }, + "filteringMode0Name": { + "message": "dim hidlo", + "description": "Name of blocking mode 0" + }, + "filteringMode1Name": { + "message": "sylfaenol", + "description": "Name of blocking mode 1" + }, + "filteringMode2Name": { + "message": "priodol", + "description": "Name of blocking mode 2" + }, + "filteringMode3Name": { + "message": "cyflawn", + "description": "Name of blocking mode 3" + }, + "basicFilteringModeDescription": { + "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "description": "This describes the 'basic' filtering mode" + }, + "optimalFilteringModeDescription": { + "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "description": "This describes the 'optimal' filtering mode" + }, + "completeFilteringModeDescription": { + "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "description": "This describes the 'complete' filtering mode" + }, + "noFilteringModeDescription": { + "message": "List of hostnames for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "behaviorSectionLabel": { + "message": "Ymddygiad", + "description": "The header text for the 'Behavior' section" + }, + "autoReloadLabel": { + "message": "Ail-lwytho tudalen ar ôl newid y modd hidlo", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + } +} diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 7f628ab..ae494fe 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste over værtsnavne, for hvilke ingen filtrering vil ske", + "message": "Liste over værtsnavne, for hvilke ingen filtrering vil ske.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatisk sidegenindlæsning ved skift af filtreringstilstand", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Vis antallet af blokerede forespørgsler på værktøjsbjælkeikonet", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 1e014df..13829f3 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste der Hostnamen, für die nicht gefiltert wird", + "message": "Liste der Hostnamen, für die nicht gefiltert wird.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Seite beim Ändern des Filtermodus automatisch neu laden", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Anzahl der blockierten Anfragen auf dem Symbol in der Symbolleiste anzeigen", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index cc8c204..8e3bc5e 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Αυτόματη επαναφόρτωση σελίδας κατά την αλλαγή λειτουργίας φιλτραρίσματος", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Εμφάνιση του αριθμού των αποκλεισμένων αιτημάτων στο εικονίδιο της γραμμής εργαλείων", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 6725ba1..878f3cc 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index b935137..884d7c1 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index 9e86eea..ba5cfde 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 1bf7af5..53ff70b 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista de nombres de host para los cuales no tendrá lugar el filtrado", + "message": "Lista de nombres de dominio para los cuales no se realizará ningún filtrado.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recargar automáticamente la página al cambiar el modo de filtrado", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar el número de peticiones bloqueadas en el icono de la barra de herramientas", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 92e5952..69f6aa2 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Leht laadib ise uuesti filtreerimisrežiimi muutmisel", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Kuva tööriistariba ikoonil blokeeritud elementide arv", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index 386468f..aa48a0a 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Probatako eta baimenik behar ez duen eduki-blokeatzailea. Iragarkiak, jarraitzeko tresnak, eta gehiago instalatzean bertan [...]", + "message": "Probatako eta baimenik behar ez duen eduki-blokeatzailea. Iragarkiak, jarraitzeko tresnak, eta gehiago instalatzean bertan.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "Filtrorik ezarriko ez zaien zerbitzarien izenak", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Orria automatikoki kargatuko da iragazteko modua aldatuko denean", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index b0ed662..900a492 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 44ac9b0..05d4211 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Lataa sivu suodatustilan vaihtuessa automaattisesti uudelleen", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Näytä estettyjen pyyntöjen määrä työkalupalkin kuvakkeessa", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index 68025d2..fe5daa4 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Awtomatikong i-reload ang pahina kapag binago ang mode sa pagfi-filter", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index 2f6a837..0152c8e 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste des noms de domaine pour lesquels aucun filtrage n'aura lieu", + "message": "Liste des noms de domaine qu'uBO Lite ne devra pas filtrer", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recharger automatiquement la page lors du changement de mode de filtrage", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Afficher le nombre de requêtes bloquées sur l'icône", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 606fc0a..f583e4b 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Side automatysk fernije by wizigjen fan filtermodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "It tal blokkearre oanfragen op it arkbalkepiktogram toane", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 460bdb8..760c65c 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recargar automáticamente a páxina a cambiar o modo de filtrado", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar na icona da barra o número de peticións bloqueadas", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 3782fdb..beb73f2 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -20,7 +20,7 @@ "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "אודות", + "message": "על אודות", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "טעינת עמוד באופן אוטומטי עם שינוי מצב סינון", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "הצגת מספר הבקשות החסומות על הסמל", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 89ed004..244acb8 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -20,7 +20,7 @@ "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "परिचय", + "message": "जानकारी", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { @@ -72,11 +72,11 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "परिवर्तन लॉग", + "message": "परिवर्तन पत्र", "description": "" }, "aboutCode": { - "message": "सोर्स कोड {GPLv3}", + "message": "सोर्स कोड (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "फ़िल्टरिंग मोड बदलते समय स्वचालित रूप से पृष्ठ पुनः लोड करें", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "टूलबार आइकन पर अवरुद्ध अनुरोधों की संख्या दिखाएं", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 14c9401..2ae0291 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Popis naziva hostova za koje se neće izvršiti filtriranje", + "message": "Popis naziva hostova za koje se neće izvršiti filtriranje.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatski ponovno učitaj stranicu pri promjeni načina filtriranja", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Prikaži broj blokiranih zahtjeva na ikoni alatne trake", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 5fe25d2..3ec2b0e 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Az oldal automatikus újratöltése a szűrési mód megváltoztatásakor", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Blokkolt kérések számának megjelenítése az eszköztárikonon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 50b9b44..7defd2e 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Զտման ռեժիմը փոխելիս ինքնաշխատորեն վերաբեռնել էջը", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index e3c6f69..a71f966 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Otomatis memuat ulang halaman web saat mengubah mode filter", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 04c500e..beea941 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -8,11 +8,11 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} regole, convertite da {{filterCount}} filtri di rete", + "message": "{{ruleCount}} Regole, convertite da {{filterCount}} filtri di rete", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Cruscotto", + "message": "uBO Lite — Pannello di controllo", "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipDashboard": { - "message": "Accedi al cruscotto", + "message": "Apri il pannello di controllo", "description": "English: Click to open the dashboard" }, "popupMoreButton": { @@ -44,7 +44,7 @@ "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { - "message": "Predefinite", + "message": "Predefiniti", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Scocciature", + "message": "Disturbi", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Ricarica la pagina quando scegli un altro metodo di filtraggio", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostra il numero di richieste bloccate sull'icona nella barra degli strumenti", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index fe679dc..ea15fdd 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "フィルタリングモード変更時にページを自動再読み込みする", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "ブロックしたリクエストの数をツールバーのアイコンに表示", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 298a736..c728583 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "გვერდის ავტომატური განახლება ფილტრაციის რეჟიმის შეცვლისას", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 627857e..30c578f 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "A permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "ಅನುಮತಿ-ಕಡಿಮೆ ವಿಷಯ ಬ್ಲಾಕರ್. ಅನುಸ್ಥಾಪನೆಯ ತಕ್ಷಣವೇ ಜಾಹೀರಾತುಗಳು, ಟ್ರ್ಯಾಕರ್ಗಳು, ಗಣಿಗಾರರು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,19 +12,19 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "\nಯುಬಿಒ ಲೈಟ್ - ಡ್ಯಾಶ್ಬೋರ್ಡ್\n", "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { - "message": "Settings", + "message": "ಸಂಯೋಜನೆಗಳು", "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "About", + "message": "ಬಗ್ಗೆ", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "ಗೌಪ್ಯತಾ ನೀತಿ\n", "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { @@ -32,27 +32,27 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipDashboard": { - "message": "Open the dashboard", + "message": "ಡ್ಯಾಶ್ಬೋರ್ಡ್ ತೆರೆಯಿರಿ", "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", + "message": "ಇನ್ನಷ್ಟು", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "ಕಡಿಮೆ", "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { - "message": "Default", + "message": "ಪೂರ್ವನಿಯೋಜಿತ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "ಜಾಹೀರಾತುಗಳು", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "ಗೌಪ್ಯತೆ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { @@ -64,15 +64,15 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "ವಿವಿಧ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "ಪ್ರದೇಶಗಳು, ಭಾಷೆಗಳು\n", "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "Changelog", + "message": "ಬದಲಾವಣೆಗಳು", "description": "" }, "aboutCode": { @@ -84,15 +84,15 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "ಮೂಲ ಕೊಡ್", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "ಅನುವಾದ", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿಗಳು", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -100,7 +100,7 @@ "description": "Shown in the About pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "ಸ್ವಾಗತ", "description": "The header text for the welcome message section" }, "firstRunDescription": { @@ -120,7 +120,7 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "ಸಾಮಾನ್ಯ", "description": "Name of blocking mode 1" }, "filteringMode2Name": { @@ -128,7 +128,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "ಪೂರ್ಣ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index 5942fce..d066b63 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "필터링 모드를 변경할 때 페이지 자동 새로고침", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "차단된 요청 개수를 도구 모음 아이콘에 표시", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index 0377c08..3f0bad8 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatiškai perkrauti sveitane keičiant filtro rėžimą", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index bea58f2..a37ba6d 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Pārlādēt lapu pēc aizturēšanas veida nomaiņas.", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Rādīt aizturēto pieprasījumu skaitu rīkjoslas ikonā", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 0ef10c7..cb7631b 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index d272672..2bffd1a 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "ഫിൽട്ടറിംഗ് മോഡ് മാറ്റുമ്പോൾ പേജ് സ്വയമേവ റീലോഡ് ചെയ്യുക", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 2128e9b..817a81f 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -4,15 +4,15 @@ "description": "extension name." }, "extShortDesc": { - "message": "A permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Penyekat kandungan tanpa kebenaran. Menyekat iklan, penjejak, pelombong dan banyak lagi sebaik sahaja pemasangan.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "Peraturan {{ruleCount}}, ditukar daripada penapis rangkaian {{filterCount}}.", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Papan pemuka", "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { @@ -28,11 +28,11 @@ "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { - "message": "filtering mode", + "message": "mod penapisan", "description": "Label in the popup panel for the current filtering mode" }, "popupTipDashboard": { - "message": "Open the dashboard", + "message": "Buka papan pemuka", "description": "English: Click to open the dashboard" }, "popupMoreButton": { @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Kegusaran", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -104,15 +104,15 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, <em>Basic</em> mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "message": "Anda baru sahaja memasang uBO Lite. Di sini anda boleh memilih mod penapisan lalai untuk digunakan pada semua tapak web.\n\nSecara lalai, mod <em>Asas</em> dipilih kerana ia tidak memerlukan kebenaran untuk membaca dan mengubah suai data. Jika anda mempercayai uBO Lite, anda boleh memberikannya kebenaran untuk membaca dan mengubah suai data pada semua tapak web untuk mendayakan keupayaan penapisan yang lebih maju untuk semua tapak web secara lalai.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Mod penapisan lalai", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Mod penapisan lalai akan ditindih oleh mod penapisan setiap tapak web. Anda boleh melaraskan mod penapisan pada mana-mana tapak web tertentu mengikut mana-mana mod yang paling berkesan pada tapak web tersebut. Setiap mod mempunyai kelebihan dan kekurangannya.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -124,7 +124,7 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optima", + "message": "optimum", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -132,19 +132,19 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Penapisan rangkaian asas daripada senarai penapis yang dipilih.\n\nTidak memerlukan kebenaran untuk membaca dan mengubah suai data pada tapak web.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Penapisan rangkaian lanjutan ditambah penapisan lanjutan khusus daripada senarai penapis yang dipilih.\n\nMemerlukan kebenaran untuk membaca dan mengubah suai data pada semua tapak web.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Penapisan rangkaian lanjutan serta penapisan lanjutan khusus dan generik daripada senarai penapis yang dipilih.\n\nMemerlukan kebenaran untuk membaca dan mengubah suai data pada semua tapak web.\n\nPenapisan lanjutan generik boleh menyebabkan penggunaan sumber halaman web yang lebih tinggi.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "Senarai nama hos yang tiada penapisan akan berlaku", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -152,7 +152,11 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Muat semula halaman secara automatik apabila menukar mod penapisan", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 5c47f65..4b0accf 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatisk last side på nytt ved endring av filtreringsmodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Vis antall blokkerte forespørsler på vertøyslinje-ikonet", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index b83eeae..d73b801 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Pagina automatisch vernieuwen bij wijzigen van filtermodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Het aantal geblokkeerde aanvragen op het werkbalkpictogram tonen", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index 753c355..868cc48 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "ਫਿਲਫਰ ਕਰਨ ਦਾ ਢੰਗ ਬਦਲਣ ਦੇ ਬਾਅਦ ਸਫ਼ੇ ਨੂੰ ਆਪਣੇ-ਆਪ ਲੋਡ ਕਰੋ", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 07c7543..1c7b89f 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Eksperymentalny, niewymagający uprawnień bloker treści. Natychmiast po instalacji blokuje reklamy, moduły śledzące, koparki i nie tylko.", + "message": "Niewymagający uprawnień bloker treści. Natychmiast po instalacji blokuje reklamy, moduły śledzące, koparki i nie tylko.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatycznie wczytaj ponownie stronę po zmianie trybu filtrowania", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Wyświetlaj liczbę zablokowanych żądań na ikonie paska narzędzi", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index cb4e978..e6265ef 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recarregar a página automaticamente quando mudar o modo de filtragem", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar o número de solicitações bloqueadas no ícone da barra de ferramentas", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 4bd510a..511db27 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -140,11 +140,11 @@ "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Filtragem de rede avançada mais filtragem alargada específica e genérica a partir de listas de filtros selecionadas.\n\nRequer ampla permissão para ler e modificar dados em todos os websites.\n\nA filtragem alargada genérica pode causar uma maior utilização de recursos das páginas web.", + "message": "Filtragem de rede avançada acrescida de filtragem alargada específica e genérica a partir de listas de filtros selecionadas.\n\nRequer permissão ampla para ler e modificar dados em todos os websites.\n\nA filtragem alargada genérica pode causar uma maior utilização de recursos das páginas web.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista de nomes de anfitriões para os quais não será efetuada qualquer filtragem", + "message": "Lista de nomes de anfitriões para os quais não será efetuada qualquer filtragem.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Recarrega automaticamente a página ao mudar o modo de filtragem", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostra o número de pedidos bloqueados no ícone da barra de ferramentas", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index fb01a05..70f9bf6 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Reîncărcare automată a paginii la schimbarea modului de filtrare", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 0104b7c..f13511e 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Список имён хостов, для которых не будет производиться фильтрация", + "message": "Список имён хостов, для которых не будет производиться фильтрация.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Автоматически перезагружать страницу при изменении режима фильтрации", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показывать количество заблокированных запросов на иконке в панели инструментов", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 997c759..91ebfc9 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "Zoznam názvov hostiteľov s vylúčeným filtrovaním", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automaticky znova načítať stránku pri zmene režimu filtrovania", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Zobraziť počet zablokovaných požiadaviek na ikone rozšírenia", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index d390d8d..7b8c074 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Emrat e hosteve që nuk do të kalojnë në filtër", + "message": "Emrat e hosteve, që nuk do të kalojnë në filtër.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Freskoj automatikisht faqen kur ndryshoj mënyrën e filtrimit", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Shfaq numrin e kërkesave të bllokuara në ikonën e instrumenteve", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index 0900785..5680a04 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Аутоматски поново учитај страницу при промени режима филтрирања", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Прикажи број блокираних захтева на иконици на траци алата", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index fddcca5..5dcbfc9 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista över värdnamn för vilka ingen filtrering kommer att äga rum", + "message": "Lista över värdnamn som inte kommer att filtreras", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Ladda automatiskt om sidan när du byter filtreringsläge", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Visa antalet blockerade förfrågningar på verktygsfältsikonen", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 627857e..4bbb5e3 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index e263523..00008c2 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "ఫిల్టరింగ్ మోడ్ను మార్చేటప్పుడు పేజీని స్వయంచాలకంగా రీలోడ్ చేయండి", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 75f992a..8d523ba 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -88,7 +88,7 @@ "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "การแปลภาษา", + "message": "แปล", "description": "Link text to translations repo" }, "aboutFilterLists": { @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index b40f8a0..b4e4101 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Filtreleme modu değiştirildiğinde sayfayı yenile", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Engellenen isteklerin sayısını araç çubuğu simgesinde göster", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index b48a9bb..5bf1a04 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Автоматично оновити сторінку при зміні режиму фільтрування", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показувати кількість заблокованих запитів на піктограмі на панелі інструментів", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index e66c4a9..2705d51 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place", + "message": "List of hostnames for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 6ecd8cb..2c6d1f0 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "Tự động tải lại trang khi thay đổi chế độ bộ lọc", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Hiện số lượng yêu cầu bị chặn trên biểu tượng thanh công cụ", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index c11fdf7..793f3c8 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "更改过滤模式后自动刷新网页", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 7825bd5..99ebc62 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -154,5 +154,9 @@ "autoReloadLabel": { "message": "變更過濾模式時自動重新載入頁面", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "在工具列圖示上顯示被阻擋的連線請求的數量", + "description": "Label for a checkbox in the options page" } } diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index f03e276..2e727fc 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -22,6 +22,14 @@ p { white-space: pre-line; } +section > div { + padding: 0 var(--default-gap-xxsmall); + } + +#showBlockedCount:has(input[type="checkbox"][disabled]) { + opacity: 0.5; + } + #defaultFilteringMode { display: grid; gap: 1em; diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 698e1fb..d2dc918 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -25,6 +25,13 @@ </div> <!-- -------- --> <section data-pane="settings"> + <div> + <h3 data-i18n="behaviorSectionLabel"></h3> + <p><label id="autoReload" data-i18n="autoReloadLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label> + </p> + <p><label id="showBlockedCount" data-i18n="showBlockedCountLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label> + </div> + <div class="firstRun"> <h3 data-i18n="firstRunSectionLabel"></h3> <p data-i18n="firstRunDescription"></p> @@ -90,12 +97,6 @@ </div> <div> - <h3 data-i18n="behaviorSectionLabel"></h3> - <p><label id="autoReload" data-i18n="autoReloadLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label> - </p> - </div> - - <div> <h3 data-i18n="aboutFilterLists"></h3> <div> <p id="listsOfBlockedHostsPrompt"></p> diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 5ceacc4..e65775e 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -19,47 +19,43 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - /******************************************************************************/ import { + adminRead, browser, dnr, - runtime, localRead, localWrite, + runtime, sessionRead, sessionWrite, - adminRead, } from './ext.js'; import { - getRulesetDetails, + broadcastMessage, + ubolLog, +} from './utils.js'; + +import { defaultRulesetsFromLanguage, enableRulesets, getEnabledRulesetsDetails, + getRulesetDetails, updateDynamicRules, } from './ruleset-manager.js'; import { - registerInjectables, -} from './scripting-manager.js'; - -import { - getFilteringMode, - setFilteringMode, getDefaultFilteringMode, - setDefaultFilteringMode, + getFilteringMode, getTrustedSites, + setDefaultFilteringMode, + setFilteringMode, setTrustedSites, syncWithBrowserPermissions, } from './mode-manager.js'; import { - broadcastMessage, - ubolLog, -} from './utils.js'; + registerInjectables, +} from './scripting-manager.js'; /******************************************************************************/ @@ -67,10 +63,13 @@ const rulesetConfig = { version: '', enabledRulesets: [ 'default' ], autoReload: true, + showBlockedCount: true, }; const UBOL_ORIGIN = runtime.getURL('').replace(/\/$/, ''); +const canShowBlockedCount = typeof dnr.setExtensionActionOptions === 'function'; + let firstRun = false; let wakeupRun = false; @@ -85,7 +84,12 @@ async function loadRulesetConfig() { if ( data ) { rulesetConfig.version = data.version; rulesetConfig.enabledRulesets = data.enabledRulesets; - rulesetConfig.autoReload = data.autoReload && true || false; + rulesetConfig.autoReload = typeof data.autoReload === 'boolean' + ? data.autoReload + : true; + rulesetConfig.showBlockedCount = typeof data.showBlockedCount === 'boolean' + ? data.showBlockedCount + : true; wakeupRun = true; return; } @@ -93,7 +97,12 @@ async function loadRulesetConfig() { if ( data ) { rulesetConfig.version = data.version; rulesetConfig.enabledRulesets = data.enabledRulesets; - rulesetConfig.autoReload = data.autoReload && true || false; + rulesetConfig.autoReload = typeof data.autoReload === 'boolean' + ? data.autoReload + : true; + rulesetConfig.showBlockedCount = typeof data.showBlockedCount === 'boolean' + ? data.showBlockedCount + : true; sessionWrite('rulesetConfig', rulesetConfig); return; } @@ -201,6 +210,8 @@ function onMessage(request, sender, callback) { maxNumberOfEnabledRulesets: dnr.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS, rulesetDetails: Array.from(rulesetDetails.values()), autoReload: rulesetConfig.autoReload, + showBlockedCount: rulesetConfig.showBlockedCount, + canShowBlockedCount, firstRun, }); firstRun = false; @@ -216,6 +227,19 @@ function onMessage(request, sender, callback) { }); return true; + case 'setShowBlockedCount': + rulesetConfig.showBlockedCount = request.state && true || false; + if ( canShowBlockedCount ) { + dnr.setExtensionActionOptions({ + displayActionCountAsBadgeText: rulesetConfig.showBlockedCount, + }); + } + saveRulesetConfig().then(( ) => { + callback(); + broadcastMessage({ showBlockedCount: rulesetConfig.showBlockedCount }); + }); + return true; + case 'popupPanelData': { Promise.all([ getFilteringMode(request.hostname), @@ -329,8 +353,10 @@ async function start() { // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest // Firefox API does not support `dnr.setExtensionActionOptions` - if ( wakeupRun === false && dnr.setExtensionActionOptions ) { - dnr.setExtensionActionOptions({ displayActionCountAsBadgeText: true }); + if ( wakeupRun === false && canShowBlockedCount ) { + dnr.setExtensionActionOptions({ + displayActionCountAsBadgeText: rulesetConfig.showBlockedCount, + }); } runtime.onMessage.addListener(onMessage); diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index bc76199..e75dbee 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -288,34 +288,53 @@ async function writeFilteringModeDetails(afterDetails) { async function filteringModesToDNR(modes) { const dynamicRuleMap = await getDynamicRules(); - const presentRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID); + const presentRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); const presentNone = new Set( presentRule && presentRule.condition.requestDomains ); if ( eqSets(presentNone, modes.none) ) { return; } const removeRuleIds = []; if ( presentRule !== undefined ) { - removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID); - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID); + removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); + removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); + dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); + dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); } const addRules = []; - if ( modes.none.size !== 0 ) { - const rule = { - id: TRUSTED_DIRECTIVE_BASE_RULE_ID, + const noneHostnames = [ ...modes.none ]; + const notNoneHostnames = [ ...modes.basic, ...modes.optimal, ...modes.complete ]; + if ( noneHostnames.length !== 0 ) { + const rule0 = { + id: TRUSTED_DIRECTIVE_BASE_RULE_ID+0, action: { type: 'allowAllRequests' }, condition: { resourceTypes: [ 'main_frame' ], }, priority: 100, }; - if ( - modes.none.size !== 1 || - modes.none.has('all-urls') === false - ) { - rule.condition.requestDomains = Array.from(modes.none); + if ( modes.none.has('all-urls') === false ) { + rule0.condition.requestDomains = noneHostnames.slice(); + } else if ( notNoneHostnames.length !== 0 ) { + rule0.condition.excludedRequestDomains = notNoneHostnames.slice(); } - addRules.push(rule); - dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID, rule); + addRules.push(rule0); + dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+0, rule0); + // https://github.com/uBlockOrigin/uBOL-home/issues/114 + const rule1 = { + id: TRUSTED_DIRECTIVE_BASE_RULE_ID+1, + action: { type: 'allow' }, + condition: { + resourceTypes: [ 'script' ], + }, + priority: 100, + }; + if ( modes.none.has('all-urls') === false ) { + rule1.condition.initiatorDomains = noneHostnames.slice(); + } else if ( notNoneHostnames.length !== 0 ) { + rule1.condition.excludedInitiatorDomains = notNoneHostnames.slice(); + } + addRules.push(rule1); + dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+1, rule1); } const updateOptions = {}; if ( addRules.length ) { diff --git a/platform/mv3/extension/js/scripting/css-procedural.js b/platform/mv3/extension/js/scripting/css-procedural.js index 818e697..7f50f80 100644 --- a/platform/mv3/extension/js/scripting/css-procedural.js +++ b/platform/mv3/extension/js/scripting/css-procedural.js @@ -341,6 +341,38 @@ class PSelectorOthersTask extends PSelectorTask { /******************************************************************************/ +class PSelectorShadowTask extends PSelectorTask { + constructor(task) { + super(); + this.selector = task[1]; + } + transpose(node, output) { + const root = this.openOrClosedShadowRoot(node); + if ( root === null ) { return; } + const nodes = root.querySelectorAll(this.selector); + output.push(...nodes); + } + get openOrClosedShadowRoot() { + if ( PSelectorShadowTask.openOrClosedShadowRoot !== undefined ) { + return PSelectorShadowTask.openOrClosedShadowRoot; + } + if ( typeof chrome === 'object' && chrome !== null ) { + if ( chrome.dom instanceof Object ) { + if ( typeof chrome.dom.openOrClosedShadowRoot === 'function' ) { + PSelectorShadowTask.openOrClosedShadowRoot = + chrome.dom.openOrClosedShadowRoot; + return PSelectorShadowTask.openOrClosedShadowRoot; + } + } + } + PSelectorShadowTask.openOrClosedShadowRoot = node => + node.openOrClosedShadowRoot || null; + return PSelectorShadowTask.openOrClosedShadowRoot; + } +} + +/******************************************************************************/ + // https://github.com/AdguardTeam/ExtendedCss/issues/31#issuecomment-302391277 // Prepend `:scope ` if needed. class PSelectorSpathTask extends PSelectorTask { @@ -471,7 +503,6 @@ class PSelectorXpathTask extends PSelectorTask { class PSelector { constructor(o) { - this.raw = o.raw; this.selector = o.selector; this.tasks = []; const tasks = []; @@ -542,6 +573,7 @@ PSelector.prototype.operatorToTaskMap = new Map([ [ 'min-text-length', PSelectorMinTextLengthTask ], [ 'not', PSelectorIfNotTask ], [ 'others', PSelectorOthersTask ], + [ 'shadow', PSelectorShadowTask ], [ 'spath', PSelectorSpathTask ], [ 'upward', PSelectorUpwardTask ], [ 'watch-attr', PSelectorWatchAttrs ], @@ -566,6 +598,13 @@ class PSelectorRoot extends PSelector { } return []; } + exec(input) { + try { + return super.exec(input); + } catch (ex) { + } + return []; + } } /******************************************************************************/ diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 1a95ac0..6f50055 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -19,11 +19,9 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -import { browser, sendMessage, localRead, localWrite } from './ext.js'; -import { i18n$, i18n } from './i18n.js'; +import { browser, localRead, localWrite, sendMessage } from './ext.js'; import { dom, qs$, qsa$ } from './dom.js'; +import { i18n, i18n$ } from './i18n.js'; import punycode from './punycode.js'; /******************************************************************************/ @@ -211,7 +209,17 @@ function renderWidgets() { renderDefaultMode(); renderTrustedSites(); - qs$('#autoReload input[type="checkbox"').checked = cachedRulesetData.autoReload; + qs$('#autoReload input[type="checkbox"]').checked = cachedRulesetData.autoReload; + + { + const input = qs$('#showBlockedCount input[type="checkbox"]'); + if ( cachedRulesetData.canShowBlockedCount ) { + input.checked = cachedRulesetData.showBlockedCount; + } else { + input.checked = false; + dom.attr(input, 'disabled', ''); + } + } // Compute total counts let rulesetCount = 0; @@ -290,13 +298,20 @@ dom.on( /******************************************************************************/ -dom.on('#autoReload input[type="checkbox"', 'change', ev => { +dom.on('#autoReload input[type="checkbox"]', 'change', ev => { sendMessage({ what: 'setAutoReload', state: ev.target.checked, }); }); +dom.on('#showBlockedCount input[type="checkbox"]', 'change', ev => { + sendMessage({ + what: 'setShowBlockedCount', + state: ev.target.checked, + }); +}); + /******************************************************************************/ function renderTrustedSites() { @@ -455,6 +470,13 @@ bc.onmessage = ev => { } } + if ( message.showBlockedCount !== undefined ) { + if ( message.showBlockedCount !== local.showBlockedCount ) { + local.showBlockedCount = message.showBlockedCount; + render = true; + } + } + if ( message.enabledRulesets !== undefined ) { if ( hashFromIterable(message.enabledRulesets) !== hashFromIterable(local.enabledRulesets) ) { local.enabledRulesets = message.enabledRulesets; diff --git a/platform/mv3/extension/js/utils.js b/platform/mv3/extension/js/utils.js index b1a463a..cadeaea 100644 --- a/platform/mv3/extension/js/utils.js +++ b/platform/mv3/extension/js/utils.js @@ -131,11 +131,22 @@ export const broadcastMessage = message => { /******************************************************************************/ const ubolLog = (...args) => { - // Do not pollute dev console in stable release. - if ( browser.runtime.id === 'ddkjiahejlhfcafbddmgiahcphecmpfh' ) { return; } + // Do not pollute dev console in stable releases. + if ( shouldLog !== true ) { return; } console.info('[uBOL]', ...args); }; +const shouldLog = (( ) => { + const { id } = browser.runtime; + // https://addons.mozilla.org/en-US/firefox/addon/ublock-origin-lite/ + if ( id === 'uBOLite@raymondhill.net' ) { return false; } + // https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddmgiahcphecmpfh + if ( id === 'ddkjiahejlhfcafbddmgiahcphecmpfh' ) { return false; } + // https://microsoftedge.microsoft.com/addons/detail/cimighlppcgcoapaliogpjjdehbnofhn + if ( id === 'cimighlppcgcoapaliogpjjdehbnofhn' ) { return false; } + return true; +})(); + /******************************************************************************/ export { diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 6b608bf..4f79d52 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -110,7 +110,7 @@ const urlToFileName = url => { ; }; -const fetchList = (url, cacheDir) => { +const fetchText = (url, cacheDir) => { return new Promise((resolve, reject) => { const fname = urlToFileName(url); fs.readFile(`${cacheDir}/${fname}`, { encoding: 'utf8' }).then(content => { @@ -168,7 +168,7 @@ const requiredRedirectResources = new Set(); /******************************************************************************/ -async function fetchAsset(assetDetails) { +async function fetchList(assetDetails) { // Remember fetched URLs const fetchedURLs = new Set(); @@ -190,7 +190,7 @@ async function fetchAsset(assetDetails) { newParts.push(`!#trusted on ${assetDetails.secret}`); } newParts.push( - fetchList(part.url, cacheDir).then(details => { + fetchText(part.url, cacheDir).then(details => { const { url } = details; const content = details.content.trim(); if ( typeof content === 'string' && content !== '' ) { @@ -227,10 +227,13 @@ const isRegex = rule => rule.condition !== undefined && rule.condition.regexFilter !== undefined; -const isRedirect = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.extensionPath !== undefined; +const isRedirect = rule => { + if ( rule.action === undefined ) { return false; } + if ( rule.action.type !== 'redirect' ) { return false; } + if ( rule.action.redirect?.extensionPath !== undefined ) { return true; } + if ( rule.action.redirect?.transform?.path !== undefined ) { return true; } + return false; +}; const isModifyHeaders = rule => rule.action !== undefined && @@ -367,6 +370,14 @@ async function processNetworkFilters(assetDetails, network) { } } + // Add native DNR ruleset if present + if ( assetDetails.dnrURL ) { + const result = await fetchText(assetDetails.dnrURL, cacheDir); + for ( const rule of JSON.parse(result.content) ) { + rules.push(rule); + } + } + const plainGood = rules.filter(rule => isGood(rule) && isRegex(rule) === false); log(`\tPlain good: ${plainGood.length}`); log(plainGood @@ -384,6 +395,7 @@ async function processNetworkFilters(assetDetails, network) { isRedirect(rule) ); redirects.forEach(rule => { + if ( rule.action.redirect.extensionPath === undefined ) { return; } requiredRedirectResources.add( rule.action.redirect.extensionPath.replace(/^\/+/, '') ); @@ -979,11 +991,15 @@ async function rulesetFromURLs(assetDetails) { log(`Listset for '${assetDetails.id}':`); if ( assetDetails.text === undefined ) { - const text = await fetchAsset(assetDetails); + const text = await fetchList(assetDetails); if ( text === '' ) { return; } assetDetails.text = text; } + if ( Array.isArray(assetDetails.filters) ) { + assetDetails.text += '\n' + assetDetails.filters.join('\n'); + } + const extensionPaths = []; for ( const [ fname, details ] of redirectResourcesMap ) { const path = `/web_accessible_resources/${fname}`; @@ -1140,10 +1156,10 @@ async function main() { // Assemble all default lists as the default ruleset const contentURLs = [ 'https://ublockorigin.github.io/uAssets/filters/filters.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/badware.txt', + 'https://ublockorigin.github.io/uAssets/filters/badware.min.txt', 'https://ublockorigin.github.io/uAssets/filters/privacy.min.txt', 'https://ublockorigin.github.io/uAssets/filters/unbreak.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt', + 'https://ublockorigin.github.io/uAssets/filters/quick-fixes.min.txt', 'https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt', 'https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt', 'https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt', @@ -1155,7 +1171,10 @@ async function main() { enabled: true, secret, urls: contentURLs, + dnrURL: 'https://ublockorigin.github.io/uAssets/dnr/default.json', homeURL: 'https://github.com/uBlockOrigin/uAssets', + filters: [ + ], }); // Regional rulesets @@ -1206,7 +1225,6 @@ async function main() { for ( const id of handpicked ) { const asset = assets[id]; if ( asset.content !== 'filters' ) { continue; } - const contentURL = Array.isArray(asset.contentURL) ? asset.contentURL[0] : asset.contentURL; @@ -1234,45 +1252,45 @@ async function main() { }); await rulesetFromURLs({ id: 'annoyances-overlays', - name: 'AdGuard/uBO – Overlays', + name: 'EasyList/uBO – Overlay Notices', group: 'annoyances', enabled: false, secret, urls: [ - 'https://filters.adtidy.org/extension/ublock/filters/19.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt', 'https://ublockorigin.github.io/uAssets/filters/annoyances-others.txt', ], - homeURL: 'https://github.com/AdguardTeam/AdguardFilters#adguard-filters', + homeURL: 'https://github.com/easylist/easylist#fanboy-lists', }); await rulesetFromURLs({ id: 'annoyances-social', - name: 'AdGuard – Social Media', + name: 'EasyList – Social Widgets', group: 'annoyances', enabled: false, urls: [ - 'https://filters.adtidy.org/extension/ublock/filters/4.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt', ], - homeURL: 'https://github.com/AdguardTeam/AdguardFilters#adguard-filters', + homeURL: 'https://github.com/easylist/easylist#fanboy-lists', }); await rulesetFromURLs({ id: 'annoyances-widgets', - name: 'AdGuard – Widgets', + name: 'EasyList – Chat Widgets', group: 'annoyances', enabled: false, urls: [ - 'https://filters.adtidy.org/extension/ublock/filters/22.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt', ], - homeURL: 'https://github.com/AdguardTeam/AdguardFilters#adguard-filters', + homeURL: 'https://github.com/easylist/easylist#fanboy-lists', }); await rulesetFromURLs({ id: 'annoyances-others', - name: 'AdGuard – Other Annoyances', + name: 'EasyList – Other Annoyances', group: 'annoyances', enabled: false, urls: [ - 'https://filters.adtidy.org/extension/ublock/filters/21.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt' ], - homeURL: 'https://github.com/AdguardTeam/AdguardFilters#adguard-filters', + homeURL: 'https://github.com/easylist/easylist#fanboy-lists', }); // Handpicked rulesets from abroad diff --git a/platform/mv3/salvage-ruleids.mjs b/platform/mv3/salvage-ruleids.mjs new file mode 100644 index 0000000..f11d986 --- /dev/null +++ b/platform/mv3/salvage-ruleids.mjs @@ -0,0 +1,117 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +'use strict'; + +/******************************************************************************/ + +import fs from 'fs/promises'; +import process from 'process'; + +/******************************************************************************/ + +const commandLineArgs = (( ) => { + const args = new Map(); + let name, value; + for ( const arg of process.argv.slice(2) ) { + const pos = arg.indexOf('='); + if ( pos === -1 ) { + name = arg; + value = ''; + } else { + name = arg.slice(0, pos); + value = arg.slice(pos+1); + } + args.set(name, value); + } + return args; +})(); + +const beforeDir = commandLineArgs.get('before') || ''; +const afterDir = commandLineArgs.get('after') || ''; + +if ( beforeDir === '' || afterDir === '' ) { + process.exit(0); +} + +/******************************************************************************/ + +async function main() { + const folders = [ + 'main', + 'modify-headers', + 'redirect', + 'regex', + 'removeparam', + ]; + const writePromises = []; + for ( const folder of folders ) { + const afterFiles = await fs.readdir(`${afterDir}/rulesets/${folder}`); + for ( const file of afterFiles ) { + let raw = await fs.readFile(`${beforeDir}/rulesets/${folder}/${file}`, 'utf-8').catch(( ) => ''); + let beforeRules; + try { beforeRules = JSON.parse(raw); } catch(_) { } + if ( Array.isArray(beforeRules) === false ) { continue; } + raw = await fs.readFile(`${afterDir}/rulesets/${folder}/${file}`, 'utf-8').catch(( ) => ''); + let afterRules; + try { afterRules = JSON.parse(raw); } catch(_) { } + if ( Array.isArray(afterRules) === false ) { continue; } + const beforeMap = new Map(beforeRules.map(a => { + const id = a.id; + a.id = 0; + return [ JSON.stringify(a), id ]; + })); + const reusedIds = new Set(); + for ( const afterRule of afterRules ) { + afterRule.id = 0; + const key = JSON.stringify(afterRule); + const beforeId = beforeMap.get(key); + if ( beforeId === undefined ) { continue; } + if ( reusedIds.has(beforeId) ) { continue; } + afterRule.id = beforeId; + reusedIds.add(beforeId); + } + // Assign new ids to unmatched rules + let ruleIdGenerator = 1; + for ( const afterRule of afterRules ) { + if ( afterRule.id !== 0 ) { continue; } + while ( reusedIds.has(ruleIdGenerator) ) { ruleIdGenerator += 1; } + afterRule.id = ruleIdGenerator++; + } + afterRules.sort((a, b) => a.id - b.id); + const indent = afterRules.length > 10 ? undefined : 1; + const lines = []; + for ( const afterRule of afterRules ) { + lines.push(JSON.stringify(afterRule, null, indent)); + } + const path = `${afterDir}/rulesets/${folder}/${file}`; + console.log(` Salvaged ${reusedIds.size} ids in ${folder}/${file}`); + writePromises.push( + fs.writeFile(path, `[\n${lines.join(',\n')}\n]\n`) + ); + } + } + await Promise.all(writePromises); +} + +main(); + +/******************************************************************************/ diff --git a/platform/mv3/scriptlets/scriptlet.template.js b/platform/mv3/scriptlets/scriptlet.template.js index b2c4ada..f5a4748 100644 --- a/platform/mv3/scriptlets/scriptlet.template.js +++ b/platform/mv3/scriptlets/scriptlet.template.js @@ -40,7 +40,7 @@ // Start of code to inject const uBOL_$scriptletName$ = function() { -const scriptletGlobals = new Map(); // jshint ignore: line +const scriptletGlobals = {}; // jshint ignore: line const argsList = self.$argsList$; diff --git a/platform/opera/manifest.json b/platform/opera/manifest.json index abc0bda..afaaad3 100644 --- a/platform/opera/manifest.json +++ b/platform/opera/manifest.json @@ -30,6 +30,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ @@ -90,6 +93,7 @@ "name": "uBlock Origin", "options_page": "dashboard.html", "permissions": [ + "alarms", "contextMenus", "privacy", "storage", diff --git a/src/1p-filters.html b/src/1p-filters.html index bafa992..bc08479 100644 --- a/src/1p-filters.html +++ b/src/1p-filters.html @@ -22,15 +22,16 @@ <div class="body"> <div id="cloudWidget" class="hide" data-cloud-entry="myFiltersPane"></div> - - <p class="vverbose"><span data-i18n="1pTrustWarning"></span> <span data-i18n="1pFormatHint"></span> <a class="fa-icon info" href="https://github.com/gorhill/uBlock/wiki/Dashboard:-My-filters" target="_blank">question-circle</a></p> <p> <button id="userFiltersApply" class="preferred iconified" type="button" disabled><span class="fa-icon">check</span><span data-i18n="1pApplyChanges">_</span><span class="hover"></span></button> <button id="userFiltersRevert" class="iconified" type="button" disabled><span class="fa-icon">undo</span><span data-i18n="genericRevert">_</span><span class="hover"></span></button> -   +   <button id="importUserFiltersFromFile" class="iconified" type="button"><span class="fa-icon">download-alt</span><span data-i18n="1pImport">_</span><span class="hover"></span></button> <button id="exportUserFiltersToFile" class="iconified" type="button"><span class="fa-icon">upload-alt</span><span data-i18n="1pExport">_</span><span class="hover"></span></button> </p> + <p data-i18n="1pTrustWarning"></p> + <div class="li"><label><span id="enableMyFilters" class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pEnableMyFiltersLabel"></span></label></div> + <div id="trustMyFilters" class="li"><label><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pTrustMyFiltersLabel"></span></label></div> </div> <div id="userFilters" class="codeMirrorContainer codeMirrorBreakAll cm-theme-override" spellcheck="false"></div> <div class="hidden"> diff --git a/src/3p-filters.html b/src/3p-filters.html index a779120..c9123cc 100644 --- a/src/3p-filters.html +++ b/src/3p-filters.html @@ -17,10 +17,10 @@ <div class="body"> <div id="cloudWidget" class="hide" data-cloud-entry="tpFiltersPane"></div> -<div id="actions"> - <button id="buttonApply" class="preferred disabled iconified" type="button" data-i18n-title="3pApplyChanges"><span class="fa-icon">check</span><span data-i18n="3pApplyChanges">_</span><span class="hover"></span></button> +<p id="actions"> + <button id="buttonApply" class="preferred disabled iconified dontshrink" type="button" data-i18n-title="3pApplyChanges"><span class="fa-icon">check</span><span data-i18n="3pApplyChanges">_</span><span class="hover"></span></button> <button id="buttonUpdate" class="preferred disabled iconified" type="button" data-i18n-title="3pUpdateNow"><span class="fa-icon">refresh</span><span data-i18n="3pUpdateNow">_</span><span class="hover"></span></button> -</div> +</p> <div> <div class="li"> @@ -44,7 +44,7 @@ <div class="rootstats expandable" data-key="*"> <span class="fa-icon listExpander">angle-up</span><span id="listsOfBlockedHostsPrompt"></span> </div> - <div class="searchbar"><input type="search" spellcheck="false"/><span class="fa-icon">search</span></div> + <div class="searchfield"><input type="search" spellcheck="false" placeholder="" /><span class="fa-icon">search</span></div> <div class="listEntries"></div> <div class="li listEntry expandable" data-role="import"> <span class="detailbar"> diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index be9af18..369c408 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -483,6 +483,14 @@ "message": "مواقع مصابة أو تحتوي على فايروسات", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "اشعارات ملفات تعريف الارتباط", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "عناصر مزعجة", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "حدث خطأ في الشبكة منع تحديث المورد.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "فلتر واحد في كل سطر. يمكن ان يكون الفلتر رابط موقع او فلتر متوافق مع EasyList-compatible. السطور المسبوقة بـ<code>!</code> سوف يتم تجاهلها.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "لا تضف مرشحات من مصادر غير موثوقة.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "السماح بالفلاتر المخصصة التي تتطلب الثقة", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "استيراد و إضافة", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "تبديل تصفية مستحضرات التجميل", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "تعطيل جافا سكريبت", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "وضع الحظر المتراخي", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/az/messages.json b/src/_locales/az/messages.json index e712582..1708ea4 100644 --- a/src/_locales/az/messages.json +++ b/src/_locales/az/messages.json @@ -483,6 +483,14 @@ "message": "Zərərli domenlər", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Zəhlətökən elementlər əleyhinə filtrlər", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Şəbəkə xətası üzündən yeniləmə mümkün olmadı.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Hər sətirdə yalnız bir filtr. Bu, ya domen adı, ya da Adblock Plus formatında yazılmış filtr ola bilər. Əvvəli <code>!</code> ilə başlayan sətirlər nəzərə alınmayacaqdır.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Etibarsız mənbələrdən filtrlər əlavə etməyin.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "İdxal və əlavə et", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Kozmetik filtrləməni yandır/söndür", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Əngəlləmə rejimini yüngülləşdir", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index 52ee835..bb7a458 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Нарэшце, эфектыўны блакавальнік. Не нагружае працэсар і памяць.", + "message": "Нарэшце, эфектыўны блакіроўшчык. Не нагружае працэсар і памяць.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -20,7 +20,7 @@ "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { - "message": "Iгнараваць", + "message": "Ігнараваць", "description": "Label for button to ignore unsaved changes" }, "settingsPageName": { @@ -483,6 +483,14 @@ "message": "Дамены шкодных праграм", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Віджэты сацыяльных сетак", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Абвесткі пра кукі", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Надакучлівасці", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Памылка сеткі не дазволіла абнавіць рэсурс.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Адзін фільтр на радок. Фільтрам можа быць адрас сайта або сумяшчальны з EasyList фільтр. Радкі, што пачынаюцца з <code>!</code>, будуць праігнараваны.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Не дадавайце фільтры з крыніц, якім не давяраеце.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Уключыць мае карыстальніцкія фільтры", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Дазволіць карыстальніцкія фільтры, якія патрабуюць даверу", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Імпартаваць і дадаць", "description": "Button in the 'My filters' pane" @@ -972,7 +984,7 @@ "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Выберыце катэгорыю --", + "message": "-- Выберыце запіс праблемы --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { @@ -1251,6 +1263,10 @@ "message": "Пераключыць касметычнае фільтраванне", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Уключыць/адключыць JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Паслаблены рэжым блакавання", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index fd2b676..aaff8db 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -483,6 +483,14 @@ "message": "Защита от зловреден софтуер, сигурност", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Социални джаджи", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Известия за бисквитки", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Досадни неща", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Грешка в мрежата възпрепятства обновяването на ресурса.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Един филтър на ред. Това може да бъде обикновен адрес или филтър, съвместим с EasyList. Редовете с представка <code>!</code> ще бъдат игнорирани.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Не добавяйте филтри от ненадеждни източници.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Активиране на моите потребителски филтри", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Разрешаване на потребителски филтри, изискващи доверие", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Внасяне и добавяне...", "description": "Button in the 'My filters' pane" @@ -708,7 +720,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinEventful": { - "message": "eventful", + "message": "изпълнен със събития", "description": "A keyword in the built-in row filtering expression: all items corresponding to uBO doing something (blocked, allowed, redirected, etc.)" }, "loggerRowFiltererBuiltinBlocked": { @@ -1251,6 +1263,10 @@ "message": "Превключване на козметичното филтриране", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Превключване на JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Отпуснат режим на блокиране", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/bn/messages.json b/src/_locales/bn/messages.json index adbb21a..db7933e 100644 --- a/src/_locales/bn/messages.json +++ b/src/_locales/bn/messages.json @@ -16,7 +16,7 @@ "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "থাকুন", + "message": "এখানে থাকুন", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { @@ -483,6 +483,14 @@ "message": "ম্যালওয়্যার ডোমেইন", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "সোশ্যাল উইজেট", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "কুকি নোটিশ", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "বিরক্তিকর", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "একটি নেটওয়ার্ক ত্রুটি রিসোর্স বা তথ্য হালনাগাদ হওয়া রোধ করেছে।", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "লাইন প্রতি একটি ফিল্টার। একটি ফিল্টার শুধু হোস্টনেম বা অ্যাডব্লক প্লাস-এর সাথে সামঞ্জস্যপূর্ণ ফিল্টার হতে পারে। <code>!</code> দিয়ে শুরু হওয়া লাইন উপেক্ষা করা হবে।", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "সন্দেহজনক উৎস থেকে ফিল্টারে কোন কিছু যোগ করবেন না।", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "আপনার কাস্টম ফিল্টারটি চালু করুন", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "কাস্টম ফিল্টারকে বিশ্বস্ততার অনুমতি দিন", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "আমদানি করে পরিশেষে যোগ করুন", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "সৌন্দর্য্যবর্ধক ফিল্টার চালু বা বন্ধ করুন", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Javascript টগল করুন", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "রোধক মোড শিথিল করুন", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index 58c7dd6..2a27e9f 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -76,7 +76,7 @@ "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Klikit evit enaouiñ uBlock₀ war al lec'hienn-mañ.", + "message": "Enaouiñ uBlock₀ war al lec'hienn-mañ.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -136,11 +136,11 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "Klikit evit stankañ an holl brenestroù pop-up war al lec'hienn-mañ", + "message": "Stankañ an holl brenestroù pop-up war al lec'hienn-mañ", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Klikit evit aotren an holl brenestroù pop-up war al lec'hienn-mañ", + "message": "Aotren an holl brenestroù pop-up war al lec'hienn-mañ", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -148,11 +148,11 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "Klikit evit stankañ an elfennoù media pounner war al lec'hienn-mañ", + "message": "Stankañ an elfennoù media pounner war al lec'hienn-mañ", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "Klikit evit aotren an elfennoù media pounner en-dro war al lec'hienn-mañ", + "message": "Aotren an elfennoù media pounner en-dro war al lec'hienn-mañ", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -160,31 +160,31 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Klikit evit lazhañ ar silañ kenedel war al lec'hienn-mañ", + "message": "Lazhañ ar silañ kenedel war al lec'hienn-mañ", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Klikit evit enaouiñ ar silañ kenedel war al lec'hienn-mañ", + "message": "Enaouiñ ar silañ kenedel war al lec'hienn-mañ", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { - "message": "Lazhañ/enaouiñ evit stankañ an nodrezhioù diavaez war al lec'hienn-mañ", + "message": "Aotren/stankañ ar polisoù diavaez war al lec'hienn-mañ", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { - "message": "Klikit evit stankañ an nodrezhioù diavaez war al lec'hienn-mañ", + "message": "Stankañ ar polisoù diavaez war al lec'hienn-mañ", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "Klikit evit aotren an nodrezhioù diavaez war al lec'hienn-mañ", + "message": "Aotren ar polisoù diavaez war al lec'hienn-mañ", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { - "message": "Klikit evit diweredekaat JavaScript war al lec'hienn-mañ", + "message": "Diweredekaat JavaScript war al lec'hienn-mañ", "description": "Tooltip for the no-scripting per-site switch" }, "popupTipNoScripting2": { - "message": "Klikit evit gweredekaat JavaScript war al lec'hienn-mañ en-dro", + "message": "Gweredekaat JavaScript war al lec'hienn-mañ en-dro", "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { @@ -200,7 +200,7 @@ "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "Nodrezhioù diavaez", + "message": "Polisoù diavaez", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { @@ -224,11 +224,11 @@ "description": "Tooltip when hovering the top-most cell of the local-rules column." }, "popupTipSaveRules": { - "message": "Klikit evit lakaat ho kemmoù da dalvezout.", + "message": "Lakaat ho kemmoù da dalvezout.", "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." }, "popupTipRevertRules": { - "message": "Klikit evit nullañ ar c'hemmoù ho peus graet.", + "message": "Nullañ ar c'hemmoù ho peus graet.", "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." }, "popupAnyRulePrompt": { @@ -384,7 +384,7 @@ "description": "" }, "settingsNoRemoteFontsPrompt": { - "message": "Stankañ an nodrezhioù diavaez", + "message": "Stankañ ar polisoù diavaez", "description": "" }, "settingsNoScriptingPrompt": { @@ -444,7 +444,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "Ar siloù kenedel a servij da guzhat elfennoù ur bajenn web a c'hallfe bezañ noazadurioù d'ar gwelet ha ne c'hallont ket bezañ stanket gant silañ ar rouedad diazezet war ar rekedoù.", + "message": "Ar siloù kenedel a servij da guzhat elfennoù ur bajenn web a c'hallfe saotrañ ar gweled ha ne c'hallont ket bezañ stanket gant ar siloù rouedad diazezet war ar rekedoù.", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "Name Mar bez gweredekaet an dibarzh-mañ e vo dilemel an memor ha an CPU ouzhpennet d'ar bajennoù web evel ur c'helc'h ar siloù kosmetik generel.", + "message": "Ar siloù kenedel hollek a zo siloù kenedel bet savet evit bezañ implijet war an holl lec'hiennoù. Ma'z enaouit an dibarzh-mañ e vo implijer nebeutoc'h a vevor hag ar reizhiad korvoiñ (CPU) war al lec'hiennoù-se.\n\nErbedet eo deoc'h enaouiñ an dibarzh-mañ m'emaoc'h oc'h ober gant un ardivink re zic'halloudek.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -483,6 +483,14 @@ "message": "Gwarez a-enep ar malware ha surentez", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Saotradurioù", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ur fazi rouedad en deus miret an danvez da vezañ hizivaet.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ur sil dre linenn. Ur sil a c'hall bezañ un anv ostiz hepken pe ur sil hag a glot gant EasyList.\nAl linennoù a grog gant <code>!</code> a vo dilezet.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Arabat ouzhpennañ siloù a zeu diouzh mammennoù douetus.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Gweredekaat ma siloù personelaet", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Kaout fiziañs er siloù personelaet", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Enporzhiañ hag ouzhpennañ", "description": "Button in the 'My filters' pane" @@ -952,7 +964,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS6P1S1": { - "message": "Evit nompas sammañ ar genlabourerien a-youl vat gant meur a zanevell heñvel, gwiriit ma n'eo ket bet danevellet ho kudenn c'hoazh mar plij.", + "message": "Evit nompas sammañ ar genlabourerien a-youl vat gant meur a zanevell heñvel, gwiriit ma n'eo ket bet danevellet ho kudenn en ar-raok mar plij.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { @@ -1251,6 +1263,10 @@ "message": "Enaouiñ ar silañ kenedel", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Enaouiñ/lazhañ JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Distanañ ar mod stankañ", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/bs/messages.json b/src/_locales/bs/messages.json index 79a2fbe..d80ae9d 100644 --- a/src/_locales/bs/messages.json +++ b/src/_locales/bs/messages.json @@ -483,6 +483,14 @@ "message": "Zlonamjerne domene", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Smetnje", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Mrežna greška je spriječila ažuriranje resursa.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Jedan filter po redu. Filter može biti običan naziv domaćina/hosta ili filter kompatibilan sa EasyList-om. Redovi sa prefiksom <code>!</code> će biti ignorisani.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nemojte dodavati filtere iz nepouzdanih izvora.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Uvezi i dodaj", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Uključi/isključi estetsko filtriranje", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaksiran mod blokiranja", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index be806f7..97ade2d 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -483,6 +483,14 @@ "message": "Dominis perillosos", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Ginys socials", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avís de galetes", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Elements molestos", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Un error de xarxa va impedir que s'actualitzés el recurs.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Un filtre per línia. Un filtre pot ser un domini, o un filtre compatible amb l'Adblock Plus. S'ignoraran les línies amb el símbol ‘!’.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "No afegiu filtres de fonts no confiables.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Habilita els meus filtres personalitzats", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Permet filtres personalitzats que requereixin confiança", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importa i annexa", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Commuta els filtres cosmètics", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Canviar l'estat de JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Mode de bloqueig relaxat", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index e25baf5..025f0b5 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -483,6 +483,14 @@ "message": "Ochrana před malwarem, bezpečnost", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgety sociálních sítí", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Oznámení o používání souborů cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Dotěrnosti", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Chyba sítě znemožnila aktualizaci tohoto zdroje.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Jeden filtr na řádek. Filtr může být prostý název hostitele nebo filtr kompatibilní s EasyList. Řádky začínající vykřičníkem <code>!</code> budou ignorovány.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nepřidávejte filtry z nedůvěryhodných zdrojů.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Povolit mé vlastní filtry", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Povolit vlastní filtry vyžadující důvěryhodnost", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importovat a připojit…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Zapnout kosmetické filtrování", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Přepnout JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Uvolnit režim blokování", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/cv/messages.json b/src/_locales/cv/messages.json index 55f9fb5..aec33eb 100644 --- a/src/_locales/cv/messages.json +++ b/src/_locales/cv/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ku/messages.json b/src/_locales/cy/messages.json index 647fec3..7152ef9 100644 --- a/src/_locales/ku/messages.json +++ b/src/_locales/cy/messages.json @@ -4,59 +4,59 @@ "description": "extension name." }, "extShortDesc": { - "message": "Finally, an efficient blocker. Easy on CPU and memory.", + "message": "O'r diwedd, rhwystrydd effeithlon. Ysgafn ar y CPU a'r cof.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { - "message": "uBlock₀ — Dashboard", + "message": "uBlock₀ — Dashfwrdd", "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", + "message": "Rhybudd! Mae yna newidiadau heb eu cadw", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "Stay here", + "message": "Aros yma", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { - "message": "Ignore", + "message": "Anwybyddu", "description": "Label for button to ignore unsaved changes" }, "settingsPageName": { - "message": "Settings", + "message": "Gosodiadau", "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filter lists", + "message": "Rhestri hidlo", "description": "appears as tab name in dashboard" }, "1pPageName": { - "message": "My filters", + "message": "Fy hidlyddion", "description": "appears as tab name in dashboard" }, "rulesPageName": { - "message": "My rules", + "message": "Fy rheolau", "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Trusted sites", + "message": "Gwefannau dibynadwy", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { - "message": "Shortcuts", + "message": "Llwybrau byr", "description": "appears as tab name in dashboard" }, "statsPageName": { - "message": "uBlock₀ — Logger", + "message": "uBlock₀ — Logiwr", "description": "Title for the logger window" }, "aboutPageName": { - "message": "About", + "message": "Ynghylch", "description": "appears as tab name in dashboard" }, "supportPageName": { - "message": "Support", + "message": "Cymorth", "description": "appears as tab name in dashboard" }, "assetViewerPageName": { @@ -64,19 +64,19 @@ "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { - "message": "Advanced settings", + "message": "Gosodiadau uwch", "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { - "message": "Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page.", + "message": "Clic: analluogi/galluogi uBlock₀ ar y wefan hon.\n\nCtrl+clic: analluogi uBlock₀ ar y dudalen hon yn unig.", "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Click to disable uBlock₀ for this site.\n\nCtrl+click to disable uBlock₀ only on this page.", + "message": "Cliciwch i analluogi uBlock₀ ar y wefan hon.\n\nDefnyddiwch ctrl+clic i analluogi uBlock₀ ar y dudalen hon yn unig.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Click to enable uBlock₀ for this site.", + "message": "Cliciwch i alluogi uBlock₀ ar y wefan hon.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -84,7 +84,7 @@ "description": "English: requests blocked" }, "popupBlockedOnThisPagePrompt": { - "message": "on this page", + "message": "ar y dudalen hon", "description": "English: on this page" }, "popupBlockedStats": { @@ -96,39 +96,39 @@ "description": "English: since install" }, "popupOr": { - "message": "or", + "message": "neu", "description": "English: or" }, "popupBlockedOnThisPage_v2": { - "message": "Blocked on this page", + "message": "Wedi rhwystro ar y dudalen hon", "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "Blocked since install", + "message": "Wedi rhwystro ers gosod", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { - "message": "Domains connected", + "message": "Parthau wedi cysylltu", "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { - "message": "Open the dashboard", + "message": "Agor y dashfwrdd", "description": "English: Click to open the dashboard" }, "popupTipZapper": { - "message": "Enter element zapper mode", + "message": "Modd saethu elfen", "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { - "message": "Enter element picker mode", + "message": "Modd dewis elfen", "description": "English: Enter element picker mode" }, "popupTipLog": { - "message": "Open the logger", + "message": "Agor y logiwr", "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Adrodd nam ar y wefan hon", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { @@ -156,15 +156,15 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { - "message": "Toggle cosmetic filtering for this site", + "message": "Toglo hidlo arwynebol ar gyfer y wefan hon", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Click to disable cosmetic filtering on this site", + "message": "Cliciwch i analluogi hidlo arwynebol ar y wefan hon", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Click to enable cosmetic filtering on this site", + "message": "Cliciwch i alluogi hidlo arwynebol ar y wefan hon", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -172,19 +172,19 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { - "message": "Click to block remote fonts on this site", + "message": "Cliciwch i rwystro ffontiau pell ar y wefan hon", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "Click to no longer block remote fonts on this site", + "message": "Cliciwch i ganiatáu ffontiau pell ar y wefan hon", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { - "message": "Click to disable JavaScript on this site", + "message": "Cliciwch i analluogi JavaScript ar y wefan hon", "description": "Tooltip for the no-scripting per-site switch" }, "popupTipNoScripting2": { - "message": "Click to no longer disable JavaScript on this site", + "message": "Cliciwch i alluogi JavaScript ar y wefan hon", "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { @@ -196,11 +196,11 @@ "description": "Caption for the no-large-media per-site switch" }, "popupNoCosmeticFiltering_v2": { - "message": "Cosmetic filtering", + "message": "Hidlo arwynebol", "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "Remote fonts", + "message": "Ffontiau pell", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { @@ -208,11 +208,11 @@ "description": "Caption for the no-scripting per-site switch" }, "popupMoreButton_v2": { - "message": "More", + "message": "Mwy", "description": "Label to be used to show popup panel sections" }, "popupLessButton_v2": { - "message": "Less", + "message": "Llai", "description": "Label to be used to hide popup panel sections" }, "popupTipGlobalRules": { @@ -268,11 +268,11 @@ "description": "appears in popup" }, "popupHitDomainCount": { - "message": "{{count}} out of {{total}}", + "message": "{{count}} o {{total}}", "description": "appears in popup" }, "popupVersion": { - "message": "Version", + "message": "Fersiwn", "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { @@ -284,7 +284,7 @@ "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { - "message": "Create", + "message": "Creu", "description": "English: Create" }, "pickerPick": { @@ -304,7 +304,7 @@ "description": "English: header for a type of filter in the element picker dialog" }, "pickerCosmeticFilters": { - "message": "Cosmetic filters", + "message": "Hidlyddion arwynebol", "description": "English: Cosmetic filters" }, "pickerCosmeticFiltersHint": { @@ -336,11 +336,11 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Appearance", + "message": "Golwg", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Theme", + "message": "Thema", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { @@ -352,7 +352,7 @@ "description": "" }, "settingsAdvancedUserPrompt": { - "message": "I am an advanced user", + "message": "Rwy'n ddefnyddiwr profiadol", "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { @@ -364,7 +364,7 @@ "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { - "message": "Prevent WebRTC from leaking local IP addresses", + "message": "Rhwystro WebRTC rhag datgelu eich cyfeiriad IP mewnol", "description": "English: " }, "settingPerSiteSwitchGroup": { @@ -376,7 +376,7 @@ "description": "" }, "settingsNoCosmeticFilteringPrompt": { - "message": "Disable cosmetic filtering", + "message": "Analluogi hidlo arwynebol", "description": "" }, "settingsNoLargeMediaPrompt": { @@ -384,11 +384,11 @@ "description": "" }, "settingsNoRemoteFontsPrompt": { - "message": "Block remote fonts", + "message": "Rhwystro ffontiau pell", "description": "" }, "settingsNoScriptingPrompt": { - "message": "Disable JavaScript", + "message": "Analluogi JavaScript", "description": "The default state for the per-site no-scripting switch" }, "settingsNoCSPReportsPrompt": { @@ -400,7 +400,7 @@ "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Advanced", + "message": "Uwch", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { @@ -408,7 +408,7 @@ "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { - "message": "advanced settings", + "message": "gosodiadau uwch", "description": "For the tooltip of a link which gives access to advanced settings" }, "settingsLastRestorePrompt": { @@ -424,7 +424,7 @@ "description": "Appears at the top of the _3rd-party filters_ pane" }, "3pListsOfBlockedHostsPerListStats": { - "message": "{{used}} used out of {{total}}", + "message": "Defnyddir {{used}} o {{total}}", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "3pAutoUpdatePrompt1": { @@ -432,7 +432,7 @@ "description": "A checkbox in the _3rd-party filters_ pane" }, "3pUpdateNow": { - "message": "Update now", + "message": "Diweddaru nawr", "description": "A button in the in the _3rd-party filters_ pane" }, "3pPurgeAll": { @@ -448,11 +448,11 @@ "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { - "message": "Ignore generic cosmetic filters", + "message": "Anwybyddu hidlyddion arwynebol cyffredinol", "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "Generic cosmetic filters are those cosmetic filters which are meant to apply on all web sites. Enabling this option will eliminate the memory and CPU overhead added to web pages as a result of handling generic cosmetic filters.\n\nIt is recommended to enable this option on less powerful devices.", + "message": "Hidlyddion arwynebol cyffredinol yw'r hidlyddion arwynebol hynny sy'n gweithredu ar bob gwefan. Mae galluogi'r dewisiad hwn yn dileu'r pwysau a roddir ar y cof a'r CPU gan wefannau o ganlyniad i drin hidlyddion arwynebol cyffredinol.\n\nArgymhellir galluogi'r dewisiad hwn ar ddyfeisiau llai pwerus.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -472,35 +472,43 @@ "description": "Filter lists section name" }, "3pGroupAds": { - "message": "Ads", + "message": "Hysbysebion", "description": "Filter lists section name" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Preifatrwydd", "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Malware protection, security", + "message": "Diogelwch ac amddiffyn rhag maleiswedd", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", "description": "Filter lists section name" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Pethau diflas", "description": "Filter lists section name" }, "3pGroupMultipurpose": { - "message": "Multipurpose", + "message": "Amlbwrpas", "description": "Filter lists section name" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Rhanbarthau, ieithoedd", "description": "Filter lists section name" }, "3pGroupCustom": { - "message": "Custom", + "message": "Addasedig", "description": "Filter lists section name" }, "3pImport": { - "message": "Import…", + "message": "Mewnforio…", "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { @@ -512,7 +520,7 @@ "description": "used as a tooltip for the out-of-date icon beside a list" }, "3pViewContent": { - "message": "view content", + "message": "gweld y cynnwys", "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { @@ -527,24 +535,28 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Export…", + "message": "Allforio…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", + "message": "fy-hidlyddion-statig_{{datetime}}.txt", "description": "English: my-ublock-static-filters_{{datetime}}.txt" }, "1pApplyChanges": { @@ -568,11 +580,11 @@ "description": "This will persist temporary rules" }, "rulesEdit": { - "message": "Edit", + "message": "Golygu", "description": "Will enable manual-edit mode (textarea)" }, "rulesEditSave": { - "message": "Save", + "message": "Cadw", "description": "Will save manually-edited content and exit manual-edit mode" }, "rulesEditDiscard": { @@ -588,11 +600,11 @@ "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { - "message": "my-ublock-dynamic-rules_{{datetime}}.txt", + "message": "fy-hidlyddion-deinamig_{{datetime}}.txt", "description": "default file name to use" }, "rulesHint": { - "message": "List of your dynamic filtering rules.", + "message": "Rhestr o'ch rheolau hidlo deinamig. ", "description": "English: List of your dynamic filtering rules." }, "rulesFormatHint": { @@ -600,19 +612,19 @@ "description": "English: dynamic rule syntax and full documentation." }, "rulesSort": { - "message": "Sort:", + "message": "Trefnu:", "description": "English: label for sort option." }, "rulesSortByType": { - "message": "Rule type", + "message": "Math o reol", "description": "English: a sort option for list of rules." }, "rulesSortBySource": { - "message": "Source", + "message": "Ffynhonnell", "description": "English: a sort option for list of rules." }, "rulesSortByDestination": { - "message": "Destination", + "message": "Cyrchfan", "description": "English: a sort option for list of rules." }, "whitelistPrompt": { @@ -624,7 +636,7 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Export…", + "message": "Allforio…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { @@ -636,11 +648,11 @@ "description": "English: Apply changes" }, "logRequestsHeaderType": { - "message": "Type", + "message": "Math", "description": "English: Type" }, "logRequestsHeaderDomain": { - "message": "Domain", + "message": "Parth", "description": "English: Domain" }, "logRequestsHeaderURL": { @@ -648,11 +660,11 @@ "description": "English: URL" }, "logRequestsHeaderFilter": { - "message": "Filter", + "message": "Hidlydd", "description": "English: Filter" }, "logAll": { - "message": "All", + "message": "Y cyfan", "description": "Appears in the logger's tab selector" }, "logBehindTheScene": { @@ -660,7 +672,7 @@ "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { - "message": "Current tab", + "message": "Y tab presennol", "description": "Appears in the logger's tab selector" }, "loggerReloadTip": { @@ -680,31 +692,31 @@ "description": "Tooltip for the top-right info label in the logger page" }, "loggerClearTip": { - "message": "Clear logger", + "message": "Clirio'r logiwr", "description": "Tooltip for the eraser in the logger page; used to blank the content of the logger" }, "loggerPauseTip": { - "message": "Pause logger (discard all incoming data)", + "message": "Oedi'r logiwr (diystyru data sy'n cyrraedd)", "description": "Tooltip for the pause button in the logger page" }, "loggerUnpauseTip": { - "message": "Unpause logger", + "message": "Dad-oedi'r logiwr", "description": "Tooltip for the play button in the logger page" }, "loggerRowFiltererButtonTip": { - "message": "Toggle logger filtering", + "message": "Toglo hidlo'r logiwr", "description": "Tooltip for the row filterer button in the logger page" }, "logFilterPrompt": { - "message": "filter logger content", + "message": "hidlo cynnwys yr hidlydd", "description": "Placeholder string for logger output filtering input field" }, "loggerRowFiltererBuiltinTip": { - "message": "Logger filtering options", + "message": "Dewisiadau hidlo'r logiwr", "description": "Tooltip for the button to bring up logger output filtering options" }, "loggerRowFiltererBuiltinNot": { - "message": "Not", + "message": "Nid", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinEventful": { @@ -712,15 +724,15 @@ "description": "A keyword in the built-in row filtering expression: all items corresponding to uBO doing something (blocked, allowed, redirected, etc.)" }, "loggerRowFiltererBuiltinBlocked": { - "message": "blocked", + "message": "wedi rhwystro", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinAllowed": { - "message": "allowed", + "message": "wedi caniatáu", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { - "message": "modified", + "message": "wedi addasu", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin1p": { @@ -732,11 +744,11 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerEntryDetailsHeader": { - "message": "Details", + "message": "Manylion", "description": "Small header to identify the 'Details' pane for a specific logger entry" }, "loggerEntryDetailsFilter": { - "message": "Filter", + "message": "Hidlydd", "description": "Label to identify a filter field" }, "loggerEntryDetailsFilterList": { @@ -744,11 +756,11 @@ "description": "Label to identify a filter list field" }, "loggerEntryDetailsRule": { - "message": "Rule", + "message": "Rheol", "description": "Label to identify a rule field" }, "loggerEntryDetailsContext": { - "message": "Context", + "message": "Cyd-destun", "description": "Label to identify a context field (typically a hostname)" }, "loggerEntryDetailsRootContext": { @@ -760,7 +772,7 @@ "description": "Label to identify a field providing partyness information" }, "loggerEntryDetailsType": { - "message": "Type", + "message": "Math", "description": "Label to identify the type of an entry" }, "loggerEntryDetailsURL": { @@ -772,15 +784,15 @@ "description": "Small header to identify the dynamic URL filtering section" }, "loggerURLFilteringContextLabel": { - "message": "Context:", + "message": "Cyd-destun:", "description": "Label for the context selector" }, "loggerURLFilteringTypeLabel": { - "message": "Type:", + "message": "Math:", "description": "Label for the type selector" }, "loggerStaticFilteringHeader": { - "message": "Static filter", + "message": "Hidlydd statig", "description": "Small header to identify the static filtering section" }, "loggerStaticFilteringSentence": { @@ -788,15 +800,15 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartBlock": { - "message": "Block", + "message": "Rhwystro", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAllow": { - "message": "Allow", + "message": "Caniatáu", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartType": { - "message": "type “{{type}}”", + "message": "math \"{{type}}\"", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAnyType": { @@ -804,7 +816,7 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartOrigin": { - "message": "from “{{origin}}”", + "message": "o \"{{origin}}\"", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAnyOrigin": { @@ -848,19 +860,19 @@ "description": "A logger setting" }, "loggerSettingHideColumnsPrompt": { - "message": "Hide columns:", + "message": "Cuddio colofnau:", "description": "Logger settings: a sentence to describe the purpose of the checkboxes below" }, "loggerSettingHideColumnTime": { - "message": "{{input}} Time", + "message": "{{input}} Amser", "description": "A label for the time column" }, "loggerSettingHideColumnFilter": { - "message": "{{input}} Filter/rule", + "message": "{{input}} Hidlydd/rheol", "description": "A label for the filter or rule column" }, "loggerSettingHideColumnContext": { - "message": "{{input}} Context", + "message": "{{input}} Cyd-destun", "description": "A label for the context column" }, "loggerSettingHideColumnPartyness": { @@ -868,15 +880,15 @@ "description": "A label for the partyness column" }, "loggerExportFormatList": { - "message": "List", + "message": "Rhestr", "description": "Label for radio-button to pick export format" }, "loggerExportFormatTable": { - "message": "Table", + "message": "Tabl", "description": "Label for radio-button to pick export format" }, "loggerExportEncodePlain": { - "message": "Plain", + "message": "Plaen", "description": "Label for radio-button to pick export text format" }, "loggerExportEncodeMarkdown": { @@ -884,19 +896,19 @@ "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { - "message": "Open", + "message": "Agor", "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Creu adroddiad newydd", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Canfod adroddiadau tebyg", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { - "message": "Documentation", + "message": "Dogfennaeth", "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { @@ -904,7 +916,7 @@ "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { - "message": "Questions and support", + "message": "Cwestiynau a chymorth", "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { @@ -948,7 +960,7 @@ "description": "Second paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Adrodd nam ar hidlydd", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS6P1S1": { @@ -964,11 +976,11 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the web page:", + "message": "Cyfeiriad y dudalen we:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The web page…", + "message": "Y dudalen we…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -1012,7 +1024,7 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Polisi preifatrwydd", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { @@ -1020,23 +1032,23 @@ "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Cod ffynhonnell (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Cyfranwyr", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Cod ffynhonnell", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Cyfieithiadau", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Rhestri hidlo", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -1088,39 +1100,39 @@ "description": "No longer used" }, "subscribeButton": { - "message": "Subscribe", + "message": "Tanysgrifio", "description": "For the button used to subscribe to a filter list" }, "elapsedOneMinuteAgo": { - "message": "a minute ago", + "message": "funud yn ôl", "description": "English: a minute ago" }, "elapsedManyMinutesAgo": { - "message": "{{value}} minutes ago", + "message": "{{value}} o funudau yn ôl", "description": "English: {{value}} minutes ago" }, "elapsedOneHourAgo": { - "message": "an hour ago", + "message": "awr yn ôl", "description": "English: an hour ago" }, "elapsedManyHoursAgo": { - "message": "{{value}} hours ago", + "message": "{{value}} awr yn ôl", "description": "English: {{value}} hours ago" }, "elapsedOneDayAgo": { - "message": "a day ago", + "message": "ddiwrnod yn ôl", "description": "English: a day ago" }, "elapsedManyDaysAgo": { - "message": "{{value}} days ago", + "message": "{{value}} o ddiwrnodau yn ôl", "description": "English: {{value}} days ago" }, "showDashboardButton": { - "message": "Show Dashboard", + "message": "Dangos y dashfwrdd", "description": "Firefox/Fennec-specific: Show Dashboard" }, "showNetworkLogButton": { - "message": "Show Logger", + "message": "Dangos y logiwr", "description": "Firefox/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { @@ -1148,11 +1160,11 @@ "description": "English: List of filter list names follows" }, "docblockedBack": { - "message": "Go back", + "message": "Yn ôl", "description": "English: Go back" }, "docblockedClose": { - "message": "Close this window", + "message": "Cau'r ffenestr hon", "description": "English: Close this window" }, "docblockedDontWarn": { @@ -1164,15 +1176,15 @@ "description": "English: Disable strict blocking for {{hostname}} ..." }, "docblockedDisableTemporary": { - "message": "Temporarily", + "message": "Dros dro", "description": "English: Temporarily" }, "docblockedDisablePermanent": { - "message": "Permanently", + "message": "Yn barhaol", "description": "English: Permanently" }, "docblockedDisable": { - "message": "Proceed", + "message": "Parhau", "description": "Button text to navigate to the blocked page" }, "cloudPush": { @@ -1192,7 +1204,7 @@ "description": "" }, "cloudDeviceNamePrompt": { - "message": "This device name:", + "message": "Enw'r ddyfais hon:", "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { @@ -1200,7 +1212,7 @@ "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { - "message": "Submit", + "message": "Cyflwyno", "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { @@ -1228,7 +1240,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "View source code…", + "message": "Gweld y cod ffynhonnell…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1240,23 +1252,27 @@ "description": "Tooltip for the button used to lock scrolling between the views in the 'My rules' pane" }, "genericCopyToClipboard": { - "message": "Copy to clipboard", + "message": "Copïo i'r clipfwrdd", "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Select all", + "message": "Dewis y cyfan", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { - "message": "Toggle cosmetic filtering", + "message": "Toglo hidlo arwynebol", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toglo JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Storage used: {{value}} {{unit}}", + "message": "Storfa: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { @@ -1276,7 +1292,7 @@ "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "Gwallau: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index 7714874..061e781 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -483,6 +483,14 @@ "message": "Malware-beskyttelse, sikkerhed", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sociale widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie-meddelelser", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Gener", "description": "Filter lists section name" @@ -527,20 +535,24 @@ "message": "En netværksfejl forhindrede opdatering af ressourcen.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ét filter pr. linje. Et filter kan være et almindeligt værtsnavn eller et EasyList-kompatibelt filter. Linjer startende med <code>!</code> ignoreres.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Tilføj ikke filtre fra ikke-betroede kilder.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Aktivér mine tilpassede filtre", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Tillad tilpassede filtre som kræver tillid", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { - "message": "Importer og tilføj…", + "message": "Importér og tilføj…", "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Eksporter…", + "message": "Eksportér…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -584,7 +596,7 @@ "description": "" }, "rulesExport": { - "message": "Eksporter til fil…", + "message": "Eksportér til fil…", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -620,11 +632,11 @@ "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { - "message": "Importer og tilføj…", + "message": "Importér og tilføj…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Eksporter…", + "message": "Eksportér…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { @@ -1251,6 +1263,10 @@ "message": "Kosmetisk filtrering til/fra", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript til/fra", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Lemp blokeringstilstand", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 80e8706..4736735 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -168,7 +168,7 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { - "message": "Externe Schriftarten für diese Website zulassen/blockieren", + "message": "Externe Schriftarten für diese Website blockieren/zulassen", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { @@ -320,7 +320,7 @@ "description": "English: Hide placeholders of blocked elements" }, "settingsIconBadgePrompt": { - "message": "Anzahl der blockierten Anfragen auf dem Symbol anzeigen", + "message": "Anzahl der blockierten Anfragen auf dem Symbol in der Symbolleiste anzeigen", "description": "English: Show the number of blocked requests on the icon" }, "settingsTooltipsPrompt": { @@ -483,6 +483,14 @@ "message": "Schutz vor Schadsoftware, Sicherheit", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Soziale Widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie-Hinweise", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Belästigungen", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ein Netzwerkfehler verhinderte die Aktualisierung der Ressource.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ein Filter pro Zeile. Ein Filter kann ein einfacher Hostname oder ein EasyList-kompatibler Filter sein. Zeilen mit vorangestelltem <code>!</code> werden ignoriert.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Verwenden Sie keine Filter aus unseriösen Quellen.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Eigene Filter aktivieren", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Eigene Filter zulassen, die Vertrauen erfordern", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importieren und anfügen …", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Kosmetisches Filtern ein-/ausschalten", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript aktivieren/deaktivieren", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Blockiermodus lockern", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index cb8595c..ea6a4a6 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -483,6 +483,14 @@ "message": "Τομείς κακόβουλου λογισμικού", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Γραφικά στοιχεία κοινωνικής δικτύωσης", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Ειδοποιήσεις για cookies", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Ενοχλήσεις", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ένα σφάλμα δικτύου εμπόδισε την ενημέρωση του πόρου.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ένα φίλτρο ανά γραμμή. Ένα φίλτρο μπορεί να είναι ένα απλό όνομα κεντρικού υπολογιστή ή ένα φίλτρο συμβατό με την EasyList. Οι γραμμές με πρόθεμα <code>!</code> θα παραβλέπονται.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Να μην προστίθενται φίλτρα από μη αξιόπιστες πηγές.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Ενεργοποίηση των προσαρμοσμένων φίλτρων μου", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Επιτρέψτε προσαρμοσμένα φίλτρα που απαιτούν εμπιστοσύνη", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Εισαγωγή και προσάρτηση", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Εναλλαγή διακοσμητικού φιλτραρίσματος", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Εναλλαγή JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Χαλάρωση κατάστασης φραγής", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index b894121..92fb260 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1253,6 +1265,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/en_GB/messages.json b/src/_locales/en_GB/messages.json index cb79ea5..8fd9b46 100644 --- a/src/_locales/en_GB/messages.json +++ b/src/_locales/en_GB/messages.json @@ -483,6 +483,14 @@ "message": "Malware domains", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/eo/messages.json b/src/_locales/eo/messages.json index 6e63e04..1d69a1f 100644 --- a/src/_locales/eo/messages.json +++ b/src/_locales/eo/messages.json @@ -452,11 +452,11 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "Generic cosmetic filters are those cosmetic filters which are meant to apply on all web sites. Enabling this option will eliminate the memory and CPU overhead added to web pages as a result of handling generic cosmetic filters.\n\nIt is recommended to enable this option on less powerful devices.", + "message": "Ĝenerikaj kozmetikaj filtriloj estas tiuj kozmetikaj filtriloj, kiuj estas intencitaj esti aplikitaj sur ĉiuj retejoj. Aktivigante tiun opcion, oni eliminigos la memoran kaj procesorecan ŝarĝon, kiu estas aldonita al retpaĝoj pro la pritraktado de ĝenerikaj kozmetikaj filtriloj.\n\nEstas rekomendite aktivigi tiun opcion sur aparatoj ne estas potencaj.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { - "message": "Suspend network activity until all filter lists are loaded", + "message": "Suspendu retan aktivecon ĝis ĉiuj filtraj listoj estas ŝargitaj.", "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { @@ -483,6 +483,14 @@ "message": "Domajno kun fiprogramaro", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Ĝenoj", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Reta eraro malhelpis ĝisdatigon de la resurso.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Unu filtrilo por ĉiu linio. Filtrilo povas esti ordinara gastignomo aŭ Adblock Plus-kongrua filtrilo. Prefiksitaj linioj kun ‘!’ estos ignorataj.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "Ne aldonu filtrilojn el ne fidindaj fontoj.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importi kaj postaldoni", "description": "Button in the 'My filters' pane" @@ -824,11 +836,11 @@ "description": "Below this sentence, the filter list(s) in which the filter was found" }, "loggerStaticFilteringFinderSentence2": { - "message": "Static filter could not be found in any of the currently enabled filter lists", + "message": "Stata filtro ne povis esti trovita en iu ajn el la nuntempe aktivigitaj filtro-listoj.", "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { - "message": "Logger entries which do not fulfill all three conditions below will be automatically discarded:", + "message": "Logeto-enskriboj, kiuj ne plenumas ĉiujn tri kondiĉojn sube, estos aŭtomate forĵetitaj:", "description": "Logger setting: A sentence to describe the purpose of the settings below" }, "loggerSettingPerEntryMaxAge": { @@ -1251,6 +1263,10 @@ "message": "Baskuligi ornaman filtradon", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Baskuli Javascript-kodoj", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Malstriktigi blokadan reĝimon", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 17652b9..55bd2e9 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -483,6 +483,14 @@ "message": "Protección de malware, seguridad", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgets sociales", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avisos de cookies", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Elementos molestos", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Un error de red impide que se actualicen los recursos.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Un filtro por línea. El filtro puede ser un nombre de dominio, o un filtro compatible con EasyList. Las líneas que comiencen con <code>!</code> serán ignoradas.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "No añadir filtros de fuentes no confiables.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Habilitar mis filtros personalizados", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Permitir filtros personalizados que requieran confianza", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importar y anexar…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Alternar filtrado cosmético", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Alternar JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Modo de bloqueo relajado", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 07d5abd..5ab8cc9 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -483,6 +483,14 @@ "message": "Pahavara kaitse, turvalisus", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sotsiaalvõrgustike vidinad", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Küpsise teatised", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Tüütused", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ressursi uuendamist takistas võrgu viga.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Üks filter rea kohta. Filtriks võib olla tavaline hostinimi või EasyListiga ühilduv filter. Eesliitega <code>!</code> algavaid ridu eiratakse.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Ära lisa filtreid tundmatutest allikatest.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Luba enda loodud filtrid", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Luba usaldusväärsust tõestama peavad enda loodud filtrid", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Impordi ja lisa…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Lülita kosmeetilist filtreerimist", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Lülita JavaScripti", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Rahulik blokeerimisrežiim", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/eu/messages.json b/src/_locales/eu/messages.json index 051bfd9..f5028e5 100644 --- a/src/_locales/eu/messages.json +++ b/src/_locales/eu/messages.json @@ -483,6 +483,14 @@ "message": "Malware domeinuak", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Eragozpenak", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Sare errore batek baliabidea eguneratzea eragotzi du.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Iragazki bat lerroko. Iragazkia hostalari izen soila izan daiteke, edo Adblock Plusekin bateragarria den iragazki bat. Hasieran <code>!</code> duten lerroak ezikusiko dira.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "Ez gehitu jatorri ezezaguneko iragazkirik", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Inportatu eta gehitu", "description": "Button in the 'My filters' pane" @@ -956,11 +968,11 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "Filter lists are updated daily. Be sure your issue has not already been addressed in the most recent filter lists.", + "message": "Iragazki-zerrendak egunero eguneratzen dira. Begiratu zure kasua azken iragazki-zerrendetako baten konpondu den.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { - "message": "Verify that the issue still exists after reloading the problematic webpage.", + "message": "Egiaztatu zure kasua arazoak eman dizkizun webgunea berriz kargatu ostean oraindik ere gertatzen den.", "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { @@ -1251,6 +1263,10 @@ "message": "Iragazte kosmetikoa txandakatu", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScripta aktibatu/desaktibatu", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Baretu blokeatze-modua", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1280,7 +1296,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Could not filter properly at browser launch. Reload the page to ensure proper filtering.", + "message": "Iragazkia ezin izan da kargatu nabigatzailea irekitzeak. Kargatu berriz orria iragazkiak ondo funtzionatzen duela ziurtatzeko.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/fa/messages.json b/src/_locales/fa/messages.json index 7736f8d..ef05c73 100644 --- a/src/_locales/fa/messages.json +++ b/src/_locales/fa/messages.json @@ -483,6 +483,14 @@ "message": "دامنه های مخرب", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "اطلاعیههای کلوچک", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "مزاحمها", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "یک خطای شبکه از بروزشدن این منبع جلوگیری کرد.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "یک فیلتر در هر خط. یک فیلتر می تواند آدرس هاست ساده یا فیلتر سازگار با Adblock plus باشد. خطوط با پیشوند ‘!’ نادیده گرفته می شوند.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "پالایهها از منابع نامعتبر افزوده نشود.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "فعالسازی پالایههای سفارشی من", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "اجازهدهی به پالایههای سفارشی نیازمند اعتمادسازی ", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "وارد کردن و الحاق", "description": "Button in the 'My filters' pane" @@ -956,7 +968,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "Filter lists are updated daily. Be sure your issue has not already been addressed in the most recent filter lists.", + "message": "فهرستهای پالایش روزانه بهروز میشوند. مطمئن شوید که مشکل شما پیشتر در فهرستهای پالایش اخیر بررسی نشده باشد.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { @@ -1128,7 +1140,7 @@ "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { - "message": "Page blocked", + "message": "صفحه مسدود شده است", "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { @@ -1156,7 +1168,7 @@ "description": "English: Close this window" }, "docblockedDontWarn": { - "message": "Don't warn me again about this site", + "message": "دیگر در مورد این تارنما هشداری به من داده نشود", "description": "Label for checkbox in document-blocked page" }, "docblockedProceed": { @@ -1172,7 +1184,7 @@ "description": "English: Permanently" }, "docblockedDisable": { - "message": "Proceed", + "message": "ادامه", "description": "Button text to navigate to the blocked page" }, "cloudPush": { @@ -1228,7 +1240,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "View source code…", + "message": "مشاهده کد منبع…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "تغییر وضعیت جاوا اسکریپت", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "حالت بلاککردن غیرسختگیر", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1276,7 +1292,7 @@ "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "خطا: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index fb3028e..da52acf 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -483,6 +483,14 @@ "message": "Haittaohjelmasuojaus, tietoturva", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sosiaaliset widgetit", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Evästeilmoitukset", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Ärsykkeet", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Verkkovirhe esti resurssin päivityksen.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Yksi suodatin riviä kohden. Suodatin voi olla pelkkä osoite tai EasyList-yhteensopiva suodatin. Rivit, joiden alussa on <code>!</code>, ohitetaan.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Älä lisää suodattimia lähteistä, joihin et luota.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Ota omat suodattimet käyttöön", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Tuo ja lisää…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Kytke kosmeettinen suodatus", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Kytke JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Kevennetty estotila", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/fil/messages.json b/src/_locales/fil/messages.json index e5b679d..d38e062 100644 --- a/src/_locales/fil/messages.json +++ b/src/_locales/fil/messages.json @@ -483,6 +483,14 @@ "message": "Mga domain na may malware", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Mga nakakaabalang bagay", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Hindi na-update ang resource dahil sa isang network error.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Isang filter kada linya. Pwedeng simpleng hostname o EasyList-compatible ang filter. Hindi papansinin ang mga linyang nagsisimula sa <code>!</code>.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Huwag magdagdag ng pangsala mula sa mga hindi katiwa-tiwalang pinagmulan.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "I-import at idagdag", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Paandarin/patayin ang kosmetikong pagfi-filter", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Babaan ang lebel ng pagharang", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 8b8cfc5..fda2589 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -483,6 +483,14 @@ "message": "Protection anti-malware et sécurité", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgets de réseaux sociaux", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Bannières de cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Nuisances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Une erreur réseau a empêché la mise à jour de la ressource.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Une règle par ligne. Une règle peut être un simple nom d'hôte, ou encore une règle compatible EasyList. Les lignes débutant par <code>!</code> seront ignorées.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Il est recommandé de ne pas ajouter de filtres en provenance de sources non fiables.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Activer mes filtres personnalisés", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Faire confiance aux filtres personnalisés", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importer", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Commuter le filtrage esthétique", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Commuter JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Détendre le mode de blocage", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index 886b764..ef97ec1 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -483,6 +483,14 @@ "message": "Malwaredomeinen", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sosjale widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookiemeldingen", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Ungeriif", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "In netwurkflater hat opkeard dat de boarne bywurke waard.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ien filter per rigel. In filter kin in gewoane hostnamme of in Adblock Plus-kompatibel filter wêze. Rigels begjinnend mei <code>!</code> wurde negearre.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Foegje gjin filters fan ûnbekende boarnen ta.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Myn oanpaste filters ynskeakelje", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Oanpaste filters dy’t fertrouwen fereaskje tastean", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Ymportearje en tafoegje", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Kosmetyske filters yn-/útskeakelje", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript yn-/útskeakelje", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Blokkearringsmodus beheine", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index b97b2d5..291dc09 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -483,6 +483,14 @@ "message": "Dominios de <i>malware</i>", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgets sociais", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avisos de rastro", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Molestias", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Un erro de rede está a impedir que se actualicen os recursos.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Un filtro por cada liña. O filtro pode ser un nome de servidor, ou un filtro compatible co Adblock Plus. As liñas que comecen con <code>!</code> seranche ignoradas.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Non engadir filtros de fontes non confiables.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Activar os meus filtros personais", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Requerir confiar nos filtros personalizados", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importar e engadir…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Activar filtrado cosmético", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Alternar JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaxar o modo de bloqueo", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/gu/messages.json b/src/_locales/gu/messages.json index 3e3b5db..9db2f73 100644 --- a/src/_locales/gu/messages.json +++ b/src/_locales/gu/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index 3bc7bd2..b036e93 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -480,7 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "ביטחון והגנה מפני נוזקה", + "message": "הגנה מפני נוזקות, אבטחה", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "יישומונים חברתיים", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "הודעות בקשר לעוגיות", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -527,20 +535,24 @@ "message": "בעיית רשת מנעה מהמשאב להתעדכן.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "מסנן אחד לכל שורה. המסנן יכול להיות דומיין פשוט, או מסנן התואם ל- EasyList. שורות עם קידומת <code>!</code> לא יפורשו.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "אל תוסיף מסננים ממקורות לא מהימנים.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "אפשור מסננים מותאמים אישית", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "אפשור למסננים מותאמים אישית לדרוש אמון", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { - "message": "ייבא וצרף", + "message": "ייבא וצרף…", "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "ייצוא", + "message": "ייצוא…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -584,7 +596,7 @@ "description": "" }, "rulesExport": { - "message": "ייצא לקובץ...", + "message": "ייצא לקובץ…", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -620,11 +632,11 @@ "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { - "message": "ייבא וצרף", + "message": "ייבא וצרף…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "ייצוא", + "message": "ייצוא…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { @@ -1251,6 +1263,10 @@ "message": "הפעל/כבה מסננים קוסמטיים", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "מיתוג JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "הרפה את מצב החסימה הנוכחי", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1280,7 +1296,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "לא ניתן היה לסנן כראוי בעת הפעלת הדפדפן. טען מחדש את הדף כדי להבטיח סינון מתאים.", + "message": "לא ניתן היה לסנן כראוי בעת הפעלת הדפדפן. נא לטעון את העמוד מחדש להבטחת סינון ראוי.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json index 0671acb..9a596a8 100644 --- a/src/_locales/hi/messages.json +++ b/src/_locales/hi/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "आख़िरकार, क्रोमियम-बेस्ड ब्राउज़रों के लिए एक कुशल अवरोधक। CPU और स्मृति पर आसान।", + "message": "आख़िरकार, क्रोमियम-बेस्ड ब्राउज़रों के लिए एक कुशल अवरोधक। सीपीयू और मेमोरी पर कम भार के साथ।\n", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -16,7 +16,7 @@ "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "रुकें", + "message": "यहाँ रुकें", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { @@ -36,7 +36,7 @@ "description": "appears as tab name in dashboard" }, "rulesPageName": { - "message": "मेरे नियम", + "message": "मेरे नियमों", "description": "appears as tab name in dashboard" }, "whitelistPageName": { @@ -240,7 +240,7 @@ "description": "" }, "popup3pAnyRulePrompt": { - "message": "तृतीय-पक्ष", + "message": "तीसरे पक्ष", "description": "" }, "popup3pPassiveRulePrompt": { @@ -352,7 +352,7 @@ "description": "" }, "settingsAdvancedUserPrompt": { - "message": "मैं एक उच्च उपयोगकर्ता हूँ (<a href='https://github.com/gorhill/uBlock/wiki/Advanced-user-features'>आवश्यक पठन</a>)", + "message": "मैं एक उन्नत प्रयोक्ता हूँ", "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { @@ -483,6 +483,14 @@ "message": "मैलवेयर डोमेन", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "सोशल विज़ेट्स", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "कुकी सूचनाएं", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "सतानेवाले विज्ञापन", "description": "Filter lists section name" @@ -500,7 +508,7 @@ "description": "Filter lists section name" }, "3pImport": { - "message": "इम्पोर्ट ", + "message": "इम्पोर्ट...", "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { @@ -516,7 +524,7 @@ "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { - "message": "अन्तिम अद्यातन: {{ago}}. कृत्रिम नवीकरण के लिए क्लिक की जिए", + "message": "अन्तिम अद्यातन: {{ago}}. \nकृत्रिम नवीकरण के लिए क्लिक की जिए", "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { @@ -527,14 +535,18 @@ "message": "एक नेटवर्क त्रुटि ने रिसोर्स को अपडेट होने से रोक दिया। ", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "एक लाइन में एक फ़िल्टर। एक फ़िल्टर सीधा होस्टनाम, या एक Adblock Plus- योग्य फ़िल्टर हो सकता है। <code>!<code></code>से शुरू होने वाली लाइनों को नज़रअंदाज किया जायेगा।", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "अविश्वसनीय स्रोतों से फ़िल्टर न जोड़ें.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "मेरे कस्टम फ़िल्टर सक्षम करें", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "विश्वास की आवश्यकता वाले कस्टम फ़िल्टर की अनुमति दें", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "इम्पोर्ट करें और जोड़ें", "description": "Button in the 'My filters' pane" @@ -584,7 +596,7 @@ "description": "" }, "rulesExport": { - "message": "फाइल में एक्सपोर्ट करें ", + "message": "फाइल में एक्सपोर्ट करें...", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -1080,7 +1092,7 @@ "description": "Message asking user to confirm reset" }, "errorCantConnectTo": { - "message": "नेटवर्क त्रुटि : {{msg}}", + "message": "नेटवर्क त्रुटि: {{msg}}", "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { @@ -1088,19 +1100,19 @@ "description": "No longer used" }, "subscribeButton": { - "message": "सबˈस्क्राइब्", + "message": "फ़िल्टर सूची का उपयोग करें", "description": "For the button used to subscribe to a filter list" }, "elapsedOneMinuteAgo": { - "message": "एक मिनट पहले", + "message": "एक मिनट पेहेले ", "description": "English: a minute ago" }, "elapsedManyMinutesAgo": { - "message": "{{value}} मिनट पहले", + "message": "{{value}} मिनट पेहेले ", "description": "English: {{value}} minutes ago" }, "elapsedOneHourAgo": { - "message": "एक घंटे पहले", + "message": "एक घंटे पेहेले ", "description": "English: an hour ago" }, "elapsedManyHoursAgo": { @@ -1148,7 +1160,7 @@ "description": "English: List of filter list names follows" }, "docblockedBack": { - "message": "वापस जाएँ", + "message": "पीछे जाएं", "description": "English: Go back" }, "docblockedClose": { @@ -1172,7 +1184,7 @@ "description": "English: Permanently" }, "docblockedDisable": { - "message": "आगे बढ़ें", + "message": "आगे बढ़ें", "description": "Button text to navigate to the blocked page" }, "cloudPush": { @@ -1251,6 +1263,10 @@ "message": "कॉस्मेटिक फ़िल्टरिंग टॉगल करें", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "जावास्क्रिप्ट टॉगल करें", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "ब्लैकिंग मोड को ढील दें", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index edceb34..bb5ed41 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -483,6 +483,14 @@ "message": "Zaštita od zlonamjernog softvera, sigurnost", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Socijalni widgeti", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Obavijest o kolačićima", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Nametljivost", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Mrežna pogreška je sprječila ažuriranje resursa.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Jedan filter po retku. Filter može biti običan hostname ili filter kompatibilan sa EasyList-om. Linije sa prefiksom <code>!</code> zanemarit će se.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nemojte dodavati filtere iz nepouzdanih izvora.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Omogući moje prilagođene filtre", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Dopusti prilagođene filtre koji zahtijevaju povjerenje", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Uvesti i dodati...", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Prekidač estetskog filtriranja", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Uključi/isključi JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Opušteni način blokiranja", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index f4c8e47..b41a850 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -483,6 +483,14 @@ "message": "Malware domainek", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Közösségi widgetek", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Sütiértesítések", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Kellemetlenségek", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Egy hálózati hiba megakadályozta az erőforrás frissítését.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Soronként egy szűrő. A szűrő lehet egy hostnév, vagy egy Adblock Plus kompatibilis szűrő.\nA <code>!</code> kezdetű sorok figyelmen kívül maradnak.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Ne adj hozzá szűrőket megbízhatatlan forrásokból.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Egyedi szűrőim engedélyezése", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Megbízhatóságot igénylő egyéni szűrők engedélyezése", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importál és hozzáad", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Kozmetikai szűrés kapcsolása", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Javascript ki/bekapcsolása", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaxáló blokkolási mód", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/hy/messages.json b/src/_locales/hy/messages.json index 291d67c..7910731 100644 --- a/src/_locales/hy/messages.json +++ b/src/_locales/hy/messages.json @@ -483,6 +483,14 @@ "message": "Վնասակար տիրույթներ", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Ջղայնացնող տարրեր", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ցանցի սխալի պատճառով թարմացումը տեղի չունեցավ։", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Մեկ տողում մեկ զտիչ։ Որպես զտիչ կարող է լինել կայքի անուն կամ EasyList-համաեղելի զտիչ։ <code>! </code>-ով սկսվող տողերը կանտեսվեն։", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Մի՛ ավելացրեք զտիչներ անվստահելի աղբյուրներից։", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Ներմուծել և հավելել", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Փոխանջատել կոսմետիկ զտումը", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Արգելափակման թուլացված ռեժիմ", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 21629c1..684fcc6 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -483,6 +483,14 @@ "message": "Perlindungan malware, keamanan", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Gangguan", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Galat jaringan mencegah sumber daya diperbarui.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Satu filter per baris. Filter dapat berupa nama hos, atau filter yang kompatibel dengan EasyList. Baris yang diawali dengan <code>!</code> akan diabaikan.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Jangan tambah filter dari sumber yang tidak tepercaya.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Impor dan tambahkan…", "description": "Button in the 'My filters' pane" @@ -704,7 +716,7 @@ "description": "Tooltip for the button to bring up logger output filtering options" }, "loggerRowFiltererBuiltinNot": { - "message": "Bukan", + "message": "Tidak", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinEventful": { @@ -1251,6 +1263,10 @@ "message": "Aktif/Nonaktifkan filter tampilan", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Aktif/Nonaktifkan JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Perlonggar mode pemblokiran", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index 000b19e..c87a90f 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Whitelist", + "message": "Siti affidabili", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { @@ -483,6 +483,14 @@ "message": "Domini con Malware", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widget sociali", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avviso sui cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Elementi fastidiosi", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Un errore di rete ha impedito l'aggiornamento della risorsa.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Un filtro per riga. Un filtro può essere un semplice hostname, o un filtro compatibile con EasyList. Ogni riga che comincia con <code>!</code> verrà ignorata.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Non aggiungere filtri da fonti non attendibili.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Abilita i miei filtri personalizzati", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Consenti i filtri personalizzati che richiedono affidabilità", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importa e aggiungi", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Attiva/Disattiva filtri cosmetici", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Attiva o disattiva JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Rilassa la modalità di blocco", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 0293e53..add025f 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -483,6 +483,14 @@ "message": "マルウェアドメイン", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "SNS ウィジェット", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "クッキー通知", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "迷惑系", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "ネットワークエラーが発生したため、リソースを更新できませんでした。", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "1 行につき 1 つのフィルターです。フィルターはただのホスト名でも EasyList と同じ形式でも構いません。<code>!</code> を先頭に付けた行は無視されます。", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "信頼できないソースからフィルターを追加しないでください。", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "マイカスタムフィルターを有効化", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "信頼が必要なカスタムフィルターを許可する", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "インポートと追加", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "整形フィルタリングの有効/無効を切り替える", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript の切り替え", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "ブロッキングモードを緩和する", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index 999553c..da9ea63 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -60,7 +60,7 @@ "description": "appears as tab name in dashboard" }, "assetViewerPageName": { - "message": "uBlock₀ — რესურსები", + "message": "uBlock₀ — მასალების ნახვა", "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { @@ -72,11 +72,11 @@ "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "დააწკაპეთ uBlock₀-ის გამოსართავად ამ საიტზე.\n\nCtrl+დაწკაპებით uBlock₀ მხოლოდ ამ გვერდზე გამოირთვება.", + "message": "დაწკაპეთ, რომ გაითიშოს uBlock₀ ამ საიტისთვის.\n\nCtrl+დაწკაპებით uBlock₀ მხოლოდ ამ გვერდზე გაითიშება.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "დააწკაპეთ uBlock₀-ის ჩასართავად ამ საიტზე.", + "message": "დაწკაპეთ, რომ ჩაირთოს uBlock₀ ამ საიტისთვის.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -136,11 +136,11 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "დააწკაპეთ ყველა ამომხტომი ფანჯრის შესაზღუდად ამ საიტზე", + "message": "დაწკაპეთ, რომ ყველა ამომხტომი ფანჯარა შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "დააწკაპეთ, ამომხტომი ფანჯრების შეზღუდვის გასაუქმებლად ამ საიტზე", + "message": "დაწკაპეთ, რომ ამომხტომი ფანჯრები აღარ შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -148,11 +148,11 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "დააწკაპეთ დიდი მედიაფაილების შესაზღუდად ამ საიტზე", + "message": "დაწკაპეთ, რომ დიდი მედიაფაილები შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "დააწკაპეთ დიდი მედიაფაილების შეზღუდვის გასაუქმებლად ამ საიტზე", + "message": "დაწკაპეთ, რომ დიდი მედიაფაილები აღარ შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -164,7 +164,7 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "დააწკაპეთ გარეგნული ნაწილების გასაფილტრად ამ საიტზე", + "message": "დაწკაპეთ გარეგნული ნაწილების გასაფილტრად ამ საიტზე", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -172,19 +172,19 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { - "message": "დააწკაპეთ ვებშრიფტების შესაზღუდად ამ საიტზე", + "message": "დაწკაპეთ, რომ ვებშრიფტები შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "დააწკაპეთ ვებშრიფტების შეზღუდვის გასაუქმებლად ამ საიტზე", + "message": "დაწკაპეთ, რომ ვებშრიფტები აღარ შეიზღუდოს ამ საიტზე", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { - "message": "დააწკაპეთ JavaScript-ის გასათიშად ამ საიტზე", + "message": "დაწკაპეთ, რომ გაითიშოს JavaScript ამ საიტზე", "description": "Tooltip for the no-scripting per-site switch" }, "popupTipNoScripting2": { - "message": "დააწკაპეთ JavaScript-ზე შეზღუდვის მოსახსნელად ამ საიტზე", + "message": "დაწკაპეთ, რომ აღარ გაითიშოს JavaScript ამ საიტზე", "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { @@ -332,7 +332,7 @@ "description": "English: Make use of context menu where appropriate" }, "settingsColorBlindPrompt": { - "message": "ფერთა გასწორება დაქვეითებულად მხედველთათვის", + "message": "ფერთა მორგება სუსტად მხედველთათვის", "description": "English: Color-blind friendly" }, "settingsAppearance": { @@ -360,7 +360,7 @@ "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { - "message": "ბმულებით სარგებლობაზე თვალყურის დევნების არიდება", + "message": "ბმულებით სარგებლობისას აღრიცხვის არიდება", "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { @@ -376,7 +376,7 @@ "description": "" }, "settingsNoCosmeticFilteringPrompt": { - "message": "გარეგნული ნაწილების ფილტრის გათიშვა", + "message": "გარეგნული ნაწილების გაფილტვრის გათიშვა", "description": "" }, "settingsNoLargeMediaPrompt": { @@ -424,7 +424,7 @@ "description": "Appears at the top of the _3rd-party filters_ pane" }, "3pListsOfBlockedHostsPerListStats": { - "message": "{{total}}-დან გამოიყენება {{used}}", + "message": "{{total}}-იდან გამოიყენება {{used}}", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "3pAutoUpdatePrompt1": { @@ -444,7 +444,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "გარეგნული ფილტრები, ძირითადად, იმ ხილული ნაწილების დასამალად გამოიყენება ვებგვერდზე, რომელთაც ქსელის მოთხოვნაზე დაფუძნებული ფილტრები ვერ ზღუდავს.", + "message": "გარეგნული ფილტრები, ჩვეულებრივ, ვებგვერდზე იმ ხილული ნაწილების დასამალად გამოიყენება, რომლებზეც ქსელში მოთხოვნის შემზღუდავი ფილტრები ვერ მოქმედებს.", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "გარეგნული საერთო ფილტრები ისეთი ფილტრებია, რომლებიც ყველა ვებსაიტზე მოქმედებს. ამ პარამეტრის ჩართვით კი თავიდან აიცილებთ გარეგნული საერთო ფილტრების შედეგად მეხსიერებისა და პროცესორის ზედმეტ დატვირთვას.\n\nამ პარამეტრის ჩართვა სასურველია სუსტ მოწყობილობებზე.", + "message": "გარეგნული საერთო ფილტრებია, რომლებიც ყველა ვებსაიტზე მოქმედებს. ამ პარამეტრის ჩართვით კი თავიდან აიცილებთ გარეგნული საერთო ფილტრებით მეხსიერებისა და პროცესორის ზედმეტ დატვირთვას.\n\nამ პარამეტრის ჩართვა სასურველია სუსტ მოწყობილობებზე.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -483,6 +483,14 @@ "message": "მავნე დომენები", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "სოცქსელების ნაწილები", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "ცნობები ფუნთუშების შესახებ", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "შემაწუხებელი შიგთავსი", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "ქსელის შეცდომის შედეგად, შიგთავსის განახლება ვერ მოხერხდა.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "თითოეული ფილტრი ცალკეულ ხაზზე. ფილტრი შეიძლება იყოს საიტის უბრალო დასახელება ან Adblock Plus-სთან თავსებადი მითითებები. ხაზები ‘!’ თავსართით უგულებელყოფილი იქნება.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "ფილტრების არიდება არასანდო წყაროებიდან.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "საკუთარი ფილტრების ამოქმედება", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "ნების დართვა მორგებული ფილტრებისთვის, რომლებიც ნდობას ითხოვს", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "შემოტანა და დამატება", "description": "Button in the 'My filters' pane" @@ -544,7 +556,7 @@ "description": "Button in the 'My filters' pane" }, "1pExportFilename": { - "message": "ჩემი-ublock-მუდმივი-ფილტრები_{{datetime}}.txt", + "message": "ჩემი-უცვლელი-ublock-ფილტრები_{{datetime}}.txt", "description": "English: my-ublock-static-filters_{{datetime}}.txt" }, "1pApplyChanges": { @@ -676,7 +688,7 @@ "description": "Tooltip for the popup panel button in the logger page" }, "loggerInfoTip": { - "message": "uBlock Origin-ის ვიკი: აღმრიცხავი", + "message": "uBlock-Origin-ცნობარი: აღმრიცხავი", "description": "Tooltip for the top-right info label in the logger page" }, "loggerClearTip": { @@ -780,7 +792,7 @@ "description": "Label for the type selector" }, "loggerStaticFilteringHeader": { - "message": "მუდმივი ფილტრები", + "message": "უცვლელი ფილტრები", "description": "Small header to identify the static filtering section" }, "loggerStaticFilteringSentence": { @@ -820,11 +832,11 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringFinderSentence1": { - "message": "მუდმივი ფილტრი <code>{{filter}}</code> ნაპოვნია სიაში:", + "message": "უცვლელი ფილტრი <code>{{filter}}</code> ნაპოვნია სიაში:", "description": "Below this sentence, the filter list(s) in which the filter was found" }, "loggerStaticFilteringFinderSentence2": { - "message": "მუდმივი ფილტრი <code>{{filter}}</code> ვერ მოიძებნა ამჟამად გამოყენებულ ფილტრებს შორის", + "message": "უცვლელი ფილტრი ვერ მოიძებნა ამჟამად გამოყენებულ ფილტრებში", "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { @@ -900,7 +912,7 @@ "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { - "message": "დამატებითი მასალებისთვის იხილეთ <code>uBlock/wiki</code>, რომ უკეთ გაეცნოთ uBlock Origin-ის შესაძლებლობებს.", + "message": "დამატებითი მასალებისთვის იხილეთ <code>uBlock/wiki</code>, რომ უკეთ გაიცნოთ uBlock Origin და მისი შესაძლებლობები.", "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { @@ -912,7 +924,7 @@ "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { - "message": "ფილტრის ხარვეზი/საიტი დაზიანდა", + "message": "ფილტრის ხარვეზი/გაუმართაობა საიტზე", "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { @@ -920,7 +932,7 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { - "message": "<b>ყურადღება:</b> ეცადეთ, არ გამოიყენოთ სხვა მსგავსი დანიშნულების შემზღუდავები uBlock Origin-თან ერთად, ვინაიდან წარმოშობს ფილტრების ხარვეზებს ცალკეულ საიტებზე.", + "message": "<b>ყურადღება:</b> ეცადეთ, არ გამოიყენოთ uBlock Origin და სხვა მსგავსი შემზღუდავები ერთდროულად, ვინაიდან წარმოიქმნება ფილტრების ხარვეზები ცალკეულ საიტებზე.", "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { @@ -1132,11 +1144,11 @@ "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { - "message": "uBlock Origin-მა შეზღუდა მოცემული გვერდის ჩატვირთვა:", + "message": "uBlock Origin ზღუდავს მოცემული გვერდის ჩატვირთვას:", "description": "Used in the strict-blocking page" }, "docblockedPrompt2": { - "message": "მოცემული ფილტრიდან გამომდინარე", + "message": "აღნიშნული ფილტრის მიხედვით:", "description": "Used in the strict-blocking page" }, "docblockedNoParamsPrompt": { @@ -1144,7 +1156,7 @@ "description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png" }, "docblockedFoundIn": { - "message": "პოვნა:", + "message": "შეიცავს:", "description": "English: List of filter list names follows" }, "docblockedBack": { @@ -1196,7 +1208,7 @@ "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { - "message": "გაფრთხილება! გაფართოებული პარამეტრების ცვლილების შედეგებზე, თავად იქნებით პასუხისმგებელი.", + "message": "გაფრთხილება! გაფართოებული პარამეტრების ჩასწორების შედეგებზე თავად იქნებით პასუხისმგებელი.", "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { @@ -1251,6 +1263,10 @@ "message": "გარეგნული ფილტრის ჩამრთველი", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript-ის ჩამრთველი", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "მსუბუქი შეზღუდვის რეჟიმი", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/kk/messages.json b/src/_locales/kk/messages.json index 9cf48a4..bd037e0 100644 --- a/src/_locales/kk/messages.json +++ b/src/_locales/kk/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Бөгеу режимі", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/kn/messages.json b/src/_locales/kn/messages.json index 567a8e5..8b9fccc 100644 --- a/src/_locales/kn/messages.json +++ b/src/_locales/kn/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "ಕೊನೆಗೂ, ಒಂದು ದಕ್ಷ ನಿರ್ಬಂಧಕ. ಮಿತವಾದ ಸಿಪಿಯೂ ಹಾಗು ಮೆಮೊರಿ ಬಳಕೆ.", + "message": "ಕೊನೆಗೆ, ಒಂದು ದಕ್ಷ ನಿರ್ಬಂಧಕ. ಮಿತವಾದ ಸಿಪಿಯೂ ಹಾಗು ಮೆಮೊರಿ ಬಳಿಕೇಒಂದಿಗೆ .", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -16,11 +16,11 @@ "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "Stay here", + "message": "ಇಲ್ಲೇ ಇರು", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { - "message": "Ignore", + "message": "ನಿರ್ಲಕ್ಷಿಸು", "description": "Label for button to ignore unsaved changes" }, "settingsPageName": { @@ -44,7 +44,7 @@ "description": "appears as tab name in dashboard" }, "shortcutsPageName": { - "message": "Shortcuts", + "message": "ಶಾರ್ಟ್ಕಟ್ಗಳು", "description": "appears as tab name in dashboard" }, "statsPageName": { @@ -56,11 +56,11 @@ "description": "appears as tab name in dashboard" }, "supportPageName": { - "message": "Support", + "message": "ಬೆಂಬಲ", "description": "appears as tab name in dashboard" }, "assetViewerPageName": { - "message": "uBlock₀ — Asset viewer", + "message": "uBlock₀ — ಆಸ್ತಿ ವೀಕ್ಷಕ", "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { @@ -108,7 +108,7 @@ "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { - "message": "Domains connected", + "message": "ಸಂಪರ್ಕಳಗಿಸಿದ ಡೊಮೈನುಗಳು ", "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { @@ -204,15 +204,15 @@ "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { - "message": "JavaScript", + "message": "ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್", "description": "Caption for the no-scripting per-site switch" }, "popupMoreButton_v2": { - "message": "More", + "message": "ಅಧಿಕ", "description": "Label to be used to show popup panel sections" }, "popupLessButton_v2": { - "message": "Less", + "message": "ಕಡಿಮೆ", "description": "Label to be used to hide popup panel sections" }, "popupTipGlobalRules": { @@ -272,15 +272,15 @@ "description": "appears in popup" }, "popupVersion": { - "message": "Version", + "message": "ಆವೃತ್ತಿ", "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "script", + "message": "ಸ್ಕ್ರಿಪ್ಟ್", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { - "message": "frame", + "message": "ಫ್ರೇಮ್", "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { @@ -296,7 +296,7 @@ "description": "English: Quit" }, "pickerPreview": { - "message": "Preview", + "message": "ಮುನ್ನೋಟ", "description": "Element picker preview mode: will cause the elements matching the current filter to be removed from the page" }, "pickerNetFilters": { @@ -336,11 +336,11 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Appearance", + "message": "ನೋಟ", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Theme", + "message": "ಥೀಮ್", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { @@ -352,7 +352,7 @@ "description": "" }, "settingsAdvancedUserPrompt": { - "message": "I am an advanced user", + "message": "ನಾನು ಮುಂದುವರಿದ ಬಳಕೆದಾರ", "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { @@ -400,7 +400,7 @@ "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Advanced", + "message": "ಉನ್ನತ ಸಂಯೋಜನೆಗಳು", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { @@ -408,7 +408,7 @@ "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { - "message": "advanced settings", + "message": "ಮು೦ದುವರಿದ ಸೆಟ್ಟಿಂಗ್ಸ್", "description": "For the tooltip of a link which gives access to advanced settings" }, "settingsLastRestorePrompt": { @@ -416,11 +416,11 @@ "description": "English: Last restore:" }, "settingsLastBackupPrompt": { - "message": "Last backup:", + "message": "ಕೊನೆಯ ಬ್ಯಾಕಪ್:", "description": "English: Last backup:" }, "3pListsOfBlockedHostsPrompt": { - "message": "{{netFilterCount}} network filters + {{cosmeticFilterCount}} cosmetic filters from:", + "message": "ಕೆಳಗಿನ ಫೈಲಟ್ರ್ಪಟ್ಟಿಗೆಯಿಂದ {{netFilterCount}} ನೆಟ್ವರ್ಕ್ ಫಿಲ್ಟರ್ಗಳು + {{cosmeticfiltercount}} ಕಾಸ್ಮೆಟಿಕ್ ಶೋಧಕಗಳು ಕ್ರಿಯಾಶೀಲವಾಗಿದೆ:", "description": "Appears at the top of the _3rd-party filters_ pane" }, "3pListsOfBlockedHostsPerListStats": { @@ -480,7 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Malware protection, security", + "message": "ಮಾಲ್ವೇರ್ ರಕ್ಷಣೆ, ಭದ್ರತೆ", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -500,7 +508,7 @@ "description": "Filter lists section name" }, "3pImport": { - "message": "Import…", + "message": "ಆಮದು...", "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { @@ -520,23 +528,27 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "Updating…", + "message": "ಸೇರಿಸಲಾಗುತ್ತಿದೆ...", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { - "message": "ಆಮದಿಸಿ ಸೇರ್ಪಡಿಸು", + "message": "ಆಮದಿಸಿ ಸೇರ್ಪಡಿಸು...", "description": "Button in the 'My filters' pane" }, "1pExport": { @@ -544,7 +556,7 @@ "description": "Button in the 'My filters' pane" }, "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", + "message": "ನನ್ನ-ublock-ಸ್ಥಿರ-ಶೋಧಕಗಳು_{{datetime}}.txt", "description": "English: my-ublock-static-filters_{{datetime}}.txt" }, "1pApplyChanges": { @@ -580,7 +592,7 @@ "description": "Will discard manually-edited content and exit manual-edit mode" }, "rulesImport": { - "message": "Import from file…", + "message": "ಫೈಲಿಂದ ಆಮದಿಸು...\n", "description": "" }, "rulesExport": { @@ -588,7 +600,7 @@ "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { - "message": "my-ublock-dynamic-rules_{{datetime}}.txt", + "message": "ನನ್ನ-ublock-ಡೈನಾಮಿಕ್-ಫಿಲ್ಟರ್-ನಿಯಮಗಳು_{{datetime}}.txt", "description": "default file name to use" }, "rulesHint": { @@ -608,11 +620,11 @@ "description": "English: a sort option for list of rules." }, "rulesSortBySource": { - "message": "Source", + "message": "ಮೂಲ", "description": "English: a sort option for list of rules." }, "rulesSortByDestination": { - "message": "Destination", + "message": "ಗಮ್ಯಸ್ಥಾನ", "description": "English: a sort option for list of rules." }, "whitelistPrompt": { @@ -620,27 +632,27 @@ "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { - "message": "Import and append…", + "message": "ಆಮದಿಸಿ ಸೇರ್ಪಡಿಸು", "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Export…", + "message": "ರಫ್ತು...\n", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", + "message": "ನನ್ನ-ublock-ವಿಶ್ವಾಸಾರ್ಹ-ಸೈಟ್ಗಳು_{{datetime}}.txt", "description": "The default filename to use for import/export purpose" }, "whitelistApply": { - "message": "Apply changes", + "message": "ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಿ", "description": "English: Apply changes" }, "logRequestsHeaderType": { - "message": "Type", + "message": "ವಿಧ", "description": "English: Type" }, "logRequestsHeaderDomain": { - "message": "Domain", + "message": "ಡೊಮೇನ್", "description": "English: Domain" }, "logRequestsHeaderURL": { @@ -660,7 +672,7 @@ "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { - "message": "Current tab", + "message": "ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್", "description": "Appears in the logger's tab selector" }, "loggerReloadTip": { @@ -716,7 +728,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinAllowed": { - "message": "allowed", + "message": "ಅನುಮತಿಸಲಾಗಿದೆ", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { @@ -732,7 +744,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerEntryDetailsHeader": { - "message": "Details", + "message": "ವಿವರಗಳು", "description": "Small header to identify the 'Details' pane for a specific logger entry" }, "loggerEntryDetailsFilter": { @@ -740,11 +752,11 @@ "description": "Label to identify a filter field" }, "loggerEntryDetailsFilterList": { - "message": "Filter list", + "message": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿ", "description": "Label to identify a filter list field" }, "loggerEntryDetailsRule": { - "message": "Rule", + "message": "ನಿಯಮ", "description": "Label to identify a rule field" }, "loggerEntryDetailsContext": { @@ -760,7 +772,7 @@ "description": "Label to identify a field providing partyness information" }, "loggerEntryDetailsType": { - "message": "Type", + "message": "ವಿಧ", "description": "Label to identify the type of an entry" }, "loggerEntryDetailsURL": { @@ -776,7 +788,7 @@ "description": "Label for the context selector" }, "loggerURLFilteringTypeLabel": { - "message": "Type:", + "message": "ವಿಧ:", "description": "Label for the type selector" }, "loggerStaticFilteringHeader": { @@ -788,11 +800,11 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartBlock": { - "message": "Block", + "message": "ನಿರ್ಬಂಧಿಸು", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAllow": { - "message": "Allow", + "message": "ಅನುಮತಿಸು", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartType": { @@ -804,7 +816,7 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartOrigin": { - "message": "from “{{origin}}”", + "message": "\"{{origin}} \"ಇಂದಾ", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAnyOrigin": { @@ -876,7 +888,7 @@ "description": "Label for radio-button to pick export format" }, "loggerExportEncodePlain": { - "message": "Plain", + "message": "ಸಾದಾ", "description": "Label for radio-button to pick export text format" }, "loggerExportEncodeMarkdown": { @@ -884,7 +896,7 @@ "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { - "message": "Open", + "message": "ತೆರೆ", "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { @@ -1012,11 +1024,11 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "ಗೌಪ್ಯತಾ ನೀತಿ\n", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { - "message": "Changelog", + "message": "ಬದಲಾವಣೆಗಳು", "description": "" }, "aboutCode": { @@ -1028,15 +1040,15 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "ಮೂಲ ಕೊಡ್", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "ಅನುವಾದ", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿಗಳು", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -1088,7 +1100,7 @@ "description": "No longer used" }, "subscribeButton": { - "message": "Subscribe", + "message": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ", "description": "For the button used to subscribe to a filter list" }, "elapsedOneMinuteAgo": { @@ -1124,7 +1136,7 @@ "description": "Firefox/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { - "message": "off", + "message": "ಆಫ್", "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { @@ -1204,7 +1216,7 @@ "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { - "message": "Apply changes", + "message": "ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಿ", "description": "for generic 'Apply changes' buttons" }, "genericRevert": { @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index a43e85c..486e54f 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -483,6 +483,14 @@ "message": "멀웨어 도메인", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "소셜 위젯", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "쿠키 알림", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "골칫거리", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "네트워크 오류로 인해 리소스가 업데이트되지 못했습니다.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "한 줄에 한 개의 필터를 입력하세요. 필터는 순수 호스트이름, 혹은 Adblock Plus-호환 필터가 될 수 있습니다. 시작 부분이 ‘!’ 로 시작되면 무시됩니다.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "신뢰할 수 없는 출처의 필터를 추가하지 마십시오.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "내 사용자 정의 필터 활성화", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "신뢰가 필요한 사용자 정의 필터 허용", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "가져오기 및 추가하기", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "표면 필터 토글", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript 토글", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "차단 모드 완화", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/lt/messages.json b/src/_locales/lt/messages.json index 3c2358f..a44db57 100644 --- a/src/_locales/lt/messages.json +++ b/src/_locales/lt/messages.json @@ -128,7 +128,7 @@ "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Pranešti apie problemą šioje svetainėje", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { @@ -483,6 +483,14 @@ "message": "Kenksmingos sritys", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Erzinimas", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Tinklo klaida sutrukdė atnaujinti resursą.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Vienas filtras eilutėje. Filtras gali būti paprastas serverio adresas, arba su Adblock Plus suderinamas filtras. Eilutės pradėtos <code>!</code> bus ignoruotos.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importuoti ir papildyti", "description": "Button in the 'My filters' pane" @@ -888,11 +900,11 @@ "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Sukurti naują ataskaitą", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Rasti panašias ataskaitas", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { @@ -904,7 +916,7 @@ "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { - "message": "Questions and support", + "message": "Klausimai ir pagalba", "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { @@ -1172,7 +1184,7 @@ "description": "English: Permanently" }, "docblockedDisable": { - "message": "Proceed", + "message": "Tęsti", "description": "Button text to navigate to the blocked page" }, "cloudPush": { @@ -1244,13 +1256,17 @@ "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Select all", + "message": "Žymėti viską", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1276,7 +1292,7 @@ "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "Klaidos: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index 6b62cc6..c529a68 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -483,6 +483,14 @@ "message": "Ļaundabīgo programmu domēni", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sabiedriskās ekrānvadīklas", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Sīkdatņu paziņojumi", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Traucējoši elementi", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Tīkla kļūda neļāva atjaunināt resursu.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Vienu filtru katrā rindā. Filtrs var būt vienkārši resursa adrese, vai ar Adblock Plus saderīgs filtrs. Rindiņas, kuras sākas ar ‘!’ tiks ignorētas.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nevajag pievienot filtrus no neuzticamiem avotiem.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Iespējot manas pielāgotās atlases", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Ļaut pielāgotas atlases, kas pieprasa uzticēšanos", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importēt un pievienot", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Pārslēgt kosmētisko atlasi", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Pārslēgt JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Atslābinātais aizturēšanas režīms", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/mk/messages.json b/src/_locales/mk/messages.json index 4a38be4..0a7777f 100644 --- a/src/_locales/mk/messages.json +++ b/src/_locales/mk/messages.json @@ -483,6 +483,14 @@ "message": "Домени на малвер", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Досадни", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Внеси и додај", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Релаксиран мод на блокирање", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ml/messages.json b/src/_locales/ml/messages.json index bd4452e..b4c1b3a 100644 --- a/src/_locales/ml/messages.json +++ b/src/_locales/ml/messages.json @@ -400,7 +400,7 @@ "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Advanced", + "message": "വിപുലമായ ക്രമീകരണങ്ങൾ", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { @@ -483,6 +483,14 @@ "message": "മാല്വെയര് ഡൊമൈനുകള്", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "ശല്യപ്പെടുത്തലുകൾ", "description": "Filter lists section name" @@ -520,21 +528,25 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "അപ്ഡേറ്റുചെയ്യുന്നു ...", + "message": "അപ്ഡേറ്റുചെയ്യുന്നു...", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { "message": "ഒരു നെറ്റ്വർക്ക് പിശക് ഉറവിടം അപ്ഡേറ്റുചെയ്യുന്നതിൽ നിന്ന് തടഞ്ഞു.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "ഒരു വരിയില് ഒരു ഫില്റ്റര് എന്ന രീതിയില്. ഒരു ഫില്റ്റര് എന്നത്, ഹോസ്റ്റ് നെയിം, അല്ലെങ്കില് ആഡ് ബ്ലോക്ക് പ്ലസ്-നോട് കംപാറ്റബിള് ആയ ഫില്റ്റര് എന്നിവ ആകാം. ‘!’ എന്നിവയില് ആരംഭിക്കുന്ന വരികള് ഇഗ്നോര് ചെയ്യപ്പെടും.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "ഇമ്പോര്ട്ടും കൂട്ടിചേര്ക്കലും ചെയ്യുക", "description": "Button in the 'My filters' pane" @@ -884,7 +896,7 @@ "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { - "message": "Open", + "message": "തുറക്കുക", "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "തടയൽ മോഡ് വിശ്രമിക്കുക", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/mr/messages.json b/src/_locales/mr/messages.json index 9a60cc8..6530b32 100644 --- a/src/_locales/mr/messages.json +++ b/src/_locales/mr/messages.json @@ -483,6 +483,14 @@ "message": "मालवेअर डोमेन", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "चिडवणाऱ्या गोष्टी", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "प्रति ओळ एक फिल्टर. फिल्टर एक साधे होस्ट नावाचा असू शकतो, किंवा एक अद्ब्लोक प्लस सुसंगत फिल्टर असू शकतो. ओळी सह प्रिफिक्स ‘!’ कढे दुर्लक्ष केले जाईल.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "आयात आणि समावेश करा", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ms/messages.json b/src/_locales/ms/messages.json index 263303d..ed5b060 100644 --- a/src/_locales/ms/messages.json +++ b/src/_locales/ms/messages.json @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Senarai putih", + "message": "Halaman dipercayai", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { @@ -276,11 +276,11 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "script", + "message": "skrip", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { - "message": "frame", + "message": "kerangka", "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { @@ -483,6 +483,14 @@ "message": "Domain perisian hasad", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Kejengkelan", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ralat rangkaian menghalang sumber dikemas kini..", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Satu penapis setiap baris. Penapis boleh menjadi nama hos biasa, atau penapis yang sesuai dengan Daftar Mudah. Garis yang diawali dengan <code>! </code> akan diabaikan.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "Jangan tambah penapis daripada sumber yang tidak dipercayai.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import dan melampirkan", "description": "Button in the 'My filters' pane" @@ -956,11 +968,11 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "Filter lists are updated daily. Be sure your issue has not already been addressed in the most recent filter lists.", + "message": "Senarai penapis dikemas kini setiap hari. Pastikan isu anda belum ditangani dalam senarai penapis terbaharu.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { - "message": "Verify that the issue still exists after reloading the problematic webpage.", + "message": "Sahkan bahawa isu itu masih wujud selepas memuat semula halaman web yang bermasalah.", "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { @@ -1228,7 +1240,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "View source code…", + "message": "Lihat kod sumber…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1251,6 +1263,10 @@ "message": "Togol penapis kosmetik", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Tenang mod menyekat", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1276,11 +1292,11 @@ "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "Ralat: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Could not filter properly at browser launch. Reload the page to ensure proper filtering.", + "message": "Tidak dapat menapis dengan betul semasa pelancaran pelayar. Muat semula halaman untuk memastikan penapisan yang betul.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/nb/messages.json b/src/_locales/nb/messages.json index 811ab77..271ae2d 100644 --- a/src/_locales/nb/messages.json +++ b/src/_locales/nb/messages.json @@ -483,6 +483,14 @@ "message": "Beskyttelse mot skadelig programvare, sikkerhet", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sosiale medie-widgeter", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie meldinger", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Irritasjonsmomenter", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "En nettverksfeil forhindret ressursen i å bli oppdatert.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ett filter per linje. Et filter kan være et vanlig vertsnavn eller et EasyList-kompatibelt filter. Linjer med prefikset <code>!</code> blir ignorert.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Ikke legg til filtre fra ikke-betrodde kilder.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importer og legg til…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Slå av/på kosmetisk filtrering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Slå av/på JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Lemp på blokkeringsmodus", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index 8c50f79..554544c 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -483,6 +483,14 @@ "message": "Bescherming tegen malware, beveiliging", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sociale widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookiemeldingen", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Storende elementen", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Een netwerkfout heeft voorkomen dat de bron werd bijgewerkt.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Eén filter per regel. Een filter kan een gewone hostnaam of een EasyList-compatibel filter zijn. Regels beginnend met <code>!</code> worden genegeerd.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Voeg geen filters van niet-vertrouwde bronnen toe.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Mijn aangepaste filters inschakelen", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Aangepaste filters die vertrouwen vereisen toestaan", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importeren en toevoegen…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Cosmetische filters in-/uitschakelen", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript in-/uitschakelen", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Blokkeringsmodus beperken", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/oc/messages.json b/src/_locales/oc/messages.json index 2c4b085..6d141a6 100644 --- a/src/_locales/oc/messages.json +++ b/src/_locales/oc/messages.json @@ -483,6 +483,14 @@ "message": "Domenis malfasents", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importar e apondre", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/pa/messages.json b/src/_locales/pa/messages.json index 10438ef..b58a120 100644 --- a/src/_locales/pa/messages.json +++ b/src/_locales/pa/messages.json @@ -483,6 +483,14 @@ "message": "ਮਾਲਵੇਅਰਾਂ ਤੋਂ ਬਚਾਅ, ਸੁਰੱਖਿਆ", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "ਅਣਚਾਹੇ", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "ਨੈੱਟਵਰਕ ਗਲਤੀ ਸਰੋਤ ਨੂੰ ਅੱਪਡੇਟ ਹੋਣ ਤੋਂ ਰੋਕਦੀ ਹੈ।", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "ਗ਼ੈਰ-ਭਰੋਸੇਯੋਗ ਸਰੋਤਾਂ ਤੋਂ ਫਿਲਟਰ ਨਾ ਜੋੜੋ।", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "ਇੰਪੋਰਟ ਕਰੋ ਤੇ ਜੋੜੋ…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript ਨੂੰ ਬਦਲੋ", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index 3b2d7cf..a4ce634 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -252,7 +252,7 @@ "description": "" }, "popup1pScriptRulePrompt": { - "message": "skrypty własne", + "message": "skrypty tej samej domeny", "description": "" }, "popup3pScriptRulePrompt": { @@ -480,7 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Ochrona przed malware, bezpieczeństwo", + "message": "Ochrona przed złośliwym oprogramowaniem, bezpieczeństwo", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "Widżety społecznościowe", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Powiadomienia o ciasteczkach", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -527,14 +535,18 @@ "message": "Błąd sieci uniemożliwił aktualizację zasobów.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "W wierszu może być tylko jeden filtr. Filtrem może być nazwa hosta lub filtr kompatybilny z EasyList. Wiersze poprzedzone znakiem <code>!</code> będą pomijane.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nie dodawaj filtrów z niezaufanych źródeł.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Włącz moje własne filtry", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Zezwól na filtry wymagające zaufania", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importuj i dołącz…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Włącz/wyłącz filtrowanie kosmetyczne", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Włącz/wyłącz JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Rozluźnij tryb blokowania", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index e644a4d..1704ab2 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -483,6 +483,14 @@ "message": "Proteção contra malware, segurança", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgets sociais", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avisos dos cookies", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Aborrecimentos", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Um erro de rede impediu o recurso de ser atualizado.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Um filtro por linha. Um filtro pode ser um simples nome de hospedeiro ou um filtro compatível com o EasyList. As linhas prefixadas com o <code>!</code> serão ignoradas.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Não adicionar filtros de fontes não confiáveis.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Ativar meus filtros personalizados", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Permitir os filtros personalizados que requerem confiança", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importar e anexar", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Alternar filtragem cosmética", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Alternar JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaxar modo de bloqueio", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 15019cb..05443e2 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -483,6 +483,14 @@ "message": "Proteção contra malware, segurança", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Widgets sociais", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Avisos de cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Inconveniências", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Um erro de rede impediu que o recurso fosse atualizado.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Um filtro por linha. Um filtro pode ser um simples nome de anfitrião, ou um filtro compatível com a EasyList. Linhas começadas por <code>!</code> serão ignoradas.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Não adicione filtros de fontes não confiáveis.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Ativar os meus filtros personalizados", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Permitir filtros personalizados que exijam confiança", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importar e anexar…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Alternar filtragem cosmética", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Alternar JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaxar modo de bloqueio", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ro/messages.json b/src/_locales/ro/messages.json index a338cbe..92ca0e2 100644 --- a/src/_locales/ro/messages.json +++ b/src/_locales/ro/messages.json @@ -56,7 +56,7 @@ "description": "appears as tab name in dashboard" }, "supportPageName": { - "message": "Ajută-ne", + "message": "Asistență", "description": "appears as tab name in dashboard" }, "assetViewerPageName": { @@ -483,6 +483,14 @@ "message": "Domenii malițioase", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Neplăceri", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "O eroare de rețea a împiedicat actualizarea resursei.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Un filtru pe linie. Un filtru poate fi un simplu nume de gazdă sau un filtru compatibil EasyList. Liniile precedate de <code>!</code> vor fi ignorate.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nu adăuga filtre din surse nesigure.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importă și adaugă", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Comută filtrele cosmetice", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Comută JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relaxați modul de blocare", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 1702d1b..2d535dd 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -483,6 +483,14 @@ "message": "Защита от вредоносных сайтов, безопасность", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Виджеты соцсетей", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Уведомления о файлах куки", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Раздражающие элементы", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "В результате ошибки сети обновление не произошло.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Одно правило на строку. Правилом может быть имя сайта или EasyList-совместимый фильтр. Строки, начинающиеся с <code>!</code>, будут проигнорированы.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Не добавляйте фильтры из ненадёжных источников.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Включить мои пользовательские фильтры", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Разрешить пользовательские фильтры, требующие доверия", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Импортировать и добавить…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Вкл/Выкл косметическую фильтрацию", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Вкл/Выкл JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Ослабленный режим блокировки", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/si/messages.json b/src/_locales/si/messages.json index f414f59..afd9c19 100644 --- a/src/_locales/si/messages.json +++ b/src/_locales/si/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index d794627..ab778d9 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -483,6 +483,14 @@ "message": "Domény malvéru", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sociálne widgety", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Oznámenie o cookies", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Obťažujúce", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Chyba siete zabránila aktualizácii zdroja.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Jeden filter na riadok. Filter môže byť jednoduchý názov hostiteľa alebo filter kompatibilný s Adblock Plus. Riadky začínajúce s <code>!</code> budú ignorované.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Nepridávajte filtre z nedôveryhodných zdrojov.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Povoliť moje vlastné filtre", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Povoliť vlastné filtre vyžadujúce dôveru", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importovať a pripojiť", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Prepnúť kozmetické filtrovanie", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Prepnúť JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Zmierniť režim blokovania", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sl/messages.json b/src/_locales/sl/messages.json index 7963d85..bb2cfa2 100644 --- a/src/_locales/sl/messages.json +++ b/src/_locales/sl/messages.json @@ -483,6 +483,14 @@ "message": "Zlonamerne domene", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "\t\nNadlegovanje", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Omrežna napaka je preprečila posodobitev virov.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "En filter na vrstico. Filter je lahko navadno ime gostitelja, ali pa Adblock Plus kompatibilen filter. Vrstice z znakom ‘!’ bodo ignorirane.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Uvozi in dodaj", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Preklopi lepotno filtriranje", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Sprostite način blokiranja.", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/so/messages.json b/src/_locales/so/messages.json index 08cc0ad..b8c9c13 100644 --- a/src/_locales/so/messages.json +++ b/src/_locales/so/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Waxaa lagu talinayaa in lagu suurtageliyo doorashadan aaladaha awoodda yar.", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Caadiyan", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Soo deji...", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Hal URL laynkiiba. URL-yada aan ansax ahayn waa la iska indho-tiraa aamusnaan.", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "... ", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index d6c5a65..3fc972c 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -483,6 +483,14 @@ "message": "Domenet e rrezikshme, siguria", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Veglat sociale", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Njoftimi për cookies", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Elementet e bezdisshme", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Një problem me rrjetin kompjuterik pengoi përditësimin e informacionit.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Një filtër për rresht. Filtri mund të jetë thjesht emri i një hosti ose si ata që përdor EasyList. Nuk do të merren parasysh rreshtat që fillojnë me <code>!</code>.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Mos shtoni filtra nga burime të pabesueshme.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Aktivizoj filtrat e mi të personalizuar", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Lejoj filtrat e personalizuar që duhen besuar", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importoj dhe shtoj…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Ç/Aktivizoj filtrat kozmetikë", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Ç/Aktivizoj JavaScript-in", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Dobësoj mënyrën e bllokimit", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index 54ee936..35e56fc 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -483,6 +483,14 @@ "message": "Заштита од злонамерног софтвера, безбедност", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Друштвени виџети", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Обавештења о колачићима", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Сметње", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Грешка на мрежи је спречила ажурирање ресурса.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Један филтер по реду. Филтер може бити назив хоста или филтер компатибилан са EasyList форматом. Редови са префиксом <code>!</code> ће бити игнорисани.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Не додавај филтере из непоузданих извора.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Омогући моје прилагођене филтере", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Дозволи прилагођене филтере који захтевају поверење", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Увези и додај", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Укључи/искључи естетско филтрирање", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Укључи/искључи JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Опуштени режим блокирања", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index b091a77..828bb2c 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -483,6 +483,14 @@ "message": "Skydd mot skadlig programvara, säkerhet", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Sociala widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie-meddelanden", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Störande", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Ett nätverksproblem har förhindrat resursen från att uppdateras.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Ett filter per rad. Ett filter kan vara ett vanligt värdnamn eller ett EasyList-kompatibelt filter. Rader med prefixet <code>!</code> ignoreras.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "Lägg inte till filter från opålitliga källor.", + "message": "Lägg inte till filter från obetrodda källor.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Aktivera mina anpassade filter", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Att tillåta anpassade filter kräver tillit", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Importera och lägg till…", "description": "Button in the 'My filters' pane" @@ -644,7 +656,7 @@ "description": "English: Domain" }, "logRequestsHeaderURL": { - "message": "URL", + "message": "Webbadress", "description": "English: URL" }, "logRequestsHeaderFilter": { @@ -656,7 +668,7 @@ "description": "Appears in the logger's tab selector" }, "logBehindTheScene": { - "message": "Bakom kulissen", + "message": "Tabless", "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { @@ -784,7 +796,7 @@ "description": "Small header to identify the static filtering section" }, "loggerStaticFilteringSentence": { - "message": "{{action}} nätverksförfrågningar av {{type}} {{br}}vilkas webbadresser matchar {{url}} {{br}}och som kommer från {{origin}},{{br}}{{importance}} det finns ett matchande undantagsfilter.", + "message": "{{action}} nätverksförfrågningar av {{type}} {{br}}vilken webbadress matchar {{url}} {{br}}och som kommer från {{origin}},{{br}}{{importance}} det finns ett matchande undantagsfilter.", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartBlock": { @@ -1251,6 +1263,10 @@ "message": "Växla kosmetisk filtrering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Växla JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Lätta på blockeringsläge", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/sw/messages.json b/src/_locales/sw/messages.json index a546d80..ad3e428 100644 --- a/src/_locales/sw/messages.json +++ b/src/_locales/sw/messages.json @@ -483,6 +483,14 @@ "message": "Vikoa vya programu hasidi", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Vikasirisho", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Tatizo la mtandao imezuia rasilimali kusasishwa.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Chujia moja kila laini. Chujio inaweza kuwa kuwa jina pangishi (hostname), au chujio linalotumika na Adblock Plus. Laini zilizo na viambishi awali za <code>!</code> zitapuuzwa.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Leta na ambatisha", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Pumzisha mtindo wa kuzuia", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ta/messages.json b/src/_locales/ta/messages.json index 5a13a9d..c762935 100644 --- a/src/_locales/ta/messages.json +++ b/src/_locales/ta/messages.json @@ -483,6 +483,14 @@ "message": "தீப்பொருள் ஆள்களங்கள்", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "எரிச்சல்கள்", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "ஒரு பிணைய பிழை வளத்தைப் புதுப்பிப்பதைத் தடுத்தது.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "ஒரு வரிக்கு ஒரு வடிகட்டி. வடிகட்டி என்பது வெறும் வழங்கிப்பெயராக இருக்கலாம், அல்லது Adblock Plus-க்குப் பொருந்தும் வடிகட்டியாக இருக்கலாம். ‘!’ எனும் எழுத்தில் தொடங்கும் வரிகள் புறக்கணிக்கப்படும்.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "இறக்குமதி செய் மற்றும் இணை", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "ஒப்பனை வடிகட்டுதலை மறுநிலைமாற்று", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "தடுப்பு பயன்முறையை தளர்த்தவும்", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/te/messages.json b/src/_locales/te/messages.json index 21797c8..0f4e085 100644 --- a/src/_locales/te/messages.json +++ b/src/_locales/te/messages.json @@ -483,6 +483,14 @@ "message": "మాల్వేర్ డొమైన్లు", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "అసౌకర్యాల పట్టిక", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "ఈ చిట్టా అనుసంధాన వైఫల్యం వలన నవికరించబడలేదు.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "ఒక్కో పంక్తిలో ఒక ఫిల్టర్ నమోదు. పేర్కొనబడే ఫిల్టర్, కేవలం హోస్టుపేరు లేదా Adblock Plusకి అనువైన ఫిల్టర్ కావొచ్చు. పంక్తిలో మొదట ‘!’ ఉన్నచో ఆ పంక్తి పరిగణలోకి తీసుకొబడదు.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "అవిశ్వసనీయ మూలాల నుండి ఫిల్టర్లను జోడించవద్దు.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "దిగుమతిచేసి పోడిగించుము", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "నిరోధించే మోడ్ను రిలాక్స్ చేయండి", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/th/messages.json b/src/_locales/th/messages.json index e812407..268cd4d 100644 --- a/src/_locales/th/messages.json +++ b/src/_locales/th/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "มาแล้ว! โปรแกรมบล็อกโฆษณาเบาเบา ไม่กิน ซีพียู หรือ แรม", + "message": "มาแล้ว! โปรแกรมบล็อกโฆษณาได้อย่างมีประสิทธิภาพ โดยที่ไม่กินซีพียูหรือแรม", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -92,7 +92,7 @@ "description": "Example: 15 (13%)" }, "popupBlockedSinceInstallPrompt": { - "message": "จากวันที่ติดตตั้ง", + "message": "ตั้งแต่ติดตั้ง", "description": "English: since install" }, "popupOr": { @@ -100,11 +100,11 @@ "description": "English: or" }, "popupBlockedOnThisPage_v2": { - "message": "Blocked on this page", + "message": "ถูกบล็อกบนหน้านี้", "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "Blocked since install", + "message": "ถูกบล็อกตั้งแต่ติดตั้ง", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { @@ -356,7 +356,7 @@ "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { - "message": "Disable pre-fetching (to prevent any connection for blocked network requests)", + "message": "ปิดใช้งานการดึงข้อมูลล่วงหน้า (เพื่อป้องกันการเชื่อมต่อสำหรับคำขอเครือข่ายที่ถูกบล็อก)", "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { @@ -364,7 +364,7 @@ "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { - "message": "Prevent WebRTC from leaking local IP addresses", + "message": "ป้องกันไม่ให้ WebRTC รั่วไหลที่อยู่ IP ภายในเครื่อง", "description": "English: " }, "settingPerSiteSwitchGroup": { @@ -392,7 +392,7 @@ "description": "The default state for the per-site no-scripting switch" }, "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", + "message": "บล็อกรายงาน CSP", "description": "background information: https://github.com/gorhill/uBlock/issues/3150" }, "settingsUncloakCnamePrompt": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Features suitable only for technical users", + "message": "เป็นฟีเจอร์ที่เหมาะสำหรับผู้ใช้ที่เชี่ยวชาญเท่านั้น", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -412,7 +412,7 @@ "description": "For the tooltip of a link which gives access to advanced settings" }, "settingsLastRestorePrompt": { - "message": "Last restore:", + "message": "การคืนค่าครั้งล่าสุด:", "description": "English: Last restore:" }, "settingsLastBackupPrompt": { @@ -440,11 +440,11 @@ "description": "A button in the in the _3rd-party filters_ pane" }, "3pParseAllABPHideFiltersPrompt1": { - "message": "Parse and enforce cosmetic filters", + "message": "แยกวิเคราะห์และบังคับใช้ฟิลเตอร์ตกแต่ง", "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "Cosmetic filters serve to hide elements in a web page which are deemed to be a visual nuisance, and which can't be blocked by the network request-based filtering engines.", + "message": "ฟิลเตอร์ตกแต่งทำหน้าที่ซ่อนองค์ประกอบในหน้าเว็บซึ่งถือว่าเป็นภาพที่รบกวนสายตา และไม่สามารถบล็อกได้โดยกลไกการกรองตามคำขอของเครือข่าย", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -456,7 +456,7 @@ "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { - "message": "Suspend network activity until all filter lists are loaded", + "message": "ระงับกิจกรรมเครือข่ายจนกว่าจะโหลดรายการตัวกรองทั้งหมด", "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { @@ -483,6 +483,14 @@ "message": "Malware domains", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "หนึ่งตัวกรองต่อบรรทัด ตัวกรองอาจเป็น hostname หรือตัวกรองที่เข้ากันได้กับ EasyList, บรรทัดที่ขึ้นต้นด้วย <code>!</code> จะถูกละเว้น\n", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -552,11 +564,11 @@ "description": "English: Apply changes" }, "rulesPermanentHeader": { - "message": "Permanent rules", + "message": "กฏถาวร", "description": "header" }, "rulesTemporaryHeader": { - "message": "Temporary rules", + "message": "กฏชั่วคราว", "description": "header" }, "rulesRevert": { @@ -580,11 +592,11 @@ "description": "Will discard manually-edited content and exit manual-edit mode" }, "rulesImport": { - "message": "Import from file…", + "message": "นำเข้าจากไฟล์", "description": "" }, "rulesExport": { - "message": "Export to file…", + "message": "ส่งออกไปยังไฟล์", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -604,7 +616,7 @@ "description": "English: label for sort option." }, "rulesSortByType": { - "message": "Rule type", + "message": "ประเภทกฎ", "description": "English: a sort option for list of rules." }, "rulesSortBySource": { @@ -612,15 +624,15 @@ "description": "English: a sort option for list of rules." }, "rulesSortByDestination": { - "message": "Destination", + "message": "ปลายทาง", "description": "English: a sort option for list of rules." }, "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBlock Origin should be disabled. One entry per line.", + "message": "ระบุไซต์ที่เชื่อถือได้เพื่อกำหนดว่าควรปิดการใช้งาน uBlock Origin ที่หน้าเว็บใด พิมพ์หนึ่งรายการต่อบรรทัด", "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { - "message": "Import and append…", + "message": "นำเข้าและรวม", "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { @@ -632,7 +644,7 @@ "description": "The default filename to use for import/export purpose" }, "whitelistApply": { - "message": "Apply changes", + "message": "ใช้การเปลี่ยนแปลง", "description": "English: Apply changes" }, "logRequestsHeaderType": { @@ -640,7 +652,7 @@ "description": "English: Type" }, "logRequestsHeaderDomain": { - "message": "Domain", + "message": "โดเมน", "description": "English: Domain" }, "logRequestsHeaderURL": { @@ -648,7 +660,7 @@ "description": "English: URL" }, "logRequestsHeaderFilter": { - "message": "Filter", + "message": "ตัวกรอง", "description": "English: Filter" }, "logAll": { @@ -660,11 +672,11 @@ "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { - "message": "Current tab", + "message": "แท็บปัจจุบัน", "description": "Appears in the logger's tab selector" }, "loggerReloadTip": { - "message": "Reload the tab content", + "message": "โหลดเนื้อหาแท็บปัจจุบันใหม่", "description": "Tooltip for the reload button in the logger page" }, "loggerDomInspectorTip": { @@ -852,11 +864,11 @@ "description": "Logger settings: a sentence to describe the purpose of the checkboxes below" }, "loggerSettingHideColumnTime": { - "message": "{{input}} Time", + "message": "{{input}} เวลา", "description": "A label for the time column" }, "loggerSettingHideColumnFilter": { - "message": "{{input}} Filter/rule", + "message": "{{input}} ตัวกรอง/กฏ", "description": "A label for the filter or rule column" }, "loggerSettingHideColumnContext": { @@ -872,7 +884,7 @@ "description": "Label for radio-button to pick export format" }, "loggerExportFormatTable": { - "message": "Table", + "message": "ตาราง", "description": "Label for radio-button to pick export format" }, "loggerExportEncodePlain": { @@ -1012,7 +1024,7 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "นโยบายความเป็นส่วนตัว", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { @@ -1088,7 +1100,7 @@ "description": "No longer used" }, "subscribeButton": { - "message": "Subscribe", + "message": "สมัครสมาชิก", "description": "For the button used to subscribe to a filter list" }, "elapsedOneMinuteAgo": { @@ -1124,7 +1136,7 @@ "description": "Firefox/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { - "message": "off", + "message": "ปิด", "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { @@ -1152,7 +1164,7 @@ "description": "English: Go back" }, "docblockedClose": { - "message": "Close this window", + "message": "ปิดหน้าต่างนี้", "description": "English: Close this window" }, "docblockedDontWarn": { @@ -1196,7 +1208,7 @@ "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { - "message": "Warning! Change these advanced settings at your own risk.", + "message": "คำเตือน! ปรับเปลี่ยนการตั้งค่าขั้นสูงเหล่านี้ด้วยความระมัดระวัง", "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { @@ -1244,13 +1256,17 @@ "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Select all", + "message": "เลือกทั้งหมด", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index f02c332..31f6aa5 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -480,7 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Zararlı alan adları", + "message": "Kötü amaçlı yazılım koruması, güvenlik.", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "Sosyal gereçler", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Çerez bildirimleri", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -527,14 +535,18 @@ "message": "Bir ağ hatası kaynağın güncellenmesini engelledi.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Her satırda bir filtre. Bir filtre yalın bir alan adı veya EasyList-uyumlu bir filtre olabilir. <code>!</code> ile başlayan satırlar yok sayılacaktır.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Güvenilmeyen kaynaklardan filtre eklemeyin.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Özel filtrelerimi etkinleştir", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Güven gerektiren özel filtrelere izin ver", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "İçe aktar ve ekle", "description": "Button in the 'My filters' pane" @@ -584,7 +596,7 @@ "description": "" }, "rulesExport": { - "message": "Dosyaya aktar", + "message": "Dosyaya aktar…", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -1251,6 +1263,10 @@ "message": "Kozmetik filtrelemeyi aç/kapat", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript'i Aç/Kapa", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Engelleme modunu gevşet", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index 6145210..c78caea 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -483,6 +483,14 @@ "message": "Домени шкідливих програм", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Віджети соціальних мереж", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Повідомлення про файли cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Надокучливості", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Оновлення не вдалося, у зв'язку з помилкою мережі.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Один фільтр на рядок. Фільтром може бути адреса сайту або фільтр у Adblock Plus-сумісному записі. Рядки, що починаються з <code>!</code> будуть проігноровані.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Не додавати фільтри з невідомих джерел.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Увімкнути власні фільтри", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Дозволити власні фільтри, які потребують довіри", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Імпортувати та додати", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Увімкнути/вимкнути косметичні фільтри", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Перемкнути JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Послаблений режим блокування", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/ur/messages.json b/src/_locales/ur/messages.json index 1b62e56..6fbc6fc 100644 --- a/src/_locales/ur/messages.json +++ b/src/_locales/ur/messages.json @@ -483,6 +483,14 @@ "message": "Malware protection, security", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Social widgets", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie notices", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Annoyances", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "A network error prevented the resource from being updated.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Do not add filters from untrusted sources.", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Import and append…", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Toggle cosmetic filtering", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Toggle JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Relax blocking mode", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index b358554..9c50188 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -483,6 +483,14 @@ "message": "Bảo mật, bảo vệ khỏi phần mềm nguy hiểm", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "Tiện ích xã hội", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Các thông báo cookie", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "Phiền toái", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "Lỗi mạng ngăn tài nguyên được cập nhật.", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "Một bộ lọc cho mỗi dòng. Bộ lọc có thể là tên máy chủ thuần hoặc bộ lọc tương thích với EasyList. Các dòng có tiền tố <code>!</code> sẽ bị bỏ qua.", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "Không thêm các bộ lọc từ các nguồn không đáng tin cậy. ", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Bật bộ lọc tùy chỉnh của tôi", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Cho phép các bộ lọc tùy chỉnh yêu cầu sự tin cậy", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "Nhập và thêm vào", "description": "Button in the 'My filters' pane" @@ -1251,6 +1263,10 @@ "message": "Bật/tắt lọc phần tử", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "Cho phép/Vô hiệu hoá JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "Nới lỏng chế độ chặn", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 76ff0e1..5b50b86 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -483,6 +483,14 @@ "message": "恶意软件防护、安全", "description": "Filter lists section name" }, + "3pGroupSocial": { + "message": "社交网络小部件", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie提醒", + "description": "Filter lists section name" + }, "3pGroupAnnoyances": { "message": "骚扰", "description": "Filter lists section name" @@ -527,14 +535,18 @@ "message": "资源更新因网络错误受阻。", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "一行一条过滤规则。每条规则可以是一个普通的主机名或者是一条与 EasyList 兼容的过滤规则。以 <code>!</code> 开头的行将被忽略。", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { "message": "请勿添加未信任来源的过滤规则。", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "Enable my custom filters", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "Allow custom filters requiring trust", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "导入并添加…", "description": "Button in the 'My filters' pane" @@ -900,7 +912,7 @@ "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { - "message": "请至 <code>uBlock/wiki</code> 参阅 uBlock Origin 的所有功用以及使用说明。", + "message": "请至 <code>uBlock/wiki</code> 参阅 uBlock Origin 的所有功能以及使用说明。", "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { @@ -912,7 +924,7 @@ "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { - "message": "过滤规则或者网页的问题", + "message": "过滤规则问题/网页被损坏", "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { @@ -1251,6 +1263,10 @@ "message": "是否应用元素过滤规则", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "JavaScript 开关", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "放宽拦截限制", "description": "Label for keyboard shortcut used to relax blocking mode" diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 10f947b..f07258b 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -68,7 +68,7 @@ "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { - "message": "點擊:對此網站 停用/啟用 uBlock₀ 。\n\nCtrl + 點擊:僅在此頁面停用 uBlock₀ 。", + "message": "點擊:在此網站 停用/啟用 uBlock₀ 。\n\nCtrl + 點擊:僅在此頁面停用 uBlock₀ 。", "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { @@ -356,7 +356,7 @@ "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { - "message": "停用預先載入模式(避免連線至已阻擋的網路要求)", + "message": "停用「預先取回連結」功能(避免連接至已阻擋的網路請求)", "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "僅適合技術使用者的功能", + "message": "僅適合技術性使用者的功能", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -444,7 +444,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "元素隱藏過濾規則 用於隱藏網頁中礙眼,且不能被基於網路請求的過濾引擎所阻擋的元素。", + "message": "「元素隱藏過濾規則」用於隱藏網頁中礙眼,且不能被以網路請求為基礎之過濾引擎所阻擋的元素。", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "通用元素隱藏過濾規則 是會套用在所有網頁的元素隱藏過濾規則。啟用此選項會減少每個網頁,因處理一般元素隱藏過濾規則,而增加的記憶體與 CPU 使用量。\n\n建議在效能較差的裝置上啟用此選項。", + "message": "「通用元素隱藏過濾規則」是會套用在所有網站上的元素隱藏過濾規則。啟用此選項會消除網頁處理此類規則時增加的額外記憶體與 CPU 使用量。\n\n建議在較低效能的裝置上啟用此選項。", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -480,7 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "惡意軟體防護及安全性", + "message": "惡意軟體保護及保安", + "description": "Filter lists section name" + }, + "3pGroupSocial": { + "message": "社交媒體小工具", + "description": "Filter lists section name" + }, + "3pGroupCookies": { + "message": "Cookie 通知", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -516,7 +524,7 @@ "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { - "message": "上次更新:{{ago}}。\n點擊此處以要求更新。", + "message": "上次更新:{{ago}}。\n點擊此處以強制更新。", "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { @@ -527,14 +535,18 @@ "message": "因網路錯誤無法更新資源。", "description": "used as a tooltip for error icon beside a list" }, - "1pFormatHint": { - "message": "每行一個過濾規則。規則可以單純是主機名稱,或是與 EasyList 相容的過濾規則。以 <code>!</code> 開頭的行將被忽略。", - "description": "Short information about how to create custom filters" - }, "1pTrustWarning": { - "message": "請勿添加未信任來源的過濾規則。", + "message": "切勿添加來歷不明的過濾規則。", "description": "Warning against copy-pasting filters from random sources" }, + "1pEnableMyFiltersLabel": { + "message": "啟用自訂過濾器", + "description": "Label for the checkbox use to enable/disable 'My filters' list" + }, + "1pTrustMyFiltersLabel": { + "message": "允許需要信任的自訂過濾規則", + "description": "Label for the checkbox use to trust the content of 'My filters' list" + }, "1pImport": { "message": "匯入並加入…", "description": "Button in the 'My filters' pane" @@ -756,7 +768,7 @@ "description": "Label to identify a root context field (typically a hostname)" }, "loggerEntryDetailsPartyness": { - "message": "所屬方", + "message": "第一方/第三方", "description": "Label to identify a field providing partyness information" }, "loggerEntryDetailsType": { @@ -864,7 +876,7 @@ "description": "A label for the context column" }, "loggerSettingHideColumnPartyness": { - "message": "{{input}} 所屬方", + "message": "{{input}} 第一方/第三方", "description": "A label for the partyness column" }, "loggerExportFormatList": { @@ -888,11 +900,11 @@ "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "發出新報告", + "message": "建立新報告", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "尋找類似的報告", + "message": "尋找類似報告", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { @@ -908,11 +920,11 @@ "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { - "message": "問題及其他類型的求助,可以在 <code>/r/uBlockOrigin</code> subreddit 獲得協助與解答。", + "message": "如有問題或需要其他類型的幫助,可以在 <code>/r/uBlockOrigin</code> subreddit 獲得協助與解答。", "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { - "message": "過濾器問題 / 網站被搞壞", + "message": "過濾器問題 / 網站被破壞", "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { @@ -920,11 +932,11 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { - "message": "<b>特別注意:</b>不要把其他同性質的阻擋工具跟 uBlock Origin 混用,否則可能會造成特定網站的過濾器問題。", + "message": "<b>特別注意:</b>不要把其他同性質的阻擋工具跟 uBlock Origin 混用,否則可能會在特定網站造成過濾問題。", "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { - "message": "<b>小提示:</b>請確定您的過濾器清單已經更新至最新版本。我們主要用 <span data-url=\"logger-ui.html#_\">記錄器</span> 來分析過濾器相關問題。", + "message": "<b>小提示:</b>請確定您的過濾器清單已經更新至最新版本。我們主要用<span data-url=\"logger-ui.html#_\">「記錄器」</span>來分析過濾器相關問題。", "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { @@ -944,7 +956,7 @@ "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS5P2": { - "message": "<b>特別注意:</b>預設情況下,潛在隱私或敏感資料會被替換掉。替換過的資訊可能會加大問題解決的難度。", + "message": "<b>特別注意:</b>預設情況下,潛在私人或敏感的資料會被略去。略去的資訊可能會讓問題更難獲解決。", "description": "Second paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { @@ -952,11 +964,11 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS6P1S1": { - "message": "請先確認是否已經有人回報過此問題,以免重複回報造成維護者的而外負擔。", + "message": "為免給志願者帶來額外負擔,請先檢查問題有沒有被回報過,避免重複回報。", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "過濾器清單每天更新。請確認您的問題無法用最新的過濾器清單解決。", + "message": "過濾器清單每天更新,請確保問題尚未在最新版本中解決。", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { @@ -976,11 +988,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "顯示廣告或廣告移除後留下的天窗", + "message": "會顯示廣告或殘留空位", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "會覆蓋內容或有其他煩人的內容", + "message": "含有覆蓋物或其他滋擾", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { @@ -988,15 +1000,15 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "有隱私權相關問題", + "message": "有私穩相關問題", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "開啟 uBlock Origin 的時候網頁運作不正常", + "message": "開啟 uBlock Origin 的時候運作不正常", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "開啟不想出現的分頁或視窗", + "message": "會開啟不想要的分頁或視窗", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1020,7 +1032,7 @@ "description": "" }, "aboutCode": { - "message": "原始碼(GPLv3)", + "message": "源碼(GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -1028,7 +1040,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "原始碼", + "message": "源碼", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -1228,7 +1240,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "檢視原始碼…", + "message": "檢視源碼…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1251,6 +1263,10 @@ "message": "切換是否啟用元素隱藏過濾規則", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, + "toggleJavascript": { + "message": "切換 JavaScript", + "description": "Label for keyboard shortcut used to toggle no-scripting switch" + }, "relaxBlockingMode": { "message": "放寬封鎖量模式", "description": "Label for keyboard shortcut used to relax blocking mode" @@ -1280,7 +1296,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "無法在瀏覽器啟動的時候正確過濾。請重新載入頁面來確保過濾正確。", + "message": "無法在瀏覽器啟動的時候正確過濾頁面。請重新載入來確保過濾正確。", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/css/1p-filters.css b/src/css/1p-filters.css index 679e4b8..9e087cb 100644 --- a/src/css/1p-filters.css +++ b/src/css/1p-filters.css @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } @@ -14,7 +15,11 @@ body { .body { flex-shrink: 0; } -[data-i18n="1pTrustWarning"] { +/* https://github.com/uBlockOrigin/uBlock-issues/issues/3058 */ +:root.mobile body { + min-height: unset; + } +html:not(.mobile) [data-i18n="1pTrustWarning"] { font-weight: bold; } .codeMirrorContainer { diff --git a/src/css/3p-filters.css b/src/css/3p-filters.css index 014dd20..f5bed6b 100644 --- a/src/css/3p-filters.css +++ b/src/css/3p-filters.css @@ -7,7 +7,6 @@ body { } #actions { background-color: var(--surface-1); - padding: var(--default-gap-small) 0 var(--default-gap-xsmall) 0; position: sticky; top: 0; z-index: 10; @@ -15,7 +14,8 @@ body { #buttonUpdate.active { pointer-events: none; } -#buttonUpdate.active .fa-icon svg { +#buttonUpdate.active .fa-icon svg, +body.working #buttonUpdate:not(.disabled) .fa-icon svg { animation: spin 1s linear infinite; transform-origin: 50%; } @@ -24,7 +24,7 @@ body.updating #actions, body.working #actions { cursor: progress; } -body.updating #actions button, +body.updating #actions #buttonUpdate, body.working #actions button { pointer-events: none; } @@ -54,23 +54,9 @@ body.working #actions button { transform: rotate(180deg); } -#lists .searchbar { - align-items: center; - column-gap: var(--default-gap-xxsmall); - display: inline-flex; +#lists .searchfield { margin-block-start: calc(var(--font-size) * 0.75); margin-inline-start: var(--checkbox-size); - position: relative; - } -#lists .searchbar input { - padding-inline-start: var(--default-gap-large); - } -#lists .searchbar .fa-icon { - color: var(--ink-4); - fill: var(--ink-4); - left: 4px; - position: absolute; - transform: none; } #lists.searchMode > .listEntries .listEntries, #lists.searchMode > .listEntries .listEntry.searchMatch { @@ -212,13 +198,14 @@ body.working #actions button { color: var(--info2-ink); fill: var(--info2-ink); } -body:not(.updating) #lists .listEntry.checked.obsolete > .detailbar .iconbar .obsolete { +body:not(.updating,.working) #lists .listEntry.checked.obsolete > .detailbar .iconbar .obsolete { display: inline-flex; } #lists .iconbar .updating { transform-origin: 50%; } -body.updating #lists .listEntry.checked.obsolete > .detailbar .iconbar .updating { +body.updating #lists .listEntry.checked.obsolete > .detailbar .iconbar .updating, +body.working #lists .listEntry.checked.obsolete:not(.cached) > .detailbar .iconbar .updating { animation: spin 1s steps(8) infinite; display: inline-flex; } diff --git a/src/css/advanced-settings.css b/src/css/advanced-settings.css index c67e750..10225dd 100644 --- a/src/css/advanced-settings.css +++ b/src/css/advanced-settings.css @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff --git a/src/css/asset-viewer.css b/src/css/asset-viewer.css index 8b6f1da..d2df68a 100644 --- a/src/css/asset-viewer.css +++ b/src/css/asset-viewer.css @@ -23,6 +23,7 @@ body { display: flex; flex-direction: column; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; padding: 0; diff --git a/src/css/code-viewer.css b/src/css/code-viewer.css index 774fa69..40b5114 100644 --- a/src/css/code-viewer.css +++ b/src/css/code-viewer.css @@ -3,6 +3,7 @@ body { display: flex; flex-direction: column; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; padding: 0; diff --git a/src/css/codemirror.css b/src/css/codemirror.css index 2d15bf8..fce571b 100644 --- a/src/css/codemirror.css +++ b/src/css/codemirror.css @@ -3,6 +3,13 @@ overflow: hidden; position: relative; } +.codeMirrorContainer.cm-maximized { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + } .CodeMirror { background-color: var(--surface-0); box-sizing: border-box; @@ -153,7 +160,6 @@ } .cm-search-widget { - align-items: center; background-color: var(--cm-gutter-surface); border-bottom: 1px solid var(--cm-gutter-border); cursor: default; @@ -162,6 +168,7 @@ flex-shrink: 0; flex-wrap: wrap; justify-content: space-between; + line-height: 1.5; padding: var(--default-gap-xsmall); row-gap: var(--default-gap-xsmall); user-select: none; @@ -176,20 +183,44 @@ text-align: end; } +.cm-search-widget .cm-maximize { + fill: none; + flex-grow: 0; + font-size: 130%; + height: 1em; + stroke-width: 3px; + stroke: var(--ink-0); + width: 1em; + } +.cm-search-widget .cm-maximize * { + pointer-events: none; + } +.codeMirrorContainer[data-maximizable="false"] .cm-search-widget .cm-maximize { + display: none; + } +.codeMirrorContainer .cm-search-widget .cm-maximize svg > path:nth-child(2), +.codeMirrorContainer.cm-maximized .cm-search-widget .cm-maximize svg > path:nth-child(1) { + display: none; + } +.codeMirrorContainer.cm-maximized .cm-search-widget .cm-maximize svg > path:nth-child(2) { + display: initial; + } +html:not(.mobile) .cm-search-widget .cm-maximize:hover { + transform: scale(1.2); + } + .cm-search-widget-input { display: inline-flex; flex-grow: 1; + flex-wrap: nowrap; } .cm-search-widget .fa-icon { - fill: var(--cm-gutter-ink); font-size: 140%; } -.cm-search-widget .fa-icon:not(.fa-icon-ro):hover { - fill: var(--ink-1); +html:not(.mobile) .cm-search-widget .fa-icon:not(.fa-icon-ro):hover { + transform: scale(1.2); } .cm-search-widget-input input { - border: 1px solid var(--cm-gutter-ink); - display: inline-flex; flex-grow: 1; max-width: 16em; } @@ -198,7 +229,6 @@ display: inline-flex; flex-grow: 0; font-size: var(--font-size-smaller); - min-width: 6em; visibility: hidden; } .cm-search-widget[data-query] .cm-search-widget-count { @@ -207,9 +237,6 @@ .cm-search-widget[data-query] .cm-search-widget-count:empty { visibility: hidden; } -.cm-search-widget .cm-search-widget-button:hover { - color: #000; - } .cm-search-widget .sourceURL[href=""] { visibility: hidden; } diff --git a/src/css/common.css b/src/css/common.css index 1a8ba0b..fae4bb5 100644 --- a/src/css/common.css +++ b/src/css/common.css @@ -52,11 +52,11 @@ body { margin: 0; padding: 0; } -a { +a:not(.fa-icon) { color: var(--link-ink); fill: var(--link-ink); } -a:hover { +a:not(.fa-icon):hover { color: var(--link-hover-ink); fill: var(--link-hover-ink); } @@ -271,6 +271,24 @@ select { padding: 2px; } +.searchfield { + align-items: center; + column-gap: var(--default-gap-xxsmall); + display: inline-flex; + position: relative; + } +.searchfield .fa-icon { + color: var(--ink-4); + fill: var(--ink-4); + font-size: 1em !important; + left: 2px; + position: absolute; + transform: none; + } +.searchfield input:not(:placeholder-shown) ~ .fa-icon { + display: none; + } + .hidden { display: none; height: 0; @@ -309,7 +327,7 @@ select { font-size: 1.2rem; padding: 0; } - button.iconified > [data-i18n] { + button.iconified:not(.dontshrink) > [data-i18n] { display: none; } } @@ -331,6 +349,22 @@ select { width: 100%; } +.wikilink[href=""] { + display: none; + } +.wikilink.fa-icon { + color: var(--info0-ink); + fill: var(--info0-ink); + padding: var(--default-gap-xxsmall) var(--default-gap-xsmall); + } +.wikilink.fa-icon:hover { + transform: scale(1.2); + } +.wikilink.fa-icon > svg { + height: 1.25rem; + width: 1.25rem; + } + /* high dpi devices */ :root.hidpi button { font-family: Metropolis, sans-serif; diff --git a/src/css/dashboard.css b/src/css/dashboard.css index ba02d97..b75949e 100644 --- a/src/css/dashboard.css +++ b/src/css/dashboard.css @@ -2,6 +2,7 @@ html, body { display: flex; flex-direction: column; height: 100vh; + height: 100svh; justify-content: stretch; overflow: hidden; position: relative; @@ -11,11 +12,12 @@ body.notReady { display: none; } #dashboard-nav { + align-items: center; border: 0; border-bottom: 1px solid var(--border-1); display: flex; flex-shrink: 0; - flex-wrap: wrap; + justify-content: space-between; overflow-x: hidden; padding: 0; position: sticky; @@ -23,6 +25,10 @@ body.notReady { width: 100%; z-index: 10; } +#dashboard-nav > span { + display: flex; + flex-wrap: wrap; + } .tabButton { background-color: transparent; border: 0; @@ -75,6 +81,7 @@ iframe { } #unsavedWarning > div:last-of-type { height: 100vh; + height: 100svh; position: absolute; width: 100vw; } @@ -105,8 +112,7 @@ body.noDashboard #dashboard-nav { border-bottom-color: var(--dashboard-tab-hover-border); } -/* touch-screen devices */ -:root.mobile #dashboard-nav { +:root.mobile #dashboard-nav > span { flex-wrap: nowrap; overflow-x: auto; } diff --git a/src/css/devtools.css b/src/css/devtools.css index 425aac4..bb4c40d 100644 --- a/src/css/devtools.css +++ b/src/css/devtools.css @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff --git a/src/css/document-blocked.css b/src/css/document-blocked.css index 25dd204..62d4921 100644 --- a/src/css/document-blocked.css +++ b/src/css/document-blocked.css @@ -42,10 +42,10 @@ a { word-break: break-all; } #warningSign { - width: 100%; - } -#warningSign > a { + color: var(--accent-surface-1); + fill: var(--accent-surface-1); font-size: 96px; + width: 100%; } #theURL { color: var(--ink-2); diff --git a/src/css/dom-inspector.css b/src/css/dom-inspector.css index 71ba348..2f2ca14 100644 --- a/src/css/dom-inspector.css +++ b/src/css/dom-inspector.css @@ -3,6 +3,7 @@ html#ublock0-inspector, background: transparent; box-sizing: border-box; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; width: 100vw; diff --git a/src/css/dyna-rules.css b/src/css/dyna-rules.css index 35e0f8c..9a6bd8d 100644 --- a/src/css/dyna-rules.css +++ b/src/css/dyna-rules.css @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff --git a/src/css/epicker-ui.css b/src/css/epicker-ui.css index d09e1ef..8ce5ade 100644 --- a/src/css/epicker-ui.css +++ b/src/css/epicker-ui.css @@ -3,6 +3,7 @@ html#ublock0-epicker, background: transparent; cursor: not-allowed; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; width: 100vw; @@ -13,29 +14,41 @@ html#ublock0-epicker, #ublock0-epicker aside { background-color: var(--surface-1); border: 1px solid var(--border-2); - bottom: 2px; box-sizing: border-box; cursor: default; display: none; - max-height: calc(100vh - 4px); - max-width: 36rem; - min-width: 24rem; + flex-direction: column; + max-width: min(32rem, 100vw - 4px); + min-width: min(24rem, 100vw - 4px); overflow-y: auto; - padding: 4px; position: fixed; - right: 2px; - width: calc(40% - 2px); + width: min(32rem, 100vw - 4px); + z-index: 100; } -/* https://github.com/uBlockOrigin/uBlock-issues/discussions/2114 */ -#ublock0-epicker aside { |