diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0fb8fcd58fe3f..170317a577879 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,20 +1,5 @@ # Submitting issues -Despite all the guidelines and warnings I added over the years about how to use it, the GitHub issue tracker always end up being used as a [help desk](https://en.wikipedia.org/wiki/Help_desk) rather than a place to report actual, real and proven issues. +Submit on . -Typically help desk are best handled by enthusiast volunteers -- so hopefully this is what will happen. - -Given this, from now on I will consider GitHub issue tracker as a help desk one for uBlock Origin. I unsubscribed from being notified from all issues being opened, I will visit once in a while as time and mood allow. - -When I will be visiting the "help desk", I will focus **only** on issues which I have good reasons to believe to be valid issues with uBlock Origin **itself**. - -Valid issues typically comes with minimal but detailed steps to reproduce (i.e. no guesswork whatsoever required for others to reproduce), and especially genuine efforts to investigate the cause of an issue **as far as possible** using all the browser tools (uBO is HTML/CSS/JS, the browser has all the tools to investigate all of this). These will have my attention, and I will address them. - -In case I am really needed for a given issue, you can mention me using `@gorhill` so that GitHub will notify me. - -*** - -Good readings: - -- [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) -- [Why I didn’t fix your bug](http://magnusmanske.de/wordpress/?p=518) +Issue tracker here is read-only for non-[prior contributors](https://github.com/gorhill/uBlock/graphs/contributors). diff --git a/assets/assets.json b/assets/assets.json index 2a1e2633a844f..caf1f813611fa 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -188,13 +188,6 @@ ], "supportURL": "https://www.malwaredomains.com/" }, - "disconnect-malware": { - "content": "filters", - "group": "malware", - "off": true, - "title": "Malware filter list by Disconnect", - "contentURL": "https://s3.amazonaws.com/lists.disconnect.me/simple_malware.txt" - }, "spam404-0": { "content": "filters", "group": "malware", @@ -631,6 +624,6 @@ "title": "VIE: ABPVN List", "lang": "vi", "contentURL": "https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn.txt", - "supportURL": "http://abpvn.com/" + "supportURL": "https://abpvn.com/" } } diff --git a/assets/ublock/filter-lists.json b/assets/ublock/filter-lists.json deleted file mode 100644 index cd3877f8e2abb..0000000000000 --- a/assets/ublock/filter-lists.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "http://adblock.gardar.net/is.abp.txt": { - "off": true, - "title": "ISL: Icelandic ABP List", - "group": "regions", - "lang": "is", - "supportURL": "http://adblock.gardar.net/" - }, - "https://adblock.dk/block.csv": { - "off": true, - "title": "DNK: Schacks Adblock Plus liste", - "group": "regions", - "lang": "da", - "supportURL": "https://henrik.schack.dk/adblock/" - }, - "https://dl.dropboxusercontent.com/u/1289327/abpxfiles/filtri.txt": { - "off": true, - "title": "ITA: ABP X Files", - "group": "regions", - "supportURL": "http://noads.it/" - }, - "https://adguard.com/en/filter-rules.html?id=1": { - "off": true, - "title": "RUS: Adguard Russian Filter (obsolete, will be removed)", - "group": "regions", - "supportURL": "https://forum.adguard.com/forumdisplay.php?69-%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-Adguard" - }, - "https://filters.adtidy.org/extension/chromium/filters/1.txt": { - "off": true, - "title": "RUS: Adguard Russian Filter", - "group": "regions", - "supportURL": "https://forum.adguard.com/forumdisplay.php?69-%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-Adguard" - }, - "https://easylist-downloads.adblockplus.org/advblock.txt": { - "off": true, - "title": "RUS: RU AdList (Дополнительная региональная подписка)", - "group": "regions", - "lang": "ru", - "supportURL": "https://forums.lanik.us/viewforum.php?f=102" - }, - "https://easylist-downloads.adblockplus.org/bitblock.txt": { - "off": true, - "title": "RUS: BitBlock List (Дополнительная подписка фильтров)", - "group": "regions", - "supportURL": "https://forums.lanik.us/viewforum.php?f=102" - }, - "easylist-downloads.adblockplus.org/easylist.txt": { - "title": "EasyList", - "group": "ads", - "homeURL": "https://easylist.to/easylist/easylist.txt", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/easylist_noelemhide.txt": { - "off": true, - "title": "EasyList without element hiding rules", - "group": "ads", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/easylistchina.txt": { - "off": true, - "title": "CHN: EasyList China (中文)", - "group": "regions", - "lang": "zh", - "supportURL": "http://abpchina.org/forum/forum.php" - }, - "https://raw.githubusercontent.com/cjx82630/cjxlist/master/cjxlist.txt": { - "off": true, - "title": "CHN: CJX's EasyList Lite (main focus on Chinese sites)", - "group": "regions", - "supportURL": "https://github.com/cjx82630/cjxlist" - }, - "https://raw.githubusercontent.com/cjx82630/cjxlist/master/cjx-annoyance.txt": { - "off": true, - "title": "CHN: CJX's Annoyance List", - "group": "regions", - "supportURL": "https://github.com/cjx82630/cjxlist" - }, - "https://easylist-downloads.adblockplus.org/easylistdutch.txt": { - "off": true, - "title": "NLD: EasyList Dutch", - "group": "regions", - "lang": "nl", - "supportURL": "https://forums.lanik.us/viewforum.php?f=100" - }, - "https://easylist-downloads.adblockplus.org/easylistgermany.txt": { - "off": true, - "title": "DEU: EasyList Germany", - "group": "regions", - "lang": "de", - "supportURL": "https://forums.lanik.us/viewforum.php?f=90" - }, - "https://easylist-downloads.adblockplus.org/easylistitaly.txt": { - "off": true, - "title": "ITA: EasyList Italy", - "group": "regions", - "lang": "it", - "supportURL": "https://forums.lanik.us/viewforum.php?f=96" - }, - "easylist-downloads.adblockplus.org/easyprivacy.txt": { - "title": "EasyPrivacy", - "group": "privacy", - "homeURL": "https://easylist.to/easylist/easyprivacy.txt", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/fanboy-annoyance.txt": { - "off": true, - "title": "Fanboy’s Annoyance List", - "group": "social", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/fanboy-social.txt": { - "off": true, - "title": "Fanboy’s Social Blocking List", - "group": "social", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/liste_fr.txt": { - "off": true, - "title": "FRA: EasyList Liste FR", - "group": "regions", - "lang": "fr", - "supportURL": "https://forums.lanik.us/viewforum.php?f=91" - }, - "https://notabug.org/latvian-list/adblock-latvian/raw/master/lists/latvian-list.txt": { - "off": true, - "title": "LVA: Latvian List", - "group": "regions", - "lang": "lv", - "supportURL": "https://notabug.org/latvian-list/adblock-latvian" - }, - "http://hosts-file.net/.%5Cad_servers.txt": { - "off": true, - "title": "hpHosts’ Ad and tracking servers", - "group": "multipurpose", - "supportURL": "http://hosts-file.net/" - }, - "http://adblock.ee/list.php": { - "off": true, - "title": "EST: Eesti saitidele kohandatud filter", - "group": "regions", - "lang": "et", - "supportURL": "http://adblock.ee/" - }, - "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt": { - "off": true, - "title": "Malvertising filter list by Disconnect", - "group": "malware" - }, - "https://s3.amazonaws.com/lists.disconnect.me/simple_malware.txt": { - "off": true, - "title": "Malware filter list by Disconnect", - "group": "malware" - }, - "https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt": { - "off": true, - "title": "Basic tracking list by Disconnect", - "group": "privacy" - }, - "https://www.certyficate.it/adblock/adblock.txt": { - "off": true, - "title": "POL: polskie filtry do Adblocka i uBlocka", - "group": "regions", - "lang": "pl", - "supportURL": "http://www.certyficate.it/adblock-ublock-polish-filters/" - }, - "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt": { - "off": true, - "title": "Adblock Warning Removal List", - "group": "ads", - "supportURL": "https://forums.lanik.us/" - }, - "http://adb.juvander.net/Finland_adb.txt": { - "off": true, - "title": "FIN: Finnish Addition to Easylist", - "group": "regions", - "lang": "fi", - "supportURL": "http://www.juvander.fi/AdblockFinland" - }, - "https://raw.githubusercontent.com/gfmaster/adblock-korea-contrib/master/filter.txt": { - "off": true, - "title": "KOR: Korean Adblock List", - "group": "regions", - "lang": "ko", - "supportURL": "https://github.com/gfmaster/adblock-korea-contrib" - }, - "https://raw.githubusercontent.com/heradhis/indonesianadblockrules/master/subscriptions/abpindo.txt": { - "off": true, - "title": "IDN: ABPindo", - "group": "regions", - "lang": "id", - "supportURL": "https://github.com/heradhis/indonesianadblockrules" - }, - "https://raw.githubusercontent.com/k2jp/abp-japanese-filters/master/abpjf.txt": { - "off": true, - "title": "JPN: ABP Japanese filters (日本用フィルタ)", - "group": "regions", - "lang": "ja", - "supportURL": "https://github.com/k2jp/abp-japanese-filters/wiki/Support_Policy" - }, - "https://raw.githubusercontent.com/liamja/Prebake/master/obtrusive.txt": { - "off": true, - "title": "EU: Prebake - Filter Obtrusive Cookie Notices", - "group": "regions", - "supportURL": "https://github.com/liamja/Prebake" - }, - "https://raw.githubusercontent.com/yous/YousList/master/youslist.txt": { - "off": true, - "title": "KOR: YousList", - "group": "regions", - "lang": "ko", - "supportURL": "https://github.com/yous/YousList" - }, - "https://easylist-downloads.adblockplus.org/Liste_AR.txt": { - "off": true, - "title": "ara: Liste AR", - "group": "regions", - "lang": "ar", - "supportURL": "https://forums.lanik.us/viewforum.php?f=98" - }, - "http://margevicius.lt/easylistlithuania.txt": { - "off": true, - "title": "LTU: Adblock Plus Lithuania", - "group": "regions", - "lang": "lt", - "supportURL": "http://margevicius.lt/easylist_lithuania/" - }, - "http://malwaredomains.lehigh.edu/files/immortal_domains.txt": { - "off": true, - "title": "Malware domains (long-lived)", - "group": "malware", - "supportURL": "http://www.malwaredomains.com/" - }, - "mirror1.malwaredomains.com/files/justdomains": { - "title": "Malware domains", - "group": "malware", - "homeURL": "https://mirror.cedia.org.ec/malwaredomains/justdomains", - "supportURL": "http://www.malwaredomains.com/" - }, - "pgl.yoyo.org/as/serverlist": { - "title": "Peter Lowe’s Ad and tracking server list", - "group": "multipurpose", - "homeURL": "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext", - "supportURL": "https://pgl.yoyo.org/adservers/" - }, - "https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt": { - "off": true, - "title": "ISR: EasyList Hebrew", - "group": "regions", - "lang": "he", - "supportURL": "https://github.com/easylist/EasyListHebrew" - }, - "https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer-filters.txt": { - "off": true, - "title": "Anti-Adblock Killer | Reek", - "group": "ads", - "supportURL": "https://github.com/reek/anti-adblock-killer", - "instructionURL": "https://github.com/reek/anti-adblock-killer#instruction" - }, - "https://raw.githubusercontent.com/szpeter80/hufilter/master/hufilter.txt": { - "off": true, - "title": "HUN: hufilter", - "group": "regions", - "lang": "hu", - "supportURL": "https://github.com/szpeter80/hufilter" - }, - "https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt": { - "off": true, - "title": "CZE, SVK: EasyList Czech and Slovak", - "group": "regions", - "lang": "cs", - "supportURL": "https://github.com/tomasko126/easylistczechandslovak" - }, - "http://someonewhocares.org/hosts/hosts": { - "off": true, - "title": "Dan Pollock’s hosts file", - "group": "multipurpose", - "supportURL": "http://someonewhocares.org/hosts/" - }, - "https://raw.githubusercontent.com/Dawsey21/Lists/master/adblock-list.txt": { - "off": true, - "title": "Spam404", - "group": "malware", - "supportURL": "http://www.spam404.com/" - }, - "http://stanev.org/abp/adblock_bg.txt": { - "off": true, - "title": "BGR: Bulgarian Adblock list", - "group": "regions", - "lang": "bg", - "supportURL": "http://stanev.org/abp/" - }, - "http://winhelp2002.mvps.org/hosts.txt": { - "off": true, - "title": "MVPS HOSTS", - "group": "multipurpose", - "supportURL": "http://winhelp2002.mvps.org/" - }, - "https://www.fanboy.co.nz/enhancedstats.txt": { - "off": true, - "title": "Fanboy’s Enhanced Tracking List", - "group": "privacy", - "supportURL": "https://forums.lanik.us/" - }, - "https://www.fanboy.co.nz/fanboy-antifacebook.txt": { - "off": true, - "title": "Anti-ThirdpartySocial (see warning inside list)", - "group": "social", - "supportURL": "https://forums.lanik.us/" - }, - "https://www.fanboy.co.nz/fanboy-korean.txt": { - "off": true, - "title": "KOR: Fanboy's Korean", - "group": "regions", - "supportURL": "https://forums.lanik.us/" - }, - "https://easylist-downloads.adblockplus.org/easylistspanish.txt": { - "off": true, - "title": "spa: EasyList Spanish", - "group": "regions", - "lang": "es", - "supportURL": "https://forums.lanik.us/viewforum.php?f=103" - }, - "https://www.fanboy.co.nz/fanboy-swedish.txt": { - "off": true, - "title": "SWE: Fanboy's Swedish", - "group": "regions", - "lang": "sv", - "supportURL": "https://forums.lanik.us/" - }, - "https://www.fanboy.co.nz/r/fanboy-ultimate.txt": { - "off": true, - "title": "Fanboy+Easylist-Merged Ultimate List", - "group": "multipurpose", - "supportURL": "https://forums.lanik.us/" - }, - "https://adguard.com/filter-rules.html?id=13": { - "off": true, - "title": "TUR: Adguard Turkish Filter (obsolete, will be removed)", - "group": "regions", - "supportURL": "http://forum.adguard.com/forumdisplay.php?51-Filter-Rules" - }, - "https://filters.adtidy.org/extension/chromium/filters/13.txt": { - "off": true, - "title": "TUR: Adguard Turkish Filter", - "group": "regions", - "lang": "tr", - "supportURL": "https://forum.adguard.com/forumdisplay.php?51-Filter-Rules" - }, - "https://www.fanboy.co.nz/fanboy-vietnam.txt": { - "off": true, - "title": "VIE: Fanboy's Vietnamese", - "group": "regions", - "lang": "vi", - "supportURL": "https://forums.lanik.us/" - }, - "www.malwaredomainlist.com/hostslist/hosts.txt": { - "title": "Malware Domain List", - "group": "malware", - "homeURL": "https://www.malwaredomainlist.com/hostslist/hosts.txt" - }, - "https://www.void.gr/kargig/void-gr-filters.txt": { - "off": true, - "title": "GRC: Greek AdBlock Filter", - "group": "regions", - "lang": "el", - "supportURL": "https://github.com/kargig/greek-adblockplus-filter" - }, - "https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt": { - "off": true, - "title": "SVN: Slovenian List", - "group": "regions", - "lang": "sl", - "supportURL": "https://github.com/betterwebleon/slovenian-list" - } -} diff --git a/dist/description/description-da.txt b/dist/description/description-da.txt index 0eb6f46f4ba62..a43d6a9185701 100644 --- a/dist/description/description-da.txt +++ b/dist/description/description-da.txt @@ -1,49 +1,49 @@ -En effektiv blocker: let på hukommelse og CPU forbrug,. Kan indlæse og anvende tusindvis af flere filtre end andre populære blockere derude. +En effektiv blocker: Bruger kun lidt hukommelse og CPU, men kan alligevel indlæse og anvende langt flere filtre end andre populære blockere. Illustreret oversigt over effektiviteten: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-Efficiency-compared -Anvendelse: Den store tænd-sluk-knap i pop op-vinduet bruges til permanent at deaktivere/aktivere uBlock på det aktuelle websted. Dette gælder kun for det aktuelle websted, det er ikke en global afbryderknap. +Anvendelse: Den store tænd-sluk-knap i pop op-vinduet bruges til permanent at deaktivere/aktivere uBlock på det aktuelle websted. Dette gælder kun for det aktuelle websted; det er ikke en global afbryderknap. *** -Fleksibel, det er mere end en "ad blocker": den kan også læse og oprette filtre fra hosts-filer. +Fleksibel og mere end en "ad blocker": den kan også læse og oprette filtre fra hosts-filer. -Fra starten af er disse lister over filtre indlæst og anvendt: +Fra starten bliver disse filterlister indlæst og anvendt: - EasyList - Peter Lowe’s Ad server list - EasyPrivacy -- Malware domains +- Malware-domæner Flere lister er tilgængelige hvis du ønsker det: - Fanboy’s Enhanced Tracking List -- Dan Pollock’s hosts file -- hpHosts’s Ad and tracking servers +- Dan Pollock’s hosts fil +-Hphosts's annonce og sporings servere - MVPS HOSTS - Spam404 -- Osv. +- Og mange andre Selvfølgelig vil flere aktive filtre betyde højere hukommelsesforbrug. Men selv efter tilføjelse af Fanboys to ekstra lister, samt hpHosts’s Ad and tracking servers, har uBlock stadig et lavere hukommelsesforbrug end andre meget populære blockere derude. -Vær desuden opmærksom på, at hvis du vælger nogle af disse ekstra lister kan det føre til højere sandsynlighed for, at webstedet bliver vist forkert - især de lister der normalt anvendes som hosts-fil. +Vær desuden opmærksom på, at hvis du vælger nogle af disse ekstra lister, kan det øge risikoen for, at webstedet ikke bliver vist korrekt – især for de lister, der normalt anvendes som hosts-fil. *** -Uden de forudindstillede lister med filtre er denne udvidelse intet. Hvis du nogensinde virkelig ønsker at bidrage med noget, så tænk på de mennesker der arbejder hårdt for at vedligeholde de filterlister du bruger, som alle blev stillet gratis til rådighed for alle. +Uden de forudindstillede lister med filtre er denne udvidelse intet. Hvis du nogensinde virkelig ønsker at bidrage med noget, så tænk på de mennesker der arbejder hårdt for at vedligeholde de filterlister du bruger, som alle blev stillet gratis til rådighed for alle. *** Gratis. Open source med offentlig licens (GPLv3) -For brugere, af brugere. +Til brugere, af brugere. -Bidragydere @ Github: https://github.com/gorhill/uBlock/graphs/contributors -Bidragydere @ Crowdin: https://crowdin.net/project/ublock +Bidragydere på Github: https://github.com/gorhill/uBlock/graphs/contributors +Bidragydere på Crowdin: https://crowdin.net/project/ublock *** Dette er en tidlig version. Hav dette i tankerne når du skriver en anmeldelse. -Projekt changelog: +Projekt ændringslog: https://github.com/gorhill/uBlock/releases diff --git a/dist/description/description-ka.txt b/dist/description/description-ka.txt index 15d5189a15549..e275750ee1d35 100644 --- a/dist/description/description-ka.txt +++ b/dist/description/description-ka.txt @@ -17,20 +17,20 @@ ასევე, ხელმისაწვდომია სიები სურვილისამებრ შესარჩევად: -- Fanboy-ის გაუმჯობესებული სია თვალყურისმდევნებლების +- Fanboy-ის გაუმჯობესებული წესები თვალყურისმდევნებლების შესაზღუდად - Dan Pollock-ის hosts ფაილი - hpHosts-ის სარეკლამო და თვალყურისმდევნელი სერვერები - MVPS HOSTS - Spam404 - და კიდევ ბევრი -რასაკვირველია, რაც უფრო მეტი ფილტრია ჩართული, მეხსიერების გამოყენება იზრდება. თუმცა, Fanboy-ის გაფართოებული სიების, hpHosts-ის სარეკლამო და თვალყურისმდევნელი სერვერების დამატების შემთხვევაშიც კი, uBlock მაინც ნაკლებ მეხსიერებას იყენებს, ვიდრე ყველა სხვა ცნობილი შემზღუდავი პროგრამები. +რასაკვირველია, რაც უფრო მეტი ფილტრია ჩართული, მეხსიერების გამოყენება იზრდება. თუმცა, Fanboy-ის გაფართოებული წესების, hpHosts-ის სარეკლამო და თვალყურისმდევნელი სერვერების დამატების შემთხვევაშიც კი, uBlock მაინც ნაკლებ მეხსიერებას იყენებს, ვიდრე ყველა სხვა ცნობილი შემზღუდავი პროგრამები. -ამასთან, გაითვალისწინეთ, რომ ზოგიერთი დამატებითი სიის შერჩევის შედეგად, შესაძლოა ვებსაიტები არ გამოჩნდეს გამართულად -- განსაკუთრებით იმ სიების შემთხვევაში, რომელიც ჩვეულებრივ, hosts ფაილად გამოიყენება. +ამასთან, გაითვალისწინეთ, რომ ზოგიერთი დამატებითი წესების შერჩევის შედეგად, შესაძლოა ვებსაიტები არ გამოჩნდეს გამართულად -- განსაკუთრებით იმ წესების შემთხვევაში, რომელიც ჩვეულებრივ, hosts ფაილად გამოიყენება. *** -წინასწარ შედგენილ სიებს, მნიშვნელოვანი ადგილი უჭირავს ამ გაფართოების შედეგიან მუშაობაში. ასე რომ, თუ ოდესმე გადაწყვეტთ ვინმესთვის შემოწირულობის გაღებას, იფიქრეთ იმ ადამიანებზე, რომლებიც თავდაუზოგავად შრომობენ იმ გასაფილტრი სიების მუდმივ განახლებაზე, რომლითაც სარგებლობთ და რომელიც ხელმისაწვდომია ყველასთვის უფასოდ. +წინასწარ შედგენილ წესებს, მნიშვნელოვანი ადგილი უჭირავს ამ გაფართოების შედეგიან მუშაობაში. ასე რომ, თუ ოდესმე გადაწყვეტთ ვინმესთვის შემოწირულობის გაღებას, იფიქრეთ იმ ადამიანებზე, რომლებიც თავდაუზოგავად შრომობენ იმ გასაფილტრი წესების მუდმივ განახლებაზე, რომლითაც სარგებლობთ და რომელიც ხელმისაწვდომია ყველასთვის უფასოდ. *** diff --git a/dist/description/description-nb.txt b/dist/description/description-nb.txt index f8a1b523f9262..fa18ec56e348a 100644 --- a/dist/description/description-nb.txt +++ b/dist/description/description-nb.txt @@ -24,7 +24,7 @@ Flere lister er tilgjengelige om ønskelig: - Spam404 - Og mange andre -Jo flere filtre som er aktivert, desto høyere minnebruk. Men selv etter å ha lagt til Fanboys to ekstra lister og "hpHosts’s Ad and tracking servers", har uBlock fortsatt lavere minnebruk enn andre populære utvidelser for blokkering. +Jo flere filtre som er aktivert, desto høyere minnebruk. Men selv etter å ha lagt til Fanboys to ekstra lister og "hpHosts’s Ad and tracking servers", har uBlock Origin fortsatt lavere minnebruk enn andre populære utvidelser for blokkering. Vær også oppmerksom på at å velge noen av disse ekstra listene kan lede til høyere sannsynlighet for at nettsider ikke lastes riktig -- spesielt de listene som normalt brukes som vertsfil. @@ -43,7 +43,7 @@ Bidragsytere @ Crowdin: https://crowdin.net/project/ublock *** -Dette er en tidlig versjon, ha det i tankene når du bedømmer den. + Endringslogg for prosjektet: https://github.com/gorhill/uBlock/releases diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 8e98c2eecca4a..f0a8ac1cf00df 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,10 +3,10 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.15.23b0", + "version": "1.15.25rc3", "applications": { "gecko": { "strict_min_version": "52" } }, - "update_info_url": "https://github.com/gorhill/uBlock/releases/tag/1.15.23b0", - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.15.23b0/uBlock0.webext.signed.xpi" + "update_info_url": "https://github.com/gorhill/uBlock/releases/tag/1.15.25rc3", + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.15.25rc3/uBlock0.webext.signed.xpi" } ] } diff --git a/dist/version b/dist/version index d2d226120f41d..15b989e398fc7 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.15.24 +1.16.0 diff --git a/platform/chromium/vapi-background.js b/platform/chromium/vapi-background.js index c0f07427f8493..4ba0a15959370 100644 --- a/platform/chromium/vapi-background.js +++ b/platform/chromium/vapi-background.js @@ -33,33 +33,26 @@ var chrome = self.chrome; var manifest = chrome.runtime.getManifest(); -vAPI.chrome = true; -vAPI.chromiumVersion = (function(){ - var matches = /\bChrom(?:e|ium)\/(\d+)\b/.exec(navigator.userAgent); - return matches !== null ? parseInt(matches[1], 10) : NaN; - })(); - vAPI.cantWebsocket = chrome.webRequest.ResourceType instanceof Object === false || chrome.webRequest.ResourceType.WEBSOCKET !== 'websocket'; -vAPI.webextFlavor = ''; -if ( - self.browser instanceof Object && - typeof self.browser.runtime.getBrowserInfo === 'function' -) { - self.browser.runtime.getBrowserInfo().then(function(info) { - vAPI.webextFlavor = info.vendor + '-' + info.name + '-' + info.version; - }); -} +vAPI.lastError = function() { + return chrome.runtime.lastError; +}; + +// https://github.com/gorhill/uBlock/issues/875 +// https://code.google.com/p/chromium/issues/detail?id=410868#c8 +// Must not leave `lastError` unchecked. +vAPI.resetLastError = function() { + void chrome.runtime.lastError; +}; -// https://issues.adblockplus.org/ticket/5695 -// - Good idea, adopted: cleaner way to detect user-stylesheet support. -vAPI.supportsUserStylesheets = - chrome.extensionTypes instanceof Object && - chrome.extensionTypes.CSSOrigin instanceof Object && - 'USER' in chrome.extensionTypes.CSSOrigin; -vAPI.insertCSS = chrome.tabs.insertCSS; +vAPI.supportsUserStylesheets = vAPI.webextFlavor.soup.has('user_stylesheet'); + +vAPI.insertCSS = function(tabId, details) { + return chrome.tabs.insertCSS(tabId, details, vAPI.resetLastError); +}; var noopFunc = function(){}; @@ -108,13 +101,19 @@ vAPI.browserSettings = (function() { } return { - webRTCSupported: undefined, - - // https://github.com/gorhill/uBlock/issues/875 - // Must not leave `lastError` unchecked. - noopCallback: function() { - void chrome.runtime.lastError; - }, + // Whether the WebRTC-related privacy API is crashy is an open question + // only for Chromium proper (because it can be compiled without the + // WebRTC feature): hence avoid overhead of the evaluation (which uses + // an iframe) for platforms where it's a non-issue. + webRTCSupported: (function() { + var flavor = vAPI.webextFlavor.soup; + if ( + flavor.has('chromium') === false || + flavor.has('google') || flavor.has('opera') + ) { + return true; + } + })(), // Calling with `true` means IP address leak is not prevented. // https://github.com/gorhill/uBlock/issues/533 @@ -128,6 +127,10 @@ vAPI.browserSettings = (function() { setWebrtcIPAddress: function(setting) { // We don't know yet whether this browser supports WebRTC: find out. if ( this.webRTCSupported === undefined ) { + // If asked to leave WebRTC setting alone at this point in the + // code, this means we never grabbed the setting in the first + // place. + if ( setting ) { return; } this.webRTCSupported = { setting: setting }; var iframe = document.createElement('iframe'); var me = this; @@ -173,12 +176,12 @@ vAPI.browserSettings = (function() { if ( setting ) { cpn.webRTCMultipleRoutesEnabled.clear({ scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } else { cpn.webRTCMultipleRoutesEnabled.set({ value: false, scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } } catch(ex) { console.error(ex); @@ -191,14 +194,14 @@ vAPI.browserSettings = (function() { if ( setting ) { cpn.webRTCIPHandlingPolicy.clear({ scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } else { // https://github.com/uBlockOrigin/uAssets/issues/333#issuecomment-289426678 // - Leverage virtuous side-effect of strictest setting. cpn.webRTCIPHandlingPolicy.set({ value: 'disable_non_proxied_udp', scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } } catch(ex) { console.error(ex); @@ -217,12 +220,12 @@ vAPI.browserSettings = (function() { if ( !!details[setting] ) { chrome.privacy.network.networkPredictionEnabled.clear({ scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } else { chrome.privacy.network.networkPredictionEnabled.set({ value: false, scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } } catch(ex) { console.error(ex); @@ -234,12 +237,12 @@ vAPI.browserSettings = (function() { if ( !!details[setting] ) { chrome.privacy.websites.hyperlinkAuditingEnabled.clear({ scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } else { chrome.privacy.websites.hyperlinkAuditingEnabled.set({ value: false, scope: 'regular' - }, this.noopCallback); + }, vAPI.resetLastError); } } catch(ex) { console.error(ex); @@ -274,7 +277,6 @@ vAPI.tabs = {}; // network requests. vAPI.isBehindTheSceneTabId = function(tabId) { - if ( typeof tabId === 'string' ) { debugger; } return tabId < 0; }; @@ -287,11 +289,9 @@ vAPI.anyTabId = -2; // one of the existing tab // To remove when tabId-as-integer has been tested enough. var toChromiumTabId = function(tabId) { - if ( typeof tabId === 'string' ) { debugger; } - if ( typeof tabId !== 'number' || isNaN(tabId) || tabId === -1 ) { - return 0; - } - return tabId; + return typeof tabId === 'number' && !isNaN(tabId) && tabId > 0 ? + tabId : + 0; }; /******************************************************************************/ @@ -404,7 +404,7 @@ vAPI.tabs.get = function(tabId, callback) { chrome.tabs.query( { active: true, currentWindow: true }, function(tabs) { - if ( chrome.runtime.lastError ) { /* noop */ } + void chrome.runtime.lastError; callback( Array.isArray(tabs) && tabs.length !== 0 ? tabs[0] : null ); @@ -420,7 +420,7 @@ vAPI.tabs.get = function(tabId, callback) { } chrome.tabs.get(tabId, function(tab) { - if ( chrome.runtime.lastError ) { /* noop */ } + void chrome.runtime.lastError; callback(tab); }); }; @@ -515,7 +515,10 @@ vAPI.tabs.open = function(details) { // https://github.com/gorhill/uBlock/issues/3053#issuecomment-332276818 // - Do not try to lookup uBO's own pages with FF 55 or less. - if ( /^Mozilla-Firefox-5[2-5]\./.test(vAPI.webextFlavor) ) { + if ( + vAPI.webextFlavor.soup.has('firefox') && + vAPI.webextFlavor.major < 56 + ) { wrapper(); return; } @@ -528,7 +531,7 @@ vAPI.tabs.open = function(details) { targetURLWithoutHash = pos === -1 ? targetURL : targetURL.slice(0, pos); chrome.tabs.query({ url: targetURLWithoutHash }, function(tabs) { - if ( chrome.runtime.lastError ) { /* noop */ } + void chrome.runtime.lastError; var tab = Array.isArray(tabs) && tabs[0]; if ( !tab ) { wrapper(); @@ -562,12 +565,7 @@ vAPI.tabs.replace = function(tabId, url) { targetURL = vAPI.getURL(targetURL); } - chrome.tabs.update(tabId, { url: targetURL }, function() { - // https://code.google.com/p/chromium/issues/detail?id=410868#c8 - if ( chrome.runtime.lastError ) { - /* noop */ - } - }); + chrome.tabs.update(tabId, { url: targetURL }, vAPI.resetLastError); }; /******************************************************************************/ @@ -576,14 +574,7 @@ vAPI.tabs.remove = function(tabId) { tabId = toChromiumTabId(tabId); if ( tabId === 0 ) { return; } - var onTabRemoved = function() { - // https://code.google.com/p/chromium/issues/detail?id=410868#c8 - if ( chrome.runtime.lastError ) { - /* noop */ - } - }; - - chrome.tabs.remove(tabId, onTabRemoved); + chrome.tabs.remove(tabId, vAPI.resetLastError); }; /******************************************************************************/ @@ -592,17 +583,10 @@ vAPI.tabs.reload = function(tabId, bypassCache) { tabId = toChromiumTabId(tabId); if ( tabId === 0 ) { return; } - var onReloaded = function() { - // https://code.google.com/p/chromium/issues/detail?id=410868#c8 - if ( chrome.runtime.lastError ) { - /* noop */ - } - }; - chrome.tabs.reload( tabId, { bypassCache: bypassCache === true }, - onReloaded + vAPI.resetLastError ); }; @@ -615,12 +599,8 @@ vAPI.tabs.select = function(tabId) { if ( tabId === 0 ) { return; } chrome.tabs.update(tabId, { active: true }, function(tab) { - if ( chrome.runtime.lastError ) { - /* noop */ - } - if ( !tab ) { - return; - } + void chrome.runtime.lastError; + if ( !tab ) { return; } chrome.windows.update(tab.windowId, { focused: true }); }); }; @@ -630,9 +610,7 @@ vAPI.tabs.select = function(tabId) { vAPI.tabs.injectScript = function(tabId, details, callback) { var onScriptExecuted = function() { // https://code.google.com/p/chromium/issues/detail?id=410868#c8 - if ( chrome.runtime.lastError ) { - /* noop */ - } + void chrome.runtime.lastError; if ( typeof callback === 'function' ) { callback(); } @@ -835,19 +813,28 @@ vAPI.messaging.onPortMessage = (function() { details.runAt = 'document_start'; } var cssText; - const cssPromises = []; + var countdown = 0; + var countdownHandler = function() { + void chrome.runtime.lastError; + countdown -= 1; + if ( countdown === 0 && typeof callback === 'function' ) { + callback(); + } + }; for ( cssText of msg.add ) { + countdown += 1; details.code = cssText; - cssPromises.push(chrome.tabs.insertCSS(tabId, details)); + chrome.tabs.insertCSS(tabId, details, countdownHandler); } - for ( cssText of msg.remove ) { - details.code = cssText; - cssPromises.push(chrome.tabs.removeCSS(tabId, details)); + if ( typeof chrome.tabs.removeCSS === 'function' ) { + for ( cssText of msg.remove ) { + countdown += 1; + details.code = cssText; + chrome.tabs.removeCSS(tabId, details, countdownHandler); + } } - if ( typeof callback === 'function' ) { - Promise.all(cssPromises).then(() => { - callback(); - }, null); + if ( countdown === 0 && typeof callback === 'function' ) { + callback(); } break; } @@ -988,9 +975,10 @@ vAPI.contextMenu = chrome.contextMenus && { _callback: null, _entries: [], _createEntry: function(entry) { - chrome.contextMenus.create(JSON.parse(JSON.stringify(entry)), function() { - void chrome.runtime.lastError; - }); + chrome.contextMenus.create( + JSON.parse(JSON.stringify(entry)), + vAPI.resetLastError + ); }, onMustUpdate: function() {}, setEntries: function(entries, callback) { @@ -1036,13 +1024,6 @@ vAPI.commands = chrome.commands; /******************************************************************************/ /******************************************************************************/ -vAPI.lastError = function() { - return chrome.runtime.lastError; -}; - -/******************************************************************************/ -/******************************************************************************/ - // This is called only once, when everything has been loaded in memory after // the extension was launched. It can be used to inject content scripts // in already opened web pages, to remove whatever nuisance could make it to @@ -1147,27 +1128,32 @@ vAPI.cloud = (function() { var maxChunkCountPerItem = Math.floor(512 * 0.75) & ~(chunkCountPerFetch - 1); // Mind chrome.storage.sync.QUOTA_BYTES_PER_ITEM (8192 at time of writing) - var maxChunkSize = chrome.storage.sync.QUOTA_BYTES_PER_ITEM || 8192; - - // Mind chrome.storage.sync.QUOTA_BYTES (128 kB at time of writing) - // Firefox: - // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/storage/sync - // > You can store up to 100KB of data using this API/ - var maxStorageSize = chrome.storage.sync.QUOTA_BYTES || 102400; - - // Flavor-specific handling needs to be done here. Reason: to allow time - // for vAPI.webextFlavor to be properly set. // https://github.com/gorhill/uBlock/issues/3006 // For Firefox, we will use a lower ratio to allow for more overhead for // the infrastructure. Unfortunately this leads to less usable space for // actual data, but all of this is provided for free by browser vendors, // so we need to accept and deal with these limitations. - var initialize = function() { - var ratio = vAPI.webextFlavor.startsWith('Mozilla-Firefox-') ? 0.6 : 0.75; - maxChunkSize = Math.floor(maxChunkSize * ratio); - initialize = function(){}; + var evalMaxChunkSize = function() { + return Math.floor( + (chrome.storage.sync.QUOTA_BYTES_PER_ITEM || 8192) * + (vAPI.webextFlavor.soup.has('firefox') ? 0.6 : 0.75) + ); }; + var maxChunkSize = evalMaxChunkSize(); + + // The real actual webextFlavor value may not be set in stone, so listen + // for possible future changes. + window.addEventListener('webextFlavor', function() { + maxChunkSize = evalMaxChunkSize(); + }, { once: true }); + + // Mind chrome.storage.sync.QUOTA_BYTES (128 kB at time of writing) + // Firefox: + // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/storage/sync + // > You can store up to 100KB of data using this API/ + var maxStorageSize = chrome.storage.sync.QUOTA_BYTES || 102400; + var options = { defaultDeviceName: window.navigator.platform, deviceName: vAPI.localStorage.getItem('deviceName') || '' @@ -1226,7 +1212,6 @@ vAPI.cloud = (function() { }; var push = function(dataKey, data, callback) { - initialize(); var bin = { 'source': options.deviceName || options.defaultDeviceName, @@ -1259,7 +1244,7 @@ vAPI.cloud = (function() { // until such cases are reported for other browsers, we will // reset the (now corrupted) content of the cloud storage // only on Firefox. - if ( vAPI.webextFlavor.startsWith('Mozilla-Firefox-') ) { + if ( vAPI.webextFlavor.soup.has('firefox') ) { chunkCount = 0; } } @@ -1271,7 +1256,6 @@ vAPI.cloud = (function() { }; var pull = function(dataKey, callback) { - initialize(); var assembleChunks = function(bin) { if ( chrome.runtime.lastError ) { diff --git a/platform/chromium/vapi-common.js b/platform/chromium/vapi-common.js index 007313deaac09..57a9a5b9b79e1 100644 --- a/platform/chromium/vapi-common.js +++ b/platform/chromium/vapi-common.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-2017 The uBlock Origin authors + Copyright (C) 2014-2018 The uBlock Origin authors 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 @@ -36,6 +36,84 @@ vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self); /******************************************************************************/ +vAPI.webextFlavor = { + major: 0, + soup: new Set() +}; + +(function() { + var ua = navigator.userAgent, + flavor = vAPI.webextFlavor, + soup = flavor.soup; + var dispatch = function() { + window.dispatchEvent(new CustomEvent('webextFlavor')); + }; + + // This is always true. + soup.add('ublock').add('webext'); + + // Whether this is a dev build. + if ( /^\d+\.\d+\.\d+\D/.test(chrome.runtime.getManifest().version) ) { + soup.add('devbuild'); + } + + if ( /\bMobile\b/.test(ua) ) { + soup.add('mobile'); + } + + // Asynchronous + var async = self.browser instanceof Object && + typeof self.browser.runtime.getBrowserInfo === 'function'; + if ( async ) { + self.browser.runtime.getBrowserInfo().then(function(info) { + flavor.major = parseInt(info.version, 10) || 0; + soup.add(info.vendor.toLowerCase()) + .add(info.name.toLowerCase()); + if ( flavor.major >= 53 ) { soup.add('user_stylesheet'); } + if ( flavor.major >= 57 ) { soup.add('html_filtering'); } + dispatch(); + }); + } + + // Synchronous -- order of tests is important + var match; + if ( (match = /\bFirefox\/(\d+)/.exec(ua)) !== null ) { + flavor.major = parseInt(match[1], 10) || 0; + soup.add('mozilla').add('firefox'); + if ( flavor.major >= 53 ) { soup.add('user_stylesheet'); } + if ( flavor.major >= 57 ) { soup.add('html_filtering'); } + } else if ( (match = /\bEdge\/(\d+)/.exec(ua)) !== null ) { + flavor.major = parseInt(match[1], 10) || 0; + soup.add('microsoft').add('edge'); + } else if ( (match = /\bOPR\/(\d+)/.exec(ua)) !== null ) { + var reEx = /\bChrom(?:e|ium)\/([\d.]+)/; + if ( reEx.test(ua) ) { match = reEx.exec(ua); } + flavor.major = parseInt(match[1], 10) || 0; + soup.add('opera').add('chromium'); + } else if ( (match = /\bChromium\/(\d+)/.exec(ua)) !== null ) { + flavor.major = parseInt(match[1], 10) || 0; + soup.add('chromium'); + } else if ( (match = /\bChrome\/(\d+)/.exec(ua)) !== null ) { + flavor.major = parseInt(match[1], 10) || 0; + soup.add('google').add('chromium'); + } else if ( (match = /\bSafari\/(\d+)/.exec(ua)) !== null ) { + flavor.major = parseInt(match[1], 10) || 0; + soup.add('apple').add('safari'); + } + + // https://github.com/gorhill/uBlock/issues/3588 + if ( soup.has('chromium') && flavor.major >= 66 ) { + soup.add('user_stylesheet'); + } + + // Don't starve potential listeners + if ( !async ) { + vAPI.setTimeout(dispatch, 97); + } +})(); + +/******************************************************************************/ + // http://www.w3.org/International/questions/qa-scripts#directions var setScriptDirection = function(language) { @@ -77,10 +155,7 @@ setScriptDirection(vAPI.i18n('@@ui_locale')); // `window.open('', '_self').close()`. vAPI.closePopup = function() { - if ( - self.browser instanceof Object && - typeof self.browser.runtime.getBrowserInfo === 'function' - ) { + if ( vAPI.webextFlavor.soup.has('firefox') ) { window.close(); return; } diff --git a/platform/chromium/vapi-usercss.js b/platform/chromium/vapi-usercss.pseudo.js similarity index 97% rename from platform/chromium/vapi-usercss.js rename to platform/chromium/vapi-usercss.pseudo.js index df050cc97e32c..142bab49e2024 100644 --- a/platform/chromium/vapi-usercss.js +++ b/platform/chromium/vapi-usercss.pseudo.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2017 Raymond Hill + Copyright (C) 2017-2018 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 @@ -27,7 +27,15 @@ // https://github.com/chrisaljoudi/uBlock/issues/456 // https://github.com/gorhill/uBlock/issues/2029 -if ( typeof vAPI === 'object' ) { // >>>>>>>> start of HUGE-IF-BLOCK +// https://github.com/gorhill/uBlock/issues/3588 +// Chromium 66+ supports user stylesheets. Testing support against a regex is +// (unfortunately) necessary from content scripts. + +if ( + typeof vAPI === 'object' && + /\bEdge\/\d+|\bChrom(?:e|ium)\/(?:[45][0-9]|6[0-5])/.test(navigator.userAgent) +) { +// >>>>>>>> start of HUGE-IF-BLOCK /******************************************************************************/ /******************************************************************************/ @@ -543,4 +551,5 @@ vAPI.DOMFilterer.prototype = { /******************************************************************************/ /******************************************************************************/ -} // <<<<<<<< end of HUGE-IF-BLOCK +// <<<<<<<< end of HUGE-IF-BLOCK +} diff --git a/platform/webext/vapi-usercss.js b/platform/chromium/vapi-usercss.real.js similarity index 97% rename from platform/webext/vapi-usercss.js rename to platform/chromium/vapi-usercss.real.js index 9db9bce1b542a..493a4b246759d 100644 --- a/platform/webext/vapi-usercss.js +++ b/platform/chromium/vapi-usercss.real.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2017 Raymond Hill + Copyright (C) 2017-2018 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 @@ -23,7 +23,11 @@ // For content pages -if ( typeof vAPI === 'object' ) { // >>>>>>>> start of HUGE-IF-BLOCK +if ( + typeof vAPI === 'object' && + vAPI.userStylesheet === undefined +) { +// >>>>>>>> start of HUGE-IF-BLOCK /******************************************************************************/ /******************************************************************************/ @@ -237,4 +241,5 @@ vAPI.DOMFilterer.prototype = { /******************************************************************************/ /******************************************************************************/ -} // <<<<<<<< end of HUGE-IF-BLOCK +// <<<<<<<< end of HUGE-IF-BLOCK +} diff --git a/platform/opera/manifest.json b/platform/opera/manifest.json index 9aa58f523ff6b..07e956c8011e4 100644 --- a/platform/opera/manifest.json +++ b/platform/opera/manifest.json @@ -82,5 +82,8 @@ "default_panel": "logger-ui.html", "default_title": "__MSG_statsPageName__" }, - "version": "1.14.23.17" + "version": "1.14.23.17", + "web_accessible_resources": [ + "/web_accessible_resources/*" + ] } diff --git a/platform/webext/vapi-webrequest.js b/platform/webext/vapi-webrequest.js index 92eacc332df4a..682fb5461641c 100644 --- a/platform/webext/vapi-webrequest.js +++ b/platform/webext/vapi-webrequest.js @@ -41,22 +41,20 @@ vAPI.net = { vAPI.net.registerListeners = function() { // https://github.com/gorhill/uBlock/issues/2950 - // Firefox 55 does not normalize URLs to ASCII, uBO must do this itself. + // Firefox 56 does not normalize URLs to ASCII, uBO must do this itself. // https://bugzilla.mozilla.org/show_bug.cgi?id=945240 - let mustPunycode = false; - (function() { - if ( - typeof browser === 'object' && - browser !== null && - browser.runtime instanceof Object && - typeof browser.runtime.getBrowserInfo === 'function' - ) { - browser.runtime.getBrowserInfo().then(info => { - mustPunycode = info.name === 'Firefox' && - /^5[0-6]\./.test(info.version); - }); - } - })(); + let evalMustPunycode = function() { + return vAPI.webextFlavor.soup.has('firefox') && + vAPI.webextFlavor.major < 57; + }; + + let mustPunycode = evalMustPunycode(); + + // The real actual webextFlavor value may not be set in stone, so listen + // for possible future changes. + window.addEventListener('webextFlavor', function() { + mustPunycode = evalMustPunycode(); + }, { once: true }); let wrApi = browser.webRequest; diff --git a/src/3p-filters.html b/src/3p-filters.html index 1416251f080ab..32cddd4f4e23b 100644 --- a/src/3p-filters.html +++ b/src/3p-filters.html @@ -13,32 +13,28 @@
-
-
-
    -
  • - - -
  •   -
  • -
    -
  • -
    -
