1
0
Fork 0
mirror of https://github.com/gorhill/uMatrix.git synced 2024-06-17 09:44:59 +12:00

Merge branch 'master' into master

This commit is contained in:
Ryan 2018-03-29 23:40:39 -04:00 committed by GitHub
commit 4c9c799dba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
80 changed files with 13264 additions and 2115 deletions

View file

@ -3,10 +3,10 @@
"uMatrix@raymondhill.net": {
"updates": [
{
"version": "1.3.3b9",
"version": "1.3.5b4",
"applications": { "gecko": { "strict_min_version": "56" } },
"update_info_url": "https://github.com/gorhill/uMatrix/releases/tag/1.3.3b9",
"update_link": "https://github.com/gorhill/uMatrix/releases/download/1.3.3b9/uMatrix.webext.signed.xpi"
"update_info_url": "https://github.com/gorhill/uMatrix/releases/tag/1.3.5b4",
"update_link": "https://github.com/gorhill/uMatrix/releases/download/1.3.5b4/uMatrix.webext.signed.xpi"
}
]
}

2
dist/version vendored
View file

@ -1 +1 @@
1.3.4
1.3.5.4

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix – Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "لم يتم العثور على أي صفحة ويب",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; إحصائيات",
"description": ""
@ -311,34 +319,6 @@
"message": "موقع",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "عند إغلاق المصفوفة، إعادة تحميل علامات التبويب هذه:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "لا شيء",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "الصفحة الحالية",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "الكل",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "كلما قمت بإجراء تغييرات في المصفوفة التي يمكن أن تؤثر على العرض و\/ أو سلوك صفحة واحدة أو أكثر،<i>uMatrix<\/i>سوف تحميل صفحات المتضررة تلقائيا عند إغلاق المصفوفة.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "الشفافية",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "انهيار نائبا من عناصر المحظورة",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "استيراد...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "تحذير! غير إعدادات الضبط الخام على مسؤوليتك الخاصة.",
"description": ""

View file

