Add checkboxes to "My filters" pane

Related issues:
- https://github.com/uBlockOrigin/uBlock-issues/issues/3161
- https://github.com/uBlockOrigin/uBlock-issues/discussions/2895#discussioncomment-8504374

Two checkboxes have been added to the "My filters "pane:

1. A checkbox to wholly disable/enable "My filters". This is equivalent
   to the checkbox for "My filters" in "Filter lists" pane.

2. A checkbox to enable/disable the trustworthiness of the content
   of "My filters". Default to untrusted.

Since toggling these checkboxes requires reloading all filter lists,
their new state must be committed through the "Apply changes" button.

Additionally: a "book" icon has been added to the top-right of the
dashboard, which is a link to the wiki according to whichever pane is
currently active.
This commit is contained in:
Raymond Hill 2024-03-11 11:39:31 -04:00
parent 640eaf89d0
commit 46ea5519c1
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
92 changed files with 886 additions and 465 deletions

View file

@ -22,15 +22,16 @@
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="myFiltersPane"></div>
<p><span data-i18n="1pTrustWarning"></span>&ensp;<span class="vverbose"><span data-i18n="1pFormatHint"></span>&thinsp;<a class="fa-icon info" href="https://github.com/gorhill/uBlock/wiki/Dashboard:-My-filters" target="_blank">question-circle</a></span></p>
<p>
<button id="userFiltersApply" class="preferred iconified" type="button" disabled><span class="fa-icon">check</span><span data-i18n="1pApplyChanges">_</span><span class="hover"></span></button>
<button id="userFiltersRevert" class="iconified" type="button" disabled><span class="fa-icon">undo</span><span data-i18n="genericRevert">_</span><span class="hover"></span></button>
&ensp;
&emsp;
<button id="importUserFiltersFromFile" class="iconified" type="button"><span class="fa-icon">download-alt</span><span data-i18n="1pImport">_</span><span class="hover"></span></button>
<button id="exportUserFiltersToFile" class="iconified" type="button"><span class="fa-icon">upload-alt</span><span data-i18n="1pExport">_</span><span class="hover"></span></button>
</p>
<p data-i18n="1pTrustWarning"></p>
<div class="li"><label><span id="enableMyFilters" class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pEnableMyFiltersLabel"></span></label></div>
<div id="trustMyFilters" class="li"><label><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pTrustMyFiltersLabel"></span></label></div>
</div>
<div id="userFilters" class="codeMirrorContainer codeMirrorBreakAll cm-theme-override" spellcheck="false"></div>
<div class="hidden">

View file

@ -17,10 +17,10 @@
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="tpFiltersPane"></div>
<div id="actions">
<p id="actions">
<button id="buttonApply" class="preferred disabled iconified dontshrink" type="button" data-i18n-title="3pApplyChanges"><span class="fa-icon">check</span><span data-i18n="3pApplyChanges">_</span><span class="hover"></span></button>
<button id="buttonUpdate" class="preferred disabled iconified" type="button" data-i18n-title="3pUpdateNow"><span class="fa-icon">refresh</span><span data-i18n="3pUpdateNow">_</span><span class="hover"></span></button>
</div>
</p>
<div>
<div class="li">

View file

