This commit is contained in:
AlexVallat 2015-03-07 14:11:35 +00:00
commit 4481e951cc
73 changed files with 1309 additions and 603 deletions

View File

@ -18,7 +18,7 @@
* [Release History](#release-history) * [Release History](#release-history)
* [Wiki](https://github.com/gorhill/uBlock/wiki) * [Wiki](https://github.com/gorhill/uBlock/wiki)
# ![Build](https://travis-ci.org/gorhill/uBlock.svg?branch=master) # [![Build Status](https://travis-ci.org/gorhill/uBlock.svg?branch=master)](https://travis-ci.org/gorhill/uBlock)
## Philosophy ## Philosophy
@ -91,13 +91,9 @@ Install from [Firefox Add-ons homepage](https://addons.mozilla.org/en-US/firefox
#### Safari #### Safari
##### 8.0 or newer only Install the latest µBlock for Safari [from its homepage](https://chrismatic.io/ublock/), or a potentially-outdated version from the [Safari Extension Gallery](https://extensions.apple.com/details/?id=net.gorhill.uBlock-96G4BAKDQ9).
You can get and install the latest µBlock for Safari **[right here](https://chrismatic.io/ublock/)**. <sup>Safari 6.1 and later (developed on Safari 8/Yosemite; tested on 6.1/Mountain Lion and 7/Mavericks).</sup>
µBlock is also available on the [Safari Extension Gallery](https://extensions.apple.com/details/?id=net.gorhill.uBlock-96G4BAKDQ9), although that's not guaranteed to be the latest version.
<sup>Safari versions prior to 8.0 have a bug triggering a crash during µBlock installation. It's not recommended that you attempt to install µBlock on them (*if you must, do it at your own risk*).</sup>
#### Note for all browsers #### Note for all browsers

View File

@ -1,5 +1,5 @@
59371e23b383053da7cd2e8d31d4ccf7 assets/ublock/privacy.txt 59371e23b383053da7cd2e8d31d4ccf7 assets/ublock/privacy.txt
227044014eb0d8f40ab1be72538c68fd assets/ublock/filters.txt 42a552919bf86d9e73a963c401b18423 assets/ublock/filters.txt
dcf3e05bae803343c9d632f0baf8bedd assets/ublock/mirror-candidates.txt dcf3e05bae803343c9d632f0baf8bedd assets/ublock/mirror-candidates.txt
96e088c2dbb8759e046d2a44ed375000 assets/ublock/filter-lists.json 96e088c2dbb8759e046d2a44ed375000 assets/ublock/filter-lists.json
132b3ecc9da8a68c3faf740c00af734b assets/thirdparties/adblock-plus-japanese-filter.googlecode.com/hg/abp_jp.txt 132b3ecc9da8a68c3faf740c00af734b assets/thirdparties/adblock-plus-japanese-filter.googlecode.com/hg/abp_jp.txt

View File

@ -303,8 +303,9 @@ deviantart.com##.dp-ad-chrome.dp-ad-visible
@@||2o7.net^$domain=totaljobs.com @@||2o7.net^$domain=totaljobs.com
# https://github.com/gorhill/uBlock/issues/822 # https://github.com/gorhill/uBlock/issues/822
# https://github.com/gorhill/uBlock/issues/940
# To counter `google-analytics.com` in Dan Pollock's, hpHosts, MVPS, Peter Lowe's # To counter `google-analytics.com` in Dan Pollock's, hpHosts, MVPS, Peter Lowe's
@@||google-analytics.com^$domain=musixmatch.com @@||google-analytics.com^$domain=musixmatch.com|bikstok.sonymusicshop.dk
# https://github.com/gorhill/uBlock/issues/841 # https://github.com/gorhill/uBlock/issues/841
# To counter `quantcast.com` in hpHosts, Peter Lowe's # To counter `quantcast.com` in hpHosts, Peter Lowe's
@ -313,3 +314,21 @@ deviantart.com##.dp-ad-chrome.dp-ad-visible
# Chrome store feedback: "on gaana.com it blocks the site" # Chrome store feedback: "on gaana.com it blocks the site"
# To counter `_social_tracking.` in EasyPrivacy # To counter `_social_tracking.` in EasyPrivacy
@@||css5.gaanacdn.com/minify-*/min/?$script @@||css5.gaanacdn.com/minify-*/min/?$script
# http://support.getadblock.com/discussions/problems/73955-specific-web-site-causes-thousands-infinite-blocks-locks-up-chrome
||www.notempire.com/js/gridview$script
# https://github.com/gorhill/uBlock/issues/919
@@||s.youtube.com/api/stats/playback?$image,object-subrequest
# https://twitter.com/Urre/status/572742363069714432
# To counter `/keen.min.js` in EasyPrivacy
@@||keen.github.io/*/keen.min.js$domain=keen.github.io
# Feedback from Chrome store: "videos dont work on this site"
# http://www.okgoals.com/match-highlights-1425491618---41
# To counter `intergi.com` in Peter Lowe's
@@||cdn.phoenix.intergi.com^$domain=okgoals.com
# https://github.com/gorhill/uBlock/issues/951
answers.yahoo.com###ya-center-rail > [id^="ya-q-"][id$="-textads"]

View File

@ -1,21 +1,21 @@
En effektiv blocker: let på hukommelse og CPU fodaftryk, og endnu kan indlæse og håndhæve tusindvis flere filtre end andre populære blokkere derude. En effektiv blocker: let på hukommelse og CPU forbrug,. Kan indlæse og anvende tusindvis af flere filtre end andre populære blockere derude.
Illustreret oversigt over dens effektivitet: https://github.com/gorhill/uBlock/wiki/%C2%B5Block-vs.-ABP :-Efficiency-compared Illustreret oversigt over effektiviteten: https://github.com/gorhill/uBlock/wiki/%C2%B5Block-vs.-ABP :-Efficiency-compared
Brug: Den Store power knap i pop-up-vinduet er til permanent deaktivere/aktivere µBlock for det aktuelle websted. Det gælder kun for det aktuelle websted , det er ikke en global afbryderknap. Anvendelse: Den Store power knap i pop-up-vinduet kan permanent deaktivere/aktivere µBlock 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": det kan også læse og oprette filtre fra hosts-filer. Fleksibel, det er mere end en "ad blocker": den kan også læse og oprette filtre fra hosts-filer.
Ud af boksen, er disse lister over filtre indlæses og håndhævet: Fra starten af er disse lister over filtre indlæst og anvendt:
- EasyList - EasyList
- Peter Lowes Ad server list - Peter Lowes Ad server list
- EasyPrivacy - EasyPrivacy
- Malware domains - Malware domains
Flere lister er tilgængelige for dig at vælge når du ønsker det: Flere lister er tilgængelige hvis du ønsker det:
- Fanboys Enhanced Tracking List - Fanboys Enhanced Tracking List
- Dan Pollocks hosts file - Dan Pollocks hosts file
@ -24,26 +24,26 @@ Flere lister er tilgængelige for dig at vælge når du ønsker det:
- Spam404 - Spam404
- Osv. - Osv.
Selvfølgelig, jo flere aktive filtre mere jo højere hukommelse fodtryk. Endnu, selv efter at tilføje Fanboys to ekstra lister, Hphosts's annonce og tracking servere, µBlock stadig har en ringere hukommelse footprint end andre meget populære blokkere derude. Selvfølgelig vil flere aktive filtre betyde højere hukommelsesforbrug. Selv efter tilføjelse af Fanboys to ekstra lister, og hpHostss Ad and tracking server, har µBlock stadig et lavere hukommelsesforbrug end andre blockere derude.
Desuden være opmærksom på at vælge nogle af disse ekstra lister kan føre til højere sandsynlighed for webstedet brud - især de lister, der normalt anvendes som host-filel. 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.
*** ***
Uden de forudindstillede lister over filtre er denne udvidelse intet. Så hvis du nogensinde virkelig ønsker at bidrage med noget, tænk på de mennesker, der arbejder hårdt for at vedligeholde filterlister, du bruger, som blev stillet til rådighed til brug af alle gratis. Uden de forudindstillede lister med filtre er denne udvidelse intet. Hvis du nogensinde virkelig ønsker at bidrage med noget, 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. Gratis.
Open source med offentlige licens (GPLv3) Open source med offentlig licens (GPLv3)
For brugere af brugere. For brugere, af brugere.
Bidragydere @ Github: https://github.com/gorhill/uBlock/graphs/contributors Bidragydere @ Github: https://github.com/gorhill/uBlock/graphs/contributors
Bidragydere @ Crowdin: https://crowdin.net/project/ublock Bidragydere @ Crowdin: https://crowdin.net/project/ublock
*** ***
Det er ganske en tidlig version, holde dette i tankerne, når du gennemser. Dette er en tidlig version. Hav dette i tankerne når du skriver en anmeldelse.
Projekt Ændringslog: Projekt changelog:
https://github.com/gorhill/uBlock/releases https://github.com/gorhill/uBlock/releases

View File

@ -23,7 +23,7 @@ Fler filterlistor finns tillgängliga att använda om du vill:
- hpHostss Ad and tracking servers - hpHostss Ad and tracking servers
- MVPS HOSTS - MVPS HOSTS
- Spam404 - Spam404
- m.fl. - med flera
Ju fler aktiverade filter, desto högre minnesanvändning. Men även efter att ha lagt till Fanboys två extra filterlistor och hpHosts' Ad and tracking servers så använder µBlock mindre minne än andra väldigt populära blockerare. Ju fler aktiverade filter, desto högre minnesanvändning. Men även efter att ha lagt till Fanboys två extra filterlistor och hpHosts' Ad and tracking servers så använder µBlock mindre minne än andra väldigt populära blockerare.

BIN
doc/img/rlogger-01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

BIN
doc/img/rlogger-02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
doc/img/rlogger-03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
doc/img/rlogger-04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
doc/img/rlogger-05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
doc/img/rlogger-06.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "µBlock", "name": "µBlock",
"version": "0.8.9.2", "version": "0.9.0.0",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_extShortDesc__", "description": "__MSG_extShortDesc__",

View File

@ -738,12 +738,7 @@ vAPI.tabs.reload = function(tabId) {
return; return;
} }
if ( vAPI.fennec ) { getBrowserForTab(tab).webNavigation.reload(0);
tab.browser.reload();
return;
}
getOwnerWindow(tab).gBrowser.reloadTab(tab);
}; };
/******************************************************************************/ /******************************************************************************/

View File

@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "µBlock", "name": "µBlock",
"version": "0.8.8.2", "version": "0.8.9.1",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_extShortDesc__", "description": "__MSG_extShortDesc__",

View File

@ -42,6 +42,29 @@
/******************************************************************************/ /******************************************************************************/
if(navigator.userAgent.indexOf("Safari/6") === -1) { // If we're not on at least Safari 8
var _open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(m, u) {
if(u.lastIndexOf("safari-extension:", 0) === 0) {
var i = u.length, seeDot = false;
while(i --) {
if(u[i] === ".") {
seeDot = true;
}
else if(u[i] === "/") {
break;
}
}
if(seeDot === false) {
throw 'InvalidAccessError'; // Avoid crash
return;
}
}
_open.apply(this, arguments);
};
}
/******************************************************************************/
vAPI.app.restart = function() {}; vAPI.app.restart = function() {};
/******************************************************************************/ /******************************************************************************/

View File

@ -235,6 +235,18 @@
"message":"تفعيل الخصائص التجريبية (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>حول<\/a>)", "message":"تفعيل الخصائص التجريبية (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>حول<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"الذاكرة المستخدمة: {{value}} بايت",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"آخر استيراد:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"آخر تصدير:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} من فلاتر الشبكه {{cosmeticFilterCount}} فلاتر تجميليه:", "message":"{{netFilterCount}} من فلاتر الشبكه {{cosmeticFilterCount}} فلاتر تجميليه:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -352,7 +364,7 @@
"description":"This will remove all temporary rules" "description":"This will remove all temporary rules"
}, },
"rulesCommit":{ "rulesCommit":{
"message":"حفظ", "message":"تعليق",
"description":"This will persist temporary rules" "description":"This will persist temporary rules"
}, },
"rulesEdit":{ "rulesEdit":{
@ -451,6 +463,14 @@
"message":"خلف الكواليس", "message":"خلف الكواليس",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"فلتر سجل الإدخالات",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"العدد الأقصى للإدخالات في السجلات",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"سجل التغيير", "message":"سجل التغيير",
"description":"English: Change log" "description":"English: Change log"

View File

@ -192,11 +192,11 @@
"description":"English: Create" "description":"English: Create"
}, },
"pickerPick":{ "pickerPick":{
"message":"Избиране", "message":"Нов избор",
"description":"English: Pick" "description":"English: Pick"
}, },
"pickerQuit":{ "pickerQuit":{
"message":"Изход", "message":"Отказ",
"description":"English: Quit" "description":"English: Quit"
}, },
"pickerNetFilters":{ "pickerNetFilters":{
@ -235,6 +235,18 @@
"message":"Разрешаване на експериментални функции (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'> за<\/a>)", "message":"Разрешаване на експериментални функции (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'> за<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Използвани за съхранение: {{value}} байта",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Последно възстановяване:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Последно резервно копие:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} мрежови филтри {{cosmeticFilterCount}} козметични филтри от:", "message":"{{netFilterCount}} мрежови филтри {{cosmeticFilterCount}} козметични филтри от:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Скрити", "message":"Скрити",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"филтриране на записи",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Максимален брой записи в дневника",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Списък с промени", "message":"Списък с промени",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Habilitar funcions experimentals (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Quant a<\/a>)", "message":"Habilitar funcions experimentals (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Quant a<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtres de xarxa {{cosmeticFilterCount}} filtres cosmètics de:", "message":"{{netFilterCount}} filtres de xarxa {{cosmeticFilterCount}} filtres cosmètics de:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Peticions ocultes", "message":"Peticions ocultes",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrar entrades del registre",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Nombre màxim d'entrades del registre",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Registre de canvis", "message":"Registre de canvis",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Povolit experimentální funkce (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>co to je?<\/a>)", "message":"Povolit experimentální funkce (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>co to je?<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Prostoru využito: {{value}} bajtů",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Poslední obnova:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Poslední záloha:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} síťových filtrů {{cosmeticFilterCount}} kosmetických filtrů z:", "message":"{{netFilterCount}} síťových filtrů {{cosmeticFilterCount}} kosmetických filtrů z:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Za oponou", "message":"Za oponou",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrovat záznamy",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximální počet záznamů",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -180,7 +180,7 @@
"description":"" "description":""
}, },
"popupHitDomainCountPrompt":{ "popupHitDomainCountPrompt":{
"message":"Tilsluttede domæner", "message":"Forbundne domæner",
"description":"appears in popup" "description":"appears in popup"
}, },
"popupHitDomainCount":{ "popupHitDomainCount":{
@ -235,6 +235,18 @@
"message":"Slå eksperimentielle funktioner til (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Om<\/a>)", "message":"Slå eksperimentielle funktioner til (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Om<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} netværksfiltre {{cosmeticFilterCount}} kosmetiske filtre fra:", "message":"{{netFilterCount}} netværksfiltre {{cosmeticFilterCount}} kosmetiske filtre fra:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -380,7 +392,7 @@
"description":"default file name to use" "description":"default file name to use"
}, },
"rulesHint":{ "rulesHint":{
"message":"Liste af dine dynamiske filtreringsregler.", "message":"Liste over dine dynamiske filtreringsregler.",
"description":"English: List of your dynamic filtering rules." "description":"English: List of your dynamic filtering rules."
}, },
"rulesFormatHint":{ "rulesFormatHint":{
@ -451,6 +463,14 @@
"message":"Bag kulisserne", "message":"Bag kulisserne",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"Filtrér elementer i log",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maksimalt antal elementer i log",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Changelog", "message":"Changelog",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Aktiviere experimentelle Features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)", "message":"Aktiviere experimentelle Features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Verwendeter Speicherplatz: {{value}} Bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Letzte Wiederherstellung:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Letztes Backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} Netzwerkfilter {{cosmeticFilterCount}} kosmetische Filter von:", "message":"{{netFilterCount}} Netzwerkfilter {{cosmeticFilterCount}} kosmetische Filter von:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Hintergrundanfragen", "message":"Hintergrundanfragen",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"Protokoll-Einträge filtern",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximale Anzahl an Protokoll-Einträgen",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Änderungsprotokoll", "message":"Änderungsprotokoll",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Ενεργοποιήση πειραματικών χαρακτηριστικών (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Πληροφορίες<\/a>)", "message":"Ενεργοποιήση πειραματικών χαρακτηριστικών (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Πληροφορίες<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} φίλτρα δικτύου+ {{cosmeticFilterCount}} κοσμητικά φίλτρα από:", "message":"{{netFilterCount}} φίλτρα δικτύου+ {{cosmeticFilterCount}} κοσμητικά φίλτρα από:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -35,10 +35,6 @@
"message":"µBlock — Network request log", "message":"µBlock — Network request log",
"description":"Title for the network request log window" "description":"Title for the network request log window"
}, },
"statsFilterPrompt":{
"message":"filter log entries",
"description": "English: filter log entries"
},
"aboutPageName":{ "aboutPageName":{
"message":"About", "message":"About",
"description":"appears as tab name in dashboard" "description":"appears as tab name in dashboard"
@ -239,6 +235,18 @@
"message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)", "message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:", "message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -455,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description": "English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Habilitar funciones experimentales (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Acerca de<\/a>)", "message":"Habilitar funciones experimentales (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Acerca de<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Almacenamiento usado: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Última restauración:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Último respaldo:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtros de red y {{cosmeticFilterCount}} filtros cosméticos de:", "message":"{{netFilterCount}} filtros de red y {{cosmeticFilterCount}} filtros cosméticos de:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,8 +463,16 @@
"message":"Peticiones ocultas", "message":"Peticiones ocultas",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrar entradas del registro",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Cantidad máxima de entradas del registro",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Cambios", "message":"Registro de cambios",
"description":"English: Change log" "description":"English: Change log"
}, },
"aboutWiki":{ "aboutWiki":{
@ -484,7 +504,7 @@
"description":"English: Reset to default settings..." "description":"English: Reset to default settings..."
}, },
"aboutRestoreDataConfirm":{ "aboutRestoreDataConfirm":{
"message":"Toda la configuración se sobrescribirá utilizando datos respaldados {{time}} y µBlock se reiniciará. \n\n¿Sobrescribir toda la configuración existente utilizando datos de la copia de seguridad?", "message":"Toda la configuración se sobrescribirá utilizando datos respaldados en {{time}} y µBlock se reiniciará. \n\n¿Sobrescribir toda la configuración existente utilizando datos de la copia de seguridad?",
"description":"Message asking user to confirm restore" "description":"Message asking user to confirm restore"
}, },
"aboutRestoreDataError":{ "aboutRestoreDataError":{

View File

@ -235,6 +235,18 @@
"message":"Luba katselised funktsioonid (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>teave<\/a>)", "message":"Luba katselised funktsioonid (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>teave<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Mahtu kasutatud: {{value}} baiti",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Viimane taastus:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Viimane varundus:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} võrgufiltrit {{cosmeticFilterCount}} ilufiltrit:", "message":"{{netFilterCount}} võrgufiltrit {{cosmeticFilterCount}} ilufiltrit:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Telgitagus", "message":"Telgitagus",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtreeri logikirjeid",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maksimaalne logikirjete arv",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Muudatuste logi", "message":"Muudatuste logi",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"فعال کردن ویژگی های آزمایشی (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'> درباره<\/a>)", "message":"فعال کردن ویژگی های آزمایشی (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'> درباره<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"فضای مصرفی: {{value}} بایت",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"آخرین بازیابی:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"آخرین پشتیبانی:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} فیلتر های شبکه {{cosmeticFilterCount}} فرم های فیلتر انتخابی:", "message":"{{netFilterCount}} فیلتر های شبکه {{cosmeticFilterCount}} فرم های فیلتر انتخابی:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"پشت صحنه", "message":"پشت صحنه",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"فیلتر کردن مطالب لاگ",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"بیشترین تعداد مطالب لاگ",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"تغییرات اخیر", "message":"تغییرات اخیر",
"description":"English: Change log" "description":"English: Change log"
@ -500,7 +520,7 @@
"description":"English: Network error: unable to connect to {{url}}" "description":"English: Network error: unable to connect to {{url}}"
}, },
"dummy":{ "dummy":{
"message":"This entry must be the last one", "message":"این باید آخرین مطلب باشد",
"description":"so we dont need to deal with comma for last entry" "description":"so we dont need to deal with comma for last entry"
} }
} }