@ -36,7 +36,7 @@
"description": "a tab in dashboard"
},
"rawSettingsPageName": {
"message": "More",
"message": "Още",
"description": "a tab in dashboard"
},
"aboutPageName": {
@ -60,7 +60,7 @@
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"mediaPrettyName": {
"message": "media",
"message": "медия",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"pluginPrettyName": {
@ -148,9 +148,17 @@
"description": "A menu entry in the matrix popup"
},
"matrixNoTabFound": {
"message": "No web page found",
"message": "Няма намерена уеб страница",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Запис на правилата",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Статистика",
"description": ""
@ -300,45 +308,17 @@
"description": "Label for default scope level selector in Settings pane"
},
"settingsDefaultScopeLevel0": {
"message": "Global",
"message": "Глобално",
"description": "Scope will be global"
},
"settingsDefaultScopeLevel1": {
"message": "Domain",
"message": "Домейн",
"description": "Scope will be base domain"
},
"settingsDefaultScopeLevel2": {
"message": "Site",
"message": "Сайт",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Затваряйки матрицата, започва умно презареждане на тези табове:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Текуща версия",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Всичко",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Блокирани рамки:&ensp;Цвят",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Непрозрачност",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -356,7 +336,7 @@
"description": ""
},
"settingsMatrixNoTooltips": {
"message": "Disable tooltips",
"message": "Изключване на подсказките",
"description": ""
},
"privacyPageTitle": {
@ -388,7 +368,7 @@
"description": ""
},
"privacyDeleteBlockedLocalStorageHelp": {
"message": "TODO",
"message": "Задачи за правене",
"description": ""
},
"privacyClearCachePrompt1": {
@ -539,8 +519,16 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"message": "Внимание! Промяната на тези настройки на конфигурацията е на ваш собствен риск.",
"description": ""
},
"aboutChangelog": {
@ -736,7 +724,7 @@
"description": ""
},
"genericApplyChanges": {
"message": "Apply changes",
"message": "Прилагане на промените",
"description": "for generic 'Apply changes' buttons"
}
}

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uম্যাট্রিক্স &ndash; পরিসংখ্যান",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "ম্যাট্রিক্স যখন বন্ধ হয়ে যায়, স্মার্ট এই ট্যাবগুলি পুনঃলোড করে:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "কিছুই না",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "বর্তমান",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "সব",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "যখনই আপনি ম্যাট্রিক্সে পরিবর্তন করবেন এটি এক বা একাধিক পাতা প্রদর্শনের আচরণ প্রভাবিত করতে পারে, আপনি ম্যাট্রিক্স বন্ধ করলে <i>uম্যাট্রিক্স<\/i> স্বয়ংক্রিয়ভাবে প্রভাবিত পৃষ্ঠাগুলি পুনরায় লোড করবে।",
"description": ""
},
"settingsSubframeColor": {
"message": "অবরুদ্ধ ফ্রেম:&ensp;রং",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "অস্বচ্ছতা",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "অবরুদ্ধ উপাদান সংকোচনের স্থানধারক",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Žádné stránky nebyly nalezeny",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "µMatrix Statistiky",
"description": ""
@ -311,34 +319,6 @@
"message": "Stránka",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Obnovit tyto stránky, jakmile je zavřena matice:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Žádné",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Aktuální",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Všechny",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blokované rámce:&ensp;Barva",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Neprůhlednost",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Skrýt zástupné objekty zablokovaných prvků",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistik",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Genindlæs disse faner \"smart\", når matricen er lukket:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Ingen",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Nuværende",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Alle",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Hver gang du ændrer noget i matricen, der kan have indflydelse på en eller flere siders udseende eller adfærd, vil <i>uMatrix<\/i> automatisk genindlæse de påvirkede sider, når du lukker matricen.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blokerede frames:&ensp;Farve",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Uigennemsigtighed",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Sammenfold pladsholder for blokerede elementer",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Keine Webseite gefunden",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Regeln importieren",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Regeln speichern",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "µMatrix &ndash; Statistik",
"description": ""
@ -311,34 +319,6 @@
"message": "Seite",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Intelligentes Neuladen folgender Tabs beim Schließen der Matrix:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Keine",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "den Aktuellen",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Alle",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Immer wenn du Änderungen in der Matrix durchführst, die die Anzeige und\/oder das Verhalten einer oder mehrerer Seiten beeinflusst, wird <i>uMatrix<\/i> die betroffenen Seiten automatisch neu laden, sobald du die Matrix schließt.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blockierte Frames:&ensp;Farbe",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Undurchsuchtigkeit",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Verstecke die Platzhalter für blockierte Elemente",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importieren...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Meine Hostnamen",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Meine Rezepte",
"description": ""
},
"rawSettingsWarning": {
"message": "Warnung! Die Änderung dieser Konfigurations-Einstellungen erfolgt auf eigenes Risiko.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Στατιστικά",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Όλα",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -159,6 +159,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip" : {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip" : {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle" : {
"message": "uMatrix &ndash; Statistics",
@ -322,34 +330,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt" : {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone" : {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent" : {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll" : {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo" : {
"message": "Whenever you make changes in the matrix which can affect the display and/or behavior of one or more pages, <i>uMatrix</i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor" : {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity" : {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked" : {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Nuna",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opakeco",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No se encontró la página",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Estadísticas",
"description": ""
@ -311,34 +319,6 @@
"message": "Sitio",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Al cerrar la matriz, hacer recarga inteligente de las siguientes pestañas:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Ninguna",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Actuales",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Todas",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Cada vez que se hagan cambios en la matriz que puedan afectar la visualización y\/o el comportamiento de una o más páginas, <i>uMatrix<\/i> recargará automáticamente las páginas afectadas una vez se cierre la matriz.",
"description": ""
},
"settingsSubframeColor": {
"message": "<i>Frames<\/i> bloqueados:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacidad",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Colapsar marcadores de posición de los elementos bloqueados",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importar...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "¡Atención! Modifique estos parámetros bajo su propio riesgo.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Lehekülge ei leitud",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "µMatrix &ndash; statistika",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Pole",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Kõik",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; آمارها",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "وقتی ماتریس بسته شد، تب‌ها را هوشمندانه دوباره بارگذاری کن:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "هیچ‌کدام",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "کنونی",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "همه",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "وضوح",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Tilastot",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Ei mitään",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Nykyinen",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Kaikki",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Läpinäkyvyys",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Walang nakitang pahina ng web",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Istatistika",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Kapag isinara ang matrix, ang smart na i-reload ang mga tab na ito:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Wala",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Kasalukuyan",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Lahat",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Sa tuwing gumawa ka ng mga pagbabago sa matrix na maaaring makaapekto sa display at \/ o pag-uugali ng isa o higit pang mga pahina, awtomatikong i-reload ng <i>uMatrix<\/i> ang mga apektadong pahina kapag isinara mo ang matris.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Kulay",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "I-collapse ang mga placeholder ng mga naka-block na elemento",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Aucune page Web trouvée",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Importer les règles",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Enregistrer les règles",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistiques",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "À la fermeture post-édition de la matrice, recharger si nécessaire :",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Aucune page",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "La page courante",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Toutes les pages",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Lorsque vous avez modifié des permissions susceptibles d'affecter l'apparence et\/ou le comportement d'une page Web, <i>uMatrix<\/i> rechargera automatiquement une ou plusieurs page(s) Web concernée(s) à la fermeture de la matrice. Si l'option Aucune page est sélectionnée, vous devrez actualiser la page Web vous-même pour appliquer les modifications.",
"description": ""
},
"settingsSubframeColor": {
"message": "Couleur pour les <i>frames<\/i> bloquées :",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacité :",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Cacher les espaces réservés aux éléments bloqués",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importer...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Mes hôtes",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Mes recettes",
"description": ""
},
"rawSettingsWarning": {
"message": "Attention, modifiez ces paramètres bruts à vos risques et périls.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "לא נמצא עמוד",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; סטטיסטיקות",
"description": ""
@ -311,34 +319,6 @@
"message": "אתר",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "לאחר סגירת המטריצה, טען מחדש בצורה חכמה את הלשוניות הבאות:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "ללא",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "נוכחי",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "כולם",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "בכל פעם שאתה עושה שינויים במטריצה אשר יכולים להשפיע על ההצגה ו\/או התנהגות של דף או יותר, <i>uMatrix<\/i> יטען מחדש את העמודים המושפעים אוטומטית כשתסגור את המטריצה.",
"description": ""
},
"settingsSubframeColor": {
"message": "מסגרות חסומות:&ensp;צבע",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "אטימות",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "הסתר את המקום שנשאר מחסימה של אלמנטים",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "ייבא...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "אזהרה! שנה הגדרות אלה על אחריותך בלבד.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "कोई नहीं",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Nem található weboldal",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statisztika",
"description": ""
@ -311,34 +319,6 @@
"message": "Weboldal",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "A mátrix bezárásával a következő lapok intelligens újratöltése:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Nincs",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Jelenlegi",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Mind",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Amennyiben a mátrixban olyan változtatások történnek, amelyek egy, vagy több oldal megjelenítését vagy működését befolyásolják, a mátrix bezárása után a <i>uMatrix<\/i> automatikusan újra fogja tölteni az érintett oldalakat.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blokkolt keret:&ensp;Szín",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Áttetszőség",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Blokkolt elemek helyőrzőinek elrejtése",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importálás...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Vigyázat! Ezen nyers beállítások megváltoztatása csak saját felelősségre.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Laman web tidak ditemukan",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistik",
"description": ""
@ -311,34 +319,6 @@
"message": "Situs",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Ketika matriks ditutup, muat ulang dengan cerdas tab berikut:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Nihil",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Saat ini",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Semua",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Kapanpun anda membuat perubahan pada matriks yang dapat mempengaruhi tampilan dan\/atau perilaku satu atau lebih halaman, <i>uMatrix<\/i> akan memuat ulang halaman yang terdampak secara otomatis ketika anda menutup matriks.",
"description": ""
},
"settingsSubframeColor": {
"message": "Frame diblokir:&ensp;Warna",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Kepekatan",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Sembunyikan wadah elemen yang diblokir",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Impor...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Peringatan! Ubah konfigurasi mentah ini dengan risiko anda sendiri.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Nessuna pagina trovata",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistiche",
"description": ""
@ -311,34 +319,6 @@
"message": "Sito",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Quando la matrice è chiusa, ricarica queste schede:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Nessuna",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Pagina corrente",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Tutte",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Ogni volta che effettui modifiche nella matrice che possono influenzare la visualizzazione e\/o il comportamento di una o più pagine, <i>uMatrix<\/i> ricaricherà automaticamente le pagine in questione quando chiudi la matrice.",
"description": ""
},
"settingsSubframeColor": {
"message": "Frames bloccati:&ensp;Colore",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacità",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Nascondi lo spazio riservato agli elementi bloccati",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importa...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Attenzione! Modifica queste impostazioni grezze a tuo rischio.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "ページが見つかりません",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "このルールを読み込む",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "このルールを保存する",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; 統計",
"description": ""
@ -311,34 +319,6 @@
"message": "サイト",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Matrix を閉じたとき、これらのタブを再読み込みする:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "なし",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "現在",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "すべて",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "1 ページ以上に影響を与える変更をしてから Matrix を閉じたときは、<i>uMatrix<\/i> は影響をうけるページを再読み込みします",
"description": ""
},
"settingsSubframeColor": {
"message": "ブロック中のframe:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "不透明度",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "ブロックした要素のプレースホルダを表示しない",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "追加...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My ホスト",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My ルールレシピ",
"description": ""
},
"rawSettingsWarning": {
"message": "警告! これらの内部設定はご自身のリスクにより変更すること。",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "웹 페이지를 찾을 수 없습니다.",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; 통계",
"description": ""
@ -311,34 +319,6 @@
"message": "사이트",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "없음",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "전체",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "차단 된 요청과 관련된 페이지 콘텐츠를 숨깁니다.",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "경고! 다음 설정은 고급 사용자만 설정하세요.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Neviens",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Necaurredzamība",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -32,11 +32,11 @@
"description": "a tab in dashboard"
},
"ubiquitousRulesPageName": {
"message": "Assets",
"message": "അസറ്റുകൾ",
"description": "a tab in dashboard"
},
"rawSettingsPageName": {
"message": "More",
"message": "കൂടുതൽ",
"description": "a tab in dashboard"
},
"aboutPageName": {
@ -60,7 +60,7 @@
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"mediaPrettyName": {
"message": "media",
"message": "മീഡിയ",
"description": "HAS TO FIT IN MATRIX HEADER!"
},
"pluginPrettyName": {
@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "യുമാട്രിക്സ്‌ &ndash; സ്റ്ററ്റിസ്റ്റിക്സ്‌",
"description": ""
@ -300,45 +308,17 @@
"description": "Label for default scope level selector in Settings pane"
},
"settingsDefaultScopeLevel0": {
"message": "Global",
"message": "ആഗോള",
"description": "Scope will be global"
},
"settingsDefaultScopeLevel1": {
"message": "Domain",
"message": "ഡൊമൈന്‍",
"description": "Scope will be base domain"
},
"settingsDefaultScopeLevel2": {
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "ഒന്നും അല്ല",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "ഇപ്പോഴത്തെത്",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "എല്ലാം",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "ഒപ്പാസിറ്റി",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Ingen nettside ble funnet",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistikk",
"description": ""
@ -311,34 +319,6 @@
"message": "Nettsted",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Ved lukking av matrisen, utfør smart gjeninnlasting av disse fanene:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Ingen",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Gjeldende",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Alle",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Når du gjør endringer i matrisen som kan ha innvirkning på visningen og\/eller oppførselen til én eller flere sider vil <i>uMatrix<\/i> gjeninnlaste sider som omfattes av dette når du lukker matrisen.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blokkerte rammer:&ensp;Farge",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Dekkevne",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Fold sammen plassholderen tilhørende blokkerte elementer",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importer...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Advarsel! Du endrer disse rå oppsettsinnstillingene på din egen risiko.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Geen webpagina gevonden",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Regels importeren",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Regels opslaan",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistieken",
"description": ""
@ -311,34 +319,6 @@
"message": "Website",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Wanneer de matrix wordt gesloten, deze tabbladen slim vernieuwen:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Geen",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Huidige",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Alle",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Als u wijzigingen aanbrengt die de weergave en\/of het gedrag van een of meer paginas kunnen beïnvloeden, zal <i>uMatrix<\/i> de betreffende paginas automatisch vernieuwen zodra u de matrix sluit.",
"description": ""
},
"settingsSubframeColor": {
"message": "Geblokkeerde frames:&ensp;kleur",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Ondoorzichtigheid",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Tijdelijke aanduiding van geblokkeerde elementen samenvouwen",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importeren...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Mijn hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Mijn recepten",
"description": ""
},
"rawSettingsWarning": {
"message": "Waarschuwing! U wijzigt deze configuratie-instellingen op eigen risico.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Nie znaleziono strony",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statystyki",
"description": ""
@ -311,34 +319,6 @@
"message": "strona",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Kiedy okno uMatrix zostanie zamknięte, inteligentnie odśwież następujące karty:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Żaden",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Aktualny",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Wszystkie",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Kiedy wprowadzasz w matrycy zmiany, które mogą wpływać na wyświetlanie lub zachowanie jednej lub kilku stron, <i>uMatrix<\/i> odświeży te strony automatycznie, kiedy okno zostanie zamknięte.",
"description": ""
},
"settingsSubframeColor": {
"message": "Zablokowane ramki:&ensp;Kolor",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Przezroczystość",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Ukryj symbole zastępcze zablokowanych elementów",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importuj...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Ostrzeżenie! Te ustawienia zmieniasz na własne ryzyko.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Nenhuma página de web encontrada",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Importar regras",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Salvar regras",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Estatísticas",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Quando a matrix é fechada, recarregue inteligentemente essas abas:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Vazio",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Atual",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Todos",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Sempre que você fizer mudanças na matriz que podem afetar a visualização e\/ou comportamento de uma ou mais páginas, <i>uMatrix<\/i> recarregará páginas afetadas automaticamente quando você fechar a matriz.",
"description": ""
},
"settingsSubframeColor": {
"message": "Frames bloqueados:&ensp;Cor",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacidade",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Agrupar espaços reservados à elementos bloqueados",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importar...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Meus hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Minhas receitas",
"description": ""
},
"rawSettingsWarning": {
"message": "Cuidado! Mude essas configurações por sua própria conta e risco.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Nenhuma página encontrada",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Estatísticas",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Quando a matriz é fechada, recarrega estas abas inteligentemente:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Nenhuma",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Atual",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Todas",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Quando fizer modificações na matriz que podem afectar a exibição e\/ou comportamento de uma, ou mais páginas, o <i>uMatrix<\/i> irá recarregar as páginas afectadas automaticamente quando fechar a matriz.",
"description": ""
},
"settingsSubframeColor": {
"message": "Frames bloqueadas:&ensp;Cor",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacidade",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Colapsar espaço reservado dos elementos bloqueados ",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistici",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Nimic",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Tot",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Cadre blocate:&ensp;Culoare",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacitate",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Страница не найдена",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Импортировать правила",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Сохранить правила",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Статистика",
"description": ""
@ -311,34 +319,6 @@
"message": "Сайт",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Когда матрица закроется, обновить эти вкладки:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "(Пусто)",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Текущая версия",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Все",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Когда вы вносите изменения в матрицу запросов, которые могут повлиять на отображение и\/или поведение одной или нескольких страниц, <i>uMatrix<\/i> перезагрузит эти страницы автоматически, когда вы закроете панель.",
"description": ""
},
"settingsSubframeColor": {
"message": "Заблокированные фреймы:&ensp;Цвет",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Непрозрачность",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Скрывать оставшееся от заблокированных элементов место",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Импортировать...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Мои hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Мои рецепты",
"description": ""
},
"rawSettingsWarning": {
"message": "Внимание! Изменяйте эти настройки конфигурации на свой страх и риск.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Ниједна веб страница није пронађена",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Увоз правила",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Чување правила",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Статистика",
"description": ""
@ -311,34 +319,6 @@
"message": "Сајт",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Приликом затварања матрице, паметно обнови ове картице:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Ниједан",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Тренутни",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Све",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Када год начините измене у матрици које могу утицати на приказ и\/или понашање једне или више страница, <i>uMatrix<\/i> ће аутоматски поново учитати погођене странице када будете затворили матрицу.",
"description": ""
},
"settingsSubframeColor": {
"message": "Блокираних оквира:&ensp;Боја",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Непрозирност",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Скупи држач блокираних елемената",
"description": "English: Collapse placeholder of blocked elements"
@ -356,7 +336,7 @@
"description": ""
},
"settingsMatrixNoTooltips": {
"message": "Disable tooltips",
"message": "Онемогући описе алатки",
"description": ""
},
"privacyPageTitle": {
@ -472,7 +452,7 @@
"description": "default file name to use"
},
"assetsHostsSection": {
"message": "Hosts files",
"message": "Хост датотеке",
"description": "header to identify the hosts files section"
},
"hostsFilesPrompt": {
@ -536,7 +516,15 @@
"description": ""
},
"assetsImportLabel": {
"message": "Import...",
"message": "Увези...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {

View file

@ -151,6 +151,14 @@
"message": "Ingen webbplats hittades",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistik",
"description": ""
@ -311,34 +319,6 @@
"message": "Webbplats",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "När matrisen är stängd, ladda om dessa flikar intelligent:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Inga",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Aktuell",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Alla",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "När du gör ändringar i matrisen som påverkar hur andra sidor ser ut eller beter sig kommer <i>uMatrix<\/i> ladda om de berörda sidorna automatiskt när du stänger matrisen.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blockerade frames:&ensp;Färg",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Genomskinlighet",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Kollapsa blockerade objekt",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Importera...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "ఏదీకాదు",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "ప్రస్తుత",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "అన్ని",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "స్పష్టత",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "నిరోధించబడిన అంశాలయోక్క సంగ్రాహకాలను దాచుము",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Statistics",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "When the matrix is closed, smart reload these tabs:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "None",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Current",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "All",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Whenever you make changes in the matrix which can affect the display and\/or behavior of one or more pages, <i>uMatrix<\/i> will reload affected pages automatically when you close the matrix.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Opacity",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "Hiçbir web sayfası bulunamadı",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Kuralları içe aktar",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Kuralları kaydet",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; İstatistikleri",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Matris kapatıldığında şu sekmeleri yeniden yükle:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Hiçbiri",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Şu anki",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Tümü",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Matristen sayfa görünümünü ve\/veya davranışını etkileyebilecek değişiklikler yaptığınızda, <i>uMatrix<\/i> bunlardan etkilenen sayfaları matris kapatıldığında otomatik olarak yeniden yükleyecektir.",
"description": ""
},
"settingsSubframeColor": {
"message": "Engellenmiş çerçeveler:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Saydamlık",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Engellenmiş elementlerin yertutucularını daralt",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "İçe aktar...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "Alan adlarım",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "Tariflerim",
"description": ""
},
"rawSettingsWarning": {
"message": "Uyarı! Bu ham yapılandırma ayarlarını değiştirmenin sorumluluğu size aittir.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; Статистика",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Після закриття matrix перезавантажувати ці вкладки:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Жодних",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Поточний",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Усе",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Щоразу, коли ви робите зміни в матриці, які можуть змінити вигляд і\/або поведінку однієї, або більше сторінок <i>uMatrix<\/i> перевантажить змінені сторінки після закриття матриці.",
"description": ""
},
"settingsSubframeColor": {
"message": "Blocked frames:&ensp;Color",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Затінення",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "No web page found",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "Import rules",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "Save rules",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "Thống kê µMatrix",
"description": ""
@ -311,34 +319,6 @@
"message": "Site",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "Khi đã đóng ma trận, tải lại thông minh những thẻ này:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "Không có",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "Hiện tại",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "Tất cả",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "Bất cứ khi nào bạn tạo ra thay đổi trong ma trận có thể ảnh hưởng đến việc hiển thị và\/hoặc hành vi của một hoặc nhiều trang, <i>µMatrix<\/i> sẽ tự tải lại trang được ảnh hưởng khi bạn đóng ma trận.",
"description": ""
},
"settingsSubframeColor": {
"message": "Đã chặn frame:&ensp;Màu",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "Độ mờ",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "Collapse placeholder of blocked elements",
"description": "English: Collapse placeholder of blocked elements"
@ -539,6 +519,14 @@
"message": "Import...",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "My hosts",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "My recipes",
"description": ""
},
"rawSettingsWarning": {
"message": "Warning! Change these raw configuration settings at your own risk.",
"description": ""

View file

@ -151,6 +151,14 @@
"message": "没有找到网页",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "导入规则",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "保存规则",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; 统计",
"description": ""
@ -311,34 +319,6 @@
"message": "网页域名",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "关闭 matrix 时智能重载这些标签页:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "无",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "当前",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "全部",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "任何时候当您做出可能影响一个或多个页面的显示或行为的变更时,<i>uMatrix<\/i> 将在您关闭 matrix 时自动重载受影响的页面。",
"description": ""
},
"settingsSubframeColor": {
"message": "已屏蔽的框架:&ensp;颜色",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "不透明度",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "隐藏已拦截请求所关联的页面内容",
"description": "English: Collapse placeholder of blocked elements"
@ -539,8 +519,16 @@
"message": "导入…",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "我的 Hosts 名单",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "我的收集",
"description": ""
},
"rawSettingsWarning": {
"message": "警告!若要自行编辑原始设定数据则后果自负。",
"message": "警告!可在此编辑原始设定数据。请自负风险。",
"description": ""
},
"aboutChangelog": {

View file

@ -151,6 +151,14 @@
"message": "沒有找到網頁",
"description": "Displays in place of matrix when no data is found for the current page"
},
"matrixRecipeImportTip": {
"message": "導入規則",
"description": "Used as a tooltip for the recipe import button"
},
"matrixRecipeSaveTip": {
"message": "儲存規則",
"description": "Used as a tooltip for the recipe padlock button"
},
"statsPageTitle": {
"message": "uMatrix &ndash; 統計",
"description": ""
@ -311,34 +319,6 @@
"message": "網頁域名",
"description": "Scope will be full hostname of site"
},
"settingsMatrixAutoReloadPrompt": {
"message": "關閉矩陣時重新載入以下分頁:",
"description": ""
},
"settingsMatrixAutoReloadNone": {
"message": "無",
"description": ""
},
"settingsMatrixAutoReloadCurrent": {
"message": "現有",
"description": ""
},
"settingsMatrixAutoReloadAll": {
"message": "全部",
"description": ""
},
"settingsMatrixAutoReloadInfo": {
"message": "當你更改矩陣以致其將影響分頁之外觀或行為之時,<i>uMatrix<\/i>將於關閉矩陣時自動重新載入。",
"description": ""
},
"settingsSubframeColor": {
"message": "已封鎖之框架:&ensp;颜色",
"description": "English: Blocked frames:&ensp;Color"
},
"settingsSubframeOpacity": {
"message": "不透明度",
"description": "English: Opacity"
},
"settingsCollapseBlocked": {
"message": "隱藏已阻擋請求所關聯的頁面內容",
"description": "English: Collapse placeholder of blocked elements"
@ -539,8 +519,16 @@
"message": "導入…",
"description": ""
},
"assetsInlineHostsLabel": {
"message": "我的 Hosts 名單",
"description": ""
},
"assetsInlineRecipesLabel": {
"message": "我的收集",
"description": ""
},
"rawSettingsWarning": {
"message": "警告!若要自行編輯原始設定數據則後果自負。",
"message": "警告!可在此編輯原始設定數據。請自負风險。",
"description": ""
},
"aboutChangelog": {

View file

@ -29,6 +29,10 @@ ul {
<li><span data-i18n="aboutIssueContributors"></span> <a href="https://github.com/gorhill/uMatrix/issues?q=is%3Aissue">uMatrix</a>, <a href="https://github.com/gorhill/httpswitchboard/issues?q=is%3Aissue">HTTP Switchboard</a>
<li><span data-i18n="aboutTranslationContributors"></span> <a href="https://github.com/gorhill/uMatrix/wiki/Translation-work-contributors">Crowdin</a>
</ul>
<li><a href="https://github.com/bestiejs/punycode.js" target="_blank">Punycode.js</a> by <a href="https://github.com/mathiasbynens">Mathias Bynens</a>
<li><a href="https://fontawesome.com/" target="_blank">Font Awesome</a> by <a href="https://github.com/davegandy">Dave Gandy</a>
<li><a href="https://codemirror.net/" target="_blank">CodeMirror</a> by <a href="https://github.com/marijnh">Marijn Haverbeke</a>
<li><a href="https://github.com/Swatinem/diff" target="_blank">An implementation of Myers' diff algorithm</a> by <a href="https://github.com/Swatinem">Arpad Borsos</a>
</ul>
<h2 data-i18n="aboutUserDataHeader"></h2>

29
src/css/codemirror.css Normal file
View file

@ -0,0 +1,29 @@
.codeMirrorContainer {
font-size: 12px;
line-height: 1.25;
overflow: hidden;
position: relative;
}
.CodeMirror {
border: 1px solid #ddd;
box-sizing: border-box;
flex-grow: 1;
height: 100%;
width: 100%;
}
/* For when panels are used */
.codeMirrorContainer > div:not([class^="CodeMirror"]) {
display: flex;
flex-direction: column;
height: 100%;
}
.CodeMirror-merge-l-deleted {
background-image: none;
font-weight: bold;
}
.CodeMirror-merge-l-inserted {
background-image: none;
font-weight: bold;
}

View file

@ -1,8 +1,9 @@
body {
background-color: #fff;
box-sizing: border-box;
color: #000;
margin: 0;
padding: 0 0.5em 0 0.5em;
padding: 0 0.5em 0.5em 0.5em;
font: 14px/1.4 sans-serif;
}
body > *:first-child {

View file

@ -159,7 +159,7 @@ body .toolbar button.fa {
}
.dropdown-menu-capture {
background-color: transparent;
background-color: rgba(0,0,0,0.2);
border: 0;
bottom: 0;
display: none;
@ -171,6 +171,10 @@ body .toolbar button.fa {
top: 0;
z-index: 300;
}
.dropdown-menu-capture.dropdown-menu-centered > .dropdown-menu {
left: 4em;
right: 4em;
}
.dropdown-menu-capture.show {
display: block;
}
@ -211,14 +215,15 @@ body .toolbar button.fa {
}
button > span.badge {
padding: 1px 1px;
display: inline-block;
font-size: 40%;
position: absolute;
right: 1px;
background-color: rgba(240,240,240,0.75);
bottom: 1px;
color: #000;
background-color: rgba(240,240,240,0.75)
display: inline-block;
font-size: 40%;
padding: 1px 1px;
pointer-events: none;
position: absolute;
right: 1px;
}
button.disabled > span.badge {
display: none;
@ -238,7 +243,6 @@ button.disabled > span.badge {
padding: 0;
}
.recipe {
cursor: pointer;
list-style-type: none;
white-space: nowrap;
}
@ -266,15 +270,21 @@ button.disabled > span.badge {
}
.recipe .name {
color: #000;
cursor: default;
flex-grow: 1;
padding: 0.4em 0;
}
.recipe .importer,
.recipe .committer {
cursor: pointer;
display: none;
font-size: 120%;
padding: 0.4em;
width: 0.8em;
text-align: center;
width: 1em;
}
.recipe.mustCommit .committer {
.recipe.mustImport .importer,
.recipe.mustCommit:not(.mustImport) .committer {
display: inline;
}
.recipe:hover {

View file

@ -1,8 +1,6 @@
div > p:first-child {
margin-top: 0;
}
div > p:last-child {
margin-bottom: 0;
body {
height: 100vh;
overflow: hidden;
}
#diff {
border: 0;
@ -10,152 +8,85 @@ div > p:last-child {
padding: 0;
white-space: nowrap;
}
#diff > .pane {
border: 0;
box-sizing: box-border;
display: inline-block;
margin: 0;
padding: 0;
position: relative;
vertical-align: top;
width: calc(50% - 2px);
#diff .tools > * {
margin-bottom: 0.5em;
}
#diff > .pane > div {
padding: 0 0 1em 0;
#diff .ruleActions {
border: 0;
box-sizing: border-box;
display: inline-block;
padding: 0;
text-align: center;
vertical-align: top;
width: 50%;
}
#diff .ruleActions h3 {
font-weight: normal;
margin: 0.5em 0;
}
#ruleFilter {
direction: ltr;
text-align: center;
}
#diff > .pane > div > span {
float: left;
#ruleFilter .fa {
color: #888;
}
#revertButton:after,
#commitButton:before {
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
vertical-align: baseline;
display: inline-block;
}
body[dir="ltr"] #revertButton:after {
content: '\2009\f061';
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
vertical-align: baseline;
display: inline-block;
}
body[dir="rtl"] #revertButton:after {
content: '\2009\f060';
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
vertical-align: baseline;
display: inline-block;
}
body[dir="ltr"] #commitButton:before {
content: '\f060\2009';
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
vertical-align: baseline;
display: inline-block;
}
body[dir="rtl"] #commitButton:before {
content: '\f061\2009';
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
vertical-align: baseline;
display: inline-block;
}
#revertButton,
#commitButton,
#diff.edit #editEnterButton {
#editSaveButton,
#diff.editing #exportButton,
#diff.editing #importButton {
opacity: 0.25;
pointer-events: none;
}
#editStopButton,
#editCancelButton {
display: none;
}
#diff.dirty:not(.edit) #revertButton,
#diff.dirty:not(.edit) #commitButton {
#diff.dirty:not(.editing) #revertButton,
#diff.dirty:not(.editing) #commitButton,
#diff.editing #editSaveButton {
opacity: 1;
pointer-events: auto;
}
#diff.edit #editStopButton,
#diff.edit #editCancelButton {
display: initial;
.codeMirrorContainer {
box-sizing: border-box;
padding: 0 0 0.5em 0;
}
#diff.edit #importButton,
#diff.edit #exportButton {
.CodeMirror-merge, .CodeMirror-merge-pane, .CodeMirror-merge .CodeMirror {
box-sizing: border-box;
height: 100%;
}
#diff.editing .CodeMirror-merge-copy,
#diff.editing .CodeMirror-merge-copy-reverse {
display: none;
}
#diff ul {
border: 0;
border-top: 1px solid #eee;
list-style-type: none;
margin: 0;
overflow: hidden;
padding: 1em 0 0 0;
}
#diff ul,
#diff textarea {
font: 12px/1.8 monospace;
}
#diff.edit .right ul {
visibility: hidden;
}
#diff .left {
padding: 0 0 0 0;
}
#diff .right > ul {
#diff.editing .CodeMirror-merge-left .CodeMirror {
color: #888;
}
#diff li {
background-color: white;
direction: ltr;
padding: 0;
text-align: left;
white-space: nowrap;
#diff.editing .CodeMirror-merge-editor .CodeMirror {
background-color: #ffe;
}
#diff li:nth-of-type(2n+0) {
background-color: #eee;
}
#diff .right li {
cursor: pointer;
}
#diff .right li:hover {
background-color: #ffc;
color: #000;
}
#diff .right li.notLeft {
color: #000;
}
#diff .right li.notLeft:hover {
text-decoration: line-through;
}
#diff .right li.notRight {
color: #000;
}
#diff .right li.toRemove {
color: #000;
text-decoration: line-through;
}
#diff textarea {
border: 0;
border-top: 1px solid #eee;
direction: ltr;
height: 100%;
body[dir="rtl"] .CodeMirror-merge-pane-rightmost {
right: unset;
left: 0;
margin: 0;
overflow: hidden;
overflow-y: auto;
padding: 1em 0 0 0;
position: absolute;
resize: none;
visibility: hidden;
white-space: pre;
width: 100%;
}
#diff.edit textarea {
visibility: visible;
}
.hidden {
display: none;
}
}