@ -535,14 +535,18 @@
"message": "حدث خطأ في الشبكة منع تحديث المورد.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "فلتر واحد في كل سطر. يمكن ان يكون الفلتر رابط موقع او فلتر متوافق مع EasyList-compatible. السطور المسبوقة بـ<code>!</code> سوف يتم تجاهلها.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "لا تضف مرشحات من مصادر غير موثوقة.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "استيراد و إضافة",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Şəbəkə xətası üzündən yeniləmə mümkün olmadı.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Hər sətirdə yalnız bir filtr. Bu, ya domen adı, ya da Adblock Plus formatında yazılmış filtr ola bilər. Əvvəli <code>!</code> ilə başlayan sətirlər nəzərə alınmayacaqdır.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Etibarsız mənbələrdən filtrlər əlavə etməyin.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "İdxal və əlavə et",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Памылка сеткі не дазволіла абнавіць рэсурс.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Адзін фільтр на радок. Фільтрам можа быць адрас сайта або сумяшчальны з EasyList фільтр. Радкі, што пачынаюцца з <code>!</code>, будуць праігнараваны.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Не дадавайце фільтры з крыніц, якім не давяраеце.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Імпартаваць і дадаць",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Грешка в мрежата възпрепятства обновяването на ресурса.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Един филтър на ред. Това може да бъде обикновен адрес или филтър, съвместим с EasyList. Редовете с представка <code>!</code> ще бъдат игнорирани.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Не добавяйте филтри от ненадеждни източници.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Внасяне и добавяне...",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "একটি নেটওয়ার্ক ত্রুটি রিসোর্স বা তথ্য হালনাগাদ হওয়া রোধ করেছে।",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "লাইন প্রতি একটি ফিল্টার। একটি ফিল্টার শুধু হোস্টনেম বা অ্যাডব্লক প্লাস-এর সাথে সামঞ্জস্যপূর্ণ ফিল্টার হতে পারে। <code>!</code> দিয়ে শুরু হওয়া লাইন উপেক্ষা করা হবে।",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "সন্দেহজনক উৎস থেকে ফিল্টারে কোন কিছু যোগ করবেন না।",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "আমদানি করে পরিশেষে যোগ করুন",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ur fazi rouedad en deus miret an danvez da vezañ hizivaet.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ur sil dre linenn. Ur sil a c'hall bezañ un anv ostiz hepken pe ur sil hag a glot gant EasyList.\nAl linennoù a grog gant <code>!</code> a vo dilezet.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Arabat ouzhpennañ siloù a zeu diouzh mammennoù douetus.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Enporzhiañ hag ouzhpennañ",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Mrežna greška je spriječila ažuriranje resursa.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Jedan filter po redu. Filter može biti običan naziv domaćina/hosta ili filter kompatibilan sa EasyList-om. Redovi sa prefiksom <code>!</code> će biti ignorisani.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nemojte dodavati filtere iz nepouzdanih izvora.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Uvezi i dodaj",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Un error de xarxa va impedir que s'actualitzés el recurs.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Un filtre per línia. Un filtre pot ser un domini, o un filtre compatible amb l'Adblock Plus. S'ignoraran les línies amb el símbol &lsquo;!&rsquo;.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "No afegiu filtres de fonts no confiables.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importa i annexa",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Chyba sítě znemožnila aktualizaci tohoto zdroje.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Jeden filtr na řádek. Filtr může být prostý název hostitele nebo filtr kompatibilní s EasyList. Řádky začínající vykřičníkem <code>!</code> budou ignorovány.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nepřidávejte filtry z nedůvěryhodných zdrojů.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importovat a připojit…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "En netværksfejl forhindrede opdatering af ressourcen.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ét filter pr. linje. Et filter kan være et almindeligt værtsnavn eller et EasyList-kompatibelt filter. Linjer startende med <code>!</code> ignoreres.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Tilføj ikke filtre fra ikke-betroede kilder.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importer og tilføj…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ein Netzwerkfehler verhinderte die Aktualisierung der Ressource.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ein Filter pro Zeile. Ein Filter kann ein einfacher Hostname oder ein EasyList-kompatibler Filter sein. Zeilen mit vorangestelltem <code>!</code> werden ignoriert.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Verwenden Sie keine Filter aus unseriösen Quellen.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importieren und anfügen …",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ένα σφάλμα δικτύου εμπόδισε την ενημέρωση του πόρου.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ένα φίλτρο ανά γραμμή. Ένα φίλτρο μπορεί να είναι ένα απλό όνομα κεντρικού υπολογιστή ή ένα φίλτρο συμβατό με την EasyList. Οι γραμμές με πρόθεμα <code>!</code> θα παραβλέπονται.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Να μην προστίθενται φίλτρα από μη αξιόπιστες πηγές.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Εισαγωγή και προσάρτηση",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Reta eraro malhelpis ĝisdatigon de la resurso.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Unu filtrilo por ĉiu linio. Filtrilo povas esti ordinara gastignomo aŭ Adblock Plus-kongrua filtrilo. Prefiksitaj linioj kun &lsquo;!&rsquo; estos ignorataj.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Ne aldonu filtrilojn el ne fidindaj fontoj.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importi kaj postaldoni",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Un error de red impide que se actualicen los recursos.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Un filtro por línea. El filtro puede ser un nombre de dominio, o un filtro compatible con EasyList. Las líneas que comiencen con <code>!</code> serán ignoradas.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "No añadir filtros de fuentes no confiables.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importar y anexar…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ressursi uuendamist takistas võrgu viga.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Üks filter rea kohta. Filtriks võib olla tavaline hostinimi või EasyListiga ühilduv filter. Eesliitega <code>!</code> algavaid ridu eiratakse.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Ära lisa filtreid tundmatutest allikatest.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Impordi ja lisa…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Sare errore batek baliabidea eguneratzea eragotzi du.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Iragazki bat lerroko. Iragazkia hostalari izen soila izan daiteke, edo Adblock Plusekin bateragarria den iragazki bat. Hasieran <code>!</code> duten lerroak ezikusiko dira.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Ez gehitu jatorri ezezaguneko iragazkirik",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Inportatu eta gehitu",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "یک خطای شبکه از بروزشدن این منبع جلوگیری کرد.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "یک فیلتر در هر خط. یک فیلتر می تواند آدرس هاست ساده یا فیلتر سازگار با Adblock plus باشد. خطوط با پیشوند &lsquo;!&rsquo; نادیده گرفته می شوند.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "وارد کردن و الحاق",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Verkkovirhe esti resurssin päivityksen.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Yksi suodatin riviä kohden. Suodatin voi olla pelkkä osoite tai EasyList-yhteensopiva suodatin. Rivit, joiden alussa on <code>!</code>, ohitetaan.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Älä lisää suodattimia lähteistä, joihin et luota.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Tuo ja lisää…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Hindi na-update ang resource dahil sa isang network error.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Isang filter kada linya. Pwedeng simpleng hostname o EasyList-compatible ang filter. Hindi papansinin ang mga linyang nagsisimula sa <code>!</code>.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Huwag magdagdag ng pangsala mula sa mga hindi katiwa-tiwalang pinagmulan.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "I-import at idagdag",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Une erreur réseau a empêché la mise à jour de la ressource.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Une règle par ligne. Une règle peut être un simple nom d'hôte, ou encore une règle compatible EasyList. Les lignes débutant par <code>!</code> seront ignorées.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Il est recommandé de ne pas ajouter de filtres en provenance de sources non fiables.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importer",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "In netwurkflater hat opkeard dat de boarne bywurke waard.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ien filter per rigel. In filter kin in gewoane hostnamme of in Adblock Plus-kompatibel filter wêze. Rigels begjinnend mei <code>!</code> wurde negearre.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Foegje gjin filters fan ûnbekende boarnen ta.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Ymportearje en tafoegje",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Un erro de rede está a impedir que se actualicen os recursos.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Un filtro por cada liña. O filtro pode ser un nome de servidor, ou un filtro compatible co Adblock Plus. As liñas que comecen con <code>!</code> seranche ignoradas.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Non engadir filtros de fontes non confiables.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importar e engadir…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "בעיית רשת מנעה מהמשאב להתעדכן.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "מסנן אחד לכל שורה. המסנן יכול להיות דומיין פשוט, או מסנן התואם ל- EasyList. שורות עם קידומת <code>!</code> לא יפורשו.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "אל תוסיף מסננים ממקורות לא מהימנים.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "ייבא וצרף…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "एक नेटवर्क त्रुटि ने रिसोर्स को अपडेट होने से रोक दिया। ",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "एक लाइन में एक फ़िल्टर। एक फ़िल्टर सीधा होस्टनाम, या एक Adblock Plus- योग्य फ़िल्टर हो सकता है। <code>!<code></code>से शुरू होने वाली लाइनों को नज़रअंदाज किया जायेगा।",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "अविश्वसनीय स्रोतों से फ़िल्टर न जोड़ें.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "इम्पोर्ट करें और जोड़ें",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Mrežna pogreška je sprječila ažuriranje resursa.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Jedan filter po retku. Filter može biti običan hostname ili filter kompatibilan sa EasyList-om. Linije sa prefiksom <code>!</code> zanemarit će se.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nemojte dodavati filtere iz nepouzdanih izvora.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Uvesti i dodati...",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Egy hálózati hiba megakadályozta az erőforrás frissítését.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Soronként egy szűrő. A szűrő lehet egy hostnév, vagy egy Adblock Plus kompatibilis szűrő.\nA <code>!</code> kezdetű sorok figyelmen kívül maradnak.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Ne adj hozzá szűrőket megbízhatatlan forrásokból.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importál és hozzáad",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ցանցի սխալի պատճառով թարմացումը տեղի չունեցավ։",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Մեկ տողում մեկ զտիչ։ Որպես զտիչ կարող է լինել կայքի անուն կամ EasyList-համաեղելի զտիչ։ <code>! </code>-ով սկսվող տողերը կանտեսվեն։",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Մի՛ ավելացրեք զտիչներ անվստահելի աղբյուրներից։",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Ներմուծել և հավելել",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Galat jaringan mencegah sumber daya diperbarui.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Satu filter per baris. Filter dapat berupa nama hos, atau filter yang kompatibel dengan EasyList. Baris yang diawali dengan <code>!</code> akan diabaikan.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Jangan tambah filter dari sumber yang tidak tepercaya.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Impor dan tambahkan…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Un errore di rete ha impedito l'aggiornamento della risorsa.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Un filtro per riga. Un filtro può essere un semplice hostname, o un filtro compatibile con EasyList. Ogni riga che comincia con <code>!</code> verrà ignorata.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Non aggiungere filtri da fonti non attendibili.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importa e aggiungi",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ネットワークエラーが発生したため、リソースを更新できませんでした。",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "1 行につき 1 つのフィルターです。フィルターはただのホスト名でも EasyList と同じ形式でも構いません。<code>!</code> を先頭に付けた行は無視されます。",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "信頼できないソースからフィルターを追加しないでください。",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "インポートと追加",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ქსელის შეცდომის შედეგად, შიგთავსის განახლება ვერ მოხერხდა.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "თითოეული ფილტრი ცალკეულ ხაზზე. ფილტრი შეიძლება იყოს საიტის უბრალო დასახელება ან Adblock Plus-სთან თავსებადი მითითებები. ხაზები &lsquo;!&rsquo; თავსართით უგულებელყოფილი იქნება.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "ფილტრების არიდება არასანდო წყაროებიდან.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "შემოტანა და დამატება",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "ಆಮದಿಸಿ ಸೇರ್ಪಡಿಸು",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "네트워크 오류로 인해 리소스가 업데이트되지 못했습니다.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "한 줄에 한 개의 필터를 입력하세요. 필터는 순수 호스트이름, 혹은 Adblock Plus-호환 필터가 될 수 있습니다. 시작 부분이 &lsquo;!&rsquo; 로 시작되면 무시됩니다.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "신뢰할 수 없는 출처의 필터를 추가하지 마십시오.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "가져오기 및 추가하기",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Tinklo klaida sutrukdė atnaujinti resursą.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Vienas filtras eilutėje. Filtras gali būti paprastas serverio adresas, arba su Adblock Plus suderinamas filtras. Eilutės pradėtos <code>!</code> bus ignoruotos.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importuoti ir papildyti",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Tīkla kļūda neļāva atjaunināt resursu.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Vienu filtru katrā rindā. Filtrs var būt vienkārši resursa adrese, vai ar Adblock Plus saderīgs filtrs. Rindiņas, kuras sākas ar &lsquo;!&rsquo; tiks ignorētas.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nevajag pievienot filtrus no neuzticamiem avotiem.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importēt un pievienot",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Внеси и додај",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ഒരു നെറ്റ്‌വർക്ക് പിശക് ഉറവിടം അപ്‌ഡേറ്റുചെയ്യുന്നതിൽ നിന്ന് തടഞ്ഞു.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "ഒരു വരിയില്‍ ഒരു ഫില്‍റ്റര്‍ എന്ന രീതിയില്‍. ഒരു ഫില്‍റ്റര്‍ എന്നത്, ഹോസ്റ്റ് നെയിം, അല്ലെങ്കില്‍ ആഡ് ബ്ലോക്ക് പ്ലസ്‌-നോട്‌ കംപാറ്റബിള്‍ ആയ ഫില്‍റ്റര്‍ എന്നിവ ആകാം. &lsquo;!&rsquo; എന്നിവയില്‍ ആരംഭിക്കുന്ന വരികള്‍ ഇഗ്നോര്‍ ചെയ്യപ്പെടും.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "ഇമ്പോര്‍ട്ടും കൂട്ടിചേര്‍ക്കലും ചെയ്യുക",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "प्रति ओळ एक फिल्टर. फिल्टर एक साधे होस्ट नावाचा असू शकतो, किंवा एक अद्ब्लोक प्लस सुसंगत फिल्टर असू शकतो. ओळी सह प्रिफिक्स &lsquo;!&rsquo; कढे दुर्लक्ष केले जाईल.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "आयात आणि समावेश करा",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ralat rangkaian menghalang sumber dikemas kini..",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Satu penapis setiap baris. Penapis boleh menjadi nama hos biasa, atau penapis yang sesuai dengan Daftar Mudah. Garis yang diawali dengan <code>! </code> akan diabaikan.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Jangan tambah penapis daripada sumber yang tidak dipercayai.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import dan melampirkan",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "En nettverksfeil forhindret ressursen i å bli oppdatert.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ett filter per linje. Et filter kan være et vanlig vertsnavn eller et EasyList-kompatibelt filter. Linjer med prefikset <code>!</code> blir ignorert.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Ikke legg til filtre fra ikke-betrodde kilder.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importer og legg til…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Een netwerkfout heeft voorkomen dat de bron werd bijgewerkt.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Eén filter per regel. Een filter kan een gewone hostnaam of een EasyList-compatibel filter zijn. Regels beginnend met <code>!</code> worden genegeerd.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Voeg geen filters van niet-vertrouwde bronnen toe.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importeren en toevoegen…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importar e apondre",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ਨੈੱਟਵਰਕ ਗਲਤੀ ਸਰੋਤ ਨੂੰ ਅੱਪਡੇਟ ਹੋਣ ਤੋਂ ਰੋਕਦੀ ਹੈ।",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "ਗ਼ੈਰ-ਭਰੋਸੇਯੋਗ ਸਰੋਤਾਂ ਤੋਂ ਫਿਲਟਰ ਨਾ ਜੋੜੋ।",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "ਇੰਪੋਰਟ ਕਰੋ ਤੇ ਜੋੜੋ…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Błąd sieci uniemożliwił aktualizację zasobów.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "W wierszu może być tylko jeden filtr. Filtrem może być nazwa hosta lub filtr kompatybilny z EasyList. Wiersze poprzedzone znakiem <code>!</code> będą pomijane.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nie dodawaj filtrów z niezaufanych źródeł.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importuj i dołącz…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Um erro de rede impediu o recurso de ser atualizado.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Um filtro por linha. Um filtro pode ser um simples nome de hospedeiro ou um filtro compatível com o EasyList. As linhas prefixadas com o <code>!</code> serão ignoradas.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Não adicionar filtros de fontes não confiáveis.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importar e anexar",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Um erro de rede impediu que o recurso fosse atualizado.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Um filtro por linha. Um filtro pode ser um simples nome de anfitrião, ou um filtro compatível com a EasyList. Linhas começadas por <code>!</code> serão ignoradas.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Não adicione filtros de fontes não confiáveis.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importar e anexar…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "O eroare de rețea a împiedicat actualizarea resursei.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Un filtru pe linie. Un filtru poate fi un simplu nume de gazdă sau un filtru compatibil EasyList. Liniile precedate de <code>!</code> vor fi ignorate.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nu adăuga filtre din surse nesigure.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importă și adaugă",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "В результате ошибки сети обновление не произошло.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Одно правило на строку. Правилом может быть имя сайта или EasyList-совместимый фильтр. Строки, начинающиеся с <code>!</code>, будут проигнорированы.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Не добавляйте фильтры из ненадёжных источников.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Импортировать и добавить…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Chyba siete zabránila aktualizácii zdroja.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Jeden filter na riadok. Filter môže byť jednoduchý názov hostiteľa alebo filter kompatibilný s Adblock Plus. Riadky začínajúce s <code>!</code> budú ignorované.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Nepridávajte filtre z nedôveryhodných zdrojov.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importovať a pripojiť",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Omrežna napaka je preprečila posodobitev virov.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "En filter na vrstico. Filter je lahko navadno ime gostitelja, ali pa Adblock Plus kompatibilen filter. Vrstice z znakom &lsquo;!&rsquo; bodo ignorirane.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Uvozi in dodaj",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Caadiyan",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Soo deji...",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Hal URL laynkiiba. URL-yada aan ansax ahayn waa la iska indho-tiraa aamusnaan.",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Një problem me rrjetin kompjuterik pengoi përditësimin e informacionit.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Një filtër për rresht. Filtri mund të jetë thjesht emri i një hosti ose si ata që përdor EasyList. Nuk do të merren parasysh rreshtat që fillojnë me <code>!</code>.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Mos shtoni filtra nga burime të pabesueshme.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importoj dhe shtoj…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Грешка на мрежи је спречила ажурирање ресурса.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Један филтер по реду. Филтер може бити назив хоста или филтер компатибилан са EasyList форматом. Редови са префиксом <code>!</code> ће бити игнорисани.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Не додавај филтере из непоузданих извора.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Увези и додај",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Ett nätverksproblem har förhindrat resursen från att uppdateras.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Ett filter per rad. Ett filter kan vara ett vanligt värdnamn eller ett EasyList-kompatibelt filter. Rader med prefixet <code>!</code> ignoreras.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Lägg inte till filter från opålitliga källor.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Importera och lägg till…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Tatizo la mtandao imezuia rasilimali kusasishwa.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Chujia moja kila laini. Chujio inaweza kuwa kuwa jina pangishi (hostname), au chujio linalotumika na Adblock Plus. Laini zilizo na viambishi awali za <code>!</code> zitapuuzwa.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Leta na ambatisha",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ஒரு பிணைய பிழை வளத்தைப் புதுப்பிப்பதைத் தடுத்தது.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "ஒரு வரிக்கு ஒரு வடிகட்டி. வடிகட்டி என்பது வெறும் வழங்கிப்பெயராக இருக்கலாம், அல்லது Adblock Plus-க்குப் பொருந்தும் வடிகட்டியாக இருக்கலாம். &lsquo;!&rsquo; எனும் எழுத்தில் தொடங்கும் வரிகள் புறக்கணிக்கப்படும்.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "இறக்குமதி செய் மற்றும் இணை",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "ఈ చిట్టా అనుసంధాన వైఫల్యం వలన నవికరించబడలేదు.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "ఒక్కో పంక్తిలో ఒక ఫిల్టర్ నమోదు. పేర్కొనబడే ఫిల్టర్, కేవలం హోస్టుపేరు లేదా Adblock Plusకి అనువైన ఫిల్టర్ కావొచ్చు. పంక్తిలో మొదట &lsquo;!&rsquo; ఉన్నచో ఆ పంక్తి పరిగణలోకి తీసుకొబడదు.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "అవిశ్వసనీయ మూలాల నుండి ఫిల్టర్‌లను జోడించవద్దు.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "దిగుమతిచేసి పోడిగించుము",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "หนึ่งตัวกรองต่อบรรทัด ตัวกรองอาจเป็น hostname หรือตัวกรองที่เข้ากันได้กับ EasyList, บรรทัดที่ขึ้นต้นด้วย <code>!</code> จะถูกละเว้น\n",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Bir ağ hatası kaynağın güncellenmesini engelledi.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Her satırda bir filtre. Bir filtre yalın bir alan adı veya EasyList-uyumlu bir filtre olabilir. <code>!</code> ile başlayan satırlar yok sayılacaktır.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Güvenilmeyen kaynaklardan filtre eklemeyin.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "İçe aktar ve ekle",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Оновлення не вдалося, у зв'язку з помилкою мережі.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Один фільтр на рядок. Фільтром може бути адреса сайту або фільтр у Adblock Plus-сумісному записі. Рядки, що починаються з <code>!</code> будуть проігноровані.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Не додавати фільтри з невідомих джерел.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Імпортувати та додати",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "A network error prevented the resource from being updated.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with <code>!</code> will be ignored.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Do not add filters from untrusted sources.",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Import and append…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "Lỗi mạng ngăn tài nguyên được cập nhật.",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "Một bộ lọc cho mỗi dòng. Bộ lọc có thể là tên máy chủ thuần hoặc bộ lọc tương thích với EasyList. Các dòng có tiền tố <code>!</code> sẽ bị bỏ qua.",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "Không thêm các bộ lọc từ các nguồn không đáng tin cậy. ",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "Nhập và thêm vào",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "资源更新因网络错误受阻。",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "一行一条过滤规则。每条规则可以是一个普通的主机名或者是一条与 EasyList 兼容的过滤规则。以 <code>!</code> 开头的行将被忽略。",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "请勿添加未信任来源的过滤规则。",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "导入并添加…",
"description": "Button in the 'My filters' pane"