View File

@ -235,6 +235,18 @@
"message":"Salli kokeilulliset toiminnot (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Tietoa<\/a>)", "message":"Salli kokeilulliset toiminnot (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Tietoa<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:", "message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Muutosloki", "message":"Muutosloki",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)", "message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:", "message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Activer les fonctionnalités expérimentales (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>En savoir plus<\/a>)", "message":"Activer les fonctionnalités expérimentales (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>En savoir plus<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Stockage utilisé : {{value}} octet(s)",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Date de la dernière restauration :",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Date de la dernière sauvegarde :",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtre(s) réseau et {{cosmeticFilterCount}} filtre(s) esthétique(s) actuellement en action :", "message":"{{netFilterCount}} filtre(s) réseau et {{cosmeticFilterCount}} filtre(s) esthétique(s) actuellement en action :",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Requêtes en coulisses", "message":"Requêtes en coulisses",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"Filtrer les entrées du journal",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Nombre maximum d'entrées à conserver dans le journal",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Journal des changements (en Anglais)", "message":"Journal des changements (en Anglais)",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"אפשר תכונות ניסיוניות (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>אודות<\/a>)", "message":"אפשר תכונות ניסיוניות (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>אודות<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"אחסון בשימוש: {{value}} בתים",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"שחזור אחרון:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"גיבוי אחרון:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} מסנני רשת + {{cosmeticFilterCount}} מסננים קוסמטיים מתוך:", "message":"{{netFilterCount}} מסנני רשת + {{cosmeticFilterCount}} מסננים קוסמטיים מתוך:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"מאחורי הקלעים", "message":"מאחורי הקלעים",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"סנן רשומות",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"מספר רשומות מקסימליות",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"רשימת שינויים", "message":"רשימת שינויים",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)", "message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:", "message":"{{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"पर्दे के पीछे", "message":"पर्दे के पीछे",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Omogućiti eksperimentalne mogućnosti (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>O mogućnostima<\/a>)", "message":"Omogućiti eksperimentalne mogućnosti (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>O mogućnostima<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Korišteno prostora: {{value}} bajtova",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Posljednji povratak na prijašnje:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Posljednja sigurnosna kopija:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} mrežni\/ih filter\/a {{cosmeticFilterCount}} estetski\/ih filter\/a iz:", "message":"{{netFilterCount}} mrežni\/ih filter\/a {{cosmeticFilterCount}} estetski\/ih filter\/a iz:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Iza scene", "message":"Iza scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrirajte zabilješke",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Makismalan broj zabilješki",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Popis promjena", "message":"Popis promjena",
"description":"English: Change log" "description":"English: Change log"

View File

@ -184,7 +184,7 @@
"description":"appears in popup" "description":"appears in popup"
}, },
"popupHitDomainCount":{ "popupHitDomainCount":{
"message":"{{count}} a(z) {{total}}-böl", "message":"{{count}}, összesen: {{total}}",
"description":"appears in popup" "description":"appears in popup"
}, },
"pickerCreate":{ "pickerCreate":{
@ -235,6 +235,18 @@
"message":"Kísérleti funkciók engedélyezése", "message":"Kísérleti funkciók engedélyezése",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Tárolóhely használva: {{value}} byte",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Utolsó biztonsági mentés visszaállitása:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Utolsó biztonsági mentés:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} net-szűrők {{cosmeticFilterCount}} kozmetikai szűrők:", "message":"{{netFilterCount}} net-szűrők {{cosmeticFilterCount}} kozmetikai szűrők:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Hálózati forgalom a háttérben", "message":"Hálózati forgalom a háttérben",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"Naplóbejegyzések szűrése",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum naplóbejegyzések száma",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Változások listája", "message":"Változások listája",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Aktifkan fitur eksperimental (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Tentang<\/a>)", "message":"Aktifkan fitur eksperimental (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Tentang<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filter jaringan + {{cosmeticFilterCount}} filter tampilan dari:", "message":"{{netFilterCount}} filter jaringan + {{cosmeticFilterCount}} filter tampilan dari:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Di balik layar", "message":"Di balik layar",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"saring entri catatan",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Jumlah maximum entri catatan",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Catatan perubahan", "message":"Catatan perubahan",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Attiva funzionalità sperimentali (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Informazioni<\/a>)", "message":"Attiva funzionalità sperimentali (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Informazioni<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Spazio utilizzato: {{value}} byte",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Ultimo ripristino:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Ultimo backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtri di rete + {{cosmeticFilterCount}} filtri cosmetici da:", "message":"{{netFilterCount}} filtri di rete + {{cosmeticFilterCount}} filtri cosmetici da:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Dietro le quinte", "message":"Dietro le quinte",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtra voci del registro",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Numero massimo di voci del registro",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Change log", "message":"Change log",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"実験的な機能を有効にする (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)", "message":"実験的な機能を有効にする (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"使用中のストレージ: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"最後の復元:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"最後のバックアップ:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}}ネットワークフィルタ+{{cosmeticFilterCount}}コスメチックフィルタ:", "message":"{{netFilterCount}}ネットワークフィルタ+{{cosmeticFilterCount}}コスメチックフィルタ:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"絞り込み",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"バージョン更新履歴 (Change log)", "message":"バージョン更新履歴 (Change log)",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"실험 기능 활성화 (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>자세히<\/a>)", "message":"실험 기능 활성화 (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>자세히<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"스토리지 사용량: {{value}} 바이트",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"최근 복원:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"최근 백업:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} 네트워크 필터 {{cosmeticFilterCount}} 시각적 필터:", "message":"{{netFilterCount}} 네트워크 필터 {{cosmeticFilterCount}} 시각적 필터:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"숨겨진 구성 요소", "message":"숨겨진 구성 요소",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"필터 로그 항목",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"로그 항목의 최대 갯수",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"변경사항", "message":"변경사항",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Iespējot eksperimentālas iespējas (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sīkāk šeit<\/a>)", "message":"Iespējot eksperimentālas iespējas (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sīkāk šeit<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} tīkla filtri {{cosmeticFilterCount}} kosmētikas filtri no:", "message":"{{netFilterCount}} tīkla filtri {{cosmeticFilterCount}} kosmētikas filtri no:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Aizkulisēs", "message":"Aizkulisēs",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"žurnāla ierakstu filtrs",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Žurnāla ierakstu maksimālais skaits",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Izmaiņu žurnāls", "message":"Izmaiņu žurnāls",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"प्रायोगिक वैशिष्ट्ये सक्षम करा", "message":"प्रायोगिक वैशिष्ट्ये सक्षम करा",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} नेटवर्क फिल्टर {{cosmeticFilterCount}} उटणे फिल्टर :", "message":"{{netFilterCount}} नेटवर्क फिल्टर {{cosmeticFilterCount}} उटणे फिल्टर :",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"बदल नोंदी", "message":"बदल नोंदी",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Aktiver eksperimentelle funksjoner (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Info<\/a>)", "message":"Aktiver eksperimentelle funksjoner (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Info<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} nettverksfiltre {{cosmeticFilterCount}} kosmetiske filtre fra:", "message":"{{netFilterCount}} nettverksfiltre {{cosmeticFilterCount}} kosmetiske filtre fra:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Bak kulissene", "message":"Bak kulissene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filter log entries",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum number of log entries",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Endringslogg", "message":"Endringslogg",
"description":"English: Change log" "description":"English: Change log"

View File

@ -32,7 +32,7 @@
"description":"appears as tab name in dashboard" "description":"appears as tab name in dashboard"
}, },
"statsPageName":{ "statsPageName":{
"message":"µBlock — Log van netwerkverzoeken", "message":"µBlock — Logboek van netwerkverzoeken",
"description":"Title for the network request log window" "description":"Title for the network request log window"
}, },
"aboutPageName":{ "aboutPageName":{
@ -68,7 +68,7 @@
"description":"English: Enter element picker mode" "description":"English: Enter element picker mode"
}, },
"popupTipLog":{ "popupTipLog":{
"message":"Ga naar verzoekenlog", "message":"Naar verzoekenlogboek gaan",
"description":"English: Go to request log" "description":"English: Go to request log"
}, },
"popupSiteInlineScriptEnabled":{ "popupSiteInlineScriptEnabled":{
@ -235,6 +235,18 @@
"message":"Experimentele functies inschakelen (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Over<\/a>)", "message":"Experimentele functies inschakelen (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Over<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Gebruikte opslagruimte: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Laatste herstel:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Laatste back-up:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} netwerkfilters {{cosmeticFilterCount}} cosmetische filters van:", "message":"{{netFilterCount}} netwerkfilters {{cosmeticFilterCount}} cosmetische filters van:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Achter de schermen", "message":"Achter de schermen",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"logboekitems filteren",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximum aantal logboekitems",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Veranderingenlogboek", "message":"Veranderingenlogboek",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Włącz funkcje eksperymentalne (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Więcej<\/a>)", "message":"Włącz funkcje eksperymentalne (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Więcej<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Użycie pamięci masowej: {{value}} bajtów",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Ostatnie przywrócenie:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Ostatnia kopia zapasowa:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtry sieciowe {{cosmeticFilterCount}} filtry kosmetyczne z:", "message":"{{netFilterCount}} filtry sieciowe {{cosmeticFilterCount}} filtry kosmetyczne z:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Za kulisami", "message":"Za kulisami",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtruj wpisy w logu",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maksymalna liczba wpisów do wyświetlenia",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Dziennik zmian", "message":"Dziennik zmian",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Ativar os recursos experimentais (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sobre<\/a>)", "message":"Ativar os recursos experimentais (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sobre<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Armazenamento usado: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Última restauração:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Último backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtros de rede {{cosmeticFilterCount}} filtros cosméticos de:", "message":"{{netFilterCount}} filtros de rede {{cosmeticFilterCount}} filtros cosméticos de:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Por trás da cena", "message":"Por trás da cena",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrar entradas de registro",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Número máximo de entradas de registro",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Registro de alterações", "message":"Registro de alterações",
"description":"English: Change log" "description":"English: Change log"

View File

@ -8,7 +8,7 @@
"description":"this will be in the chrome web store: must be 132 characters or less" "description":"this will be in the chrome web store: must be 132 characters or less"
}, },
"dashboardName":{ "dashboardName":{
"message":"µBlock — Painel de Controlo", "message":"µBlock — Painel de controlo",
"description":"English: µBlock — Dashboard" "description":"English: µBlock — Dashboard"
}, },
"settingsPageName":{ "settingsPageName":{
@ -40,7 +40,7 @@
"description":"appears as tab name in dashboard" "description":"appears as tab name in dashboard"
}, },
"popupPowerSwitchInfo":{ "popupPowerSwitchInfo":{
"message":"Clique: desativar\/ativar o µBlock para este site.\n\nCtrl+clique: desativar o µBlock apenas nesta página.", "message":"Clique: desativar\/ativar o µBlock para este sítio web.\n\nCtrl+clique: desativar o µBlock apenas nesta página.",
"description":"English: Click: disable\/enable µBlock for this site.\n\nCtrl+click: disable µBlock only on this page." "description":"English: Click: disable\/enable µBlock for this site.\n\nCtrl+click: disable µBlock only on this page."
}, },
"popupBlockedRequestPrompt":{ "popupBlockedRequestPrompt":{
@ -216,7 +216,7 @@
"description":"English: Block element" "description":"English: Block element"
}, },
"settingsCollapseBlockedPrompt":{ "settingsCollapseBlockedPrompt":{
"message":"Ocultar espaços ocupados de elementos bloqueados", "message":"Ocultar espaços ocupados por elementos bloqueados",
"description":"English: Hide placeholders of blocked elements" "description":"English: Hide placeholders of blocked elements"
}, },
"settingsIconBadgePrompt":{ "settingsIconBadgePrompt":{
@ -235,6 +235,18 @@
"message":"Ativar funções experimentais (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sobre<\/a>)", "message":"Ativar funções experimentais (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Sobre<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Armazenamento utilizado: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Último restauro:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Último backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtros de rede {{cosmeticFilterCount}} filtros cosméticos a partir de:", "message":"{{netFilterCount}} filtros de rede {{cosmeticFilterCount}} filtros cosméticos a partir de:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Bastidores", "message":"Bastidores",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrar entradas de registo",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Número máximo de entradas de registo",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Registo de alterações", "message":"Registo de alterações",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Activează funcțiile experimentale (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Despre<\/a>)", "message":"Activează funcțiile experimentale (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Despre<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Spațiu de stocare utilizat: {{value}} octeți",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Ultima restaurare:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Ultima copie de siguranță:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtre rețea {{cosmeticFilterCount}} filtre vizuale din:", "message":"{{netFilterCount}} filtre rețea {{cosmeticFilterCount}} filtre vizuale din:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"În spatele scenei", "message":"În spatele scenei",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrează intrările din jurnal",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Numărul maxim de intrări în jurnal",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Jurnalul de modificări", "message":"Jurnalul de modificări",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Включить экспериментальные возможности (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Подробнее<\/a>)", "message":"Включить экспериментальные возможности (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Подробнее<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Используется {{value}} байт",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Последнее восстановление:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Последняя резервная копия:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} сетевых фильтров {{cosmeticFilterCount}} косметических фильтров из:", "message":"{{netFilterCount}} сетевых фильтров {{cosmeticFilterCount}} косметических фильтров из:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"За кулисами", "message":"За кулисами",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"фильтр записей в журнале",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Максимальное количество записей в журнале",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Список изменений", "message":"Список изменений",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Aktivizoj veçoritë eksperimentale (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Info<\/a>)", "message":"Aktivizoj veçoritë eksperimentale (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Info<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Hapësira e përdorur: {{value}} bajt",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Rindërtimi i fundit:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Kopjimi i fundit:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} filtra të rrjetit {{cosmeticFilterCount}} filtra kozmetikë nga:", "message":"{{netFilterCount}} filtra të rrjetit {{cosmeticFilterCount}} filtra kozmetikë nga:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Në prapaskenë", "message":"Në prapaskenë",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtroni elementet e ditarit",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Numri maksimal i elementeve të ditarit",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Ditari i ndryshimeve", "message":"Ditari i ndryshimeve",
"description":"English: Change log" "description":"English: Change log"

View File

@ -160,7 +160,7 @@
"description":"" "description":""
}, },
"popup3pAnyRulePrompt":{ "popup3pAnyRulePrompt":{
"message":"Tredjeparts", "message":"Tredjepart",
"description":"" "description":""
}, },
"popupInlineScriptRulePrompt":{ "popupInlineScriptRulePrompt":{
@ -232,9 +232,21 @@
"description":"English: " "description":"English: "
}, },
"settingsExperimentalPrompt":{ "settingsExperimentalPrompt":{
"message":"Aktivera experimentella funktioner", "message":"Aktivera experimentella funktioner (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Om<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Använt utrymme: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Senaste återställning:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Senaste säkerhetskopia:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} nätverksfilter {{cosmeticFilterCount}} kosmetiska filter från:", "message":"{{netFilterCount}} nätverksfilter {{cosmeticFilterCount}} kosmetiska filter från:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -372,7 +384,7 @@
"description":"" "description":""
}, },
"rulesExport":{ "rulesExport":{
"message":"Exportera till fil...", "message":"Exportera till fil",
"description":"" "description":""
}, },
"rulesDefaultFileName":{ "rulesDefaultFileName":{
@ -451,6 +463,14 @@
"message":"Under huven", "message":"Under huven",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"filtrera loggposter",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maximalt antal loggposter",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Ändringslogg", "message":"Ändringslogg",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Test aşamasındaki özellikleri etkinleştir (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Hakkında<\/a>)", "message":"Test aşamasındaki özellikleri etkinleştir (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Hakkında<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Storage used: {{value}} bytes",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Last restore:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Last backup:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} ağ filtresi {{cosmeticFilterCount}} kozmetik filtre:", "message":"{{netFilterCount}} ağ filtresi {{cosmeticFilterCount}} kozmetik filtre:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Sahne arkası", "message":"Sahne arkası",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"Log kayıtlarını filtrele",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Maksimum log kayıt sayısı",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Değişiklikler", "message":"Değişiklikler",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"Ввімкнути експериментальні функції (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Детальніше тут<\/a>)", "message":"Ввімкнути експериментальні функції (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Детальніше тут<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Використано: {{value}} байт",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Востаннє відновлено:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Остання резервна копія:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} мережевих фільтрів {{cosmeticFilterCount}} косметичних фільтрів з:", "message":"{{netFilterCount}} мережевих фільтрів {{cosmeticFilterCount}} косметичних фільтрів з:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -348,7 +360,7 @@
"description":"header" "description":"header"
}, },
"rulesRevert":{ "rulesRevert":{
"message":"скасувати зміни", "message":"Скасувати зміни",
"description":"This will remove all temporary rules" "description":"This will remove all temporary rules"
}, },
"rulesCommit":{ "rulesCommit":{
@ -451,6 +463,14 @@
"message":"За лаштунками", "message":"За лаштунками",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"фільтр журналу записів",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Максимальна кількість записів в журналі",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Журнал змін", "message":"Журнал змін",
"description":"English: Change log" "description":"English: Change log"

View File

@ -180,7 +180,7 @@
"description":"" "description":""
}, },
"popupHitDomainCountPrompt":{ "popupHitDomainCountPrompt":{
"message":"tên miền", "message":"tên miền đã kết nối",
"description":"appears in popup" "description":"appears in popup"
}, },
"popupHitDomainCount":{ "popupHitDomainCount":{
@ -235,6 +235,18 @@
"message":"Kích hoạt các tính năng thử nghiệm (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Thông tin<\/a>)", "message":"Kích hoạt các tính năng thử nghiệm (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>Thông tin<\/a>)",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"Bộ nhớ đã dùng: {{value}} byte",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"Lần phục hồi trước:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"Lần sao lưu trước:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"{{netFilterCount}} bộ lọc mạng {{cosmeticFilterCount}} bộ lọc phần tử ẩn từ:", "message":"{{netFilterCount}} bộ lọc mạng {{cosmeticFilterCount}} bộ lọc phần tử ẩn từ:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"Behind the scene", "message":"Behind the scene",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"lọc mục ghi nhận",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"Số mục ghi nhận tối đa",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"Thay đổi", "message":"Thay đổi",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"启用实验功能(<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>关于<\/a>", "message":"启用实验功能(<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>关于<\/a>",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"已用空间:{{value}} 字节",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"上次恢复:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"上次备份:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"当前使用了 {{netFilterCount}} 个 URL 过滤规则和 {{cosmeticFilterCount}} 个元素过滤规则:", "message":"当前使用了 {{netFilterCount}} 个 URL 过滤规则和 {{cosmeticFilterCount}} 个元素过滤规则:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -451,6 +463,14 @@
"message":"后台", "message":"后台",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"过滤日志条目",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"日志条目最大数量",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"更新日志", "message":"更新日志",
"description":"English: Change log" "description":"English: Change log"

View File

@ -235,6 +235,18 @@
"message":"啟用實驗性功能", "message":"啟用實驗性功能",
"description":"English: Enable experimental features" "description":"English: Enable experimental features"
}, },
"settingsStorageUsed":{
"message":"已使用的儲存: {{value}} 位元組",
"description":"English: Storage used: {{}} bytes"
},
"settingsLastRestorePrompt":{
"message":"最後的還原:",
"description":"English: Last restore:"
},
"settingsLastBackupPrompt":{
"message":"最後的備份:",
"description":"English: Last backup:"
},
"3pListsOfBlockedHostsPrompt":{ "3pListsOfBlockedHostsPrompt":{
"message":"目前使用{{netFilterCount}} 網址過濾和{{cosmeticFilterCount}} 元素過濾規則:", "message":"目前使用{{netFilterCount}} 網址過濾和{{cosmeticFilterCount}} 元素過濾規則:",
"description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:" "description":"English: {{netFilterCount}} network filters {{cosmeticFilterCount}} cosmetic filters from:"
@ -332,7 +344,7 @@
"description":"English: Export" "description":"English: Export"
}, },
"1pExportFilename":{ "1pExportFilename":{
"message":"ublock-自訂過濾_{{datetime}}.txt", "message":"我的-ublock-自訂過濾_{{datetime}}.txt",
"description":"English: my-ublock-static-filters_{{datetime}}.txt" "description":"English: my-ublock-static-filters_{{datetime}}.txt"
}, },
"1pApplyChanges":{ "1pApplyChanges":{
@ -376,7 +388,7 @@
"description":"" "description":""
}, },
"rulesDefaultFileName":{ "rulesDefaultFileName":{
"message":"ublock-自訂動態規則_{{datetime}}.txt", "message":"我的-ublock-自訂動態規則_{{datetime}}.txt",
"description":"default file name to use" "description":"default file name to use"
}, },
"rulesHint":{ "rulesHint":{
@ -384,7 +396,7 @@
"description":"English: List of your dynamic filtering rules." "description":"English: List of your dynamic filtering rules."
}, },
"rulesFormatHint":{ "rulesFormatHint":{
"message":"規則語法: <code>來源主機名稱 目標主機名稱 需求類型 行為<\/code> (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Dynamic-filtering:-rule-syntax'>說明文件<\/a>)。", "message":"規則語法:<code>來源主機名稱 目標主機名稱 連線請求類型 操作<\/code><a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Dynamic-filtering:-rule-syntax'>完整說明<\/a>。",
"description":"English: dynamic rule syntax and full documentation." "description":"English: dynamic rule syntax and full documentation."
}, },
"whitelistPrompt":{ "whitelistPrompt":{
@ -400,7 +412,7 @@
"description":"English: Export" "description":"English: Export"
}, },
"whitelistExportFilename":{ "whitelistExportFilename":{
"message":"ublock-白名單_{{datetime}}.txt", "message":"我的-ublock-白名單_{{datetime}}.txt",
"description":"English: my-ublock-whitelist_{{datetime}}.txt" "description":"English: my-ublock-whitelist_{{datetime}}.txt"
}, },
"whitelistApply":{ "whitelistApply":{
@ -451,6 +463,14 @@
"message":"幕後", "message":"幕後",
"description":"Pretty name for behind-the-scene network requests" "description":"Pretty name for behind-the-scene network requests"
}, },
"logFilterPrompt":{
"message":"過濾日誌條目",
"description":"English: filter log entries"
},
"logMaxEntriesTip":{
"message":"最大日誌條目數量",
"description":"Tooltip informaing that the input field is to set the maximum number of entries in the log"
},
"aboutChangelog":{ "aboutChangelog":{
"message":"更新日誌", "message":"更新日誌",
"description":"English: Change log" "description":"English: Change log"
@ -472,7 +492,7 @@
"description":"English: Backup to file" "description":"English: Backup to file"
}, },
"aboutBackupFilename":{ "aboutBackupFilename":{
"message":"ublock-備份_{{datetime}}.txt", "message":"我的-ublock-備份_{{datetime}}.txt",
"description":"English: my-ublock-backup_{{datetime}}.txt" "description":"English: my-ublock-backup_{{datetime}}.txt"
}, },
"aboutRestoreDataButton":{ "aboutRestoreDataButton":{

View File

@ -8,7 +8,8 @@ div > p:last-child {
box-sizing: border-box; box-sizing: border-box;
font-size: small; font-size: small;
height: 60vh; height: 60vh;
text-align: left;
white-space: pre; white-space: pre;
width: 100%; width: 100%;
text-align: left; word-wrap: normal;
} }

View File

@ -122,6 +122,7 @@ body[dir=rtl] #externalListsDiv {
height: 10em; height: 10em;
white-space: pre; white-space: pre;
width: 100%; width: 100%;
word-wrap: normal;
} }
body #busyOverlay { body #busyOverlay {
position: fixed; position: fixed;

View File

@ -37,6 +37,15 @@ body {
body.filterOff #toolbar #filterButton { body.filterOff #toolbar #filterButton {
opacity: 0.25; opacity: 0.25;
} }
#filterExpression.bad {
background-color: #fee;
}
#maxEntries {
margin-left: 3em;
}
input:focus {
background-color: #ffe;
}
#content { #content {
margin-top: 36px; margin-top: 36px;
} }
@ -70,6 +79,7 @@ body:not(.filterOff) #content table tr.hidden {
padding: 3px 0; padding: 3px 0;
text-align: center; text-align: center;
white-space: pre; white-space: pre;
width: 1em;
} }
#content table tr td:nth-of-type(2) { #content table tr td:nth-of-type(2) {
white-space: normal; white-space: normal;