-

-
    -
    -
    -

    - - - -

    + +
    + + +
    diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index a6527c22c9402..a653c160861e9 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "فلاتر خارجيه", + "message": "فلاتر خارجية", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "حفظ التغيرات", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "محلية", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "اعلانات", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "مخصصه", "description": "English: Custom" }, + "3pImport": { + "message": "إستعادة …", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "رابط واحد كل سطر. روابط التي تحتوي على ‘!’ سوف يتم تجاهلها . الروابط الغير صحيحه سوف ايضاً تجاهلها .", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "رابط واحد في كل سطر. الروابط التي تحتوي على ‘!’ سوف يتم تجاهلها. الروابط غير الصحيحة سوف يتم تجاهلها بصمت.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "متقادم.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "كل سطر يمكن ان يتحمل على فلتر واحد. يمكن ان يكون الفلتر رابط موقع او فلتر متعارف مع نظام AdBlock Plus. روابط التي تحتوي على ‘!’ سوف يتم تجاهلها.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "استيراد", diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index d50bd913b97c0..81e46fe51433f 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Филтри от 3-ти лица", + "message": "Филтри", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Прилагане на промените", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Вградени", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Реклами", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Потребителски", "description": "English: Custom" }, + "3pImport": { + "message": "Внеси…", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Един адрес на ред. Редовете с представка ‘!’ ще бъдат игнорирани. Невалидните адреси също ще бъдат игнорирани.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Остарял", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Един филтър на ред. Това може да бъде обикновен адрес или съвместим с Adblock Plus филтър. Редовете с представка ‘!’ ще бъдат игнорирани.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Внасяне от файл...", diff --git a/src/_locales/bn/messages.json b/src/_locales/bn/messages.json index e99ea6f254ea4..d1a93d55da2e5 100644 --- a/src/_locales/bn/messages.json +++ b/src/_locales/bn/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "৩য়-দলের ফিল্টার", + "message": "তৃতীয় পক্ষের ফিল্টারস", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "পরিবর্তনগুলি প্রয়োগ", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "বিজ্ঞাপন", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "স্বনির্ধারিত", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "লাইন প্রতি একটি URL। ‘!’ সহ উপসর্গ লাইন উপেক্ষা করা হবে। অকার্যকর URL গুলি নীরবে উপেক্ষা করা হবে।", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "পুরোনো", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "লাইন প্রতি একটি ফিল্টার। একটি ফিল্টার স্পষ্ট হোস্টনেম বা অ্যাডব্লক প্লাস-সামঞ্জস্যপূর্ণ ফিল্টার হতে পারে। ‘!’ সহ উপসর্গ লাইন উপেক্ষা করা হবে।", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "আমদানি ও পরিশেষে যোগ করুন", diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index a92f68e80a249..683539d7c3604 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Aplicar canvis", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Local", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Anuncis", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalitzat", "description": "English: Custom" }, + "3pImport": { + "message": "Importa...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Una URL per línia. Línies amb el símbol ‘!’ s'ignoraran. Adreces URL no vàlides s'ignoraran silenciosament.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Una URL per línia. S'ignoraran les línies amb el símbol ‘!’. Les URL no vàlides s'ignoraran silenciosament.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Obsolet", @@ -400,8 +408,8 @@ "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 Adblock Plus. Línies amb el símbol ‘!’ s'ignoraran.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "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" }, "1pImport": { "message": "Importar i annexar", diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index d928a65981c48..751d093cd87fa 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Použít změny", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamy", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Vlastní", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Jedna adresa URL na řádek. Řádky začínající na ‘!’ budou ignorovány. Neplatné adresy URL budou tiše ignorovány.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Jedna URL adresa na řádek. Řádky začínající vykřičníkem „!“ budou ignorovány. Neplatné URL adresy budou tiše ignorovány.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Zastaralé.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Jeden filtr na řádek. Filtr může být prostý název hostitele nebo filtr kompatibilní s Adblock Plus. Řádky začínající na ‘!’ budou ignorovány.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importovat a připojit", diff --git a/src/_locales/cv/messages.json b/src/_locales/cv/messages.json index 1c37d33b5b20f..77c061f086f47 100644 --- a/src/_locales/cv/messages.json +++ b/src/_locales/cv/messages.json @@ -351,6 +351,10 @@ "message": "Улшӑнӑва ҫирӗплет", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Реклама", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Custom", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Кивелнӗ", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Import and append", diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index e1fd68f4fb8d6..c950684db27a9 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -1,14 +1,14 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { - "message": "Endelig en effektiv blocker til Chromium-baserede browsere. Lavt CPU- og hukommelsesbrug.", + "message": "Endelig en effektiv blocker. Lavt CPU- og hukommelsesforbrug.", "description": "this will be in the chrome web store: must be 132 characters or less" }, "dashboardName": { - "message": "uBlock₀ — Dashboard", + "message": "uBlock₀ — Kontrolpanel", "description": "English: uBlock₀ — Dashboard" }, "settingsPageName": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Tredjeparts filtre", + "message": "Filterlister", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -32,7 +32,7 @@ "description": "appears as tab name in dashboard" }, "statsPageName": { - "message": "uBlock₀ — Netværkslog", + "message": "uBlock₀ — Loggen", "description": "Title for the logger window" }, "aboutPageName": { @@ -44,11 +44,11 @@ "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { - "message": "Klik: Deaktiver\/aktiver uBlock₀ på dette websted.\n\nCtrl+Klik: Deaktiver uBlock₀ kun på denne side.", + "message": "Klik: Deaktiver\/aktiver uBlock₀ på dette websted.\n\nCtrl+klik: Deaktiver uBlock₀ kun på denne side.", "description": "English: Click: disable\/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Klik for at deaktivere uBlock₀ på dette websted.\n\nCtrl+Klik for at deaktivere uBlock₀ kun på denne side.", + "message": "Klik for at deaktivere uBlock₀ på dette websted.\n\nCtrl+klik for at deaktivere uBlock₀ kun på denne side.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { @@ -56,7 +56,7 @@ "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { - "message": "forespørgsler blokeret", + "message": "Blokerede forespørgsler", "description": "English: requests blocked" }, "popupBlockedOnThisPagePrompt": { @@ -76,7 +76,7 @@ "description": "English: or" }, "popupTipDashboard": { - "message": "Klik for at åbne kontrolpanelet", + "message": "Åbn kontrolpanelet", "description": "English: Click to open the dashboard" }, "popupTipZapper": { @@ -84,15 +84,15 @@ "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { - "message": "Start element-udvælger", + "message": "Start element-vælger tilstand", "description": "English: Enter element picker mode" }, "popupTipLog": { - "message": "Gå til forespørgselslog", + "message": "Åbn loggen", "description": "Tooltip used for the logger icon in the panel" }, "popupTipNoPopups": { - "message": "Aktiver\/Deaktiver blokering af alle popups på denne side", + "message": "Aktiver\/deaktiver blokering af alle popups på dette websted", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { @@ -116,7 +116,7 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { - "message": "Aktiver\/Deaktiver kosmetiske filtre på denne side", + "message": "Aktiver\/deaktiver kosmetiske filtre på dette websted", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { @@ -144,15 +144,15 @@ "description": "Tooltip when hovering the top-most cell of the global-rules column." }, "popupTipLocalRules": { - "message": "Lokale regler: denne søjle viser de regler der gælder kun på denne side.\nLokale regler overskriver globale regler.", + "message": "Lokale regler: denne kolonne viser de regler der kun gælder på dette websted.\nLokale regler overstyrer globale regler.", "description": "Tooltip when hovering the top-most cell of the local-rules column." }, "popupTipSaveRules": { - "message": "Klik her for at anvende dine ændringer.", + "message": "Klik for at gøre dine ændringer permanente.", "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." }, "popupTipRevertRules": { - "message": "Klik her for at fortryde dine ændringer.", + "message": "Klik for at fortryde dine ændringer.", "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." }, "popupAnyRulePrompt": { @@ -172,23 +172,23 @@ "description": "" }, "popupInlineScriptRulePrompt": { - "message": "inline scripts", + "message": "integrerede skripter", "description": "" }, "popup1pScriptRulePrompt": { - "message": "Førsteparts scripts", + "message": "Førsteparts skripter", "description": "" }, "popup3pScriptRulePrompt": { - "message": "Tredjeparts scripts", + "message": "Tredjeparts skripter", "description": "" }, "popup3pFrameRulePrompt": { - "message": "Tredjeparts frames", + "message": "Tredjeparts rammer", "description": "" }, "popupHitDomainCountPrompt": { - "message": "Forbundne domæner", + "message": "forbundne domæner", "description": "appears in popup" }, "popupHitDomainCount": { @@ -220,15 +220,15 @@ "description": "English: Cosmetic filters" }, "pickerCosmeticFiltersHint": { - "message": "Klik. Ctrl-klik", + "message": "Klik, Ctrl-klik", "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "Blokér element", + "message": "Bloker element", "description": "English: Block element" }, "settingsCollapseBlockedPrompt": { - "message": "Skjul blokerede elementers placeholdere", + "message": "Skjul blokerede elementers pladsholdere", "description": "English: Hide placeholders of blocked elements" }, "settingsIconBadgePrompt": { @@ -236,19 +236,19 @@ "description": "English: Show the number of blocked requests on the icon" }, "settingsTooltipsPrompt": { - "message": "Deaktiver forklaring af knappers funktioner", + "message": "Deaktiver værktøjstips", "description": "A checkbox in the Settings pane" }, "settingsContextMenuPrompt": { - "message": "Brug kontekstmenuen når det er passende", + "message": "Benyt kontekstmenuen, hvor det er relevant", "description": "English: Make use of context menu where appropriate" }, "settingsColorBlindPrompt": { - "message": "Optimeret til farveblindhed", + "message": "Optimeret til farveblinde", "description": "English: Color-blind friendly" }, "settingsCloudStorageEnabledPrompt": { - "message": "Aktiver støtte for sky-lagring", + "message": "Aktiver support for skylagring", "description": "" }, "settingsAdvancedUserPrompt": { @@ -296,7 +296,7 @@ "description": "background information: https:\/\/github.com\/gorhill\/uBlock\/issues\/3150" }, "settingsStorageUsed": { - "message": "Brugt plads: {{value}} bytes", + "message": "Lagerplads brugt: {{value}} bytes", "description": "English: Storage used: {{}} bytes" }, "settingsLastRestorePrompt": { @@ -312,11 +312,11 @@ "description": "Appears at the top of the _3rd-party filters_ pane" }, "3pListsOfBlockedHostsPerListStats": { - "message": "{{used}} brugt af {{total}}", + "message": "{{used}} ud af {{total}} brugt", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "3pAutoUpdatePrompt1": { - "message": "Opdater filterlister automatisk.", + "message": "Opdater filterlister automatisk", "description": "A checkbox in the _3rd-party filters_ pane" }, "3pUpdateNow": { @@ -324,11 +324,11 @@ "description": "A button in the in the _3rd-party filters_ pane" }, "3pPurgeAll": { - "message": "Tøm alle caches", + "message": "Slet alt cache", "description": "A button in the in the _3rd-party filters_ pane" }, "3pParseAllABPHideFiltersPrompt1": { - "message": "Analyser og benyt kosmetiske filtre.", + "message": "Analyser og benyt kosmetiske filtre", "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { @@ -351,6 +351,10 @@ "message": "Anvend ændringer", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Indbygget", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamer", "description": "English: Ads" @@ -368,7 +372,7 @@ "description": "The header identifying the filter lists in the category 'annoyances'" }, "3pGroupMultipurpose": { - "message": "Universalfilter", + "message": "Universalfiltre", "description": "English: Multipurpose" }, "3pGroupRegions": { @@ -379,12 +383,16 @@ "message": "Brugerdefineret", "description": "English: Custom" }, + "3pImport": { + "message": "Importer...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "En URL pr. linje. Linjer der starter med ‘!’ bliver ignoreret. Ugyldige URL'er bliver lydløst ignoreret.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "En URL pr. linje. Ugyldige URL'er bliver ignoreret.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { - "message": "forældet", + "message": "Forældet.", "description": "used as a tooltip for the out-of-date icon beside a list" }, "3pLastUpdate": { @@ -400,8 +408,8 @@ "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 Adblock Plus-kompatibelt filter. Linjer der starter med ‘!’ vil blive ignoreret.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Ét filter pr. linje. Et filter kan være et almindeligt værtsnavn, eller et Adblock Plus-kompatibelt filter. Linjer der starter med !<\/code> vil blive ignoreret.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importer og tilføj", @@ -464,11 +472,11 @@ "description": "English: List of your dynamic filtering rules." }, "rulesFormatHint": { - "message": "Regelsyntaks: kilde destination type handling<\/code> (Fuld dokumentation<\/a>).", + "message": "Regelsyntaks: kilde destination type handling<\/code> (fuld dokumentation<\/a>).", "description": "English: dynamic rule syntax and full documentation." }, "whitelistPrompt": { - "message": "Brugerdefineret liste over værtsnavne hvor uBlock₀ vil være deaktiveret. Kun et værtsnavn pr. linje. Ugyldige værtsnavne ignoreres.", + "message": "Brugerdefineret liste over værtsnavne hvor uBlock Origin vil være deaktiveret. Kun et værtsnavn pr. linje. Ugyldige værtsnavne ignoreres og kommenteres ud.", "description": "English: An overview of the content of the dashboard's Whitelist pane." }, "whitelistImport": { @@ -516,11 +524,11 @@ "description": "Appears in the logger's tab selector" }, "logFilterPrompt": { - "message": "Filtrér elementer i log", + "message": "filtrér logposter", "description": "English: filter log entries" }, "logMaxEntriesTip": { - "message": "Maksimalt antal elementer i log", + "message": "Maksimalt antal logposter", "description": "Tooltip informaing that the input field is to set the maximum number of entries in the log" }, "loggerURLFilteringContextLabel": { @@ -580,7 +588,7 @@ "description": "Below this sentence, the filter lists in which the filter was found" }, "aboutChangelog": { - "message": "Changelog", + "message": "Ændringslog", "description": "English: Change log" }, "aboutWiki": { @@ -600,7 +608,7 @@ "description": "English: Contributors" }, "aboutBackupDataButton": { - "message": "Backup til fil", + "message": "Sikkerhedskopier til fil", "description": "Text for button to create a backup of all settings" }, "aboutBackupFilename": { @@ -624,7 +632,7 @@ "description": "Message to display when an error occurred during restore" }, "aboutResetDataConfirm": { - "message": "Alle dine indstillinger vil blive nulstillet, hvorefter uBlock₀ vil genstarte.\n\nGendan alle indstillinger i uBlock₀ til standard?", + "message": "Alle dine indstillinger bliver fjernet, og uBlock₀ genstarter.\n\nNulstil uBlock₀ til standardindstillingerne?", "description": "Message asking user to confirm reset" }, "errorCantConnectTo": { @@ -632,7 +640,7 @@ "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { - "message": "uBlock₀: Tilføj det følgende URL til din personlige filterliste?\n\nTitel: \"{{title}}\"\nURL: {{url}}", + "message": "uBlock: Tilføj den følgende URL til dine brugerdefinerede filterlister?\n\nTitel: \"{{title}}\"\nURL: {{url}}", "description": "English: The message seen by the user to confirm subscription to a ABP filter list" }, "elapsedOneMinuteAgo": { @@ -660,11 +668,11 @@ "description": "English: {{value}} days ago" }, "showDashboardButton": { - "message": "Vis Instrumentpanel", + "message": "Vis kontrolpanel", "description": "Firefox\/Fennec-specific: Show Dashboard" }, "showNetworkLogButton": { - "message": "Vis netværkslog", + "message": "Vis loggen", "description": "Firefox\/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { @@ -672,7 +680,7 @@ "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedPrompt1": { - "message": "uBlock₀ har blokeret den følgende hjemmeside:", + "message": "uBlock Origins har blokeret den følgende hjemmeside fra at hente:", "description": "English: uBlock₀ has prevented the following page from loading:" }, "docblockedPrompt2": { @@ -692,7 +700,7 @@ "description": "English: Go back" }, "docblockedClose": { - "message": "Luk vinduet", + "message": "Luk dette vindue", "description": "English: Close this window" }, "docblockedProceed": { @@ -708,7 +716,7 @@ "description": "English: Permanently" }, "cloudPush": { - "message": "Eksporter til skylagring", + "message": "Eksporter til skylager", "description": "tooltip" }, "cloudPull": { @@ -716,7 +724,7 @@ "description": "tooltip" }, "cloudPullAndMerge": { - "message": "Importer fra skyopbevaring og sammenflet med de aktuelle indstillinger", + "message": "Importer fra skylager og flet sammen med de aktuelle indstillinger", "description": "tooltip" }, "cloudNoData": { diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index e5b0ca59d6120..16f5ac0227df2 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Vorgegebene Filter", + "message": "Filter von Drittanbietern", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Änderungen anwenden", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokal", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Werbung", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Benutzerdefiniert", "description": "English: Custom" }, + "3pImport": { + "message": "Importieren …", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Eine URL pro Zeile. Zeilen mit vorangestelltem ‘!’ werden ignoriert. Ungültige URLs werden stillschweigend ignoriert.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "veraltet", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Eine Regel pro Zeile. Eine Regel kann ein einfacher Hostname sein oder ein Adblock Plus-kompatibler Filter. Zeilen mit vorangestelltem ‘!’ werden ignoriert.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Eine Regel pro Zeile. Eine Regel kann ein einfacher Hostname sein oder ein Adblock-Plus-kompatibler Filter. Zeilen mit vorangestelltem !<\/code> werden ignoriert.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importieren und anfügen", diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index c49beef84a600..2cd203fd4abd3 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -100,7 +100,7 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Click to no longer block all popups on this site", + "message": "Κάντε κλικ για φραγή όλων των αναδυόμενων σε αυτή την ιστοσελίδα", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -108,11 +108,11 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "Click to block large media elements on this site", + "message": "Κάντε κλικ για αποκλεισμό μεγάλων στοιχείων πολυμέσων σε αυτή την ιστοσελίδα", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "Click to no longer block large media elements on this site", + "message": "Κάντε κλικ για φραγή πλέον μεγάλων στοιχείων πολυμέσων σε αυτή την ιστοσελίδα", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -120,11 +120,11 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Click to disable cosmetic filtering on this site", + "message": "Κάντε κλικ για να απενεργοποιήσετε το καλλυντικό φιλτράρισμα σε αυτή την σελίδα", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Click to enable cosmetic filtering on this site", + "message": "Κάντε κλικ για να ενεργοποιήσετε το καλλυντικό φιλτράρισμα σε αυτή την σελίδα", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -351,6 +351,10 @@ "message": "Εφαρμογή αλλαγών", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Τοπικά", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Διαφημίσεις", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Προσαρμοσμένη", "description": "English: Custom" }, + "3pImport": { + "message": "Εισαγωγή...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Ένα URL ανά γραμμή. Γραμμές με το πρόθεμα ‘!’ θα παραβλέπονται. Άκυρα URL θα παρακάμπτονται σιωπηλά.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "ξεπερασμένη", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Ένα φίλτρο ανά γραμμή. Φίλτρο μπορεί να είναι ένα απλό όνομα κεντρικού υπολογιστή (hostname) ή ένα, συμβατό με το Adblock Plus, φίλτρο. Γραμμές με το πρόθεμα ‘!’ θα παραβλέπονται.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Εισαγωγή και προσάρτηση", diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 4442a38335e91..4b9df5dde9d3b 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -16,7 +16,7 @@ "description":"appears as tab name in dashboard" }, "3pPageName":{ - "message":"3rd-party filters", + "message":"Filter lists", "description":"appears as tab name in dashboard" }, "1pPageName":{ @@ -351,6 +351,10 @@ "message":"Apply changes", "description":"English: Apply changes" }, + "3pGroupDefault":{ + "message":"Built-in", + "description":"Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds":{ "message":"Ads", "description":"English: Ads" @@ -379,8 +383,12 @@ "message":"Custom", "description":"English: Custom" }, + "3pImport":{ + "message":"Import...", + "description":"The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint":{ - "message":"One URL per line. Lines prefixed with ! will be ignored. Invalid URLs will be silently ignored.", + "message":"One URL per line. Invalid URLs will be silently ignored.", "description":"Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete":{ diff --git a/src/_locales/eo/messages.json b/src/_locales/eo/messages.json index e88d8007568fe..620dd24d60fbf 100644 --- a/src/_locales/eo/messages.json +++ b/src/_locales/eo/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Apliki ŝanĝojn", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamoj", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Tajlorita", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Unu regulo por ĉiu linio. Prefiksitaj linioj kun ‘!’ estos ignorataj. Nevalidaj ligiloj estos ignorataj silente.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "malaktuala", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Unu filtrilo por ĉiu linio. Filtrilo povas esti ordinara gastignomo aŭ Adblock Plus-kongrua filtrilo. Prefiksitaj linioj kun ‘!’ estos ignorataj.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importi kaj postaldoni", diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 661157b011e45..c25cbea1c8189 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -351,6 +351,10 @@ "message": "Aplicar cambios", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Local", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Anuncios", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizada", "description": "English: Custom" }, + "3pImport": { + "message": "Importar...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Una URL por línea. Las líneas que empiezan con ‘!’ serán ignoradas. Se omitirán las URL no válidas.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Una URL por línea. Las líneas que empiezan con ‘!’ serán ignoradas. URLs inválidos seran ignorados.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Desactualizado.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Un filtro por línea. Los filtros pueden ser un nombre de servidor, o un filtro compatible con Adblock Plus. Las líneas que comiencen con ‘!’ serán ignoradas.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importar y anexar", diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 509beede24814..421693309a75d 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Kolmanda osapoole filtrid", + "message": "Filtri loendid", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Kinnita muudatused", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Seadmes", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklaamid", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Kohandatud", "description": "English: Custom" }, + "3pImport": { + "message": "Impordi...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Üks URL rea kohta, märgiga ‘!’ algavaid ridu eiratakse. Vigased URLid jäetakse vahele.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Üks URL rea kohta. Vigased URLid jäetakse taustal vahele.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "vananenud", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Üks filter rea kohta, filtriks võib olla tavaline domeenilist või Adblock Plusiga-ühilduv filter. Märgiga ‘!’ algavaid ridu eiratakse.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Üks filter rea kohta. Filtriks võib olla tavaline domeenilist või Adblock Plusiga-ühilduv filter. Märgiga !<\/code> algavaid ridu eiratakse.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Impordi ja lisa", diff --git a/src/_locales/eu/messages.json b/src/_locales/eu/messages.json index c40aa30d3139c..cd2c84e1fce6f 100644 --- a/src/_locales/eu/messages.json +++ b/src/_locales/eu/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Hirugarrengoen iragazkiak", + "message": "Iragazki-zerrendak", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Aplikatu aldaketak", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Tokikoa", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Iragarkiak", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Pertsonala", "description": "English: Custom" }, + "3pImport": { + "message": "Inportatu...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "URL bat lerroko. Hasieran ‘’ duten lerroak ezikusiko dira. Baliogabeko URLak isilean ezikusiko dira.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "URL bat lerroko. Baliogabeko URL-ak ezikusiko dira.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Zaharkituta.", @@ -400,8 +408,8 @@ "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 ‘’ duten lerroak ezikusiko dira.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Iragazki bat lerroko. Iragazkia hostalari izen soila izan daiteke, edo Adblock Plusekin bateragarria den iragazki bat. Hasieran !<\/code> duten lerroak ezikusiko dira.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Inportatu eta gehitu", diff --git a/src/_locales/fa/messages.json b/src/_locales/fa/messages.json index f2fd41ba3a86d..53366cf3d1b41 100644 --- a/src/_locales/fa/messages.json +++ b/src/_locales/fa/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "اعمال تغییرات", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "محلی", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "تبلیغات", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "سفارشی", "description": "English: Custom" }, + "3pImport": { + "message": "واردات...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "هر آدرس در یک خط. خطوطی با پیشوند ‘!’ در نظر گرفته نمیشوند. آدرس های نامعتبر نیز در سکوت نادیده گرفته میشوند.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "منقضی شده.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "یک فیلتر در هر خط. یک فیلتر می تواند آدرس هاست ساده یا فیلتر سازگار با Adblock plus باشد. خطوط با پیشوند ‘!’ نادیده گرفته می شوند.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "وارد کردن و الحاق", diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index 9aec3a8859ff3..9ad2e4ee10ae3 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "3:nen osapuolen suodattimet", + "message": "Suodatuslistat", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Vahvista muutokset", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Mainokset", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Mukautettu", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Yksi URL-osoite kullekin riville. Rivit, joiden alussa on ‘!’, jätetään huomiotta. Epäkelvot osoitteet ohitetaan ilman ilmoitusta.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "vanhentunut", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Yksi suodatin kullekin riville. Suodatin voi olla pelkkä osoite tai Adblock Plus -yhteensopiva suodatin. Rivit, joiden alussa on ‘!’, jätetään huomiotta.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Tuo ja liitä loppuun", diff --git a/src/_locales/fil/messages.json b/src/_locales/fil/messages.json index 39786e77cd7a7..89b355ac8b397 100644 --- a/src/_locales/fil/messages.json +++ b/src/_locales/fil/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Isumite ang mga pagbabago", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Ads", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Custom", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Out of date.", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "I-Import at idugtong", diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 5e7eebd468549..f0a12fea1ed05 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -100,7 +100,7 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Cliquez pour cesser de bloquer toutes les pop-up de ce site", + "message": "Cliquez pour cesser de bloquer toutes les pop-ups de ce site", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -351,6 +351,10 @@ "message": "Appliquer", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Intégrées", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Publicités", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Vos propres listes", "description": "English: Custom" }, + "3pImport": { + "message": "Importer", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Une adresse Web par ligne. Les lignes débutant par un ‘!’ seront ignorées. Les adresses Web invalides seront ignorées sans avertissement.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Une adresse Web par ligne. Les adresses Web invalides seront ignorées sans avertissement.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Obsolète", @@ -400,8 +408,8 @@ "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 un filtre respectant la syntaxe des filtres Adblock Plus. Les lignes débutant par ‘!’ seront ignorées.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Une règle par ligne. Une règle peut être un simple nom d'hôte, ou encore un filtre respectant la syntaxe des filtres Adblock Plus. Les lignes débutant par !<\/code> seront ignorées.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importer", diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index 27cf13485da71..9b1728297562e 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filters fan tredden", + "message": "Filterlisten", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Wizigingen tapasse", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokaal", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Advertinsjes", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Oanpast", "description": "English: Custom" }, + "3pImport": { + "message": "Ymportearje…", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Ien URL per rigel. Rigels begjinnend mei ‘!’ wurde negearre. Unjildige URL's wurde stil negearre.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Ien URL per rigel. Unjildige URL's wurde stil negearre.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Ferâldere.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Ien filter per rigel. Ien filter kin in gewoane hostnamme of ien Adblock Plus-kompatibel filter wêze. Rigels begjinnend mei ‘!’ wurde negearre.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Ien filter per rigel. In filter kin in gewoane hostnamme of in Adblock Plus-kompatibel filter wêze. Rigels begjinnend mei !<\/code> wurde negearre.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Ymportearje en tafoegje", diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index 6e1423a634716..bfa0464cda7d0 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -351,6 +351,10 @@ "message": "Aplicar os cambios", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Anuncios", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizado", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Un enderezo por liña. As liñas prefixadas con ‘!’ seranche ignoradas, así como os enderezos inválidos.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Desactualizada.", @@ -401,7 +409,7 @@ }, "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 ‘!’ seranche ignoradas.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importar e anexar", diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index ab66313334d76..becb5276f8341 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "מסננים צד-3", + "message": "מסננים צד שלישי", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "החל שינויים", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "מקומי", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "פרסומות", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "מותאם אישית", "description": "English: Custom" }, + "3pImport": { + "message": "ייבא...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "כתובת אחת בכל שורה. שורות עם קידומת ‘!’ לא יפורשו. כתובות לא חוקיות לא יפורשו ולא תהיה התראה לכך.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "לא עדכני.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "מסנן אחד לכל שורה. המסנן יכול להיות דומיין פשוט, או מסנן המותאם ל- Adblock Plus. שורות עם קידומת ‘!’ לא יפורשו.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "ייבא וצרף", diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json index efe448d4aafe0..601f3256d9b97 100644 --- a/src/_locales/hi/messages.json +++ b/src/_locales/hi/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "परिवर्तन लागू करें", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "विज्ञापन", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "कस्टम", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "पुरानी", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Import and append", diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index fb888cb69b4c7..b5df8512e25e0 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -351,6 +351,10 @@ "message": "Primijeni promjene", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklame", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Prilagođeno", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Jedan URL po retku. Linije sa prefiksom ‘!’ zanemarit će se. Nevaljani URL-ovi će biti tiho ignorirani.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Zastarjelo.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Jedan filtar po retku. Filtar može biti običan hostname ili filter kompatibilan sa Adblock Plus-om. Linije sa prefiksom ‘!’ zanemarit će se.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Uvesti i dodati", diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index a1b3efd1d2e00..d9500afdaf0b4 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Módosítások alkalmazása", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Helyi", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Hirdetések", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Saját", "description": "English: Custom" }, + "3pImport": { + "message": "Importálás...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Soronként egy URL. A ‘!’ kezdetű sorok figyelmen kívül maradnak. A szabálytalan URL-ek szintén figyelmen kívül maradnak, hibajelzés nélkül.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Elavult.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Soronként egy szűrő. A szűrő lehet egy hostnév, vagy egy Adblock Plus kompatibilis szűrő.\nA ‘!’ kezdetű sorok figyelmen kívül maradnak.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importál és hozzáad", diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 97201ef9c761d..7f7db0cbc1b35 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filter Pihak ke-3", + "message": "Daftar Filter", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Terapkan perubahan", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokal", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Iklan", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Tersesuai", "description": "English: Custom" }, + "3pImport": { + "message": "Impor...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Satu URL per baris. Baris yang diawali dengan ‘!’ akan diabaikan. URL yang tidak valid akan diabaikan tanpa peringatan.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Satu URL per baris. URL yang tidak valid akan diabaikan tanpa peringatan.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Sudah usang.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Satu filter per baris. Filter dapat berupa nama host, atau filter yang kompatibel dengan Adblock Plus. Baris yang diawali dengan ‘!’ akan diabaikan.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Satu filter per baris. Filter dapat berupa nama host, atau filter yang kompatibel dengan Adblock Plus. Baris yang diawali dengan !<\/code> akan diabaikan.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Impor dan tambahkan", diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index ae0e0366c61a8..b010ac1326bdb 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Lista dei filtri", + "message": "Filtri di terze parti", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Salva i cambiamenti", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Locale", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Pubblicità", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizzate", "description": "English: Custom" }, + "3pImport": { + "message": "Importa...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Un URL per ogni riga. Ogni riga che comincia con ‘!’ verrà ignorata. URL non validi verranno silenziosamente ignorati.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Obsoleto.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Un filtro per ogni riga. Un filtro può essere un hostname, o un filtro compatibile con Adblock Plus. Ogni riga che comincia con ‘!’ verrà ignorata.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importa e aggiungi", diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index ec88c02b2d378..e2ab546e0d633 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "外部フィルター", + "message": "フィルター一覧", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "適用", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "ローカル", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "広告", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "カスタム", "description": "English: Custom" }, + "3pImport": { + "message": "インポート...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "URL1つにつき1行です。‘!’ が先頭にある行は無視されます。無効なURLもそのまま無視されます。", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "古いバージョンです", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "1行につき1つのフィルターです。フィルターはただのホストネームでもAdblock Plus適合のフィルターでも構いません。‘!’ですでに固定されている行は無視されます。", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "インポートと追加", diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index 59d31a38c109d..d56ba2d4057cd 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -8,7 +8,7 @@ "description": "this will be in the chrome web store: must be 132 characters or less" }, "dashboardName": { - "message": "uBlock₀ — სამართავი გვერდი", + "message": "uBlock₀ — სამართავი დაფა", "description": "English: uBlock₀ — Dashboard" }, "settingsPageName": { @@ -316,7 +316,7 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "3pAutoUpdatePrompt1": { - "message": "ფილტრების სიების თვითგანახლება", + "message": "ფილტრების წესების თვითგანახლება", "description": "A checkbox in the _3rd-party filters_ pane" }, "3pUpdateNow": { @@ -332,7 +332,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "

    ეს პარამეტრი Adblock Plus-სთან თავსებადი “ელემენტის დასამალი” ფილტრების<\/a> დამუშავებისა და გამოყენების შესაძლებლობას იძლევა. ეს ფილტრები, ძირითადად, იმ ხილული ელემენტების დასამალად გამოიყენება ვებგვერდზე, რომელსაც ქსელის მოთხოვნაზე დაფუძნებული ფილტრაციის საშუალებები ვერ ზღუდავს.<\/p>

    ამ შესაძლებლობის ჩართვის შედეგად გაიზრდება uBlock₀-ის მიერ მეხიერების მოხმარება.<\/p>", + "message": "

    ეს პარამეტრი Adblock Plus-სთან თავსებადი “ელემენტის დასამალი” ფილტრების<\/a> დამუშავებისა და გამოყენების შესაძლებლობას იძლევა. ეს ფილტრები, ძირითადად, იმ ხილული ელემენტების დასამალად გამოიყენება ვებგვერდზე, რომელსაც ქსელის მოთხოვნაზე დაფუძნებული ფილტრაციის საშუალებები ვერ ზღუდავს.<\/p>

    ამ შესაძლებლობის ჩართვის შედეგად გაიზრდება uBlock₀-ის მიერ მეხსიერების მოხმარება.<\/p>", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -351,6 +351,10 @@ "message": "ცვლილებების ასახვა", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "ლოკალური", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "რეკლამები", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "საკუთარი სიები", "description": "English: Custom" }, + "3pImport": { + "message": "შემოტანა...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "თითოეული URL ცალკეულ ხაზზე. ხაზები ‘!’ თავსართით უგულებელყოფილი იქნება. არამართებული URL ბმულები, უგულებელყოფილი იქნება გაფრთხილების გარეშე.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "მოძველებული", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "თითოეული ფილტრი ცალკეულ ხაზზე. ფილტრი შეიძლება იყოს საიტის უბრალო დასახელება, ან Adblock Plus-სთან თავსებადი ფილტრი. ხაზები ‘!’ თავსართით უგულებელყოფილი იქნება.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "შემოტანა და დამატება", @@ -460,7 +468,7 @@ "description": "default file name to use" }, "rulesHint": { - "message": "თქვენი ცვალებადი ფილტრების წესების სია.", + "message": "თქვენი ცვალებადი ფილტრების წესები.", "description": "English: List of your dynamic filtering rules." }, "rulesFormatHint": { @@ -632,7 +640,7 @@ "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { - "message": "uBlock₀: გსურთ შემდეგი URL ბმულის საკუთარი ფილტრის სიაში ჩამატება?\n\nდასახელება: „{{title}}“\nURL: {{url}}", + "message": "uBlock₀: გსურთ შემდეგი URL ბმულის საკუთარ ფილტრის წესებში ჩამატება?\n\nდასახელება: „{{title}}“\nURL: {{url}}", "description": "English: The message seen by the user to confirm subscription to a ABP filter list" }, "elapsedOneMinuteAgo": { diff --git a/src/_locales/kk/messages.json b/src/_locales/kk/messages.json index 5a3f91d20c621..3fe9127d72551 100644 --- a/src/_locales/kk/messages.json +++ b/src/_locales/kk/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Өзерістерді іске асыру", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Жарнамалар", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Custom", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Out of date.", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Import and append", diff --git a/src/_locales/kn/messages.json b/src/_locales/kn/messages.json index 8e6a240f98ca8..d2cf3ea85eca6 100644 --- a/src/_locales/kn/messages.json +++ b/src/_locales/kn/messages.json @@ -351,6 +351,10 @@ "message": "ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಿ", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "ಜಾಹಿರಾತು", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "ಇಚ್ಛೆಯ", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "ಹಳೆಯದು", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "ಆಮದಿಸಿ ಸೇರ್ಪಡಿಸು", diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index d66723336497e..7648686cd802e 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -351,6 +351,10 @@ "message": "변경사항 적용", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "광고", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "사용자 지정", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "한 줄에 한 개의 URL을 입력하세요. 시작 부분이 ‘!’ 로 시작되면 무시됩니다. 존재하지 않는 URL은 자동으로 무시됩니다.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "구버전", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "한 줄에 한 개의 필터를 입력하세요. 필터는 순수 호스트이름, 혹은 Adblock Plus-호환 필터가 될 수 있습니다. 시작 부분이 ‘!’ 로 시작되면 무시됩니다.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "가져오기 및 추가하기", diff --git a/src/_locales/lt/messages.json b/src/_locales/lt/messages.json index 6ba10cabb9cbd..b454b49e5c36e 100644 --- a/src/_locales/lt/messages.json +++ b/src/_locales/lt/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "3-iųjų šalių filtrai", + "message": "Filtrų sąrašai", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Taikyti pakeitimus", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Vietiniai", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamos", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Adaptuoti", "description": "English: Custom" }, + "3pImport": { + "message": "Importuoti...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Vienas URL eilutėje. Eilutės pradėtos „!“ bus ignoruotos. Neteisingi URL bus tyliai ignoruoti.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Vienas URL eilutėje. Neteisingi URL bus tyliai ignoruoti.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Pasenęs.", @@ -400,8 +408,8 @@ "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 „!“ bus ignoruotos. ", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Vienas filtras eilutėje. Filtras gali būti paprastas serverio adresas, arba su Adblock Plus suderinamas filtras. Eilutės pradėtos !<\/code> bus ignoruotos.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importuoti ir papildyti", diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index 83bc3a46f491b..11a28d9c80d1d 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -351,6 +351,10 @@ "message": "Lietot izmaiņas", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklāmas", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Lietotāja", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Vienu URL katrā rindiņā. Rindiņas, kuras sākas ar ‘!’ tiks ignorētas. Nederīgs URL tiks ignorēts bez brīdinājuma.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Novecojis.", @@ -400,8 +408,8 @@ "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 saderīgs ar Adblock Plus filtrs. Rindiņas, kuras sākas ar ‘!’ tiks ignorētas.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "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" }, "1pImport": { "message": "Importēt un pievienot", diff --git a/src/_locales/ml/messages.json b/src/_locales/ml/messages.json index ffdb6c36aaba5..1534987dc680d 100644 --- a/src/_locales/ml/messages.json +++ b/src/_locales/ml/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "മാറ്റങ്ങള്‍ അപ്ലേ ചെയ്യുക", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "പരസ്യങ്ങള്‍", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "കസ്റ്റം", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "ഒരു വരിയില്‍ ഒരു യുആര്‍എല്‍ എന്ന രീതിയില്‍. ‘!’ എന്നിവയില്‍ തുടങ്ങുന്ന വരികള്‍ ഇഗ്നോര്‍ ചെയ്യപ്പെടും. ഇന്‍വാലിഡ്‌ ആയ യുആര്‍എല്ലുകള്‍ നിശബ്ദമായി ഇഗ്നോര്‍ ചെയ്യപ്പെടും.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "കാലഹരണപ്പെട്ടത്", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "ഒരു വരിയില്‍ ഒരു ഫില്‍റ്റര്‍ എന്ന രീതിയില്‍. ഒരു ഫില്‍റ്റര്‍ എന്നത്, ഹോസ്റ്റ് നെയിം, അല്ലെങ്കില്‍ ആഡ് ബ്ലോക്ക് പ്ലസ്‌-നോട്‌ കംപാറ്റബിള്‍ ആയ ഫില്‍റ്റര്‍ എന്നിവ ആകാം. ‘!’ എന്നിവയില്‍ ആരംഭിക്കുന്ന വരികള്‍ ഇഗ്നോര്‍ ചെയ്യപ്പെടും.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "ഇമ്പോര്‍ട്ടും കൂട്ടിചേര്‍ക്കലും ചെയ്യുക", diff --git a/src/_locales/mr/messages.json b/src/_locales/mr/messages.json index bf2f41c74f728..489e4cf4d9484 100644 --- a/src/_locales/mr/messages.json +++ b/src/_locales/mr/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "बदल लागू करा", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "जाहिराती", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "सानुकूल", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "प्रति ओळ एक युआरएल. ओळी सह प्रिफिक्स ‘!’ कढे दुर्लक्ष केले जाईल. अवैध युआरएल शांतपणे दुर्लक्ष केले जाईल.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "कालबाह्य", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "प्रति ओळ एक फिल्टर. फिल्टर एक साधे होस्ट नावाचा असू शकतो, किंवा एक अद्ब्लोक प्लस सुसंगत फिल्टर असू शकतो. ओळी सह प्रिफिक्स ‘!’ कढे दुर्लक्ष केले जाईल.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "आयात आणि समावेश करा", diff --git a/src/_locales/ms/messages.json b/src/_locales/ms/messages.json index ae44caa169fd3..72abb5e4e9cf1 100644 --- a/src/_locales/ms/messages.json +++ b/src/_locales/ms/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Apply changes", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Iklan", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Custom", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "One URL per line. Invalid URLs will be silently ignored.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Out of date.", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with !<\/code> will be ignored.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Import and append", diff --git a/src/_locales/nb/messages.json b/src/_locales/nb/messages.json index 364bc3df86e6f..a61b594457e41 100644 --- a/src/_locales/nb/messages.json +++ b/src/_locales/nb/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Tredjeparts filtre", + "message": "Filterlister", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Bruk endringer", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Innebygd", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklame", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Egendefinert", "description": "English: Custom" }, + "3pImport": { + "message": "Importer...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "En nettadresse per linje. Linjer med prefikset ‘!’ vil bli ignorert. Ugyldige nettadresser ignoreres stille.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "En nettadresse per linje. Ugyldige nettadresser ignoreres stille.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Utgått på dato", @@ -400,8 +408,8 @@ "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 Adblock Plus-kompatibelt filter. Linjer med prefikset ‘!’ vil bli ignorert.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Ett filter per linje. Et filter kan være et vanlig vertsnavn eller et Adblock Plus-kompatibelt filter. Linjer med prefikset !<\/code> blir ignorert.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importer og legg til", diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index e6cc15201721c..f5b82a0fdecaf 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filters van derden", + "message": "Filterlijsten", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Wijzigingen toepassen", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokaal", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Advertenties", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Aangepast", "description": "English: Custom" }, + "3pImport": { + "message": "Importeren...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Eén URL per regel. Regels beginnend met ‘!’ worden genegeerd. Ongeldige URL’s worden zonder mededeling genegeerd.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Eén URL per regel. Ongeldige URL’s worden zonder mededeling genegeerd.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Verouderd.", @@ -400,8 +408,8 @@ "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 Adblock Plus-compatibel filter zijn. Regels beginnend met ‘!’ worden genegeerd.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Eén filter per regel. Een filter kan een gewone hostnaam of een Adblock Plus-compatibel filter zijn. Regels beginnend met !<\/code> worden genegeerd.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importeren en toevoegen", diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index 572f986aad40b..b6e8114654bcf 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Zewnętrzne filtry", + "message": "Listy filtrów", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Zastosuj zmiany", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Wbudowane", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamy", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Własne", "description": "English: Custom" }, + "3pImport": { + "message": "Importuj...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "W jednym wierszu może być tylko jeden adres URL. Wiersze poprzedzone znakiem wykrzyknika [ ! ] i błędne adresy URL będą pomijane.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Jeden adres URL na linię. Błędne adresy URL będą pomijane.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Nieaktualne.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "W jednym wierszu może być tylko jeden filtr. Filtrem może być nazwa hosta lub filtr kompatybilny z dodatkiem AdBlock Plus. Wiersze poprzedzone znakiem wykrzyknika [ ! ] będą pomijane.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Jeden filtr na linię. Filtrem może być nazwa hosta lub filtr kompatybilny z dodatkiem Adblock Plus. Wiersze poprzedzone !<\/code> będą pomijane.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importuj i dołącz", diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index ed178a64ed936..a9177ded9586c 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filtros de terceiros", + "message": "Listas de filtros", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Aplicar alterações", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Local", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Anúncios", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizado", "description": "English: Custom" }, + "3pImport": { + "message": "Importar...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Uma URL por linha. As linhas prefixadas com ‘!’ serão ignoradas. URLs inválidas serão silenciosamente ignoradas.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Uma URL por linha. URLs inválidas serão silenciosamente ignoradas.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Desatualizada.", @@ -400,8 +408,8 @@ "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 servidor ou um filtro compatível com o Adblock Plus. Linhas prefixadas com ‘!’ serão ignoradas.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Um filtro por linha. O filtro pode ser um simples nome de servidor ou um filtro compatível com Adblock Plus. Linhas com prefixo !<\/code> serão ignoradas.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importar e adicionar", @@ -460,7 +468,7 @@ "description": "default file name to use" }, "rulesHint": { - "message": "Lista de suas regras de filtragem dinâmica.", + "message": "Lista das suas regras de filtragem dinâmica.", "description": "English: List of your dynamic filtering rules." }, "rulesFormatHint": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index d447bfc2236b0..b75fb92944ee0 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filtros de terceiros", + "message": "Listas de filtros", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Aplicar alterações", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Locais", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Anúncios", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizado", "description": "English: Custom" }, + "3pImport": { + "message": "Importar...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Um endereço por linha. Linhas começadas com ‘!’ serão ignoradas. Endereços inválidos serão ignorados silenciosamente.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Um URL por linha. Os URLs inválidos serão ignorados silenciosamente.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Desatualizada.", @@ -400,8 +408,8 @@ "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 servidor, ou um filtro compatível com o Adblock Plus. Linhas começadas por ‘!’ serão ignoradas.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Um filtro por linha. Um filtro pode ser um simples nome de servidor ou um filtro compatível com o Adblock Plus. Linhas começadas por !<\/code> serão ignoradas.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importar e anexar", @@ -496,7 +504,7 @@ "description": "English: Domain" }, "logRequestsHeaderURL": { - "message": "Endereço", + "message": "URL", "description": "English: URL" }, "logRequestsHeaderFilter": { diff --git a/src/_locales/ro/messages.json b/src/_locales/ro/messages.json index f1b1ee5087cae..528df4b529057 100644 --- a/src/_locales/ro/messages.json +++ b/src/_locales/ro/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filtre terțe", + "message": "Liste de filtre", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -48,11 +48,11 @@ "description": "English: Click: disable\/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Clic ca să dezactivezi uBo pentru acest site.\n\nCtrl+clic ca sa dezactivezi uBo doar pe această pagină.", + "message": "Clic ca să dezactivezi uBlock₀ pe acest site.\n\nCtrl+clic ca să dezactivezi uBlock₀ doar pe această pagină.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Dați clic pentru a activa uBlock₀ pentru acest site.", + "message": "Clic pentru a activa uBlock₀ pe acest site.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -96,11 +96,11 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "Dați clic pentru a bloca popup-urile pentru acest site", + "message": "Clic pentru a bloca toate popup-urile pe acest site", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Dați clic pentru a nu mai bloca popup-urile pentru acest site", + "message": "Clic pentru a nu mai bloca toate popup-urile pe acest site", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -108,11 +108,11 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "Dați clic pentru a bloca elementele media de mari dimensiuni pentru acest site", + "message": "Clic pentru a bloca elementele media de mari dimensiuni pe acest site", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "Dați clic pentru a nu mai bloca elementele media de mari dimensiuni pentru acest site", + "message": "Clic pentru a nu mai bloca elementele media de mari dimensiuni pe acest site", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -120,11 +120,11 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Dați clic pentru a dezactiva filtrele vizuale pentru acest site", + "message": "Clic pentru a dezactiva filtrele vizuale pe acest site", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Dați clic pentru a activa filtrele vizuale pentru acest site", + "message": "Clic pentru a activa filtrele vizuale pe acest site", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -132,11 +132,11 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { - "message": "Dați clic pentru a bloca fonturile externe pentru acest site", + "message": "Clic pentru a bloca fonturile externe pe acest site", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "Dați clic pentru a nu mai bloca fonturile externe pentru acest site", + "message": "Clic pentru a nu mai bloca fonturile externe pe acest site", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipGlobalRules": { @@ -351,6 +351,10 @@ "message": "Aplică modificările", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Locale", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reclame", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizare", "description": "English: Custom" }, + "3pImport": { + "message": "Importă...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "O adresă pe linie. Liniile care încep cu ‘!’ vor fi ignorate. Adresele nevalide vor fi ignorate fără avertizare.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "O adresă pe linie. Adresele nevalide vor fi ignorate fără avertizare.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "învechit", @@ -400,8 +408,8 @@ "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 Adblock Plus. Liniile precedate de ‘!’ vor fi ignorate.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Un filtru pe linie. Un filtru poate fi un simplu nume de gazdă sau un filtru compatibil Adblock Plus. Liniile precedate de !<\/code> vor fi ignorate.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importă și adaugă", @@ -468,7 +476,7 @@ "description": "English: dynamic rule syntax and full documentation." }, "whitelistPrompt": { - "message": "Lista ta de nume de gazde unde uBlock va fi dezactivat. Fiecare adresă pe o singură linie. Adresele nevalide vor fi ignorate automat.", + "message": "Lista ta de nume de gazde unde uBlock Origin va fi dezactivat. O înregistrare pe linie. Directivele nevalide vor fi ignorate automat și comentate.", "description": "English: An overview of the content of the dashboard's Whitelist pane." }, "whitelistImport": { @@ -512,7 +520,7 @@ "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { - "message": "Fila actuală", + "message": "Fila curentă", "description": "Appears in the logger's tab selector" }, "logFilterPrompt": { diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 3c926ea169fdf..5bbf873fa6956 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Сторонние фильтры", + "message": "Списки фильтров", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Применить изменения", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Встроенные", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Реклама", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Пользовательские", "description": "English: Custom" }, + "3pImport": { + "message": "Импортировать...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Один URL на строку. Строки, начинающиеся с символа ‘!’, будут игнорироваться. Неверные ссылки будут игнорироваться без предупреждения.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Один URL на строку. Неверные URL будут проигнорированы без предупреждения.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Устарел.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Одно правило на строку. Правилом может быть обычное имя сайта, или Adblock Plus-совместимый фильтр. Строки, начинающиеся с ‘!’, будут игнорироваться.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Одно правило на строку. Правилом может быть обычное имя сайта, или Adblock Plus-совместимый фильтр. Строки, начинающиеся с !<\/code>, будут проигнорированы.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Импортировать и добавить", diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index 4cacc2add524d..134b542255624 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Použiť zmeny", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokálne", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamy", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Vlastné", "description": "English: Custom" }, + "3pImport": { + "message": "Importovať...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Jedna URL na riadok. Riadky začínajúce s ‘!’ budú ignorované. Neplatné URL budú potichu ignorované.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Zastarané.", @@ -401,7 +409,7 @@ }, "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 ‘!’ budú ignorované.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importovať a pripojiť", diff --git a/src/_locales/sl/messages.json b/src/_locales/sl/messages.json index e397860052d61..81a59c469b241 100644 --- a/src/_locales/sl/messages.json +++ b/src/_locales/sl/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Uveljavi spremembe", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokalno", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Oglasi", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Po meri", "description": "English: Custom" }, + "3pImport": { + "message": "Uvozi ...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "En URL na vrstico. Vrstice s predpono ‘!’ in neveljavni URL-ji bodo prezrti.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "zastarelo", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "En filter na vrstico. Filter je lahko navadno ime gostitelja, ali pa Adblock Plus kompatibilen filter. Vrstice z znakom ‘!’ bodo ignorirane.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Uvozi in dodaj", diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index a2a402a1fa3e9..a11161cf2c714 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filtrat nga palët e treta", + "message": "Listat e filtrave", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Ruaj ndryshimet", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokale", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamat", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Personalizoj", "description": "English: Custom" }, + "3pImport": { + "message": "Importoj...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Një URL për rresht. Nuk do të merren parasysh rreshtat që fillojnë me ‘!’, sikundër adresat e pasakta.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Një URL për rresht. Nuk do të merren parasysh adresat e pasakta.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "E vjetër.", @@ -400,8 +408,8 @@ "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 t'i përngjajë atyre që përdor Adblock Plus. Nuk do të merren parasysh rreshtat që fillojnë me ‘!’.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Një filtër për rresht. Filtri mund të jetë thjesht emri i një hosti ose i ngjashëm me ata që përdor Adblock Plus. Nuk do të merren parasysh rreshtat që fillojnë me !<\/code>.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importoj dhe shtoj", diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index 5518deef813a9..6b22e1b841072 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Додатни филтери", + "message": "Листе филтера", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Примени промене", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Локално", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Рекламе", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Прилагођени", "description": "English: Custom" }, + "3pImport": { + "message": "Увези...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Једна адреса по реду. Редови са префиксом ‘!’ ће бити игнорисани. Неисправне адресе ће бити тихо игнорисане.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Једна адреса по реду. Неисправне адресе ће бити тихо игнорисане.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Застарело.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Један филтер по реду. Филтер може бити назив хоста или филтер компатибилан са Adblock Plus форматом. Редови са префиксом ‘!’ ће бити игнорисани.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Један филтер по реду. Филтер може бити назив хоста или филтер компатибилан са Adblock Plus форматом. Редови са префиксом !<\/code> ће бити игнорисани.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Увези и додај", diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index 97658aca88a00..08ff8ae750340 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Verkställ ändringar", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Lokalt", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Annonser", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Egna filter", "description": "English: Custom" }, + "3pImport": { + "message": "Importera...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "En adress per rad. Rader med prefixet ‘!’ kommer att ignoreras. Ogiltiga adresser kommer också ignoreras.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "En webbadress per rad. Rader med prefixet ‘!’ kommer att ignoreras. Ogiltiga webbadresser kommer också ignoreras.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Föråldrad.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Ett filter per rad. Ett filter kan vara ett vanligt värdnamn eller ett Adblock Plus-kompatibelt filter. Rader med prefixet ‘!’ kommer att ignoreras.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Importera och lägg till", diff --git a/src/_locales/ta/messages.json b/src/_locales/ta/messages.json index 317afca55c8ae..ae6fc89ca5af0 100644 --- a/src/_locales/ta/messages.json +++ b/src/_locales/ta/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "மாற்றங்களைச் செயல்படுத்து", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "விளம்பரங்கள்", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "தனிபயன்", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "ஒரு வரிக்கு ஒரு இணைய முகவரி. ‘!’ எனும் எழுத்தில் தொடங்கும் வரிகள் புறக்கணிக்கப்படும். தவறான முகவரிகளும் அமைதியாகப் புறக்கணிக்கப்படும்.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "காலாவதியாகிவிட்டது", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "ஒரு வரிக்கு ஒரு வடிகட்டி. வடிகட்டி என்பது வெறும் வழங்கிப்பெயராக இருக்கலாம், அல்லது Adblock Plus-க்குப் பொருந்தும் வடிகட்டியாக இருக்கலாம். ‘!’ எனும் எழுத்தில் தொடங்கும் வரிகள் புறக்கணிக்கப்படும்.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "இறக்குமதி செய் மற்றும் இணை", diff --git a/src/_locales/te/messages.json b/src/_locales/te/messages.json index 9870d807c69a2..095d94dd67f73 100644 --- a/src/_locales/te/messages.json +++ b/src/_locales/te/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "ఇతర మూలాల నుండి పొందిన వడపోతలు", + "message": "3వ-పక్ష వడపోతలు", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "మార్పులను అమలుపరచు", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Built-in", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "ప్రకటనలు", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "సొంత నిర్దేషణ", "description": "English: Custom" }, + "3pImport": { + "message": "Import...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "ఒక్కో పంక్తిలో ఒక URL. పంక్తిలో మొదలు ‘!’ ఉన్నచో అది పరిగనించబడదు. చెల్లని URLలు మౌనంగా విస్మరించబడుతాయి.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "ఒక్కో పంక్తిలో ఒక URL. పంక్తిలో మొదట ‘!’ ఉన్నచో ఆ పంక్తి పరిగనించబడదు. చెల్లని URLలు మౌనంగా విస్మరించబడుతాయి.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "పాతబడింది", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "ఒక్కో పంక్తిలో ఒక వడపోత నమోదు. పేర్కొనబడే వడపోత, కేవలం హోస్టుపేరు లేదా Adblock Plusకి అనువైన వడపోత కావొచ్చు. పంక్తిలో మొదలు ‘!’ ఉన్నచో అది పరిగణలోకి తీసుకొబడదు.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "ఒక్కో పంక్తిలో ఒక ఫిల్టర్ నమోదు. పేర్కొనబడే ఫిల్టర్, కేవలం హోస్టుపేరు లేదా Adblock Plusకి అనువైన ఫిల్టర్ కావొచ్చు. పంక్తిలో మొదట ‘!’ ఉన్నచో ఆ పంక్తి పరిగణలోకి తీసుకొబడదు.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "దిగుమతిచేసి పోడిగించుము", diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index c68fa1c7daf1d..2cf362d2cd6f2 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "3. taraf süzgeçler", + "message": "Süzgeç listeleri", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -351,6 +351,10 @@ "message": "Değişiklikleri uygula", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Yerel", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Reklamlar", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Özel", "description": "English: Custom" }, + "3pImport": { + "message": "İçe aktar...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "Her satırda bir URL. ‘!’ ile başlayan satırlar göz ardı edilir. Geçersiz URL'ler sessizce yok sayılır.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "Her satırda bir URL. Geçersiz URL'ler sessizce yok sayılacaktır.", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Güncel değil.", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "Her satırda bir süzgeç. Süzgeç bir alan adı veya Adblock Plus uyumlu bir süzgeç olabilir. ‘!’ ile başlayan satırlar yok sayılır.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "Her satırda bir süzgeç. Bir süzgeç yalın bir alan adı veya Adblock Plus uyumlu bir süzgeç olabilir. !<\/code> ile başlayan satırlar yok sayılır.", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "İçe aktar ve sonuna ekle", diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index 253db74238ce8..ab765d1d5b33c 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "Застосувати зміни", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Локальні", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Реклама", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Користувацькі", "description": "English: Custom" }, + "3pImport": { + "message": "Імпорт...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Одне посилання на рядок. Рядки, що починаються з ‘!’ будуть проігноровані. Невірні посилання будуть тихо проігноровані.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "Застарілий.", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Один фільтр на рядок. Фільтром може бути адреса сайту або фільтр у Adblock Plus-сумісному записі. Рядки, що починаються з ‘!’ ігноруються.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Імпортувати та додати", diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index bc38e23b85766..8eeffb6672e80 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -16,7 +16,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Bộ lọc bên thứ ba", + "message": "Bộ lọc", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -48,11 +48,11 @@ "description": "English: Click: disable\/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Nhấp chuột: vô hiệu hoá uBlock₀ cho trang này.\nCtrl + nhấp chuột: chỉ vô hiệu hoá uBlock₀ trên trang này.", + "message": "Nhấp chuột để vô hiệu uBlock₀ cho trang này. \n\nCtrl + nhấp chuột để tắt uBlock₀ chỉ trên trang này.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Nhấp để bật uBO trên trang này.", + "message": "Nhấp để bật uBlock₀ trên trang này.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -120,11 +120,11 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Nhấp để vô hiệu hoá lọc mỹ phẩm trên trang này", + "message": "Nhấn để tắt bộ lọc phần tử trên trang này", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Nhấp để bật lọc mỹ phẩm trên trang này", + "message": "Nhấn để bật bộ lọc phần tử trên trang này", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -351,6 +351,10 @@ "message": "Áp dụng các thay đổi", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "Trên máy", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "Quảng cáo", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "Tuỳ chỉnh", "description": "English: Custom" }, + "3pImport": { + "message": "Nhập...", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { "message": "Một URL cho mỗi dòng. Dòng bắt đầu với ‘!’sẽ bị bỏ qua. Các URL không hợp lệ sẽ được bỏ qua âm thầm.", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "đã cũ", @@ -401,7 +409,7 @@ }, "1pFormatHint": { "message": "Một bộ lọc trên mỗi dòng. Một bộ lọc có thể là một tên máy chủ đơn giản, hoặc một bộ lọc Adblock Plus tương thích. Những dòng bắt đầu với ‘!’ sẽ bị bỏ qua.", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "Nhập và thêm vào", @@ -512,7 +520,7 @@ "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { - "message": "Current tab", + "message": "Tab hiện tại", "description": "Appears in the logger's tab selector" }, "logFilterPrompt": { @@ -736,7 +744,7 @@ "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { - "message": "Áp dụng các thay đổi", + "message": "Lưu thay đổi", "description": "for generic 'Apply changes' buttons" }, "genericRevert": { diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index dee4c5fa3d2bb..bd2eb0498542d 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -64,7 +64,7 @@ "description": "English: on this page" }, "popupBlockedStats": { - "message": "{{count}} 或称 {{percent}}%", + "message": "{{count}} 占 {{percent}}%", "description": "Example: 15 or 13%" }, "popupBlockedSinceInstallPrompt": { @@ -72,7 +72,7 @@ "description": "English: since install" }, "popupOr": { - "message": "或", + "message": "占", "description": "English: or" }, "popupTipDashboard": { @@ -351,6 +351,10 @@ "message": "应用更改", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "内置", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "广告", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "自定义", "description": "English: Custom" }, + "3pImport": { + "message": "导入…", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "一行一条 URL。以 ‘!’ 开头的行将被忽略,无效的 URL 也将被忽略。", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "一行一条网址。无效网址将被忽略。", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "需要更新", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "一行一条过滤规则。每条规则可以是一个普通的主机名或者是一条 Adblock Plus 兼容的过滤规则。以 ‘!’ 开头的行将被忽略。", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "一行一条过滤规则。每条规则可以是一个普通的主机名或者是一条 Adblock Plus 兼容的过滤规则。以 !<\/code> 开头的行将被忽略。", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "导入并添加", diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index feeb8dd67474f..a4b1bda07adf9 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -351,6 +351,10 @@ "message": "套用變更", "description": "English: Apply changes" }, + "3pGroupDefault": { + "message": "內置", + "description": "Header for the uBlock filters section in 'Filter lists pane'" + }, "3pGroupAds": { "message": "廣告", "description": "English: Ads" @@ -379,9 +383,13 @@ "message": "自訂", "description": "English: Custom" }, + "3pImport": { + "message": "匯入…", + "description": "The label for the checkbox used to import external filter lists" + }, "3pExternalListsHint": { - "message": "每行一個網址。以“!”開頭的行將被忽略。無效的網址將被忽略。", - "description": "English: One URL per line. Lines prefixed with ‘!’ will be ignored. Invalid URLs will be silently ignored." + "message": "每行一個網址。無效網址將被忽略。", + "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { "message": "已過期。", @@ -400,8 +408,8 @@ "description": "used as a tooltip for error icon beside a list" }, "1pFormatHint": { - "message": "每行一個過濾規則。一個規則可以是一個平凡的主機名稱或者是一個與 Adblock Plus 相容的過濾規則。以“!”開頭的行將被忽略。", - "description": "English: One filter per line. A filter can be a plain hostname, or an Adblock Plus-compatible filter. Lines prefixed with ‘!’ will be ignored." + "message": "每行一個過濾規則。規則可以單純是主機名稱,或是 Adblock Plus 相容格式的過濾規則,以 !<\/code> 開頭的行將被忽略。", + "description": "Short information about how to create custom filters" }, "1pImport": { "message": "匯入並加入", diff --git a/src/cloud-ui.html b/src/cloud-ui.html index 3053d7ab8ce38..3f69a362ca238 100644 --- a/src/cloud-ui.html +++ b/src/cloud-ui.html @@ -5,11 +5,13 @@ - - - - -

    +
    + + + + +
    +

    diff --git a/src/css/1p-filters.css b/src/css/1p-filters.css index 2048139e810f6..5983465a0550d 100644 --- a/src/css/1p-filters.css +++ b/src/css/1p-filters.css @@ -1,3 +1,7 @@ +html { + height: 100vh; + overflow: hidden; + } body { overflow: hidden; } diff --git a/src/css/3p-filters.css b/src/css/3p-filters.css index b03827b745a55..3f4efa06f1e5b 100644 --- a/src/css/3p-filters.css +++ b/src/css/3p-filters.css @@ -3,8 +3,16 @@ 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); } } ul { - padding: 0; list-style-type: none; + padding-left: 1em; + padding-right: 0; + } +body[dir="rtl"] ul { + padding-left: 0; + padding-right: 1em; + } +ul.root { + padding: 0; } #options li { margin-bottom: 0.5em; @@ -13,7 +21,7 @@ ul { cursor: pointer; } #listsOfBlockedHostsPrompt:before { - color: #aaa; + color: #888; content: '\2212 '; } body.hideUnused #listsOfBlockedHostsPrompt:before { @@ -21,92 +29,86 @@ body.hideUnused #listsOfBlockedHostsPrompt:before { } #lists { margin: 0.5em 0 0 0; - padding-left: 0.5em; - padding-right: 0em; - } -body[dir="rtl"] #lists { - padding-left: 0em; - padding-right: 0.5em; + padding: 0; } #lists > li { margin: 0.5em 0 0 0; padding: 0; list-style-type: none; } -#lists > .groupEntry > .geName { +.groupEntry .geDetails { cursor: pointer; - font-size: 110%; - } -#lists > .groupEntry > .geCount { - font-size: 90%; } -#lists > .groupEntry:not(:first-child) > .geName:before { - color: #aaa; +.groupEntry:not([data-groupkey="user"]) .geDetails:before { + color: #888; content: '\2212 '; } -#lists > .groupEntry.collapsed > .geName:before { - color: #aaa; +.groupEntry.hideUnused:not([data-groupkey="user"]) .geDetails:before { content: '+ '; } -#lists > .groupEntry > ul { - margin: 0.25em 0 0 0; +.groupEntry .geName { + pointer-events: none; } -#lists > .groupEntry.collapsed > ul { - display: none; +.groupEntry .geCount { + font-size: 90%; + pointer-events: none; + } +.groupEntry > ul { + margin: 0.25em 0 0 0; + padding-left: 1em; } -li.listEntry { - line-height: 150%; +.listEntry { margin: 0 auto 0 auto; - margin-left: 2.5em; - margin-right: 0; - text-indent: -2em; + padding: 0.2em 0; + white-space: nowrap; } -body[dir="rtl"] li.listEntry { - margin-left: 0em; - margin-right: 2.5em; +.groupEntry:not([data-groupkey="user"]) .listEntry.unused { + display: none; } -li.listEntry > * { +.listEntry > * { margin-right: 0.5em; - text-indent: 0; unicode-bidi: embed; } -li.listEntry.toRemove > input[type="checkbox"] { +.listEntry.toRemove > input[type="checkbox"] { visibility: hidden; } -li.listEntry.toRemove > a.content { +.listEntry.toRemove > a.content { text-decoration: line-through; } -li.listEntry > .fa { +.listEntry > .fa { color: inherit; display: none; font-size: 110%; opacity: 0.5; vertical-align: baseline; } -li.listEntry > a.fa:hover { +.listEntry > a.towiki { + display: inline-block; + } +.listEntry > a.fa:hover { opacity: 1; } -li.listEntry.support > a.support { +.listEntry.support > a.support { display: inline-block; } -li.listEntry > a.remove, -li.listEntry > a.remove:visited { +.listEntry > a.remove, +.listEntry > a.remove:visited { color: darkred; } -li.listEntry.external > a.remove { +.listEntry.external > a.remove { display: inline-block; } -li.listEntry.mustread > a.mustread { +.listEntry.mustread > a.mustread { display: inline-block; } -li.listEntry.mustread > a.mustread:hover { +.listEntry.mustread > a.mustread:hover { color: mediumblue; } -li.listEntry > .counts { +.listEntry > .counts { display: none; font-size: smaller; } -li.listEntry > input[type="checkbox"]:checked ~ .counts { +.listEntry > input[type="checkbox"]:checked ~ .counts { display: inline; } .dim { @@ -125,56 +127,57 @@ body[dir=rtl] #buttonApply { #buttonApply.disabled { display: none; } -li.listEntry span.status { +.listEntry span.status { color: #444; cursor: default; display: none; } -li.listEntry span.status:hover { +.listEntry span.status:hover { opacity: 1; } -li.listEntry span.unsecure { +.listEntry span.unsecure { color: darkred; } -li.listEntry.unsecure > input[type="checkbox"]:checked ~ span.unsecure { +.listEntry.unsecure > input[type="checkbox"]:checked ~ span.unsecure { display: inline-block; } -li.listEntry span.failed { +.listEntry span.failed { color: darkred; } -li.listEntry.failed span.failed { +.listEntry.failed span.failed { display: inline-block; } -li.listEntry span.cache { +.listEntry span.cache { cursor: pointer; } -li.listEntry.cached:not(.obsolete) > input[type="checkbox"]:checked ~ span.cache { +.listEntry.cached:not(.obsolete) > input[type="checkbox"]:checked ~ span.cache { display: inline-block; } -li.listEntry span.obsolete { +.listEntry span.obsolete { color: hsl(36, 100%, 40%); } -body:not(.updating) li.listEntry.obsolete > input[type="checkbox"]:checked ~ span.obsolete { +body:not(.updating) .listEntry.obsolete > input[type="checkbox"]:checked ~ span.obsolete { display: inline-block; } -li.listEntry span.updating { +.listEntry span.updating { transform-origin: 50% 46%; } -body.updating li.listEntry.obsolete > input[type="checkbox"]:checked ~ span.updating { +body.updating .listEntry.obsolete > input[type="checkbox"]:checked ~ span.updating { animation: spin 2s linear infinite; display: inline-block; } -#externalListsDiv { - margin: 1.5em auto 0 1.5em; - } -body[dir=rtl] #externalListsDiv { - margin: 1.5em 1.5em 0 auto; - } -#externalLists { +.listEntry.toImport > input[type="checkbox"] ~ textarea { + border: 1px solid #ccc; box-sizing: border-box; - height: 8em; - margin-top: 0.25em; + display: block; + font-size: smaller; + height: 6em; + margin-left: 2em; + resize: vertical; + visibility: hidden; white-space: pre; - width: 100%; - word-wrap: normal; + width: calc(100% - 4em); + } +.listEntry.toImport > input[type="checkbox"]:checked ~ textarea { + visibility: visible; } diff --git a/src/css/cloud-ui.css b/src/css/cloud-ui.css index 609b3cddc33ce..334e5877307a6 100644 --- a/src/css/cloud-ui.css +++ b/src/css/cloud-ui.css @@ -2,62 +2,52 @@ background: url("../img/cloud.png") hsl(216, 100%, 93%); border-radius: 3px; margin: 0.5em 0; - padding: 1em 1em 0 1em; + padding: 0.5em; position: relative; } #cloudWidget.hide { display: none; } -#cloudWidget > button { - display: inline-block; - font-family: FontAwesome; - font-size: 160%; - font-style: normal; - font-weight: normal; - line-height: 1; - padding: 0.2em 0.25em 0.1em 0.25em; - position: relative; - vertical-align: baseline; +#cloudWidget .cloudTools { + align-items: center; + display: flex; + flex-wrap: nowrap; } -#cloudWidget > button[disabled] { +#cloudWidget button[disabled] { visibility: hidden; } -#cloudWidget > button.error { - color: red; +#cloudWidget button > span.fa { + font-size: 150%; } -#cloudPush:after { - content: '\f0ee'; +#cloudWidget button.error { + color: red; } -#cloudPull:before, -#cloudPullAndMerge:before { - content: '\f0ed'; -} #cloudPullAndMerge { - margin: 0 0.25em; + margin-left: 0.25em; } -#cloudPullAndMerge:after { - content: '\f067'; +#cloudPullAndMerge > span { + position: relative; +} +#cloudPullAndMerge > span > span { font-size: 50%; position: absolute; - right: 0; - top: 10%; } -#cloudWidget > span { +#cloudInfo { color: gray; display: inline-block; font-size: 90%; margin: 0 1em; + overflow: hidden; padding: 0; - vertical-align: bottom; white-space: pre; } #cloudError { color: red; - margin: 0; - padding: 0.5em 0; - } -#cloudError > span { font-size: x-small; + margin: 0.5em 0 0 0; + } +#cloudError:empty { + display: none; } #cloudWidget > #cloudCog { cursor: pointer; diff --git a/src/css/dashboard-common.css b/src/css/dashboard-common.css index a15c1ed2184a2..a011dd33e12de 100644 --- a/src/css/dashboard-common.css +++ b/src/css/dashboard-common.css @@ -1,16 +1,12 @@ body { + background-color: #fff; box-sizing: border-box; - left: 0; - height: 100vh; + color: #000; margin: 0; - overflow: auto; padding: 0; - position: absolute; - right: 0; - top: 0; } body > div.body { - padding: 0 0.5em 0.5em 0.5em; + padding: 0 0.5em; } @media screen and (max-device-width: 960px) { body { @@ -94,8 +90,18 @@ input[type="checkbox"][disabled] + label { padding: 5px; background-color: #FEDAE0; } -@media (max-height: 640px) { +@media (max-height: 640px), (max-height: 800px) and (max-width: 480px) { + .body > p, + .body > ul { + margin: 0.5em 0; + } .vverbose { display: none !important; } } +@media (max-height: 400px) { + html { + min-height: 400px !important; + overflow: auto !important; + } + } diff --git a/src/css/dyna-rules.css b/src/css/dyna-rules.css index f5ddc4a73dd00..5d43424141090 100644 --- a/src/css/dyna-rules.css +++ b/src/css/dyna-rules.css @@ -1,3 +1,7 @@ +html { + height: 100vh; + overflow: hidden; + } body { display: flex; flex-direction: column; @@ -25,7 +29,7 @@ body { text-align: center; vertical-align: top; width: 50%; - white-space: normal; + white-space: nowrap; } #diff .ruleActions h3 { font-weight: normal; diff --git a/src/css/settings.css b/src/css/settings.css index ba77d4510d329..58c9d78e30c1b 100644 --- a/src/css/settings.css +++ b/src/css/settings.css @@ -1,5 +1,10 @@ ul { padding-left: 1em; + padding-right: 0; + } +body[dir="rtl"] ul { + padding-left: 0; + padding-right: 1em; } ul#userSettings { padding-left: 0; diff --git a/src/css/whitelist.css b/src/css/whitelist.css index 292e75d1fef47..fe116381bff55 100644 --- a/src/css/whitelist.css +++ b/src/css/whitelist.css @@ -1,3 +1,7 @@ +html { + height: 100vh; + overflow: hidden; + } body { overflow: hidden; } diff --git a/src/js/1p-filters.js b/src/js/1p-filters.js index 8b7c70a323e3b..73682aedbccaa 100644 --- a/src/js/1p-filters.js +++ b/src/js/1p-filters.js @@ -68,7 +68,6 @@ function renderUserFilters(first) { } cmEditor.setValue(content); if ( first ) { - cmEditor.setCursor(cmEditor.lineCount(), 0); cmEditor.clearHistory(); } userFiltersChanged(false); diff --git a/src/js/3p-filters.js b/src/js/3p-filters.js index baf128e873ea0..a853a9f8836e0 100644 --- a/src/js/3p-filters.js +++ b/src/js/3p-filters.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-2017 Raymond Hill + Copyright (C) 2014-2018 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 @@ -32,7 +32,8 @@ var listDetails = {}, filteringSettingsHash = '', lastUpdateTemplateString = vAPI.i18n('3pLastUpdate'), - reValidExternalList = /[a-z-]+:\/\/\S*\/\S+/; + reValidExternalList = /[a-z-]+:\/\/\S*\/\S+/, + hideUnusedSet = new Set(); /******************************************************************************/ @@ -69,7 +70,6 @@ var renderFilterLists = function(soft) { listEntryTemplate = uDom('#templates .listEntry'), listStatsTemplate = vAPI.i18n('3pListsOfBlockedHostsPerListStats'), renderElapsedTimeToString = vAPI.i18n.renderElapsedTimeToString, - hideUnusedLists = document.body.classList.contains('hideUnused'), groupNames = new Map(); // Assemble a pretty list name if possible @@ -80,16 +80,17 @@ var renderFilterLists = function(soft) { return listTitle; }; - var liFromListEntry = function(listKey, li) { + var liFromListEntry = function(listKey, li, hideUnused) { var entry = listDetails.available[listKey], elem; if ( !li ) { li = listEntryTemplate.clone().nodeAt(0); } + var on = entry.off !== true; if ( li.getAttribute('data-listkey') !== listKey ) { li.setAttribute('data-listkey', listKey); elem = li.querySelector('input[type="checkbox"]'); - elem.checked = entry.off !== true; + elem.checked = on; elem = li.querySelector('a:nth-of-type(1)'); elem.setAttribute('href', 'asset-viewer.html?url=' + encodeURI(listKey)); elem.setAttribute('type', 'text/html'); @@ -115,18 +116,17 @@ var renderFilterLists = function(soft) { } else { li.classList.remove('mustread'); } + li.classList.toggle('unused', hideUnused && !on); } // https://github.com/gorhill/uBlock/issues/1429 if ( !soft ) { - elem = li.querySelector('input[type="checkbox"]'); - elem.checked = entry.off !== true; + li.querySelector('input[type="checkbox"]').checked = on; } - li.style.setProperty('display', hideUnusedLists && entry.off === true ? 'none' : ''); elem = li.querySelector('span.counts'); var text = ''; if ( !isNaN(+entry.entryUsedCount) && !isNaN(+entry.entryCount) ) { text = listStatsTemplate - .replace('{{used}}', renderNumber(entry.off ? 0 : entry.entryUsedCount)) + .replace('{{used}}', renderNumber(on ? entry.entryUsedCount : 0)) .replace('{{total}}', renderNumber(entry.entryCount)); } elem.textContent = text; @@ -157,14 +157,18 @@ var renderFilterLists = function(soft) { var listEntryCountFromGroup = function(listKeys) { if ( Array.isArray(listKeys) === false ) { return ''; } - var count = 0; + var count = 0, + total = 0; var i = listKeys.length; while ( i-- ) { if ( listDetails.available[listKeys[i]].off !== true ) { count += 1; } + total += 1; } - return count === 0 ? '' : '(' + count.toLocaleString() + ')'; + return total !== 0 ? + '(' + count.toLocaleString() + '/' + total.toLocaleString() + ')' : + ''; }; var liFromListGroup = function(groupKey, listKeys) { @@ -189,13 +193,19 @@ var renderFilterLists = function(soft) { if ( liGroup.querySelector('.geName:empty') === null ) { liGroup.querySelector('.geCount').textContent = listEntryCountFromGroup(listKeys); } + var hideUnused = mustHideUnusedLists(groupKey); + liGroup.classList.toggle('hideUnused', hideUnused); var ulGroup = liGroup.querySelector('.listEntries'); if ( !listKeys ) { return liGroup; } listKeys.sort(function(a, b) { return (listDetails.available[a].title || '').localeCompare(listDetails.available[b].title || ''); }); for ( var i = 0; i < listKeys.length; i++ ) { - var liEntry = liFromListEntry(listKeys[i], ulGroup.children[i]); + var liEntry = liFromListEntry( + listKeys[i], + ulGroup.children[i], + hideUnused + ); if ( liEntry.parentElement === null ) { ulGroup.appendChild(liEntry); } @@ -224,15 +234,23 @@ var renderFilterLists = function(soft) { // Before all, set context vars listDetails = details; + // "My filters" will now sit in its own group. The following code + // ensures smooth transition. + listDetails.available['user-filters'].group = 'user'; + // Incremental rendering: this will allow us to easily discard unused // DOM list entries. - uDom('#lists .listEntries .listEntry').addClass('discard'); + uDom('#lists .listEntries .listEntry[data-listkey]').addClass('discard'); + + // Remove import widget while we recreate list of lists. + var importWidget = uDom('.listEntry.toImport').detach(); // Visually split the filter lists in purpose-based groups var ulLists = document.querySelector('#lists'), groups = groupsFromLists(details.available), liGroup, i, groupKey, groupKeys = [ + 'user', 'default', 'ads', 'privacy', @@ -242,6 +260,7 @@ var renderFilterLists = function(soft) { 'regions', 'custom' ]; + document.body.classList.toggle('hideUnused', mustHideUnusedLists('*')); for ( i = 0; i < groupKeys.length; i++ ) { groupKey = groupKeys[i]; liGroup = liFromListGroup(groupKey, groups[groupKey]); @@ -263,17 +282,28 @@ var renderFilterLists = function(soft) { } uDom('#lists .listEntries .listEntry.discard').remove(); - uDom('#autoUpdate').prop('checked', listDetails.autoUpdate === true); - uDom('#listsOfBlockedHostsPrompt').text( + + // Re-insert import widget. + uDom('[data-groupkey="custom"] .listEntries').append(importWidget); + + uDom.nodeFromId('autoUpdate').checked = listDetails.autoUpdate === true; + uDom.nodeFromId('listsOfBlockedHostsPrompt').textContent = vAPI.i18n('3pListsOfBlockedHostsPrompt') - .replace('{{netFilterCount}}', renderNumber(details.netFilterCount)) - .replace('{{cosmeticFilterCount}}', renderNumber(details.cosmeticFilterCount)) - ); + .replace( + '{{netFilterCount}}', + renderNumber(details.netFilterCount) + ) + .replace( + '{{cosmeticFilterCount}}', + renderNumber(details.cosmeticFilterCount) + ); + uDom.nodeFromId('parseCosmeticFilters').checked = + listDetails.parseCosmeticFilters === true; + uDom.nodeFromId('ignoreGenericCosmeticFilters').checked = + listDetails.ignoreGenericCosmeticFilters === true; // Compute a hash of the settings so that we can keep track of changes // affecting the loading of filter lists. - uDom('#parseCosmeticFilters').prop('checked', listDetails.parseCosmeticFilters === true); - uDom('#ignoreGenericCosmeticFilters').prop('checked', listDetails.ignoreGenericCosmeticFilters === true); if ( !soft ) { filteringSettingsHash = hashFromCurrentFromSettings(); } @@ -286,12 +316,18 @@ var renderFilterLists = function(soft) { /******************************************************************************/ var renderWidgets = function() { - uDom('#buttonApply').toggleClass('disabled', filteringSettingsHash === hashFromCurrentFromSettings()); + uDom('#buttonApply').toggleClass( + 'disabled', + filteringSettingsHash === hashFromCurrentFromSettings() + ); uDom('#buttonPurgeAll').toggleClass( 'disabled', document.querySelector('#lists .listEntry.cached:not(.obsolete)') === null ); - uDom('#buttonUpdate').toggleClass('disabled', document.querySelector('body:not(.updating) #lists .listEntry.obsolete > input[type="checkbox"]:checked') === null); + uDom('#buttonUpdate').toggleClass( + 'disabled', + document.querySelector('body:not(.updating) #lists .listEntry.obsolete > input[type="checkbox"]:checked') === null + ); }; /******************************************************************************/ @@ -323,8 +359,8 @@ var updateAssetStatus = function(details) { var hashFromCurrentFromSettings = function() { var hash = [ - document.getElementById('parseCosmeticFilters').checked, - document.getElementById('ignoreGenericCosmeticFilters').checked + uDom.nodeFromId('parseCosmeticFilters').checked, + uDom.nodeFromId('ignoreGenericCosmeticFilters').checked ]; var listHash = [], listEntries = document.querySelectorAll('#lists .listEntry[data-listkey]:not(.toRemove)'), @@ -338,7 +374,8 @@ var hashFromCurrentFromSettings = function() { } hash.push( listHash.sort().join(), - reValidExternalList.test(document.getElementById('externalLists').value), + uDom.nodeFromId('importLists').checked && + reValidExternalList.test(uDom.nodeFromId('externalLists').value), document.querySelector('#lists .listEntry.toRemove') !== null ); return hash.join(); @@ -424,6 +461,7 @@ var selectFilterLists = function(callback) { var externalListsElem = document.getElementById('externalLists'), toImport = externalListsElem.value.trim(); externalListsElem.value = ''; + uDom.nodeFromId('importLists').checked = false; messaging.send( 'dashboard', @@ -490,36 +528,89 @@ var autoUpdateCheckboxChanged = function() { /******************************************************************************/ -var toggleUnusedLists = function() { - document.body.classList.toggle('hideUnused'); - var hide = document.body.classList.contains('hideUnused'); - uDom('#lists li.listEntry > input[type="checkbox"]:not(:checked)') - .ancestors('li.listEntry[data-listkey]') - .css('display', hide ? 'none' : ''); - vAPI.localStorage.setItem('hideUnusedFilterLists', hide ? '1' : '0'); -}; +// Collapsing of unused lists. -/******************************************************************************/ +var mustHideUnusedLists = function(which) { + var hideAll = hideUnusedSet.has('*'); + if ( which === '*' ) { return hideAll; } + return hideUnusedSet.has(which) !== hideAll; +}; -var groupEntryClickHandler = function() { - var li = uDom(this).ancestors('.groupEntry'); - li.toggleClass('collapsed'); - var key = 'collapseGroup' + li.nthOfType(); - if ( li.hasClass('collapsed') ) { - vAPI.localStorage.setItem(key, 'y'); +var toggleHideUnusedLists = function(which) { + var groupSelector, + doesHideAll = hideUnusedSet.has('*'), + mustHide; + if ( which === '*' ) { + mustHide = doesHideAll === false; + groupSelector = ''; + hideUnusedSet.clear(); + if ( mustHide ) { + hideUnusedSet.add(which); + } + document.body.classList.toggle('hideUnused', mustHide); + uDom('.groupEntry[data-groupkey]').toggleClass('hideUnused', mustHide); } else { - vAPI.localStorage.removeItem(key); + var doesHide = hideUnusedSet.has(which); + if ( doesHide ) { + hideUnusedSet.delete(which); + } else { + hideUnusedSet.add(which); + } + mustHide = doesHide === doesHideAll; + groupSelector = '.groupEntry[data-groupkey="' + which + '"] '; + uDom(groupSelector).toggleClass('hideUnused', mustHide); } + uDom(groupSelector + '.listEntry > input[type="checkbox"]:not(:checked)') + .ancestors('.listEntry[data-listkey]') + .toggleClass('unused', mustHide); + vAPI.localStorage.setItem( + 'hideUnusedFilterLists', + JSON.stringify(Array.from(hideUnusedSet)) + ); }; +var revealHiddenUsedLists = function() { + uDom('#lists .listEntry.unused > input[type="checkbox"]:checked') + .ancestors('.listEntry[data-listkey]') + .removeClass('unused'); +}; + +uDom('#listsOfBlockedHostsPrompt').on('click', function() { + toggleHideUnusedLists('*'); +}); + +uDom('#lists').on('click', '.groupEntry[data-groupkey] > .geDetails', function(ev) { + toggleHideUnusedLists( + uDom(ev.target) + .ancestors('.groupEntry[data-groupkey]') + .attr('data-groupkey') + ); +}); + +(function() { + var aa; + try { + var json = vAPI.localStorage.getItem('hideUnusedFilterLists'); + if ( json !== null ) { + aa = JSON.parse(json); + } + } catch (ex) { + } + if ( Array.isArray(aa) === false ) { + aa = [ '*' ]; + } + hideUnusedSet = new Set(aa); +})(); + /******************************************************************************/ +// Cloud-related. + var toCloudData = function() { var bin = { parseCosmeticFilters: uDom.nodeFromId('parseCosmeticFilters').checked, ignoreGenericCosmeticFilters: uDom.nodeFromId('ignoreGenericCosmeticFilters').checked, - selectedLists: [], - externalLists: listDetails.externalLists + selectedLists: [] }; var liEntries = uDom('#lists .listEntry'), liEntry; @@ -537,7 +628,7 @@ var toCloudData = function() { var fromCloudData = function(data, append) { if ( typeof data !== 'object' || data === null ) { return; } - var elem, checked, i, n; + var elem, checked; elem = uDom.nodeFromId('parseCosmeticFilters'); checked = data.parseCosmeticFilters === true || append && elem.checked; @@ -549,19 +640,35 @@ var fromCloudData = function(data, append) { var selectedSet = new Set(data.selectedLists), listEntries = uDom('#lists .listEntry'), - listEntry, listKey, input; - for ( i = 0, n = listEntries.length; i < n; i++ ) { + listEntry, listKey; + for ( var i = 0, n = listEntries.length; i < n; i++ ) { listEntry = listEntries.at(i); listKey = listEntry.attr('data-listkey'); - input = listEntry.descendants('input').first(); + var hasListKey = selectedSet.has(listKey); + selectedSet.delete(listKey); + var input = listEntry.descendants('input').first(); if ( append && input.prop('checked') ) { continue; } - input.prop('checked', selectedSet.has(listKey) ); + input.prop('checked', hasListKey); } - elem = uDom.nodeFromId('externalLists'); - if ( !append ) { elem.value = ''; } - elem.value += data.externalLists || ''; + // If there are URL-like list keys left in the selected set, import them. + for ( listKey of selectedSet ) { + if ( reValidExternalList.test(listKey) === false ) { + selectedSet.delete(listKey); + } + } + if ( selectedSet.size !== 0 ) { + elem = uDom.nodeFromId('externalLists'); + if ( append ) { + if ( elem.value.trim() !== '' ) { elem.value += '\n'; } + } else { + elem.value = ''; + } + elem.value += Array.from(selectedSet).join('\n'); + uDom.nodeFromId('importLists').checked = true; + } + revealHiddenUsedLists(); renderWidgets(); }; @@ -570,24 +677,19 @@ self.cloud.onPull = fromCloudData; /******************************************************************************/ -document.body.classList.toggle( - 'hideUnused', - vAPI.localStorage.getItem('hideUnusedFilterLists') === '1' -); - uDom('#autoUpdate').on('change', autoUpdateCheckboxChanged); uDom('#parseCosmeticFilters').on('change', onFilteringSettingsChanged); uDom('#ignoreGenericCosmeticFilters').on('change', onFilteringSettingsChanged); uDom('#buttonApply').on('click', buttonApplyHandler); uDom('#buttonUpdate').on('click', buttonUpdateHandler); uDom('#buttonPurgeAll').on('click', buttonPurgeAllHandler); -uDom('#listsOfBlockedHostsPrompt').on('click', toggleUnusedLists); -uDom('#lists').on('click', '.groupEntry > span', groupEntryClickHandler); uDom('#lists').on('change', '.listEntry > input', onFilteringSettingsChanged); uDom('#lists').on('click', '.listEntry > a.remove', onRemoveExternalList); uDom('#lists').on('click', 'span.cache', onPurgeClicked); uDom('#externalLists').on('input', onFilteringSettingsChanged); +/******************************************************************************/ + renderFilterLists(); /******************************************************************************/ diff --git a/src/js/assets.js b/src/js/assets.js index 7c0ae6fd71f62..397ae5c5f6699 100644 --- a/src/js/assets.js +++ b/src/js/assets.js @@ -177,7 +177,24 @@ api.fetchFilterList = function(mainlistURL, onLoad, onError) { pendingSublistURLs = new Set([ mainlistURL ]), loadedSublistURLs = new Set(), toParsedURL = api.fetchFilterList.toParsedURL, - parsedMainURL = toParsedURL(mainlistURL); + parsedURL = toParsedURL(mainlistURL); + + var processIncludeDirectives = function(details) { + var reInclude = /^!#include +(\S+)/gm; + for (;;) { + var match = reInclude.exec(details.content); + if ( match === null ) { break; } + if ( toParsedURL(match[1]) !== undefined ) { continue; } + if ( match[1].indexOf('..') !== -1 ) { continue; } + var subURL = + parsedURL.origin + + parsedURL.pathname.replace(/[^/]+$/, match[1]); + if ( pendingSublistURLs.has(subURL) ) { continue; } + if ( loadedSublistURLs.has(subURL) ) { continue; } + pendingSublistURLs.add(subURL); + api.fetchText(subURL, onLocalLoadSuccess, onLocalLoadError); + } + }; var onLocalLoadSuccess = function(details) { if ( errored ) { return; } @@ -189,24 +206,8 @@ api.fetchFilterList = function(mainlistURL, onLoad, onError) { if ( isSublist ) { content.push('\n! ' + '>>>>>>>> ' + details.url); } content.push(details.content.trim()); if ( isSublist ) { content.push('! <<<<<<<< ' + details.url); } - if ( - parsedMainURL !== undefined && - parsedMainURL.pathname.length > 0 - ) { - var reInclude = /^!#include +(\S+)/gm; - for (;;) { - var match = reInclude.exec(details.content); - if ( match === null ) { break; } - if ( toParsedURL(match[1]) !== undefined ) { continue; } - if ( match[1].indexOf('..') !== -1 ) { continue; } - var subURL = - parsedMainURL.origin + - parsedMainURL.pathname.replace(/[^/]+$/, match[1]); - if ( pendingSublistURLs.has(subURL) ) { continue; } - if ( loadedSublistURLs.has(subURL) ) { continue; } - pendingSublistURLs.add(subURL); - api.fetchText(subURL, onLocalLoadSuccess, onLocalLoadError); - } + if ( parsedURL !== undefined && parsedURL.pathname.length > 0 ) { + processIncludeDirectives(details); } if ( pendingSublistURLs.size !== 0 ) { return; } @@ -908,16 +909,10 @@ var updateFirst = function() { // Allow self-hosted dev build to update: if update_url is present but // null, assume the extension is hosted on AMO. if ( noRemoteResources === undefined ) { - var manifest = - typeof browser === 'object' && - browser.runtime.getManifest(); noRemoteResources = - typeof vAPI.webextFlavor === 'string' && - vAPI.webextFlavor.startsWith('Mozilla-Firefox-') && - manifest instanceof Object && - manifest.applications instanceof Object && - manifest.applications.gecko instanceof Object && - manifest.applications.gecko.update_url === null; + vAPI.webextFlavor.soup.has('firefox') && + vAPI.webextFlavor.soup.has('webext') && + vAPI.webextFlavor.soup.has('devbuild') === false; } updaterStatus = 'updating'; updaterFetched.clear(); diff --git a/src/js/background.js b/src/js/background.js index 8ba758452788a..cd530ac69b3ea 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -24,6 +24,15 @@ 'use strict'; +/******************************************************************************/ + +// Not all platforms may have properly declared vAPI.webextFlavor. + +if ( vAPI.webextFlavor === undefined ) { + vAPI.webextFlavor = { major: 0, soup: new Set([ 'ublock' ]) }; +} + + /******************************************************************************/ var µBlock = (function() { // jshint ignore:line @@ -38,7 +47,7 @@ var µBlock = (function() { // jshint ignore:line ignoreRedirectFilters: false, ignoreScriptInjectFilters: false, streamScriptInjectFilters: false, - manualUpdateAssetFetchPeriod: 2000, + manualUpdateAssetFetchPeriod: 500, popupFontSize: 'unset', suspendTabsUntilReady: false, userResourcesLocation: 'unset' @@ -111,6 +120,7 @@ var µBlock = (function() { // jshint ignore:line 'moz-extension-scheme', 'opera-scheme', 'vivaldi-scheme', + 'wyciwyg-scheme', // Firefox's "What-You-Cache-Is-What-You-Get" '' ].join('\n'), @@ -123,8 +133,8 @@ var µBlock = (function() { // jshint ignore:line // read-only systemSettings: { - compiledMagic: 'puuijtkfpspv', - selfieMagic: 'tuqilngsxkwo' + compiledMagic: 1, + selfieMagic: 1 }, restoreBackupSettings: { @@ -168,11 +178,7 @@ var µBlock = (function() { // jshint ignore:line epickerZap: false, epickerEprom: null, - scriptlets: { - }, - - // so that I don't have to care for last comma - dummy: 0 + scriptlets: {}, }; })(); diff --git a/src/js/cloud-ui.js b/src/js/cloud-ui.js index d0a76bb7a6268..c5c404219002b 100644 --- a/src/js/cloud-ui.js +++ b/src/js/cloud-ui.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2015-2017 Raymond Hill + Copyright (C) 2015-2018 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 @@ -75,7 +75,7 @@ var onCloudDataReceived = function(entry) { }; var time = new Date(entry.tstamp); - widget.querySelector('span').textContent = + widget.querySelector('#cloudInfo').textContent = entry.source + '\n' + time.toLocaleString('fullwide', timeOptions); }; @@ -111,7 +111,7 @@ var pushData = function() { document.getElementById('cloudPush') .classList .toggle('error', failed); - document.querySelector('#cloudError > span') + document.querySelector('#cloudError') .textContent = failed ? error : ''; fetchCloudData(); } diff --git a/src/js/cosmetic-filtering.js b/src/js/cosmetic-filtering.js index 9fb2d762d1459..a5590b00d10bd 100644 --- a/src/js/cosmetic-filtering.js +++ b/src/js/cosmetic-filtering.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-2017 Raymond Hill + Copyright (C) 2014-2018 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 @@ -755,7 +755,7 @@ FilterContainer.prototype.compileHostnameSelector = function( var compiled = µb.staticExtFilteringEngine.compileSelector(parsed.suffix); if ( compiled === undefined ) { return; } - var domain = this.µburi.domainFromHostname(hostname), + var domain = this.µburi.domainFromHostnameNoCache(hostname), hash; // https://github.com/chrisaljoudi/uBlock/issues/188 diff --git a/src/js/dashboard-common.js b/src/js/dashboard-common.js index def07bd2c6860..8148c3f3f2e2e 100644 --- a/src/js/dashboard-common.js +++ b/src/js/dashboard-common.js @@ -19,7 +19,8 @@ Home: https://github.com/gorhill/uBlock */ -/* global uDom */ +/* global CodeMirror, uDom */ + 'use strict'; /******************************************************************************/ @@ -168,23 +169,40 @@ self.uBlockDashboard.patchCodeMirrorEditor = (function() { grabFocusAsync(cm); }; - var resizeTimer; - var resize = function() { + var resizeTimer, + resizeObserver; + var resize = function(cm) { resizeTimer = undefined; - let prect = document.body.getBoundingClientRect(); - let child = document.querySelector('.codeMirrorFillVertical'); - let crect = child.getBoundingClientRect(); - let height = Math.max(prect.bottom - crect.top, 80); - child.style.height = height + 'px'; + var child = document.querySelector('.codeMirrorFillVertical'); + if ( child === null ) { return; } + var prect = document.documentElement.getBoundingClientRect(); + var crect = child.getBoundingClientRect(); + var cssHeight = Math.floor(Math.max(prect.bottom - crect.top, 80)) + 'px'; + if ( child.style.height !== cssHeight ) { + child.style.height = cssHeight; + if ( cm instanceof CodeMirror ) { + cm.refresh(); + } + } + }; + var resizeAsync = function(cm, delay) { + if ( resizeTimer !== undefined ) { return; } + resizeTimer = vAPI.setTimeout( + resize.bind(null, cm), + typeof delay === 'number' ? delay : 66 + ); }; return function(cm) { if ( document.querySelector('.codeMirrorFillVertical') !== null ) { - resize(); - window.addEventListener('resize', function() { - if ( resizeTimer !== undefined ) { return; } - resizeTimer = vAPI.setTimeout(resize, 66); + var boundResizeAsync = resizeAsync.bind(null, cm); + window.addEventListener('resize', boundResizeAsync); + resizeObserver = new MutationObserver(boundResizeAsync); + resizeObserver.observe(document.querySelector('.body'), { + childList: true, + subtree: true }); + resizeAsync(cm, 1); } if ( cm.options.inputStyle === 'contenteditable' ) { cm.on('beforeSelectionChange', patchSelectAll); diff --git a/src/js/popup.js b/src/js/popup.js index f8fb606da0b7d..f0b433f05e46a 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -61,12 +61,11 @@ if ( // The padlock/eraser must be manually positioned: // - Its vertical position depends on the height of the popup title bar // - Its horizontal position depends on whether there is a vertical scrollbar. -document.getElementById('rulesetTools').style.setProperty( - 'top', - (document.getElementById('appinfo').getBoundingClientRect().bottom + 3) + 'px' -); - var positionRulesetTools = function() { + document.getElementById('rulesetTools').style.setProperty( + 'top', + (document.getElementById('appinfo').getBoundingClientRect().bottom + 3) + 'px' + ); document.getElementById('rulesetTools').style.setProperty( 'left', (document.getElementById('firewallContainer').getBoundingClientRect().left + 3) + 'px' @@ -314,12 +313,11 @@ var updateAllFirewallCells = function() { ); } - positionRulesetTools(); - - uDom.nodeFromId('firewallContainer').classList.toggle( - 'dirty', - popupData.matrixIsDirty === true - ); + var dirty = popupData.matrixIsDirty === true; + if ( dirty ) { + positionRulesetTools(); + } + uDom.nodeFromId('firewallContainer').classList.toggle('dirty', dirty); }; /******************************************************************************/ diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index 3ace313ff4853..0cd200f5ba662 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -65,6 +65,10 @@ content = patchScriptlet(content, args); if ( !content ) { return; } } + content = + 'try {\n' + + content + '\n' + + '} catch ( e ) { }'; scriptletCache.add(raw, content); } toInject.set(raw, content); diff --git a/src/js/scriptlets/subscriber.js b/src/js/scriptlets/subscriber.js index 99e397f14d03a..3212b88271565 100644 --- a/src/js/scriptlets/subscriber.js +++ b/src/js/scriptlets/subscriber.js @@ -72,7 +72,7 @@ var onMaybeAbpLinkClicked = function(ev) { if ( href === '' ) { return; } - var matches = /^abp:\/*subscribe\/*\?location=([^&]+).*title=([^&]+)/.exec(href); + var matches = /^(?:abp|ubo):\/*subscribe\/*\?location=([^&]+).*title=([^&]+)/.exec(href); if ( matches === null ) { matches = /^https?:\/\/.*?[&?]location=([^&]+).*?&title=([^&]+)/.exec(href); if ( matches === null ) { return; } @@ -118,7 +118,7 @@ var onMaybeAbpLinkClicked = function(ev) { setTimeout(function() { if ( document.querySelector('link[rel="canonical"][href="https://filterlists.com/"]') !== null || - document.querySelector('a[href^="abp:"],a[href^="https://subscribe.adblockplus.org/?"]') !== null + document.querySelector('a[href^="abp:"],a[href^="ubo:"],a[href^="https://subscribe.adblockplus.org/?"]') !== null ) { document.addEventListener('click', onMaybeAbpLinkClicked); } diff --git a/src/js/start.js b/src/js/start.js index ebecd1573b8e9..19ec3d354909a 100644 --- a/src/js/start.js +++ b/src/js/start.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* global publicSuffixList */ - 'use strict'; /******************************************************************************/ @@ -95,7 +93,12 @@ var onAllReady = function() { // - PSL var onPSLReady = function() { - µb.loadFilterLists(onAllReady); + µb.selfieManager.load(function(valid) { + if ( valid === true ) { + return onAllReady(); + } + µb.loadFilterLists(onAllReady); + }); }; /******************************************************************************/ @@ -109,7 +112,7 @@ var onVersionReady = function(lastVersion) { // new version is detected, as resources.txt may have changed since last // release. This will be done only for release versions of Firefox. if ( - /^Mozilla-Firefox-/.test(vAPI.webextFlavor) && + vAPI.webextFlavor.soup.has('firefox') && /(b|rc)\d+$/.test(vAPI.app.version) === false ) { µb.redirectEngine.invalidateResourcesSelfie(); @@ -161,31 +164,6 @@ var onVersionReady = function(lastVersion) { /******************************************************************************/ -var onSelfieReady = function(selfie) { - if ( - selfie instanceof Object === false || - selfie.magic !== µb.systemSettings.selfieMagic - ) { - return false; - } - if ( publicSuffixList.fromSelfie(selfie.publicSuffixList) !== true ) { - return false; - } - if ( selfie.redirectEngine === undefined ) { - return false; - } - - µb.availableFilterLists = selfie.availableFilterLists; - µb.staticNetFilteringEngine.fromSelfie(selfie.staticNetFilteringEngine); - µb.redirectEngine.fromSelfie(selfie.redirectEngine); - µb.staticExtFilteringEngine.fromSelfie(selfie.staticExtFilteringEngine); - µb.loadRedirectResources(); - - return true; -}; - -/******************************************************************************/ - // https://github.com/chrisaljoudi/uBlock/issues/226 // Whitelist in memory. // Whitelist parser needs PSL to be ready. @@ -243,7 +221,7 @@ var onSystemSettingsReady = function(fetched) { if ( mustSaveSystemSettings ) { fetched.selfie = null; µb.selfieManager.destroy(); - vAPI.storage.set(µb.systemSettings, µb.noopFunc); + vAPI.storage.set(µb.systemSettings); } }; @@ -261,13 +239,8 @@ var onFirstFetchReady = function(fetched) { onNetWhitelistReady(fetched.netWhitelist); onVersionReady(fetched.version); - // If we have a selfie, skip loading PSL, filter lists - vAPI.cacheStorage.get('selfie', function(bin) { - if ( bin instanceof Object && onSelfieReady(bin.selfie) ) { - return onAllReady(); - } - µb.loadPublicSuffixList(onPSLReady); - }); + µb.loadPublicSuffixList(onPSLReady); + µb.loadRedirectResources(); }; /******************************************************************************/ diff --git a/src/js/static-ext-filtering.js b/src/js/static-ext-filtering.js index c4da31bd7550d..59fc173ed1e25 100644 --- a/src/js/static-ext-filtering.js +++ b/src/js/static-ext-filtering.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2017 Raymond Hill + Copyright (C) 2017-2018 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 @@ -94,7 +94,11 @@ } catch (ex) { matchesFn = div.querySelector.bind(div); } + // Quick regex-based validation -- most cosmetic filters are of the + // simple form and in such case a regex is much faster. + var reSimple = /^[#.][\w-]+$/; return function(s) { + if ( reSimple.test(s) ) { return true; } try { matchesFn(s + ', ' + s + ':not(#foo)'); } catch (ex) { diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 1617289505b0b..46d37db33a435 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -1605,7 +1605,10 @@ FilterParser.prototype.translate = function() { this.dataStr = "connect-src https: http:"; // https://bugs.chromium.org/p/chromium/issues/detail?id=669086 // TODO: remove when most users are beyond Chromium v56 - if ( vAPI.chromiumVersion < 57 ) { + if ( + vAPI.webextFlavor.soup.has('chromium') && + vAPI.webextFlavor.major < 57 + ) { this.dataStr += '; frame-src *'; } return; diff --git a/src/js/storage.js b/src/js/storage.js index 0d51be9aadc7a..098fced6269a5 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -104,6 +104,15 @@ µb.hiddenSettings[key] = hs[key]; } } + // To remove once 1.15.26 is widespread. The reason is to ensure + // the change in the following commit is taken into account: + // https://github.com/gorhill/uBlock/commit/8071321e9104 + if ( hs.manualUpdateAssetFetchPeriod === 2000 ) { + µb.hiddenSettings.manualUpdateAssetFetchPeriod = + µb.hiddenSettingsDefault.manualUpdateAssetFetchPeriod; + hs.manualUpdateAssetFetchPeriod = undefined; + µb.saveHiddenSettings(); + } } if ( vAPI.localStorage.getItem('immediateHiddenSettings') === null ) { µb.saveImmediateHiddenSettings(); @@ -116,8 +125,21 @@ ); }; +// Note: Save only the settings which values differ from the default ones. +// This way the new default values in the future will properly apply for those +// which were not modified by the user. + µBlock.saveHiddenSettings = function(callback) { - vAPI.storage.set({ hiddenSettings: this.hiddenSettings, callback }); + var bin = { hiddenSettings: {} }; + for ( var prop in this.hiddenSettings ) { + if ( + this.hiddenSettings.hasOwnProperty(prop) && + this.hiddenSettings[prop] !== this.hiddenSettingsDefault[prop] + ) { + bin.hiddenSettings[prop] = this.hiddenSettings[prop]; + } + } + vAPI.storage.set(bin, callback); this.saveImmediateHiddenSettings(); }; @@ -450,7 +472,7 @@ // User filter list. newAvailableLists[this.userFiltersPath] = { - group: 'default', + group: 'user', title: vAPI.i18n('1pPageName') }; @@ -733,7 +755,7 @@ // https://github.com/gorhill/uBlock/issues/313 // Always try to fetch the name if this is an external filter list. if ( listEntry.title === '' || listEntry.group === 'custom' ) { - matches = head.match(/(?:^|\n)!\s*Title:([^\n]+)/i); + matches = head.match(/(?:^|\n)(?:!|# )[\t ]*Title:([^\n]+)/i); if ( matches !== null ) { // https://bugs.chromium.org/p/v8/issues/detail?id=2869 // JSON.stringify/JSON.parse is to work around String.slice() @@ -743,7 +765,7 @@ } } // Extract update frequency information - matches = head.match(/(?:^|\n)![\t ]*Expires:[\t ]*([\d]+)[\t ]*days?/i); + matches = head.match(/(?:^|\n)(?:!|# )[\t ]*Expires:[\t ]*(\d+)[\t ]*day/i); if ( matches !== null ) { v = Math.max(parseInt(matches[1], 10), 1); if ( v !== listEntry.updateAfter ) { @@ -775,18 +797,16 @@ staticExtFilteringEngine = this.staticExtFilteringEngine, reIsWhitespaceChar = /\s/, reMaybeLocalIp = /^[\d:f]/, - reIsLocalhostRedirect = /\s+(?:broadcasthost|local|localhost|localhost\.localdomain)\b/, + reIsLocalhostRedirect = /\s+(?:0\.0\.0\.0|broadcasthost|ip6-all(?:nodes|routers)|local|localhost|localhost\.localdomain)\b/, reLocalIp = /^(?:0\.0\.0\.0|127\.0\.0\.1|::1|fe80::1%lo0)/, line, c, pos, - lineIter = new this.LineIterator(rawText); + lineIter = new this.LineIterator(this.processDirectives(rawText)); while ( lineIter.eot() === false ) { - line = lineIter.next().trim(); - // rhill 2014-04-18: The trim is important here, as without it there // could be a lingering `\r` which would cause problems in the // following parsing code. - + line = lineIter.next().trim(); if ( line.length === 0 ) { continue; } // Strip comments @@ -851,6 +871,59 @@ /******************************************************************************/ +// https://github.com/AdguardTeam/AdguardBrowserExtension/issues/917 + +µBlock.processDirectives = function(content) { + var reIf = /^!#(if|endif)\b([^\n]*)/gm, + parts = [], + beg = 0, depth = 0, discard = false; + while ( beg < content.length ) { + var match = reIf.exec(content); + if ( match === null ) { break; } + if ( match[1] === 'if' ) { + var expr = match[2].trim(); + var target = expr.startsWith('!'); + if ( target ) { expr = expr.slice(1); } + var token = this.processDirectives.tokens.get(expr); + if ( + depth === 0 && + discard === false && + token !== undefined && + vAPI.webextFlavor.soup.has(token) === target + ) { + parts.push(content.slice(beg, match.index)); + discard = true; + } + depth += 1; + continue; + } + depth -= 1; + if ( depth < 0 ) { break; } + if ( depth === 0 && discard ) { + beg = match.index + match[0].length + 1; + discard = false; + } + } + if ( depth === 0 && parts.length !== 0 ) { + parts.push(content.slice(beg)); + content = parts.join('\n'); + } + return content.trim(); +}; + +µBlock.processDirectives.tokens = new Map([ + [ 'ext_ublock', 'ublock' ], + [ 'env_chromium', 'chromium' ], + [ 'env_edge', 'edge' ], + [ 'env_firefox', 'firefox' ], + [ 'env_mobile', 'mobile' ], + [ 'env_safari', 'safari' ], + [ 'cap_html_filtering', 'html_filtering' ], + [ 'cap_user_stylesheet', 'user_stylesheet' ] +]); + +/******************************************************************************/ + µBlock.loadRedirectResources = function(updatedContent) { var µb = this, content = ''; @@ -907,11 +980,18 @@ }; var onCompiledListLoaded = function(details) { - if ( details.content === '' ) { + var selfie; + try { + selfie = JSON.parse(details.content); + } catch (ex) { + } + if ( + selfie === undefined || + publicSuffixList.fromSelfie(selfie) === false + ) { µb.assets.get(assetKey, onRawListLoaded); return; } - publicSuffixList.fromSelfie(JSON.parse(details.content)); callback(); }; @@ -941,7 +1021,6 @@ timer = null; var selfie = { magic: this.systemSettings.selfieMagic, - publicSuffixList: publicSuffixList.toSelfie(), availableFilterLists: this.availableFilterLists, staticNetFilteringEngine: this.staticNetFilteringEngine.toSelfie(), redirectEngine: this.redirectEngine.toSelfie(), @@ -950,6 +1029,25 @@ vAPI.cacheStorage.set({ selfie: selfie }); }.bind(µBlock); + var load = function(callback) { + vAPI.cacheStorage.get('selfie', function(bin) { + var µb = µBlock; + if ( + bin instanceof Object === false || + bin.selfie instanceof Object === false || + bin.selfie.magic !== µb.systemSettings.selfieMagic || + bin.selfie.redirectEngine === undefined + ) { + return callback(false); + } + µb.availableFilterLists = bin.selfie.availableFilterLists; + µb.staticNetFilteringEngine.fromSelfie(bin.selfie.staticNetFilteringEngine); + µb.redirectEngine.fromSelfie(bin.selfie.redirectEngine); + µb.staticExtFilteringEngine.fromSelfie(bin.selfie.staticExtFilteringEngine); + callback(true); + }); + }; + var destroy = function() { if ( timer !== null ) { clearTimeout(timer); @@ -960,6 +1058,7 @@ }.bind(µBlock); return { + load: load, destroy: destroy }; })(); diff --git a/src/js/traffic.js b/src/js/traffic.js index 56369c89455b4..4d148a233d416 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -911,7 +911,7 @@ var filterDocument = (function() { selectors: undefined, scriptlets: undefined, buffer: null, - mime: undefined, + mime: 'text/html', charset: undefined }; @@ -1126,20 +1126,18 @@ var injectCSP = function(pageStore, details) { // https://github.com/gorhill/uMatrix/issues/967#issuecomment-373002011 // This can be removed once Firefox 60 ESR is released. -var cantMergeCSPHeaders = (function() { - if ( - self.browser instanceof Object && - typeof self.browser.runtime.getBrowserInfo === 'function' - ) { - self.browser.runtime.getBrowserInfo().then(function(info) { - cantMergeCSPHeaders = - info.vendor === 'Mozilla' && - info.name === 'Firefox' && - parseInt(info.version, 10) < 59; - }); - } - return false; -})(); +var evalCantMergeCSPHeaders = function() { + return vAPI.webextFlavor.soup.has('firefox') && + vAPI.webextFlavor.major < 59; +}; + +var cantMergeCSPHeaders = evalCantMergeCSPHeaders(); + +// The real actual webextFlavor value may not be set in stone, so listen +// for possible future changes. +window.addEventListener('webextFlavor', function() { + cantMergeCSPHeaders = evalCantMergeCSPHeaders(); +}, { once: true }); /******************************************************************************/ diff --git a/src/js/udom.js b/src/js/udom.js index a53a4afe78512..dc85e6b21b261 100644 --- a/src/js/udom.js +++ b/src/js/udom.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-2016 Raymond Hill + Copyright (C) 2014-2018 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 @@ -144,34 +144,6 @@ var nodeInNodeList = function(node, nodeList) { /******************************************************************************/ -var doesMatchSelector = function(node, selector) { - if ( !node ) { - return false; - } - if ( node.nodeType !== 1 ) { - return false; - } - if ( selector === undefined ) { - return true; - } - var parentNode = node.parentNode; - if ( !parentNode || !parentNode.setAttribute ) { - return false; - } - var doesMatch = false; - parentNode.setAttribute('uDom-32kXc6xEZA7o73AMB8vLbLct1RZOkeoO', ''); - var grandpaNode = parentNode.parentNode || document; - var nl = grandpaNode.querySelectorAll('[uDom-32kXc6xEZA7o73AMB8vLbLct1RZOkeoO] > ' + selector); - var i = nl.length; - while ( doesMatch === false && i-- ) { - doesMatch = nl[i] === node; - } - parentNode.removeAttribute('uDom-32kXc6xEZA7o73AMB8vLbLct1RZOkeoO'); - return doesMatch; -}; - -/******************************************************************************/ - DOMList.prototype.nodeAt = function(i) { return this.nodes[i] || null; }; @@ -230,12 +202,8 @@ DOMList.prototype.next = function(selector) { node = this.nodes[i]; while ( node.nextSibling !== null ) { node = node.nextSibling; - if ( node.nodeType !== 1 ) { - continue; - } - if ( doesMatchSelector(node, selector) === false ) { - continue; - } + if ( node.nodeType !== 1 ) { continue; } + if ( node.matches(selector) === false ) { continue; } addNodeToList(r, node); break; } @@ -260,7 +228,7 @@ DOMList.prototype.filter = function(filter) { var filterFunc; if ( typeof filter === 'string' ) { filterFunc = function() { - return doesMatchSelector(this, filter); + return this.matches(filter); }; } else if ( typeof filter === 'function' ) { filterFunc = filter; @@ -286,12 +254,13 @@ DOMList.prototype.filter = function(filter) { DOMList.prototype.ancestors = function(selector) { var r = new DOMList(); - var n = this.nodes.length; - var node; - for ( var i = 0; i < n; i++ ) { - node = this.nodes[i].parentNode; + for ( var i = 0, n = this.nodes.length; i < n; i++ ) { + var node = this.nodes[i].parentNode; while ( node ) { - if ( doesMatchSelector(node, selector) ) { + if ( + node instanceof Element && + node.matches(selector) + ) { addNodeToList(r, node); } node = node.parentNode; diff --git a/src/js/uritools.js b/src/js/uritools.js index a988af4e0053d..4e118bd477291 100644 --- a/src/js/uritools.js +++ b/src/js/uritools.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-2017 Raymond Hill + Copyright (C) 2014-2018 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 @@ -299,6 +299,10 @@ URI.domainFromHostname = function(hostname) { return domainCacheAdd(hostname, hostname); }; +URI.domainFromHostnameNoCache = function(hostname) { + return reIPAddressNaive.test(hostname) ? hostname : psl.getDomain(hostname); +}; + URI.domain = function() { return this.domainFromHostname(this.hostname); }; @@ -328,11 +332,11 @@ URI.pathFromURI = function(uri) { // specific set of hostnames within a narrow time span -- in other words, I // believe probability of cache hit are high in uBlock. -var domainCache = Object.create(null); -var domainCacheCount = 0; -var domainCacheCountLowWaterMark = 35; -var domainCacheCountHighWaterMark = 50; -var domainCacheEntryJunkyardMax = domainCacheCountHighWaterMark - domainCacheCountLowWaterMark; +var domainCache = new Map(); +var domainCacheCountLowWaterMark = 40; +var domainCacheCountHighWaterMark = 60; +var domainCacheEntryJunkyardMax = + domainCacheCountHighWaterMark - domainCacheCountLowWaterMark; var DomainCacheEntry = function(domain) { this.init(domain); @@ -352,23 +356,20 @@ DomainCacheEntry.prototype.dispose = function() { }; var domainCacheEntryFactory = function(domain) { - var entry = domainCacheEntryJunkyard.pop(); - if ( entry ) { - return entry.init(domain); - } - return new DomainCacheEntry(domain); + return domainCacheEntryJunkyard.length !== 0 ? + domainCacheEntryJunkyard.pop().init(domain) : + new DomainCacheEntry(domain); }; var domainCacheEntryJunkyard = []; var domainCacheAdd = function(hostname, domain) { - var entry = domainCache[hostname]; + var entry = domainCache.get(hostname); if ( entry !== undefined ) { entry.tstamp = Date.now(); } else { - domainCache[hostname] = domainCacheEntryFactory(domain); - domainCacheCount += 1; - if ( domainCacheCount === domainCacheCountHighWaterMark ) { + domainCache.set(hostname, domainCacheEntryFactory(domain)); + if ( domainCache.size === domainCacheCountHighWaterMark ) { domainCachePrune(); } } @@ -376,29 +377,24 @@ var domainCacheAdd = function(hostname, domain) { }; var domainCacheEntrySort = function(a, b) { - return domainCache[b].tstamp - domainCache[a].tstamp; + return domainCache.get(b).tstamp - domainCache.get(a).tstamp; }; var domainCachePrune = function() { - var hostnames = Object.keys(domainCache) - .sort(domainCacheEntrySort) - .slice(domainCacheCountLowWaterMark); + var hostnames = Array.from(domainCache.keys()) + .sort(domainCacheEntrySort) + .slice(domainCacheCountLowWaterMark); var i = hostnames.length; - domainCacheCount -= i; - var hostname; while ( i-- ) { - hostname = hostnames[i]; - domainCache[hostname].dispose(); - delete domainCache[hostname]; + var hostname = hostnames[i]; + domainCache.get(hostname).dispose(); + domainCache.delete(hostname); } }; -var domainCacheReset = function() { - domainCache = Object.create(null); - domainCacheCount = 0; -}; - -psl.onChanged.addListener(domainCacheReset); +window.addEventListener('publicSuffixList', function() { + domainCache.clear(); +}); /******************************************************************************/ diff --git a/src/lib/publicsuffixlist.js b/src/lib/publicsuffixlist.js index 89749867ce964..1a04d78b94ec2 100644 --- a/src/lib/publicsuffixlist.js +++ b/src/lib/publicsuffixlist.js @@ -2,7 +2,7 @@ publicsuffixlist.js - an efficient javascript implementation to deal with Mozilla Foundation's Public Suffix List - Copyright (C) 2013 Raymond Hill + Copyright (C) 2013-2018 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 @@ -37,9 +37,8 @@ /******************************************************************************/ -var exceptions = {}; -var rules = {}; -var selfieMagic = 'iscjsfsaolnm'; +var exceptions = new Map(); +var rules = new Map(); // This value dictate how the search will be performed: // < this.cutoffLength = indexOf() @@ -47,8 +46,6 @@ var selfieMagic = 'iscjsfsaolnm'; var cutoffLength = 256; var mustPunycode = /[^a-z0-9.-]/; -var onChangedListeners = []; - /******************************************************************************/ // In the context of this code, a domain is defined as: @@ -127,20 +124,17 @@ function search(store, hostname) { tld = hostname.slice(pos + 1); remainder = hostname.slice(0, pos); } - var substore = store[tld]; - if ( !substore ) { - return false; - } + var substore = store.get(tld); + if ( substore === undefined ) { return false; } // If substore is a string, use indexOf() if ( typeof substore === 'string' ) { return substore.indexOf(' ' + remainder + ' ') >= 0; } // It is an array: use binary search. var l = remainder.length; + if ( l >= substore.length ) { return false; } var haystack = substore[l]; - if ( !haystack ) { - return false; - } + if ( haystack.length === 0 ) { return false; } var left = 0; var right = Math.floor(haystack.length / l + 0.5); var i, needle; @@ -168,8 +162,8 @@ function search(store, hostname) { // Suggestion: use it's quite good. function parse(text, toAscii) { - exceptions = {}; - rules = {}; + exceptions = new Map(); + rules = new Map(); // http://publicsuffix.org/list/: // "... all rules must be canonicalized in the normal way @@ -229,16 +223,18 @@ function parse(text, toAscii) { } // Store suffix using tld as key - if ( !store.hasOwnProperty(tld) ) { - store[tld] = []; + var substore = store.get(tld); + if ( substore === undefined ) { + store.set(tld, (substore = [])); } if ( line ) { - store[tld].push(line); + substore.push(line); } } crystallize(exceptions); crystallize(rules); - callListeners(onChangedListeners); + + window.dispatchEvent(new CustomEvent('publicSuffixList')); } /******************************************************************************/ @@ -247,107 +243,69 @@ function parse(text, toAscii) { // for future look up. function crystallize(store) { - var suffixes, suffix, i, l; - - for ( var tld in store ) { - if ( !store.hasOwnProperty(tld) ) { - continue; - } - suffixes = store[tld].join(' '); + for ( var entry of store ) { + var tld = entry[0]; + var suffixes = entry[1]; // No suffix - if ( !suffixes ) { - store[tld] = ''; + if ( suffixes.length === 0 ) { + store.set(tld, ''); continue; } // Concatenated list of suffixes less than cutoff length: // Store as string, lookup using indexOf() - if ( suffixes.length < cutoffLength ) { - store[tld] = ' ' + suffixes + ' '; + var s = suffixes.join(' '); + if ( s.length < cutoffLength ) { + store.set(tld, ' ' + s + ' '); continue; } // Concatenated list of suffixes greater or equal to cutoff length // Store as array keyed on suffix length, lookup using binary search. // I borrowed the idea to key on string length here: // http://ejohn.org/blog/dictionary-lookups-in-javascript/#comment-392072 - - i = store[tld].length; - suffixes = []; + var i = suffixes.length, l; + var aa = []; while ( i-- ) { - suffix = store[tld][i]; + var suffix = suffixes[i]; + var j = aa.length; l = suffix.length; - if ( !suffixes[l] ) { - suffixes[l] = []; + while ( j <= l ) { + aa[j] = []; j += 1; } - suffixes[l].push(suffix); + aa[l].push(suffix); } - l = suffixes.length; + l = aa.length; while ( l-- ) { - if ( suffixes[l] ) { - suffixes[l] = suffixes[l].sort().join(''); - } + aa[l] = aa[l].sort().join(''); } - store[tld] = suffixes; + store.set(tld, aa); } return store; } /******************************************************************************/ +var selfieMagic = 1; + function toSelfie() { return { magic: selfieMagic, - rules: rules, - exceptions: exceptions + rules: Array.from(rules), + exceptions: Array.from(exceptions) }; } function fromSelfie(selfie) { - if ( typeof selfie !== 'object' || typeof selfie.magic !== 'string' || selfie.magic !== selfieMagic ) { + if ( typeof selfie !== 'object' || selfie.magic !== selfieMagic ) { return false; } - rules = selfie.rules; - exceptions = selfie.exceptions; - callListeners(onChangedListeners); + rules = new Map(selfie.rules); + exceptions = new Map(selfie.exceptions); + window.dispatchEvent(new CustomEvent('publicSuffixList')); return true; } /******************************************************************************/ -var addListener = function(listeners, callback) { - if ( typeof callback !== 'function' ) { - return; - } - if ( listeners.indexOf(callback) === -1 ) { - listeners.push(callback); - } -}; - -var removeListener = function(listeners, callback) { - var pos = listeners.indexOf(callback); - if ( pos !== -1 ) { - listeners.splice(pos, 1); - } -}; - -var callListeners = function(listeners) { - for ( var i = 0; i < listeners.length; i++ ) { - listeners[i](); - } -}; - -/******************************************************************************/ - -var onChanged = { - addListener: function(callback) { - addListener(onChangedListeners, callback); - }, - removeListener: function(callback) { - removeListener(onChangedListeners, callback); - } -}; - -/******************************************************************************/ - // Public API root = root || window; @@ -359,7 +317,6 @@ root.publicSuffixList = { 'getPublicSuffix': getPublicSuffix, 'toSelfie': toSelfie, 'fromSelfie': fromSelfie, - 'onChanged': onChanged }; /******************************************************************************/ diff --git a/tools/make-chromium.sh b/tools/make-chromium.sh index 2f3f06cab72af..dbec5535f2b72 100755 --- a/tools/make-chromium.sh +++ b/tools/make-chromium.sh @@ -24,11 +24,14 @@ cp platform/chromium/*.json $DES/ cp LICENSE.txt $DES/ echo "*** uBlock0.chromium: concatenating content scripts" -cat $DES/js/vapi-usercss.js > /tmp/contentscript.js +cat $DES/js/vapi-usercss.pseudo.js > /tmp/contentscript.js +echo >> /tmp/contentscript.js +grep -v "^'use strict';$" $DES/js/vapi-usercss.real.js >> /tmp/contentscript.js echo >> /tmp/contentscript.js grep -v "^'use strict';$" $DES/js/contentscript.js >> /tmp/contentscript.js mv /tmp/contentscript.js $DES/js/contentscript.js -rm $DES/js/vapi-usercss.js +rm $DES/js/vapi-usercss.pseudo.js +rm $DES/js/vapi-usercss.real.js # Chrome store-specific cp -R $DES/_locales/nb $DES/_locales/no diff --git a/tools/make-firefox.sh b/tools/make-firefox.sh index f1b5f5ba625d5..e0b68872bc89c 100755 --- a/tools/make-firefox.sh +++ b/tools/make-firefox.sh @@ -21,7 +21,7 @@ mv $DES/img/icon_128.png $DES/icon.png cp platform/firefox/css/* $DES/css/ cp platform/firefox/polyfill.js $DES/js/ cp platform/firefox/vapi-*.js $DES/js/ -cp platform/webext/vapi-usercss.js $DES/js/ +cp platform/chromium/vapi-usercss.real.js $DES/js/ cp platform/firefox/bootstrap.js $DES/ cp platform/firefox/processScript.js $DES/ cp platform/firefox/frame*.js $DES/ @@ -32,11 +32,11 @@ cp platform/firefox/*.xul $DES/ cp LICENSE.txt $DES/ echo "*** uBlock0.firefox: concatenating content scripts" -cat $DES/js/vapi-usercss.js > /tmp/contentscript.js +cat $DES/js/vapi-usercss.real.js > /tmp/contentscript.js echo >> /tmp/contentscript.js grep -v "^'use strict';$" $DES/js/contentscript.js >> /tmp/contentscript.js mv /tmp/contentscript.js $DES/js/contentscript.js -rm $DES/js/vapi-usercss.js +rm $DES/js/vapi-usercss.real.js echo "*** uBlock0.firefox: Generating meta..." python tools/make-firefox-meta.py $DES/ diff --git a/tools/make-noassets.sh b/tools/make-noassets.sh deleted file mode 100755 index ee93688dc42b8..0000000000000 --- a/tools/make-noassets.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# This script assumes a linux environment - -echo "*** uBlock: Creating web store package" -echo "*** uBlock: Copying files" -cp -R css dist/ublock/ -cp -R img dist/ublock/ -cp -R js dist/ublock/ -cp -R lib dist/ublock/ -cp -R _locales dist/ublock/ -cp *.html dist/ublock/ -cp *.txt dist/ublock/ -cp manifest.json dist/ublock/ -echo "*** uBlock: Package done." diff --git a/tools/make-opera-meta.py b/tools/make-opera-meta.py index 15df315fba517..4fb2cb960aa2a 100644 --- a/tools/make-opera-meta.py +++ b/tools/make-opera-meta.py @@ -10,20 +10,17 @@ proj_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], '..') build_dir = os.path.abspath(sys.argv[1]) -# Import version number from chromium platform -chromium_manifest = {} -webext_manifest = {} +version = '' +with open(os.path.join(proj_dir, 'dist', 'version')) as f: + version = f.read().strip() -chromium_manifest_file = os.path.join(proj_dir, 'platform', 'chromium', 'manifest.json') -with open(chromium_manifest_file) as f1: - chromium_manifest = json.load(f1) +manifest_out = {} +manifest_out_file = os.path.join(build_dir, 'manifest.json') +with open(manifest_out_file) as f: + manifest_out = json.load(f) -webext_manifest_file = os.path.join(build_dir, 'manifest.json') -with open(webext_manifest_file) as f2: - webext_manifest = json.load(f2) +manifest_out['version'] = version -webext_manifest['version'] = chromium_manifest['version'] - -with open(webext_manifest_file, 'w') as f2: - json.dump(webext_manifest, f2, indent=2, separators=(',', ': '), sort_keys=True) +with open(manifest_out_file, 'w') as f2: + json.dump(manifest_out, f2, indent=2, separators=(',', ': '), sort_keys=True) f2.write('\n') diff --git a/tools/make-opera.sh b/tools/make-opera.sh index 7e00d3287511e..a04bd0a98733a 100755 --- a/tools/make-opera.sh +++ b/tools/make-opera.sh @@ -39,6 +39,10 @@ rm -r $DES/_locales/kk rm -r $DES/_locales/mr rm -r $DES/_locales/ta +echo "*** uBlock0.opera: Generating web accessible resources..." +cp -R src/web_accessible_resources $DES/ +python3 tools/import-war.py $DES/ + echo "*** uBlock0.opera: Generating meta..." python tools/make-opera-meta.py $DES/ diff --git a/tools/make-webext.sh b/tools/make-webext.sh index 37a23b3a9a506..e7207b20d3a7a 100755 --- a/tools/make-webext.sh +++ b/tools/make-webext.sh @@ -28,14 +28,14 @@ cp platform/webext/manifest.json $DES/ cp platform/webext/polyfill.js $DES/js/ cp platform/webext/vapi-webrequest.js $DES/js/ cp platform/webext/vapi-cachestorage.js $DES/js/ -cp platform/webext/vapi-usercss.js $DES/js/ echo "*** uBlock0.webext: concatenating content scripts" -cat $DES/js/vapi-usercss.js > /tmp/contentscript.js +cat $DES/js/vapi-usercss.real.js > /tmp/contentscript.js echo >> /tmp/contentscript.js grep -v "^'use strict';$" $DES/js/contentscript.js >> /tmp/contentscript.js mv /tmp/contentscript.js $DES/js/contentscript.js -rm $DES/js/vapi-usercss.js +rm $DES/js/vapi-usercss.pseudo.js +rm $DES/js/vapi-usercss.real.js # Webext-specific rm $DES/img/icon_128.png diff --git a/tools/update-checksums.sh b/tools/update-checksums.sh deleted file mode 100755 index 950bc93ccf7b4..0000000000000 --- a/tools/update-checksums.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# -# This script assumes a linux environment - -echo "*** uBlock: generating checksums.txt file..." - -truncate -s 0 assets/checksums.txt - -echo `md5sum assets/ublock/filter-lists.json` >> assets/checksums.txt - -filters=( - '../uAssets/filters/badware.txt' - '../uAssets/filters/experimental.txt' - '../uAssets/filters/filters.txt' - '../uAssets/filters/privacy.txt' - '../uAssets/filters/resources.txt' - '../uAssets/filters/unbreak.txt' -) -for repoPath in "${filters[@]}"; do - localPath=`printf $repoPath | sed 's/\.\.\/uAssets\/filters/assets\/ublock/'` - cp $repoPath $localPath - echo `md5sum $localPath` >> assets/checksums.txt -done - -thirdparties=( - '../uAssets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt' - '../uAssets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt' - '../uAssets/thirdparties/mirror1.malwaredomains.com/files/justdomains' - '../uAssets/thirdparties/pgl.yoyo.org/as/serverlist' - '../uAssets/thirdparties/publicsuffix.org/list/effective_tld_names.dat' - '../uAssets/thirdparties/www.malwaredomainlist.com/hostslist/hosts.txt' -) -for repoPath in "${thirdparties[@]}"; do - localPath=`printf $repoPath | sed 's/\.\.\/uAssets\/thirdparties/assets\/thirdparties/'` - cp $repoPath $localPath - echo `md5sum $localPath` >> assets/checksums.txt -done - -echo "*** uBlock: checksums updated." - -git status assets/