View file

@ -535,14 +535,18 @@
"message": "因網路錯誤無法更新資源。",
"description": "used as a tooltip for error icon beside a list"
},
"1pFormatHint": {
"message": "每行一個過濾規則。規則可以單純是主機名稱,或是與 EasyList 相容的過濾規則。以 <code>!</code> 開頭的行將被忽略。",
"description": "Short information about how to create custom filters"
},
"1pTrustWarning": {
"message": "請勿添加未信任來源的過濾規則。",
"description": "Warning against copy-pasting filters from random sources"
},
"1pEnableMyFiltersLabel": {
"message": "Enable my custom filters",
"description": "Label for the checkbox use to enable/disable 'My filters' list"
},
"1pTrustMyFiltersLabel": {
"message": "Allow custom filters requiring trust",
"description": "Label for the checkbox use to trust the content of 'My filters' list"
},
"1pImport": {
"message": "匯入並加入…",
"description": "Button in the 'My filters' pane"

View file

@ -7,7 +7,6 @@ body {
}
#actions {
background-color: var(--surface-1);
padding: var(--default-gap-small) 0 var(--default-gap-xsmall) 0;
position: sticky;
top: 0;
z-index: 10;

View file

@ -331,6 +331,22 @@ select {
width: 100%;
}
.wikilink[href=""] {
display: none;
}
.wikilink.fa-icon {
color: var(--info0-ink);
fill: var(--info0-ink);
padding: var(--default-gap-xxsmall) var(--default-gap-xsmall);
}
.wikilink.fa-icon:hover {
transform: scale(1.2);
}
.wikilink.fa-icon > svg {
height: 1.25rem;
width: 1.25rem;
}
/* high dpi devices */
:root.hidpi button {
font-family: Metropolis, sans-serif;

View file

@ -12,11 +12,12 @@ body.notReady {
display: none;
}
#dashboard-nav {
align-items: center;
border: 0;
border-bottom: 1px solid var(--border-1);
display: flex;
flex-shrink: 0;
flex-wrap: wrap;
justify-content: space-between;
overflow-x: hidden;
padding: 0;
position: sticky;
@ -24,6 +25,10 @@ body.notReady {
width: 100%;
z-index: 10;
}
#dashboard-nav > span {
display: flex;
flex-wrap: wrap;
}
.tabButton {
background-color: transparent;
border: 0;
@ -107,7 +112,7 @@ body.noDashboard #dashboard-nav {
border-bottom-color: var(--dashboard-tab-hover-border);
}
:root.mobile #dashboard-nav {
:root.mobile #dashboard-nav > span {
flex-wrap: nowrap;
overflow-x: auto;
}

View file

@ -89,6 +89,7 @@
.fa-icon > .fa-icon_sun-o {
width: calc(1em * 1708 / 1792);
}
.fa-icon > .fa-icon_book,
.fa-icon > .fa-icon_download-alt,
.fa-icon > .fa-icon_font,
.fa-icon > .fa-icon_search,

View file