View File

@ -27,6 +27,9 @@ body {
margin: 0 0 0 1em; margin: 0 0 0 1em;
vertical-align: middle; vertical-align: middle;
} }
#pageSelector {
max-width: 80%;
}
#toolbar #refresh { #toolbar #refresh {
margin-left: 4px; margin-left: 4px;
} }

View File

@ -10,7 +10,8 @@
<div id="toolbar"> <div id="toolbar">
<span id="reload" class="button fa">&#xf021;</span> <span id="reload" class="button fa">&#xf021;</span>
<span id="clear" class="button fa">&#xf12d;</span> <span id="clear" class="button fa">&#xf12d;</span>
<span id="filterButton" class="button fa">&#xf0b0;</span><input id="filterExpression" type="text" placeholder="statsFilterPrompt"> <span id="filterButton" class="button fa">&#xf0b0;</span><input id="filterExpression" type="text" placeholder="logFilterPrompt">
<input id="maxEntries" type="text" size="5" title="logMaxEntriesTip">
</div> </div>
<div id="content"> <div id="content">
<table><tbody></tbody></table> <table><tbody></tbody></table>

View File

@ -121,7 +121,7 @@ svg > path:first-child {
svg > path + path { svg > path + path {
stroke: #F00; stroke: #F00;
stroke-width: 0.5px; stroke-width: 0.5px;
fill: rgba(255,0,0,0.25); fill: rgba(255,31,31,0.25);
} }
aside { aside {
background-color: rgba(255,255,255,0.9); background-color: rgba(255,255,255,0.9);

View File

@ -63,6 +63,7 @@ return {
externalLists: defaultExternalLists, externalLists: defaultExternalLists,
firewallPaneMinimized: true, firewallPaneMinimized: true,
parseAllABPHideFilters: true, parseAllABPHideFilters: true,
requestLogMaxEntries: 0,
showIconBadge: true showIconBadge: true
}, },
@ -80,15 +81,24 @@ return {
localSettings: { localSettings: {
blockedRequestCount: 0, blockedRequestCount: 0,
allowedRequestCount: 0 allowedRequestCount: 0,
}, },
localSettingsModifyTime: 0,
localSettingsSaveTime: 0,
// read-only // read-only
systemSettings: { systemSettings: {
compiledMagic: 'shztbfhkfjit', compiledMagic: 'wcuwrlodqyee',
selfieMagic: 'spqmeuaftfra' selfieMagic: 'spqmeuaftfra'
}, },
restoreBackupSettings: {
lastRestoreFile: '',
lastRestoreTime: 0,
lastBackupFile: '',
lastBackupTime: 0
},
// EasyList, EasyPrivacy and many others have an 4-day update period, // EasyList, EasyPrivacy and many others have an 4-day update period,
// as per list headers. // as per list headers.
updateAssetsEvery: 97 * oneHour, updateAssetsEvery: 97 * oneHour,

View File

@ -364,7 +364,7 @@ var messager = vAPI.messaging.channel('contentscript-end.js');
// so we will just skip them from now on. // so we will just skip them from now on.
if ( processHighHighGenericsMisses === 0 ) { if ( processHighHighGenericsMisses === 0 ) {
injectedSelectors['{{highHighGenerics}}'] = true; injectedSelectors['{{highHighGenerics}}'] = true;
console.debug('high-high generic: apparently not needed...'); //console.debug('high-high generic: apparently not needed...');
} }
return; return;
} }

View File

@ -156,11 +156,12 @@ var hideElements = function(selectors) {
} }
}; };
var url = window.location.href;
localMessager.send( localMessager.send(
{ {
what: 'retrieveDomainCosmeticSelectors', what: 'retrieveDomainCosmeticSelectors',
pageURL: window.location.href, pageURL: url,
locationURL: window.location.href locationURL: url
}, },
filteringHandler filteringHandler
); );

