[mv3] Add dashboard pane to manage custom filters

Related issue:
https://github.com/uBlockOrigin/uBOL-home/issues/418
This commit is contained in:
Raymond Hill 2025-09-24 10:42:18 -04:00
parent 4fb4aa1b25
commit 8af80be5b2
No known key found for this signature in database
GPG key ID: F5630CAE62A14316
85 changed files with 1907 additions and 94 deletions

View file

@ -19,6 +19,10 @@
"message": "الإعدادات",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "فلاتر مخصصة",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "تطوير",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "المناطق واللغات",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "استيراد / تصدير",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "الصق هنا فلاتر تجميلية محددة لإضافتها",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "سجل التغييرات",
"description": ""
@ -339,6 +351,10 @@
"message": "إرجاع",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "أضِف",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "استيراد وإلحاق…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Tənzimləmələr",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Bölgələr, dillər",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Dəyişikliklər siyahısı",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Налады",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Распрацоўка",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Рэгіёны, мовы",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Журнал змяненняў",
"description": ""
@ -339,6 +351,10 @@
"message": "Вярнуць",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Імпартаваць ды дадаць…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Настройки",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Персонализирани филтри",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Разработка",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Региони, езици",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Импортиране / експортиране",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Поставете тук конкретни козметични филтри, които искате да добавите",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Списък с промени",
"description": ""
@ -339,6 +351,10 @@
"message": "Връщане",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Добавяне",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Импортиране и добавяне…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "সেটিংস",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "অঞ্চল, ভাষা",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "পরিবর্তনসূচি",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Arventennoù",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Siloù personelaet",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Diorren",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Rannvroioù, broioù",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Enporzhiañ / Ezporzhiañ",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Eilañ amañ ar siloù kenedel resis da ouzhpennañ",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Deizlevr ar cheñchamantoù",
"description": ""
@ -339,6 +351,10 @@
"message": "Nullañ",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Ouzhpennañ",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Enporzhiañ hag ouzhpennañ",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Postavke",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Razvoj",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regije, jezici",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Dnevnik izmjena",
"description": ""
@ -339,6 +351,10 @@
"message": "Vrati",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Uvezi i dodaj…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Configuració",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtres personalitzats",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Desenvolupament",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, llengües",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importa/Exporta",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Enganxeu aquí els filtres cosmètics que voleu afegir",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Registre de canvis",
"description": ""
@ -339,6 +351,10 @@
"message": "Restaura",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Afegeix",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importa i annexa…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Nastavení",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Vývoj",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regionální, jazykové",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Přehled změn",
"description": ""
@ -339,6 +351,10 @@
"message": "Vrátit",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importovat a připojit…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Gosodiadau",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Datblygu",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Rhanbarthau, ieithoedd",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Cofnod newidiadau",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Indstillinger",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Udvikl",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regioner, sprog",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Ændringslog",
"description": ""
@ -339,6 +351,10 @@
"message": "Tilbagefør",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importér og tilføj…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Einstellungen",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Eigene Filter",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Entwickeln",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regionen, Sprachen",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importieren und exportieren",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Kosmetische Filter zum Hinzufügen einfügen",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Änderungsprotokoll",
"description": ""
@ -339,6 +351,10 @@
"message": "Rückgängig machen",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Hinzufügen",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importieren und ergänzen …",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Ρυθμίσεις",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Προσαρμοσμένα φίλτρα",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Ανάπτυξη",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Περιοχές, γλώσσες",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Εισαγωγή / Εξαγωγή",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Αρχείο αλλαγών",
"description": ""
@ -339,6 +351,10 @@
"message": "Επαναφορά",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Προσθήκη",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Εισαγωγή και προσθήκη…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Change-log",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Agordoj",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Ŝanĝprotokolo",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Configuración",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtros personalizados",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Desarrollo",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regiones, idiomas",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importar / Exportar",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Pega aquí los filtros cosméticos específicos a agregar",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Registro de cambios",
"description": ""
@ -339,6 +351,10 @@
"message": "Revertir",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Agregar",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importar y anexar…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Sätted",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Isetehtud filtrid",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Arendajale",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regioonid, keeled",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Impordi/ekspordi",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Kindlate kosmeetiliste filtrite lisamiseks asetage need siia",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Muudatuste logi",
"description": ""
@ -339,6 +351,10 @@
"message": "Taasta",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Lisa",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Impordi ja lisa…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Ezarpenak",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Eskualdeak, hizkuntzak",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Aldaketen erregistroa",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "تنظیمات",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "مناطق، زبانها",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "گزارش دگرگونی",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Asetukset",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Kehitys",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Alueet, kielet",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Muutoshistoria",
"description": ""
@ -339,6 +351,10 @@
"message": "Palauta",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Tuo ja lisää…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Mga Setting",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Bumuo",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Mga rehiyon o wika",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Talaan ng mga pagbabago",
"description": ""
@ -339,6 +351,10 @@
"message": "Ibalik",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "I-import at idagdag...",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Paramètres",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtres personnalisés",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Développement",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Régions, langues",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importer / Exporter",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Coller ici les filtres cosmétiques spécifiques à ajouter",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Journal des changements",
"description": ""
@ -339,6 +351,10 @@
"message": "Rétablir",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Ajouter",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importer",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Ynstellingen",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Oanpaste filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Untwikkelje",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Gebieden, talen",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Wizigingslochboek",
"description": ""
@ -339,6 +351,10 @@
"message": "Ungedien meitsje",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Ymportearje en tafoegje…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Axustes",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtros persoais",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Desenvolvemento",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -68,7 +72,7 @@
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"3pGroupMalware": {
"message": "Malware protection, security",
"message": "Protección contra malware, seguridade",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"3pGroupAnnoyances": {
@ -83,6 +87,14 @@
"message": "Rexións, linguas",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importar/Exportar",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Pega aquí os filtros cosméticos a engadir",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Rexistro de cambios",
"description": ""
@ -339,6 +351,10 @@
"message": "Reverter",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Engadir",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importar e engadir…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "הגדרות",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "פיתוח",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "אזורים, שפות",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "יומן שינויים",
"description": ""
@ -339,6 +351,10 @@
"message": "ביטול שינויים",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "ייבא וצרף…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "सेटिंग्स",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "विकास",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "क्षेत्र, भाषाएँ",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "परिवर्तन पत्र",
"description": ""
@ -339,6 +351,10 @@
"message": "पूर्ववत",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "इम्पोर्ट करें और जोड़ें…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Postavke",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Prilagođeni filteri",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Razvoj",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regije, jezici",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Uvoz / Izvoz",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Ovdje zalijepite određene vizualne filtere koje želite dodati",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Popis promjena",
"description": ""
@ -339,6 +351,10 @@
"message": "Poništi",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Dodaj",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Uvesti i dodati...",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Beállítások",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Saját szűrők",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Fejlesztés",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Régiók, nyelvek",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importálás/exportálás",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Illessze be ide a hozzáadandó kozmetikai szűrőket",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Változások listája",
"description": ""
@ -339,6 +351,10 @@
"message": "Visszaállítás",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Hozzáadás",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importálás és hozzáadás…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Կարգավորումներ",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Տարածաշրջաններ, լեզուներ",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Փոփոխությունների մատյան",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Pengaturan",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Mengembangkan",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Wilayah, bahasa",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Catatan perubahan",
"description": ""
@ -339,6 +351,10 @@
"message": "Kembalikan",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Impor dan tambahkan…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Impostazioni",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtri personalizzati",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Sviluppo",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Lingue e regioni",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importa / Esporta",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Incolla qui i filtri cosmetici specifici da aggiungere",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Reg. modifiche",
"description": ""
@ -339,6 +351,10 @@
"message": "Ritorna",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Aggiungi",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importa e accoda…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "設定",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "開発",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "地域・言語",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "更新履歴",
"description": ""
@ -339,6 +351,10 @@
"message": "元に戻す",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "インポートと追加",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "პარამეტრები",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "შემუშავება",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "მხარეები, ენები",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "ცვლილებები",
"description": ""
@ -339,6 +351,10 @@
"message": "დაბრუნება",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "შეტანა და დამატება…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "ಸಂಯೋಜನೆಗಳು",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "ಪ್ರದೇಶಗಳು, ಭಾಷೆಗಳು\n",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "ಬದಲಾವಣೆಗಳು",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "설정",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "개발자용",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "지역, 언어",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "변경 로그",
"description": ""
@ -339,6 +351,10 @@
"message": "되돌리기",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "가져오기 및 추가하기…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Nustatymai",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regionai, kalbos",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Pakeitimų žurnalas",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Iestatījumi",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Pielāgoti atsijātāji",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Izstrādāt",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Apgabali, valodas",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Ievietot/izgūt",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Šeit ir ielīmējami noteikti kosmētiskie aizturētāji, kurus pievienot",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Izmaiņu žurnāls",
"description": ""
@ -339,6 +351,10 @@
"message": "Atjaunot",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Pievienot",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Ievietot un pievienot…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Прилагодби",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Региони, Јазици",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Промени",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "ക്രമീകരണങ്ങൾ",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "പ്രാദേശികം, ഭാഷകള്‍",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "ചേഞ്ച് ലോഗ്",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Tetapan",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Wilayah, bahasa",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Log perubahan",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Innstillinger",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regioner, språk",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Endringslogg",
"description": ""
@ -339,6 +351,10 @@
"message": "Tilbakestill",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importer og legg til...",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Instellingen",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Aangepaste filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Ontwikkelen",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Gebieden, talen",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importeren / Exporteren",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Plak hier specifieke cosmetische filters om toe te voegen",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Wijzigingenlogboek",
"description": ""
@ -339,6 +351,10 @@
"message": "Ongedaan maken",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Toevoegen",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importeren en toevoegen…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "ਸੈਟਿੰਗਾਂ",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "ਖੇਤਰ, ਭਾਸ਼ਾਵਾਂ",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "ਤਬਦੀਲੀ-ਸੂਚੀ",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Ustawienia",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Własne filtry",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Programowanie",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regiony, języki",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import i eksport",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Wklej tutaj określone filtry kosmetyczne do dodania",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Informacje o wydaniu",
"description": ""
@ -339,6 +351,10 @@
"message": "Przywróć",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Dodaj",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importuj i dołącz…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Configurações",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Filtros personalizados",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Desenvolver",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regiões, idiomas",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importar / Exportar",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Cole filtros cosméticos específicos aqui para adicioná-los",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Notas de lançamento",
"description": ""
@ -339,6 +351,10 @@
"message": "Reverter",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Adicionar",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importar e anexar…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Definições",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Programação",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regiões, idiomas",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Registo de alterações",
"description": ""
@ -339,6 +351,10 @@
"message": "Reverter",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importar e anexar…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Opțiuni",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regiuni, limbi",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Jurnal de modificări",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Настройки",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Пользовательские фильтры",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Разработка",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Регионы, языки",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Импорт и экспорт",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Вставьте сюда специальные косметические фильтры для добавления",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Список изменений",
"description": ""
@ -339,6 +351,10 @@
"message": "Вернуть",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Добавить",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Импортировать и добавить…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "සැකසුම්",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "කලාපීය, භාෂා",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "වෙනස්කම් සටහන",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Nastavenia",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Vlastné filtre",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Vývoj",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regióny, jazyky",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import/export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Sem vložte špecifické kozmetické filtre, ktoré chcete pridať",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Zoznam zmien",
"description": ""
@ -339,6 +351,10 @@
"message": "Vrátiť späť",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Pridať",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importovať a pripojiť…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Parametrat",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Zhvillimi",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Sipas rajonit, gjuhës",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Ditari i ndryshimeve",
"description": ""
@ -339,6 +351,10 @@
"message": "Rikthej",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importoj dhe shtoj…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Подешавања",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Прилагођени филтери",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Развити",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Регионални, језички",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Увоз / извоз",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Овде налепите одређене козметичке филтере које желите додати",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Списак измена",
"description": ""
@ -339,6 +351,10 @@
"message": "Врати",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Додај",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Увези и додај…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Inställningar",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Anpassade filter",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Utveckla",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regioner, språk",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Importera / Exportera",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Här klistrar du in specifika kosmetiska filter att lägga till",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Ändringslogg",
"description": ""
@ -339,6 +351,10 @@
"message": "Ångra",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Lägg till",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Importera och lägg till…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Settings",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "ఐచ్చికాలు",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Regions, languages",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Changelog",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "การตั้งค่า",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "พัฒนา",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "ภูมิภาค, ภาษา",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "บันทึการเปลี่ยนแปลง",
"description": ""
@ -339,6 +351,10 @@
"message": "ย้อนกลับ",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "นำเข้าและต่อท้าย…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Ayarlar",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Özel filtreler",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Geliştir",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Bölgeler, diller",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "İçeri/Dışarı aktar",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Eklenmesi için kozmetik filtreleri buraya yapıştırın",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Değişiklik günlüğü",
"description": ""
@ -339,6 +351,10 @@
"message": "Geri al",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Ekle",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "İçe aktar ve ekle…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Налаштування",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Розробка",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Регіони, мови",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Журнал змін",
"description": ""
@ -339,6 +351,10 @@
"message": "Повернути",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Імпортувати та додати…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "ترتیبات",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Develop",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "علاقے، زبانیں۔",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "چینج لاگ",
"description": ""
@ -339,6 +351,10 @@
"message": "Revert",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Import and append…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "Cài đặt",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "Phát triển",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "Khu vực, ngôn ngữ",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "Nhật ký thay đổi",
"description": ""
@ -339,6 +351,10 @@
"message": "Đặt lại",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "Nhập và thêm vào",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "设置",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "Custom filters",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "开发",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "区域、语言",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "Import / Export",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "Paste here specific cosmetic filters to add",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "更新日志",
"description": ""
@ -339,6 +351,10 @@
"message": "还原",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "Add",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "导入并添加…",
"description": "Text for buttons used to import and append content"

View file

@ -19,6 +19,10 @@
"message": "設定",
"description": "appears as tab name in dashboard"
},
"customFiltersPageName": {
"message": "自訂過濾規則",
"description": "appears as tab name in dashboard"
},
"developPageName": {
"message": "開發",
"description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu"
@ -83,6 +87,14 @@
"message": "地區及語言",
"description": "Header for a ruleset section in 'Filter lists pane'"
},
"customFiltersImportExportLabel": {
"message": "匯入 / 匯出",
"description": "Text label heading the import/export area of custom filters"
},
"customFiltersImportTextareaPlaceholder": {
"message": "在此貼上要新增的元素隱藏過濾規則",
"description": "Placeholder text which describes the purpose of the textarea widget"
},
"aboutChangelog": {
"message": "變更日誌",
"description": ""
@ -339,6 +351,10 @@
"message": "還原",
"description": "Text for buttons used to revert changes"
},
"addButton": {
"message": "新增",
"description": "Text for buttons used to add content"
},
"importAndAppendButton": {
"message": "匯入並加入…",
"description": "Text for buttons used to import and append content"

View file

@ -3,7 +3,6 @@ body {
box-sizing: border-box;
display: flex;
flex-direction: column;
padding: 0 var(--default-gap-xxsmall);
}
body > * {
width: min(640px, 100%);

View file

@ -36,6 +36,7 @@ nav > .tabButton:hover {
body[data-pane="settings"] #dashboard-nav .tabButton[data-pane="settings"],
body[data-pane="rulesets"] #dashboard-nav .tabButton[data-pane="rulesets"],
body[data-pane="filters"] #dashboard-nav .tabButton[data-pane="filters"],
body[data-pane="develop"] #dashboard-nav .tabButton[data-pane="develop"],
body[data-pane="about"] #dashboard-nav .tabButton[data-pane="about"] {
background-color: var(--dashboard-tab-active-surface);
@ -51,11 +52,18 @@ body:not([data-pane="rulesets"]) header [data-pane-related="rulesets"] {
}
body > section {
box-sizing: border-box;
display: none;
padding: 0 var(--default-gap-xxsmall);
padding-bottom: 2rem;
}
body [data-pane-related] {
padding: 0 var(--default-gap-xxsmall);
}
body[data-pane="settings"] > section[data-pane="settings"],
body[data-pane="rulesets"] > section[data-pane="rulesets"],
body[data-pane="filters"] > section[data-pane="filters"],
body[data-pane="develop"] > section[data-pane="develop"],
body[data-pane="about"] > section[data-pane="about"] {
display: block;

View file

@ -227,9 +227,105 @@ body.noMoreRuleset .listEntry:has(> .detailbar input:not(:checked)) {
margin-top: 0.2em;
}
#templates {
body section[data-pane="filters"] {
padding-inline: 0;
}
body section[data-pane="filters"] .hostnames {
border-bottom: 1px solid var(--border-1);
margin-block-start: 1em;
}
body section[data-pane="filters"] .hostnames:empty {
display: none;
}
body.busy section[data-pane="filters"] .hostnames {
pointer-events: none;
}
section[data-pane="filters"] ul {
list-style: none;
margin: 0;
padding-inline-start: 0;
}
section[data-pane="filters"] .hostnames > li.hostname > div {
background-color: var(--surface-2);
padding-inline-start: 0.5em;
}
section[data-pane="filters"] ul ul {
padding-block-end: 1em;
padding-inline-start: 0.5em;
}
section[data-pane="filters"] li > div {
display: flex;
padding-block: 4px;
}
section[data-pane="filters"] li [contenteditable] {
flex-grow: 1;
word-break: break-all;
}
section[data-pane="filters"] li [contenteditable]:focus {
background-color: var(--surface-0);
}
section[data-pane="filters"] li .fa-icon {
align-self: baseline;
font-size: calc(var(--font-size) + 2px);
padding: 0 0.5em;
top: 2px;
}
section[data-pane="filters"] li.selector:not(:first-of-type) {
border-top: 1px dotted var(--border-1);
}
section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div [contenteditable],
section[data-pane="filters"] li.selector.removed [contenteditable] {
color: red;
text-decoration-line: line-through;
}
section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div span.remove,
section[data-pane="filters"] li.selector.removed > div span.remove,
section[data-pane="filters"] li.hostname:has(li.selector:not(.removed)) > div span.undo,
section[data-pane="filters"] li.selector:not(.removed) > div span.undo {
display: none;
}
html.desktop section[data-pane="filters"] li > div:hover {
background-color: var(--surface-0);
}
html.desktop section[data-pane="filters"] li > div span.fa-icon:hover {
transform: scale(1.3);
}
section[data-pane="filters"] aside {
padding: 1em 0.5em;
}
section[data-pane="filters"] aside details {
padding: 0;
}
section[data-pane="filters"] aside summary {
cursor: default;
line-height: 2;
}
section[data-pane="filters"] aside .importFromText {
color: var(--ink-2);
}
section[data-pane="filters"] aside .importFromText textarea {
background-color: var(--surface-1);
border: 1px solid var(--border-1);
box-sizing: border-box;
min-height: 6em;
resize: vertical;
width: 100%;
}
section[data-pane="filters"] aside .importFromText textarea:focus {
background-color: var(--surface-0);
}
section[data-pane="filters"] aside .importFromText:has(textarea:placeholder-shown) button:has([data-i18n="addButton"]) {
display: none;
}
section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder-shown)) button:has([data-i18n="importAndAppendButton"]),
section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder-shown)) button:has([data-i18n="exportButton"]) {
display: none;
}
section[data-pane="filters"] aside p {
display: flex;
flex-wrap: wrap;
gap: 1em;
}
@media (max-width: 480px) {
#defaultFilteringMode {

View file

@ -25,6 +25,7 @@
<span class="logo"><img data-i18n-title="extName" src="img/ublock.svg" alt="uBO Lite"></span><!--
--><button class="tabButton" type="button" data-pane="settings" data-i18n="settingsPageName" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="rulesets" data-i18n="aboutFilterLists" tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="filters" data-i18n="customFiltersPageName"tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="develop" data-i18n="developPageName"tabindex="0"></button><!--
--><button class="tabButton" type="button" data-pane="about" data-i18n="aboutPageName" tabindex="0"></button>
</nav>
@ -103,6 +104,20 @@
<div id="lists"></div>
</section>
<!-- -------- -->
<section data-pane="filters">
<ul class="hostnames"></ul>
<aside>
<details class="importFromText"><summary data-i18n="customFiltersImportExportLabel">_</summary>
<div><textarea spellcheck="false" placeholder="customFiltersImportTextareaPlaceholder"></textarea></div>
<p>
<button class="iconified dontshrink" type="button"><span class="fa-icon">check</span><span data-i18n="addButton">_</span><span class="hover"></span></button>
<button class="iconified dontshrink" type="button"><span class="fa-icon">download-alt</span><span data-i18n="importAndAppendButton">_</span><span class="hover"></span></button>
<button class="iconified dontshrink" type="button"><span class="fa-icon">upload-alt</span><span data-i18n="exportButton">_</span><span class="hover"></span></button><input type="file" accept="text/plain">
</p>
</details>
</aside>
</section>
<!-- -------- -->
<section data-pane="develop">
<div>
<p>
@ -150,8 +165,7 @@
</div>
</section>
<!-- -------- -->
<div id="templates">
<div class="listEntries"></div>
<template id="listEntryLeaf">
<div class="listEntry" data-role="leaf">
<span class="detailbar">
<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 class="listname forinput"></span>
@ -161,6 +175,8 @@
</span>
</span>
</div>
</template>
<template id="listEntryNode">
<div class="listEntry expandable" data-role="node">
<span class="detailbar">
<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 class="listname forinput"></span></label>
@ -168,6 +184,8 @@
<span class="fa-icon listExpander">angle-up</span>
</span>
</div>
</template>
<template id="listEntryRoot">
<div class="listEntry expandable" data-role="rootnode">
<div class="detailbar">
<h3 class="listname"></h3>
@ -175,7 +193,18 @@
<span class="fa-icon listExpander">angle-up</span>
</div>
</div>
</div>
</template>
<template id="listEntries">
<div class="listEntries"></div>
</template>
<template id="customFiltersHostname">
<li class="hostname"><div><span class="hostname" spellcheck="false" contenteditable="plaintext-only" data-pretty="" data-ugly=""></span><span class="remove fa-icon">trash-o</span><span class="undo fa-icon">undo</span></div>
<ul class="selectors"></ul>
</li>
</template>
<template id="customFiltersSelector">
<li class="selector"><div><span class="selector" spellcheck="false" contenteditable="plaintext-only" data-pretty="" data-ugly=""></span><span class="remove fa-icon">trash-o</span><span class="undo fa-icon">undo</span></div></li>
</template>
<template class="io-panel">
<span class="io-panel">
<button id="apply" class="preferred iconified" type="button" disabled><span class="fa-icon">save</span><span data-i18n="saveButton">_</span><span class="hover"></span></button>
@ -209,6 +238,7 @@
<script src="js/i18n.js" type="module"></script>
<script src="js/dashboard.js" type="module"></script>
<script src="js/settings.js" type="module"></script>
<script src="js/filter-manager-ui.js" type="module"></script>
<script src="js/develop.js" type="module"></script>
</body>

View file

@ -32,11 +32,13 @@ import {
} from './mode-manager.js';
import {
addCustomFilter,
addCustomFilters,
customFiltersFromHostname,
getAllCustomFilters,
hasCustomFilters,
injectCustomFilters,
removeCustomFilter,
selectorsFromCustomFilters,
removeAllCustomFilters,
removeCustomFilters,
startCustomFilters,
terminateCustomFilters,
} from './filter-manager.js';
@ -475,8 +477,8 @@ function onMessage(request, sender, callback) {
});
return true;
case 'addCustomFilter':
addCustomFilter(request.hostname, request.selector).then(modified => {
case 'addCustomFilters':
addCustomFilters(request.hostname, request.selectors).then(modified => {
if ( modified !== true ) { return; }
return registerInjectables();
}).then(( ) => {
@ -484,8 +486,8 @@ function onMessage(request, sender, callback) {
})
return true;
case 'removeCustomFilter':
removeCustomFilter(request.hostname, request.selector).then(modified => {
case 'removeCustomFilters':
removeCustomFilters(request.hostname, request.selectors).then(modified => {
if ( modified !== true ) { return; }
return registerInjectables();
}).then(( ) => {
@ -493,12 +495,27 @@ function onMessage(request, sender, callback) {
});
return true;
case 'selectorsFromCustomFilters':
selectorsFromCustomFilters(request.hostname).then(selectors => {
case 'removeAllCustomFilters':
removeAllCustomFilters(request.hostname).then(modified => {
if ( modified !== true ) { return; }
return registerInjectables();
}).then(( ) => {
callback();
});
return true;
case 'customFiltersFromHostname':
customFiltersFromHostname(request.hostname).then(selectors => {
callback(selectors);
});
return true;
case 'getAllCustomFilters':
getAllCustomFilters().then(data => {
callback(data);
});
return true;
case 'getTroubleshootingInfo':
getTroubleshootingInfo(request.siteMode).then(info => {
callback(info);

View file

@ -28,6 +28,8 @@ import {
sendMessage,
webextFlavor,
} from './ext.js';
import { faIconsInit } from './fa-icons.js';
import { i18n } from './i18n.js';
/******************************************************************************/
@ -66,7 +68,21 @@ tsinfoObserver.observe(qs$('[data-i18n="supportS5H"] + pre'));
/******************************************************************************/
export function nodeFromTemplate(templateId, nodeSelector) {
const template = qs$(`template#${templateId}`);
const fragment = template.content.cloneNode(true);
const node = nodeSelector !== undefined
? qs$(fragment, nodeSelector)
: fragment.firstElementChild;
faIconsInit(node);
i18n.render(node);
return node;
}
/******************************************************************************/
export function hashFromIterable(iter) {
if ( Boolean(iter) === false ) { return ''; }
return Array.from(iter).sort().join('\n');
}

View file

@ -517,7 +517,7 @@ class Editor {
importFromFile() {
const editor = this.editor;
if ( typeof editor.importFromFile !== 'function' ) { return; }
const input = qs$('input[type="file"]');
const input = qs$('section[data-pane="develop"] input[type="file"]');
input.accept = editor.ioAccept || '';
input.onchange = ev => {
input.onchange = null;
@ -619,15 +619,6 @@ async function start() {
});
}
let observer = new IntersectionObserver(entries => {
for ( const entry of entries ) {
if ( entry.isIntersecting === false ) { continue; }
start();
observer.disconnect();
observer = null;
break;
}
});
observer.observe(qs$('section[data-pane="develop"]'));
dom.onFirstShown(start, qs$('section[data-pane="develop"]'));
/******************************************************************************/

View file

@ -20,9 +20,9 @@
*/
import { dom, qs$, qsa$ } from './dom.js';
import { hashFromIterable, nodeFromTemplate } from './dashboard.js';
import { i18n, i18n$ } from './i18n.js';
import { localRead, localWrite, sendMessage } from './ext.js';
import { hashFromIterable } from './dashboard.js';
/******************************************************************************/
@ -162,16 +162,16 @@ export function renderFilterLists(rulesetData) {
const createListEntry = (listDetails, depth) => {
if ( listDetails.lists === undefined ) {
return dom.clone('#templates .listEntry[data-role="leaf"]');
return nodeFromTemplate('listEntryLeaf', '.listEntry');
}
if ( depth !== 0 ) {
return dom.clone('#templates .listEntry[data-role="node"]');
return nodeFromTemplate('listEntryNode', '.listEntry');
}
return dom.clone('#templates .listEntry[data-role="rootnode"]');
return nodeFromTemplate('listEntryRoot', '.listEntry');
};
const createListEntries = (parentkey, listTree, depth = 0) => {
const listEntries = dom.clone('#templates .listEntries');
const listEntries = nodeFromTemplate('listEntries', '.listEntries');
const treeEntries = Object.entries(listTree);
if ( depth !== 0 ) {
const reEmojis = /\p{Emoji}+/gu;

View file

@ -0,0 +1,486 @@
/*******************************************************************************
uBlock Origin Lite - a comprehensive, MV3-compliant content blocker
Copyright (C) 2025-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
import { browser, sendMessage } from './ext.js';
import { dom, qs$, qsa$ } from './dom.js';
import { nodeFromTemplate } from './dashboard.js';
import punycode from './punycode.js';
/******************************************************************************/
const dataContainer = qs$('section[data-pane="filters"] .hostnames');
/******************************************************************************/
function isValidHostname(hostname) {
try {
const url = new URL(`https://${hostname}/`);
return url.hostname === hostname;
} catch {
}
return false;
}
/******************************************************************************/
function toPrettySelector(selector) {
if ( selector.startsWith('{') === false ) { return selector; }
try {
return JSON.parse(selector).raw;
} catch {
}
return selector;
}
/******************************************************************************/
function hostnameFromNode(node) {
const li = node.closest('li.hostname');
if ( li === null ) { return; }
const span = qs$(li, '.hostname[data-pretty]');
if ( span === null ) { return; }
return span.dataset.ugly || undefined;
}
function selectorFromNode(node) {
const li = node.closest('li.selector');
if ( li === null ) { return; }
const span = qs$(li, '.selector[data-pretty]');
if ( span === null ) { return; }
return span.dataset.ugly || undefined;
}
function selectorsFromNode(node, all = false) {
const li = node.closest('li.hostname');
if ( li === null ) { return []; }
const qsel = all
? 'li.selector [contenteditable]'
: 'li.selector:not(.removed) [contenteditable]';
return Array.from(qsa$(li, qsel)).map(a => a.dataset.ugly);
}
/******************************************************************************/
async function removeSelectorsFromHostname(node) {
const hostnameNode = node.closest('li.hostname');
if ( hostnameNode === null ) { return; }
const hostname = hostnameFromNode(hostnameNode);
if ( hostname === undefined ) { return; }
const selectors = Array.from(
qsa$(hostnameNode, 'li.selector.removed [contenteditable]')
).map(a => a.dataset.ugly);
if ( selectors.length === 0 ) { return; }
dom.cl.add(dom.body, 'busy');
updateContentEditability();
await sendMessage({ what: 'removeCustomFilters', hostname, selectors });
await debounceRenderCustomFilters();
dom.cl.remove(dom.body, 'busy');
updateContentEditability();
}
async function unremoveSelectorsFromHostname(node) {
const hostnameNode = node.closest('li.hostname');
if ( hostnameNode === null ) { return; }
const hostname = hostnameFromNode(hostnameNode);
if ( hostname === undefined ) { return; }
const selectors = Array.from(
qsa$(hostnameNode, 'li.selector:not(.removed) [contenteditable]')
).map(a => a.dataset.ugly);
if ( selectors.length === 0 ) { return; }
dom.cl.add(dom.body, 'busy');
updateContentEditability();
await sendMessage({ what: 'addCustomFilters', hostname, selectors });
await debounceRenderCustomFilters();
dom.cl.remove(dom.body, 'busy');
updateContentEditability();
}
/******************************************************************************/
function dataFromDOM() {
const data = new Map();
for ( const hostnameNode of qsa$('li.hostname') ) {
const hostname = hostnameFromNode(hostnameNode);
const selectors = [];
for ( const selectorNode of qsa$(hostnameNode, 'li.selector') ) {
selectors.push(selectorFromNode(selectorNode));
}
data.set(hostname, selectors);
}
return data;
}
/******************************************************************************/
async function renderCustomFilters() {
const data = await sendMessage({ what: 'getAllCustomFilters' });
if ( Boolean(data) === false ) { return; }
const storedData = new Map(data);
const domData = dataFromDOM();
const hostnames = Array.from(
new Set([
...Array.from(storedData.keys()),
...Array.from(domData.keys()),
])
).sort();
const fragment = document.createDocumentFragment();
for ( const hostname of hostnames ) {
const hostnameNode = nodeFromTemplate('customFiltersHostname');
const label = qs$(hostnameNode, 'span.hostname');
label.dataset.ugly = hostname;
const pretty = punycode.toUnicode(hostname);
label.dataset.pretty = pretty;
dom.text(label, pretty);
const storedSelectors = new Set(storedData.get(hostname));
const domSelectors = new Set(domData.get(hostname));
const selectors = Array.from(
new Set([
...Array.from(storedSelectors),
...Array.from(domSelectors),
])
).sort();
const ulSelectors = qs$(hostnameNode, '.selectors');
for ( const selector of selectors ) {
const selectorNode = nodeFromTemplate('customFiltersSelector');
const label = qs$(selectorNode, 'span.selector');
label.dataset.ugly = selector;
const pretty = toPrettySelector(selector);
label.dataset.pretty = pretty;
dom.text(label, pretty);
if ( storedSelectors.has(selector) === false ) {
dom.cl.add(selectorNode, 'removed');
}
ulSelectors.append(selectorNode);
}
fragment.append(hostnameNode);
}
dom.remove('section[data-pane="filters"] .hostnames > .hostname');
dataContainer.prepend(fragment);
}
async function debounceRenderCustomFilters() {
let { debouncer } = debounceRenderCustomFilters;
if ( debouncer === undefined ) {
debouncer = debounceRenderCustomFilters.debouncer = {};
debouncer.promise = new Promise(resolve => {
debouncer.resolve = resolve;
});
}
if ( debouncer.timer !== undefined ) {
self.clearTimeout(debouncer.timer);
}
debouncer.timer = self.setTimeout(( ) => {
const { resolve } = debounceRenderCustomFilters.debouncer;
debounceRenderCustomFilters.debouncer = undefined;
renderCustomFilters().then(resolve);
}, 151);
return debouncer.promise;
}
debounceRenderCustomFilters.debouncer = undefined;
/******************************************************************************/
function updateContentEditability() {
if ( dom.cl.has(dom.body, 'busy') ) {
dom.attr('[contenteditable]', 'contenteditable', 'false');
return;
}
dom.attr('section[data-pane="filters"] li:not(.removed) [contenteditable]',
'contenteditable',
'plaintext-only'
);
// No point editing a removed hostname
dom.attr('section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div [contenteditable]',
'contenteditable',
'false'
);
// No point editing a removed selector
dom.attr('section[data-pane="filters"] .selector.removed [contenteditable]',
'contenteditable',
'false'
);
}
/******************************************************************************/
async function onHostnameChanged(target, before, after) {
const uglyAfter = punycode.toASCII(after);
if ( isValidHostname(uglyAfter) === false ) {
target.textContent = before;
return;
}
dom.cl.add(dom.body, 'busy');
updateContentEditability();
// Remove old hostname from storage
await sendMessage({ what: 'removeAllCustomFilters',
hostname: target.dataset.ugly,
});
// Add selectors under new hostname to storage
target.dataset.ugly = uglyAfter;
target.dataset.pretty = after;
await sendMessage({ what: 'addCustomFilters',
hostname: hostnameFromNode(target),
selectors: selectorsFromNode(target),
});
await debounceRenderCustomFilters();
dom.cl.remove(dom.body, 'busy');
updateContentEditability();
}
async function onSelectorChanged(target, before, after) {
// Validate selector
const parserModule = await import('./static-filtering-parser.js');
const compiler = new parserModule.ExtSelectorCompiler({ nativeCssHas: true });
const result = {};
if ( compiler.compile(after, result) === false ) {
target.textContent = before;
return;
}
const hostname = hostnameFromNode(target);
dom.cl.add(dom.body, 'busy');
updateContentEditability();
// Remove old selector from storage
await sendMessage({ what: 'removeCustomFilters',
hostname,
selectors: [ target.dataset.ugly ],
});
// Add new selector to storage
target.dataset.ugly = result.compiled;
target.dataset.pretty = result.raw;
await sendMessage({ what: 'addCustomFilters',
hostname,
selectors: [ result.compiled ],
});
await debounceRenderCustomFilters();
dom.cl.remove(dom.body, 'busy');
updateContentEditability();
}
function onTextChanged(target) {
const before = target.dataset.pretty;
const after = target.textContent.trim();
if ( after !== target.textContent ) {
target.textContent = after;
}
if ( after === before ) { return; }
if ( after === '' ) {
target.textContent = before;
return;
}
if ( target.matches('.hostname') ) {
onHostnameChanged(target, before, after);
} else if ( target.matches('.selector') ) {
onSelectorChanged(target, before, after);
}
}
/******************************************************************************/
function startEdit(ev) {
focusedEditableContent = ev.target;
}
function endEdit(ev) {
const { target } = ev;
if ( target.textContent !== target.dataset.pretty ) {
onTextChanged(target);
}
focusedEditableContent = null;
}
function commitEdit(ev) {
const { target } = ev;
if ( target === focusedEditableContent ) {
if ( ev.inputType === 'insertLineBreak' ) { target.blur(); }
return;
}
onTextChanged(target);
}
let focusedEditableContent = null;
/******************************************************************************/
function onTrashClicked(ev) {
const { target } = ev;
const node = target.closest('li.selector');
if ( node ) {
dom.cl.add(node, 'removed');
} else {
dom.cl.add(qsa$(target.closest('li.hostname'), 'li.selector'), 'removed');
}
removeSelectorsFromHostname(target);
}
function onUndoClicked(ev) {
const { target } = ev;
const node = target.closest('li.selector');
if ( node ) {
dom.cl.remove(node, 'removed');
} else {
dom.cl.remove(qsa$(target.closest('li.hostname'), 'li.selector'), 'removed');
}
unremoveSelectorsFromHostname(target);
}
/******************************************************************************/
async function importFromText(text) {
const parserModule = await import('./static-filtering-parser.js');
const parser = new parserModule.AstFilterParser({ nativeCssHas: true });
const lines = text.split(/\n/);
const hostnameToSelectorsMap = new Map();
for ( const line of lines ) {
parser.parse(line);
if ( parser.hasError() ) { continue; }
if ( parser.isCosmeticFilter() === false ) { continue; }
if ( parser.hasOptions() === false ) { continue; }
const { compiled, exception } = parser.result;
if ( compiled === undefined ) { continue; }
if ( exception ) { continue; }
const hostnames = new Set();
for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) {
if ( bad ) { continue; }
if ( hn.includes('/') ) { continue; }
if ( hn.includes('*') ) { continue; }
if ( not ) { hostnames.length = 0; break; }
hostnames.add(hn);
}
for ( const hn of hostnames ) {
const selectors = hostnameToSelectorsMap.get(hn) || new Set();
if ( selectors.size === 0 ) {
hostnameToSelectorsMap.set(hn, selectors)
}
selectors.add(compiled);
}
}
if ( hostnameToSelectorsMap.size === 0 ) { return; }
dom.cl.add(dom.body, 'busy');
updateContentEditability();
const promises = [];
for ( const [ hostname, selectors ] of hostnameToSelectorsMap ) {
promises.push(
sendMessage({ what: 'addCustomFilters',
hostname,
selectors: Array.from(selectors),
})
);
}
await Promise.all(promises);
await debounceRenderCustomFilters();
dom.cl.remove(dom.body, 'busy');
updateContentEditability();
}
/******************************************************************************/
function importFromTextarea() {
dom.prop('section[data-pane="filters"] details', 'open', false);
const textarea = qs$('section[data-pane="filters"] .importFromText textarea');
importFromText(textarea.value);
textarea.value = '';
}
/******************************************************************************/
function importFromFile() {
const input = qs$('section[data-pane="filters"] input[type="file"]');
input.onchange = ev => {
input.onchange = null;
const file = ev.target.files[0];
if ( file === undefined || file.name === '' ) { return; }
const fr = new FileReader();
fr.onload = ( ) => {
if ( typeof fr.result !== 'string' ) { return; }
importFromText(fr.result);
};
fr.readAsText(file);
};
// Reset to empty string, this will ensure a change event is properly
// triggered if the user pick a file, even if it's the same as the last
// one picked.
input.value = '';
input.click();
dom.prop('section[data-pane="filters"] details', 'open', false);
}
/******************************************************************************/
function exportToFile() {
const lines = [];
for ( const hostnameNode of qsa$('.hostnames li.hostname') ) {
const hostname = hostnameFromNode(hostnameNode);
const selectors = selectorsFromNode(hostnameNode);
for ( const selector of selectors ) {
lines.push(`${hostname}##${toPrettySelector(selector)}`);
}
lines.push('');
}
const text = lines.join('\n').trim();
if ( text.length === 0 ) { return; }
const a = document.createElement('a');
a.href = `data:text/plain;charset=utf-8,${encodeURIComponent(text + '\n')}`;
dom.attr(a, 'download', 'my-ubol-filters.txt');
dom.attr(a, 'type', 'text/plain');
a.click();
dom.prop('section[data-pane="filters"] details', 'open', false);
}
/******************************************************************************/
async function start() {
renderCustomFilters();
dom.on(dataContainer, 'focusin', 'section[data-pane="filters"] [contenteditable]', startEdit);
dom.on(dataContainer, 'focusout', 'section[data-pane="filters"] [contenteditable]', endEdit);
dom.on(dataContainer, 'input', 'section[data-pane="filters"] [contenteditable]', commitEdit);
dom.on(dataContainer, 'click', 'section[data-pane="filters"] .remove', onTrashClicked);
dom.on(dataContainer, 'click', 'section[data-pane="filters"] .undo', onUndoClicked);
dom.on('section[data-pane="filters"] [data-i18n="addButton"]', 'click', importFromTextarea);
dom.on('section[data-pane="filters"] [data-i18n="importAndAppendButton"]', 'click', importFromFile);
dom.on('section[data-pane="filters"] [data-i18n="exportButton"]', 'click', exportToFile);
browser.storage.local.onChanged.addListener((changes, area) => {
if ( area !== undefined && area !== 'local' ) { return; }
if ( Object.keys(changes).some(a => a.startsWith('site.')) ) {
debounceRenderCustomFilters();
}
});
}
/******************************************************************************/
// Update pane on-demand
dom.onFirstShown(start, qs$('section[data-pane="filters"]'));

View file

@ -38,15 +38,41 @@ import { ubolErr } from './debug.js';
/******************************************************************************/
const perSitePendingIO = new Map();
async function flushWrites() {
while ( pendingWrites.length !== 0 ) {
const promises = pendingWrites;
pendingWrites.length = 0;
await Promise.all(promises);
}
}
async function keysFromStorage() {
await flushWrites();
return localKeys();
}
async function readFromStorage(key) {
await flushWrites();
return localRead(key);
}
async function writeToStorage(key, value) {
pendingWrites.push(localWrite(key, value));
}
async function removeFromStorage(key) {
pendingWrites.push(localRemove(key));
}
const pendingWrites = [];
/******************************************************************************/
export async function selectorsFromCustomFilters(hostname) {
export async function customFiltersFromHostname(hostname) {
const promises = [];
let hn = hostname;
while ( hn !== '' ) {
promises.push(localRead(`site.${hn}`));
promises.push(readFromStorage(`site.${hn}`));
const pos = hn.indexOf('.');
if ( pos === -1 ) { break; }
hn = hn.slice(pos + 1);
@ -66,19 +92,31 @@ export async function selectorsFromCustomFilters(hostname) {
/******************************************************************************/
export async function hasCustomFilters(hostname) {
const selectors = await selectorsFromCustomFilters(hostname);
const selectors = await customFiltersFromHostname(hostname);
return selectors?.length ?? 0;
}
/******************************************************************************/
async function getAllCustomFilterKeys() {
const storageKeys = await localKeys() || [];
const storageKeys = await keysFromStorage() || [];
return storageKeys.filter(a => a.startsWith('site.'));
}
/******************************************************************************/
export async function getAllCustomFilters() {
const collect = async key => {
const selectors = await readFromStorage(key);
return [ key.slice(5), selectors.map(a => a.startsWith('0') ? a.slice(1) : a) ];
};
const keys = await getAllCustomFilterKeys();
const promises = keys.map(k => collect(k));
return Promise.all(promises);
}
/******************************************************************************/
export function startCustomFilters(tabId, frameId) {
return browser.scripting.executeScript({
files: [ '/js/scripting/css-user.js' ],
@ -102,7 +140,7 @@ export function terminateCustomFilters(tabId, frameId) {
/******************************************************************************/
export async function injectCustomFilters(tabId, frameId, hostname) {
const selectors = await selectorsFromCustomFilters(hostname);
const selectors = await customFiltersFromHostname(hostname);
if ( selectors.length === 0 ) { return; }
const promises = [];
const plainSelectors = selectors.filter(a => a.startsWith('{') === false);
@ -136,9 +174,6 @@ export async function injectCustomFilters(tabId, frameId, hostname) {
/******************************************************************************/
export async function registerCustomFilters(context) {
if ( perSitePendingIO.size !== 0 ) {
await Promise.all(Array.from(perSitePendingIO.values()));
}
const siteKeys = await getAllCustomFilterKeys();
if ( siteKeys.length === 0 ) { return; }
@ -174,37 +209,35 @@ export async function registerCustomFilters(context) {
/******************************************************************************/
export async function addCustomFilter(hostname, selector) {
const pending = perSitePendingIO.get(hostname);
const promise = pending
? pending.then(( ) => addCustomFilterByHostname(hostname, selector))
: addCustomFilterByHostname(hostname, selector);
perSitePendingIO.set(hostname, promise);
promise.then(( ) => {
if ( promise !== perSitePendingIO.get(hostname) ) { return; }
perSitePendingIO.delete(hostname);
});
return promise;
}
async function addCustomFilterByHostname(hostname, selector) {
export async function addCustomFilters(hostname, toAdd) {
if ( hostname === '' ) { return false; }
const key = `site.${hostname}`;
const selectors = await localRead(key) || [];
if ( selectors.includes(selector) ) { return false; }
selectors.push(selector);
const selectors = await readFromStorage(key) || [];
const countBefore = selectors.length;
for ( const selector of toAdd ) {
if ( selectors.includes(selector) ) { continue; }
selectors.push(selector);
}
if ( selectors.length === countBefore ) { return false; }
selectors.sort();
await localWrite(key, selectors);
writeToStorage(key, selectors);
return true;
}
/******************************************************************************/
export async function removeCustomFilter(hostname, selector) {
export async function removeAllCustomFilters(hostname) {
const key = `site.${hostname}`;
const selectors = await readFromStorage(key) || [];
removeFromStorage(key);
return selectors.length !== 0;
}
export async function removeCustomFilters(hostname, selectors) {
const promises = [];
let hn = hostname;
while ( hn !== '' ) {
promises.push(removeCustomFilterByHostname(hn, selector));
promises.push(removeCustomFiltersByKey(`site.${hn}`, selectors));
const pos = hn.indexOf('.');
if ( pos === -1 ) { break; }
hn = hn.slice(pos + 1);
@ -213,33 +246,24 @@ export async function removeCustomFilter(hostname, selector) {
return results.some(a => a);
}
async function removeCustomFilterByHostname(hostname, selector) {
const pending = perSitePendingIO.get(hostname);
const key = `site.${hostname}`;
const promise = pending
? pending.then(( ) => removeCustomFilterByKey(key, selector))
: removeCustomFilterByKey(key, selector);
perSitePendingIO.set(hostname, promise);
promise.then(( ) => {
if ( promise !== perSitePendingIO.get(hostname) ) { return; }
perSitePendingIO.delete(hostname);
});
return promise;
}
async function removeCustomFilterByKey(key, selector) {
const selectors = await localRead(key);
async function removeCustomFiltersByKey(key, toRemove) {
const selectors = await readFromStorage(key);
if ( selectors === undefined ) { return false; }
let i = selectors.indexOf(selector);
if ( i === -1 ) {
i = selectors.indexOf(`0${selector}`);
if ( i === -1 ) { return false; }
const beforeCount = selectors.length;
for ( const selector of toRemove ) {
let i = selectors.indexOf(selector);
if ( i === -1 ) {
i = selectors.indexOf(`0${selector}`);
if ( i === -1 ) { continue; }
}
selectors.splice(i, 1);
}
selectors.splice(i, 1);
if ( selectors.length !== 0 ) {
await localWrite(key, selectors);
const afterCount = selectors.length;
if ( afterCount === beforeCount ) { return false; }
if ( afterCount !== 0 ) {
writeToStorage(key, selectors);
} else {
await localRemove(key);
removeFromStorage(key);
}
return true;
}

View file

@ -230,9 +230,9 @@ async function onCreateClicked() {
if ( selector === undefined ) { return; }
await toolOverlay.postMessage({ what: 'terminateCustomFilters' });
await toolOverlay.sendMessage({
what: 'addCustomFilter',
what: 'addCustomFilters',
hostname: toolOverlay.url.hostname,
selector,
selectors: [ selector ],
});
await toolOverlay.postMessage({ what: 'startCustomFilters' });
qs$('textarea').value = '';

View file

@ -35,10 +35,10 @@ function onMessage(msg) {
return ubolOverlay.sendMessage({ what: 'startCustomFilters' });
case 'terminateCustomFilters':
return ubolOverlay.sendMessage({ what: 'terminateCustomFilters' });
case 'removeCustomFilter':
return ubolOverlay.sendMessage({ what: 'removeCustomFilter',
case 'removeCustomFilters':
return ubolOverlay.sendMessage({ what: 'removeCustomFilters',
hostname: ubolOverlay.url.hostname,
selector: msg.selector,
selectors: [ msg.selector ],
});
default:
break;

View file

@ -69,9 +69,9 @@ function onFilterClicked(ev) {
if ( target === trashElem ) {
dom.cl.add(filterElem, 'removed');
dom.cl.remove(filterElem, 'on');
toolOverlay.sendMessage({ what: 'removeCustomFilter',
toolOverlay.sendMessage({ what: 'removeCustomFilters',
hostname: toolOverlay.url.hostname,
selector,
selectors: [ selector ],
}).then(( ) => {
autoSelectFilter();
});
@ -80,9 +80,9 @@ function onFilterClicked(ev) {
const undoElem = qs$(filterElem, ':scope > span.undo');
if ( target === undoElem ) {
dom.cl.remove(filterElem, 'removed');
toolOverlay.sendMessage({ what: 'addCustomFilter',
toolOverlay.sendMessage({ what: 'addCustomFilters',
hostname: toolOverlay.url.hostname,
selector,
selectors: [ selector ],
}).then(( ) => {
dom.cl.remove('.customFilter.on', 'on');
dom.cl.add(filterElem, 'on');
@ -130,7 +130,7 @@ function populateFilters(selectors) {
async function startUnpicker() {
const selectors = await toolOverlay.sendMessage({
what: 'selectorsFromCustomFilters',
what: 'customFiltersFromHostname',
hostname: toolOverlay.url.hostname,
})
if ( selectors.length === 0 ) {

View file

@ -156,6 +156,16 @@ class dom {
elem.removeEventListener(type, callback, options);
}
}
static onFirstShown(fn, elem) {
let observer = new IntersectionObserver(entries => {
if ( entries.every(a => a.isIntersecting === false) ) { return; }
try { fn(); } catch { }
observer.disconnect();
observer = undefined;
});
observer.observe(elem);
}
}
dom.cl = class {