View file

@ -21,7 +21,7 @@
<div class="assets">
<div data-i18n="assetsHostsSection"></div>
<div>
<p data-i18n="hostsFilesPrompt"></p>
<p><span data-i18n="hostsFilesPrompt"></span>&nbsp;<a class="fa info" href="https://github.com/gorhill/uMatrix/wiki/Preset-whitelisted-and-blacklisted-domains#preset-blacklist-rules" target="_blank">&#xf05a;</a></p>
<p id="listsOfBlockedHostsPrompt"></p>
<ul id="hosts">
<li class="listEntry notAnAsset toImport"><input type="checkbox" id="importHosts"><label for="importHosts" data-i18n="assetsImportLabel"></label><!--
@ -33,7 +33,7 @@
<div class="assets">
<div data-i18n="assetsRecipesSection"></div>
<div>
<p data-i18n="assetsRecipesSummary"></p>
<p><span data-i18n="assetsRecipesSummary"></span>&nbsp;<a class="fa info" href="https://github.com/gorhill/uMatrix/wiki/Ruleset-recipes" target="_blank">&#xf05a;</a></p>
<ul id="recipes">
<li class="listEntry notAnAsset toImport"><input type="checkbox" id="importRecipes"><label for="importRecipes" data-i18n="assetsImportLabel"></label><!--
--><textarea dir="ltr" spellcheck="false" placeholder="hostsFilesExternalListsHint"></textarea>

View file