View File

@ -37,6 +37,15 @@ var body = doc.body;
var tbody = doc.querySelector('#content tbody'); var tbody = doc.querySelector('#content tbody');
var rowJunkyard = []; var rowJunkyard = [];
var reFilter = null; var reFilter = null;
var filterTargetTestResult = true;
var maxEntries = 0;
var prettyRequestTypes = {
'main_frame': 'doc',
'stylesheet': 'css',
'sub_frame': 'frame',
'xmlhttprequest': 'xhr'
};
/******************************************************************************/ /******************************************************************************/
@ -102,7 +111,7 @@ var renderLogEntry = function(entry) {
var tr = createRow(); var tr = createRow();
if ( entry.result.charAt(1) === 'b' ) { if ( entry.result.charAt(1) === 'b' ) {
tr.classList.add('blocked'); tr.classList.add('blocked');
tr.cells[0].textContent = ' \u2212\u00A0'; tr.cells[0].textContent = ' -\u00A0';
} else if ( entry.result.charAt(1) === 'a' ) { } else if ( entry.result.charAt(1) === 'a' ) {
tr.classList.add('allowed'); tr.classList.add('allowed');
if ( entry.result.charAt(0) === 'm' ) { if ( entry.result.charAt(0) === 'm' ) {
@ -110,7 +119,7 @@ var renderLogEntry = function(entry) {
} }
tr.cells[0].textContent = ' +\u00A0'; tr.cells[0].textContent = ' +\u00A0';
} else { } else {
tr.cells[0].textContent = ' '; tr.cells[0].textContent = '';
} }
if ( entry.type === 'main_frame' ) { if ( entry.type === 'main_frame' ) {
tr.classList.add('maindoc'); tr.classList.add('maindoc');
@ -119,8 +128,8 @@ var renderLogEntry = function(entry) {
if ( entry.result.lastIndexOf('sa', 0) === 0 ) { if ( entry.result.lastIndexOf('sa', 0) === 0 ) {
filterText = '@@' + filterText; filterText = '@@' + filterText;
} }
tr.cells[1].textContent = filterText + ' '; tr.cells[1].textContent = filterText + '\t';
tr.cells[2].textContent = entry.type + ' '; tr.cells[2].textContent = (prettyRequestTypes[entry.type] || entry.type) + '\t';
vAPI.insertHTML(tr.cells[3], renderURL(entry.url, entry.result)); vAPI.insertHTML(tr.cells[3], renderURL(entry.url, entry.result));
applyFilterToRow(tr); applyFilterToRow(tr);
tbody.insertBefore(tr, tbody.firstChild); tbody.insertBefore(tr, tbody.firstChild);
@ -141,6 +150,11 @@ var renderLogBuffer = function(buffer) {
renderLogEntry(buffer[i]); renderLogEntry(buffer[i]);
} }
// Prevent logger from growing infinitely and eating all memory. For
// instance someone could forget that it is left opened for some
// dynamically refreshed pages.
truncateLog(maxEntries);
var yDelta = tbody.offsetHeight - height; var yDelta = tbody.offsetHeight - height;
if ( yDelta === 0 ) { if ( yDelta === 0 ) {
return; return;
@ -165,6 +179,18 @@ var renderLogBuffer = function(buffer) {
/******************************************************************************/ /******************************************************************************/
var truncateLog = function(size) {
if ( size === 0 ) {
size = 25000;
}
size = Math.min(size, 25000);
while ( tbody.childElementCount > size ) {
rowJunkyard.push(tbody.removeChild(tbody.lastElementChild));
}
};
/******************************************************************************/
var onBufferRead = function(buffer) { var onBufferRead = function(buffer) {
if ( Array.isArray(buffer) ) { if ( Array.isArray(buffer) ) {
renderLogBuffer(buffer); renderLogBuffer(buffer);
@ -200,7 +226,7 @@ var reloadTab = function() {
var applyFilterToRow = function(row) { var applyFilterToRow = function(row) {
var re = reFilter; var re = reFilter;
if ( re === null || re.test(row.textContent) ) { if ( re === null || re.test(row.textContent) === filterTargetTestResult ) {
row.classList.remove('hidden'); row.classList.remove('hidden');
} else { } else {
row.classList.add('hidden'); row.classList.add('hidden');
@ -219,8 +245,9 @@ var applyFilter = function() {
return; return;
} }
var re = reFilter; var re = reFilter;
var target = filterTargetTestResult;
while ( row !== null ) { while ( row !== null ) {
if ( re.test(row.textContent) ) { if ( re.test(row.textContent) === target ) {
row.classList.remove('hidden'); row.classList.remove('hidden');
} else { } else {
row.classList.add('hidden'); row.classList.add('hidden');
@ -251,25 +278,45 @@ var onFilterButton = function() {
/******************************************************************************/ /******************************************************************************/
var onFilterChanged = function() { var onFilterChanged = function() {
var filterRaw = uDom('#filterExpression').val().trim(); var filterExpression = uDom('#filterExpression');
var filterRaw = filterExpression.val().trim();
// Assume good filter expression
filterExpression.removeClass('bad');
// Invert resultset?
filterTargetTestResult = filterRaw.charAt(0) !== '!';
if ( filterTargetTestResult === false ) {
filterRaw = filterRaw.slice(1);
}
// No filter
if ( filterRaw === '') { if ( filterRaw === '') {
reFilter = null; reFilter = null;
unapplyFilter();
return; return;
} }
// Regex?
if ( filterRaw.length > 1 && filterRaw.charAt(0) === '/' && filterRaw.slice(-1) === '/' ) {
try {
reFilter = new RegExp(filterRaw.slice(1, -1));
} catch (e) {
reFilter = null;
filterExpression.addClass('bad');
}
return;
}
// Plain filtering
var filterParts = filterRaw var filterParts = filterRaw
.replace(/^\s*-(\s+|$)/, '\xA0') .replace(/^\s*-(\s+|$)/, '-\xA0 ')
.replace(/^\s*\\+(\s+|$)/, '\\+\xA0') .replace(/^\s*\\+(\s+|$)/, '+\xA0 ')
.split(/\s+/); .split(/[ \f\n\r\t\v]+/);
var n = filterParts.length; var n = filterParts.length;
for ( var i = 0; i < n; i++ ) { for ( var i = 0; i < n; i++ ) {
filterParts[i] = filterParts[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); filterParts[i] = filterParts[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
} }
reFilter = new RegExp(filterParts.join('.*\\s+.*')); reFilter = new RegExp(filterParts.join('.*\\s+.*'));
applyFilter();
}; };
/******************************************************************************/ /******************************************************************************/
@ -280,6 +327,7 @@ var onFilterChangedAsync = (function() {
var commit = function() { var commit = function() {
timer = null; timer = null;
onFilterChanged(); onFilterChanged();
applyFilter();
}; };
var changed = function() { var changed = function() {
@ -294,6 +342,28 @@ var onFilterChangedAsync = (function() {
/******************************************************************************/ /******************************************************************************/
var onMaxEntriesChanged = function() {
var raw = uDom(this).val();
try {
maxEntries = parseInt(raw, 10);
if ( isNaN(maxEntries) ) {
maxEntries = 0;
}
} catch (e) {
maxEntries = 0;
}
messager.send({
what: 'userSettings',
name: 'requestLogMaxEntries',
value: maxEntries
});
truncateLog(maxEntries);
};
/******************************************************************************/
uDom.onLoad(function() { uDom.onLoad(function() {
// Extract the tab id of the page we need to pull the log // Extract the tab id of the page we need to pull the log
var matches = window.location.search.match(/[\?&]tabId=([^&]+)/); var matches = window.location.search.match(/[\?&]tabId=([^&]+)/);
@ -301,12 +371,19 @@ uDom.onLoad(function() {
inspectedTabId = matches[1]; inspectedTabId = matches[1];
} }
var onSettingsReady = function(settings) {
maxEntries = settings.requestLogMaxEntries || 0;
uDom('#maxEntries').val(maxEntries || '');
};
messager.send({ what: 'getUserSettings' }, onSettingsReady);
readLogBuffer(); readLogBuffer();
uDom('#reload').on('click', reloadTab); uDom('#reload').on('click', reloadTab);
uDom('#clear').on('click', clearBuffer); uDom('#clear').on('click', clearBuffer);
uDom('#filterButton').on('click', onFilterButton); uDom('#filterButton').on('click', onFilterButton);
uDom('#filterExpression').on('input', onFilterChangedAsync); uDom('#filterExpression').on('input', onFilterChangedAsync);
uDom('#maxEntries').on('change', onMaxEntriesChanged);
}); });
/******************************************************************************/ /******************************************************************************/

View File

@ -26,6 +26,8 @@
µBlock.Firewall = (function() { µBlock.Firewall = (function() {
'use strict';
/******************************************************************************/ /******************************************************************************/
var magicId = 'chmdgxwtetgu'; var magicId = 'chmdgxwtetgu';
@ -148,11 +150,22 @@ Matrix.prototype.assign = function(other) {
Matrix.prototype.copyRules = function(other, srcHostname, desHostnames) { Matrix.prototype.copyRules = function(other, srcHostname, desHostnames) {
var thisRules = this.rules; var thisRules = this.rules;
var otherRules = other.rules; var otherRules = other.rules;
var ruleKey, ruleValue;
// Specific types // Specific types
thisRules['* *'] = otherRules['* *']; ruleValue = otherRules['* *'] || 0;
var ruleKey = srcHostname + ' *'; if ( ruleValue !== 0 ) {
thisRules[ruleKey] = otherRules[ruleKey]; thisRules['* *'] = ruleValue;
} else {
delete thisRules['* *'];
}
ruleKey = srcHostname + ' *';
ruleValue = otherRules[ruleKey] || 0;
if ( ruleValue !== 0 ) {
thisRules[ruleKey] = ruleValue;
} else {
delete thisRules[ruleKey];
}
// Specific destinations // Specific destinations
for ( var desHostname in desHostnames ) { for ( var desHostname in desHostnames ) {
@ -160,9 +173,19 @@ Matrix.prototype.copyRules = function(other, srcHostname, desHostnames) {
continue; continue;
} }
ruleKey = '* ' + desHostname; ruleKey = '* ' + desHostname;
thisRules[ruleKey] = otherRules[ruleKey]; ruleValue = otherRules[ruleKey] || 0;
if ( ruleValue !== 0 ) {
thisRules[ruleKey] = ruleValue;
} else {
delete thisRules[ruleKey];
}
ruleKey = srcHostname + ' ' + desHostname ; ruleKey = srcHostname + ' ' + desHostname ;
thisRules[ruleKey] = otherRules[ruleKey]; ruleValue = otherRules[ruleKey] || 0;
if ( ruleValue !== 0 ) {
thisRules[ruleKey] = ruleValue;
} else {
delete thisRules[ruleKey];
}
} }
return true; return true;

View File

@ -412,9 +412,9 @@ var elementsFromFilter = function(filter) {
// One idea is to normalize all a[href] on the page, but for now I will // One idea is to normalize all a[href] on the page, but for now I will
// wait and see, as I prefer to refrain from tampering with the page // wait and see, as I prefer to refrain from tampering with the page
// content if I can avoid it. // content if I can avoid it.
if ( filter.slice(0, 2) === '##' ) { if ( filter.lastIndexOf('##', 0) === 0 ) {
try { try {
out = document.querySelectorAll(filter.replace('##', '')); out = document.querySelectorAll(filter.slice(2));
} }
catch (e) { catch (e) {
} }
@ -423,16 +423,47 @@ var elementsFromFilter = function(filter) {
// Net filters: we need to lookup manually -- translating into a // Net filters: we need to lookup manually -- translating into a
// foolproof CSS selector is just not possible // foolproof CSS selector is just not possible
if ( filter.slice(0, 2) === '||' ) {
filter = filter.replace('||', ''); // https://github.com/gorhill/uBlock/issues/945
// Transform into a regular expression, this allows the user to edit and
// insert wildcard(s) into the proposed filter
var reStr = '';
if ( filter.length > 1 && filter.charAt(0) === '/' && filter.slice(-1) === '/' ) {
reStr = filter.slice(1, -1);
} }
var elems = document.querySelectorAll('iframe, img, object, embed'); else {
var rePrefix = '', reSuffix = '';
if ( filter.slice(0, 2) === '||' ) {
filter = filter.replace('||', '');
} else {
if ( filter.charAt(0) === '|' ) {
rePrefix = '^';
filter = filter.slice(1);
}
}
if ( filter.slice(-1) === '|' ) {
reSuffix = '$';
filter = filter.slice(0, -1);
}
reStr = rePrefix +
filter.replace(/[.+?${}()|[\]\\]/g, '\\$&').replace(/[\*^]+/g, '.*') +
reSuffix;
}
var reFilter = null;
try {
reFilter = new RegExp(reStr);
} catch (e) {
return out;
}
var props = netFilterSources;
var elems = document.querySelectorAll(Object.keys(props).join());
var i = elems.length; var i = elems.length;
var elem, src; var elem, src;
while ( i-- ) { while ( i-- ) {
elem = elems[i]; elem = elems[i];
src = elem[netFilterSources[elem.tagName.toLowerCase()]]; src = elem[props[elem.tagName.toLowerCase()]];
if ( src && src.indexOf(filter) !== -1 ) { if ( src && reFilter.test(src) ) {
out.push(elem); out.push(elem);
} }
} }
@ -452,14 +483,15 @@ var userFilterFromCandidate = function() {
} }
// Cosmetic filter? // Cosmetic filter?
if ( v.slice(0, 2) === '##' ) { if ( v.lastIndexOf('##', 0) === 0 ) {
return window.location.hostname + v; return window.location.hostname + v;
} }
// If domain included in filter, no need for domain option // If domain included in filter, no need for domain option
if ( v.slice(0, 2) === '||' ) { if ( v.lastIndexOf('||', 0) === 0 ) {
return v; return v;
} }
// Assume net filter // Assume net filter
return v + '$domain=' + window.location.hostname; return v + '$domain=' + window.location.hostname;
}; };
@ -529,7 +561,11 @@ var onDialogClicked = function(ev) {
else if ( ev.target.id === 'create' ) { else if ( ev.target.id === 'create' ) {
var filter = userFilterFromCandidate(); var filter = userFilterFromCandidate();
if ( filter ) { if ( filter ) {
localMessager.send({ what: 'createUserFilter', filters: filter }); var d = new Date();
localMessager.send({
what: 'createUserFilter',
filters: '! ' + d.toLocaleString() + ' ' + window.location.href + '\n' + filter,
});
removeElements(elementsFromFilter(taCandidate.value)); removeElements(elementsFromFilter(taCandidate.value));
stopPicker(); stopPicker();
} }

View File

@ -37,10 +37,7 @@ uDom.onLoad(function() {
} }
}); });
uDom('[placeholder]').forEach(function(elem) { uDom('[placeholder]').forEach(function(elem) {
var placeholder = vAPI.i18n(elem.attr('placeholder')); elem.attr('placeholder', vAPI.i18n(elem.attr('placeholder')));
if ( placeholder ) {
elem.attr('placeholder', placeholder);
}
}); });
uDom('[data-i18n-tip]').forEach(function(elem) { uDom('[data-i18n-tip]').forEach(function(elem) {
elem.attr( elem.attr(

View File

@ -961,24 +961,58 @@ var µb = µBlock;
/******************************************************************************/ /******************************************************************************/
var getUserData = function(callback) { var getLocalData = function(callback) {
var onUserFiltersReady = function(details) { var onStorageInfoReady = function(bytesInUse) {
var o = µb.restoreBackupSettings;
callback({ callback({
'timeStamp': Date.now(), storageUsed: bytesInUse,
'version': vAPI.app.version, lastRestoreFile: o.lastRestoreFile,
'userSettings': µb.userSettings, lastRestoreTime: o.lastRestoreTime,
'filterLists': µb.remoteBlacklists, lastBackupFile: o.lastBackupFile,
'netWhitelist': µb.stringFromWhitelist(µb.netWhitelist), lastBackupTime: o.lastBackupTime
'userFilters': details.content
}); });
}; };
µb.getBytesInUse(onStorageInfoReady);
};
/******************************************************************************/
var backupUserData = function(callback) {
var onUserFiltersReady = function(details) {
var userData = {
timeStamp: Date.now(),
version: vAPI.app.version,
userSettings: µb.userSettings,
filterLists: µb.remoteBlacklists,
netWhitelist: µb.stringFromWhitelist(µb.netWhitelist),
userFilters: details.content
};
var now = new Date();
var filename = vAPI.i18n('aboutBackupFilename')
.replace('{{datetime}}', now.toLocaleString())
.replace(/ +/g, '_');
vAPI.download({
'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')),
'filename': filename
});
µb.restoreBackupSettings.lastBackupFile = filename;
µb.restoreBackupSettings.lastBackupTime = Date.now();
µb.XAL.keyvalSetMany(µb.restoreBackupSettings);
getLocalData(callback);
};
µb.assets.get('assets/user/filters.txt', onUserFiltersReady); µb.assets.get('assets/user/filters.txt', onUserFiltersReady);
}; };
/******************************************************************************/ /******************************************************************************/
var restoreUserData = function(userData) { var restoreUserData = function(request) {
var countdown = 5; var userData = request.userData;
var countdown = 6;
var onCountdown = function() { var onCountdown = function() {
countdown -= 1; countdown -= 1;
if ( countdown === 0 ) { if ( countdown === 0 ) {
@ -994,6 +1028,13 @@ var restoreUserData = function(userData) {
µb.XAL.keyvalSetOne('remoteBlacklists', userData.filterLists, onCountdown); µb.XAL.keyvalSetOne('remoteBlacklists', userData.filterLists, onCountdown);
µb.XAL.keyvalSetOne('netWhitelist', userData.netWhitelist, onCountdown); µb.XAL.keyvalSetOne('netWhitelist', userData.netWhitelist, onCountdown);
µb.assets.put('assets/user/filters.txt', userData.userFilters, onCountdown); µb.assets.put('assets/user/filters.txt', userData.userFilters, onCountdown);
µb.XAL.keyvalSetMany({
lastRestoreFile: request.file || '',
lastRestoreTime: Date.now(),
lastBackupFile: '',
lastBackupTime: 0
}, onCountdown);
}; };
// If we are going to restore all, might as well wipe out clean local // If we are going to restore all, might as well wipe out clean local
@ -1006,7 +1047,7 @@ var restoreUserData = function(userData) {
var resetUserData = function() { var resetUserData = function() {
µb.XAL.keyvalRemoveAll(); µb.XAL.keyvalRemoveAll();
// Keep global counts, people can become quite attached to numbers // Keep global counts, people can become quite attached to numbers
µBlock.saveLocalSettings(); µb.saveLocalSettings();
vAPI.app.restart(); vAPI.app.restart();
}; };
@ -1015,8 +1056,11 @@ var resetUserData = function() {
var onMessage = function(request, sender, callback) { var onMessage = function(request, sender, callback) {
// Async // Async
switch ( request.what ) { switch ( request.what ) {
case 'getUserData': case 'backupUserData':
return getUserData(callback); return backupUserData(callback);
case 'getLocalData':
return getLocalData(callback);
default: default:
break; break;
@ -1027,7 +1071,7 @@ var onMessage = function(request, sender, callback) {
switch ( request.what ) { switch ( request.what ) {
case 'restoreUserData': case 'restoreUserData':
restoreUserData(request.userData); restoreUserData(request);
break; break;
case 'resetUserData': case 'resetUserData':

View File

@ -713,9 +713,10 @@ PageStore.prototype.logRequest = function(context, result) {
if ( requestHostname === '' ) { if ( requestHostname === '' ) {
requestHostname = context.pageHostname; requestHostname = context.pageHostname;
} }
var now = Date.now();
if ( this.hostnameToCountMap.hasOwnProperty(requestHostname) === false ) { if ( this.hostnameToCountMap.hasOwnProperty(requestHostname) === false ) {
this.hostnameToCountMap[requestHostname] = 0; this.hostnameToCountMap[requestHostname] = 0;
this.contentLastModified = Date.now(); this.contentLastModified = now;
} }
var c = result.charAt(1); var c = result.charAt(1);
if ( c === '' || c === 'a' ) { if ( c === '' || c === 'a' ) {
@ -727,6 +728,7 @@ PageStore.prototype.logRequest = function(context, result) {
this.perLoadBlockedRequestCount++; this.perLoadBlockedRequestCount++;
µb.localSettings.blockedRequestCount++; µb.localSettings.blockedRequestCount++;
} }
µb.localSettingsModifyTime = now;
this.logBuffer.writeOne(context, result); this.logBuffer.writeOne(context, result);
}; };

View File

@ -33,27 +33,16 @@ var messager = vAPI.messaging.channel('settings.js');
/******************************************************************************/ /******************************************************************************/
var exportToFile = function() {
var onUserDataReady = function(userData) {
if (!userData) {
return;
}
var now = new Date();
var filename = vAPI.i18n('aboutBackupFilename')
.replace('{{datetime}}', now.toLocaleString())
.replace(/ +/g, '_');
vAPI.download({
'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')),
'filename': filename
});
};
messager.send({ what: 'getUserData' }, onUserDataReady);
};
/******************************************************************************/
var handleImportFilePicker = function() { var handleImportFilePicker = function() {
var file = this.files[0];
if ( file === undefined || file.name === '' ) {
return;
}
if ( file.type.indexOf('text') !== 0 ) {
return;
}
var filename = file.name;
var fileReaderOnLoadHandler = function() { var fileReaderOnLoadHandler = function() {
var userData; var userData;
try { try {
@ -80,20 +69,17 @@ var handleImportFilePicker = function() {
} }
var time = new Date(userData.timeStamp); var time = new Date(userData.timeStamp);
var msg = vAPI.i18n('aboutRestoreDataConfirm') var msg = vAPI.i18n('aboutRestoreDataConfirm')
.replace('{{time}}', time.toLocaleString()); .replace('{{time}}', time.toLocaleString());
var proceed = window.confirm(msg); var proceed = window.confirm(msg);
if ( proceed ) { if ( proceed ) {
messager.send({ what: 'restoreUserData', userData: userData }); messager.send({
what: 'restoreUserData',
userData: userData,
file: filename
});
} }
}; };
var file = this.files[0];
if ( file === undefined || file.name === '' ) {
return;
}
if ( file.type.indexOf('text') !== 0 ) {
return;
}
var fr = new FileReader(); var fr = new FileReader();
fr.onload = fileReaderOnLoadHandler; fr.onload = fileReaderOnLoadHandler;
fr.readAsText(file); fr.readAsText(file);
@ -112,6 +98,47 @@ var startImportFilePicker = function() {
/******************************************************************************/ /******************************************************************************/
var exportToFile = function() {
messager.send({ what: 'backupUserData' }, onLocalDataReceived);
};
/******************************************************************************/
var onLocalDataReceived = function(details) {
uDom('#localData > ul > li:nth-of-type(1)').text(
vAPI.i18n('settingsStorageUsed').replace('{{value}}', details.storageUsed.toLocaleString())
);
var elem, dt;
var timeOptions = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
timeZoneName: 'short'
};
var lastBackupFile = details.lastBackupFile || '';
if ( lastBackupFile !== '' ) {
dt = new Date(details.lastBackupTime);
uDom('#localData > ul > li:nth-of-type(2) > ul > li:nth-of-type(1)').text(dt.toLocaleString('fullwide', timeOptions));
//uDom('#localData > ul > li:nth-of-type(2) > ul > li:nth-of-type(2)').text(lastBackupFile);
uDom('#localData > ul > li:nth-of-type(2)').css('display', '');
}
var lastRestoreFile = details.lastRestoreFile || '';
elem = uDom('#localData > p:nth-of-type(3)');
if ( lastRestoreFile !== '' ) {
dt = new Date(details.lastRestoreTime);
uDom('#localData > ul > li:nth-of-type(3) > ul > li:nth-of-type(1)').text(dt.toLocaleString('fullwide', timeOptions));
uDom('#localData > ul > li:nth-of-type(3) > ul > li:nth-of-type(2)').text(lastRestoreFile);
uDom('#localData > ul > li:nth-of-type(3)').css('display', '');
}
};
/******************************************************************************/
var resetUserData = function() { var resetUserData = function() {
var msg = vAPI.i18n('aboutResetDataConfirm'); var msg = vAPI.i18n('aboutResetDataConfirm');
var proceed = window.confirm(msg); var proceed = window.confirm(msg);
@ -175,6 +202,7 @@ var onUserSettingsReceived = function(details) {
uDom.onLoad(function() { uDom.onLoad(function() {
messager.send({ what: 'userSettings' }, onUserSettingsReceived); messager.send({ what: 'userSettings' }, onUserSettingsReceived);
messager.send({ what: 'getLocalData' }, onLocalDataReceived);
}); });
/******************************************************************************/ /******************************************************************************/

View File

@ -143,12 +143,6 @@ var onUserSettingsReady = function(fetched) {
/******************************************************************************/ /******************************************************************************/
var onLocalSettingsReady = function(fetched) {
fromFetch(µb.localSettings, fetched);
};
/******************************************************************************/
// Housekeeping, as per system setting changes // Housekeeping, as per system setting changes
var onSystemSettingsReady = function(fetched) { var onSystemSettingsReady = function(fetched) {
@ -170,11 +164,11 @@ var onSystemSettingsReady = function(fetched) {
/******************************************************************************/ /******************************************************************************/
var onFirstFetchReady = function(fetched) { var onFirstFetchReady = function(fetched) {
// Order is important -- do not change: // Order is important -- do not change:
onSystemSettingsReady(fetched); onSystemSettingsReady(fetched);
onLocalSettingsReady(fetched); fromFetch(µb.localSettings, fetched);
onUserSettingsReady(fetched); onUserSettingsReady(fetched);
fromFetch(µb.restoreBackupSettings, fetched);
onNetWhitelistReady(fetched.netWhitelist); onNetWhitelistReady(fetched.netWhitelist);
onVersionReady(fetched.version); onVersionReady(fetched.version);
@ -191,6 +185,10 @@ var onFirstFetchReady = function(fetched) {
var fetchableProps = { var fetchableProps = {
'compiledMagic': '', 'compiledMagic': '',
'lastRestoreFile': '',
'lastRestoreTime': 0,
'lastBackupFile': '',
'lastBackupTime': 0,
'netWhitelist': '', 'netWhitelist': '',
'selfie': null, 'selfie': null,
'selfieMagic': '', 'selfieMagic': '',
@ -222,6 +220,7 @@ var fromFetch = function(to, fetched) {
toFetch(µb.localSettings, fetchableProps); toFetch(µb.localSettings, fetchableProps);
toFetch(µb.userSettings, fetchableProps); toFetch(µb.userSettings, fetchableProps);
toFetch(µb.restoreBackupSettings, fetchableProps);
vAPI.storage.get(fetchableProps, onFirstFetchReady); vAPI.storage.get(fetchableProps, onFirstFetchReady);

View File

@ -22,13 +22,12 @@
/* jshint bitwise: false, esnext: true, boss: true */ /* jshint bitwise: false, esnext: true, boss: true */
/* global punycode, µBlock */ /* global punycode, µBlock */
// Older Safari throws an exception for const when it's used with 'use strict'.
// 'use strict';
/******************************************************************************/ /******************************************************************************/
µBlock.staticNetFilteringEngine = (function(){ µBlock.staticNetFilteringEngine = (function(){
'use strict';
/******************************************************************************/ /******************************************************************************/
var µb = µBlock; var µb = µBlock;
@ -45,17 +44,17 @@ var µb = µBlock;
// | +---- bit 8-15: unused // | +---- bit 8-15: unused
// +---- bit 15: never use! (to ensure valid unicode character) // +---- bit 15: never use! (to ensure valid unicode character)
const BlockAction = 0 << 0; var BlockAction = 0 << 0;
const AllowAction = 1 << 0; var AllowAction = 1 << 0;
const ToggleAction = BlockAction ^ AllowAction; var ToggleAction = BlockAction ^ AllowAction;
const Important = 1 << 1; var Important = 1 << 1;
const AnyParty = 0 << 2; var AnyParty = 0 << 2;
const FirstParty = 1 << 2; var FirstParty = 1 << 2;
const ThirdParty = 2 << 2; var ThirdParty = 2 << 2;
const AnyType = 1 << 4; var AnyType = 1 << 4;
var typeNameToTypeValue = { var typeNameToTypeValue = {
'stylesheet': 2 << 4, 'stylesheet': 2 << 4,
'image': 3 << 4, 'image': 3 << 4,
@ -80,13 +79,13 @@ var typeOtherValue = typeNameToTypeValue.other;
// The 2 lsb *must* be zeroed // The 2 lsb *must* be zeroed
var allNetRequestTypesBitmap = (1 << (typeOtherValue >>> 4) + 2) - 4; var allNetRequestTypesBitmap = (1 << (typeOtherValue >>> 4) + 2) - 4;
const BlockAnyTypeAnyParty = BlockAction | AnyType | AnyParty; var BlockAnyTypeAnyParty = BlockAction | AnyType | AnyParty;
const BlockAnyType = BlockAction | AnyType; var BlockAnyType = BlockAction | AnyType;
const BlockAnyParty = BlockAction | AnyParty; var BlockAnyParty = BlockAction | AnyParty;
const AllowAnyTypeAnyParty = AllowAction | AnyType | AnyParty; var AllowAnyTypeAnyParty = AllowAction | AnyType | AnyParty;
const AllowAnyType = AllowAction | AnyType; var AllowAnyType = AllowAction | AnyType;
const AllowAnyParty = AllowAction | AnyParty; var AllowAnyParty = AllowAction | AnyParty;
var reHostnameRule = /^[0-9a-z][0-9a-z.-]*[0-9a-z]$/; var reHostnameRule = /^[0-9a-z][0-9a-z.-]*[0-9a-z]$/;
var reURLPostHostnameAnchors = /[\/?#]/; var reURLPostHostnameAnchors = /[\/?#]/;
@ -166,10 +165,18 @@ var isFirstParty = function(firstPartyDomain, hostname) {
return c === '.' || c === ''; return c === '.' || c === '';
}; };
var strToRegex = function(prefix, s) { // https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
var reStr = s.replace(/([.+?^=!:${}()|\[\]\/\\])/g, '\\$1')
var strToRegex = function(s, anchor) {
var reStr = s.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
.replace(/\*/g, '.*'); .replace(/\*/g, '.*');
return new RegExp(prefix + reStr); if ( anchor < 0 ) {
reStr = '^' + reStr;
} else if ( anchor > 0 ) {
reStr += reStr + '$';
}
//console.debug('µBlock.staticNetFilteringEngine: created RegExp("%s")', reStr);
return new RegExp(reStr);
}; };
/******************************************************************************* /*******************************************************************************
@ -190,33 +197,13 @@ Filters family tree:
- no hostname - no hostname
- specific hostname (not implemented) - specific hostname (not implemented)
- one wildcard - with wildcard(s)
- anywhere
- no hostname
- specific hostname
- anchored at start
- no hostname
- specific hostname
- anchored at end
- no hostname
- specific hostname
- anchored within hostname - anchored within hostname
- no hostname (not implemented)
- specific hostname (not implemented)
- more than one wildcard
- anywhere
- no hostname - no hostname
- specific hostname - specific hostname
- anchored at start - all else
- no hostname - no hostname
- specific hostname - specific hostname
- anchored at end
- no hostname
- specific hostname
- anchored within hostname
- no hostname (not implemented)
- specific hostname (not implemented)
*/ */
@ -546,7 +533,7 @@ FilterPlainHnAnchored.prototype.match = function(url, tokenBeg) {
reURLPostHostnameAnchors.test(url.slice(pos + 3, tokenBeg)) === false; reURLPostHostnameAnchors.test(url.slice(pos + 3, tokenBeg)) === false;
}; };
FilterPlainHnAnchored.fid = FilterPlainHnAnchored.prototype.fid = 'h|a'; FilterPlainHnAnchored.fid = FilterPlainHnAnchored.prototype.fid = '||a';
FilterPlainHnAnchored.prototype.toString = function() { FilterPlainHnAnchored.prototype.toString = function() {
return '||' + this.s; return '||' + this.s;
@ -568,310 +555,81 @@ FilterPlainHnAnchored.fromSelfie = function(s) {
/******************************************************************************/ /******************************************************************************/
// With a single wildcard, regex is not optimal. // Generic filter
// See:
// http://jsperf.com/regexp-vs-indexof-abp-miss/5
// http://jsperf.com/regexp-vs-indexof-abp-hit/4
var FilterSingleWildcard = function(lSegment, rSegment, tokenBeg) { var FilterGeneric = function(s, anchor) {
this.tokenBeg = tokenBeg; this.s = s;
this.lSegment = lSegment; this.anchor = anchor;
this.rSegment = rSegment; this.re = null;
}; };
FilterSingleWildcard.prototype.match = function(url, tokenBeg) { FilterGeneric.prototype.match = function(url) {
tokenBeg -= this.tokenBeg; if ( this.re === null ) {
return url.substr(tokenBeg, this.lSegment.length) === this.lSegment && this.re = strToRegex(this.s, this.anchor);
url.indexOf(this.rSegment, tokenBeg + this.lSegment.length) > 0; }
return this.re.test(url);
}; };
FilterSingleWildcard.fid = FilterSingleWildcard.prototype.fid = '*'; FilterGeneric.fid = FilterGeneric.prototype.fid = '_';
FilterSingleWildcard.prototype.toString = function() { FilterGeneric.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment; if ( this.anchor === 0 ) {
return this.s;
}
if ( this.anchor < 0 ) {
return '|' + this.s;
}
return this.s + '|';
}; };
FilterSingleWildcard.prototype.toSelfie = function() { FilterGeneric.prototype.toSelfie = function() {
return this.lSegment + '\t' + return this.s + '\t' + this.anchor;
this.rSegment + '\t' +
this.tokenBeg;
}; };
FilterSingleWildcard.compile = function(details) { FilterGeneric.compile = function(details) {
var s = details.f; return details.f + '\t' + details.anchor;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1) + '\t' +
details.tokenBeg;
}; };
FilterSingleWildcard.fromSelfie = function(s) { FilterGeneric.fromSelfie = function(s) {
var args = s.split('\t');
return new FilterSingleWildcard(args[0], args[1], atoi(args[2]));
};
/******************************************************************************/
var FilterSingleWildcardHostname = function(lSegment, rSegment, tokenBeg, hostname) {
this.tokenBeg = tokenBeg;
this.lSegment = lSegment;
this.rSegment = rSegment;
this.hostname = hostname;
};
FilterSingleWildcardHostname.prototype.match = function(url, tokenBeg) {
tokenBeg -= this.tokenBeg;
return pageHostnameRegister.slice(-this.hostname.length) === this.hostname &&
url.substr(tokenBeg, this.lSegment.length) === this.lSegment &&
url.indexOf(this.rSegment, tokenBeg + this.lSegment.length) > 0;
};
FilterSingleWildcardHostname.fid = FilterSingleWildcardHostname.prototype.fid = '*h';
FilterSingleWildcardHostname.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment + '$domain=' + this.hostname;
};
FilterSingleWildcardHostname.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment + '\t' +
this.tokenBeg + '\t' +
this.hostname;
};
FilterSingleWildcardHostname.compile = function(details, hostname) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1) + '\t' +
details.tokenBeg + '\t' +
hostname;
};
FilterSingleWildcardHostname.fromSelfie = function(s) {
var args = s.split('\t');
return new FilterSingleWildcardHostname(args[0], args[1], atoi(args[2]), args[3]);
};
/******************************************************************************/
var FilterSingleWildcardPrefix0 = function(lSegment, rSegment) {
this.lSegment = lSegment;
this.rSegment = rSegment;
};
FilterSingleWildcardPrefix0.prototype.match = function(url, tokenBeg) {
return url.substr(tokenBeg, this.lSegment.length) === this.lSegment &&
url.indexOf(this.rSegment, tokenBeg + this.lSegment.length) > 0;
};
FilterSingleWildcardPrefix0.fid = FilterSingleWildcardPrefix0.prototype.fid = '0*';
FilterSingleWildcardPrefix0.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment;
};
FilterSingleWildcardPrefix0.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment;
};
FilterSingleWildcardPrefix0.compile = function(details) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' + s.slice(pos + 1);
};
FilterSingleWildcardPrefix0.fromSelfie = function(s) {
var pos = s.indexOf('\t'); var pos = s.indexOf('\t');
return new FilterSingleWildcardPrefix0(s.slice(0, pos), s.slice(pos + 1)); return new FilterGeneric(s.slice(0, pos), parseInt(s.slice(pos + 1), 10));
}; };
/******************************************************************************/ /******************************************************************************/
var FilterSingleWildcardPrefix0Hostname = function(lSegment, rSegment, hostname) { // Generic filter
this.lSegment = lSegment;
this.rSegment = rSegment; var FilterGenericHostname = function(s, anchor, hostname) {
FilterGeneric.call(this, s, anchor);
this.hostname = hostname; this.hostname = hostname;
}; };
FilterGenericHostname.prototype = Object.create(FilterGeneric.prototype);
FilterGenericHostname.prototype.constructor = FilterGenericHostname;
FilterSingleWildcardPrefix0Hostname.prototype.match = function(url, tokenBeg) { FilterGenericHostname.prototype.match = function(url) {
return pageHostnameRegister.slice(-this.hostname.length) === this.hostname && if ( pageHostnameRegister.slice(-this.hostname.length) !== this.hostname ) {
url.substr(tokenBeg, this.lSegment.length) === this.lSegment && return false;
url.indexOf(this.rSegment, tokenBeg + this.lSegment.length) > 0; }
return FilterGeneric.prototype.match.call(this, url);
}; };
FilterSingleWildcardPrefix0Hostname.fid = FilterSingleWildcardPrefix0Hostname.prototype.fid = '0*h'; FilterGenericHostname.fid = FilterGenericHostname.prototype.fid = '_h';
FilterSingleWildcardPrefix0Hostname.prototype.toString = function() { FilterGenericHostname.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment + '$domain=' + this.hostname; return FilterGeneric.prototype.toString.call(this) + '$domain=' + this.hostname;
}; };
FilterSingleWildcardPrefix0Hostname.prototype.toSelfie = function() { FilterGenericHostname.prototype.toSelfie = function() {
return this.lSegment + '\t' + return FilterGeneric.prototype.toSelfie.call(this) + '\t' + this.hostname;
this.rSegment + '\t' +
this.hostname;
}; };
FilterSingleWildcardPrefix0Hostname.compile = function(details, hostname) { FilterGenericHostname.compile = function(details, hostname) {
var s = details.f; return FilterGeneric.compile(details) + '\t' + hostname;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1) + '\t' +
hostname;
}; };
FilterSingleWildcardPrefix0Hostname.fromSelfie = function(s) { FilterGenericHostname.fromSelfie = function(s) {
var args = s.split('\t'); var fields = s.split('\t');
return new FilterSingleWildcardPrefix0Hostname(args[0], args[1], args[2]); return new FilterGenericHostname(fields[0], parseInt(fields[1], 10), fields[2]);
};
/******************************************************************************/
var FilterSingleWildcardLeftAnchored = function(lSegment, rSegment) {
this.lSegment = lSegment;
this.rSegment = rSegment;
};
FilterSingleWildcardLeftAnchored.prototype.match = function(url) {
return url.slice(0, this.lSegment.length) === this.lSegment &&
url.indexOf(this.rSegment, this.lSegment.length) > 0;
};
FilterSingleWildcardLeftAnchored.fid = FilterSingleWildcardLeftAnchored.prototype.fid = '|*';
FilterSingleWildcardLeftAnchored.prototype.toString = function() {
return '|' + this.lSegment + '*' + this.rSegment;
};
FilterSingleWildcardLeftAnchored.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment;
};
FilterSingleWildcardLeftAnchored.compile = function(details) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1);
};
FilterSingleWildcardLeftAnchored.fromSelfie = function(s) {
var pos = s.indexOf('\t');
return new FilterSingleWildcardLeftAnchored(s.slice(0, pos), s.slice(pos + 1));
};
/******************************************************************************/
var FilterSingleWildcardLeftAnchoredHostname = function(lSegment, rSegment, hostname) {
this.lSegment = lSegment;
this.rSegment = rSegment;
this.hostname = hostname;
};
FilterSingleWildcardLeftAnchoredHostname.prototype.match = function(url) {
return pageHostnameRegister.slice(-this.hostname.length) === this.hostname &&
url.slice(0, this.lSegment.length) === this.lSegment &&
url.indexOf(this.rSegment, this.lSegment.length) > 0;
};
FilterSingleWildcardLeftAnchoredHostname.fid = FilterSingleWildcardLeftAnchoredHostname.prototype.fid = '|*h';
FilterSingleWildcardLeftAnchoredHostname.prototype.toString = function() {
return '|' + this.lSegment + '*' + this.rSegment + '$domain=' + this.hostname;
};
FilterSingleWildcardLeftAnchoredHostname.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment + '\t' +
this.hostname;
};
FilterSingleWildcardLeftAnchoredHostname.compile = function(details, hostname) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1) + '\t' +
hostname;
};
FilterSingleWildcardLeftAnchoredHostname.fromSelfie = function(s) {
var args = s.split('\t');
return new FilterSingleWildcardLeftAnchoredHostname(args[0], args[1], args[2]);
};
/******************************************************************************/
var FilterSingleWildcardRightAnchored = function(lSegment, rSegment) {
this.lSegment = lSegment;
this.rSegment = rSegment;
};
FilterSingleWildcardRightAnchored.prototype.match = function(url) {
return url.slice(-this.rSegment.length) === this.rSegment &&
url.lastIndexOf(this.lSegment, url.length - this.rSegment.length - this.lSegment.length) >= 0;
};
FilterSingleWildcardRightAnchored.fid = FilterSingleWildcardRightAnchored.prototype.fid = '*|';
FilterSingleWildcardRightAnchored.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment + '|';
};
FilterSingleWildcardRightAnchored.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment;
};
FilterSingleWildcardRightAnchored.compile = function(details) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1);
};
FilterSingleWildcardRightAnchored.fromSelfie = function(s) {
var pos = s.indexOf('\t');
return new FilterSingleWildcardRightAnchored(s.slice(0, pos), s.slice(pos + 1));
};
/******************************************************************************/
var FilterSingleWildcardRightAnchoredHostname = function(lSegment, rSegment, hostname) {
this.lSegment = lSegment;
this.rSegment = rSegment;
this.hostname = hostname;
};
FilterSingleWildcardRightAnchoredHostname.prototype.match = function(url) {
return pageHostnameRegister.slice(-this.hostname.length) === this.hostname &&
url.slice(-this.rSegment.length) === this.rSegment &&
url.lastIndexOf(this.lSegment, url.length - this.rSegment.length - this.lSegment.length) >= 0;
};
FilterSingleWildcardRightAnchoredHostname.fid = FilterSingleWildcardRightAnchoredHostname.prototype.fid = '*|h';
FilterSingleWildcardRightAnchoredHostname.prototype.toString = function() {
return this.lSegment + '*' + this.rSegment + '|$domain=' + this.hostname;
};
FilterSingleWildcardRightAnchoredHostname.prototype.toSelfie = function() {
return this.lSegment + '\t' +
this.rSegment + '\t' +
this.hostname;
};
FilterSingleWildcardRightAnchoredHostname.compile = function(details, hostname) {
var s = details.f;
var pos = s.indexOf('*');
return s.slice(0, pos) + '\t' +
s.slice(pos + 1) + '\t' +
hostname;
};
FilterSingleWildcardRightAnchoredHostname.fromSelfie = function(s) {
var args = s.split('\t');
return new FilterSingleWildcardRightAnchoredHostname(args[0], args[1], args[2]);
}; };
/******************************************************************************/ /******************************************************************************/
@ -887,7 +645,7 @@ var FilterGenericHnAnchored = function(s) {
FilterGenericHnAnchored.prototype.match = function(url) { FilterGenericHnAnchored.prototype.match = function(url) {
if ( this.re === null ) { if ( this.re === null ) {
this.re = strToRegex('', this.s); this.re = strToRegex(this.s, 0);
} }
// Quick test first // Quick test first
if ( this.re.test(url) === false ) { if ( this.re.test(url) === false ) {
@ -926,12 +684,13 @@ var FilterGenericHnAnchoredHostname = function(s, hostname) {
this.hostname = hostname; this.hostname = hostname;
}; };
FilterGenericHnAnchoredHostname.prototype = Object.create(FilterGenericHnAnchored.prototype); FilterGenericHnAnchoredHostname.prototype = Object.create(FilterGenericHnAnchored.prototype);
FilterGenericHnAnchoredHostname.prototype.constructor = FilterGenericHnAnchoredHostname;
FilterGenericHnAnchoredHostname.prototype.match = function(url) { FilterGenericHnAnchoredHostname.prototype.match = function(url) {
if ( pageHostnameRegister.slice(-this.hostname.length) !== this.hostname ) { if ( pageHostnameRegister.slice(-this.hostname.length) !== this.hostname ) {
return false; return false;
} }
return FilterGenericHnAnchored.prototype.match.call(this. url); return FilterGenericHnAnchored.prototype.match.call(this, url);
}; };
FilterGenericHnAnchoredHostname.fid = FilterGenericHnAnchoredHostname.prototype.fid = '||_h'; FilterGenericHnAnchoredHostname.fid = FilterGenericHnAnchoredHostname.prototype.fid = '||_h';
@ -955,88 +714,6 @@ FilterGenericHnAnchoredHostname.fromSelfie = function(s) {
/******************************************************************************/ /******************************************************************************/
// With many wildcards, a regex is best.
// Ref: regex escaper taken from:
// https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
// modified for the purpose here.
var FilterManyWildcards = function(s, tokenBeg) {
this.s = s;
this.tokenBeg = tokenBeg;
this.re = null;
};
FilterManyWildcards.prototype.match = function(url, tokenBeg) {
if ( this.re === null ) {
this.re = strToRegex('^', this.s);
}
return this.re.test(url.slice(tokenBeg - this.tokenBeg));
};
FilterManyWildcards.fid = FilterManyWildcards.prototype.fid = '*+';
FilterManyWildcards.prototype.toString = function() {
return this.s;
};
FilterManyWildcards.prototype.toSelfie = function() {
return this.s + '\t' + this.tokenBeg;
};
FilterManyWildcards.compile = function(details) {
return details.f + '\t' + details.tokenBeg;
};
FilterManyWildcards.fromSelfie = function(s) {
var pos = s.indexOf('\t');
return new FilterManyWildcards(s.slice(0, pos), atoi(s.slice(pos + 1)));
};
/******************************************************************************/
var FilterManyWildcardsHostname = function(s, tokenBeg, hostname) {
this.s = s;
this.tokenBeg = tokenBeg;
this.re = null;
this.hostname = hostname;
};
FilterManyWildcardsHostname.prototype.match = function(url, tokenBeg) {
if ( pageHostnameRegister.slice(-this.hostname.length) !== this.hostname ) {
return false;
}
if ( this.re === null ) {
this.re = strToRegex('^', this.s);
}
return this.re.test(url.slice(tokenBeg - this.tokenBeg));
};
FilterManyWildcardsHostname.fid = FilterManyWildcardsHostname.prototype.fid = '*+h';
FilterManyWildcardsHostname.prototype.toString = function() {
return this.s + '$domain=' + this.hostname;
};
FilterManyWildcardsHostname.prototype.toSelfie = function() {
return this.s + '\t' +
this.tokenBeg + '\t' +
this.hostname;
};
FilterManyWildcardsHostname.compile = function(details, hostname) {
return details.f + '\t' +
details.tokenBeg + '\t' +
hostname;
};
FilterManyWildcardsHostname.fromSelfie = function(s) {
var args = s.split('\t');
return new FilterManyWildcardsHostname(args[0], atoi(args[1]), args[2]);
};
/******************************************************************************/
// Regex-based filters // Regex-based filters
var FilterRegex = function(s) { var FilterRegex = function(s) {
@ -1405,24 +1082,11 @@ var getFilterClass = function(details) {
return FilterRegex; return FilterRegex;
} }
var s = details.f; var s = details.f;
var wcOffset = s.indexOf('*'); if ( s.indexOf('*') !== -1 ) {
if ( wcOffset !== -1 ) {
if ( details.hostnameAnchored ) { if ( details.hostnameAnchored ) {
return FilterGenericHnAnchored; return FilterGenericHnAnchored;
} }
if ( s.indexOf('*', wcOffset + 1) !== -1 ) { return FilterGeneric;
return details.anchor === 0 ? FilterManyWildcards : null;
}
if ( details.anchor < 0 ) {
return FilterSingleWildcardLeftAnchored;
}
if ( details.anchor > 0 ) {
return FilterSingleWildcardRightAnchored;
}
if ( details.tokenBeg === 0 ) {
return FilterSingleWildcardPrefix0;
}
return FilterSingleWildcard;
} }
if ( details.anchor < 0 ) { if ( details.anchor < 0 ) {
return FilterPlainLeftAnchored; return FilterPlainLeftAnchored;
@ -1449,24 +1113,11 @@ var getHostnameBasedFilterClass = function(details) {
return FilterRegexHostname; return FilterRegexHostname;
} }
var s = details.f; var s = details.f;
var wcOffset = s.indexOf('*'); if ( s.indexOf('*') !== -1 ) {
if ( wcOffset !== -1 ) {
if ( details.hostnameAnchored ) { if ( details.hostnameAnchored ) {
return FilterGenericHnAnchoredHostname; return FilterGenericHnAnchoredHostname;
} }
if ( s.indexOf('*', wcOffset + 1) !== -1 ) { return FilterGenericHostname;
return details.anchor === 0 ? FilterManyWildcardsHostname : null;
}
if ( details.anchor < 0 ) {
return FilterSingleWildcardLeftAnchoredHostname;
}
if ( details.anchor > 0 ) {
return FilterSingleWildcardRightAnchoredHostname;
}
if ( details.tokenBeg === 0 ) {
return FilterSingleWildcardPrefix0Hostname;
}
return FilterSingleWildcardHostname;
} }
if ( details.anchor < 0 ) { if ( details.anchor < 0 ) {
return FilterPlainLeftAnchoredHostname; return FilterPlainLeftAnchoredHostname;
@ -1860,6 +1511,7 @@ FilterContainer.prototype.reset = function() {
this.duplicateBuster = {}; this.duplicateBuster = {};
this.categories = Object.create(null); this.categories = Object.create(null);
this.filterParser.reset(); this.filterParser.reset();
this.filterCounts = {};
}; };
/******************************************************************************/ /******************************************************************************/
@ -1895,20 +1547,12 @@ FilterContainer.prototype.factories = {
'|ah': FilterPlainLeftAnchoredHostname, '|ah': FilterPlainLeftAnchoredHostname,
'a|': FilterPlainRightAnchored, 'a|': FilterPlainRightAnchored,
'a|h': FilterPlainRightAnchoredHostname, 'a|h': FilterPlainRightAnchoredHostname,
'h|a': FilterPlainHnAnchored, '||a': FilterPlainHnAnchored,
'*': FilterSingleWildcard,
'*h': FilterSingleWildcardHostname,
'0*': FilterSingleWildcardPrefix0,
'0*h': FilterSingleWildcardPrefix0Hostname,
'|*': FilterSingleWildcardLeftAnchored,
'|*h': FilterSingleWildcardLeftAnchoredHostname,
'*|': FilterSingleWildcardRightAnchored,
'*|h': FilterSingleWildcardRightAnchoredHostname,
'*+': FilterManyWildcards,
'*+h': FilterManyWildcardsHostname,
'//': FilterRegex, '//': FilterRegex,
'//h': FilterRegexHostname, '//h': FilterRegexHostname,
'{h}': FilterHostnameDict, '{h}': FilterHostnameDict,
'_': FilterGeneric,
'_h': FilterGenericHostname,
'||_': FilterGenericHnAnchored, '||_': FilterGenericHnAnchored,
'||_h': FilterGenericHnAnchoredHostname '||_h': FilterGenericHnAnchoredHostname
}; };
@ -2240,6 +1884,14 @@ FilterContainer.prototype.fromCompiledContent = function(text, lineBeg) {
this.duplicateBuster[line] = true; this.duplicateBuster[line] = true;
factory = this.factories[fields[2]]; factory = this.factories[fields[2]];
// For development purpose
//if ( this.filterCounts.hasOwnProperty(fields[2]) === false ) {
// this.filterCounts[fields[2]] = 1;
//} else {
// this.filterCounts[fields[2]]++;
//}
filter = factory.fromSelfie(fields[3]); filter = factory.fromSelfie(fields[3]);
if ( entry === undefined ) { if ( entry === undefined ) {
bucket[fields[1]] = filter; bucket[fields[1]] = filter;

View File

@ -25,9 +25,13 @@
/******************************************************************************/ /******************************************************************************/
µBlock.getBytesInUse = function() { µBlock.getBytesInUse = function(callback) {
if ( typeof callback !== 'function' ) {
callback = this.noopFunc;
}
var getBytesInUseHandler = function(bytesInUse) { var getBytesInUseHandler = function(bytesInUse) {
µBlock.storageUsed = bytesInUse; µBlock.storageUsed = bytesInUse;
callback(bytesInUse);
}; };
vAPI.storage.getBytesInUse(null, getBytesInUseHandler); vAPI.storage.getBytesInUse(null, getBytesInUseHandler);
}; };
@ -38,6 +42,11 @@
if ( typeof callback !== 'function' ) { if ( typeof callback !== 'function' ) {
callback = this.noopFunc; callback = this.noopFunc;
} }
if ( this.localSettingsModifyTime <= this.localSettingsSaveTime ) {
callback();
return;
}
this.localSettingsSaveTime = Date.now();
vAPI.storage.set(this.localSettings, callback); vAPI.storage.set(this.localSettings, callback);
}; };
@ -124,7 +133,7 @@
if ( details.content.indexOf(content.trim()) !== -1 ) { if ( details.content.indexOf(content.trim()) !== -1 ) {
return; return;
} }
µb.saveUserFilters(details.content.trim() + '\n' + content.trim(), onSaved); µb.saveUserFilters(details.content.trim() + '\n\n' + content.trim(), onSaved);
}; };
this.loadUserFilters(onLoaded); this.loadUserFilters(onLoaded);

View File

@ -7,9 +7,21 @@
<link rel="stylesheet" type="text/css" href="css/dashboard-common.css"> <link rel="stylesheet" type="text/css" href="css/dashboard-common.css">
<style> <style>
ul { ul {
list-style-type: none;
padding-left: 1em; padding-left: 1em;
} }
li {
margin-top: 0.25em;
}
ul#userSettings {
list-style-type: none;
}
#localData > ul > li {
margin-top: 1em;
}
#localData > ul > li > ul > li:nth-of-type(2) {
font-family: monospace;
font-size: small;
}
#experimental-enabled { #experimental-enabled {
margin-top: 1em; margin-top: 1em;
} }
@ -18,24 +30,35 @@ ul {
<body> <body>
<ul> <ul id="userSettings">
<li><input id="collapse-blocked" type="checkbox"><label data-i18n="settingsCollapseBlockedPrompt" for="collapse-blocked"></label> <li><input id="collapse-blocked" type="checkbox"><label data-i18n="settingsCollapseBlockedPrompt" for="collapse-blocked"></label>
<li><input id="icon-badge" type="checkbox"><label data-i18n="settingsIconBadgePrompt" for="icon-badge"></label> <li><input id="icon-badge" type="checkbox"><label data-i18n="settingsIconBadgePrompt" for="icon-badge"></label>
<li><input id="context-menu-enabled" type="checkbox"><label data-i18n="settingsContextMenuPrompt" for="context-menu-enabled"></label> <li><input id="context-menu-enabled" type="checkbox"><label data-i18n="settingsContextMenuPrompt" for="context-menu-enabled"></label>
<li><input id="advanced-user-enabled" type="checkbox"><label data-i18n="settingsAdvancedUserPrompt" for="advanced-user-enabled"></label> <li><input id="advanced-user-enabled" type="checkbox"><label data-i18n="settingsAdvancedUserPrompt" for="advanced-user-enabled"></label>
<!-- <li><input id="experimental-enabled" type="checkbox" disabled><label data-i18n="settingsExperimentalPrompt" for="experimental-enabled"></label> --> <!-- <li><input id="experimental-enabled" type="checkbox" disabled><label data-i18n="settingsExperimentalPrompt" for="experimental-enabled"></label> -->
</ul> </ul>
<div style="margin:3em 0;border-top:1px solid #ccc;"></div> <div id="localData" style="margin: 0 1em;">
<div style="margin: 2.5em 0; border-top: 1px solid #ccc;"></div>
<ul>
<li>
<li style="display: none;"><span data-i18n="settingsLastBackupPrompt"></span><ul>
<li>
</ul>
<li style="display: none;"><span data-i18n="settingsLastRestorePrompt"></span><ul>
<li>
<li>
</ul>
</ul>
</div>
<div style="margin:1em 0 0 1em;"> <div style="margin: 2.5em 1em;">
<p><button type="button" id="export" data-i18n="aboutBackupDataButton"></button>&ensp; <p><button type="button" id="export" data-i18n="aboutBackupDataButton"></button>&ensp;
<button type="button" id="import" data-i18n="aboutRestoreDataButton"></button> <button type="button" id="import" data-i18n="aboutRestoreDataButton"></button>
<input id="restoreFilePicker" type="file" accept="text/plain" class="hiddenFileInput"> <input id="restoreFilePicker" type="file" accept="text/plain" class="hiddenFileInput">
<p> <p>
<p><button type="button" id="reset" data-i18n="aboutResetDataButton"></button> <p><button type="button" id="reset" data-i18n="aboutResetDataButton"></button>
</div> </div>
<script src="js/vapi-common.js"></script> <script src="js/vapi-common.js"></script>
<script src="js/vapi-client.js"></script> <script src="js/vapi-client.js"></script>