@ -4,24 +4,28 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<title data-i18n="dashboardName"></title>
<link href="css/themes/default.css" rel="stylesheet" type="text/css">
<link href="css/common.css" rel="stylesheet" type="text/css">
<link href="css/dashboard.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="css/themes/default.css">
<link rel="stylesheet" href="css/fa-icons.css">
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/dashboard.css">
<link rel="shortcut icon" type="image/png" href="img/icon_64.png">
</head>
<body class="notReady">
<div id="dashboard-nav">
<span class="logo"><img data-i18n-title="extName" src="img/ublock.svg"></span><!--
--><button class="tabButton" type="button" data-pane="settings.html" data-i18n="settingsPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="3p-filters.html" data-i18n="3pPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="1p-filters.html" data-i18n="1pPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="dyna-rules.html" data-i18n="rulesPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="whitelist.html" data-i18n="whitelistPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="support.html" data-i18n="supportPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="about.html" data-i18n="aboutPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="no-dashboard.html"></button>
<span>
<span class="logo"><img data-i18n-title="extName" src="img/ublock.svg" alt="uBlock Origin"></span><!--
--><button class="tabButton" type="button" data-pane="settings.html" data-i18n="settingsPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="3p-filters.html" data-i18n="3pPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="1p-filters.html" data-i18n="1pPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="dyna-rules.html" data-i18n="rulesPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="whitelist.html" data-i18n="whitelistPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="support.html" data-i18n="supportPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="about.html" data-i18n="aboutPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="no-dashboard.html"></button>
</span>
<a class="wikilink fa-icon" href="https://github.com/gorhill/uBlock/wiki/Dashboard:-My-filters">book</a>
</div>
<section id="unsavedWarning" class="notice">
<div>
@ -32,16 +36,19 @@
<div></div>
</section>
<iframe id="iframe" src=""></iframe>
<iframe id="iframe" src="about:blank"></iframe>
<script src="lib/hsluv/hsluv-0.1.0.min.js"></script>
<script src="js/vapi.js"></script>
<script src="js/vapi-common.js"></script>
<script src="js/vapi-client.js"></script>
<script src="js/fa-icons.js" type="module"></script>
<script src="js/theme.js" type="module"></script>
<script src="js/i18n.js" type="module"></script>
<script src="js/dashboard.js" type="module"></script>
<script src="js/dashboard-common.js" type="module"></script>
</body>
</html>

View file

@ -20,7 +20,7 @@
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="myRulesPane"></div>
<p class="vverbose"><span data-i18n="rulesHint"></span> <a class="fa-icon info" href="https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-rule-syntax" target="_blank">info-circle</a></p>
<p class="vverbose"><span data-i18n="rulesHint"></span></p>
<div id="diff">
<div class="tools">
<div class="ruleActions">

View file

@ -30,6 +30,7 @@ License - https://github.com/FortAwesome/Font-Awesome/tree/a8386aae19e200ddb0f68
<symbol id="arrow-right" viewBox="0 0 1472 1558"><path d="m 1472,779 q 0,54 -37,91 l -651,651 q -39,37 -91,37 -51,0 -90,-37 l -75,-75 q -38,-38 -38,-91 0,-53 38,-91 L 821,971 H 117 Q 65,971 32.5,933.5 0,896 0,843 V 715 Q 0,662 32.5,624.5 65,587 117,587 H 821 L 528,293 q -38,-36 -38,-90 0,-54 38,-90 l 75,-75 q 38,-38 90,-38 53,0 91,38 l 651,651 q 37,35 37,90 z"/></symbol>
<symbol id="bar-chart" viewBox="0 0 2048 1536"><path d="m 640,768 0,512 -256,0 0,-512 256,0 z m 384,-512 0,1024 -256,0 0,-1024 256,0 z m 1024,1152 0,128 L 0,1536 0,0 l 128,0 0,1408 1920,0 z m -640,-896 0,768 -256,0 0,-768 256,0 z m 384,-384 0,1152 -256,0 0,-1152 256,0 z"/></symbol>
<symbol id="bolt" viewBox="0 0 896 1664"><path d="m 885.08696,438 q 18,20 7,44 l -540,1157 q -13,25 -42,25 -4,0 -14,-2 -17,-5 -25.5,-19 -8.5,-14 -4.5,-30 l 197,-808 -406,101 q -4,1 -12,1 -18,0 -31,-11 Q -3.9130435,881 1.0869565,857 L 202.08696,32 q 4,-14 16,-23 12,-9 28,-9 l 328,0 q 19,0 32,12.5 13,12.5 13,29.5 0,8 -5,18 l -171,463 396,-98 q 8,-2 12,-2 19,0 34,15 z"/></symbol>
<symbol id="book" viewBox="0 0 1664 1536"><path d="m 1639.2625,350 c 25,36 32,83 18,129 l -275,906 c -25,85 -113,151 -199,151 H 260.26251 c -102,0 -211,-81 -248,-185 -16,-45 -16,-89 -2,-127 2,-20 6,-40 7,-64 1,-16 -8,-29 -6,-41 4,-24 25,-41 41,-68 30,-50 64,-131 75,-183 5,-19 -5,-41 0,-58 5,-19 24,-33 34,-51 27,-46 62,-135 67,-182 2,-21 -8,-44 -2,-60 7,-23 29,-33 44,-53 24,-33 64,-128 70,-181 2,-17 -8,-34 -5,-52 4,-19 28,-39 44,-62 42,-62 50,-199 177,-163 l -1,3 c 17,-4 34,-9 51,-9 h 761 c 47,0 89,21 114,56 26,36 32,83 18,130 l -274,906 c -47,154 -73,188 -200,188 H 156.26251 c -13,0 -29,3 -38,15 -8,12 -9,21 -1,43 20,58 89,70 144,70 h 923 c 37,0 80,-21 91,-57 l 300,-987 c 6,-19 6,-39 5,-57 23,9 44,23 59,43 z m -1064,2 c -6,18 4,32 22,32 h 608 c 17,0 36,-14 42,-32 l 21,-64 c 6,-18 -4,-32 -22,-32 H 638.26251 c -17,0 -36,14 -42,32 z m -83,256 c -6,18 4,32 22,32 h 608 c 17,0 36,-14 42,-32 l 21,-64 c 6,-18 -4,-32 -22,-32 H 555.26251 c -17,0 -36,14 -42,32 z"/></symbol>
<symbol id="clipboard" viewBox="0 0 1792 1792"><path d="m 768,1664 896,0 0,-640 -416,0 q -40,0 -68,-28 -28,-28 -28,-68 l 0,-416 -384,0 0,1152 z m 256,-1440 0,-64 q 0,-13 -9.5,-22.5 Q 1005,128 992,128 l -704,0 q -13,0 -22.5,9.5 Q 256,147 256,160 l 0,64 q 0,13 9.5,22.5 9.5,9.5 22.5,9.5 l 704,0 q 13,0 22.5,-9.5 9.5,-9.5 9.5,-22.5 z m 256,672 299,0 -299,-299 0,299 z m 512,128 0,672 q 0,40 -28,68 -28,28 -68,28 l -960,0 q -40,0 -68,-28 -28,-28 -28,-68 l 0,-160 -544,0 Q 56,1536 28,1508 0,1480 0,1440 L 0,96 Q 0,56 28,28 56,0 96,0 l 1088,0 q 40,0 68,28 28,28 28,68 l 0,328 q 21,13 36,28 l 408,408 q 28,28 48,76 20,48 20,88 z"/></symbol>
<symbol id="clock-o" viewBox="0 0 1536 1536"><path d="m 896,416 v 448 q 0,14 -9,23 -9,9 -23,9 H 544 q -14,0 -23,-9 -9,-9 -9,-23 v -64 q 0,-14 9,-23 9,-9 23,-9 H 768 V 416 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 416,352 q 0,-148 -73,-273 -73,-125 -198,-198 -125,-73 -273,-73 -148,0 -273,73 -125,73 -198,198 -73,125 -73,273 0,148 73,273 73,125 198,198 125,73 273,73 148,0 273,-73 125,-73 198,-198 73,-125 73,-273 z m 224,0 q 0,209 -103,385.5 Q 1330,1330 1153.5,1433 977,1536 768,1536 559,1536 382.5,1433 206,1330 103,1153.5 0,977 0,768 0,559 103,382.5 206,206 382.5,103 559,0 768,0 977,0 1153.5,103 1330,206 1433,382.5 1536,559 1536,768 Z"/></symbol>
<symbol id="cloud-download" viewBox="0 0 1920 1408"><path d="m 1280,800 q 0,-14 -9,-23 -9,-9 -23,-9 l -224,0 0,-352 q 0,-13 -9.5,-22.5 Q 1005,384 992,384 l -192,0 q -13,0 -22.5,9.5 Q 768,403 768,416 l 0,352 -224,0 q -13,0 -22.5,9.5 -9.5,9.5 -9.5,22.5 0,14 9,23 l 352,352 q 9,9 23,9 14,0 23,-9 l 351,-351 q 10,-12 10,-24 z m 640,224 q 0,159 -112.5,271.5 Q 1695,1408 1536,1408 l -1088,0 Q 263,1408 131.5,1276.5 0,1145 0,960 0,830 70,720 140,610 258,555 256,525 256,512 256,300 406,150 556,0 768,0 q 156,0 285.5,87 129.5,87 188.5,231 71,-62 166,-62 106,0 181,75 75,75 75,181 0,76 -41,138 130,31 213.5,135.5 Q 1920,890 1920,1024 Z"/></symbol>

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View file