@ -1,7 +1,7 @@
/*******************************************************************************
uMatrix - a Chromium browser extension to black/white list requests.
Copyright (C) 2013-2017 Raymond Hill
uMatrix - a browser extension to black/white list requests.
Copyright (C) 2013-2018 Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -184,64 +184,78 @@ var cookieMatchDomains = function(cookieKey, allHostnamesString) {
// Look for cookies to record for a specific web page
var recordPageCookiesAsync = function(pageStats) {
var recordPageCookiesAsync = function(pageStore) {
// Store the page stats objects so that it doesn't go away
// before we handle the job.
// rhill 2013-10-19: pageStats could be nil, for example, this can
// rhill 2013-10-19: pageStore could be nil, for example, this can
// happens if a file:// ... makes an xmlHttpRequest
if ( !pageStats ) {
return;
}
recordPageCookiesQueue.set(pageStats.pageUrl, pageStats);
if ( processPageRecordQueueTimer === null ) {
processPageRecordQueueTimer = vAPI.setTimeout(processPageRecordQueue, 1000);
}
if ( !pageStore ) { return; }
recordPageCookiesQueue.set(pageStore.pageUrl, pageStore);
if ( processPageRecordQueueTimer !== null ) { return; }
processPageRecordQueueTimer = vAPI.setTimeout(processPageRecordQueue, 1000);
};
/******************************************************************************/
var cookieLogEntryBuilder = [
'',
'{',
'',
'-cookie:',
'',
'}'
];
var recordPageCookie = (function() {
let queue = new Map();
let queueTimer;
let cookieLogEntryBuilder = [ '', '{', '', '-cookie:', '', '}' ];
var recordPageCookie = function(pageStore, cookieKey) {
if ( vAPI.isBehindTheSceneTabId(pageStore.tabId) ) { return; }
let process = function() {
queueTimer = undefined;
for ( let qentry of queue ) {
let pageStore = qentry[0];
if ( pageStore.tabId === '' ) { continue; }
for ( let cookieKey of qentry[1] ) {
let cookieEntry = cookieDict.get(cookieKey);
let block = µm.mustBlock(
pageStore.pageHostname,
cookieEntry.hostname,
'cookie'
);
// https://github.com/gorhill/httpswitchboard/issues/60
// Need to URL-encode cookie name
cookieLogEntryBuilder[0] =
cookieURLFromCookieEntry(cookieEntry);
cookieLogEntryBuilder[2] =
cookieEntry.session ? 'session' : 'persistent';
cookieLogEntryBuilder[4] =
encodeURIComponent(cookieEntry.name);
let cookieURL = cookieLogEntryBuilder.join('');
pageStore.recordRequest('cookie', cookieURL, block);
µm.logger.writeOne(
pageStore.tabId,
'net',
pageStore.pageHostname,
cookieURL,
'cookie',
block
);
cookieEntry.usedOn.add(pageStore.pageHostname);
if ( !block ) { continue; }
if ( µm.userSettings.deleteCookies ) {
removeCookieAsync(cookieKey);
}
µm.updateBadgeAsync(pageStore.tabId);
}
}
queue.clear();
};
var cookieEntry = cookieDict.get(cookieKey);
var pageHostname = pageStore.pageHostname;
var block = µm.mustBlock(pageHostname, cookieEntry.hostname, 'cookie');
cookieLogEntryBuilder[0] = cookieURLFromCookieEntry(cookieEntry);
cookieLogEntryBuilder[2] = cookieEntry.session ? 'session' : 'persistent';
cookieLogEntryBuilder[4] = encodeURIComponent(cookieEntry.name);
var cookieURL = cookieLogEntryBuilder.join('');
// rhill 2013-11-20:
// https://github.com/gorhill/httpswitchboard/issues/60
// Need to URL-encode cookie name
pageStore.recordRequest('cookie', cookieURL, block);
µm.logger.writeOne(pageStore.tabId, 'net', pageHostname, cookieURL, 'cookie', block);
cookieEntry.usedOn.add(pageHostname);
// rhill 2013-11-21:
// https://github.com/gorhill/httpswitchboard/issues/65
// Leave alone cookies from behind-the-scene requests if
// behind-the-scene processing is disabled.
if ( !block ) {
return;
}
if ( !µm.userSettings.deleteCookies ) {
return;
}
removeCookieAsync(cookieKey);
};
return function(pageStore, cookieKey) {
if ( vAPI.isBehindTheSceneTabId(pageStore.tabId) ) { return; }
let entry = queue.get(pageStore);
if ( entry === undefined ) {
queue.set(pageStore, (entry = new Set()));
}
if ( entry.has(cookieKey) ) { return; }
entry.add(cookieKey);
if ( queueTimer === undefined ) {
queueTimer = vAPI.setTimeout(process, 277);
}
};
})();
/******************************************************************************/
@ -473,35 +487,62 @@ var canRemoveCookie = function(cookieKey, srcHostnames) {
/******************************************************************************/
// Listen to any change in cookieland, we will update page stats accordingly.
//
// https://github.com/gorhill/httpswitchboard/issues/79
// If cookie value didn't change, no need to record.
vAPI.cookies.onChanged = function(cookie) {
// rhill 2013-12-11: If cookie value didn't change, no need to record.
// https://github.com/gorhill/httpswitchboard/issues/79
var cookieKey = cookieKeyFromCookie(cookie);
var cookieEntry = cookieDict.get(cookieKey);
if ( cookieEntry === undefined ) {
cookieEntry = addCookieToDict(cookie);
} else {
cookieEntry.tstamp = Date.now();
if ( cookie.value === cookieEntry.value ) { return; }
cookieEntry.value = cookie.value;
}
vAPI.cookies.onChanged = (function() {
let queue = new Map();
let queueTimer;
// Go through all pages and update if needed, as one cookie can be used
// by many web pages, so they need to be recorded for all these pages.
var pageStores = µm.pageStores;
var pageStore;
for ( var tabId in pageStores ) {
if ( pageStores.hasOwnProperty(tabId) === false ) {
continue;
let process = function() {
queueTimer = undefined;
let now = Date.now();
let cookieKeys = [];
for ( let qentry of queue ) {
if ( qentry[1] > now ) { continue; }
if ( cookieDict.has(qentry[0]) === false ) { continue; }
cookieKeys.push(qentry[0]);
queue.delete(qentry[0]);
}
pageStore = pageStores[tabId];
if ( !cookieMatchDomains(cookieKey, pageStore.allHostnamesString) ) {
continue;
if ( cookieKeys.length !== 0 ) {
let pageStores = µm.pageStores;
for ( let tabId in pageStores ) {
if ( pageStores.hasOwnProperty(tabId) === false ) { continue; }
let pageStore = pageStores[tabId];
let allHostnamesString = pageStore.allHostnamesString;
for ( let cookieKey of cookieKeys ) {
if ( cookieMatchDomains(cookieKey, allHostnamesString) ) {
recordPageCookie(pageStore, cookieKey);
}
}
}
}
recordPageCookie(pageStore, cookieKey);
}
};
if ( queue.size !== 0 ) {
queueTimer = vAPI.setTimeout(process, 797);
}
};
return function(cookie) {
let cookieKey = cookieKeyFromCookie(cookie);
let cookieEntry = cookieDict.get(cookieKey);
if ( cookieEntry === undefined ) {
cookieEntry = addCookieToDict(cookie);
} else {
cookieEntry.tstamp = Date.now();
if ( cookie.value === cookieEntry.value ) { return; }
cookieEntry.value = cookie.value;
}
if ( queue.has(cookieKey) ) { return; }
queue.set(cookieKey, Date.now() + 653);
if ( queueTimer === undefined ) {
queueTimer = vAPI.setTimeout(process, 727);
}
};
})();
/******************************************************************************/

View file

@ -141,6 +141,18 @@ var isIPAddress = function(hostname) {
/******************************************************************************/
var punycodeIf = function(hn) {
return reNotASCII.test(hn) ? punycode.toASCII(hn) : hn;
};
var unpunycodeIf = function(hn) {
return hn.indexOf('xn--') !== -1 ? punycode.toUnicode(hn) : hn;
};
var reNotASCII = /[^\x20-\x7F]/;
/******************************************************************************/
var toBroaderHostname = function(hostname) {
if ( hostname === '*' ) { return ''; }
if ( isIPAddress(hostname) ) {
@ -591,6 +603,51 @@ Matrix.prototype.extractAllSourceHostnames = (function() {
/******************************************************************************/
// https://github.com/gorhill/uMatrix/issues/759
// Backward compatibility: 'plugin' => 'media'
Matrix.prototype.partsFromLine = function(line) {
let fields = line.split(/\s+/);
if ( fields.length < 3 ) { return; }
// Switches
if ( this.reSwitchRule.test(fields[0]) ) {
fields[0] = fields[0].slice(0, -1);
if ( switchBitOffsets.has(fields[0]) === false ) { return; }
fields[1] = punycodeIf(fields[1]);
fields[2] = nameToSwitchStateMap.get(fields[2]);
if ( fields[2] === undefined ) { return; }
fields.length = 3;
return fields;
}
// Rules
if ( fields.length < 4 ) { return; }
fields[0] = punycodeIf(fields[0]);
fields[1] = punycodeIf(fields[1]);
if ( fields[2] === 'plugin' ) { fields[2] = 'media'; }
if ( typeBitOffsets.get(fields[2]) === undefined ) { return; }
if ( nameToStateMap.hasOwnProperty(fields[3]) === false ) { return; }
fields[3] = nameToStateMap[fields[3]];
fields.length = 4;
return fields;
};
Matrix.prototype.reSwitchRule = /^[0-9a-z-]+:$/;
/******************************************************************************/
Matrix.prototype.fromArray = function(lines, append) {
let matrix = append === true ? this : new Matrix();
for ( let line of lines ) {
matrix.addFromLine(line);
}
if ( append !== true ) {
this.assign(matrix);
}
this.modifiedTime = Date.now();
};
Matrix.prototype.toArray = function() {
let out = [];
for ( let rule of this.rules.keys() ) {
@ -600,8 +657,8 @@ Matrix.prototype.toArray = function() {
let val = this.evaluateCell(srcHostname, desHostname, type);
if ( val === 0 ) { continue; }
out.push(
punycode.toUnicode(srcHostname) + ' ' +
punycode.toUnicode(desHostname) + ' ' +
unpunycodeIf(srcHostname) + ' ' +
unpunycodeIf(desHostname) + ' ' +
type + ' ' +
stateToNameMap.get(val)
);
@ -623,25 +680,6 @@ Matrix.prototype.toArray = function() {
/******************************************************************************/
Matrix.prototype.fromArray = function(lines, append) {
let matrix = append === true ? this : new Matrix();
for ( let line of lines ) {
matrix.fromLine(line);
}
if ( append !== true ) {
this.assign(matrix);
}
this.modifiedTime = Date.now();
};
/******************************************************************************/
Matrix.prototype.toString = function() {
return this.toArray().join('\n');
};
/******************************************************************************/
Matrix.prototype.fromString = function(text, append) {
let matrix = append === true ? this : new Matrix();
let textEnd = text.length;
@ -657,14 +695,12 @@ Matrix.prototype.fromString = function(text, append) {
}
let line = text.slice(lineBeg, lineEnd).trim();
lineBeg = lineEnd + 1;
let pos = line.indexOf('# ');
if ( pos !== -1 ) {
line = line.slice(0, pos).trim();
}
if ( line === '' ) { continue; }
matrix.fromLine(line);
matrix.addFromLine(line);
}
if ( append !== true ) {
@ -674,77 +710,38 @@ Matrix.prototype.fromString = function(text, append) {
this.modifiedTime = Date.now();
};
/******************************************************************************/
// https://github.com/gorhill/uMatrix/issues/759
// Backward compatibility: 'plugin' => 'media'
Matrix.prototype.fromLine = function(line) {
let fields = line.split(/\s+/);
if ( fields.length < 3 ) { return false; }
let field0 = fields[0];
// Switches
if ( this.reSwitchRule.test(field0) ) {
let switchName = field0.slice(0, -1);
let srcHostname = punycode.toASCII(fields[1]);
let state = fields[2];
if (
switchBitOffsets.has(switchName) === false ||
nameToSwitchStateMap.has(state) === false
) {
return false;
}
this.setSwitch(
switchName,
srcHostname,
nameToSwitchStateMap.get(state)
);
return true;
}
// Rules
if ( fields.length < 4 ) { return false; }
let srcHostname = punycode.toASCII(fields[0]);
let desHostname = punycode.toASCII(fields[1]);
let type = fields[2];
if ( type !== undefined ) {
if ( type === 'plugin' ) {
type = 'media';
} else if ( typeBitOffsets.has(type) === false ) {
return false;
}
} else {
type = '*';
}
let state = fields[3];
if ( state !== undefined ) {
if ( nameToStateMap.hasOwnProperty(state) === false ) {
return false;
}
state = nameToStateMap[state];
} else {
state = 2;
}
this.setCell(srcHostname, desHostname, type, state);
return true;
Matrix.prototype.toString = function() {
return this.toArray().join('\n');
};
Matrix.prototype.reSwitchRule = /^[0-9a-z-]+:$/;
/******************************************************************************/
Matrix.prototype.toSelfie = function() {
return {
version: selfieVersion,
switches: Array.from(this.switches),
rules: Array.from(this.rules)
};
Matrix.prototype.addFromLine = function(line) {
let fields = this.partsFromLine(line);
if ( fields !== undefined ) {
// Switches
if ( fields.length === 3 ) {
return this.setSwitch(fields[0], fields[1], fields[2]);
}
// Rules
if ( fields.length === 4 ) {
return this.setCell(fields[0], fields[1], fields[2], fields[3]);
}
}
};
Matrix.prototype.removeFromLine = function(line) {
let fields = this.partsFromLine(line);
if ( fields !== undefined ) {
// Switches
if ( fields.length === 3 ) {
return this.setSwitch(fields[0], fields[1], 0);
}
// Rules
if ( fields.length === 4 ) {
return this.setCell(fields[0], fields[1], fields[2], 0);
}
}
};
/******************************************************************************/
@ -757,6 +754,14 @@ Matrix.prototype.fromSelfie = function(selfie) {
return true;
};
Matrix.prototype.toSelfie = function() {
return {
version: selfieVersion,
switches: Array.from(this.switches),
rules: Array.from(this.rules)
};
};
/******************************************************************************/
Matrix.prototype.diff = function(other, srcHostname, desHostnames) {
@ -790,9 +795,7 @@ Matrix.prototype.diff = function(other, srcHostname, desHostnames) {
}
}
srcHostname = toBroaderHostname(srcHostname);
if ( srcHostname === '' ) {
break;
}
if ( srcHostname === '' ) { break; }
}
return out;
};

View file

@ -349,7 +349,7 @@ var onMessage = function(request, sender, callback) {
break;
case 'fetchRecipeCommitStatuses':
response = µm.recipeManager.commitStatuses(request);
response = µm.recipeManager.statuses(request);
break;
case 'toggleMatrixSwitch':
@ -677,6 +677,22 @@ vAPI.messaging.listen('cloud-ui.js', onMessage);
var µm = µMatrix;
var modifyRuleset = function(details) {
let ruleset = details.permanent ? µm.pMatrix : µm.tMatrix,
modifiedTime = ruleset.modifiedTime;
let toRemove = new Set(details.toRemove.trim().split(/\s*[\n\r]+\s*/));
for ( let rule of toRemove ) {
ruleset.removeFromLine(rule);
}
let toAdd = new Set(details.toAdd.trim().split(/\s*[\n\r]+\s*/));
for ( let rule of toAdd ) {
ruleset.addFromLine(rule);
}
if ( details.permanent && ruleset.modifiedTime !== modifiedTime ) {
µm.saveMatrix();
}
};
/******************************************************************************/
var onMessage = function(request, sender, callback) {
@ -691,24 +707,14 @@ var onMessage = function(request, sender, callback) {
var response;
switch ( request.what ) {
case 'getUserRules':
response = {
temporaryRules: µm.tMatrix.toString(),
permanentRules: µm.pMatrix.toString()
};
break;
case 'modifyRuleset':
modifyRuleset(request);
/* falls through */
case 'setUserRules':
if ( typeof request.temporaryRules === 'string' ) {
µm.tMatrix.fromString(request.temporaryRules);
}
if ( typeof request.permanentRules === 'string' ) {
µm.pMatrix.fromString(request.permanentRules);
µm.saveMatrix();
}
case 'getRuleset':
response = {
temporaryRules: µm.tMatrix.toString(),
permanentRules: µm.pMatrix.toString()
temporaryRules: µm.tMatrix.toArray(),
permanentRules: µm.pMatrix.toArray()
};
break;

View file

@ -134,6 +134,7 @@ PageStore.prototype = {
},
dispose: function() {
this.tabId = '';
this.rawUrl = '';
this.pageUrl = '';
this.pageHostname = '';

View file

@ -1310,10 +1310,19 @@ let recipeManager = (function() {
}
function apply(ev) {
if ( ev.target.classList.contains('expander') ) {
if (
ev.target.classList.contains('expander') ||
ev.target.classList.contains('name')
) {
ev.currentTarget.classList.toggle('expanded');
return;
}
if (
ev.target.classList.contains('importer') === false &&
ev.target.classList.contains('committer') === false
) {
return;
}
let root = ev.currentTarget;
let ruleset = root.querySelector('.ruleset');
let commit = ev.target.classList.contains('committer');
@ -1326,6 +1335,7 @@ let recipeManager = (function() {
},
updateMatrixSnapshot
);
root.classList.remove('mustImport');
if ( commit ) {
root.classList.remove('mustCommit');
}
@ -1341,6 +1351,7 @@ let recipeManager = (function() {
recipe.ruleset.replace(reScopeAlias, '$1' + details.scope + '$2'),
ul
);
li.classList.toggle('mustImport', recipe.mustImport === true);
li.classList.toggle('mustCommit', recipe.mustCommit === true);
li.addEventListener('click', apply);
}
@ -1448,8 +1459,10 @@ function dropDownMenuShow(button) {
var menu = menuOverlay.querySelector('.dropdown-menu');
var menuRect = menu.getBoundingClientRect();
var menuLeft = butnNormalLeft * (viewRect.width - menuRect.width);
menu.style.left = menuLeft.toFixed(0) + 'px';
menu.style.top = butnRect.bottom + 'px';
if ( menuOverlay.classList.contains('dropdown-menu-centered') === false ) {
menu.style.left = menuLeft.toFixed(0) + 'px';
}
}
function dropDownMenuHide() {

View file

@ -148,99 +148,118 @@
rawRecipes = [];
};
return {
apply: function(details) {
let µm = µMatrix;
let tMatrix = µm.tMatrix;
let pMatrix = µm.pMatrix;
let mustPersist = false;
for ( let rule of details.ruleset.split('\n') ) {
let parts = rule.split(/\s+/);
if ( parts.length < 2 ) { continue; }
let f0 = parts[0];
let f1 = parts[1];
// Switch
if ( f0.endsWith(':') ) {
f0 = f0.slice(0, -1);
if ( tMatrix.evaluateSwitchZ(f0, f1) !== false ) {
tMatrix.setSwitchZ(f0, f1, false);
if ( details.commit ) {
pMatrix.setSwitchZ(f0, f1, false);
mustPersist = true;
}
}
continue;
}
// Rule
if ( parts.length < 3 ) { continue; }
let f2 = parts[2];
let action = tMatrix.evaluateCellZXY(f0, f1, f2);
if ( (action & 3) === 1 ) {
tMatrix.whitelistCell(f0, f1, f2);
}
if ( details.commit !== true ) { continue; }
action = pMatrix.evaluateCellZXY(f0, f1, f2);
if ( (action & 3) === 1 ) {
pMatrix.whitelistCell(f0, f1, f2);
mustPersist = true;
}
}
if ( mustPersist ) {
µm.saveMatrix();
}
},
fetch: function(srcHostname, desHostnames, callback) {
fromPendingStrings();
let out = [];
let fetched = new Set();
let tokens = getTokens(srcHostname + ' ' + desHostnames.join(' '));
for ( let token of tokens ) {
let recipes = recipeBook.get(token);
if ( recipes === undefined ) { continue; }
for ( let recipe of recipes ) {
if ( fetched.has(recipe.id) ) { continue; }
if (
conditionMatch(
recipe.condition,
srcHostname,
desHostnames
)
) {
out.push(recipe);
fetched.add(recipe.id);
// true = blocked, false = not blocked
var evaluateRuleParts = function(matrix, scope, parts) {
if ( parts[0].endsWith(':') ) {
return matrix.evaluateSwitchZ(parts[0].slice(0, -1), scope);
}
return matrix.evaluateCellZXY(scope, parts[1], parts[2]) === 1;
};
var api = {};
api.apply = function(details) {
let µm = µMatrix;
let tMatrix = µm.tMatrix;
let pMatrix = µm.pMatrix;
let mustPersist = false;
for ( let rule of details.ruleset.split('\n') ) {
let parts = rule.split(/\s+/);
if ( parts.length < 2 ) { continue; }
let f0 = parts[0];
let f1 = parts[1];
// Switch
if ( f0.endsWith(':') ) {
f0 = f0.slice(0, -1);
if ( tMatrix.evaluateSwitchZ(f0, f1) !== false ) {
tMatrix.setSwitchZ(f0, f1, false);
if ( details.commit ) {
pMatrix.setSwitchZ(f0, f1, false);
mustPersist = true;
}
}
continue;
}
callback(out);
},
commitStatuses: function(details) {
let matrix = µMatrix.pMatrix;
for ( let recipe of details.recipes ) {
let ruleIter = new µMatrix.LineIterator(recipe.ruleset);
while ( ruleIter.eot() === false ) {
let parts = ruleIter.next().split(/\s+/);
if (
matrix.evaluateCellZXY(
details.scope,
parts[1],
parts[2]
) === 1
) {
recipe.mustCommit = true;
break;
}
}
// Rule
if ( parts.length < 3 ) { continue; }
let f2 = parts[2];
let action = tMatrix.evaluateCellZXY(f0, f1, f2);
if ( (action & 3) === 1 ) {
tMatrix.whitelistCell(f0, f1, f2);
}
return details;
},
fromString: function(raw) {
rawRecipes.push(raw);
},
reset: function() {
rawRecipes.length = 0;
recipeBook.clear();
if ( details.commit !== true ) { continue; }
action = pMatrix.evaluateCellZXY(f0, f1, f2);
if ( (action & 3) === 1 ) {
pMatrix.whitelistCell(f0, f1, f2);
mustPersist = true;
}
}
if ( mustPersist ) {
µm.saveMatrix();
}
};
api.fetch = function(srcHostname, desHostnames, callback) {
fromPendingStrings();
let out = [];
let fetched = new Set();
let tokens = getTokens(srcHostname + ' ' + desHostnames.join(' '));
for ( let token of tokens ) {
let recipes = recipeBook.get(token);
if ( recipes === undefined ) { continue; }
for ( let recipe of recipes ) {
if ( fetched.has(recipe.id) ) { continue; }
if (
conditionMatch(
recipe.condition,
srcHostname,
desHostnames
)
) {
out.push(recipe);
fetched.add(recipe.id);
}
}
}
callback(out);
};
api.statuses = function(details) {
let pMatrix = µMatrix.pMatrix,
tMatrix = µMatrix.tMatrix;
for ( let recipe of details.recipes ) {
let ruleIter = new µMatrix.LineIterator(recipe.ruleset);
while ( ruleIter.eot() === false ) {
let parts = ruleIter.next().split(/\s+/);
if (
recipe.mustCommit !== true &&
evaluateRuleParts(pMatrix, details.scope, parts)
) {
recipe.mustCommit = true;
if ( recipe.mustImport ) { break; }
}
if (
recipe.mustImport !== true &&
evaluateRuleParts(tMatrix, details.scope, parts)
) {
recipe.mustImport = true;
if ( recipe.mustCommit ) { break; }
}
}
}
return details;
};
api.fromString = function(raw) {
rawRecipes.push(raw);
};
api.reset = function() {
rawRecipes.length = 0;
recipeBook.clear();
};
return api;
})();
/******************************************************************************/

View file

@ -1,6 +1,6 @@
/*******************************************************************************
uMatrix - a Chromium browser extension to black/white list requests.
uMatrix - a browser extension to black/white list requests.
Copyright (C) 2014-2018 Raymond Hill
This program is free software: you can redistribute it and/or modify
@ -296,9 +296,11 @@ var onBeforeSendHeadersHandler = function(details) {
}
}
if ( modified ) {
return { requestHeaders: requestHeaders };
}
if ( modified !== true ) { return; }
µm.updateBadgeAsync(tabId);
return { requestHeaders: requestHeaders };
};
/******************************************************************************/
@ -354,36 +356,54 @@ var onHeadersReceived = function(details) {
cspReport.push(cspNoWorker);
}
var headers = details.responseHeaders,
cspDirectives, i;
if ( csp.length === 0 && cspReport.length === 0 ) { return; }
// https://github.com/gorhill/uMatrix/issues/967
// Inject a new CSP header rather than modify an existing one, except
// if the current environment does not support merging headers:
// Firefox 58/webext and less can't merge CSP headers, so we will merge
// them here.
var headers = details.responseHeaders;
if ( csp.length !== 0 ) {
cspDirectives = csp.join(',');
i = headerIndexFromName('content-security-policy', headers);
if ( i !== -1 ) {
headers[i].value += ',' + cspDirectives;
} else {
headers.push({
name: 'Content-Security-Policy',
value: cspDirectives
});
let cspRight = csp.join(', ');
let cspTotal = cspRight;
if ( cantMergeCSPHeaders ) {
let i = headerIndexFromName(
'content-security-policy',
headers
);
if ( i !== -1 ) {
cspTotal = headers[i].value.trim() + ', ' + cspTotal;
headers.splice(i, 1);
}
}
headers.push({
name: 'Content-Security-Policy',
value: cspTotal
});
if ( requestType === 'doc' ) {
µm.logger.writeOne(tabId, 'net', '', cspDirectives, 'CSP', false);
µm.logger.writeOne(tabId, 'net', '', cspRight, 'CSP', false);
}
}
if ( cspReport.length !== 0 ) {
cspDirectives = cspReport.join(',');
i = headerIndexFromName('content-security-policy-report-only', headers);
if ( i !== -1 ) {
headers[i].value += ',' + cspDirectives;
} else {
headers.push({
name: 'Content-Security-Policy-Report-Only',
value: cspDirectives
});
let cspRight = cspReport.join(', ');
let cspTotal = cspRight;
if ( cantMergeCSPHeaders ) {
let i = headerIndexFromName(
'content-security-policy-report-only',
headers
);
if ( i !== -1 ) {
cspTotal = headers[i].value.trim() + ', ' + cspTotal;
headers.splice(i, 1);
}
}
headers.push({
name: 'Content-Security-Policy-Report-Only',
value: cspTotal
});
}
return { responseHeaders: headers };
@ -391,6 +411,25 @@ var onHeadersReceived = function(details) {
/******************************************************************************/
// https://github.com/gorhill/uMatrix/issues/967#issuecomment-373002011
// This can be removed once Firefox 60 ESR is released.
var cantMergeCSPHeaders = (function() {
if (
self.browser instanceof Object &&
typeof self.browser.runtime.getBrowserInfo === 'function'
) {
self.browser.runtime.getBrowserInfo().then(function(info) {
cantMergeCSPHeaders =
info.vendor === 'Mozilla' &&
info.name === 'Firefox' &&
parseInt(info.version, 10) < 59;
});
}
return false;
})();
/******************************************************************************/
var cspNoWorkerInit = function() {
if ( vAPI.webextFlavor === undefined ) {
return "child-src 'none'; frame-src data: blob: *; report-uri about:blank";

View file

@ -1,7 +1,7 @@
/*******************************************************************************
uMatrix - a Chromium browser extension to block requests.
Copyright (C) 2014-2017 Raymond Hill
Copyright (C) 2014-2018 Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -19,7 +19,7 @@
Home: https://github.com/gorhill/uMatrix
*/
/* global uDom */
/* global diff_match_patch, CodeMirror, uDom */
'use strict';
@ -29,11 +29,174 @@
/******************************************************************************/
// Switches before, rules after
// Move to dashboard-common.js if needed
(function() {
if ( document.querySelector('.vfill-available') === null ) { return; }
var timer;
var resize = function() {
timer = undefined;
let prect = document.body.getBoundingClientRect();
let child = document.querySelector('.vfill-available');
let crect = child.getBoundingClientRect();
let height = Math.max(prect.bottom - crect.top, 80);
child.style.height = height + 'px';
};
resize();
window.addEventListener('resize', function() {
if ( timer === undefined ) {
timer = vAPI.setTimeout(resize, 66);
}
});
})();
/******************************************************************************/
var mergeView = new CodeMirror.MergeView(
document.querySelector('.codeMirrorMergeContainer'),
{
allowEditingOriginals: true,
connect: 'align',
inputStyle: 'contenteditable',
lineNumbers: true,
lineWrapping: false,
origLeft: '',
revertButtons: true,
value: ''
}
);
mergeView.editor().setOption('styleActiveLine', true);
mergeView.editor().setOption('lineNumbers', false);
mergeView.leftOriginal().setOption('readOnly', 'nocursor');
var unfilteredRules = {
orig: { doc: mergeView.leftOriginal(), rules: [] },
edit: { doc: mergeView.editor(), rules: [] }
};
var cleanEditToken = 0;
var cleanEditText = '';
var differ;
/******************************************************************************/
// Borrowed from...
// https://github.com/codemirror/CodeMirror/blob/3e1bb5fff682f8f6cbfaef0e56c61d62403d4798/addon/search/search.js#L22
// ... and modified as needed.
var updateOverlay = (function() {
var reFilter;
var mode = {
token: function(stream) {
if ( reFilter !== undefined ) {
reFilter.lastIndex = stream.pos;
var match = reFilter.exec(stream.string);
if ( match !== null ) {
if ( match.index === stream.pos ) {
stream.pos += match[0].length || 1;
return 'searching';
}
stream.pos = match.index;
return;
}
}
stream.skipToEnd();
}
};
return function(filter) {
reFilter = typeof filter === 'string' && filter !== '' ?
new RegExp(filter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi') :
undefined;
return mode;
};
})();
/******************************************************************************/
// Incrementally update text in a CodeMirror editor for best user experience:
// - Scroll position preserved
// - Minimum amount of text updated
var rulesToDoc = function(clearHistory) {
for ( var key in unfilteredRules ) {
if ( unfilteredRules.hasOwnProperty(key) === false ) { continue; }
var doc = unfilteredRules[key].doc;
var rules = filterRules(key);
if ( doc.lineCount() === 1 && doc.getValue() === '' || rules.length === 0 ) {
doc.setValue(rules.length !== 0 ? rules.join('\n') : '');
continue;
}
if ( differ === undefined ) { differ = new diff_match_patch(); }
var beforeText = doc.getValue();
var afterText = rules.join('\n');
var diffs = differ.diff_main(beforeText, afterText);
doc.startOperation();
var i = diffs.length,
iedit = beforeText.length;
while ( i-- ) {
var diff = diffs[i];
if ( diff[0] === 0 ) {
iedit -= diff[1].length;
continue;
}
var end = doc.posFromIndex(iedit);
if ( diff[0] === 1 ) {
doc.replaceRange(diff[1], end, end);
continue;
}
/* diff[0] === -1 */
iedit -= diff[1].length;
var beg = doc.posFromIndex(iedit);
doc.replaceRange('', beg, end);
}
doc.endOperation();
}
cleanEditText = mergeView.editor().getValue().trim();
cleanEditToken = mergeView.editor().changeGeneration();
if ( clearHistory ) {
mergeView.editor().clearHistory();
}
};
/******************************************************************************/
var filterRules = function(key) {
var rules = unfilteredRules[key].rules;
var filter = uDom('#ruleFilter input').val();
if ( filter !== '' ) {
rules = rules.slice();
var i = rules.length;
while ( i-- ) {
if ( rules[i].indexOf(filter) === -1 ) {
rules.splice(i, 1);
}
}
}
return rules;
};
/******************************************************************************/
var renderRules = (function() {
var firstVisit = true;
return function(details) {
unfilteredRules.orig.rules = details.permanentRules.sort(directiveSort);
unfilteredRules.edit.rules = details.temporaryRules.sort(directiveSort);
rulesToDoc(firstVisit);
if ( firstVisit ) {
firstVisit = false;
mergeView.editor().execCommand('goNextDiff');
}
onTextChanged(true);
};
})();
// Switches before, rules after
var directiveSort = function(a, b) {
var aIsSwitch = a.indexOf(':') !== -1;
var bIsSwitch = b.indexOf(':') !== -1;
var aIsSwitch = a.indexOf(': ') !== -1;
var bIsSwitch = b.indexOf(': ') !== -1;
if ( aIsSwitch === bIsSwitch ) {
return a.localeCompare(b);
}
@ -42,72 +205,49 @@ var directiveSort = function(a, b) {
/******************************************************************************/
var processUserRules = function(response) {
var rules, rule, i;
var allRules = {};
var permanentRules = {};
var temporaryRules = {};
var onLeft, onRight;
var applyDiff = function(permanent, toAdd, toRemove) {
vAPI.messaging.send(
'user-rules.js',
{
what: 'modifyRuleset',
permanent: permanent,
toAdd: toAdd,
toRemove: toRemove
},
renderRules
);
};
rules = response.permanentRules.split(/\n+/);
i = rules.length;
while ( i-- ) {
rule = rules[i].trim();
if ( rule.length !== 0 ) {
permanentRules[rule] = allRules[rule] = true;
}
/******************************************************************************/
// CodeMirror quirk: sometimes fromStart.ch and/or toStart.ch is undefined.
// When this happens, use 0.
mergeView.options.revertChunk = function(
mv,
from, fromStart, fromEnd,
to, toStart, toEnd
) {
// https://github.com/gorhill/uBlock/issues/3611
if ( document.body.getAttribute('dir') === 'rtl' ) {
var tmp;
tmp = from; from = to; to = tmp;
tmp = fromStart; fromStart = toStart; toStart = tmp;
tmp = fromEnd; fromEnd = toEnd; toEnd = tmp;
}
rules = response.temporaryRules.split(/\n+/);
i = rules.length;
while ( i-- ) {
rule = rules[i].trim();
if ( rule.length !== 0 ) {
temporaryRules[rule] = allRules[rule] = true;
}
}
var permanentList = document.createDocumentFragment(),
temporaryList = document.createDocumentFragment(),
li;
rules = Object.keys(allRules).sort(directiveSort);
for ( i = 0; i < rules.length; i++ ) {
rule = rules[i];
onLeft = permanentRules.hasOwnProperty(rule);
onRight = temporaryRules.hasOwnProperty(rule);
if ( onLeft && onRight ) {
li = document.createElement('li');
li.textContent = rule;
permanentList.appendChild(li);
li = document.createElement('li');
li.textContent = rule;
temporaryList.appendChild(li);
} else if ( onLeft ) {
li = document.createElement('li');
li.textContent = rule;
permanentList.appendChild(li);
li = document.createElement('li');
li.textContent = rule;
li.className = 'notRight toRemove';
temporaryList.appendChild(li);
} else if ( onRight ) {
li = document.createElement('li');
li.textContent = '\xA0';
permanentList.appendChild(li);
li = document.createElement('li');
li.textContent = rule;
li.className = 'notLeft';
temporaryList.appendChild(li);
}
}
// TODO: build incrementally.
uDom('#diff > .left > ul > li').remove();
document.querySelector('#diff > .left > ul').appendChild(permanentList);
uDom('#diff > .right > ul > li').remove();
document.querySelector('#diff > .right > ul').appendChild(temporaryList);
uDom('#diff').toggleClass('dirty', response.temporaryRules !== response.permanentRules);
if ( typeof fromStart.ch !== 'number' ) { fromStart.ch = 0; }
if ( fromEnd.ch !== 0 ) { fromEnd.line += 1; }
var toAdd = from.getRange(
{ line: fromStart.line, ch: 0 },
{ line: fromEnd.line, ch: 0 }
);
if ( typeof toStart.ch !== 'number' ) { toStart.ch = 0; }
if ( toEnd.ch !== 0 ) { toEnd.line += 1; }
var toRemove = to.getRange(
{ line: toStart.line, ch: 0 },
{ line: toEnd.line, ch: 0 }
);
applyDiff(from === mv.editor(), toAdd, toRemove);
};
/******************************************************************************/
@ -117,9 +257,7 @@ var processUserRules = function(response) {
var fromRequestPolicy = function(content) {
var matches = /\[origins-to-destinations\]([^\[]+)/.exec(content);
if ( matches === null || matches.length !== 2 ) {
return;
}
if ( matches === null || matches.length !== 2 ) { return; }
return matches[1].trim()
.replace(/\|/g, ' ')
.replace(/\n/g, ' * allow\n');
@ -153,12 +291,8 @@ var fromNoScript = function(content) {
var directive, matches;
while ( i-- ) {
directive = directives[i].trim();
if ( directive === '' ) {
continue;
}
if ( reBad.test(directive) ) {
continue;
}
if ( directive === '' ) { continue; }
if ( reBad.test(directive) ) { continue; }
matches = reURL.exec(directive);
if ( matches !== null ) {
directive = matches[1];
@ -185,16 +319,10 @@ var handleImportFilePicker = function() {
}
}
if ( this.result === '' ) { return; }
var request = {
'what': 'setUserRules',
'temporaryRules': rulesFromHTML('#diff .right li') + '\n' + result
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
applyDiff(false, result, '');
};
var file = this.files[0];
if ( file === undefined || file.name === '' ) {
return;
}
if ( file === undefined || file.name === '' ) { return; }
if ( file.type.indexOf('text') !== 0 && file.type !== 'application/json') {
return;
}
@ -218,121 +346,174 @@ var startImportFilePicker = function() {
function exportUserRulesToFile() {
vAPI.download({
'url': 'data:text/plain,' + encodeURIComponent(rulesFromHTML('#diff .left li') + '\n'),
'filename': uDom('[data-i18n="userRulesDefaultFileName"]').text()
url: 'data:text/plain,' + encodeURIComponent(
mergeView.leftOriginal().getValue().trim() + '\n'
),
filename: uDom('[data-i18n="userRulesDefaultFileName"]').text()
});
}
/******************************************************************************/
var rulesFromHTML = function(selector) {
var rules = [];
var lis = uDom(selector);
var li;
for ( var i = 0; i < lis.length; i++ ) {
li = lis.at(i);
if ( li.hasClassName('toRemove') ) {
rules.push('');
var onFilterChanged = (function() {
var timer,
overlay = null,
last = '';
var process = function() {
timer = undefined;
if ( mergeView.editor().isClean(cleanEditToken) === false ) { return; }
var filter = uDom('#ruleFilter input').val();
if ( filter === last ) { return; }
last = filter;
if ( overlay !== null ) {
mergeView.leftOriginal().removeOverlay(overlay);
mergeView.editor().removeOverlay(overlay);
overlay = null;
}
if ( filter !== '' ) {
overlay = updateOverlay(filter);
mergeView.leftOriginal().addOverlay(overlay);
mergeView.editor().addOverlay(overlay);
}
rulesToDoc(true);
};
return function() {
if ( timer !== undefined ) { clearTimeout(timer); }
timer = vAPI.setTimeout(process, 773);
};
})();
/******************************************************************************/
var onTextChanged = (function() {
var timer;
var process = function(now) {
timer = undefined;
var isClean = mergeView.editor().isClean(cleanEditToken);
var diff = document.getElementById('diff');
if (
now &&
isClean === false &&
mergeView.editor().getValue().trim() === cleanEditText
) {
cleanEditToken = mergeView.editor().changeGeneration();
isClean = true;
}
diff.classList.toggle('editing', isClean === false);
diff.classList.toggle('dirty', mergeView.leftChunks().length !== 0);
var input = document.querySelector('#ruleFilter input');
if ( isClean ) {
input.removeAttribute('disabled');
CodeMirror.commands.save = undefined;
} else {
rules.push(li.text());
input.setAttribute('disabled', '');
CodeMirror.commands.save = editSaveHandler;
}
};
return function(now) {
if ( timer !== undefined ) { clearTimeout(timer); }
timer = now ? process(now) : vAPI.setTimeout(process, 57);
};
})();
/******************************************************************************/
var revertAllHandler = function() {
var toAdd = [], toRemove = [];
var left = mergeView.leftOriginal(),
edit = mergeView.editor();
for ( var chunk of mergeView.leftChunks() ) {
var addedLines = left.getRange(
{ line: chunk.origFrom, ch: 0 },
{ line: chunk.origTo, ch: 0 }
);
var removedLines = edit.getRange(
{ line: chunk.editFrom, ch: 0 },
{ line: chunk.editTo, ch: 0 }
);
toAdd.push(addedLines.trim());
toRemove.push(removedLines.trim());
}
applyDiff(false, toAdd.join('\n'), toRemove.join('\n'));
};
/******************************************************************************/
var commitAllHandler = function() {
var toAdd = [], toRemove = [];
var left = mergeView.leftOriginal(),
edit = mergeView.editor();
for ( var chunk of mergeView.leftChunks() ) {
var addedLines = edit.getRange(
{ line: chunk.editFrom, ch: 0 },
{ line: chunk.editTo, ch: 0 }
);
var removedLines = left.getRange(
{ line: chunk.origFrom, ch: 0 },
{ line: chunk.origTo, ch: 0 }
);
toAdd.push(addedLines.trim());
toRemove.push(removedLines.trim());
}
applyDiff(true, toAdd.join('\n'), toRemove.join('\n'));
};
/******************************************************************************/
var editSaveHandler = function() {
var editor = mergeView.editor();
var editText = editor.getValue().trim();
if ( editText === cleanEditText ) {
onTextChanged(true);
return;
}
if ( differ === undefined ) { differ = new diff_match_patch(); }
var toAdd = [], toRemove = [];
var diffs = differ.diff_main(cleanEditText, editText);
for ( var diff of diffs ) {
if ( diff[0] === 1 ) {
toAdd.push(diff[1]);
} else if ( diff[0] === -1 ) {
toRemove.push(diff[1]);
}
}
return rules.join('\n');
};
/******************************************************************************/
var revertHandler = function() {
var request = {
'what': 'setUserRules',
'temporaryRules': rulesFromHTML('#diff .left li')
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
};
/******************************************************************************/
var commitHandler = function() {
var request = {
'what': 'setUserRules',
'permanentRules': rulesFromHTML('#diff .right li')
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
};
/******************************************************************************/
var editStartHandler = function() {
uDom('#diff .right textarea').val(rulesFromHTML('#diff .right li'));
var parent = uDom(this).ancestors('#diff');
parent.toggleClass('edit', true);
};
/******************************************************************************/
var editStopHandler = function() {
var parent = uDom(this).ancestors('#diff');
parent.toggleClass('edit', false);
var request = {
'what': 'setUserRules',
'temporaryRules': uDom('#diff .right textarea').val()
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
};
/******************************************************************************/
var editCancelHandler = function() {
var parent = uDom(this).ancestors('#diff');
parent.toggleClass('edit', false);
};
/******************************************************************************/
var temporaryRulesToggler = function() {
var li = uDom(this);
li.toggleClass('toRemove');
var request = {
'what': 'setUserRules',
'temporaryRules': rulesFromHTML('#diff .right li')
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
applyDiff(false, toAdd.join(''), toRemove.join(''));
};
/******************************************************************************/
self.cloud.onPush = function() {
return rulesFromHTML('#diff .left li');
return mergeView.leftOriginal().getValue().trim();
};
self.cloud.onPull = function(data, append) {
if ( typeof data !== 'string' ) { return; }
if ( append ) {
data = rulesFromHTML('#diff .right li') + '\n' + data;
}
var request = {
'what': 'setUserRules',
'temporaryRules': data
};
vAPI.messaging.send('user-rules.js', request, processUserRules);
applyDiff(
false,
data,
append ? '' : mergeView.editor().getValue().trim()
);
};
/******************************************************************************/
uDom.onLoad(function() {
// Handle user interaction
uDom('#importButton').on('click', startImportFilePicker);
uDom('#importFilePicker').on('change', handleImportFilePicker);
uDom('#exportButton').on('click', exportUserRulesToFile);
uDom('#revertButton').on('click', revertHandler);
uDom('#commitButton').on('click', commitHandler);
uDom('#editEnterButton').on('click', editStartHandler);
uDom('#editStopButton').on('click', editStopHandler);
uDom('#editCancelButton').on('click', editCancelHandler);
uDom('#diff > .right > ul').on('click', 'li', temporaryRulesToggler);
// Handle user interaction
uDom('#exportButton').on('click', exportUserRulesToFile);
uDom('#revertButton').on('click', revertAllHandler);
uDom('#commitButton').on('click', commitAllHandler);
uDom('#importButton').on('click', startImportFilePicker);
uDom('#importFilePicker').on('change', handleImportFilePicker);
uDom('#editSaveButton').on('click', editSaveHandler);
uDom('#ruleFilter input').on('input', onFilterChanged);
vAPI.messaging.send('user-rules.js', { what: 'getUserRules' }, processUserRules);
});
// https://groups.google.com/forum/#!topic/codemirror/UQkTrt078Vs
mergeView.editor().on('updateDiff', function() { onTextChanged(); });
vAPI.messaging.send('user-rules.js', { what: 'getRuleset' }, renderRules);
/******************************************************************************/

View file

@ -0,0 +1,21 @@
MIT License
Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View file

@ -0,0 +1,35 @@
# CodeMirror
[![Build Status](https://travis-ci.org/codemirror/CodeMirror.svg)](https://travis-ci.org/codemirror/CodeMirror)
[![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror)
[![Join the chat at https://gitter.im/codemirror/CodeMirror](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codemirror/CodeMirror)
[Funding status: ![maintainer happiness](https://marijnhaverbeke.nl/fund/status_s.png?again)](https://marijnhaverbeke.nl/fund/)
CodeMirror is a versatile text editor implemented in JavaScript for
the browser. It is specialized for editing code, and comes with over
100 language modes and various addons that implement more advanced
editing functionality. Every language comes with fully-featured code
and syntax highlighting to help with reading and editing complex code.
A rich programming API and a CSS theming system are available for
customizing CodeMirror to fit your application, and extending it with
new functionality.
You can find more information (and the
[manual](http://codemirror.net/doc/manual.html)) on the [project
page](http://codemirror.net). For questions and discussion, use the
[discussion forum](https://discuss.codemirror.net/).
See
[CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md)
for contributing guidelines.
The CodeMirror community aims to be welcoming to everybody. We use the
[Contributor Covenant
(1.1)](http://contributor-covenant.org/version/1/1/0/) as our code of
conduct.
### Quickstart
To build the project, make sure you have Node.js installed (at least version 6)
and then `npm install`. To run, just open `index.html` in your
browser (you don't need to run a webserver). Run the tests with `npm test`.

119
src/lib/codemirror/addon/merge/merge.css vendored Normal file
View file

@ -0,0 +1,119 @@
.CodeMirror-merge {
position: relative;
border: 1px solid #ddd;
white-space: pre;
}
.CodeMirror-merge, .CodeMirror-merge .CodeMirror {
height: 350px;
}
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
.CodeMirror-merge-pane {
display: inline-block;
white-space: normal;
vertical-align: top;
}
.CodeMirror-merge-pane-rightmost {
position: absolute;
right: 0px;
z-index: 1;
}
.CodeMirror-merge-gap {
z-index: 2;
display: inline-block;
height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
position: relative;
background: #f8f8f8;
}
.CodeMirror-merge-scrolllock-wrap {
position: absolute;
bottom: 0; left: 50%;
}
.CodeMirror-merge-scrolllock {
position: relative;
left: -50%;
cursor: pointer;
color: #555;
line-height: 1;
}
.CodeMirror-merge-scrolllock:after {
content: "\21db\00a0\00a0\21da";
}
.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after {
content: "\21db\21da";
}
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
position: absolute;
left: 0; top: 0;
right: 0; bottom: 0;
line-height: 1;
}
.CodeMirror-merge-copy {
position: absolute;
cursor: pointer;
color: #44c;
z-index: 3;
}
.CodeMirror-merge-copy-reverse {
position: absolute;
cursor: pointer;
color: #44c;
}
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
background-position: bottom left;
background-repeat: repeat-x;
}
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
background-position: bottom left;
background-repeat: repeat-x;
}
.CodeMirror-merge-r-chunk { background: #ffffe0; }
.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }
.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }
.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }
.CodeMirror-merge-l-chunk { background: #eef; }
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }
.CodeMirror-merge-collapsed-widget:before {
content: "(...)";
}
.CodeMirror-merge-collapsed-widget {
cursor: pointer;
color: #88b;
background: #eef;
border: 1px solid #ddf;
font-size: 90%;
padding: 0 3px;
border-radius: 4px;
}
.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }

1002
src/lib/codemirror/addon/merge/merge.js vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,72 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
var WRAP_CLASS = "CodeMirror-activeline";
var BACK_CLASS = "CodeMirror-activeline-background";
var GUTT_CLASS = "CodeMirror-activeline-gutter";
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
var prev = old == CodeMirror.Init ? false : old;
if (val == prev) return
if (prev) {
cm.off("beforeSelectionChange", selectionChange);
clearActiveLines(cm);
delete cm.state.activeLines;
}
if (val) {
cm.state.activeLines = [];
updateActiveLines(cm, cm.listSelections());
cm.on("beforeSelectionChange", selectionChange);
}
});
function clearActiveLines(cm) {
for (var i = 0; i < cm.state.activeLines.length; i++) {
cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
}
}
function sameArray(a, b) {
if (a.length != b.length) return false;
for (var i = 0; i < a.length; i++)
if (a[i] != b[i]) return false;
return true;
}
function updateActiveLines(cm, ranges) {
var active = [];
for (var i = 0; i < ranges.length; i++) {
var range = ranges[i];
var option = cm.getOption("styleActiveLine");
if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
continue
var line = cm.getLineHandleVisualStart(range.head.line);
if (active[active.length - 1] != line) active.push(line);
}
if (sameArray(cm.state.activeLines, active)) return;
cm.operation(function() {
clearActiveLines(cm);
for (var i = 0; i < active.length; i++) {
cm.addLineClass(active[i], "wrap", WRAP_CLASS);
cm.addLineClass(active[i], "background", BACK_CLASS);
cm.addLineClass(active[i], "gutter", GUTT_CLASS);
}
cm.state.activeLines = active;
});
}
function selectionChange(cm, sel) {
updateActiveLines(cm, sel.ranges);
}
});

346
src/lib/codemirror/lib/codemirror.css vendored Normal file
View file

@ -0,0 +1,346 @@
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
direction: ltr;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0 !important;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-fat-cursor-mark {
background-color: rgba(20, 255, 20, 0.5);
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-rulers {
position: absolute;
left: 0; right: 0; top: -50px; bottom: -20px;
overflow: hidden;
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
top: 0; bottom: 0;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
.CodeMirror-composing { border-bottom: 2px solid; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
min-height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -30px;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none !important;
border: none !important;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0; bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: contextual;
font-variant-ligatures: contextual;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
padding: 0.1px; /* Force widget margins to stay inside of the container */
}
.CodeMirror-widget {}
.CodeMirror-rtl pre { direction: rtl; }
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-cursor {
position: absolute;
pointer-events: none;
}
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
background-color: #ffa;
background-color: rgba(255, 255, 0, .4);
}
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

9660
src/lib/codemirror/lib/codemirror.js vendored Normal file

File diff suppressed because it is too large Load diff

34
src/lib/diff/README.md Normal file
View file

@ -0,0 +1,34 @@
# diff
implementation of myers diff algorithm
[![Build Status](https://travis-ci.org/Swatinem/diff.png?branch=master)](https://travis-ci.org/Swatinem/diff)
[![Coverage Status](https://coveralls.io/repos/Swatinem/diff/badge.png?branch=master)](https://coveralls.io/r/Swatinem/diff)
[![Dependency Status](https://gemnasium.com/Swatinem/diff.png)](https://gemnasium.com/Swatinem/diff)
This uses the [*An O(ND) Difference Algorithm and Its Variations*](http://www.xmailserver.org/diff2.pdf)
Also see http://simplygenius.net/Article/DiffTutorial2 and
http://www.mathertel.de/Diff/ViewSrc.aspx for more inspiration
## Installation
$ npm install diff
$ component install Swatinem/diff
## Usage
### diff(a, b, [eql(a, b)])
Given two arrays (or array-likes, such as strings) `a` and `b` and an optional
equal function `eql`, this will return an array with the following operations:
* *nop* the element is in both arrays
* *ins* the element is only in array `b` and will be inserted
* *del* the element in only in array `a` and will be removed
* *rep* the element from `a` will be replaced by the element from `b`.
This is essentially the same as a del+ins
## License
LGPLv3

View file

@ -0,0 +1,207 @@
/*******************************************************************************
Key portions of code below was borrowed from:
https://github.com/Swatinem/diff
License is LGPL3 (thanks!) as per:
https://github.com/Swatinem/diff/blob/b58391504759/README.md
I chose to pick this implementation over
https://github.com/google/diff-match-patch as suggested by CodeMirror
because:
- Code is clean and simple to read -- useful when unfamiliar with the diff
algorithm, this makes changing the code easier if/when needed.
- Smaller -- diff_match_patch comes with an extended API most of which is
of no use to the current project.
- diff_match_patch uncompressed: 74.7 KB
- Swatinem's diff uncompressed: 3.66 KB
- I can easily adapt Swatinem's diff to deal with arrays of strings, which
is best suited for the current project -- it natively work with arrays.
I removed portions of code which are of no use for the current project.
I modified the diff script generator (Diff.prototype.editscript) since I
need to generate a script which is compatible with the output of the
diff_match_patch, as expected by CodeMirror.
**/
'use strict';
(function(context) {
// CodeMirror expect these globals:
context.DIFF_INSERT = 1;
context.DIFF_DELETE = -1;
context.DIFF_EQUAL = 0;
context.diff_match_patch = function(){};
context.diff_match_patch.prototype.diff_main = function(a, b) {
if ( a === b ) { return [ [ 0, a ] ]; }
var aa = a.match(/\n|[^\n]+\n?/g) || [];
var bb = b.match(/\n|[^\n]+\n?/g) || [];
var d = new Diff(aa, bb, eqlDefault);
return d.editscript();
};
function eqlDefault(a, b) { return a === b; }
function Diff(a, b, eql) {
this.a = a;
this.b = b;
this.eql = eql;
this.moda = Array.apply(null, new Array(a.length)).map(true.valueOf, false);
this.modb = Array.apply(null, new Array(b.length)).map(true.valueOf, false);
// just to save some allocations:
this.down = {};
this.up = {};
this.lcs(0, a.length, 0, b.length);
}
Diff.prototype.editscript = function Diff_editscript() {
var moda = this.moda, modb = this.modb;
var astart = 0, aend = moda.length;
var bstart = 0, bend = modb.length;
var result = [];
while (astart < aend || bstart < bend) {
if (astart < aend && bstart < bend) {
if (!moda[astart] && !modb[bstart]) {
result.push([ 0, this.a[astart] ]);
astart++; bstart++;
continue;
} else if (moda[astart] && modb[bstart]) {
result.push([ -1, this.a[astart] ]);
result.push([ 1, this.b[bstart] ]);
astart++; bstart++;
continue;
}
}
if (astart < aend && (bstart >= bend || moda[astart])) {
result.push([ -1, this.a[astart] ]);
astart++;
}
if (bstart < bend && (astart >= aend || modb[bstart])) {
result.push([ 1, this.b[bstart] ]);
bstart++;
}
}
return result;
};
Diff.prototype.lcs = function Diff_lcs(astart, aend, bstart, bend) {
var a = this.a, b = this.b, eql = this.eql;
// separate common head
while (astart < aend && bstart < bend && eql(a[astart], b[bstart])) {
astart++; bstart++;
}
// separate common tail
while (astart < aend && bstart < bend && eql(a[aend - 1], b[bend - 1])) {
aend--; bend--;
}
if (astart === aend) {
// only insertions
while (bstart < bend) {
this.modb[bstart] = true;
bstart++;
}
} else if (bend === bstart) {
// only deletions
while (astart < aend) {
this.moda[astart] = true;
astart++;
}
} else {
var snake = this.snake(astart, aend, bstart, bend);
this.lcs(astart, snake.x, bstart, snake.y);
this.lcs(snake.u, aend, snake.v, bend);
}
};
Diff.prototype.snake = function Diff_snake(astart, aend, bstart, bend) {
var a = this.a, b = this.b, eql = this.eql;
var N = aend - astart,
M = bend - bstart;
var kdown = astart - bstart;
var kup = aend - bend;
var delta = N - M;
var deltaOdd = delta & 1;
var down = this.down;
down[kdown + 1] = astart;
var up = this.up;
up[kup - 1] = aend;
var Dmax = (N + M + 1) / 2;
for (var D = 0; D <= Dmax; D++) {
var k, x, y;
// forward path
for (k = kdown - D; k <= kdown + D; k += 2) {
if (k === kdown - D) {
x = down[k + 1]; // down
} else {
x = down[k - 1] + 1; // right
if ((k < kdown + D) && (down[k + 1] >= x)) {
x = down[k + 1]; // down
}
}
y = x - k;
while (x < aend && y < bend && eql(a[x], b[y])) {
x++; y++; // diagonal
}
down[k] = x;
if (deltaOdd && (kup - D < k) && (k < kup + D) &&
up[k] <= down[k]) {
return {
x: down[k],
y: down[k] - k,
u: up[k],
v: up[k] - k,
};
}
}
// reverse path
for (k = kup - D; k <= kup + D; k += 2) {
if (k === kup + D) {
x = up[k - 1]; // up
} else {
x = up[k + 1] - 1; // left
if ((k > kup - D) && (up[k - 1] < x)) {
x = up[k - 1]; // up
}
}
y = x - k;
while (x > astart && y > bstart && eql(a[x - 1], b[y - 1])) {
x--; y--; // diagonal
}
up[k] = x;
if (!deltaOdd && (kdown - D <= k) && (k <= kdown + D) &&
up[k] <= down[k]) {
return {
x: down[k],
y: down[k] - k,
u: up[k],
v: up[k] - k,
};
}
}
}
};
return Diff;
})(self);

View file

@ -19,9 +19,9 @@
--><span class="scope" id="globalScope" data-scope="*" data-i18n-tip="matrixGlobalScopeTip"><span><span>&#x2217;</span></span></span>
<button id="mtxSwitch_matrix-off" type="button" class="fa scopeRel tip-anchor-left" data-i18n-tip="matrixMtxButtonTip">&#xf011;<span class="badge"></span></button>
<button id="buttonMtxSwitches" type="button" class="fa scopeRel" tabindex="-1" data-dropdown-menu="dropDownMenuSwitches">&#xf142;<span class="badge"></span></button>
<button id="buttonRecipes" type="button" class="fa scopeRel tip-anchor-right" data-i18n-tip="matrixRecipesButtonTip" data-dropdown-menu="dropDownMenuRecipes">&#xf12e;<span class="badge"></span></button>
<button id="buttonPersist" type="button" class="fa scopeRel tip-anchor-left" data-i18n-tip="matrixPersistButtonTip">&#xf023;<span class="badge"></span></button>
<button id="buttonRevertScope" type="button" class="fa scopeRel tip-anchor-left" tabindex="-1" data-i18n-tip="matrixRevertButtonTip">&#xf12d;</button>
<button id="buttonRecipes" type="button" class="fa scopeRel tip-anchor-right" data-i18n-tip="matrixRecipesButtonTip" data-dropdown-menu="dropDownMenuRecipes">&#xf12e;<span class="badge"></span></button>
</div>
<div class="toolbar">
<button id="buttonReload" type="button" class="fa tip-anchor-left" data-i18n-tip="matrixReloadButton">&#xf021;</button>
@ -74,7 +74,7 @@
</div>
</div>
<div id="dropDownMenuRecipes" class="dropdown-menu-capture">
<div id="dropDownMenuRecipes" class="dropdown-menu-capture dropdown-menu-centered">
<div class="dropdown-menu">
<ul></ul>
</div>
@ -111,7 +111,7 @@
</symbol>
</svg>
-->
<li class="recipe"><div><span class="expander"></span><span class="name"></span><span class="fa committer">&#xf13e;</span></div><div class="ruleset"></div></li>
<li class="recipe"><div><span class="expander"></span><span class="name"></span><span class="fa importer" title="matrixRecipeImportTip">&#xf019;</span><span class="fa committer" title="matrixRecipeSaveTip">&#xf13e;</span></div><div class="ruleset"></div></li>
</div>
<script src="lib/punycode.js"></script>

View file

@ -1,12 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>uMatrix — Your rules</title>
<link rel="stylesheet" type="text/css" href="lib/codemirror/lib/codemirror.css">
<link rel="stylesheet" type="text/css" href="lib/codemirror/addon/merge/merge.css">
<link rel="stylesheet" type="text/css" href="css/common.css">
<link rel="stylesheet" type="text/css" href="css/dashboard-common.css">
<link rel="stylesheet" type="text/css" href="css/cloud-ui.css">
<link rel="stylesheet" type="text/css" href="css/user-rules.css">
<link rel="stylesheet" type="text/css" href="css/codemirror.css">
</head>
<body>
@ -15,30 +20,32 @@
<!-- <p data-i18n="userRulesFormatHint"></p> -->
<div id="diff">
<div class="pane left">
<div>
<h2 data-i18n="userRulesPermanentHeader"></h2>
<div class="tools">
<div class="ruleActions">
<h3 data-i18n="userRulesPermanentHeader"></h3>
<button type="button" id="exportButton" data-i18n="userRulesExport"></button>
<button type="button" id="revertButton" data-i18n="userRulesRevert"></button>
</div>
<ul></ul>
</div>
<div class="pane right">
<div>
<h2 data-i18n="userRulesTemporaryHeader"></h2>
<div class="ruleActions">
<h3 data-i18n="userRulesTemporaryHeader"></h3>
<button type="button" id="commitButton" data-i18n="userRulesCommit"></button>
<button type="button" id="editEnterButton" data-i18n="userRulesEdit"></button>
<button type="button" id="editStopButton" data-i18n="userRulesEditSave"></button>
<button type="button" id="editCancelButton" data-i18n="userRulesEditDicard"></button>
<button type="button" id="importButton" data-i18n="userRulesImport"></button>
</div>
<textarea spellcheck="false"></textarea>
<ul></ul>
<button type="button" id="editSaveButton" data-i18n="userRulesEditSave"></button>
</div>
<div id="ruleFilter"><span class="fa">&#xf0b0;</span>&ensp;<input type="text" size="32"></div>
</div>
<div class="codeMirrorContainer codeMirrorMergeContainer vfill-available"></div>
</div>
<input class="hidden" id="importFilePicker" type="file" accept="text/plain">
<span class="hidden" data-i18n="userRulesDefaultFileName"></span>
<div style="display: none;">
<input id="importFilePicker" type="file" accept="text/plain">
<span data-i18n="userRulesDefaultFileName"></span>
</div>
<script src="lib/diff/swatinem_diff.js"></script>
<script src="lib/codemirror/lib/codemirror.js"></script>
<script src="lib/codemirror/addon/merge/merge.js"></script>
<script src="lib/codemirror/addon/selection/active-line.js"></script>
<script src="js/vapi-common.js"></script>
<script src="js/vapi-client.js"></script>

View file

@ -3,5 +3,5 @@
# This script assumes a linux environment
echo "*** uMatrix(Chromium): Cleaning."
rm -R ./dist/*
rm -R ./dist/build
echo "*** uMatrix(Chromium): Cleaned."