@ -53,8 +53,6 @@ const cmEditor = new CodeMirror(qs$('#userFilters'), {
uBlockDashboard.patchCodeMirrorEditor(cmEditor);
let cachedUserFilters = '';
/******************************************************************************/
// Add auto-complete ability to the editor. Polling is used as the suggested
@ -91,9 +89,32 @@ vAPI.messaging.send('dashboard', {
/******************************************************************************/
let originalState = {
enabled: true,
trusted: false,
filters: '',
};
function getCurrentState() {
const enabled = qs$('#enableMyFilters input').checked;
return {
enabled,
trusted: enabled && qs$('#trustMyFilters input').checked,
filters: getEditorText(),
};
}
function rememberCurrentState() {
originalState = getCurrentState();
}
function currentStateChanged() {
return JSON.stringify(getCurrentState()) !== JSON.stringify(originalState);
}
function getEditorText() {
const text = cmEditor.getValue().replace(/\s+$/, '');
return text === '' ? text : text + '\n';
return text === '' ? text : `${text}\n`;
}
function setEditorText(text) {
@ -102,12 +123,23 @@ function setEditorText(text) {
/******************************************************************************/
function userFiltersChanged(changed) {
if ( typeof changed !== 'boolean' ) {
changed = self.hasUnsavedData();
}
// https://github.com/codemirror/codemirror5/issues/3318
// "How could I force to redraw the highlight of all the lines?"
// "Resetting the mode option with setOption will trigger a full re-parse."
function userFiltersChanged(details = {}) {
const changed = typeof details.changed === 'boolean'
? details.changed
: self.hasUnsavedData();
qs$('#userFiltersApply').disabled = !changed;
qs$('#userFiltersRevert').disabled = !changed;
const enabled = qs$('#enableMyFilters input').checked;
dom.attr('#trustMyFilters .input.checkbox', 'disabled', enabled ? null : '');
const trustedbefore = cmEditor.getOption('trustedSource');
const trustedAfter = enabled && qs$('#trustMyFilters input').checked;
if ( trustedAfter === trustedbefore ) { return; }
cmEditor.setOption('mode', 'ubo-static-filtering');
cmEditor.setOption('trustedSource', trustedAfter);
}
/******************************************************************************/
@ -118,7 +150,7 @@ function userFiltersChanged(changed) {
// background.
function threeWayMerge(newContent) {
const prvContent = cachedUserFilters.trim().split(/\n/);
const prvContent = originalState.filters.trim().split(/\n/);
const differ = new self.diff_match_patch();
const newChanges = differ.diff(
prvContent,
@ -167,19 +199,22 @@ async function renderUserFilters(merge = false) {
});
if ( details instanceof Object === false || details.error ) { return; }
cmEditor.setOption('trustedSource', details.trustedSource === true);
cmEditor.setOption('trustedSource', details.trusted);
qs$('#enableMyFilters input').checked = details.enabled;
qs$('#trustMyFilters input').checked = details.trusted;
const newContent = details.content.trim();
if ( merge && self.hasUnsavedData() ) {
setEditorText(threeWayMerge(newContent));
userFiltersChanged(true);
userFiltersChanged({ changed: true });
} else {
setEditorText(newContent);
userFiltersChanged(false);
userFiltersChanged({ changed: false });
}
cachedUserFilters = newContent;
rememberCurrentState();
}
/******************************************************************************/
@ -224,7 +259,7 @@ function exportUserFiltersToFile() {
.replace('{{datetime}}', uBlockDashboard.dateNowToSensibleString())
.replace(/ +/g, '_');
vAPI.download({
'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(val + '\n'),
'url': `data:text/plain;charset=utf-8,${encodeURIComponent(val)}`,
'filename': filename
});
}
@ -232,21 +267,26 @@ function exportUserFiltersToFile() {
/******************************************************************************/
async function applyChanges() {
const state = getCurrentState();
const details = await vAPI.messaging.send('dashboard', {
what: 'writeUserFilters',
content: getEditorText(),
content: state.filters,
enabled: state.enabled,
trusted: state.trusted,
});
if ( details instanceof Object === false || details.error ) { return; }
cachedUserFilters = details.content.trim();
userFiltersChanged(false);
rememberCurrentState();
userFiltersChanged({ changed: false });
vAPI.messaging.send('dashboard', {
what: 'reloadAllFilters',
});
}
function revertChanges() {
setEditorText(cachedUserFilters);
qs$('#enableMyFilters input').checked = originalState.enabled;
qs$('#trustMyFilters input').checked = originalState.trusted;
setEditorText(originalState.filters);
userFiltersChanged();
}
/******************************************************************************/
@ -268,8 +308,10 @@ self.cloud.onPull = setCloudData;
/******************************************************************************/
self.wikilink = 'https://github.com/gorhill/uBlock/wiki/Dashboard:-My-filters';
self.hasUnsavedData = function() {
return getEditorText().trim() !== cachedUserFilters;
return currentStateChanged();
};
/******************************************************************************/
@ -278,6 +320,8 @@ self.hasUnsavedData = function() {
dom.on('#exportUserFiltersToFile', 'click', exportUserFiltersToFile);
dom.on('#userFiltersApply', 'click', ( ) => { applyChanges(); });
dom.on('#userFiltersRevert', 'click', revertChanges);
dom.on('#enableMyFilters input', 'change', userFiltersChanged);
dom.on('#trustMyFilters input', 'change', userFiltersChanged);
(async ( ) => {
await renderUserFilters();

View file

@ -877,6 +877,8 @@ self.cloud.onPull = function fromCloudData(data, append) {
/******************************************************************************/
self.wikilink = 'https://github.com/gorhill/uBlock/wiki/Dashboard:-Filter-lists';
self.hasUnsavedData = function() {
return hashFromCurrentFromSettings() !== filteringSettingsHash;
};

View file

@ -96,7 +96,6 @@ const hiddenSettingsDefault = {
if ( vAPI.webextFlavor.soup.has('devbuild') ) {
hiddenSettingsDefault.consoleLogLevel = 'info';
hiddenSettingsDefault.trustedListPrefixes += ' user-';
ubologSet(true);
}
@ -125,6 +124,7 @@ const userSettingsDefault = {
showIconBadge: true,
suspendUntilListsAreLoaded: vAPI.Net.canSuspend(),
tooltipsDisabled: false,
userFiltersTrusted: false,
webrtcIPAddressHidden: false,
};

View file

@ -39,10 +39,10 @@ let hintHelperRegistered = false;
/******************************************************************************/
CodeMirror.defineOption('trustedSource', false, (cm, state) => {
if ( typeof state !== 'boolean' ) { return; }
CodeMirror.defineOption('trustedSource', false, (cm, trusted) => {
if ( typeof trusted !== 'boolean' ) { return; }
self.dispatchEvent(new CustomEvent('trustedSource', {
detail: state,
detail: { cm, trusted },
}));
});
@ -56,36 +56,28 @@ CodeMirror.defineOption('trustedScriptletTokens', undefined, (cm, tokens) => {
/******************************************************************************/
CodeMirror.defineMode('ubo-static-filtering', function() {
const astParser = new sfp.AstFilterParser({
interactive: true,
nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'),
});
const astWalker = astParser.getWalker();
let currentWalkerNode = 0;
let lastNetOptionType = 0;
const redirectTokenStyle = node => {
const rawToken = astParser.getNodeString(node || currentWalkerNode);
const uBOStaticFilteringMode = (( ) => {
const redirectTokenStyle = (mode, node) => {
const rawToken = mode.astParser.getNodeString(node || mode.currentWalkerNode);
const { token } = sfp.parseRedirectValue(rawToken);
return redirectNames.has(token) ? 'value' : 'value warning';
};
const nodeHasError = node => {
return astParser.getNodeFlags(
node || currentWalkerNode, sfp.NODE_FLAG_ERROR
const nodeHasError = (mode, node) => {
return mode.astParser.getNodeFlags(
node || mode.currentWalkerNode, sfp.NODE_FLAG_ERROR
) !== 0;
};
const colorFromAstNode = function() {
if ( astParser.nodeIsEmptyString(currentWalkerNode) ) { return '+'; }
if ( nodeHasError() ) { return 'error'; }
const nodeType = astParser.getNodeType(currentWalkerNode);
const colorFromAstNode = mode => {
if ( mode.astParser.nodeIsEmptyString(mode.currentWalkerNode) ) { return '+'; }
if ( nodeHasError(mode) ) { return 'error'; }
const nodeType = mode.astParser.getNodeType(mode.currentWalkerNode);
switch ( nodeType ) {
case sfp.NODE_TYPE_WHITESPACE:
return '';
case sfp.NODE_TYPE_COMMENT:
if ( astWalker.canGoDown() ) { break; }
if ( mode.astWalker.canGoDown() ) { break; }
return 'comment';
case sfp.NODE_TYPE_COMMENT_URL:
return 'comment link';
@ -95,28 +87,28 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_VALUE:
return 'directive';
case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_IF_VALUE: {
const raw = astParser.getNodeString(currentWalkerNode);
const raw = mode.astParser.getNodeString(mode.currentWalkerNode);
const state = sfp.utils.preparser.evaluateExpr(raw, preparseDirectiveEnv);
return state ? 'positive strong' : 'negative strong';
}
case sfp.NODE_TYPE_EXT_OPTIONS_ANCHOR:
return astParser.getFlags(sfp.AST_FLAG_IS_EXCEPTION)
return mode.astParser.getFlags(sfp.AST_FLAG_IS_EXCEPTION)
? 'tag strong'
: 'def strong';
case sfp.NODE_TYPE_EXT_DECORATION:
return 'def';
case sfp.NODE_TYPE_EXT_PATTERN_RAW:
if ( astWalker.canGoDown() ) { break; }
if ( mode.astWalker.canGoDown() ) { break; }
return 'variable';
case sfp.NODE_TYPE_EXT_PATTERN_COSMETIC:
case sfp.NODE_TYPE_EXT_PATTERN_HTML:
return 'variable';
case sfp.NODE_TYPE_EXT_PATTERN_RESPONSEHEADER:
case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET:
if ( astWalker.canGoDown() ) { break; }
if ( mode.astWalker.canGoDown() ) { break; }
return 'variable';
case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: {
const token = astParser.getNodeString(currentWalkerNode);
const token = mode.astParser.getNodeString(mode.currentWalkerNode);
if ( scriptletNames.has(token) === false ) {
return 'warning';
}
@ -127,9 +119,9 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
case sfp.NODE_TYPE_NET_EXCEPTION:
return 'tag strong';
case sfp.NODE_TYPE_NET_PATTERN:
if ( astWalker.canGoDown() ) { break; }
if ( astParser.isRegexPattern() ) {
if ( astParser.getNodeFlags(currentWalkerNode, sfp.NODE_FLAG_PATTERN_UNTOKENIZABLE) !== 0 ) {
if ( mode.astWalker.canGoDown() ) { break; }
if ( mode.astParser.isRegexPattern() ) {
if ( mode.astParser.getNodeFlags(mode.currentWalkerNode, sfp.NODE_FLAG_PATTERN_UNTOKENIZABLE) !== 0 ) {
return 'variable warning';
}
return 'variable notice';
@ -148,10 +140,10 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
return 'keyword strong';
case sfp.NODE_TYPE_NET_OPTIONS_ANCHOR:
case sfp.NODE_TYPE_NET_OPTION_SEPARATOR:
lastNetOptionType = 0;
mode.lastNetOptionType = 0;
return 'def strong';
case sfp.NODE_TYPE_NET_OPTION_NAME_UNKNOWN:
lastNetOptionType = 0;
mode.lastNetOptionType = 0;
return 'error';
case sfp.NODE_TYPE_NET_OPTION_NAME_1P:
case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT1P:
@ -196,16 +188,16 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
case sfp.NODE_TYPE_NET_OPTION_NAME_XHR:
case sfp.NODE_TYPE_NET_OPTION_NAME_WEBRTC:
case sfp.NODE_TYPE_NET_OPTION_NAME_WEBSOCKET:
lastNetOptionType = nodeType;
mode.lastNetOptionType = nodeType;
return 'def';
case sfp.NODE_TYPE_NET_OPTION_ASSIGN:
return 'def';
case sfp.NODE_TYPE_NET_OPTION_VALUE:
if ( astWalker.canGoDown() ) { break; }
switch ( lastNetOptionType ) {
if ( mode.astWalker.canGoDown() ) { break; }
switch ( mode.lastNetOptionType ) {
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT:
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
return redirectTokenStyle();
return redirectTokenStyle(mode);
default:
break;
}
@ -222,54 +214,74 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
return '+';
};
self.addEventListener('trustedSource', ev => {
astParser.options.trustedSource = ev.detail;
});
class ModeState {
constructor() {
this.astParser = new sfp.AstFilterParser({
interactive: true,
nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'),
});
this.astWalker = this.astParser.getWalker();
this.currentWalkerNode = 0;
this.lastNetOptionType = 0;
self.addEventListener('trustedSource', ev => {
const { trusted } = ev.detail;
this.astParser.options.trustedSource = trusted;
});
self.addEventListener('trustedScriptletTokens', ev => {
this.astParser.options.trustedScriptletTokens = ev.detail;
});
}
}
self.addEventListener('trustedScriptletTokens', ev => {
astParser.options.trustedScriptletTokens = ev.detail;
});
return {
lineComment: '!',
token: function(stream) {
return {
state: null,
startState() {
if ( this.state === null ) {
this.state = new ModeState();
}
return this.state;
},
copyState(other) {
return other;
},
token(stream, state) {
if ( stream.sol() ) {
astParser.parse(stream.string);
if ( astParser.getFlags(sfp.AST_FLAG_UNSUPPORTED) !== 0 ) {
state.astParser.parse(stream.string);
if ( state.astParser.getFlags(sfp.AST_FLAG_UNSUPPORTED) !== 0 ) {
stream.skipToEnd();
return 'error';
}
if ( astParser.getType() === sfp.AST_TYPE_NONE ) {
if ( state.astParser.getType() === sfp.AST_TYPE_NONE ) {
stream.skipToEnd();
return 'comment';
}
currentWalkerNode = astWalker.reset();
} else if ( nodeHasError() ) {
currentWalkerNode = astWalker.right();
state.currentWalkerNode = state.astWalker.reset();
} else if ( nodeHasError(state) ) {
state.currentWalkerNode = state.astWalker.right();
} else {
currentWalkerNode = astWalker.next();
state.currentWalkerNode = state.astWalker.next();
}
let style = '';
while ( currentWalkerNode !== 0 ) {
style = colorFromAstNode(stream);
while ( state.currentWalkerNode !== 0 ) {
style = colorFromAstNode(state, stream);
if ( style !== '+' ) { break; }
currentWalkerNode = astWalker.next();
state.currentWalkerNode = state.astWalker.next();
}
if ( style === '+' ) {
stream.skipToEnd();
return null;
}
stream.pos = astParser.getNodeStringEnd(currentWalkerNode);
if ( astParser.isNetworkFilter() ) {
stream.pos = state.astParser.getNodeStringEnd(state.currentWalkerNode);
if ( state.astParser.isNetworkFilter() ) {
return style ? `line-cm-net ${style}` : 'line-cm-net';
}
if ( astParser.isExtendedFilter() ) {
if ( state.astParser.isExtendedFilter() ) {
let flavor = '';
if ( astParser.isCosmeticFilter() ) {
if ( state.astParser.isCosmeticFilter() ) {
flavor = 'line-cm-ext-dom';
} else if ( astParser.isScriptletFilter() ) {
} else if ( state.astParser.isScriptletFilter() ) {
flavor = 'line-cm-ext-js';
} else if ( astParser.isHtmlFilter() ) {
} else if ( state.astParser.isHtmlFilter() ) {
flavor = 'line-cm-ext-html';
}
if ( flavor !== '' ) {
@ -279,9 +291,11 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
style = style.trim();
return style !== '' ? style : null;
},
parser: astParser,
lineComment: '!',
};
});
})();
CodeMirror.defineMode('ubo-static-filtering', ( ) => uBOStaticFilteringMode);
/******************************************************************************/
@ -878,6 +892,11 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => {
ifendifSet.add(lineHandle);
ifendifSetChanged = true;
}
} else if ( marker.dataset.lint === 'error' ) {
if ( marker.dataset.error !== 'y' ) {
marker.dataset.error = 'y';
errorCount += 1;
}
}
if ( typeof details.msg !== 'string' || details.msg === '' ) { return; }
const msgElem = qs$(marker, '.msg');
@ -1084,7 +1103,16 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => {
};
self.addEventListener('trustedSource', ev => {
astParser.options.trustedSource = ev.detail;
const { cm, trusted } = ev.detail;
astParser.options.trustedSource = trusted;
const doc = cm.getDoc();
const lineCount = doc.lineCount();
onBeforeChanges(cm, {
from: { line: 0, ch: 0 },
to: { line: lineCount, ch: 0 },
});
changeset.push({ from: 0, to: lineCount });
processChangesetAsync(doc);
});
self.addEventListener('trustedScriptletTokens', ev => {

View file

@ -25,7 +25,7 @@ import { dom, qs$ } from './dom.js';
/******************************************************************************/
const discardUnsavedData = function(synchronous = false) {
function discardUnsavedData(synchronous = false) {
const paneFrame = qs$('#iframe');
const paneWindow = paneFrame.contentWindow;
if (
@ -66,9 +66,9 @@ const discardUnsavedData = function(synchronous = false) {
dom.on(document, 'click', onClick, true);
});
};
}
const loadDashboardPanel = function(pane, first) {
function loadDashboardPanel(pane, first) {
const tabButton = qs$(`[data-pane="${pane}"]`);
if ( tabButton === null || dom.cl.has(tabButton, 'selected') ) { return; }
const loadPane = ( ) => {
@ -76,8 +76,12 @@ const loadDashboardPanel = function(pane, first) {
dom.cl.remove('.tabButton.selected', 'selected');
dom.cl.add(tabButton, 'selected');
tabButton.scrollIntoView();
qs$('#iframe').contentWindow.location.replace(pane);
const iframe = qs$('#iframe');
iframe.contentWindow.location.replace(pane);
if ( pane !== 'no-dashboard.html' ) {
iframe.addEventListener('load', ( ) => {
qs$('.wikilink').href = iframe.contentWindow.wikilink || '';
}, { once: true });
vAPI.localStorage.setItem('dashboardLastVisitedPane', pane);
}
};
@ -91,11 +95,11 @@ const loadDashboardPanel = function(pane, first) {
if ( status === false ) { return; }
loadPane();
});
};
}
const onTabClickHandler = function(ev) {
function onTabClickHandler(ev) {
loadDashboardPanel(dom.attr(ev.target, 'data-pane'));
};
}
if ( self.location.hash.slice(1) === 'no-dashboard.html' ) {
dom.cl.add(dom.body, 'noDashboard');

View file

@ -174,7 +174,7 @@ const toggleOverlay = (( ) => {
// - Scroll position preserved
// - Minimum amount of text updated
const rulesToDoc = function(clearHistory) {
function rulesToDoc(clearHistory) {
const orig = thePanes.orig.doc;
const edit = thePanes.edit.doc;
orig.startOperation();
@ -258,11 +258,11 @@ const rulesToDoc = function(clearHistory) {
{ line, ch: 0 },
(clientHeight - ldoc.defaultTextHeight()) / 2
);
};
}
/******************************************************************************/
const filterRules = function(key) {
function filterRules(key) {
const filter = qs$('#ruleFilter input').value;
const rules = thePanes[key].modified;
if ( filter === '' ) { return rules; }
@ -272,11 +272,11 @@ const filterRules = function(key) {
out.push(rule);
}
return out;
};
}
/******************************************************************************/
const applyDiff = async function(permanent, toAdd, toRemove) {
async function applyDiff(permanent, toAdd, toRemove) {
const details = await vAPI.messaging.send('dashboard', {
what: 'modifyRuleset',
permanent: permanent,
@ -286,7 +286,7 @@ const applyDiff = async function(permanent, toAdd, toRemove) {
thePanes.orig.original = details.permanentRules;
thePanes.edit.original = details.sessionRules;
onPresentationChanged();
};
}
/******************************************************************************/
@ -345,14 +345,14 @@ function handleImportFilePicker() {
/******************************************************************************/
const startImportFilePicker = function() {
function startImportFilePicker() {
const input = qs$('#importFilePicker');
// Reset to empty string, this will ensure an change event is properly
// triggered if the user pick a file, even if it is the same as the last
// one picked.
input.value = '';
input.click();
};
}
/******************************************************************************/
@ -562,7 +562,7 @@ const onTextChanged = (( ) => {
}
};
return function(now) {
return function onTextChanged(now) {
if ( timer !== undefined ) { self.cancelIdleCallback(timer); }
timer = now ? process() : self.requestIdleCallback(process, { timeout: 57 });
};
@ -570,7 +570,7 @@ const onTextChanged = (( ) => {
/******************************************************************************/
const revertAllHandler = function() {
function revertAllHandler() {
const toAdd = [], toRemove = [];
const left = mergeView.leftOriginal();
const edit = mergeView.editor();
@ -587,11 +587,11 @@ const revertAllHandler = function() {
toRemove.push(removedLines.trim());
}
applyDiff(false, toAdd.join('\n'), toRemove.join('\n'));
};
}
/******************************************************************************/
const commitAllHandler = function() {
function commitAllHandler() {
const toAdd = [], toRemove = [];
const left = mergeView.leftOriginal();
const edit = mergeView.editor();
@ -608,11 +608,11 @@ const commitAllHandler = function() {
toRemove.push(removedLines.trim());
}
applyDiff(true, toAdd.join('\n'), toRemove.join('\n'));
};
}
/******************************************************************************/
const editSaveHandler = function() {
function editSaveHandler() {
const editor = mergeView.editor();
const editText = editor.getValue().trim();
if ( editText === cleanEditText ) {
@ -629,7 +629,7 @@ const editSaveHandler = function() {
}
}
applyDiff(false, toAdd.join(''), toRemove.join(''));
};
}
/******************************************************************************/
@ -648,6 +648,8 @@ self.cloud.onPull = function(data, append) {
/******************************************************************************/
self.wikilink = 'https://github.com/gorhill/uBlock/wiki/Dashboard:-My-rules';
self.hasUnsavedData = function() {
return mergeView.editor().isClean(cleanEditToken) === false;
};
@ -706,4 +708,3 @@ mergeView.editor().on('updateDiff', ( ) => {
});
/******************************************************************************/

View file

@ -32,6 +32,7 @@ export const faIconsInit = (( ) => {
[ 'arrow-right', { viewBox: '0 0 1472 1558', path: 'm 1472,779 q 0,54 -37,91 l -651,651 q -39,37 -91,37 -51,0 -90,-37 l -75,-75 q -38,-38 -38,-91 0,-53 38,-91 L 821,971 H 117 Q 65,971 32.5,933.5 0,896 0,843 V 715 Q 0,662 32.5,624.5 65,587 117,587 H 821 L 528,293 q -38,-36 -38,-90 0,-54 38,-90 l 75,-75 q 38,-38 90,-38 53,0 91,38 l 651,651 q 37,35 37,90 z' } ],
[ 'bar-chart', { viewBox: '0 0 2048 1536', path: 'm 640,768 0,512 -256,0 0,-512 256,0 z m 384,-512 0,1024 -256,0 0,-1024 256,0 z m 1024,1152 0,128 L 0,1536 0,0 l 128,0 0,1408 1920,0 z m -640,-896 0,768 -256,0 0,-768 256,0 z m 384,-384 0,1152 -256,0 0,-1152 256,0 z' } ],
[ 'bolt', { viewBox: '0 0 896 1664', path: 'm 885.08696,438 q 18,20 7,44 l -540,1157 q -13,25 -42,25 -4,0 -14,-2 -17,-5 -25.5,-19 -8.5,-14 -4.5,-30 l 197,-808 -406,101 q -4,1 -12,1 -18,0 -31,-11 Q -3.9130435,881 1.0869565,857 L 202.08696,32 q 4,-14 16,-23 12,-9 28,-9 l 328,0 q 19,0 32,12.5 13,12.5 13,29.5 0,8 -5,18 l -171,463 396,-98 q 8,-2 12,-2 19,0 34,15 z' } ],
[ 'book', { viewBox: '0 0 1664 1536', path: 'm 1639.2625,350 c 25,36 32,83 18,129 l -275,906 c -25,85 -113,151 -199,151 H 260.26251 c -102,0 -211,-81 -248,-185 -16,-45 -16,-89 -2,-127 2,-20 6,-40 7,-64 1,-16 -8,-29 -6,-41 4,-24 25,-41 41,-68 30,-50 64,-131 75,-183 5,-19 -5,-41 0,-58 5,-19 24,-33 34,-51 27,-46 62,-135 67,-182 2,-21 -8,-44 -2,-60 7,-23 29,-33 44,-53 24,-33 64,-128 70,-181 2,-17 -8,-34 -5,-52 4,-19 28,-39 44,-62 42,-62 50,-199 177,-163 l -1,3 c 17,-4 34,-9 51,-9 h 761 c 47,0 89,21 114,56 26,36 32,83 18,130 l -274,906 c -47,154 -73,188 -200,188 H 156.26251 c -13,0 -29,3 -38,15 -8,12 -9,21 -1,43 20,58 89,70 144,70 h 923 c 37,0 80,-21 91,-57 l 300,-987 c 6,-19 6,-39 5,-57 23,9 44,23 59,43 z m -1064,2 c -6,18 4,32 22,32 h 608 c 17,0 36,-14 42,-32 l 21,-64 c 6,-18 -4,-32 -22,-32 H 638.26251 c -17,0 -36,14 -42,32 z m -83,256 c -6,18 4,32 22,32 h 608 c 17,0 36,-14 42,-32 l 21,-64 c 6,-18 -4,-32 -22,-32 H 555.26251 c -17,0 -36,14 -42,32 z' } ],
[ 'clipboard', { viewBox: '0 0 1792 1792', path: 'm 768,1664 896,0 0,-640 -416,0 q -40,0 -68,-28 -28,-28 -28,-68 l 0,-416 -384,0 0,1152 z m 256,-1440 0,-64 q 0,-13 -9.5,-22.5 Q 1005,128 992,128 l -704,0 q -13,0 -22.5,9.5 Q 256,147 256,160 l 0,64 q 0,13 9.5,22.5 9.5,9.5 22.5,9.5 l 704,0 q 13,0 22.5,-9.5 9.5,-9.5 9.5,-22.5 z m 256,672 299,0 -299,-299 0,299 z m 512,128 0,672 q 0,40 -28,68 -28,28 -68,28 l -960,0 q -40,0 -68,-28 -28,-28 -28,-68 l 0,-160 -544,0 Q 56,1536 28,1508 0,1480 0,1440 L 0,96 Q 0,56 28,28 56,0 96,0 l 1088,0 q 40,0 68,28 28,28 28,68 l 0,328 q 21,13 36,28 l 408,408 q 28,28 48,76 20,48 20,88 z' } ],
[ 'clock-o', { viewBox: '0 0 1536 1536', path: 'm 896,416 v 448 q 0,14 -9,23 -9,9 -23,9 H 544 q -14,0 -23,-9 -9,-9 -9,-23 v -64 q 0,-14 9,-23 9,-9 23,-9 H 768 V 416 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 416,352 q 0,-148 -73,-273 -73,-125 -198,-198 -125,-73 -273,-73 -148,0 -273,73 -125,73 -198,198 -73,125 -73,273 0,148 73,273 73,125 198,198 125,73 273,73 148,0 273,-73 125,-73 198,-198 73,-125 73,-273 z m 224,0 q 0,209 -103,385.5 Q 1330,1330 1153.5,1433 977,1536 768,1536 559,1536 382.5,1433 206,1330 103,1153.5 0,977 0,768 0,559 103,382.5 206,206 382.5,103 559,0 768,0 977,0 1153.5,103 1330,206 1433,382.5 1536,559 1536,768 Z' } ],
[ 'cloud-download', { viewBox: '0 0 1920 1408', path: 'm 1280,800 q 0,-14 -9,-23 -9,-9 -23,-9 l -224,0 0,-352 q 0,-13 -9.5,-22.5 Q 1005,384 992,384 l -192,0 q -13,0 -22.5,9.5 Q 768,403 768,416 l 0,352 -224,0 q -13,0 -22.5,9.5 -9.5,9.5 -9.5,22.5 0,14 9,23 l 352,352 q 9,9 23,9 14,0 23,-9 l 351,-351 q 10,-12 10,-24 z m 640,224 q 0,159 -112.5,271.5 Q 1695,1408 1536,1408 l -1088,0 Q 263,1408 131.5,1276.5 0,1145 0,960 0,830 70,720 140,610 258,555 256,525 256,512 256,300 406,150 556,0 768,0 q 156,0 285.5,87 129.5,87 188.5,231 71,-62 166,-62 106,0 181,75 75,75 75,181 0,76 -41,138 130,31 213.5,135.5 Q 1920,890 1920,1024 Z' } ],

View file

@ -1450,11 +1450,23 @@ const onMessage = function(request, sender, callback) {
case 'readUserFilters':
return µb.loadUserFilters().then(result => {
result.trustedSource = µb.isTrustedList(µb.userFiltersPath);
result.enabled = µb.selectedFilterLists.includes(µb.userFiltersPath);
result.trusted = µb.isTrustedList(µb.userFiltersPath);
callback(result);
});
case 'writeUserFilters':
if ( request.enabled ) {
µb.applyFilterListSelection({
toSelect: [ µb.userFiltersPath ],
merge: true,
});
} else {
µb.applyFilterListSelection({
toRemove: [ µb.userFiltersPath ],
});
}
µb.changeUserSettings('userFiltersTrusted', request.trusted || false);
return µb.saveUserFilters(request.content).then(result => {
callback(result);
});

View file

@ -27,7 +27,7 @@ import { setAccentColor, setTheme } from './theme.js';
/******************************************************************************/
const handleImportFilePicker = function() {
function handleImportFilePicker() {
const file = this.files[0];
if ( file === undefined || file.name === '' ) { return; }
@ -88,22 +88,22 @@ const handleImportFilePicker = function() {
};
fr.readAsText(file);
};
}
/******************************************************************************/
const startImportFilePicker = function() {
function startImportFilePicker() {
const input = qs$('#restoreFilePicker');
// Reset to empty string, this will ensure an change event is properly
// triggered if the user pick a file, even if it is the same as the last
// one picked.
input.value = '';
input.click();
};
}
/******************************************************************************/
const exportToFile = async function() {
async function exportToFile() {
const response = await vAPI.messaging.send('dashboard', {
what: 'backupUserData',
});
@ -119,11 +119,11 @@ const exportToFile = async function() {
'filename': response.localData.lastBackupFile
});
onLocalDataReceived(response.localData);
};
}
/******************************************************************************/
const onLocalDataReceived = function(details) {
function onLocalDataReceived(details) {
let v, unit;
if ( typeof details.storageUsed === 'number' ) {
v = details.storageUsed;
@ -187,32 +187,32 @@ const onLocalDataReceived = function(details) {
dom.attr('[data-setting-name="hyperlinkAuditingDisabled"]', 'disabled', '');
dom.attr('[data-setting-name="webrtcIPAddressHidden"]', 'disabled', '');
}
};
}
/******************************************************************************/
const resetUserData = function() {
function resetUserData() {
const msg = i18n$('aboutResetDataConfirm');
const proceed = window.confirm(msg);
if ( proceed !== true ) { return; }
vAPI.messaging.send('dashboard', {
what: 'resetUserData',
});
};
}
/******************************************************************************/
const synchronizeDOM = function() {
function synchronizeDOM() {
dom.cl.toggle(
dom.body,
'advancedUser',
qs$('[data-setting-name="advancedUserEnabled"]').checked === true
);
};
}
/******************************************************************************/
const changeUserSettings = function(name, value) {
function changeUserSettings(name, value) {
vAPI.messaging.send('dashboard', {
what: 'userSettings',
name,
@ -235,11 +235,11 @@ const changeUserSettings = function(name, value) {
default:
break;
}
};
}
/******************************************************************************/
const onValueChanged = function(ev) {
function onValueChanged(ev) {
const input = ev.target;
const name = dom.attr(input, 'data-setting-name');
let value = input.value;
@ -256,14 +256,20 @@ const onValueChanged = function(ev) {
}
changeUserSettings(name, value);
};
}
/******************************************************************************/
// TODO: use data-* to declare simple settings
const onUserSettingsReceived = function(details) {
function onUserSettingsReceived(details) {
const checkboxes = qsa$('[data-setting-type="bool"]');
const onchange = ev => {
const checkbox = ev.target;
const name = checkbox.dataset.settingName || '';
changeUserSettings(name, checkbox.checked);
synchronizeDOM();
};
for ( const checkbox of checkboxes ) {
const name = dom.attr(checkbox, 'data-setting-name') || '';
if ( details[name] === undefined ) {
@ -272,10 +278,7 @@ const onUserSettingsReceived = function(details) {
continue;
}
checkbox.checked = details[name] === true;
dom.on(checkbox, 'change', ( ) => {
changeUserSettings(name, checkbox.checked);
synchronizeDOM();
});
dom.on(checkbox, 'change', onchange);
}
if ( details.canLeakLocalIPAddresses === true ) {
@ -295,6 +298,14 @@ const onUserSettingsReceived = function(details) {
dom.on('#restoreFilePicker', 'change', handleImportFilePicker);
synchronizeDOM();
}
/******************************************************************************/
self.wikilink = 'https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings';
self.hasUnsavedData = function() {
return false;
};
/******************************************************************************/

View file

@ -424,6 +424,9 @@ onBroadcast(msg => {
/******************************************************************************/
µb.isTrustedList = function(assetKey) {
if ( assetKey === this.userFiltersPath ) {
if ( this.userSettings.userFiltersTrusted ) { return true; }
}
if ( this.parsedTrustedListPrefixes.length === 0 ) {
this.parsedTrustedListPrefixes =
µb.hiddenSettings.trustedListPrefixes.split(/ +/).map(prefix => {

View file

@ -30,12 +30,12 @@ import { dom, qs$ } from './dom.js';
const reComment = /^\s*#\s*/;
const directiveFromLine = function(line) {
function directiveFromLine(line) {
const match = reComment.exec(line);
return match === null
? line.trim()
: line.slice(match.index + match[0].length).trim();
};
}
/******************************************************************************/
@ -43,7 +43,7 @@ CodeMirror.defineMode("ubo-whitelist-directives", function() {
const reRegex = /^\/.+\/$/;
return {
token: function(stream) {
token: function token(stream) {
const line = stream.string.trim();
stream.skipToEnd();
if ( reBadHostname === undefined ) {
@ -100,18 +100,18 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor);
/******************************************************************************/
const getEditorText = function() {
function getEditorText() {
let text = cmEditor.getValue().replace(/\s+$/, '');
return text === '' ? text : text + '\n';
};
}
const setEditorText = function(text) {
function setEditorText(text) {
cmEditor.setValue(text.replace(/\s+$/, '') + '\n');
};
}
/******************************************************************************/
const whitelistChanged = function() {
function whitelistChanged() {
const whitelistElem = qs$('#whitelist');
const bad = qs$(whitelistElem, '.cm-error') !== null;
const changedWhitelist = getEditorText().trim();
@ -119,13 +119,13 @@ const whitelistChanged = function() {
qs$('#whitelistApply').disabled = !changed || bad;
qs$('#whitelistRevert').disabled = !changed;
CodeMirror.commands.save = changed && !bad ? applyChanges : noopFunc;
};
}
cmEditor.on('changes', whitelistChanged);
/******************************************************************************/
const renderWhitelist = async function() {
async function renderWhitelist() {
const details = await messaging.send('dashboard', {
what: 'getWhitelist',
});
@ -161,11 +161,11 @@ const renderWhitelist = async function() {
if ( first ) {
cmEditor.clearHistory();
}
};
}
/******************************************************************************/
const handleImportFilePicker = function() {
function handleImportFilePicker() {
const file = this.files[0];
if ( file === undefined || file.name === '' ) { return; }
if ( file.type.indexOf('text') !== 0 ) { return; }
@ -179,22 +179,22 @@ const handleImportFilePicker = function() {
setEditorText(content);
};
fr.readAsText(file);
};
}
/******************************************************************************/
const startImportFilePicker = function() {
function startImportFilePicker() {
const input = qs$('#importFilePicker');
// Reset to empty string, this will ensure an change event is properly
// triggered if the user pick a file, even if it is the same as the last
// one picked.
input.value = '';
input.click();
};
}
/******************************************************************************/
const exportWhitelistToFile = function() {
function exportWhitelistToFile() {
const val = getEditorText();
if ( val === '' ) { return; }
const filename =
@ -205,42 +205,44 @@ const exportWhitelistToFile = function() {
'url': `data:text/plain;charset=utf-8,${encodeURIComponent(val + '\n')}`,
'filename': filename
});
};
}
/******************************************************************************/
const applyChanges = async function() {
async function applyChanges() {
cachedWhitelist = getEditorText().trim();
await messaging.send('dashboard', {
what: 'setWhitelist',
whitelist: cachedWhitelist,
});
renderWhitelist();
};
}
const revertChanges = function() {
function revertChanges() {
setEditorText(cachedWhitelist);
};
}
/******************************************************************************/
const getCloudData = function() {
function getCloudData() {
return getEditorText();
};
}
const setCloudData = function(data, append) {
function setCloudData(data, append) {
if ( typeof data !== 'string' ) { return; }
if ( append ) {
data = uBlockDashboard.mergeNewLines(getEditorText().trim(), data);
}
setEditorText(data.trim());
};
}
self.cloud.onPush = getCloudData;
self.cloud.onPull = setCloudData;
/******************************************************************************/
self.wikilink = 'https://github.com/gorhill/uBlock/wiki/Dashboard:-Trusted-sites';
self.hasUnsavedData = function() {
return getEditorText().trim() !== cachedWhitelist;
};

View file

@ -21,16 +21,15 @@
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="whitelistPane"></div>
<p class="vverbose"><span data-i18n="whitelistPrompt"></span> <a class="fa-icon info important" href="https://github.com/gorhill/uBlock/wiki/Dashboard:-Trusted-sites">info-circle</a>
</p>
<p>
<button id="whitelistApply" class="preferred iconified" type="button" disabled><span class="fa-icon">check</span><span data-i18n="whitelistApply">_</span><span class="hover"></span></button>
<button id="whitelistRevert" class="iconified" type="button" disabled><span class="fa-icon">undo</span><span data-i18n="genericRevert">_</span><span class="hover"></span></button>
&emsp;&emsp;
&emsp;
<button id="importWhitelistFromFile" class="iconified" type="button"><span class="fa-icon">download-alt</span><span data-i18n="whitelistImport">_</span><span class="hover"></span></button>
<button id="exportWhitelistToFile" class="iconified" type="button"><span class="fa-icon">upload-alt</span><span data-i18n="whitelistExport">_</span><span class="hover"></span></button>
</p>
<p class="vverbose" data-i18n="whitelistPrompt">
</p>
</div>
<div id="whitelist" class="codeMirrorContainer cm-theme-override"></div>